diff --git a/docs/winhelp/archive/directx1/autoplay.cnt b/docs/winhelp/archive/directx1/autoplay.cnt deleted file mode 100644 index eb50d3f..0000000 --- a/docs/winhelp/archive/directx1/autoplay.cnt +++ /dev/null @@ -1,23 +0,0 @@ -:Base autoplay.hlp -:Title AutoPlay -:Index AutoPlay=AUTOPLAY.HLP -1 AutoPlay -2 About AutoPlay -2 Introduction =autoplay_2_ -2 How AutoPlay Works =autoplay_3_ -2 The Autorun.inf File =autoplay_4_ -3 Tips for Writing AutoPlay Applications -3 Introduction =autoplay_6_ -3 Opening a Startup Application =autoplay_7_ -3 Loading in the Background =autoplay_8_ -3 Conserving Hard Disk Space =autoplay_9_ -3 Using the Registry =autoplay_10_ -3 Setting the NoDriveTypeAutoRun Value =autoplay_11_ -2 Suppressing AutoPlay =autoplay_12_ -2 AutoPlay for MS-DOS–Based Applications =autoplay_13_ -2 AutoPlay Command Reference -2 defaulticon =autoplay_15_ -2 icon =autoplay_16_ -2 open =autoplay_17_ -2 shell =autoplay_18_ -2 shell\verb=autoplay_19_ diff --git a/docs/winhelp/archive/directx1/autoplay.hlp b/docs/winhelp/archive/directx1/autoplay.hlp deleted file mode 100644 index 414e71e..0000000 Binary files a/docs/winhelp/archive/directx1/autoplay.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/ddraw.cnt b/docs/winhelp/archive/directx1/ddraw.cnt deleted file mode 100644 index 23dfd66..0000000 --- a/docs/winhelp/archive/directx1/ddraw.cnt +++ /dev/null @@ -1,135 +0,0 @@ -:Base ddraw.hlp -:Title DirectDraw -:Index DirectPlay=DDRAW.HLP -1 DirectDraw -2 Help Contents Topic =HelpContents1 -2 About DirectDraw =AboutDirectDraw.2 -2 DirectDraw Overview =DirectDrawOverview.3 -2 Architectural Overview =ArchitecturalOverview.4 -3 DirectDraw - Architectural Overview - DirectDraw =DirectDraw.5 -3 DirectDraw HAL =DirectDrawHAL.6 -3 DirectDraw Software Emulation =DirectDrawSoftwareEmulation.7 -3 DirectDraw, DirectDrawSurface, DirectDrawPalette, and DirectDrawClipper =DirectDraw.DirectDrawSurface.DirectDrawPalette.andDirectDrawClipper.8 -2 Using DirectDraw =UsingDirectDraw.9 -3 Frame buffer access =Framebufferaccess.10 -3 Primary Surface resource sharing model =PrimarySurfaceresourcesharingmodel.11 -3 Changing modes and exclusive access =Changingmodesandexclusiveaccess.12 -3 Losing surfaces =Losingsurfaces.13 -3 Cliplists =Cliplists.14 -3 Color and Format Conversion =ColorandFormatConversion.15 -3 Specifying Color Keys =SpecifyingColorKeys.16 -3 Colorkeying =Colorkeying.17 -3 Flipping Surfaces and GDI's 'frame rate' =FlippingSurfacesandGDI.s.framerate..18 -3 Overlay Z Order =OverlayZOrder.19 -3 Palettes and Pixel Formats =PalettesandPixelFormats.20 -2 DirectDraw Structures -3 Data Structure Summary =DataStructureSummary.21 -3 DDBLTBATCH =DDBLTBATCH.22 -3 DDBLTFX =DDBLTFX.23 -3 DDCAPS =DDCAPS.24 -3 DDCOLORKEY =DDCOLORKEY.25 -3 DDMODEDESC =DDMODEDESC.26 -3 DDOVERLAYFX =DDOVERLAYFX.27 -3 DDPIXELFORMAT =DDPIXELFORMAT.28 -3 DDRVAL =DDRVAL.29 -3 DDSCAPS =DDSCAPS.30 -3 DDSURFACEDESC =DDSURFACEDESC.31 -2 DirectDraw Return Values -3 DD OK =DDOK.32 -3 DirectDraw Enumeration Callback Return Codes =DirectDrawEnumerationCallbackReturnCodes.33 -3 DirectDraw Error Return Codes =DirectDrawErrorReturnCodes.34 -2 DirectDraw APIs -3 APIs =APIs.35 -3 DirectDrawCreate =DirectDrawCreate.36 -3 DirectDrawEnumerate =DirectDrawEnumerate.37 -2 DirectDraw Member Reference -3 DirectDraw Member Reference - Overview =Overview.38 -3 DirectDraw Member Implementation =DirectDrawMemberImplementation.39 -3 DirectDraw Members =DirectDrawMembers.40 -4 DirectDraw Member Reference - DirectDraw Members - AddRef =AddRef.41 -4 Compact =Compact.42 -4 CreateClipper =CreateClipper.43 -4 CreatePalette =CreatePalette.44 -4 CreateSurface =CreateSurface.45 -4 DuplicateSurface =DuplicateSurface.46 -4 EnumDisplayModes =EnumDisplayModes.47 -4 EnumSurfaces =EnumSurfaces.48 -4 FlipToGDISurface =FlipToGDISurface.49 -4 DirectDraw Member Reference - DirectDraw Members - GetCaps =GetCaps.50 -4 GetDisplayMode =GetDisplayMode.51 -4 GetFourCCCodes =GetFourCCCodes.52 -4 GetGDISurface =GetGDISurface.53 -4 GetMonitorFrequency =GetMonitorFrequency.54 -4 GetScanLine =GetScanLine.55 -4 GetVerticalBlankStatus =GetVerticalBlankStatus.56 -4 DirectDraw Member Reference - DirectDraw Members - Initialize =Initialize.57 -4 DirectDraw Member Reference - DirectDraw Members - QueryInterface =QueryInterface.58 -4 DirectDraw Member Reference - DirectDraw Members - Release =Release.59 -4 RestoreDisplayMode =RestoreDisplayMode.60 -4 SetCooperativeLevel =SetCooperativeLevel.61 -4 SetDisplayMode =SetDisplayMode.62 -4 WaitForVerticalBlank =WaitForVerticalBlank.63 -2 DirectDrawSurface Member Reference -3 DirectDrawSurface Member Reference - Overview =Overview.64 -3 DIRECTDRAWSURFACE Member Implementation =DIRECTDRAWSURFACEMemberImplementation.65 -3 DirectDrawSurface Member Reference - Members =Members.66 -4 AddAttachedSurface =AddAttachedSurface.67 -4 AddOverlayDirtyRect =AddOverlayDirtyRect.68 -4 DirectDrawSurface Member Reference - Members - AddRef =AddRef.69 -4 Blt =Blt.70 -4 BltBatch =BltBatch.71 -4 BltFast =BltFast.72 -4 DeleteAttachedSurfaces =DeleteAttachedSurfaces.73 -4 EnumAttachedSurfaces =EnumAttachedSurfaces.74 -4 EnumOverlayZOrders =EnumOverlayZOrders.75 -4 Flip =Flip.76 -4 GetAttachedSurface =GetAttachedSurface.77 -4 GetBltStatus =GetBltStatus.78 -4 DirectDrawSurface Member Reference - Members - GetCaps =GetCaps.79 -4 GetClipper =GetClipper.80 -4 GetColorKey =GetColorKey.81 -4 GetDC =GetDC.82 -4 GetFlipStatus =GetFlipStatus.83 -4 GetOverlayPosition =GetOverlayPosition.84 -4 GetPalette =GetPalette.85 -4 GetPixelFormat =GetPixelFormat.86 -4 GetSurfaceDesc =GetSurfaceDesc.87 -4 DirectDrawSurface Member Reference - Members - Initialize =Initialize.88 -4 IsLost =IsLost.89 -4 Lock =Lock.90 -4 DirectDrawSurface Member Reference - Members - QueryInterface =QueryInterface.91 -4 DirectDrawSurface Member Reference - Members - Release =Release.92 -4 ReleaseDC =ReleaseDC.93 -4 Restore =Restore.94 -4 SetClipper =SetClipper.95 -4 SetColorKey =SetColorKey.96 -4 SetOverlayPosition =SetOverlayPosition.97 -4 SetPalette =SetPalette.98 -4 Unlock =Unlock.99 -4 UpdateOverlay =UpdateOverlay.100 -4 UpdateOverlayDisplay =UpdateOverlayDisplay.101 -4 UpdateOverlayZOrder =UpdateOverlayZOrder.102 -2 DirectDrawPalette Member Reference -3 DirectDrawPalette Member Reference - Overview =Overview.103 -3 DIRECTDRAWPALETTE Member Implementation =DIRECTDRAWPALETTEMemberImplementation.104 -3 DirectDrawPalette Member Reference - Members =Members.105 -4 DirectDrawPalette Member Reference - Members - AddRef =AddRef.106 -4 DirectDrawPalette Member Reference - Members - GetCaps =GetCaps.107 -4 GetEntries =GetEntries.108 -4 DirectDrawPalette Member Reference - Members - Initialize =Initialize.109 -4 DirectDrawPalette Member Reference - Members - QueryInterface =QueryInterface.110 -4 DirectDrawPalette Member Reference - Members - Release =Release.111 -4 SetEntries =SetEntries.112 -2 DirectDrawClipper Member Reference -3 DirectDrawClipper Member Reference - Overview =Overview.113 -3 DIRECTDRAWCLIPPER Member Implementation =DIRECTDRAWCLIPPERMemberImplementation.114 -3 DirectDrawClipper Member Reference - Members =Members.115 -4 DirectDrawClipper Member Reference - Members - AddRef =AddRef.116 -4 GetClipList =GetClipList.117 -4 GetHWnd =GetHWnd.118 -4 DirectDrawClipper Member Reference - Members - Initialize =Initialize.119 -4 IsClipListChanged =IsClipListChanged.120 -4 DirectDrawClipper Member Reference - Members - QueryInterface =QueryInterface.121 -4 DirectDrawClipper Member Reference - Members - Release =Release.122 -4 SetClipList =SetClipList.123 -4 SetHWnd =SetHWnd.124 diff --git a/docs/winhelp/archive/directx1/ddraw.hlp b/docs/winhelp/archive/directx1/ddraw.hlp deleted file mode 100644 index 2a4c3f6..0000000 Binary files a/docs/winhelp/archive/directx1/ddraw.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/dinput.cnt b/docs/winhelp/archive/directx1/dinput.cnt deleted file mode 100644 index 2925e33..0000000 --- a/docs/winhelp/archive/directx1/dinput.cnt +++ /dev/null @@ -1,21 +0,0 @@ -:Base dinput.hlp -:Title DirectInput -:Index DirectInput=DINPUT.HLP -1 DirectInput -2 About DirectInput -2 Introduction to Joysticks =dinput_2_ -2 Joystick Capabilities =dinput_3_ -2 Joystick Calibration and Testing =dinput_4_ -2 Joystick Position =dinput_5_ -2 DirectInput Reference -2 Joystick Groups =dinput_7_ -3 Functions -3 Introduction =dinput_9_ -3 joyConfigChanged =dinput_10_ -3 joyGetDevCaps =dinput_11_ -3 joyGetNumDevs =dinput_12_ -3 joyGetPosEx =dinput_13_ -3 Structures -3 Introduction =dinput_15_ -3 JOYCAPS =dinput_16_ -3 JOYINFOEX =dinput_17_ diff --git a/docs/winhelp/archive/directx1/dinput.hlp b/docs/winhelp/archive/directx1/dinput.hlp deleted file mode 100644 index 22061d3..0000000 Binary files a/docs/winhelp/archive/directx1/dinput.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/dplay.cnt b/docs/winhelp/archive/directx1/dplay.cnt deleted file mode 100644 index 5b9c15c..0000000 --- a/docs/winhelp/archive/directx1/dplay.cnt +++ /dev/null @@ -1,63 +0,0 @@ -:Base dplay.hlp -:Title DirectPlay -:Index DirectPlay=DPLAY.HLP -1 DirectPlay -2 Help Contents Topic =HelpContents1 -2 DirectPlay -3 About DirectPlay =AboutDirectPlay.2 -3 DirectPlay Architecture =DirectPlayArchitecture.3 -3 Globally Unique Identifiers =GloballyUniqueIdentifiers.4 -3 Using DirectPlay =UsingDirectPlay.5 -3 Session Management =SessionManagement.6 -3 Player Management =PlayerManagement.7 -3 Group Management =GroupManagement.8 -3 Message Management =MessageManagement.9 -2 DirectPlay Stuctures -3 Structure Summary =StructureSummary.10 -3 Data Structures -4 DPCAPS =DPCAPS.12 -4 DPSESSIONDESC =DPSESSIONDESC.13 -3 System Messages -4 System Messages =SystemMessageStructures.14 -4 DPMSG_ADDPLAYER =DPMSG.ADDPLAYER.15 -4 DPMSG_DELETEPLAYER =DPMSG.DELETEPLAYER.16 -4 DPMSG_GENERIC =DPMSG.GENERIC.17 -4 DPMSG_GROUPADD =DPMSG.GROUPADD.18 -4 DPMSG_GROUPDELETE =DPMSG.GROUPDELETE.19 -2 DirectPlay Return Values -3 DP_OK =DP.OK.20 -3 DirectPlay Error Return Codes =DirectPlayErrorReturnCodes.21 -2 DirectPlay APIs -3 APIs =APIs.22 -3 DirectPlayCreate =DirectPlayCreate.23 -4 DirectPlayEnumerate =DirectPlayEnumerate.24 -2 DirectPlay Members -3 Member Summary =MemberSummary.25 -3 DirectPlay Members -4 DirectPlay Members = DirectPlayMembers.26 -4 AddPlayerToGroup =AddPlayerToGroup.27 -4 AddRef =AddRef.28 -4 Close =Close.29 -4 CreateGroup =CreateGroup.30 -4 CreatePlayer =CreatePlayer.31 -4 DeletePlayerFromGroup =DeletePlayerFromGroup.32 -4 DestroyGroup =DestroyGroup.33 -4 DestroyPlayer =DestroyPlayer.34 -4 EnableNewPlayers =EnableNewPlayers.35 -4 EnumGroups =EnumGroups.36 -4 EnumGroupPlayers =EnumGroupPlayers.37 -4 EnumPlayers =EnumPlayers.38 -4 EnumSessions =EnumSessions.39 -4 GetCaps =GetCaps.40 -4 GetMessageCount =GetMessageCount.41 -4 GetPlayerCaps =GetPlayerCaps.42 -4 GetPlayerName =GetPlayerName.43 -4 Initialize =Initialize.44 -4 Open =Open.45 -4 QueryInterface =QueryInterface.46 -4 Receive =Receive.47 -4 Release =Release.48 -4 SaveSession =SaveSession.49 -4 Send =Send.50 -4 SetPlayerName =SetPlayerName.51 - diff --git a/docs/winhelp/archive/directx1/dplay.hlp b/docs/winhelp/archive/directx1/dplay.hlp deleted file mode 100644 index 58c9c37..0000000 Binary files a/docs/winhelp/archive/directx1/dplay.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/dsound.cnt b/docs/winhelp/archive/directx1/dsound.cnt deleted file mode 100644 index 438a082..0000000 --- a/docs/winhelp/archive/directx1/dsound.cnt +++ /dev/null @@ -1,87 +0,0 @@ -:Base dsound.hlp -:Title DirectSound -:Index DirectSound=DSOUND.HLP -1 DirectSound -2 About DirectSound -2 Introduction =dsound_2_ -3 Object Types -3 Introduction =dsound_4_ -3 The DirectSound Object =dsound_5_ -3 The DirectSoundBuffer Object =dsound_6_ -2 Software Emulation =dsound_7_ -2 Device Drivers =dsound_8_ -2 System Integration =dsound_9_ -3 DirectSound Features -3 Mixing =dsound_11_ -3 Hardware Acceleration =dsound_12_ -3 Access to the Primary Buffer =dsound_13_ -2 IDirectSound Interface -2 Introduction =dsound_15_ -2 Device Capabilities =dsound_16_ -2 Creating Buffers =dsound_17_ -2 Speaker Configuration =dsound_18_ -2 Hardware Memory Management =dsound_19_ -2 IDirectSoundBuffer Interface -2 IDirectSoundBuffer Introduction =dsound_21_ -2 Play Management =dsound_22_ -2 Sound-Environment Management =dsound_23_ -2 Information =dsound_24_ -2 Memory Management =dsound_25_ -2 IUnknown Interface =dsound_26_ -2 Using DirectSound -2 Introduction =dsound_28_ -2 Implementation: A Broad Overview =dsound_29_ -2 Creating a DirectSound Object =dsound_30_ -2 Querying the Hardware Capabilities =dsound_31_ -3 Creating Sound Buffers -3 Introduction =dsound_33_ -3 Creating a Basic Sound Buffer =dsound_34_ -3 Control Options =dsound_35_ -3 Static and Streaming Sound Buffers =dsound_36_ -3 Hardware and Software Sound Buffers =dsound_37_ -3 Primary and Secondary Sound Buffers =dsound_38_ -2 Writing to Sound Buffers =dsound_39_ -2 Using the DirectSound Mixer =dsound_40_ -2 Using a Custom Mixer =dsound_41_ -2 Using Compressed Wave Formats =dsound_42_ -2 DirectSound Reference -3 Functions -3 DirectSoundCreate =dsound_45_ -3 DirectSoundEnumCallback =dsound_46_ -3 DirectSoundEnumerate =dsound_47_ -3 IDirectSound Interface and Member Functions -3 IDirectSound =dsound_49_ -3 IDirectSound::Compact =dsound_50_ -3 IDirectSound::CreateSoundBuffer =dsound_51_ -3 IDirectSound::DuplicateSoundBuffer =dsound_52_ -3 IDirectSound::GetCaps =dsound_53_ -3 IDirectSound::GetSpeakerConfig =dsound_54_ -3 IDirectSound::Initialize =dsound_55_ -3 IDirectSound::SetCooperativeLevel =dsound_56_ -3 IDirectSound::SetSpeakerConfig =dsound_57_ -3 IDirectSoundBuffer Interface and Member Functions -3 IDirectSoundBuffer =dsound_59_ -3 IDirectSoundBuffer::GetCaps =dsound_60_ -3 IDirectSoundBuffer::GetCurrentPosition =dsound_61_ -3 IDirectSoundBuffer::GetFormat =dsound_62_ -3 IDirectSoundBuffer::GetFrequency =dsound_63_ -3 IDirectSoundBuffer::GetPan =dsound_64_ -3 IDirectSoundBuffer::GetStatus =dsound_65_ -3 IDirectSoundBuffer::GetVolume =dsound_66_ -3 IDirectSoundBuffer::Initialize =dsound_67_ -3 IDirectSoundBuffer::Lock =dsound_68_ -3 IDirectSoundBuffer::Play =dsound_69_ -3 IDirectSoundBuffer::Restore =dsound_70_ -3 IDirectSoundBuffer::SetCurrentPosition =dsound_71_ -3 IDirectSoundBuffer::SetFormat =dsound_72_ -3 IDirectSoundBuffer::SetFrequency =dsound_73_ -3 IDirectSoundBuffer::SetPan =dsound_74_ -3 IDirectSoundBuffer::SetVolume =dsound_75_ -3 IDirectSoundBuffer::Stop =dsound_76_ -3 IDirectSoundBuffer::Unlock =dsound_77_ -3 Structures -3 DSBCAPS =dsound_79_ -3 DSBUFFERDESC =dsound_80_ -3 DSCAPS =dsound_81_ -3 Constants -3 Error Values =dsound_83_ diff --git a/docs/winhelp/archive/directx1/dsound.hlp b/docs/winhelp/archive/directx1/dsound.hlp deleted file mode 100644 index d5d8810..0000000 Binary files a/docs/winhelp/archive/directx1/dsound.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/gamesdk.cnt b/docs/winhelp/archive/directx1/gamesdk.cnt deleted file mode 100644 index f5072a7..0000000 --- a/docs/winhelp/archive/directx1/gamesdk.cnt +++ /dev/null @@ -1,29 +0,0 @@ -:Base gamesdk.hlp -:Title Windows 95 Game SDK -:Index Introducing the Windows 95 Game SDK =GAMESDK.HLP -:include legal.cnt -1 Introducing the Game Software Development Kit -2 Programming Games in Windows -2 Introduction =gamesdk_2_ -2 Reasons for Developing Windows-Based Games =gamesdk_3_ -2 Providing Standards for Hardware Accelerators =gamesdk_4_ -2 Windows 95 Game Features -2 Introduction =gamesdk_6_ -2 DirectDraw =gamesdk_7_ -2 DirectSound =gamesdk_8_ -2 DirectPlay =gamesdk_9_ -2 DirectInput =gamesdk_10_ -2 AutoPlay =gamesdk_11_ -2 Sample Applications =gamesdk_12_ -2 Games and the Component Object Model -2 Introduction =gamesdk_14_ -2 The Component Object Model =gamesdk_15_ -2 Accessing COM Objects Using C =gamesdk_16_ -2 Game SDK COM Interfaces =gamesdk_17_ -1 Conventions =gamesdk_18_ -:include ddraw.cnt -:include dsound.cnt -:include dplay.cnt -:include dinput.cnt -:include install.cnt -:include autoplay.cnt diff --git a/docs/winhelp/archive/directx1/gamesdk.hlp b/docs/winhelp/archive/directx1/gamesdk.hlp deleted file mode 100644 index 36550c3..0000000 Binary files a/docs/winhelp/archive/directx1/gamesdk.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/install.cnt b/docs/winhelp/archive/directx1/install.cnt deleted file mode 100644 index ce4944f..0000000 --- a/docs/winhelp/archive/directx1/install.cnt +++ /dev/null @@ -1,10 +0,0 @@ -:Base install.hlp -:Title DirectSetup -:Index DirectSetup=INSTALL.HLP -1 DirectSetup -2 Contents Topic =HelpContents1 -2 About DirectSetup = AboutDirectSetup.2 -2 Using DirectSetup = UsingDirectSetup.3 -2 DirectSetup API -3 API =API.4 -4 DirectXSetup = DirectXSetup.5 diff --git a/docs/winhelp/archive/directx1/install.hlp b/docs/winhelp/archive/directx1/install.hlp deleted file mode 100644 index 9117d4a..0000000 Binary files a/docs/winhelp/archive/directx1/install.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx1/legal.cnt b/docs/winhelp/archive/directx1/legal.cnt deleted file mode 100644 index 3030fd2..0000000 --- a/docs/winhelp/archive/directx1/legal.cnt +++ /dev/null @@ -1,4 +0,0 @@ -:Base legal.hlp -:Title Copyright Notice -:Index Introducing the Windows 95 Game SDK =LEGAL.HLP -1 Copyright Notice=legal_0_ diff --git a/docs/winhelp/archive/directx1/legal.hlp b/docs/winhelp/archive/directx1/legal.hlp deleted file mode 100644 index c97deb3..0000000 Binary files a/docs/winhelp/archive/directx1/legal.hlp and /dev/null differ diff --git a/docs/winhelp/archive/directx2/directx.cnt b/docs/winhelp/archive/directx2/directx.cnt deleted file mode 100644 index 32868bb..0000000 --- a/docs/winhelp/archive/directx2/directx.cnt +++ /dev/null @@ -1,1154 +0,0 @@ -:base directx.hlp -:title Microsoft DirectX 2 SDK -:link directx.hlp -:link selfsame -1 Copyrights and Trademarks=legal_0000000000000001 -1 Introducing the DirectX 2 Software Development Kit -2 Using DirectX 2 in Windows -2 Using DirectX 2 in Windows=dxintro_0001000101000000 -2 Reasons for Developing DirectX Windows Applications=dxintro_0001000101010000 -2 Providing Standards for Hardware Accelerators=dxintro_0001000101020000 -2 DirectX 2 Components -2 DirectX 2 Components=dxintro_0001000102000000 -2 DirectDraw=dxintro_0001000102010000 -2 DirectSound=dxintro_0001000102020000 -2 DirectPlay=dxintro_0001000102030000 -2 Direct3D=dxintro_0001000102040000 -2 DirectInput=dxintro_0001000102050000 -2 AutoPlay=dxintro_0001000102060000 -2 Sample Applications=dxintro_0001000102070000 -2 DirectX and the Component Object Model -2 The Component Object Model=dxintro_0001000103010000 -2 IUnknown=dxintro_0001000103020000 -2 DirectX 2 SDK COM Interfaces=dxintro_0001000103030000 -2 C++ and the COM Interface=dxintro_0001000103040000 -2 Accessing COM Objects Using C=dxintro_0001000103050000 -2 Interface Method Names and Syntax=dxintro_0001000103060000 -2 Using Macro Definitions=dxintro_0001000103070000 -2 Floating-point Precision=dxintro_0001000103080000 -2 Differences Between the Game SDK and the DirectX 2 SDK -2 Differences Between the Game SDK and the DirectX 2 SDK=dxintro_0001000104000000 -2 DirectDraw=dxintro_0001000104010000 -2 DirectSound=dxintro_0001000104020000 -2 DirectPlay=dxintro_0001000104030000 -2 Direct3D=dxintro_0001000104040000 -2 DirectInput=dxintro_0001000104050000 -2 AutoPlay=dxintro_0001000104060000 -2 DirectSetup=dxintro_0001000104070000 -1 Conventions=dxintro_0001000105000000 -1 DirectDraw -2 Overview -2 About DirectDraw=ddoverv_0001000201010000 -2 Introduction to DirectDraw=ddoverv_0001000201020000 -3 Architectural Overview -3 DirectDraw=ddoverv_0001000201030100 -3 DirectDraw HAL=ddoverv_0001000201030200 -3 DirectDraw Software Emulation=ddoverv_0001000201030300 -3 Types of DirectDraw Objects=ddoverv_0001000201030400 -3 Using DirectDraw -3 IDirectDraw2 Interface=ddoverv_0001000201040100 -3 Multiple DirectDraw Objects per Process=ddoverv_0001000201040200 -3 Support for High Resolutions and True Color Bit Depths=ddoverv_0001000201040300 -3 Primary Surface Resource Sharing Model=ddoverv_0001000201040400 -3 Changing Modes and Exclusive Access=ddoverv_0001000201040500 -3 Creating DirectDraw Objects Using CoCreateInstance=ddoverv_0001000201040600 -3 Using DirectDrawSurface -3 IDirectDrawSurface2 Interface=ddoverv_0001000201050100 -3 Frame Buffer Access=ddoverv_0001000201050200 -3 Losing Surfaces=ddoverv_0001000201050300 -3 Surface Format Support in the HEL=ddoverv_0001000201050400 -3 Color and Format Conversion=ddoverv_0001000201050500 -3 Color Keying=ddoverv_0001000201050600 -3 Specifying Color Keys=ddoverv_0001000201050700 -3 Flipping Surfaces and GDI's Frame Rate=ddoverv_0001000201050800 -3 Overlay Z-Order=ddoverv_0001000201050900 -3 Palettes and Pixel Formats=ddoverv_0001000201050a00 -3 Blitting To and From System Memory Surfaces=ddoverv_0001000201050b00 -3 Using DirectDrawPalette -3 Setting Palettes on Non-Primary Surfaces=ddoverv_0001000201060100 -3 Sharing Palettes=ddoverv_0001000201060200 -3 New Palette Types=ddoverv_0001000201060300 -3 Using DirectDrawClipper -3 Driver Independent Clippers=ddoverv_0001000201070100 -3 Clip Lists=ddoverv_0001000201070200 -3 Sharing Clippers=ddoverv_0001000201070300 -3 Creating Clipper Objects Using CoCreateInstance=ddoverv_0001000201070400 -3 Support for 3D Surfaces -3 Texture Maps=ddoverv_0001000201080100 -3 Mipmaps=ddoverv_0001000201080200 -3 Z-Buffers=ddoverv_0001000201080300 -3 Direct3D Integration with DirectDraw -3 Direct3D Driver Interface=ddoverv_0001000201090100 -3 Direct3D Device Interface=ddoverv_0001000201090200 -3 Direct3D Texture Interface=ddoverv_0001000201090300 -3 DirectDraw HEL and Direct3D=ddoverv_0001000201090400 -2 Reference -3 Functions -3 Functions=ddref_0001000202010000 -3 DirectDrawCreate=ddref_0001000202010100 -3 DirectDrawCreateClipper=ddref_0001000202010200 -3 DirectDrawEnumerate=ddref_0001000202010300 -3 Callback Functions -3 Callback Functions=ddref_0001000202020000 -3 Callback=ddref_0001000202020100 -3 EnumCallback=ddref_0001000202020200 -3 EnumModesCallback=ddref_0001000202020300 -3 EnumSurfacesCallback=ddref_0001000202020400 -3 fnCallback=ddref_0001000202020500 -3 IDirectDraw Interface -3 IDirectDraw Interface=ddref_0001000202030000 -3 IDirectDraw Interface Method Groups=ddref_0001000202030100 -3 IDirectDraw::AddRef=ddref_0001000202030200 -3 IDirectDraw::Compact=ddref_0001000202030300 -3 IDirectDraw::CreateClipper=ddref_0001000202030400 -3 IDirectDraw::CreatePalette=ddref_0001000202030500 -3 IDirectDraw::CreateSurface=ddref_0001000202030600 -3 IDirectDraw::DuplicateSurface=ddref_0001000202030700 -3 IDirectDraw2::EnumDisplayModes=ddref_0001000202030800 -3 IDirectDraw::EnumSurfaces=ddref_0001000202030900 -3 IDirectDraw::FlipToGDISurface=ddref_0001000202030a00 -3 IDirectDraw2::GetAvailableVidMem=ddref_0001000202030b00 -3 IDirectDraw::GetCaps=ddref_0001000202030c00 -3 IDirectDraw::GetDisplayMode=ddref_0001000202030d00 -3 IDirectDraw::GetFourCCCodes=ddref_0001000202030e00 -3 IDirectDraw::GetGDISurface=ddref_0001000202030f00 -3 IDirectDraw::GetMonitorFrequency=ddref_0001000202031000 -3 IDirectDraw::GetScanLine=ddref_0001000202031100 -3 IDirectDraw::GetVerticalBlankStatus=ddref_0001000202031200 -3 IDirectDraw::Initialize=ddref_0001000202031300 -3 IDirectDraw::QueryInterface=ddref_0001000202031400 -3 IDirectDraw::Release=ddref_0001000202031500 -3 IDirectDraw::RestoreDisplayMode=ddref_0001000202031600 -3 IDirectDraw::SetCooperativeLevel=ddref_0001000202031700 -3 IDirectDraw2::SetDisplayMode=ddref_0001000202031800 -3 IDirectDraw::WaitForVerticalBlank=ddref_0001000202031900 -3 IDirectDrawSurface Interface -3 IDirectDrawSurface Interface=ddref_0001000202040000 -3 IDirectDrawSurface Interface Method Groups=ddref_0001000202040100 -3 IDirectDrawSurface::AddAttachedSurface=ddref_0001000202040200 -3 IDirectDrawSurface::AddOverlayDirtyRect=ddref_0001000202040300 -3 IDirectDrawSurface::AddRef=ddref_0001000202040400 -3 IDirectDrawSurface::Blt=ddref_0001000202040500 -3 IDirectDrawSurface::BltBatch=ddref_0001000202040600 -3 IDirectDrawSurface::BltFast=ddref_0001000202040700 -3 IDirectDrawSurface::DeleteAttachedSurface=ddref_0001000202040800 -3 IDirectDrawSurface::EnumAttachedSurfaces=ddref_0001000202040900 -3 IDirectDrawSurface::EnumOverlayZOrders=ddref_0001000202040a00 -3 IDirectDrawSurface::Flip=ddref_0001000202040b00 -3 IDirectDrawSurface::GetAttachedSurface=ddref_0001000202040c00 -3 IDirectDrawSurface::GetBltStatus=ddref_0001000202040d00 -3 IDirectDrawSurface::GetCaps=ddref_0001000202040e00 -3 IDirectDrawSurface::GetClipper=ddref_0001000202040f00 -3 IDirectDrawSurface::GetColorKey=ddref_0001000202041000 -3 IDirectDrawSurface::GetDC=ddref_0001000202041100 -3 IDirectDrawSurface2::GetDDInterface=ddref_0001000202041200 -3 IDirectDrawSurface::GetFlipStatus=ddref_0001000202041300 -3 IDirectDrawSurface::GetOverlayPosition=ddref_0001000202041400 -3 IDirectDrawSurface::GetPalette=ddref_0001000202041500 -3 IDirectDrawSurface::GetPixelFormat=ddref_0001000202041600 -3 IDirectDrawSurface::GetSurfaceDesc=ddref_0001000202041700 -3 IDirectDrawSurface::Initialize=ddref_0001000202041800 -3 IDirectDrawSurface::IsLost=ddref_0001000202041900 -3 IDirectDrawSurface::Lock=ddref_0001000202041a00 -3 IDirectDrawSurface2::PageLock=ddref_0001000202041b00 -3 IDirectDrawSurface2::PageUnlock=ddref_0001000202041c00 -3 IDirectDrawSurface::QueryInterface=ddref_0001000202041d00 -3 IDirectDrawSurface::Release=ddref_0001000202041e00 -3 IDirectDrawSurface::ReleaseDC=ddref_0001000202041f00 -3 IDirectDrawSurface::Restore=ddref_0001000202042000 -3 IDirectDrawSurface::SetClipper=ddref_0001000202042100 -3 IDirectDrawSurface::SetColorKey=ddref_0001000202042200 -3 IDirectDrawSurface::SetOverlayPosition=ddref_0001000202042300 -3 IDirectDrawSurface::SetPalette=ddref_0001000202042400 -3 IDirectDrawSurface::Unlock=ddref_0001000202042500 -3 IDirectDrawSurface::UpdateOverlay=ddref_0001000202042600 -3 IDirectDrawSurface::UpdateOverlayDisplay=ddref_0001000202042700 -3 IDirectDrawSurface::UpdateOverlayZOrder=ddref_0001000202042800 -3 IDirectDrawPalette Interface -3 IDirectDrawPalette Interface=ddref_0001000202050000 -3 IDirectDrawPalette Interface Method Groups=ddref_0001000202050100 -3 IDirectDrawPalette::AddRef=ddref_0001000202050200 -3 IDirectDrawPalette::GetCaps=ddref_0001000202050300 -3 IDirectDrawPalette::GetEntries=ddref_0001000202050400 -3 IDirectDrawPalette::Initialize=ddref_0001000202050500 -3 IDirectDrawPalette::QueryInterface=ddref_0001000202050600 -3 IDirectDrawPalette::Release=ddref_0001000202050700 -3 IDirectDrawPalette::SetEntries=ddref_0001000202050800 -3 IDirectDrawClipper Interface -3 IDirectDrawClipper Interface Method Groups=ddref_0001000202060100 -3 IDirectDrawClipper::AddRef=ddref_0001000202060200 -3 IDirectDrawClipper::GetClipList=ddref_0001000202060300 -3 IDirectDrawClipper::GetHWnd=ddref_0001000202060400 -3 IDirectDrawClipper::Initialize=ddref_0001000202060500 -3 IDirectDrawClipper::IsClipListChanged=ddref_0001000202060600 -3 IDirectDrawClipper::QueryInterface=ddref_0001000202060700 -3 IDirectDrawClipper::Release=ddref_0001000202060800 -3 IDirectDrawClipper::SetClipList=ddref_0001000202060900 -3 IDirectDrawClipper::SetHWnd=ddref_0001000202060a00 -3 Structures -3 DDBLTBATCH=ddref_0001000202070100 -3 DDBLTFX=ddref_0001000202070200 -3 DDCAPS=ddref_0001000202070300 -3 DDCOLORKEY=ddref_0001000202070400 -3 DDOVERLAYFX=ddref_0001000202070500 -3 DDPIXELFORMAT=ddref_0001000202070600 -3 DDSCAPS=ddref_0001000202070700 -3 DDSURFACEDESC=ddref_0001000202070800 -2 Return Values=ddref_0001000202080000 -1 DirectSound -2 Overview -2 About DirectSound=dsound_0001000301010000 -3 Object Types -3 Object Types=dsound_0001000301020000 -3 The DirectSound Object=dsound_0001000301020100 -3 The DirectSoundBuffer Object=dsound_0001000301020200 -2 Software Emulation=dsound_0001000301030000 -2 Device Drivers=dsound_0001000301040000 -2 System Integration=dsound_0001000301050000 -3 DirectSound Features -3 Mixing=dsound_0001000301060100 -3 Hardware Acceleration=dsound_0001000301060200 -3 Write Access to the Primary Buffer=dsound_0001000301060300 -3 IDirectSound Interface -3 IDirectSound Interface=dsound_0001000301070000 -3 Device Capabilities=dsound_0001000301070100 -3 Creating Buffers=dsound_0001000301070200 -3 Speaker Configuration=dsound_0001000301070300 -3 Hardware Memory Management=dsound_0001000301070400 -3 IDirectSoundBuffer Interface -3 IDirectSoundBuffer Interface=dsound_0001000301080000 -3 Play Management=dsound_0001000301080100 -3 Sound-Environment Management=dsound_0001000301080200 -3 Retrieving Information=dsound_0001000301080300 -3 Memory Management -3 Memory Management=dsound_0001000301090000 -3 IUnknown Interface=dsound_0001000301090100 -2 Implementation: A Broad Overview=dsound_00010003010a0000 -2 Creating a DirectSound Object=dsound_00010003010b0000 -2 Creating a DirectSound Object Using CoCreateInstance=dsound_00010003010c0000 -2 Querying the Hardware Capabilities=dsound_00010003010d0000 -3 Creating Sound Buffers -3 Creating a Basic Sound Buffer=dsound_00010003010e0100 -3 Control Options=dsound_00010003010e0200 -3 Static and Streaming Sound Buffers=dsound_00010003010e0300 -3 Hardware and Software Sound Buffers=dsound_00010003010e0400 -3 Primary and Secondary Sound Buffers=dsound_00010003010e0500 -2 Writing to Sound Buffers=dsound_00010003010f0000 -2 Using the DirectSound Mixer=dsound_0001000301100000 -2 Using a Custom Mixer=dsound_0001000301110000 -2 Using Compressed Wave Formats=dsound_0001000301120000 -2 Reference -3 Functions -3 Functions=dsound_0001000302010000 -3 DirectSoundCreate=dsound_0001000302010100 -3 DirectSoundEnumerate=dsound_0001000302010200 -3 Callback Functions -3 Callback Functions=dsound_0001000302020000 -3 DSEnumCallback=dsound_0001000302020100 -3 IDirectSound Interface -3 IDirectSound Interface Method Groups=dsound_0001000302030100 -3 IDirectSound::AddRef=dsound_0001000302030200 -3 IDirectSound::Compact=dsound_0001000302030300 -3 IDirectSound::CreateSoundBuffer=dsound_0001000302030400 -3 IDirectSound::DuplicateSoundBuffer=dsound_0001000302030500 -3 IDirectSound::GetCaps=dsound_0001000302030600 -3 IDirectSound::GetSpeakerConfig=dsound_0001000302030700 -3 IDirectSound::Initialize=dsound_0001000302030800 -3 IDirectSound::QueryInterface=dsound_0001000302030900 -3 IDirectSound::Release=dsound_0001000302030a00 -3 IDirectSound::SetCooperativeLevel=dsound_0001000302030b00 -3 IDirectSound::SetSpeakerConfig=dsound_0001000302030c00 -3 IDirectSoundBuffer Interface -3 IDirectSoundBuffer Interface Method Groups=dsound_0001000302040100 -3 IDirectSoundBuffer::AddRef=dsound_0001000302040200 -3 IDirectSoundBuffer::GetCaps=dsound_0001000302040300 -3 IDirectSoundBuffer::GetCurrentPosition=dsound_0001000302040400 -3 IDirectSoundBuffer::GetFormat=dsound_0001000302040500 -3 IDirectSoundBuffer::GetFrequency=dsound_0001000302040600 -3 IDirectSoundBuffer::GetPan=dsound_0001000302040700 -3 IDirectSoundBuffer::GetStatus=dsound_0001000302040800 -3 IDirectSoundBuffer::GetVolume=dsound_0001000302040900 -3 IDirectSoundBuffer::Initialize=dsound_0001000302040a00 -3 IDirectSoundBuffer::Lock=dsound_0001000302040b00 -3 IDirectSoundBuffer::Play=dsound_0001000302040c00 -3 IDirectSoundBuffer::QueryInterface=dsound_0001000302040d00 -3 IDirectSoundBuffer::Release=dsound_0001000302040e00 -3 IDirectSoundBuffer::Restore=dsound_0001000302040f00 -3 IDirectSoundBuffer::SetCurrentPosition=dsound_0001000302041000 -3 IDirectSoundBuffer::SetFormat=dsound_0001000302041100 -3 IDirectSoundBuffer::SetFrequency=dsound_0001000302041200 -3 IDirectSoundBuffer::SetPan=dsound_0001000302041300 -3 IDirectSoundBuffer::SetVolume=dsound_0001000302041400 -3 IDirectSoundBuffer::Stop=dsound_0001000302041500 -3 IDirectSoundBuffer::Unlock=dsound_0001000302041600 -3 Structures -3 DSBCAPS=dsound_0001000302050100 -3 DSBUFFERDESC=dsound_0001000302050200 -3 DSCAPS=dsound_0001000302050300 -2 Return Values=dsound_0001000302060000 -1 DirectPlay -2 Overview -2 Overview=dplay_0001000401000000 -2 DirectPlay Architecture=dplay_0001000401010000 -2 Globally Unique Identifiers=dplay_0001000401020000 -2 Using DirectPlay=dplay_0001000401030000 -2 Session Management=dplay_0001000401040000 -2 Player Management=dplay_0001000401050000 -2 Group Management=dplay_0001000401060000 -2 Message Management=dplay_0001000401070000 -2 Reference -3 Functions -3 Functions=dplay_0001000402010000 -3 DirectPlayCreate=dplay_0001000402010100 -3 DirectPlayEnumerate=dplay_0001000402010200 -3 Callback Functions -3 Callback Functions=dplay_0001000402020000 -3 EnumDPCallback=dplay_0001000402020100 -3 EnumPlayersCallback=dplay_0001000402020200 -3 EnumSessionsCallback=dplay_0001000402020300 -3 IDirectPlay Interface -3 IDirectPlay Interface Method Groups=dplay_0001000402030100 -3 IDirectPlay::AddPlayerToGroup=dplay_0001000402030200 -3 IDirectPlay::AddRef=dplay_0001000402030300 -3 IDirectPlay::Close=dplay_0001000402030400 -3 IDirectPlay::CreateGroup=dplay_0001000402030500 -3 IDirectPlay::CreatePlayer=dplay_0001000402030600 -3 IDirectPlay::DeletePlayerFromGroup=dplay_0001000402030700 -3 IDirectPlay::DestroyGroup=dplay_0001000402030800 -3 IDirectPlay::DestroyPlayer=dplay_0001000402030900 -3 IDirectPlay::EnableNewPlayers=dplay_0001000402030a00 -3 IDirectPlay::EnumGroupPlayers=dplay_0001000402030b00 -3 IDirectPlay::EnumGroups=dplay_0001000402030c00 -3 IDirectPlay::EnumPlayers=dplay_0001000402030d00 -3 IDirectPlay::EnumSessions=dplay_0001000402030e00 -3 IDirectPlay::GetCaps=dplay_0001000402030f00 -3 IDirectPlay::GetMessageCount=dplay_0001000402031000 -3 IDirectPlay::GetPlayerCaps=dplay_0001000402031100 -3 IDirectPlay::GetPlayerName=dplay_0001000402031200 -3 IDirectPlay::Initialize=dplay_0001000402031300 -3 IDirectPlay::Open=dplay_0001000402031400 -3 IDirectPlay::QueryInterface=dplay_0001000402031500 -3 IDirectPlay::Receive=dplay_0001000402031600 -3 IDirectPlay::Release=dplay_0001000402031700 -3 IDirectPlay::SaveSession=dplay_0001000402031800 -3 IDirectPlay::Send=dplay_0001000402031900 -3 IDirectPlay::SetPlayerName=dplay_0001000402031a00 -3 Structures -3 Structures=dplay_0001000402040000 -3 DPCAPS=dplay_0001000402040100 -3 DPSESSIONDESC=dplay_0001000402040200 -3 System Messages=dplay_0001000402040300 -3 DPMSG_ADDPLAYER=dplay_0001000402040400 -3 DPMSG_DELETEPLAYER=dplay_0001000402040500 -3 DPMSG_GENERIC=dplay_0001000402040600 -3 DPMSG_GROUPADD=dplay_0001000402040700 -3 DPMSG_GROUPDELETE=dplay_0001000402040800 -2 Return Values=dplay_0001000402050000 -1 Direct3D -2 Direct3D Overview -3 Microsoft's 3D-Graphics Solutions -3 Microsoft's 3D-Graphics Solutions=3dchoice_0001000501010000 -3 Direct3D=3dchoice_0001000501010100 -3 DirectDraw=3dchoice_0001000501010200 -3 OpenGL=3dchoice_0001000501010300 -3 Direct3D Architecture -3 The Direct3D Vision=d3dintro_0001000501020100 -3 Rendering Engine=d3dintro_0001000501020200 -3 Execute Buffers=d3dintro_0001000501020300 -3 Transformation Module=d3dintro_0001000501020400 -3 Lighting Module=d3dintro_0001000501020500 -3 Rasterization Module=d3dintro_0001000501020600 -3 Colors and Fog=d3dintro_0001000501020700 -3 States and State Overrides=d3dintro_0001000501020800 -3 Direct3D File Format=d3dintro_0001000501020900 -3 A Technical Foundation for 3D Programming -3 A Technical Foundation for 3D Programming=rmmath_0001000501030000 -3 3D Coordinate Systems=rmmath_0001000501030100 -3 3D Transformations=rmmath_0001000501030200 -3 Polygons=rmmath_0001000501030300 -3 Triangle Strips and Fans=rmmath_0001000501030400 -3 Vectors and Quaternions=rmmath_0001000501030500 -3 Floating-point Precision=rmmath_0001000501030600 -3 Performance Optimization -3 Performance Optimization=perfopt_0001000501040000 -3 Clip Tests on Execution=perfopt_0001000501040100 -3 Batching Primitives=perfopt_0001000501040200 -3 Texture Size=perfopt_0001000501040300 -3 Triangle Flags=perfopt_0001000501040400 -3 Ramp Performance Tips=perfopt_0001000501040500 -3 Ramp Textures=perfopt_0001000501040600 -3 Z-Buffers=perfopt_0001000501040700 -3 Copy Mode=perfopt_0001000501040800 -2 Retained-Mode Overview -2 About Retained Mode=rmabout_0001000502010000 -3 Introduction to Direct3D Retained-Mode Objects -3 Introduction to Direct3D Retained-Mode Objects=rmobject_0001000502020000 -3 Objects and Interfaces=rmobject_0001000502020100 -3 Objects and Reference Counting=rmobject_0001000502020200 -3 Direct3DRMAnimation and Direct3DRMAnimationSet=rmobject_0001000502020300 -3 Direct3DRMDevice and Direct3DRMDeviceArray=rmobject_0001000502020400 -3 Direct3DRMFace and Direct3DRMFaceArray=rmobject_0001000502020500 -3 Direct3DRMFrame and Direct3DRMFrameArray=rmobject_0001000502020600 -3 Direct3DRMLight and Direct3DRMLightArray=rmobject_0001000502020700 -3 Direct3DRMMaterial=rmobject_0001000502020800 -3 Direct3DRMMesh and Direct3DRMMeshBuilder=rmobject_0001000502020900 -3 Direct3DRMObject=rmobject_0001000502020a00 -3 Direct3DRMPickedArray=rmobject_0001000502020b00 -3 Direct3DRMShadow=rmobject_0001000502020c00 -3 Direct3DRMTexture=rmobject_0001000502020d00 -3 Direct3DRMUserVisual=rmobject_0001000502020e00 -3 Direct3DRMViewport and Direct3DRMViewportArray=rmobject_0001000502020f00 -3 Direct3DRMVisual and Direct3DRMVisualArray=rmobject_0001000502021000 -3 Direct3DRMWrap=rmobject_0001000502021100 -3 Wrapping Types=rmobject_0001000502021200 -3 Direct3D Retained-Mode Tutorial -3 Direct3D Retained-Mode Tutorial=rmtutor_0001000502030000 -3 Setting up the Windows Environment=rmtutor_0001000502030100 -3 Enumerating Direct3D Device Drivers=rmtutor_0001000502030200 -3 Initialization=rmtutor_0001000502030300 -3 Creating a Direct3DRM Device and Viewport=rmtutor_0001000502030400 -3 Setting the Render State=rmtutor_0001000502030500 -3 Setting Up the Virtual Environment=rmtutor_0001000502030600 -3 Setting Up the Lights=rmtutor_0001000502030700 -3 Loading and Adding a Mesh=rmtutor_0001000502030800 -3 Releasing the Direct3DRM Objects=rmtutor_0001000502030900 -3 OverrideDefaults and ReadMouse=rmtutor_0001000502030a00 -3 Rendering into a Viewport=rmtutor_0001000502030b00 -2 Immediate-Mode Overview -2 About Immediate Mode=imabout_0001000503010000 -3 Introduction to Direct3D Immediate-Mode Objects -3 Introduction to Direct3D Immediate-Mode Objects=imobject_0001000503020000 -3 Direct3D Object Types=imobject_0001000503020100 -3 Direct3D Interface Objects=imobject_0001000503020200 -3 Direct3D Device Objects=imobject_0001000503020300 -3 Direct3D Texture Objects=imobject_0001000503020400 -3 Direct3D Material Objects=imobject_0001000503020500 -3 Direct3D Light Objects=imobject_0001000503020600 -3 Direct3D Viewport Objects=imobject_0001000503020700 -3 Direct3D Execute-Buffer Objects=imobject_0001000503020800 -3 Object Connectivity=imobject_0001000503020900 -3 Direct3D Immediate-Mode Tutorial -3 Direct3D Immediate-Mode Tutorial=d3dtutor_0001000503030000 -3 Beginning Initialization=d3dtutor_0001000503030100 -3 Creating DirectDraw and Direct3D Objects=d3dtutor_0001000503030200 -3 Setting Up the Device-Creation Callback Function=d3dtutor_0001000503030300 -3 Initializing the Viewport=d3dtutor_0001000503030400 -3 Setting the Immediate-Mode Render State=d3dtutor_0001000503030500 -3 Completing Initialization=d3dtutor_0001000503030600 -3 Running the Rendering Loop=d3dtutor_0001000503030700 -3 Cleaning Up=d3dtutor_0001000503030800 -2 Retained-Mode Reference -3 Functions -3 Direct3DRMCreate=rmfuncs_0001000504010100 -3 D3DRMColorGetAlpha=rmfuncs_0001000504010200 -3 D3DRMColorGetBlue=rmfuncs_0001000504010300 -3 D3DRMColorGetGreen=rmfuncs_0001000504010400 -3 D3DRMColorGetRed=rmfuncs_0001000504010500 -3 D3DRMCreateColorRGB=rmfuncs_0001000504010600 -3 D3DRMCreateColorRGBA=rmfuncs_0001000504010700 -3 D3DRMFREEFUNCTION=rmfuncs_0001000504010800 -3 D3DRMMALLOCFUNCTION=rmfuncs_0001000504010900 -3 D3DRMMatrixFromQuaternion=rmfuncs_0001000504010a00 -3 D3DRMQuaternionFromRotation=rmfuncs_0001000504010b00 -3 D3DRMQuaternionMultiply=rmfuncs_0001000504010c00 -3 D3DRMQuaternionSlerp=rmfuncs_0001000504010d00 -3 D3DRMREALLOCFUNCTION=rmfuncs_0001000504010e00 -3 D3DRMVectorAdd=rmfuncs_0001000504010f00 -3 D3DRMVectorCrossProduct=rmfuncs_0001000504011000 -3 D3DRMVectorDotProduct=rmfuncs_0001000504011100 -3 D3DRMVectorModulus=rmfuncs_0001000504011200 -3 D3DRMVectorNormalize=rmfuncs_0001000504011300 -3 D3DRMVectorRandom=rmfuncs_0001000504011400 -3 D3DRMVectorReflect=rmfuncs_0001000504011500 -3 D3DRMVectorRotate=rmfuncs_0001000504011600 -3 D3DRMVectorScale=rmfuncs_0001000504011700 -3 D3DRMVectorSubtract=rmfuncs_0001000504011800 -3 Callback Functions -3 D3DRMDEVICEPALETTECALLBACK=rmfuncs_0001000504020100 -3 D3DRMFRAMEMOVECALLBACK=rmfuncs_0001000504020200 -3 D3DRMLOADCALLBACK=rmfuncs_0001000504020300 -3 D3DRMLOADTEXTURECALLBACK=rmfuncs_0001000504020400 -3 D3DRMOBJECTCALLBACK=rmfuncs_0001000504020500 -3 D3DRMUPDATECALLBACK=rmfuncs_0001000504020600 -3 D3DRMUSERVISUALCALLBACK=rmfuncs_0001000504020700 -3 D3DRMWRAPCALLBACK=rmfuncs_0001000504020800 -3 IDirect3DRM Array Interfaces -3 Introduction to Array Interfaces=rmarray_0001000504030100 -3 IDirect3DRMArray Interface Method Groups=rmarray_0001000504030200 -3 IDirect3DRMArray::AddRef=rmarray_0001000504030300 -3 IDirect3DRMArray::GetSize=rmarray_0001000504030400 -3 IDirect3DRMArray::QueryInterface=rmarray_0001000504030500 -3 IDirect3DRMArray::Release=rmarray_0001000504030600 -3 IDirect3DRMDeviceArray Interface Method Groups=rmarray_0001000504030700 -3 IDirect3DRMDeviceArray::AddRef=rmarray_0001000504030800 -3 IDirect3DRMDeviceArray::GetElement=rmarray_0001000504030900 -3 IDirect3DRMDeviceArray::GetSize=rmarray_0001000504030a00 -3 IDirect3DRMDeviceArray::QueryInterface=rmarray_0001000504030b00 -3 IDirect3DRMDeviceArray::Release=rmarray_0001000504030c00 -3 IDirect3DRMFaceArray Interface Method Groups=rmarray_0001000504030d00 -3 IDirect3DRMFaceArray::AddRef=rmarray_0001000504030e00 -3 IDirect3DRMFaceArray::GetElement=rmarray_0001000504030f00 -3 IDirect3DRMFaceArray::GetSize=rmarray_0001000504031000 -3 IDirect3DRMFaceArray::QueryInterface=rmarray_0001000504031100 -3 IDirect3DRMFaceArray::Release=rmarray_0001000504031200 -3 IDirect3DRMFrameArray Interface Method Groups=rmarray_0001000504031300 -3 IDirect3DRMFrameArray::AddRef=rmarray_0001000504031400 -3 IDirect3DRMFrameArray::GetElement=rmarray_0001000504031500 -3 IDirect3DRMFrameArray::GetSize=rmarray_0001000504031600 -3 IDirect3DRMFrameArray::QueryInterface=rmarray_0001000504031700 -3 IDirect3DRMFrameArray::Release=rmarray_0001000504031800 -3 IDirect3DRMLightArray Interface Method Groups=rmarray_0001000504031900 -3 IDirect3DRMLightArray::AddRef=rmarray_0001000504031a00 -3 IDirect3DRMLightArray::GetElement=rmarray_0001000504031b00 -3 IDirect3DRMLightArray::GetSize=rmarray_0001000504031c00 -3 IDirect3DRMLightArray::QueryInterface=rmarray_0001000504031d00 -3 IDirect3DRMLightArray::Release=rmarray_0001000504031e00 -3 IDirect3DRMPickedArray Interface Method Groups=rmarray_0001000504031f00 -3 IDirect3DRMPickedArray::AddRef=rmarray_0001000504032000 -3 IDirect3DRMPickedArray::GetPick=rmarray_0001000504032100 -3 IDirect3DRMPickedArray::GetSize=rmarray_0001000504032200 -3 IDirect3DRMPickedArray::QueryInterface=rmarray_0001000504032300 -3 IDirect3DRMPickedArray::Release=rmarray_0001000504032400 -3 IDirect3DRMViewportArray Interface Method Groups=rmarray_0001000504032500 -3 IDirect3DRMViewportArray::AddRef=rmarray_0001000504032600 -3 IDirect3DRMViewportArray::GetElement=rmarray_0001000504032700 -3 IDirect3DRMViewportArray::GetSize=rmarray_0001000504032800 -3 IDirect3DRMViewportArray::QueryInterface=rmarray_0001000504032900 -3 IDirect3DRMViewportArray::Release=rmarray_0001000504032a00 -3 IDirect3DRMVisualArray Interface Method Groups=rmarray_0001000504032b00 -3 IDirect3DRMVisualArray::AddRef=rmarray_0001000504032c00 -3 IDirect3DRMVisualArray::GetElement=rmarray_0001000504032d00 -3 IDirect3DRMVisualArray::GetSize=rmarray_0001000504032e00 -3 IDirect3DRMVisualArray::QueryInterface=rmarray_0001000504032f00 -3 IDirect3DRMVisualArray::Release=rmarray_0001000504033000 -3 IDirect3DRM Interface -3 IDirect3DRM Interface Method Groups=rmid3drm_0001000504040100 -3 IDirect3DRM::AddRef=rmid3drm_0001000504040200 -3 IDirect3DRM::AddSearchPath=rmid3drm_0001000504040300 -3 IDirect3DRM::CreateAnimation=rmid3drm_0001000504040400 -3 IDirect3DRM::CreateAnimationSet=rmid3drm_0001000504040500 -3 IDirect3DRM::CreateDevice=rmid3drm_0001000504040600 -3 IDirect3DRM::CreateDeviceFromClipper=rmid3drm_0001000504040700 -3 IDirect3DRM::CreateDeviceFromD3D=rmid3drm_0001000504040800 -3 IDirect3DRM::CreateDeviceFromSurface=rmid3drm_0001000504040900 -3 IDirect3DRM::CreateFace=rmid3drm_0001000504040a00 -3 IDirect3DRM::CreateFrame=rmid3drm_0001000504040b00 -3 IDirect3DRM::CreateLight=rmid3drm_0001000504040c00 -3 IDirect3DRM::CreateLightRGB=rmid3drm_0001000504040d00 -3 IDirect3DRM::CreateMaterial=rmid3drm_0001000504040e00 -3 IDirect3DRM::CreateMesh=rmid3drm_0001000504040f00 -3 IDirect3DRM::CreateMeshBuilder=rmid3drm_0001000504041000 -3 IDirect3DRM::CreateObject=rmid3drm_0001000504041100 -3 IDirect3DRM::CreateShadow=rmid3drm_0001000504041200 -3 IDirect3DRM::CreateTexture=rmid3drm_0001000504041300 -3 IDirect3DRM::CreateTextureFromSurface=rmid3drm_0001000504041400 -3 IDirect3DRM::CreateUserVisual=rmid3drm_0001000504041500 -3 IDirect3DRM::CreateViewport=rmid3drm_0001000504041600 -3 IDirect3DRM::CreateWrap=rmid3drm_0001000504041700 -3 IDirect3DRM::EnumerateObjects=rmid3drm_0001000504041800 -3 IDirect3DRM::GetDevices=rmid3drm_0001000504041900 -3 IDirect3DRM::GetNamedObject=rmid3drm_0001000504041a00 -3 IDirect3DRM::GetSearchPath=rmid3drm_0001000504041b00 -3 IDirect3DRM::Load=rmid3drm_0001000504041c00 -3 IDirect3DRM::LoadTexture=rmid3drm_0001000504041d00 -3 IDirect3DRM::LoadTextureFromResource=rmid3drm_0001000504041e00 -3 IDirect3DRM::QueryInterface=rmid3drm_0001000504041f00 -3 IDirect3DRM::Release=rmid3drm_0001000504042000 -3 IDirect3DRM::SetDefaultTextureColors=rmid3drm_0001000504042100 -3 IDirect3DRM::SetDefaultTextureShades=rmid3drm_0001000504042200 -3 IDirect3DRM::SetSearchPath=rmid3drm_0001000504042300 -3 IDirect3DRM::Tick=rmid3drm_0001000504042400 -3 IDirect3DRMAnimation Interface -3 IDirect3DRMAnimation Interface Method Groups=rmanim_0001000504050100 -3 IDirect3DRMAnimation::AddPositionKey=rmanim_0001000504050200 -3 IDirect3DRMAnimation::AddRef=rmanim_0001000504050300 -3 IDirect3DRMAnimation::AddRotateKey=rmanim_0001000504050400 -3 IDirect3DRMAnimation::AddScaleKey=rmanim_0001000504050500 -3 IDirect3DRMAnimation::DeleteKey=rmanim_0001000504050600 -3 IDirect3DRMAnimation::GetOptions=rmanim_0001000504050700 -3 IDirect3DRMAnimation::QueryInterface=rmanim_0001000504050800 -3 IDirect3DRMAnimation::Release=rmanim_0001000504050900 -3 IDirect3DRMAnimation::SetFrame=rmanim_0001000504050a00 -3 IDirect3DRMAnimation::SetOptions=rmanim_0001000504050b00 -3 IDirect3DRMAnimation::SetTime=rmanim_0001000504050c00 -3 IDirect3DRMAnimationSet Interface -3 IDirect3DRMAnimationSet Interface Method Groups=rmanimst_0001000504060100 -3 IDirect3DRMAnimationSet::AddAnimation=rmanimst_0001000504060200 -3 IDirect3DRMAnimationSet::AddRef=rmanimst_0001000504060300 -3 IDirect3DRMAnimationSet::DeleteAnimation=rmanimst_0001000504060400 -3 IDirect3DRMAnimationSet::Load=rmanimst_0001000504060500 -3 IDirect3DRMAnimationSet::QueryInterface=rmanimst_0001000504060600 -3 IDirect3DRMAnimationSet::Release=rmanimst_0001000504060700 -3 IDirect3DRMAnimationSet::SetTime=rmanimst_0001000504060800 -3 IDirect3DRMDevice Interface -3 IDirect3DRMDevice Interface Method Groups=rmdevice_0001000504070100 -3 IDirect3DRMDevice::AddRef=rmdevice_0001000504070200 -3 IDirect3DRMDevice::AddUpdateCallback=rmdevice_0001000504070300 -3 IDirect3DRMDevice::DeleteUpdateCallback=rmdevice_0001000504070400 -3 IDirect3DRMDevice::GetBufferCount=rmdevice_0001000504070500 -3 IDirect3DRMDevice::GetColorModel=rmdevice_0001000504070600 -3 IDirect3DRMDevice::GetDirect3DDevice=rmdevice_0001000504070700 -3 IDirect3DRMDevice::GetDither=rmdevice_0001000504070800 -3 IDirect3DRMDevice::GetHeight=rmdevice_0001000504070900 -3 IDirect3DRMDevice::GetTrianglesDrawn=rmdevice_0001000504070a00 -3 IDirect3DRMDevice::GetQuality=rmdevice_0001000504070b00 -3 IDirect3DRMDevice::GetShades=rmdevice_0001000504070c00 -3 IDirect3DRMDevice::GetTextureQuality=rmdevice_0001000504070d00 -3 IDirect3DRMDevice::GetViewports=rmdevice_0001000504070e00 -3 IDirect3DRMDevice::GetWidth=rmdevice_0001000504070f00 -3 IDirect3DRMDevice::GetWireframeOptions=rmdevice_0001000504071000 -3 IDirect3DRMDevice::Init=rmdevice_0001000504071100 -3 IDirect3DRMDevice::InitFromClipper=rmdevice_0001000504071200 -3 IDirect3DRMDevice::InitFromD3D=rmdevice_0001000504071300 -3 IDirect3DRMDevice::QueryInterface=rmdevice_0001000504071400 -3 IDirect3DRMDevice::Release=rmdevice_0001000504071500 -3 IDirect3DRMDevice::SetBufferCount=rmdevice_0001000504071600 -3 IDirect3DRMDevice::SetDither=rmdevice_0001000504071700 -3 IDirect3DRMDevice::SetQuality=rmdevice_0001000504071800 -3 IDirect3DRMDevice::SetShades=rmdevice_0001000504071900 -3 IDirect3DRMDevice::SetTextureQuality=rmdevice_0001000504071a00 -3 IDirect3DRMDevice::Update=rmdevice_0001000504071b00 -3 IDirect3DRMFace Interface -3 IDirect3DRMFace Interface Method Groups=rmface_0001000504080100 -3 IDirect3DRMFace::AddRef=rmface_0001000504080200 -3 IDirect3DRMFace::AddVertex=rmface_0001000504080300 -3 IDirect3DRMFace::AddVertexAndNormalIndexed=rmface_0001000504080400 -3 IDirect3DRMFace::GetColor=rmface_0001000504080500 -3 IDirect3DRMFace::GetMaterial=rmface_0001000504080600 -3 IDirect3DRMFace::GetNormal=rmface_0001000504080700 -3 IDirect3DRMFace::GetTexture=rmface_0001000504080800 -3 IDirect3DRMFace::GetTextureCoordinateIndex=rmface_0001000504080900 -3 IDirect3DRMFace::GetTextureCoordinates=rmface_0001000504080a00 -3 IDirect3DRMFace::GetTextureTopology=rmface_0001000504080b00 -3 IDirect3DRMFace::GetVertex=rmface_0001000504080c00 -3 IDirect3DRMFace::GetVertexCount=rmface_0001000504080d00 -3 IDirect3DRMFace::GetVertexIndex=rmface_0001000504080e00 -3 IDirect3DRMFace::GetVertices=rmface_0001000504080f00 -3 IDirect3DRMFace::QueryInterface=rmface_0001000504081000 -3 IDirect3DRMFace::Release=rmface_0001000504081100 -3 IDirect3DRMFace::SetColor=rmface_0001000504081200 -3 IDirect3DRMFace::SetColorRGB=rmface_0001000504081300 -3 IDirect3DRMFace::SetMaterial=rmface_0001000504081400 -3 IDirect3DRMFace::SetTexture=rmface_0001000504081500 -3 IDirect3DRMFace::SetTextureCoordinates=rmface_0001000504081600 -3 IDirect3DRMFace::SetTextureTopology=rmface_0001000504081700 -3 IDirect3DRMFrame Interface -3 IDirect3DRMFrame Interface Method Groups=rmframe_0001000504090100 -3 IDirect3DRMFrame::AddChild=rmframe_0001000504090200 -3 IDirect3DRMFrame::AddLight=rmframe_0001000504090300 -3 IDirect3DRMFrame::AddMoveCallback=rmframe_0001000504090400 -3 IDirect3DRMFrame::AddRef=rmframe_0001000504090500 -3 IDirect3DRMFrame::AddRotation=rmframe_0001000504090600 -3 IDirect3DRMFrame::AddScale=rmframe_0001000504090700 -3 IDirect3DRMFrame::AddTransform=rmframe_0001000504090800 -3 IDirect3DRMFrame::AddTranslation=rmframe_0001000504090900 -3 IDirect3DRMFrame::AddVisual=rmframe_0001000504090a00 -3 IDirect3DRMFrame::DeleteChild=rmframe_0001000504090b00 -3 IDirect3DRMFrame::DeleteLight=rmframe_0001000504090c00 -3 IDirect3DRMFrame::DeleteMoveCallback=rmframe_0001000504090d00 -3 IDirect3DRMFrame::DeleteVisual=rmframe_0001000504090e00 -3 IDirect3DRMFrame::GetChildren=rmframe_0001000504090f00 -3 IDirect3DRMFrame::GetColor=rmframe_0001000504091000 -3 IDirect3DRMFrame::GetLights=rmframe_0001000504091100 -3 IDirect3DRMFrame::GetMaterialMode=rmframe_0001000504091200 -3 IDirect3DRMFrame::GetOrientation=rmframe_0001000504091300 -3 IDirect3DRMFrame::GetParent=rmframe_0001000504091400 -3 IDirect3DRMFrame::GetPosition=rmframe_0001000504091500 -3 IDirect3DRMFrame::GetRotation=rmframe_0001000504091600 -3 IDirect3DRMFrame::GetScene=rmframe_0001000504091700 -3 IDirect3DRMFrame::GetSceneBackground=rmframe_0001000504091800 -3 IDirect3DRMFrame::GetSceneBackgroundDepth=rmframe_0001000504091900 -3 IDirect3DRMFrame::GetSceneFogColor=rmframe_0001000504091a00 -3 IDirect3DRMFrame::GetSceneFogEnable=rmframe_0001000504091b00 -3 IDirect3DRMFrame::GetSceneFogMode=rmframe_0001000504091c00 -3 IDirect3DRMFrame::GetSceneFogParams=rmframe_0001000504091d00 -3 IDirect3DRMFrame::GetSortMode=rmframe_0001000504091e00 -3 IDirect3DRMFrame::GetTexture=rmframe_0001000504091f00 -3 IDirect3DRMFrame::GetTextureTopology=rmframe_0001000504092000 -3 IDirect3DRMFrame::GetTransform=rmframe_0001000504092100 -3 IDirect3DRMFrame::GetVelocity=rmframe_0001000504092200 -3 IDirect3DRMFrame::GetVisuals=rmframe_0001000504092300 -3 IDirect3DRMFrame::GetZbufferMode=rmframe_0001000504092400 -3 IDirect3DRMFrame::InverseTransform=rmframe_0001000504092500 -3 IDirect3DRMFrame::Load=rmframe_0001000504092600 -3 IDirect3DRMFrame::LookAt=rmframe_0001000504092700 -3 IDirect3DRMFrame::Move=rmframe_0001000504092800 -3 IDirect3DRMFrame::QueryInterface=rmframe_0001000504092900 -3 IDirect3DRMFrame::Release=rmframe_0001000504092a00 -3 IDirect3DRMFrame::SetColor=rmframe_0001000504092b00 -3 IDirect3DRMFrame::SetColorRGB=rmframe_0001000504092c00 -3 IDirect3DRMFrame::SetMaterialMode=rmframe_0001000504092d00 -3 IDirect3DRMFrame::SetOrientation=rmframe_0001000504092e00 -3 IDirect3DRMFrame::SetPosition=rmframe_0001000504092f00 -3 IDirect3DRMFrame::SetRotation=rmframe_0001000504093000 -3 IDirect3DRMFrame::SetSceneBackground=rmframe_0001000504093100 -3 IDirect3DRMFrame::SetSceneBackgroundDepth=rmframe_0001000504093200 -3 IDirect3DRMFrame::SetSceneBackgroundImage=rmframe_0001000504093300 -3 IDirect3DRMFrame::SetSceneBackgroundRGB=rmframe_0001000504093400 -3 IDirect3DRMFrame::SetSceneFogColor=rmframe_0001000504093500 -3 IDirect3DRMFrame::SetSceneFogEnable=rmframe_0001000504093600 -3 IDirect3DRMFrame::SetSceneFogMode=rmframe_0001000504093700 -3 IDirect3DRMFrame::SetSceneFogParams=rmframe_0001000504093800 -3 IDirect3DRMFrame::SetSortMode=rmframe_0001000504093900 -3 IDirect3DRMFrame::SetTexture=rmframe_0001000504093a00 -3 IDirect3DRMFrame::SetTextureTopology=rmframe_0001000504093b00 -3 IDirect3DRMFrame::SetVelocity=rmframe_0001000504093c00 -3 IDirect3DRMFrame::SetZbufferMode=rmframe_0001000504093d00 -3 IDirect3DRMFrame::Transform=rmframe_0001000504093e00 -3 IDirect3DRMLight Interface -3 IDirect3DRMLight Interface Method Groups=rmlight_00010005040a0100 -3 IDirect3DRMLight::AddRef=rmlight_00010005040a0200 -3 IDirect3DRMLight::GetColor=rmlight_00010005040a0300 -3 IDirect3DRMLight::GetConstantAttenuation=rmlight_00010005040a0400 -3 IDirect3DRMLight::GetEnableFrame=rmlight_00010005040a0500 -3 IDirect3DRMLight::GetLinearAttenuation=rmlight_00010005040a0600 -3 IDirect3DRMLight::GetPenumbra=rmlight_00010005040a0700 -3 IDirect3DRMLight::GetQuadraticAttenuation=rmlight_00010005040a0800 -3 IDirect3DRMLight::GetRange=rmlight_00010005040a0900 -3 IDirect3DRMLight::GetType=rmlight_00010005040a0a00 -3 IDirect3DRMLight::GetUmbra=rmlight_00010005040a0b00 -3 IDirect3DRMLight::QueryInterface=rmlight_00010005040a0c00 -3 IDirect3DRMLight::Release=rmlight_00010005040a0d00 -3 IDirect3DRMLight::SetColor=rmlight_00010005040a0e00 -3 IDirect3DRMLight::SetColorRGB=rmlight_00010005040a0f00 -3 IDirect3DRMLight::SetConstantAttenuation=rmlight_00010005040a1000 -3 IDirect3DRMLight::SetEnableFrame=rmlight_00010005040a1100 -3 IDirect3DRMLight::SetLinearAttenuation=rmlight_00010005040a1200 -3 IDirect3DRMLight::SetPenumbra=rmlight_00010005040a1300 -3 IDirect3DRMLight::SetQuadraticAttenuation=rmlight_00010005040a1400 -3 IDirect3DRMLight::SetRange=rmlight_00010005040a1500 -3 IDirect3DRMLight::SetType=rmlight_00010005040a1600 -3 IDirect3DRMLight::SetUmbra=rmlight_00010005040a1700 -3 IDirect3DRMMaterial Interface -3 IDirect3DRMMaterial Interface Method Groups=rmmatrl_00010005040b0100 -3 IDirect3DRMMaterial::AddRef=rmmatrl_00010005040b0200 -3 IDirect3DRMMaterial::GetEmissive=rmmatrl_00010005040b0300 -3 IDirect3DRMMaterial::GetPower=rmmatrl_00010005040b0400 -3 IDirect3DRMMaterial::GetSpecular=rmmatrl_00010005040b0500 -3 IDirect3DRMMaterial::QueryInterface=rmmatrl_00010005040b0600 -3 IDirect3DRMMaterial::Release=rmmatrl_00010005040b0700 -3 IDirect3DRMMaterial::SetEmissive=rmmatrl_00010005040b0800 -3 IDirect3DRMMaterial::SetPower=rmmatrl_00010005040b0900 -3 IDirect3DRMMaterial::SetSpecular=rmmatrl_00010005040b0a00 -3 IDirect3DRMMesh Interface -3 IDirect3DRMMesh Interface Method Groups=rmmesh_00010005040c0100 -3 IDirect3DRMMesh::AddGroup=rmmesh_00010005040c0200 -3 IDirect3DRMMesh::AddRef=rmmesh_00010005040c0300 -3 IDirect3DRMMesh::GetBox=rmmesh_00010005040c0400 -3 IDirect3DRMMesh::GetGroup=rmmesh_00010005040c0500 -3 IDirect3DRMMesh::GetGroupColor=rmmesh_00010005040c0600 -3 IDirect3DRMMesh::GetGroupCount=rmmesh_00010005040c0700 -3 IDirect3DRMMesh::GetGroupMapping=rmmesh_00010005040c0800 -3 IDirect3DRMMesh::GetGroupMaterial=rmmesh_00010005040c0900 -3 IDirect3DRMMesh::GetGroupQuality=rmmesh_00010005040c0a00 -3 IDirect3DRMMesh::GetGroupTexture=rmmesh_00010005040c0b00 -3 IDirect3DRMMesh::GetVertices=rmmesh_00010005040c0c00 -3 IDirect3DRMMesh::QueryInterface=rmmesh_00010005040c0d00 -3 IDirect3DRMMesh::Release=rmmesh_00010005040c0e00 -3 IDirect3DRMMesh::Scale=rmmesh_00010005040c0f00 -3 IDirect3DRMMesh::SetGroupColor=rmmesh_00010005040c1000 -3 IDirect3DRMMesh::SetGroupColorRGB=rmmesh_00010005040c1100 -3 IDirect3DRMMesh::SetGroupMapping=rmmesh_00010005040c1200 -3 IDirect3DRMMesh::SetGroupMaterial=rmmesh_00010005040c1300 -3 IDirect3DRMMesh::SetGroupQuality=rmmesh_00010005040c1400 -3 IDirect3DRMMesh::SetGroupTexture=rmmesh_00010005040c1500 -3 IDirect3DRMMesh::SetVertices=rmmesh_00010005040c1600 -3 IDirect3DRMMesh::Translate=rmmesh_00010005040c1700 -3 IDirect3DRMMeshBuilder Interface -3 IDirect3DRMMeshBuilder Interface Method Groups=rmmshbld_00010005040d0100 -3 IDirect3DRMMeshBuilder::AddFace=rmmshbld_00010005040d0200 -3 IDirect3DRMMeshBuilder::AddFaces=rmmshbld_00010005040d0300 -3 IDirect3DRMMeshBuilder::AddFrame=rmmshbld_00010005040d0400 -3 IDirect3DRMMeshBuilder::AddMesh=rmmshbld_00010005040d0500 -3 IDirect3DRMMeshBuilder::AddMeshBuilder=rmmshbld_00010005040d0600 -3 IDirect3DRMMeshBuilder::AddNormal=rmmshbld_00010005040d0700 -3 IDirect3DRMMeshBuilder::AddRef=rmmshbld_00010005040d0800 -3 IDirect3DRMMeshBuilder::AddVertex=rmmshbld_00010005040d0900 -3 IDirect3DRMMeshBuilder::CreateFace=rmmshbld_00010005040d0a00 -3 IDirect3DRMMeshBuilder::CreateMesh=rmmshbld_00010005040d0b00 -3 IDirect3DRMMeshBuilder::GenerateNormals=rmmshbld_00010005040d0c00 -3 IDirect3DRMMeshBuilder::GetBox=rmmshbld_00010005040d0d00 -3 IDirect3DRMMeshBuilder::GetColorSource=rmmshbld_00010005040d0e00 -3 IDirect3DRMMeshBuilder::GetFaceCount=rmmshbld_00010005040d0f00 -3 IDirect3DRMMeshBuilder::GetFaces=rmmshbld_00010005040d1000 -3 IDirect3DRMMeshBuilder::GetPerspective=rmmshbld_00010005040d1100 -3 IDirect3DRMMeshBuilder::GetQuality=rmmshbld_00010005040d1200 -3 IDirect3DRMMeshBuilder::GetTextureCoordinates=rmmshbld_00010005040d1300 -3 IDirect3DRMMeshBuilder::GetVertexColor=rmmshbld_00010005040d1400 -3 IDirect3DRMMeshBuilder::GetVertexCount=rmmshbld_00010005040d1500 -3 IDirect3DRMMeshBuilder::GetVertices=rmmshbld_00010005040d1600 -3 IDirect3DRMMeshBuilder::Load=rmmshbld_00010005040d1700 -3 IDirect3DRMMeshBuilder::QueryInterface=rmmshbld_00010005040d1800 -3 IDirect3DRMMeshBuilder::Release=rmmshbld_00010005040d1900 -3 IDirect3DRMMeshBuilder::ReserveSpace=rmmshbld_00010005040d1a00 -3 IDirect3DRMMeshBuilder::Save=rmmshbld_00010005040d1b00 -3 IDirect3DRMMeshBuilder::Scale=rmmshbld_00010005040d1c00 -3 IDirect3DRMMeshBuilder::SetColor=rmmshbld_00010005040d1d00 -3 IDirect3DRMMeshBuilder::SetColorRGB=rmmshbld_00010005040d1e00 -3 IDirect3DRMMeshBuilder::SetColorSource=rmmshbld_00010005040d1f00 -3 IDirect3DRMMeshBuilder::SetMaterial=rmmshbld_00010005040d2000 -3 IDirect3DRMMeshBuilder::SetNormal=rmmshbld_00010005040d2100 -3 IDirect3DRMMeshBuilder::SetPerspective=rmmshbld_00010005040d2200 -3 IDirect3DRMMeshBuilder::SetQuality=rmmshbld_00010005040d2300 -3 IDirect3DRMMeshBuilder::SetTexture=rmmshbld_00010005040d2400 -3 IDirect3DRMMeshBuilder::SetTextureCoordinates=rmmshbld_00010005040d2500 -3 IDirect3DRMMeshBuilder::SetTextureTopology=rmmshbld_00010005040d2600 -3 IDirect3DRMMeshBuilder::SetVertex=rmmshbld_00010005040d2700 -3 IDirect3DRMMeshBuilder::SetVertexColor=rmmshbld_00010005040d2800 -3 IDirect3DRMMeshBuilder::SetVertexColorRGB=rmmshbld_00010005040d2900 -3 IDirect3DRMMeshBuilder::Translate=rmmshbld_00010005040d2a00 -3 IDirect3DRMObject Interface -3 IDirect3DRMObject Interface Method Groups=rmobject_00010005040e0100 -3 IDirect3DRMObject::AddDestroyCallback=rmobject_00010005040e0200 -3 IDirect3DRMObject::AddRef=rmobject_00010005040e0300 -3 IDirect3DRMObject::Clone=rmobject_00010005040e0400 -3 IDirect3DRMObject::DeleteDestroyCallback=rmobject_00010005040e0500 -3 IDirect3DRMObject::GetAppData=rmobject_00010005040e0600 -3 IDirect3DRMObject::GetClassName=rmobject_00010005040e0700 -3 IDirect3DRMObject::GetName=rmobject_00010005040e0800 -3 IDirect3DRMObject::QueryInterface=rmobject_00010005040e0900 -3 IDirect3DRMObject::Release=rmobject_00010005040e0a00 -3 IDirect3DRMObject::SetAppData=rmobject_00010005040e0b00 -3 IDirect3DRMObject::SetName=rmobject_00010005040e0c00 -3 IDirect3DRMShadow Interface -3 IDirect3DRMShadow Interface Method Groups=rmshadow_00010005040f0100 -3 IDirect3DRMShadow::AddRef=rmshadow_00010005040f0200 -3 IDirect3DRMShadow::Init=rmshadow_00010005040f0300 -3 IDirect3DRMShadow::QueryInterface=rmshadow_00010005040f0400 -3 IDirect3DRMShadow::Release=rmshadow_00010005040f0500 -3 IDirect3DRMTexture Interface -3 IDirect3DRMTexture Interface Method Groups=rmtextur_0001000504100100 -3 IDirect3DRMTexture::AddRef=rmtextur_0001000504100200 -3 IDirect3DRMTexture::Changed=rmtextur_0001000504100300 -3 IDirect3DRMTexture::GetColors=rmtextur_0001000504100400 -3 IDirect3DRMTexture::GetDecalOrigin=rmtextur_0001000504100500 -3 IDirect3DRMTexture::GetDecalScale=rmtextur_0001000504100600 -3 IDirect3DRMTexture::GetDecalSize=rmtextur_0001000504100700 -3 IDirect3DRMTexture::GetDecalTransparency=rmtextur_0001000504100800 -3 IDirect3DRMTexture::GetDecalTransparentColor=rmtextur_0001000504100900 -3 IDirect3DRMTexture::GetImage=rmtextur_0001000504100a00 -3 IDirect3DRMTexture::GetShades=rmtextur_0001000504100b00 -3 IDirect3DRMTexture::InitFromFile=rmtextur_0001000504100c00 -3 IDirect3DRMTexture::InitFromResource=rmtextur_0001000504100d00 -3 IDirect3DRMTexture::InitFromSurface=rmtextur_0001000504100e00 -3 IDirect3DRMTexture::QueryInterface=rmtextur_0001000504100f00 -3 IDirect3DRMTexture::Release=rmtextur_0001000504101000 -3 IDirect3DRMTexture::SetColors=rmtextur_0001000504101100 -3 IDirect3DRMTexture::SetDecalOrigin=rmtextur_0001000504101200 -3 IDirect3DRMTexture::SetDecalScale=rmtextur_0001000504101300 -3 IDirect3DRMTexture::SetDecalSize=rmtextur_0001000504101400 -3 IDirect3DRMTexture::SetDecalTransparency=rmtextur_0001000504101500 -3 IDirect3DRMTexture::SetDecalTransparentColor=rmtextur_0001000504101600 -3 IDirect3DRMTexture::SetShades=rmtextur_0001000504101700 -3 IDirect3DRMUserVisual Interface -3 IDirect3DRMUserVisual Interface Method Groups=rmuservz_0001000504110100 -3 IDirect3DRMUserVisual::AddRef=rmuservz_0001000504110200 -3 IDirect3DRMUserVisual::Init=rmuservz_0001000504110300 -3 IDirect3DRMUserVisual::QueryInterface=rmuservz_0001000504110400 -3 IDirect3DRMUserVisual::Release=rmuservz_0001000504110500 -3 IDirect3DRMViewport Interface -3 IDirect3DRMViewport Interface Method Groups=rmviewpt_0001000504120100 -3 IDirect3DRMViewport::AddRef=rmviewpt_0001000504120200 -3 IDirect3DRMViewport::Clear=rmviewpt_0001000504120300 -3 IDirect3DRMViewport::Configure=rmviewpt_0001000504120400 -3 IDirect3DRMViewport::ForceUpdate=rmviewpt_0001000504120500 -3 IDirect3DRMViewport::GetBack=rmviewpt_0001000504120600 -3 IDirect3DRMViewport::GetCamera=rmviewpt_0001000504120700 -3 IDirect3DRMViewport::GetDevice=rmviewpt_0001000504120800 -3 IDirect3DRMViewport::GetDirect3DViewport=rmviewpt_0001000504120900 -3 IDirect3DRMViewport::GetField=rmviewpt_0001000504120a00 -3 IDirect3DRMViewport::GetFront=rmviewpt_0001000504120b00 -3 IDirect3DRMViewport::GetHeight=rmviewpt_0001000504120c00 -3 IDirect3DRMViewport::GetPlane=rmviewpt_0001000504120d00 -3 IDirect3DRMViewport::GetProjection=rmviewpt_0001000504120e00 -3 IDirect3DRMViewport::GetUniformScaling=rmviewpt_0001000504120f00 -3 IDirect3DRMViewport::GetWidth=rmviewpt_0001000504121000 -3 IDirect3DRMViewport::GetX=rmviewpt_0001000504121100 -3 IDirect3DRMViewport::GetY=rmviewpt_0001000504121200 -3 IDirect3DRMViewport::Init=rmviewpt_0001000504121300 -3 IDirect3DRMViewport::InverseTransform=rmviewpt_0001000504121400 -3 IDirect3DRMViewport::Pick=rmviewpt_0001000504121500 -3 IDirect3DRMViewport::QueryInterface=rmviewpt_0001000504121600 -3 IDirect3DRMViewport::Release=rmviewpt_0001000504121700 -3 IDirect3DRMViewport::Render=rmviewpt_0001000504121800 -3 IDirect3DRMViewport::SetBack=rmviewpt_0001000504121900 -3 IDirect3DRMViewport::SetCamera=rmviewpt_0001000504121a00 -3 IDirect3DRMViewport::SetField=rmviewpt_0001000504121b00 -3 IDirect3DRMViewport::SetFront=rmviewpt_0001000504121c00 -3 IDirect3DRMViewport::SetPlane=rmviewpt_0001000504121d00 -3 IDirect3DRMViewport::SetProjection=rmviewpt_0001000504121e00 -3 IDirect3DRMViewport::SetUniformScaling=rmviewpt_0001000504121f00 -3 IDirect3DRMViewport::Transform=rmviewpt_0001000504122000 -3 IDirect3DRMWinDevice Interface -3 IDirect3DRMWinDevice Interface Method Groups=rmwindev_0001000504130100 -3 IDirect3DRMWinDevice::AddRef=rmwindev_0001000504130200 -3 IDirect3DRMWinDevice::HandleActivate=rmwindev_0001000504130300 -3 IDirect3DRMWinDevice::HandlePaint=rmwindev_0001000504130400 -3 IDirect3DRMWinDevice::QueryInterface=rmwindev_0001000504130500 -3 IDirect3DRMWinDevice::Release=rmwindev_0001000504130600 -3 IDirect3DRMWrap Interface -3 IDirect3DRMWrap Interface Method Groups=rmwrap_0001000504140100 -3 IDirect3DRMWrap::AddRef=rmwrap_0001000504140200 -3 IDirect3DRMWrap::Apply=rmwrap_0001000504140300 -3 IDirect3DRMWrap::ApplyRelative=rmwrap_0001000504140400 -3 IDirect3DRMWrap::Init=rmwrap_0001000504140500 -3 IDirect3DRMWrap::QueryInterface=rmwrap_0001000504140600 -3 IDirect3DRMWrap::Release=rmwrap_0001000504140700 -3 Structures -3 D3DRMBOX=rmtypes_0001000504150100 -3 D3DRMIMAGE=rmtypes_0001000504150200 -3 D3DRMLOADMEMORY=rmtypes_0001000504150300 -3 D3DRMLOADRESOURCE=rmtypes_0001000504150400 -3 D3DRMPALETTEENTRY=rmtypes_0001000504150500 -3 D3DRMPICKDESC=rmtypes_0001000504150600 -3 D3DRMQUATERNION=rmtypes_0001000504150700 -3 D3DRMVECTOR4D=rmtypes_0001000504150800 -3 D3DRMVERTEX=rmtypes_0001000504150900 -3 Enumerated Types -3 D3DRMCOLORSOURCE=rmtypes_0001000504160100 -3 D3DRMCOMBINETYPE=rmtypes_0001000504160200 -3 D3DRMFILLMODE=rmtypes_0001000504160300 -3 D3DRMFOGMODE=rmtypes_0001000504160400 -3 D3DRMFRAMECONSTRAINT=rmtypes_0001000504160500 -3 D3DRMLIGHTMODE=rmtypes_0001000504160600 -3 D3DRMLIGHTTYPE=rmtypes_0001000504160700 -3 D3DRMMATERIALMODE=rmtypes_0001000504160800 -3 D3DRMPALETTEFLAGS=rmtypes_0001000504160900 -3 D3DRMPROJECTIONTYPE=rmtypes_0001000504160a00 -3 D3DRMRENDERQUALITY=rmtypes_0001000504160b00 -3 D3DRMSHADEMODE=rmtypes_0001000504160c00 -3 D3DRMSORTMODE=rmtypes_0001000504160d00 -3 D3DRMTEXTUREQUALITY=rmtypes_0001000504160e00 -3 D3DRMUSERVISUALREASON=rmtypes_0001000504160f00 -3 D3DRMWRAPTYPE=rmtypes_0001000504161000 -3 D3DRMXOFFORMAT=rmtypes_0001000504161100 -3 D3DRMZBUFFERMODE=rmtypes_0001000504161200 -3 Other Types -3 D3DRMANIMATIONOPTIONS=rmtypes_0001000504170100 -3 D3DRMCOLORMODEL=rmtypes_0001000504170200 -3 D3DRMLOADOPTIONS=rmtypes_0001000504170300 -3 D3DRMMAPPING=rmtypes_0001000504170400 -3 D3DRMMATRIX4D=rmtypes_0001000504170500 -3 D3DRMSAVEOPTIONS=rmtypes_0001000504170600 -2 Return Values=rmtypes_0001000504180000 -2 Immediate-Mode Reference -3 Macros -3 D3DDivide=d3dapi_0001000505010100 -3 D3DMultiply=d3dapi_0001000505010200 -3 D3DRGB=d3dapi_0001000505010300 -3 D3DRGBA=d3dapi_0001000505010400 -3 D3DSTATE_OVERRIDE=d3dapi_0001000505010500 -3 D3DVAL=d3dapi_0001000505010600 -3 D3DVALP=d3dapi_0001000505010700 -3 RGB_GETBLUE=d3dapi_0001000505010800 -3 RGB_GETGREEN=d3dapi_0001000505010900 -3 RGB_GETRED=d3dapi_0001000505010a00 -3 RGB_MAKE=d3dapi_0001000505010b00 -3 RGB_TORGBA=d3dapi_0001000505010c00 -3 RGBA_GETALPHA=d3dapi_0001000505010d00 -3 RGBA_GETBLUE=d3dapi_0001000505010e00 -3 RGBA_GETGREEN=d3dapi_0001000505010f00 -3 RGBA_GETRED=d3dapi_0001000505011000 -3 RGBA_MAKE=d3dapi_0001000505011100 -3 RGBA_SETALPHA=d3dapi_0001000505011200 -3 RGBA_TORGB=d3dapi_0001000505011300 -3 Callback Functions -3 D3DENUMDEVICESCALLBACK=d3dapi_0001000505020100 -3 D3DENUMTEXTUREFORMATSCALLBACK=d3dapi_0001000505020200 -3 D3DVALIDATECALLBACK=d3dapi_0001000505020300 -3 IDirect3D Interface -3 IDirect3D Interface Method Groups=id3dapi_0001000505030100 -3 IDirect3D::AddRef=id3dapi_0001000505030200 -3 IDirect3D::CreateLight=id3dapi_0001000505030300 -3 IDirect3D::CreateMaterial=id3dapi_0001000505030400 -3 IDirect3D::CreateViewport=id3dapi_0001000505030500 -3 IDirect3D::EnumDevices=id3dapi_0001000505030600 -3 IDirect3D::FindDevice=id3dapi_0001000505030700 -3 IDirect3D::Initialize=id3dapi_0001000505030800 -3 IDirect3D::QueryInterface=id3dapi_0001000505030900 -3 IDirect3D::Release=id3dapi_0001000505030a00 -3 IDirect3DDevice Interface -3 IDirect3DDevice Interface Method Groups=id3ddevc_0001000505040100 -3 IDirect3DDevice::AddRef=id3ddevc_0001000505040200 -3 IDirect3DDevice::AddViewport=id3ddevc_0001000505040300 -3 IDirect3DDevice::BeginScene=id3ddevc_0001000505040400 -3 IDirect3DDevice::CreateExecuteBuffer=id3ddevc_0001000505040500 -3 IDirect3DDevice::CreateMatrix=id3ddevc_0001000505040600 -3 IDirect3DDevice::DeleteMatrix=id3ddevc_0001000505040700 -3 IDirect3DDevice::DeleteViewport=id3ddevc_0001000505040800 -3 IDirect3DDevice::EndScene=id3ddevc_0001000505040900 -3 IDirect3DDevice::EnumTextureFormats=id3ddevc_0001000505040a00 -3 IDirect3DDevice::Execute=id3ddevc_0001000505040b00 -3 IDirect3DDevice::GetCaps=id3ddevc_0001000505040c00 -3 IDirect3DDevice::GetDirect3D=id3ddevc_0001000505040d00 -3 IDirect3DDevice::GetMatrix=id3ddevc_0001000505040e00 -3 IDirect3DDevice::GetPickRecords=id3ddevc_0001000505040f00 -3 IDirect3DDevice::GetStats=id3ddevc_0001000505041000 -3 IDirect3DDevice::Initialize=id3ddevc_0001000505041100 -3 IDirect3DDevice::NextViewport=id3ddevc_0001000505041200 -3 IDirect3DDevice::Pick=id3ddevc_0001000505041300 -3 IDirect3DDevice::QueryInterface=id3ddevc_0001000505041400 -3 IDirect3DDevice::Release=id3ddevc_0001000505041500 -3 IDirect3DDevice::SetMatrix=id3ddevc_0001000505041600 -3 IDirect3DDevice::SwapTextureHandles=id3ddevc_0001000505041700 -3 IDirect3DExecuteBuffer Interface -3 IDirect3DExecuteBuffer Interface Method Groups=id3dexbf_0001000505050100 -3 IDirect3DExecuteBuffer::AddRef=id3dexbf_0001000505050200 -3 IDirect3DExecuteBuffer::GetExecuteData=id3dexbf_0001000505050300 -3 IDirect3DExecuteBuffer::Initialize=id3dexbf_0001000505050400 -3 IDirect3DExecuteBuffer::Lock=id3dexbf_0001000505050500 -3 IDirect3DExecuteBuffer::Optimize=id3dexbf_0001000505050600 -3 IDirect3DExecuteBuffer::QueryInterface=id3dexbf_0001000505050700 -3 IDirect3DExecuteBuffer::Release=id3dexbf_0001000505050800 -3 IDirect3DExecuteBuffer::SetExecuteData=id3dexbf_0001000505050900 -3 IDirect3DExecuteBuffer::Unlock=id3dexbf_0001000505050a00 -3 IDirect3DExecuteBuffer::Validate=id3dexbf_0001000505050b00 -3 IDirect3DLight Interface -3 IDirect3DLight Interface Method Groups=id3dlite_0001000505060100 -3 IDirect3DLight::AddRef=id3dlite_0001000505060200 -3 IDirect3DLight::GetLight=id3dlite_0001000505060300 -3 IDirect3DLight::Initialize=id3dlite_0001000505060400 -3 IDirect3DLight::QueryInterface=id3dlite_0001000505060500 -3 IDirect3DLight::Release=id3dlite_0001000505060600 -3 IDirect3DLight::SetLight=id3dlite_0001000505060700 -3 IDirect3DMaterial Interface -3 IDirect3DMaterial Interface Method Groups=id3dmat_0001000505070100 -3 IDirect3DMaterial::AddRef=id3dmat_0001000505070200 -3 IDirect3DMaterial::GetHandle=id3dmat_0001000505070300 -3 IDirect3DMaterial::GetMaterial=id3dmat_0001000505070400 -3 IDirect3DMaterial::Initialize=id3dmat_0001000505070500 -3 IDirect3DMaterial::QueryInterface=id3dmat_0001000505070600 -3 IDirect3DMaterial::Release=id3dmat_0001000505070700 -3 IDirect3DMaterial::Reserve=id3dmat_0001000505070800 -3 IDirect3DMaterial::SetMaterial=id3dmat_0001000505070900 -3 IDirect3DMaterial::Unreserve=id3dmat_0001000505070a00 -3 IDirect3DTexture Interface -3 IDirect3DTexture Interface Method Groups=id3dtext_0001000505080100 -3 IDirect3DTexture::AddRef=id3dtext_0001000505080200 -3 IDirect3DTexture::GetHandle=id3dtext_0001000505080300 -3 IDirect3DTexture::Initialize=id3dtext_0001000505080400 -3 IDirect3DTexture::Load=id3dtext_0001000505080500 -3 IDirect3DTexture::PaletteChanged=id3dtext_0001000505080600 -3 IDirect3DTexture::QueryInterface=id3dtext_0001000505080700 -3 IDirect3DTexture::Release=id3dtext_0001000505080800 -3 IDirect3DTexture::Unload=id3dtext_0001000505080900 -3 IDirect3DViewport Interface -3 IDirect3DViewport Interface Method Groups=id3dview_0001000505090100 -3 IDirect3DViewport::AddLight=id3dview_0001000505090200 -3 IDirect3DViewport::AddRef=id3dview_0001000505090300 -3 IDirect3DViewport::Clear=id3dview_0001000505090400 -3 IDirect3DViewport::DeleteLight=id3dview_0001000505090500 -3 IDirect3DViewport::GetBackground=id3dview_0001000505090600 -3 IDirect3DViewport::GetBackgroundDepth=id3dview_0001000505090700 -3 IDirect3DViewport::GetViewport=id3dview_0001000505090800 -3 IDirect3DViewport::Initialize=id3dview_0001000505090900 -3 IDirect3DViewport::LightElements=id3dview_0001000505090a00 -3 IDirect3DViewport::NextLight=id3dview_0001000505090b00 -3 IDirect3DViewport::QueryInterface=id3dview_0001000505090c00 -3 IDirect3DViewport::Release=id3dview_0001000505090d00 -3 IDirect3DViewport::SetBackground=id3dview_0001000505090e00 -3 IDirect3DViewport::SetBackgroundDepth=id3dview_0001000505090f00 -3 IDirect3DViewport::SetViewport=id3dview_0001000505091000 -3 IDirect3DViewport::TransformVertices=id3dview_0001000505091100 -3 Structures -3 D3DBRANCH=id3dtype_00010005050a0100 -3 D3DCOLORVALUE=id3dtype_00010005050a0200 -3 D3DDEVICEDESC=id3dtype_00010005050a0300 -3 D3DEXECUTEBUFFERDESC=id3dtype_00010005050a0400 -3 D3DEXECUTEDATA=id3dtype_00010005050a0500 -3 D3DFINDDEVICERESULT=id3dtype_00010005050a0600 -3 D3DFINDDEVICESEARCH=id3dtype_00010005050a0700 -3 D3DHVERTEX=id3dtype_00010005050a0800 -3 D3DINSTRUCTION=id3dtype_00010005050a0900 -3 D3DLIGHT=id3dtype_00010005050a0a00 -3 D3DLIGHTDATA=id3dtype_00010005050a0b00 -3 D3DLIGHTINGCAPS=id3dtype_00010005050a0c00 -3 D3DLIGHTINGELEMENT=id3dtype_00010005050a0d00 -3 D3DLINE=id3dtype_00010005050a0e00 -3 D3DLINEPATTERN=id3dtype_00010005050a0f00 -3 D3DLVERTEX=id3dtype_00010005050a1000 -3 D3DMATERIAL=id3dtype_00010005050a1100 -3 D3DMATRIX=id3dtype_00010005050a1200 -3 D3DMATRIXLOAD=id3dtype_00010005050a1300 -3 D3DMATRIXMULTIPLY=id3dtype_00010005050a1400 -3 D3DPICKRECORD=id3dtype_00010005050a1500 -3 D3DPOINT=id3dtype_00010005050a1600 -3 D3DPRIMCAPS=id3dtype_00010005050a1700 -3 D3DPROCESSVERTICES=id3dtype_00010005050a1800 -3 D3DRECT=id3dtype_00010005050a1900 -3 D3DSPAN=id3dtype_00010005050a1a00 -3 D3DSTATE=id3dtype_00010005050a1b00 -3 D3DSTATS=id3dtype_00010005050a1c00 -3 D3DSTATUS=id3dtype_00010005050a1d00 -3 D3DTEXTURELOAD=id3dtype_00010005050a1e00 -3 D3DTLVERTEX=id3dtype_00010005050a1f00 -3 D3DTRANSFORMCAPS=id3dtype_00010005050a2000 -3 D3DTRANSFORMDATA=id3dtype_00010005050a2100 -3 D3DTRIANGLE=id3dtype_00010005050a2200 -3 D3DVECTOR=id3dtype_00010005050a2300 -3 D3DVERTEX=id3dtype_00010005050a2400 -3 D3DVIEWPORT=id3dtype_00010005050a2500 -3 Enumerated Types -3 D3DBLEND=id3dtype_00010005050b0100 -3 D3DCMPFUNC=id3dtype_00010005050b0200 -3 D3DCOLORMODEL=id3dtype_00010005050b0300 -3 D3DCULL=id3dtype_00010005050b0400 -3 D3DFILLMODE=id3dtype_00010005050b0500 -3 D3DFOGMODE=id3dtype_00010005050b0600 -3 D3DLIGHTSTATETYPE=id3dtype_00010005050b0700 -3 D3DLIGHTTYPE=id3dtype_00010005050b0800 -3 D3DOPCODE=id3dtype_00010005050b0900 -3 D3DRENDERSTATETYPE=id3dtype_00010005050b0a00 -3 D3DSHADEMODE=id3dtype_00010005050b0b00 -3 D3DTEXTUREADDRESS=id3dtype_00010005050b0c00 -3 D3DTEXTUREBLEND=id3dtype_00010005050b0d00 -3 D3DTEXTUREFILTER=id3dtype_00010005050b0e00 -3 D3DTRANSFORMSTATETYPE=id3dtype_00010005050b0f00 -3 Other Types -3 D3DCOLOR=id3dtype_00010005050c0100 -3 D3DVALUE=id3dtype_00010005050c0200 -2 Return Values=id3dtype_00010005050d0000 -1 DirectInput -2 Overview -2 Introduction to Joysticks=dinput_0001000601010000 -2 Joystick Capabilities=dinput_0001000601020000 -2 Joystick Calibration and Testing=dinput_0001000601030000 -2 Joystick Position=dinput_0001000601040000 -2 Reference -2 Joystick Groups=dinput_0001000602010000 -3 Functions -3 joyConfigChanged=dinput_0001000602020100 -3 joyGetDevCaps=dinput_0001000602020200 -3 joyGetNumDevs=dinput_0001000602020300 -3 joyGetPosEx=dinput_0001000602020400 -3 Structures -3 JOYCAPS=dinput_0001000602030100 -3 JOYINFOEX=dinput_0001000602030200 -2 Return Values=dinput_0001000602040000 -1 DirectSetup -2 Overview -2 About DirectSetup=dsetup_0001000701010000 -2 Using DirectSetup=dsetup_0001000701020000 -2 Reference -3 Functions -3 Functions=dsetup_0001000702010000 -3 DirectXSetup=dsetup_0001000702010100 -1 AutoPlay -2 Overview -2 About AutoPlay=autoplay_0001000801010000 -2 How AutoPlay Works=autoplay_0001000801020000 -2 The Autorun.inf File=autoplay_0001000801030000 -3 Tips for Writing AutoPlay Applications -3 Opening a Startup Application=autoplay_0001000801040100 -3 Loading in the Background=autoplay_0001000801040200 -3 Conserving Hard Disk Space=autoplay_0001000801040300 -3 Using the Registry=autoplay_0001000801040400 -3 Setting the NoDriveTypeAutoRun Value=autoplay_0001000801040500 -2 Suppressing AutoPlay=autoplay_0001000801050000 -2 AutoPlay for MS-DOS-Based Applications=autoplay_0001000801060000 -2 Reference -2 defaulticon=autoplay_0001000802000100 -2 icon=autoplay_0001000802000200 -2 open=autoplay_0001000802000300 -2 shell=autoplay_0001000802000400 -2 shell\verb=autoplay_0001000802000500 diff --git a/docs/winhelp/archive/directx2/directx.hlp b/docs/winhelp/archive/directx2/directx.hlp deleted file mode 100644 index e0814fb..0000000 Binary files a/docs/winhelp/archive/directx2/directx.hlp and /dev/null differ diff --git a/docs/winhelp/archive/readme.txt b/docs/winhelp/archive/readme.txt deleted file mode 100644 index 94e83be..0000000 --- a/docs/winhelp/archive/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -This directory contains an archive of the documentation for both the -Microsoft Game SDK and Microsoft DirectX 2 SDK. The Game SDK information -is located in the \DIRECTX1 directory. The DirectX 2 SDK information -is located in the \DIRECTX2 directory. - -The information found in these directories is not directly related -to the documentation for the DirectX 3 SDK. However, it is included here -in case you need information about previous versions of a COM interface. - diff --git a/docs/winhelp/directx.GID b/docs/winhelp/directx.GID deleted file mode 100644 index 96e0be2..0000000 Binary files a/docs/winhelp/directx.GID and /dev/null differ diff --git a/docs/winhelp/directx.cnt b/docs/winhelp/directx.cnt deleted file mode 100644 index beff53f..0000000 --- a/docs/winhelp/directx.cnt +++ /dev/null @@ -1,1332 +0,0 @@ -:base directx.hlp -:title Microsoft DirectX 3 SDK -:link directx.hlp -:link selfsame -1 Copyrights and Trademarks=legal_0001000000000001 -1 Introducing DirectX 3 -2 DirectX Goals -2 DirectX Goals=dxintro_0001010101000000 -2 Benefits of Developing DirectX Windows Applications=dxintro_0001010101010000 -2 Providing Guidelines for Hardware Development=dxintro_0001010101020000 -2 The DirectX SDK -2 The DirectX SDK=dxintro_0001010102000000 -2 DirectX SDK Components=dxintro_0001010102010000 -2 Using Macro Definitions=dxintro_0001010102020000 -2 DirectX and the Component Object Model -2 DirectX and the Component Object Model=dxintro_0001010103000000 -2 The Component Object Model=dxintro_0001010103010000 -3 IUnknown Interface -3 IUnknown Interface=dxintro_0001010103020000 -3 IUnknown::AddRef=dxintro_0001010103020100 -3 IUnknown::QueryInterface=dxintro_0001010103020200 -3 IUnknown::Release=dxintro_0001010103020300 -2 DirectX COM Interfaces=dxintro_0001010103030000 -2 C++ and the COM Interface=dxintro_0001010103040000 -2 Accessing COM Objects by Using C=dxintro_0001010103050000 -2 Interface Method Names and Syntax=dxintro_0001010103060000 -1 What's New in the DirectX 3 SDK?=dxintro_0001010104000000 -1 Conventions=dxintro_0001010105000000 -1 DirectDraw -1 About DirectDraw=ddoverv_0001010201000000 -1 DirectDraw Architecture=ddoverv_0001010202000000 -2 DirectDraw Overview -2 DirectDraw Overview=ddoverv_0001010203000000 -2 DirectDraw=ddoverv_0001010203010000 -2 Other DirectDraw Features=ddoverv_0001010203020000 -2 DirectDraw HAL=ddoverv_0001010203030000 -2 DirectDraw HEL=ddoverv_0001010203040000 -2 Types of DirectDraw Objects=ddoverv_0001010203050000 -2 Width and Pitch=ddoverv_0001010203060000 -3 Support for 3D Surfaces -3 Support for 3D Surfaces=ddoverv_0001010203070000 -3 Texture Maps=ddoverv_0001010203070100 -3 Mipmaps=ddoverv_0001010203070200 -3 Z-Buffers=ddoverv_0001010203070300 -3 Direct3D Integration with DirectDraw -3 Direct3D Integration with DirectDraw=ddoverv_0001010203080000 -3 Direct3D Driver Interface=ddoverv_0001010203080100 -3 Direct3D Device Interface=ddoverv_0001010203080200 -3 Direct3D Texture Interface=ddoverv_0001010203080300 -3 DirectDraw HEL and Direct3D=ddoverv_0001010203080400 -2 Mode X Display Mode=ddoverv_0001010203090000 -3 Pixel Formats -3 Pixel Formats=ddoverv_00010102030a0000 -3 Texture Map Formats=ddoverv_00010102030a0100 -3 Off-Screen Surface Formats=ddoverv_00010102030a0200 -2 DirectDraw Interface Overviews -2 DirectDraw Interface Overviews=ddoverv_0001010204000000 -3 IDirectDraw2 Interface -3 IDirectDraw2 Interface=ddoverv_0001010204010000 -3 DirectDraw Objects=ddoverv_0001010204010100 -3 What's New in IDirectDraw2?=ddoverv_0001010204010200 -3 Multiple DirectDraw Objects per Process=ddoverv_0001010204010300 -3 Support for High Resolutions and True-Color Bit Depths=ddoverv_0001010204010400 -3 Primary Surface Resource Sharing Model=ddoverv_0001010204010500 -3 Changing Modes and Exclusive Access=ddoverv_0001010204010600 -3 Creating DirectDraw Objects by Using CoCreateInstance=ddoverv_0001010204010700 -3 IDirectDrawClipper Interface -3 IDirectDrawClipper Interface=ddoverv_0001010204020000 -3 Clip Lists=ddoverv_0001010204020100 -3 Sharing DirectDrawClipper Objects=ddoverv_0001010204020200 -3 Driver-Independent DirectDrawClipper Objects=ddoverv_0001010204020300 -3 Creating DirectDrawClipper Objects with CoCreateInstance=ddoverv_0001010204020400 -3 IDirectDrawPalette Interface -3 IDirectDrawPalette Interface=ddoverv_0001010204030000 -3 DirectDrawPalette Objects=ddoverv_0001010204030100 -3 Setting Palettes on Non-Primary Surfaces=ddoverv_0001010204030200 -3 Sharing Palettes=ddoverv_0001010204030300 -3 Palette Types=ddoverv_0001010204030400 -3 Using DirectDraw Palettes in Windowed Mode=ddoverv_0001010204030500 -3 IDirectDrawSurface2 Interface -3 IDirectDrawSurface2 Interface=ddoverv_0001010204040000 -3 DirectDrawSurface Objects=ddoverv_0001010204040100 -3 What's New in IDirectDrawSurface2?=ddoverv_0001010204040200 -3 Creating Surfaces=ddoverv_0001010204040300 -3 Frame-Buffer Access=ddoverv_0001010204040400 -3 Flipping Surfaces and GDI's Frame Rate=ddoverv_0001010204040500 -3 Losing Surfaces=ddoverv_0001010204040600 -3 Color and Format Conversion=ddoverv_0001010204040700 -3 Color Keying=ddoverv_0001010204040800 -3 Overlay Z-Order=ddoverv_0001010204040900 -3 Multiple Palettes for Off-Screen Surfaces=ddoverv_0001010204040a00 -3 Blitting to and from System Memory Surfaces=ddoverv_0001010204040b00 -2 DirectDraw Tutorials -2 DirectDraw Tutorials=ddoverv_0001010205000000 -3 Tutorial 1: The Basics of DirectDraw -3 Tutorial 1: The Basics of DirectDraw=ddoverv_0001010205010000 -3 Step 1: Creating a DirectDraw Object=ddoverv_0001010205010100 -3 Step 2: Determining the Application's Behavior=ddoverv_0001010205010200 -3 Step 3: Changing the Display Mode=ddoverv_0001010205010300 -3 Step 4: Creating Flipping Surfaces=ddoverv_0001010205010400 -3 Step 5: Rendering to the Surfaces=ddoverv_0001010205010500 -3 Step 6: Writing to the Surface=ddoverv_0001010205010600 -3 Step 7: Flipping the Surfaces=ddoverv_0001010205010700 -3 Step 8: Deallocating the DirectDraw Objects=ddoverv_0001010205010800 -3 Tutorial 2: Loading Bitmaps on the Back Buffer -3 Tutorial 2: Loading Bitmaps on the Back Buffer=ddoverv_0001010205020000 -3 Step 1: Creating the Palette=ddoverv_0001010205020100 -3 Step 2: Setting the Palette=ddoverv_0001010205020200 -3 Step 3: Loading a Bitmap on the Back Buffer=ddoverv_0001010205020300 -3 Step 4: Flipping the Surfaces=ddoverv_0001010205020400 -3 Tutorial 3: Blitting from an Off-Screen Surface -3 Tutorial 3: Blitting from an Off-Screen Surface=ddoverv_0001010205030000 -3 Step 1: Creating the Off-Screen Surfaces=ddoverv_0001010205030100 -3 Step 2: Loading the Bitmaps to the Off-Screen Surfaces=ddoverv_0001010205030200 -3 Step 3: Blitting the Off-Screen Surfaces to the Back Buffer=ddoverv_0001010205030300 -3 Tutorial 4: Color Keys and Bitmap Animation -3 Tutorial 4: Color Keys and Bitmap Animation=ddoverv_0001010205040000 -3 Step 1: Setting the Color Key=ddoverv_0001010205040100 -3 Step 2: Creating a Simple Animation=ddoverv_0001010205040200 -3 Tutorial 5: Dynamically Modifying Palettes -3 Tutorial 5: Dynamically Modifying Palettes=ddoverv_0001010205050000 -3 Step 1: Loading the Palette Entries=ddoverv_0001010205050100 -3 Step 2: Rotating the Palettes=ddoverv_0001010205050200 -2 Other DirectDraw Samples=ddoverv_0001010205060000 -3 Optimizations and Customizations -3 Optimizations and Customizations=ddoverv_0001010205070000 -3 Getting the Flip and Blit Status=ddoverv_0001010205070100 -3 Blitting with Color Fill=ddoverv_0001010205070200 -3 Determining the Capabilities of the Display Hardware=ddoverv_0001010205070300 -3 Storing Bitmaps in Display Memory=ddoverv_0001010205070400 -3 Triple Buffering=ddoverv_0001010205070500 -2 DirectDraw Reference -3 Functions -3 DirectDrawCreate=ddref_0001010206010100 -3 DirectDrawCreateClipper=ddref_0001010206010200 -3 DirectDrawEnumerate=ddref_0001010206010300 -3 Callback Functions -3 Callback=ddref_0001010206020100 -3 EnumModesCallback=ddref_0001010206020200 -3 EnumSurfacesCallback=ddref_0001010206020300 -3 fnCallback=ddref_0001010206020400 -3 IDirectDraw2 -3 IDirectDraw2=ddref_0001010206030000 -3 IDirectDraw2::Compact=ddref_0001010206030100 -3 IDirectDraw2::CreateClipper=ddref_0001010206030200 -3 IDirectDraw2::CreatePalette=ddref_0001010206030300 -3 IDirectDraw2::CreateSurface=ddref_0001010206030400 -3 IDirectDraw2::DuplicateSurface=ddref_0001010206030500 -3 IDirectDraw2::EnumDisplayModes=ddref_0001010206030600 -3 IDirectDraw2::EnumSurfaces=ddref_0001010206030700 -3 IDirectDraw2::FlipToGDISurface=ddref_0001010206030800 -3 IDirectDraw2::GetAvailableVidMem=ddref_0001010206030900 -3 IDirectDraw2::GetCaps=ddref_0001010206030a00 -3 IDirectDraw2::GetDisplayMode=ddref_0001010206030b00 -3 IDirectDraw2::GetFourCCCodes=ddref_0001010206030c00 -3 IDirectDraw2::GetGDISurface=ddref_0001010206030d00 -3 IDirectDraw2::GetMonitorFrequency=ddref_0001010206030e00 -3 IDirectDraw2::GetScanLine=ddref_0001010206030f00 -3 IDirectDraw2::GetVerticalBlankStatus=ddref_0001010206031000 -3 IDirectDraw2::Initialize=ddref_0001010206031100 -3 IDirectDraw2::RestoreDisplayMode=ddref_0001010206031200 -3 IDirectDraw2::SetCooperativeLevel=ddref_0001010206031300 -3 IDirectDraw2::SetDisplayMode=ddref_0001010206031400 -3 IDirectDraw2::WaitForVerticalBlank=ddref_0001010206031500 -3 IDirectDrawClipper -3 IDirectDrawClipper=ddref_0001010206040000 -3 IDirectDrawClipper::GetClipList=ddref_0001010206040100 -3 IDirectDrawClipper::GetHWnd=ddref_0001010206040200 -3 IDirectDrawClipper::Initialize=ddref_0001010206040300 -3 IDirectDrawClipper::IsClipListChanged=ddref_0001010206040400 -3 IDirectDrawClipper::SetClipList=ddref_0001010206040500 -3 IDirectDrawClipper::SetHWnd=ddref_0001010206040600 -3 IDirectDrawPalette -3 IDirectDrawPalette=ddref_0001010206050000 -3 IDirectDrawPalette::GetCaps=ddref_0001010206050100 -3 IDirectDrawPalette::GetEntries=ddref_0001010206050200 -3 IDirectDrawPalette::Initialize=ddref_0001010206050300 -3 IDirectDrawPalette::SetEntries=ddref_0001010206050400 -3 IDirectDrawSurface2 -3 IDirectDrawSurface2=ddref_0001010206060000 -3 IDirectDrawSurface2::AddAttachedSurface=ddref_0001010206060100 -3 IDirectDrawSurface2::AddOverlayDirtyRect=ddref_0001010206060200 -3 IDirectDrawSurface2::Blt=ddref_0001010206060300 -3 IDirectDrawSurface2::BltBatch=ddref_0001010206060400 -3 IDirectDrawSurface2::BltFast=ddref_0001010206060500 -3 IDirectDrawSurface2::DeleteAttachedSurface=ddref_0001010206060600 -3 IDirectDrawSurface2::EnumAttachedSurfaces=ddref_0001010206060700 -3 IDirectDrawSurface2::EnumOverlayZOrders=ddref_0001010206060800 -3 IDirectDrawSurface2::Flip=ddref_0001010206060900 -3 IDirectDrawSurface2::GetAttachedSurface=ddref_0001010206060a00 -3 IDirectDrawSurface2::GetBltStatus=ddref_0001010206060b00 -3 IDirectDrawSurface2::GetCaps=ddref_0001010206060c00 -3 IDirectDrawSurface2::GetClipper=ddref_0001010206060d00 -3 IDirectDrawSurface2::GetColorKey=ddref_0001010206060e00 -3 IDirectDrawSurface2::GetDC=ddref_0001010206060f00 -3 IDirectDrawSurface2::GetDDInterface=ddref_0001010206061000 -3 IDirectDrawSurface2::GetFlipStatus=ddref_0001010206061100 -3 IDirectDrawSurface2::GetOverlayPosition=ddref_0001010206061200 -3 IDirectDrawSurface2::GetPalette=ddref_0001010206061300 -3 IDirectDrawSurface2::GetPixelFormat=ddref_0001010206061400 -3 IDirectDrawSurface2::GetSurfaceDesc=ddref_0001010206061500 -3 IDirectDrawSurface2::Initialize=ddref_0001010206061600 -3 IDirectDrawSurface2::IsLost=ddref_0001010206061700 -3 IDirectDrawSurface2::Lock=ddref_0001010206061800 -3 IDirectDrawSurface2::PageLock=ddref_0001010206061900 -3 IDirectDrawSurface2::PageUnlock=ddref_0001010206061a00 -3 IDirectDrawSurface2::ReleaseDC=ddref_0001010206061b00 -3 IDirectDrawSurface2::Restore=ddref_0001010206061c00 -3 IDirectDrawSurface2::SetClipper=ddref_0001010206061d00 -3 IDirectDrawSurface2::SetColorKey=ddref_0001010206061e00 -3 IDirectDrawSurface2::SetOverlayPosition=ddref_0001010206061f00 -3 IDirectDrawSurface2::SetPalette=ddref_0001010206062000 -3 IDirectDrawSurface2::Unlock=ddref_0001010206062100 -3 IDirectDrawSurface2::UpdateOverlay=ddref_0001010206062200 -3 IDirectDrawSurface2::UpdateOverlayDisplay=ddref_0001010206062300 -3 IDirectDrawSurface2::UpdateOverlayZOrder=ddref_0001010206062400 -3 Structures -3 DDBLTBATCH=ddref_0001010206070100 -3 DDBLTFX=ddref_0001010206070200 -3 DDCAPS=ddref_0001010206070300 -3 DDCOLORKEY=ddref_0001010206070400 -3 DDOVERLAYFX=ddref_0001010206070500 -3 DDPIXELFORMAT=ddref_0001010206070600 -3 DDSCAPS=ddref_0001010206070700 -3 DDSURFACEDESC=ddref_0001010206070800 -2 Return Values=ddref_0001010206080000 -1 DirectSound -1 About DirectSound=dsound_0001010301000000 -2 DirectSound Architecture -2 DirectSound Architecture=dsound_0001010302000000 -2 Architectural Overview=dsound_0001010302010000 -3 Object Types -3 Object Types=dsound_0001010302020000 -3 The DirectSound Object=dsound_0001010302020100 -3 The DirectSoundBuffer Object=dsound_0001010302020200 -2 Software Emulation=dsound_0001010302030000 -2 Device Drivers=dsound_0001010302040000 -2 Cooperative Levels=dsound_0001010302050000 -2 System Integration=dsound_0001010302060000 -2 DirectSound Overview -2 DirectSound Overview=dsound_0001010303000000 -3 DirectSound Features -3 DirectSound Features=dsound_0001010303010000 -3 Mixing=dsound_0001010303010100 -3 Hardware Acceleration=dsound_0001010303010200 -3 Write Access to the Primary Buffer=dsound_0001010303010300 -3 Three-Dimensional Sound -3 Three-Dimensional Sound=dsound_0001010303020000 -3 Perception of Sound Positions=dsound_0001010303020100 -3 Listeners=dsound_0001010303020200 -3 Sound Cones=dsound_0001010303020300 -3 Minimum and Maximum Distances=dsound_0001010303020400 -3 Position Versus Velocity=dsound_0001010303020500 -3 Integration with Direct3D=dsound_0001010303020600 -3 Units of Measure and Distance Factors=dsound_0001010303020700 -3 Mono and Stereo Sources=dsound_0001010303020800 -2 DirectSound Interface Overviews -2 DirectSound Interface Overviews=dsound_0001010304000000 -3 IDirectSound Interface -3 IDirectSound Interface=dsound_0001010304010000 -3 Device Capabilities=dsound_0001010304010100 -3 Creating Buffers=dsound_0001010304010200 -3 Speaker Configuration=dsound_0001010304010300 -3 Hardware Memory Management=dsound_0001010304010400 -3 IDirectSound3DBuffer Interface -3 IDirectSound3DBuffer Interface=dsound_0001010304020000 -3 Obtaining an IDirectSound3DBuffer Interface Pointer=dsound_0001010304020100 -3 Batch Parameter Manipulation=dsound_0001010304020200 -3 Minimum and Maximum Distance Values=dsound_0001010304020300 -3 Operation Mode=dsound_0001010304020400 -3 Position and Velocity=dsound_0001010304020500 -3 Sound Projection Cones=dsound_0001010304020600 -3 IDirectSound3DListener Interface -3 IDirectSound3DListener Interface=dsound_0001010304030000 -3 Obtaining an IDirectSound3DListener Interface Pointer=dsound_0001010304030100 -3 Batch Parameter Manipulation=dsound_0001010304030200 -3 Deferred Settings=dsound_0001010304030300 -3 Distance Factor=dsound_0001010304030400 -3 Doppler Factor=dsound_0001010304030500 -3 Listener Position and Velocity=dsound_0001010304030600 -3 Listener Orientation=dsound_0001010304030700 -3 Rolloff Factor=dsound_0001010304030800 -3 IDirectSoundBuffer Interface -3 IDirectSoundBuffer Interface=dsound_0001010304040000 -3 Play Management=dsound_0001010304040100 -3 Sound-Environment Management=dsound_0001010304040200 -3 Retrieving Information=dsound_0001010304040300 -3 Memory Management=dsound_0001010304040400 -2 DirectSound Examples -2 DirectSound Examples=dsound_0001010305000000 -2 Creating a DirectSound Object=dsound_0001010305010000 -2 Creating a DirectSound Object by Using CoCreateInstance=dsound_0001010305020000 -2 Querying the Hardware Capabilities=dsound_0001010305030000 -3 Creating Sound Buffers -3 Creating Sound Buffers=dsound_0001010305040000 -3 Creating a Basic Sound Buffer=dsound_0001010305040100 -3 Control Options=dsound_0001010305040200 -3 Static and Streaming Sound Buffers=dsound_0001010305040300 -3 Hardware and Software Sound Buffers=dsound_0001010305040400 -3 Primary and Secondary Sound Buffers=dsound_0001010305040500 -2 Writing to Sound Buffers=dsound_0001010305050000 -2 Using the DirectSound Mixer=dsound_0001010305060000 -2 Using a Custom Mixer=dsound_0001010305070000 -2 Using Compressed Wave Formats=dsound_0001010305080000 -2 DirectSound Reference -3 Functions -3 DirectSoundCreate=dsound_0001010306010100 -3 DirectSoundEnumerate=dsound_0001010306010200 -3 Callback Function -3 DSEnumCallback=dsound_0001010306020100 -3 IDirectSound -3 IDirectSound=dsound_0001010306030000 -3 IDirectSound::Compact=dsound_0001010306030100 -3 IDirectSound::CreateSoundBuffer=dsound_0001010306030200 -3 IDirectSound::DuplicateSoundBuffer=dsound_0001010306030300 -3 IDirectSound::GetCaps=dsound_0001010306030400 -3 IDirectSound::GetSpeakerConfig=dsound_0001010306030500 -3 IDirectSound::Initialize=dsound_0001010306030600 -3 IDirectSound::SetCooperativeLevel=dsound_0001010306030700 -3 IDirectSound::SetSpeakerConfig=dsound_0001010306030800 -3 IDirectSound3DBuffer -3 IDirectSound3DBuffer=dsound_0001010306040000 -3 IDirectSound3DBuffer::GetAllParameters=dsound_0001010306040100 -3 IDirectSound3DBuffer::GetConeAngles=dsound_0001010306040200 -3 IDirectSound3DBuffer::GetConeOrientation=dsound_0001010306040300 -3 IDirectSound3DBuffer::GetConeOutsideVolume=dsound_0001010306040400 -3 IDirectSound3DBuffer::GetMaxDistance=dsound_0001010306040500 -3 IDirectSound3DBuffer::GetMinDistance=dsound_0001010306040600 -3 IDirectSound3DBuffer::GetMode=dsound_0001010306040700 -3 IDirectSound3DBuffer::GetPosition=dsound_0001010306040800 -3 IDirectSound3DBuffer::GetVelocity=dsound_0001010306040900 -3 IDirectSound3DBuffer::SetAllParameters=dsound_0001010306040a00 -3 IDirectSound3DBuffer::SetConeAngles=dsound_0001010306040b00 -3 IDirectSound3DBuffer::SetConeOrientation=dsound_0001010306040c00 -3 IDirectSound3DBuffer::SetConeOutsideVolume=dsound_0001010306040d00 -3 IDirectSound3DBuffer::SetMaxDistance=dsound_0001010306040e00 -3 IDirectSound3DBuffer::SetMinDistance=dsound_0001010306040f00 -3 IDirectSound3DBuffer::SetMode=dsound_0001010306041000 -3 IDirectSound3DBuffer::SetPosition=dsound_0001010306041100 -3 IDirectSound3DBuffer::SetVelocity=dsound_0001010306041200 -3 IDirectSound3DListener -3 IDirectSound3DListener=dsound_0001010306050000 -3 IDirectSound3DListener::CommitDeferredSettings=dsound_0001010306050100 -3 IDirectSound3DListener::GetAllParameters=dsound_0001010306050200 -3 IDirectSound3DListener::GetDistanceFactor=dsound_0001010306050300 -3 IDirectSound3DListener::GetDopplerFactor=dsound_0001010306050400 -3 IDirectSound3DListener::GetOrientation=dsound_0001010306050500 -3 IDirectSound3DListener::GetPosition=dsound_0001010306050600 -3 IDirectSound3DListener::GetRolloffFactor=dsound_0001010306050700 -3 IDirectSound3DListener::GetVelocity=dsound_0001010306050800 -3 IDirectSound3DListener::SetAllParameters=dsound_0001010306050900 -3 IDirectSound3DListener::SetDistanceFactor=dsound_0001010306050a00 -3 IDirectSound3DListener::SetDopplerFactor=dsound_0001010306050b00 -3 IDirectSound3DListener::SetOrientation=dsound_0001010306050c00 -3 IDirectSound3DListener::SetPosition=dsound_0001010306050d00 -3 IDirectSound3DListener::SetRolloffFactor=dsound_0001010306050e00 -3 IDirectSound3DListener::SetVelocity=dsound_0001010306050f00 -3 IDirectSoundBuffer -3 IDirectSoundBuffer=dsound_0001010306060000 -3 IDirectSoundBuffer::GetCaps=dsound_0001010306060100 -3 IDirectSoundBuffer::GetCurrentPosition=dsound_0001010306060200 -3 IDirectSoundBuffer::GetFormat=dsound_0001010306060300 -3 IDirectSoundBuffer::GetFrequency=dsound_0001010306060400 -3 IDirectSoundBuffer::GetPan=dsound_0001010306060500 -3 IDirectSoundBuffer::GetStatus=dsound_0001010306060600 -3 IDirectSoundBuffer::GetVolume=dsound_0001010306060700 -3 IDirectSoundBuffer::Initialize=dsound_0001010306060800 -3 IDirectSoundBuffer::Lock=dsound_0001010306060900 -3 IDirectSoundBuffer::Play=dsound_0001010306060a00 -3 IDirectSoundBuffer::Restore=dsound_0001010306060b00 -3 IDirectSoundBuffer::SetCurrentPosition=dsound_0001010306060c00 -3 IDirectSoundBuffer::SetFormat=dsound_0001010306060d00 -3 IDirectSoundBuffer::SetFrequency=dsound_0001010306060e00 -3 IDirectSoundBuffer::SetPan=dsound_0001010306060f00 -3 IDirectSoundBuffer::SetVolume=dsound_0001010306061000 -3 IDirectSoundBuffer::Stop=dsound_0001010306061100 -3 IDirectSoundBuffer::Unlock=dsound_0001010306061200 -3 Structures -3 DS3DBUFFER=dsound_0001010306070100 -3 DS3DLISTENER=dsound_0001010306070200 -3 DSBCAPS=dsound_0001010306070300 -3 DSBUFFERDESC=dsound_0001010306070400 -3 DSCAPS=dsound_0001010306070500 -2 Return Values=dsound_0001010306080000 -1 DirectPlay -1 About DirectPlay=dplay_0001010401000000 -2 DirectPlay Architecture -2 DirectPlay Architecture=dplay_0001010402000000 -2 DirectPlay Component=dplay_0001010402010000 -2 DirectPlayLobby Component=dplay_0001010402020000 -2 Service Providers=dplay_0001010402030000 -2 DirectPlay Overview -2 DirectPlay Overview=dplay_0001010403000000 -2 Session Management=dplay_0001010403010000 -2 Player Management=dplay_0001010403020000 -2 Group Management=dplay_0001010403030000 -2 Message Management=dplay_0001010403040000 -2 Data Management=dplay_0001010403050000 -2 Using System Messages=dplay_0001010403060000 -2 Synchronization=dplay_0001010403070000 -2 DirectPlay Address=dplay_0001010403080000 -3 What's New in DirectPlay Version 3? -3 What's New in DirectPlay Version 3?=dplay_0001010403090000 -3 New DirectPlay 3 Methods=dplay_0001010403090100 -3 Migrating to the IDirectPlay2 Interface=dplay_0001010403090200 -2 DirectPlay Interface Overviews -2 DirectPlay Interface Overviews=dplay_0001010404000000 -2 IDirectPlay Interface=dplay_0001010404010000 -2 IDirectPlay2 Interface=dplay_0001010404020000 -3 IDirectPlayLobby Interface -3 IDirectPlayLobby Interface=dplay_0001010404030000 -3 Unicode Versus ANSI DirectPlayLobby Interfaces=dplay_0001010404030100 -3 Registering Lobby-able Applications=dplay_0001010404030200 -2 DirectPlay Tutorials -2 DirectPlay Tutorials=dplay_0001010405000000 -3 Tutorial 1: Connecting by Using the Lobby -3 Tutorial 1: Connecting by Using the Lobby=dplay_0001010405010000 -3 Step 1: Creating a DirectPlayLobby Object=dplay_0001010405010100 -3 Step 2: Retrieving the Connection Settings=dplay_0001010405010200 -3 Step 3: Configuring the Session Description=dplay_0001010405010300 -3 Step 4: Connecting to a Session=dplay_0001010405010400 -3 Step 5: Creating a Player=dplay_0001010405010500 -3 Tutorial 2: Connecting by Using a Dialog Box -3 Tutorial 2: Connecting by Using a Dialog Box=dplay_0001010405020000 -3 Step 1: Enumerating the Service Providers=dplay_0001010405020100 -3 Step 2: Creating the DirectPlay Object=dplay_0001010405020200 -3 Step 3: Joining a Session=dplay_0001010405020300 -3 Step 4: Creating a Session=dplay_0001010405020400 -3 Step 5: Creating a Player=dplay_0001010405020500 -2 DirectPlay Reference -3 Functions -3 DirectPlayCreate=dplay_0001010406010100 -3 DirectPlayEnumerate=dplay_0001010406010200 -3 DirectPlayLobbyCreate=dplay_0001010406010300 -3 Callback Functions -3 EnumAddressCallback=dplay_0001010406020100 -3 EnumAddressTypeCallback=dplay_0001010406020200 -3 EnumDPCallback=dplay_0001010406020300 -3 EnumLocalApplicationsCallback=dplay_0001010406020400 -3 EnumPlayersCallback2=dplay_0001010406020500 -3 EnumSessionsCallback2=dplay_0001010406020600 -3 IDirectPlay2 -3 IDirectPlay2=dplay_0001010406030000 -3 IDirectPlay2::AddPlayerToGroup=dplay_0001010406030100 -3 IDirectPlay2::Close=dplay_0001010406030200 -3 IDirectPlay2::CreateGroup=dplay_0001010406030300 -3 IDirectPlay2::CreatePlayer=dplay_0001010406030400 -3 IDirectPlay2::DeletePlayerFromGroup=dplay_0001010406030500 -3 IDirectPlay2::DestroyGroup=dplay_0001010406030600 -3 IDirectPlay2::DestroyPlayer=dplay_0001010406030700 -3 IDirectPlay2::EnumGroupPlayers=dplay_0001010406030800 -3 IDirectPlay2::EnumGroups=dplay_0001010406030900 -3 IDirectPlay2::EnumPlayers=dplay_0001010406030a00 -3 IDirectPlay2::EnumSessions=dplay_0001010406030b00 -3 IDirectPlay2::GetCaps=dplay_0001010406030c00 -3 IDirectPlay2::GetGroupData=dplay_0001010406030d00 -3 IDirectPlay2::GetGroupName=dplay_0001010406030e00 -3 IDirectPlay2::GetMessageCount=dplay_0001010406030f00 -3 IDirectPlay2::GetPlayerAddress=dplay_0001010406031000 -3 IDirectPlay2::GetPlayerCaps=dplay_0001010406031100 -3 IDirectPlay2::GetPlayerData=dplay_0001010406031200 -3 IDirectPlay2::GetPlayerName=dplay_0001010406031300 -3 IDirectPlay2::GetSessionDesc=dplay_0001010406031400 -3 IDirectPlay2::Initialize=dplay_0001010406031500 -3 IDirectPlay2::Open=dplay_0001010406031600 -3 IDirectPlay2::Receive=dplay_0001010406031700 -3 IDirectPlay2::Send=dplay_0001010406031800 -3 IDirectPlay2::SetGroupData=dplay_0001010406031900 -3 IDirectPlay2::SetGroupName=dplay_0001010406031a00 -3 IDirectPlay2::SetPlayerData=dplay_0001010406031b00 -3 IDirectPlay2::SetPlayerName=dplay_0001010406031c00 -3 IDirectPlay2::SetSessionDesc=dplay_0001010406031d00 -3 IDirectPlayLobby -3 IDirectPlayLobby=dplay_0001010406040000 -3 IDirectPlayLobby::Connect=dplay_0001010406040100 -3 IDirectPlayLobby::CreateAddress=dplay_0001010406040200 -3 IDirectPlayLobby::EnumAddress=dplay_0001010406040300 -3 IDirectPlayLobby::EnumAddressTypes=dplay_0001010406040400 -3 IDirectPlayLobby::EnumLocalApplications=dplay_0001010406040500 -3 IDirectPlayLobby::GetConnectionSettings=dplay_0001010406040600 -3 IDirectPlayLobby::ReceiveLobbyMessage=dplay_0001010406040700 -3 IDirectPlayLobby::RunApplication=dplay_0001010406040800 -3 IDirectPlayLobby::SendLobbyMessage=dplay_0001010406040900 -3 IDirectPlayLobby::SetConnectionSettings=dplay_0001010406040a00 -3 IDirectPlayLobby::SetLobbyMessageEvent=dplay_0001010406040b00 -3 Structures -3 DPCAPS=dplay_0001010406050100 -3 DPCOMPORTADDRESS=dplay_0001010406050200 -3 DPLAPPINFO=dplay_0001010406050300 -3 DPLCONNECTION=dplay_0001010406050400 -3 DPNAME=dplay_0001010406050500 -3 DPSESSIONDESC2=dplay_0001010406050600 -3 System Messages -3 DPLMSG_GENERIC=dplay_0001010406060100 -3 DPMSG_ADDPLAYERTOGROUP=dplay_0001010406060200 -3 DPMSG_CREATEPLAYERORGROUP=dplay_0001010406060300 -3 DPMSG_DELETEPLAYERFROMGROUP=dplay_0001010406060400 -3 DPMSG_DESTROYPLAYERORGROUP=dplay_0001010406060500 -3 DPMSG_GENERIC=dplay_0001010406060600 -3 DPMSG_HOST=dplay_0001010406060700 -3 DPMSG_SESSIONLOST=dplay_0001010406060800 -3 DPMSG_SETPLAYERORGROUPDATA=dplay_0001010406060900 -3 DPMSG_SETPLAYERORGROUPNAME=dplay_0001010406060a00 -2 Return Values=dplay_0001010406070000 -1 Direct3D -2 Direct3D Overview -3 About Direct3D -3 About Direct3D=3dchoice_0001020101000000 -4 Direct3D -4 Direct3D=3dchoice_0001020101010000 -4 Retained Mode=3dchoice_0001020101010100 -4 Immediate Mode=3dchoice_0001020101010200 -4 Hardware Abstraction and Emulation=3dchoice_0001020101010300 -3 DirectDraw=3dchoice_0001020101020000 -3 OpenGL=3dchoice_0001020101030000 -3 Direct3D Architecture -3 Direct3D Architecture=d3dintro_0001020102000000 -3 The Direct3D Vision=d3dintro_0001020102010000 -3 Rendering Engine=d3dintro_0001020102020000 -3 Execute Buffers=d3dintro_0001020102030000 -3 Transformation Module=d3dintro_0001020102040000 -3 Lighting Module=d3dintro_0001020102050000 -3 Rasterization Module=d3dintro_0001020102060000 -4 Colors and Fog -4 Colors and Fog=d3dintro_0001020102070000 -4 Palette Entries=d3dintro_0001020102070100 -4 Fog=d3dintro_0001020102070200 -3 States and State Overrides=d3dintro_0001020102080000 -3 Direct3D File Format=d3dintro_0001020102090000 -3 A Technical Foundation for 3D Programming -3 A Technical Foundation for 3D Programming=rmmath_0001020103000000 -4 3D Coordinate Systems -4 3D Coordinate Systems=rmmath_0001020103010000 -4 Direct3D's Coordinate System=rmmath_0001020103010100 -4 U- and V-Coordinates=rmmath_0001020103010200 -4 3D Transformations -4 3D Transformations=rmmath_0001020103020000 -4 Translation=rmmath_0001020103020100 -4 Rotation=rmmath_0001020103020200 -4 Scaling=rmmath_0001020103020300 -4 Polygons -4 Polygons=rmmath_0001020103030000 -4 Geometry Requirements=rmmath_0001020103030100 -4 Face and Vertex Normals=rmmath_0001020103030200 -4 Shade Modes=rmmath_0001020103030300 -4 Triangle Interpolants=rmmath_0001020103030400 -3 Triangle Strips and Fans=rmmath_0001020103040000 -3 Vectors, Vertices, and Quaternions=rmmath_0001020103050000 -3 Floating-point Precision=rmmath_0001020103060000 -3 Performance Optimization -3 Performance Optimization=perfopt_0001020104000000 -3 Clip Tests on Execution=perfopt_0001020104010000 -3 Batching Primitives=perfopt_0001020104020000 -3 Texture Size=perfopt_0001020104030000 -3 Triangle Flags=perfopt_0001020104040000 -3 Ramp Performance Tips=perfopt_0001020104050000 -3 Ramp Textures=perfopt_0001020104060000 -3 Z-Buffers=perfopt_0001020104070000 -3 Copy Mode=perfopt_0001020104080000 -2 Retained-Mode Overview -2 About Retained Mode=rmabout_0001020201000000 -3 Introduction to Direct3D Retained-Mode Objects -3 Introduction to Direct3D Retained-Mode Objects=rmobject_0001020202000000 -3 Objects and Interfaces=rmobject_0001020202010000 -3 Objects and Reference Counting=rmobject_0001020202020000 -3 IDirect3DRM Interface=rmobject_0001020202030000 -3 IDirect3DRMAnimation and IDirect3DRMAnimationSet Interfaces=rmobject_0001020202040000 -4 IDirect3DRMDevice and IDirect3DRMDeviceArray Interfaces -4 IDirect3DRMDevice and IDirect3DRMDeviceArray Interfaces=rmobject_0001020202050000 -4 Quality=rmobject_0001020202050100 -4 Color Models=rmobject_0001020202050200 -4 Window Management=rmobject_0001020202050300 -3 IDirect3DRMFace and IDirect3DRMFaceArray Interfaces=rmobject_0001020202060000 -4 IDirect3DRMFrame and IDirect3DRMFrameArray Interfaces -4 IDirect3DRMFrame and IDirect3DRMFrameArray Interfaces=rmobject_0001020202070000 -4 Hierarchies=rmobject_0001020202070100 -4 Transformations=rmobject_0001020202070200 -4 Motion=rmobject_0001020202070300 -4 Callback Functions=rmobject_0001020202070400 -4 IDirect3DRMLight and IDirect3DRMLightArray Interfaces -4 IDirect3DRMLight and IDirect3DRMLightArray Interfaces=rmobject_0001020202080000 -4 Ambient=rmobject_0001020202080100 -4 Directional=rmobject_0001020202080200 -4 Parallel Point=rmobject_0001020202080300 -4 Point=rmobject_0001020202080400 -4 Spotlight=rmobject_0001020202080500 -3 IDirect3DRMMaterial Interface=rmobject_0001020202090000 -3 IDirect3DRMMesh and IDirect3DRMMeshBuilder Interfaces=rmobject_00010202020a0000 -3 Direct3DRMObject=rmobject_00010202020b0000 -3 IDirect3DRMPickedArray Interface=rmobject_00010202020c0000 -3 IDirect3DRMShadow Interface=rmobject_00010202020d0000 -4 IDirect3DRMTexture Interface -4 IDirect3DRMTexture Interface=rmobject_00010202020e0000 -4 Decals=rmobject_00010202020e0100 -4 Texture Colors=rmobject_00010202020e0200 -4 Mipmaps=rmobject_00010202020e0300 -4 Texture Filtering=rmobject_00010202020e0400 -4 Texture Transparency=rmobject_00010202020e0500 -3 IDirect3DRMUserVisual Interface=rmobject_00010202020f0000 -4 IDirect3DRMViewport and IDirect3DRMViewportArray Interface -4 IDirect3DRMViewport and IDirect3DRMViewportArray Interface=rmobject_0001020202100000 -4 Camera=rmobject_0001020202100100 -4 Viewing Frustum=rmobject_0001020202100200 -4 Transformations=rmobject_0001020202100300 -4 Picking=rmobject_0001020202100400 -3 IDirect3DRMVisual and IDirect3DRMVisualArray Interfaces=rmobject_0001020202110000 -4 IDirect3DRMWrap Interface -4 IDirect3DRMWrap Interface=rmobject_0001020202120000 -4 Wrapping Flags=rmobject_0001020202120100 -4 Flat=rmobject_0001020202120200 -4 Cylindrical=rmobject_0001020202120300 -4 Spherical=rmobject_0001020202120400 -4 Chrome=rmobject_0001020202120500 -3 Direct3D Retained-Mode Tutorial -3 Direct3D Retained-Mode Tutorial=rmtutor_0001020203000000 -4 About Helworld.c -4 About Helworld.c=rmtutor_0001020203010000 -4 Limitations of the Sample=rmtutor_0001020203010100 -4 Static Libraries=rmtutor_0001020203010200 -4 DirectDraw's Windowed Mode=rmtutor_0001020203010300 -3 Definitions and Global Variables=rmtutor_0001020203020000 -4 Windows Setup and Initialization -4 Windows Setup and Initialization=rmtutor_0001020203030000 -4 The WinMain Function=rmtutor_0001020203030100 -4 The InitApp Function=rmtutor_0001020203030200 -4 The Main Window Procedure=rmtutor_0001020203030300 -4 Enumerating Device Drivers -4 Enumerating Device Drivers=rmtutor_0001020203040000 -4 The EnumDrivers Function=rmtutor_0001020203040100 -4 The enumDeviceFunc Callback Function=rmtutor_0001020203040200 -4 The BPPToDDBD Helper Function=rmtutor_0001020203040300 -4 Setting up the 3D Environment -4 Setting up the 3D Environment=rmtutor_0001020203050000 -4 Creating the Device and Viewport=rmtutor_0001020203050100 -4 Setting the Render State=rmtutor_0001020203050200 -3 The Rendering Loop=rmtutor_0001020203060000 -4 Creating the Scene -4 Creating the Scene=rmtutor_0001020203070000 -4 The MyScene Function=rmtutor_0001020203070100 -4 The MakeMyFrames Function=rmtutor_0001020203070200 -4 The MakeMyLights Function=rmtutor_0001020203070300 -4 The SetMyPositions Function=rmtutor_0001020203070400 -4 The MakeMyMesh Function=rmtutor_0001020203070500 -4 The MakeMyWrap Function=rmtutor_0001020203070600 -4 The AddMyTexture Function=rmtutor_0001020203070700 -3 Cleaning Up=rmtutor_0001020203080000 -2 Immediate-Mode Overview -2 About Immediate Mode=imabout_0001020301000000 -3 Introduction to Direct3D Immediate-Mode Objects -3 Introduction to Direct3D Immediate-Mode Objects=imobject_0001020302000000 -3 Direct3D Object Types=imobject_0001020302010000 -3 IDirect3D Interface=imobject_0001020302020000 -3 IDirect3DDevice Interface=imobject_0001020302030000 -4 IDirect3DTexture Interface -4 IDirect3DTexture Interface=imobject_0001020302040000 -4 Texture Wrapping=imobject_0001020302040100 -4 Texture Filtering and Blending=imobject_0001020302040200 -4 Mipmaps=imobject_0001020302040300 -4 Transparency and Translucency=imobject_0001020302040400 -3 IDirect3DMaterial Interface=imobject_0001020302050000 -3 IDirect3DLight Interface=imobject_0001020302060000 -3 IDirect3DViewport Interface=imobject_0001020302070000 -3 IDirect3DExecuteBuffer Interface=imobject_0001020302080000 -3 Object Connectivity=imobject_0001020302090000 -4 Scene Management -4 Scene Management=imobject_00010203020a0000 -4 Hidden Surface Removal=imobject_00010203020a0100 -4 2D and 3D Interaction=imobject_00010203020a0200 -4 Scene-Management Procedure=imobject_00010203020a0300 -3 Direct3D Immediate-Mode Tutorial -3 Direct3D Immediate-Mode Tutorial=d3dtutor_0001020303000000 -3 Step 1: Beginning Initialization=d3dtutor_0001020303010000 -3 Step 2: Creating DirectDraw and Direct3D Objects=d3dtutor_0001020303020000 -3 Step 3: Setting Up the Device-Creation Callback Function=d3dtutor_0001020303030000 -3 Step 4: Initializing the Viewport=d3dtutor_0001020303040000 -3 Step 5: Setting the Immediate-Mode Render State=d3dtutor_0001020303050000 -3 Step 6: Completing Initialization=d3dtutor_0001020303060000 -3 Step 7: Running the Rendering Loop=d3dtutor_0001020303070000 -3 Step 8: Cleaning Up=d3dtutor_0001020303080000 -2 Retained-Mode Reference -3 Functions -3 Direct3DRMCreate=rmfuncs_0001020401000100 -3 D3DRMColorGetAlpha=rmfuncs_0001020401000200 -3 D3DRMColorGetBlue=rmfuncs_0001020401000300 -3 D3DRMColorGetGreen=rmfuncs_0001020401000400 -3 D3DRMColorGetRed=rmfuncs_0001020401000500 -3 D3DRMCreateColorRGB=rmfuncs_0001020401000600 -3 D3DRMCreateColorRGBA=rmfuncs_0001020401000700 -3 D3DRMFREEFUNCTION=rmfuncs_0001020401000800 -3 D3DRMMALLOCFUNCTION=rmfuncs_0001020401000900 -3 D3DRMMatrixFromQuaternion=rmfuncs_0001020401000a00 -3 D3DRMQuaternionFromRotation=rmfuncs_0001020401000b00 -3 D3DRMQuaternionMultiply=rmfuncs_0001020401000c00 -3 D3DRMQuaternionSlerp=rmfuncs_0001020401000d00 -3 D3DRMREALLOCFUNCTION=rmfuncs_0001020401000e00 -3 D3DRMVectorAdd=rmfuncs_0001020401000f00 -3 D3DRMVectorCrossProduct=rmfuncs_0001020401001000 -3 D3DRMVectorDotProduct=rmfuncs_0001020401001100 -3 D3DRMVectorModulus=rmfuncs_0001020401001200 -3 D3DRMVectorNormalize=rmfuncs_0001020401001300 -3 D3DRMVectorRandom=rmfuncs_0001020401001400 -3 D3DRMVectorReflect=rmfuncs_0001020401001500 -3 D3DRMVectorRotate=rmfuncs_0001020401001600 -3 D3DRMVectorScale=rmfuncs_0001020401001700 -3 D3DRMVectorSubtract=rmfuncs_0001020401001800 -3 Callback Functions -3 D3DRMDEVICEPALETTECALLBACK=rmfuncs_0001020402000100 -3 D3DRMFRAMEMOVECALLBACK=rmfuncs_0001020402000200 -3 D3DRMLOADCALLBACK=rmfuncs_0001020402000300 -3 D3DRMLOADTEXTURECALLBACK=rmfuncs_0001020402000400 -3 D3DRMOBJECTCALLBACK=rmfuncs_0001020402000500 -3 D3DRMUPDATECALLBACK=rmfuncs_0001020402000600 -3 D3DRMUSERVISUALCALLBACK=rmfuncs_0001020402000700 -3 D3DRMWRAPCALLBACK=rmfuncs_0001020402000800 -3 IDirect3DRM Array Interfaces -3 IDirect3DRM Array Interfaces=rmarray_0001020403000000 -3 IDirect3DRMArray=rmarray_0001020403010000 -4 IDirect3DRMArray::GetSize=rmarray_0001020403010100 -3 IDirect3DRMDeviceArray=rmarray_0001020403020000 -4 IDirect3DRMDeviceArray::GetElement=rmarray_0001020403020100 -4 IDirect3DRMDeviceArray::GetSize=rmarray_0001020403020200 -3 IDirect3DRMFaceArray=rmarray_0001020403030000 -4 IDirect3DRMFaceArray::GetElement=rmarray_0001020403030100 -4 IDirect3DRMFaceArray::GetSize=rmarray_0001020403030200 -3 IDirect3DRMFrameArray=rmarray_0001020403040000 -4 IDirect3DRMFrameArray::GetElement=rmarray_0001020403040100 -4 IDirect3DRMFrameArray::GetSize=rmarray_0001020403040200 -3 IDirect3DRMLightArray=rmarray_0001020403050000 -4 IDirect3DRMLightArray::GetElement=rmarray_0001020403050100 -4 IDirect3DRMLightArray::GetSize=rmarray_0001020403050200 -3 IDirect3DRMPickedArray=rmarray_0001020403060000 -4 IDirect3DRMPickedArray::GetPick=rmarray_0001020403060100 -4 IDirect3DRMPickedArray::GetSize=rmarray_0001020403060200 -3 IDirect3DRMViewportArray=rmarray_0001020403070000 -4 IDirect3DRMViewportArray::GetElement=rmarray_0001020403070100 -4 IDirect3DRMViewportArray::GetSize=rmarray_0001020403070200 -3 IDirect3DRMVisualArray=rmarray_0001020403080000 -4 IDirect3DRMVisualArray::GetElement=rmarray_0001020403080100 -4 IDirect3DRMVisualArray::GetSize=rmarray_0001020403080200 -3 IDirect3DRM -3 IDirect3DRM=rmid3drm_0001020404000000 -3 IDirect3DRM::AddSearchPath=rmid3drm_0001020404000100 -3 IDirect3DRM::CreateAnimation=rmid3drm_0001020404000200 -3 IDirect3DRM::CreateAnimationSet=rmid3drm_0001020404000300 -3 IDirect3DRM::CreateDevice=rmid3drm_0001020404000400 -3 IDirect3DRM::CreateDeviceFromClipper=rmid3drm_0001020404000500 -3 IDirect3DRM::CreateDeviceFromD3D=rmid3drm_0001020404000600 -3 IDirect3DRM::CreateDeviceFromSurface=rmid3drm_0001020404000700 -3 IDirect3DRM::CreateFace=rmid3drm_0001020404000800 -3 IDirect3DRM::CreateFrame=rmid3drm_0001020404000900 -3 IDirect3DRM::CreateLight=rmid3drm_0001020404000a00 -3 IDirect3DRM::CreateLightRGB=rmid3drm_0001020404000b00 -3 IDirect3DRM::CreateMaterial=rmid3drm_0001020404000c00 -3 IDirect3DRM::CreateMesh=rmid3drm_0001020404000d00 -3 IDirect3DRM::CreateMeshBuilder=rmid3drm_0001020404000e00 -3 IDirect3DRM::CreateObject=rmid3drm_0001020404000f00 -3 IDirect3DRM::CreateShadow=rmid3drm_0001020404001000 -3 IDirect3DRM::CreateTexture=rmid3drm_0001020404001100 -3 IDirect3DRM::CreateTextureFromSurface=rmid3drm_0001020404001200 -3 IDirect3DRM::CreateUserVisual=rmid3drm_0001020404001300 -3 IDirect3DRM::CreateViewport=rmid3drm_0001020404001400 -3 IDirect3DRM::CreateWrap=rmid3drm_0001020404001500 -3 IDirect3DRM::EnumerateObjects=rmid3drm_0001020404001600 -3 IDirect3DRM::GetDevices=rmid3drm_0001020404001700 -3 IDirect3DRM::GetNamedObject=rmid3drm_0001020404001800 -3 IDirect3DRM::GetSearchPath=rmid3drm_0001020404001900 -3 IDirect3DRM::Load=rmid3drm_0001020404001a00 -3 IDirect3DRM::LoadTexture=rmid3drm_0001020404001b00 -3 IDirect3DRM::LoadTextureFromResource=rmid3drm_0001020404001c00 -3 IDirect3DRM::SetDefaultTextureColors=rmid3drm_0001020404001d00 -3 IDirect3DRM::SetDefaultTextureShades=rmid3drm_0001020404001e00 -3 IDirect3DRM::SetSearchPath=rmid3drm_0001020404001f00 -3 IDirect3DRM::Tick=rmid3drm_0001020404002000 -3 IDirect3DRMAnimation -3 IDirect3DRMAnimation=rmanim_0001020405000000 -3 IDirect3DRMAnimation::AddPositionKey=rmanim_0001020405000100 -3 IDirect3DRMAnimation::AddRotateKey=rmanim_0001020405000200 -3 IDirect3DRMAnimation::AddScaleKey=rmanim_0001020405000300 -3 IDirect3DRMAnimation::DeleteKey=rmanim_0001020405000400 -3 IDirect3DRMAnimation::GetOptions=rmanim_0001020405000500 -3 IDirect3DRMAnimation::SetFrame=rmanim_0001020405000600 -3 IDirect3DRMAnimation::SetOptions=rmanim_0001020405000700 -3 IDirect3DRMAnimation::SetTime=rmanim_0001020405000800 -3 IDirect3DRMAnimationSet -3 IDirect3DRMAnimationSet=rmanimst_0001020406000000 -3 IDirect3DRMAnimationSet::AddAnimation=rmanimst_0001020406000100 -3 IDirect3DRMAnimationSet::DeleteAnimation=rmanimst_0001020406000200 -3 IDirect3DRMAnimationSet::Load=rmanimst_0001020406000300 -3 IDirect3DRMAnimationSet::SetTime=rmanimst_0001020406000400 -3 IDirect3DRMDevice -3 IDirect3DRMDevice=rmdevice_0001020407000000 -3 IDirect3DRMDevice::AddUpdateCallback=rmdevice_0001020407000100 -3 IDirect3DRMDevice::DeleteUpdateCallback=rmdevice_0001020407000200 -3 IDirect3DRMDevice::GetBufferCount=rmdevice_0001020407000300 -3 IDirect3DRMDevice::GetColorModel=rmdevice_0001020407000400 -3 IDirect3DRMDevice::GetDirect3DDevice=rmdevice_0001020407000500 -3 IDirect3DRMDevice::GetDither=rmdevice_0001020407000600 -3 IDirect3DRMDevice::GetHeight=rmdevice_0001020407000700 -3 IDirect3DRMDevice::GetTrianglesDrawn=rmdevice_0001020407000800 -3 IDirect3DRMDevice::GetQuality=rmdevice_0001020407000900 -3 IDirect3DRMDevice::GetShades=rmdevice_0001020407000a00 -3 IDirect3DRMDevice::GetTextureQuality=rmdevice_0001020407000b00 -3 IDirect3DRMDevice::GetViewports=rmdevice_0001020407000c00 -3 IDirect3DRMDevice::GetWidth=rmdevice_0001020407000d00 -3 IDirect3DRMDevice::GetWireframeOptions=rmdevice_0001020407000e00 -3 IDirect3DRMDevice::Init=rmdevice_0001020407000f00 -3 IDirect3DRMDevice::InitFromClipper=rmdevice_0001020407001000 -3 IDirect3DRMDevice::InitFromD3D=rmdevice_0001020407001100 -3 IDirect3DRMDevice::SetBufferCount=rmdevice_0001020407001200 -3 IDirect3DRMDevice::SetDither=rmdevice_0001020407001300 -3 IDirect3DRMDevice::SetQuality=rmdevice_0001020407001400 -3 IDirect3DRMDevice::SetShades=rmdevice_0001020407001500 -3 IDirect3DRMDevice::SetTextureQuality=rmdevice_0001020407001600 -3 IDirect3DRMDevice::Update=rmdevice_0001020407001700 -3 IDirect3DRMFace -3 IDirect3DRMFace=rmface_0001020408000000 -3 IDirect3DRMFace::AddVertex=rmface_0001020408000100 -3 IDirect3DRMFace::AddVertexAndNormalIndexed=rmface_0001020408000200 -3 IDirect3DRMFace::GetColor=rmface_0001020408000300 -3 IDirect3DRMFace::GetMaterial=rmface_0001020408000400 -3 IDirect3DRMFace::GetNormal=rmface_0001020408000500 -3 IDirect3DRMFace::GetTexture=rmface_0001020408000600 -3 IDirect3DRMFace::GetTextureCoordinateIndex=rmface_0001020408000700 -3 IDirect3DRMFace::GetTextureCoordinates=rmface_0001020408000800 -3 IDirect3DRMFace::GetTextureTopology=rmface_0001020408000900 -3 IDirect3DRMFace::GetVertex=rmface_0001020408000a00 -3 IDirect3DRMFace::GetVertexCount=rmface_0001020408000b00 -3 IDirect3DRMFace::GetVertexIndex=rmface_0001020408000c00 -3 IDirect3DRMFace::GetVertices=rmface_0001020408000d00 -3 IDirect3DRMFace::SetColor=rmface_0001020408000e00 -3 IDirect3DRMFace::SetColorRGB=rmface_0001020408000f00 -3 IDirect3DRMFace::SetMaterial=rmface_0001020408001000 -3 IDirect3DRMFace::SetTexture=rmface_0001020408001100 -3 IDirect3DRMFace::SetTextureCoordinates=rmface_0001020408001200 -3 IDirect3DRMFace::SetTextureTopology=rmface_0001020408001300 -3 IDirect3DRMFrame -3 IDirect3DRMFrame=rmframe_0001020409000000 -3 IDirect3DRMFrame::AddChild=rmframe_0001020409000100 -3 IDirect3DRMFrame::AddLight=rmframe_0001020409000200 -3 IDirect3DRMFrame::AddMoveCallback=rmframe_0001020409000300 -3 IDirect3DRMFrame::AddRotation=rmframe_0001020409000400 -3 IDirect3DRMFrame::AddScale=rmframe_0001020409000500 -3 IDirect3DRMFrame::AddTransform=rmframe_0001020409000600 -3 IDirect3DRMFrame::AddTranslation=rmframe_0001020409000700 -3 IDirect3DRMFrame::AddVisual=rmframe_0001020409000800 -3 IDirect3DRMFrame::DeleteChild=rmframe_0001020409000900 -3 IDirect3DRMFrame::DeleteLight=rmframe_0001020409000a00 -3 IDirect3DRMFrame::DeleteMoveCallback=rmframe_0001020409000b00 -3 IDirect3DRMFrame::DeleteVisual=rmframe_0001020409000c00 -3 IDirect3DRMFrame::GetChildren=rmframe_0001020409000d00 -3 IDirect3DRMFrame::GetColor=rmframe_0001020409000e00 -3 IDirect3DRMFrame::GetLights=rmframe_0001020409000f00 -3 IDirect3DRMFrame::GetMaterialMode=rmframe_0001020409001000 -3 IDirect3DRMFrame::GetOrientation=rmframe_0001020409001100 -3 IDirect3DRMFrame::GetParent=rmframe_0001020409001200 -3 IDirect3DRMFrame::GetPosition=rmframe_0001020409001300 -3 IDirect3DRMFrame::GetRotation=rmframe_0001020409001400 -3 IDirect3DRMFrame::GetScene=rmframe_0001020409001500 -3 IDirect3DRMFrame::GetSceneBackground=rmframe_0001020409001600 -3 IDirect3DRMFrame::GetSceneBackgroundDepth=rmframe_0001020409001700 -3 IDirect3DRMFrame::GetSceneFogColor=rmframe_0001020409001800 -3 IDirect3DRMFrame::GetSceneFogEnable=rmframe_0001020409001900 -3 IDirect3DRMFrame::GetSceneFogMode=rmframe_0001020409001a00 -3 IDirect3DRMFrame::GetSceneFogParams=rmframe_0001020409001b00 -3 IDirect3DRMFrame::GetSortMode=rmframe_0001020409001c00 -3 IDirect3DRMFrame::GetTexture=rmframe_0001020409001d00 -3 IDirect3DRMFrame::GetTextureTopology=rmframe_0001020409001e00 -3 IDirect3DRMFrame::GetTransform=rmframe_0001020409001f00 -3 IDirect3DRMFrame::GetVelocity=rmframe_0001020409002000 -3 IDirect3DRMFrame::GetVisuals=rmframe_0001020409002100 -3 IDirect3DRMFrame::GetZbufferMode=rmframe_0001020409002200 -3 IDirect3DRMFrame::InverseTransform=rmframe_0001020409002300 -3 IDirect3DRMFrame::Load=rmframe_0001020409002400 -3 IDirect3DRMFrame::LookAt=rmframe_0001020409002500 -3 IDirect3DRMFrame::Move=rmframe_0001020409002600 -3 IDirect3DRMFrame::SetColor=rmframe_0001020409002700 -3 IDirect3DRMFrame::SetColorRGB=rmframe_0001020409002800 -3 IDirect3DRMFrame::SetMaterialMode=rmframe_0001020409002900 -3 IDirect3DRMFrame::SetOrientation=rmframe_0001020409002a00 -3 IDirect3DRMFrame::SetPosition=rmframe_0001020409002b00 -3 IDirect3DRMFrame::SetRotation=rmframe_0001020409002c00 -3 IDirect3DRMFrame::SetSceneBackground=rmframe_0001020409002d00 -3 IDirect3DRMFrame::SetSceneBackgroundDepth=rmframe_0001020409002e00 -3 IDirect3DRMFrame::SetSceneBackgroundImage=rmframe_0001020409002f00 -3 IDirect3DRMFrame::SetSceneBackgroundRGB=rmframe_0001020409003000 -3 IDirect3DRMFrame::SetSceneFogColor=rmframe_0001020409003100 -3 IDirect3DRMFrame::SetSceneFogEnable=rmframe_0001020409003200 -3 IDirect3DRMFrame::SetSceneFogMode=rmframe_0001020409003300 -3 IDirect3DRMFrame::SetSceneFogParams=rmframe_0001020409003400 -3 IDirect3DRMFrame::SetSortMode=rmframe_0001020409003500 -3 IDirect3DRMFrame::SetTexture=rmframe_0001020409003600 -3 IDirect3DRMFrame::SetTextureTopology=rmframe_0001020409003700 -3 IDirect3DRMFrame::SetVelocity=rmframe_0001020409003800 -3 IDirect3DRMFrame::SetZbufferMode=rmframe_0001020409003900 -3 IDirect3DRMFrame::Transform=rmframe_0001020409003a00 -3 IDirect3DRMLight -3 IDirect3DRMLight=rmlight_000102040a000000 -3 IDirect3DRMLight::GetColor=rmlight_000102040a000100 -3 IDirect3DRMLight::GetConstantAttenuation=rmlight_000102040a000200 -3 IDirect3DRMLight::GetEnableFrame=rmlight_000102040a000300 -3 IDirect3DRMLight::GetLinearAttenuation=rmlight_000102040a000400 -3 IDirect3DRMLight::GetPenumbra=rmlight_000102040a000500 -3 IDirect3DRMLight::GetQuadraticAttenuation=rmlight_000102040a000600 -3 IDirect3DRMLight::GetRange=rmlight_000102040a000700 -3 IDirect3DRMLight::GetType=rmlight_000102040a000800 -3 IDirect3DRMLight::GetUmbra=rmlight_000102040a000900 -3 IDirect3DRMLight::SetColor=rmlight_000102040a000a00 -3 IDirect3DRMLight::SetColorRGB=rmlight_000102040a000b00 -3 IDirect3DRMLight::SetConstantAttenuation=rmlight_000102040a000c00 -3 IDirect3DRMLight::SetEnableFrame=rmlight_000102040a000d00 -3 IDirect3DRMLight::SetLinearAttenuation=rmlight_000102040a000e00 -3 IDirect3DRMLight::SetPenumbra=rmlight_000102040a000f00 -3 IDirect3DRMLight::SetQuadraticAttenuation=rmlight_000102040a001000 -3 IDirect3DRMLight::SetRange=rmlight_000102040a001100 -3 IDirect3DRMLight::SetType=rmlight_000102040a001200 -3 IDirect3DRMLight::SetUmbra=rmlight_000102040a001300 -3 IDirect3DRMMaterial -3 IDirect3DRMMaterial=rmmatrl_000102040b000000 -3 IDirect3DRMMaterial::GetEmissive=rmmatrl_000102040b000100 -3 IDirect3DRMMaterial::GetPower=rmmatrl_000102040b000200 -3 IDirect3DRMMaterial::GetSpecular=rmmatrl_000102040b000300 -3 IDirect3DRMMaterial::SetEmissive=rmmatrl_000102040b000400 -3 IDirect3DRMMaterial::SetPower=rmmatrl_000102040b000500 -3 IDirect3DRMMaterial::SetSpecular=rmmatrl_000102040b000600 -3 IDirect3DRMMesh -3 IDirect3DRMMesh=rmmesh_000102040c000000 -3 IDirect3DRMMesh::AddGroup=rmmesh_000102040c000100 -3 IDirect3DRMMesh::GetBox=rmmesh_000102040c000200 -3 IDirect3DRMMesh::GetGroup=rmmesh_000102040c000300 -3 IDirect3DRMMesh::GetGroupColor=rmmesh_000102040c000400 -3 IDirect3DRMMesh::GetGroupCount=rmmesh_000102040c000500 -3 IDirect3DRMMesh::GetGroupMapping=rmmesh_000102040c000600 -3 IDirect3DRMMesh::GetGroupMaterial=rmmesh_000102040c000700 -3 IDirect3DRMMesh::GetGroupQuality=rmmesh_000102040c000800 -3 IDirect3DRMMesh::GetGroupTexture=rmmesh_000102040c000900 -3 IDirect3DRMMesh::GetVertices=rmmesh_000102040c000a00 -3 IDirect3DRMMesh::Scale=rmmesh_000102040c000b00 -3 IDirect3DRMMesh::SetGroupColor=rmmesh_000102040c000c00 -3 IDirect3DRMMesh::SetGroupColorRGB=rmmesh_000102040c000d00 -3 IDirect3DRMMesh::SetGroupMapping=rmmesh_000102040c000e00 -3 IDirect3DRMMesh::SetGroupMaterial=rmmesh_000102040c000f00 -3 IDirect3DRMMesh::SetGroupQuality=rmmesh_000102040c001000 -3 IDirect3DRMMesh::SetGroupTexture=rmmesh_000102040c001100 -3 IDirect3DRMMesh::SetVertices=rmmesh_000102040c001200 -3 IDirect3DRMMesh::Translate=rmmesh_000102040c001300 -3 IDirect3DRMMeshBuilder -3 IDirect3DRMMeshBuilder=rmmshbld_000102040d000000 -3 IDirect3DRMMeshBuilder::AddFace=rmmshbld_000102040d000100 -3 IDirect3DRMMeshBuilder::AddFaces=rmmshbld_000102040d000200 -3 IDirect3DRMMeshBuilder::AddFrame=rmmshbld_000102040d000300 -3 IDirect3DRMMeshBuilder::AddMesh=rmmshbld_000102040d000400 -3 IDirect3DRMMeshBuilder::AddMeshBuilder=rmmshbld_000102040d000500 -3 IDirect3DRMMeshBuilder::AddNormal=rmmshbld_000102040d000600 -3 IDirect3DRMMeshBuilder::AddVertex=rmmshbld_000102040d000700 -3 IDirect3DRMMeshBuilder::CreateFace=rmmshbld_000102040d000800 -3 IDirect3DRMMeshBuilder::CreateMesh=rmmshbld_000102040d000900 -3 IDirect3DRMMeshBuilder::GenerateNormals=rmmshbld_000102040d000a00 -3 IDirect3DRMMeshBuilder::GetBox=rmmshbld_000102040d000b00 -3 IDirect3DRMMeshBuilder::GetColorSource=rmmshbld_000102040d000c00 -3 IDirect3DRMMeshBuilder::GetFaceCount=rmmshbld_000102040d000d00 -3 IDirect3DRMMeshBuilder::GetFaces=rmmshbld_000102040d000e00 -3 IDirect3DRMMeshBuilder::GetPerspective=rmmshbld_000102040d000f00 -3 IDirect3DRMMeshBuilder::GetQuality=rmmshbld_000102040d001000 -3 IDirect3DRMMeshBuilder::GetTextureCoordinates=rmmshbld_000102040d001100 -3 IDirect3DRMMeshBuilder::GetVertexColor=rmmshbld_000102040d001200 -3 IDirect3DRMMeshBuilder::GetVertexCount=rmmshbld_000102040d001300 -3 IDirect3DRMMeshBuilder::GetVertices=rmmshbld_000102040d001400 -3 IDirect3DRMMeshBuilder::Load=rmmshbld_000102040d001500 -3 IDirect3DRMMeshBuilder::ReserveSpace=rmmshbld_000102040d001600 -3 IDirect3DRMMeshBuilder::Save=rmmshbld_000102040d001700 -3 IDirect3DRMMeshBuilder::Scale=rmmshbld_000102040d001800 -3 IDirect3DRMMeshBuilder::SetColor=rmmshbld_000102040d001900 -3 IDirect3DRMMeshBuilder::SetColorRGB=rmmshbld_000102040d001a00 -3 IDirect3DRMMeshBuilder::SetColorSource=rmmshbld_000102040d001b00 -3 IDirect3DRMMeshBuilder::SetMaterial=rmmshbld_000102040d001c00 -3 IDirect3DRMMeshBuilder::SetNormal=rmmshbld_000102040d001d00 -3 IDirect3DRMMeshBuilder::SetPerspective=rmmshbld_000102040d001e00 -3 IDirect3DRMMeshBuilder::SetQuality=rmmshbld_000102040d001f00 -3 IDirect3DRMMeshBuilder::SetTexture=rmmshbld_000102040d002000 -3 IDirect3DRMMeshBuilder::SetTextureCoordinates=rmmshbld_000102040d002100 -3 IDirect3DRMMeshBuilder::SetTextureTopology=rmmshbld_000102040d002200 -3 IDirect3DRMMeshBuilder::SetVertex=rmmshbld_000102040d002300 -3 IDirect3DRMMeshBuilder::SetVertexColor=rmmshbld_000102040d002400 -3 IDirect3DRMMeshBuilder::SetVertexColorRGB=rmmshbld_000102040d002500 -3 IDirect3DRMMeshBuilder::Translate=rmmshbld_000102040d002600 -3 IDirect3DRMObject -3 IDirect3DRMObject=rmobject_000102040e000000 -3 IDirect3DRMObject::AddDestroyCallback=rmobject_000102040e000100 -3 IDirect3DRMObject::Clone=rmobject_000102040e000200 -3 IDirect3DRMObject::DeleteDestroyCallback=rmobject_000102040e000300 -3 IDirect3DRMObject::GetAppData=rmobject_000102040e000400 -3 IDirect3DRMObject::GetClassName=rmobject_000102040e000500 -3 IDirect3DRMObject::GetName=rmobject_000102040e000600 -3 IDirect3DRMObject::SetAppData=rmobject_000102040e000700 -3 IDirect3DRMObject::SetName=rmobject_000102040e000800 -3 IDirect3DRMShadow -3 IDirect3DRMShadow=rmshadow_000102040f000000 -3 IDirect3DRMShadow::Init=rmshadow_000102040f000100 -3 IDirect3DRMTexture -3 IDirect3DRMTexture=rmtextur_0001020410000000 -3 IDirect3DRMTexture::Changed=rmtextur_0001020410000100 -3 IDirect3DRMTexture::GetColors=rmtextur_0001020410000200 -3 IDirect3DRMTexture::GetDecalOrigin=rmtextur_0001020410000300 -3 IDirect3DRMTexture::GetDecalScale=rmtextur_0001020410000400 -3 IDirect3DRMTexture::GetDecalSize=rmtextur_0001020410000500 -3 IDirect3DRMTexture::GetDecalTransparency=rmtextur_0001020410000600 -3 IDirect3DRMTexture::GetDecalTransparentColor=rmtextur_0001020410000700 -3 IDirect3DRMTexture::GetImage=rmtextur_0001020410000800 -3 IDirect3DRMTexture::GetShades=rmtextur_0001020410000900 -3 IDirect3DRMTexture::InitFromFile=rmtextur_0001020410000a00 -3 IDirect3DRMTexture::InitFromResource=rmtextur_0001020410000b00 -3 IDirect3DRMTexture::InitFromSurface=rmtextur_0001020410000c00 -3 IDirect3DRMTexture::SetColors=rmtextur_0001020410000d00 -3 IDirect3DRMTexture::SetDecalOrigin=rmtextur_0001020410000e00 -3 IDirect3DRMTexture::SetDecalScale=rmtextur_0001020410000f00 -3 IDirect3DRMTexture::SetDecalSize=rmtextur_0001020410001000 -3 IDirect3DRMTexture::SetDecalTransparency=rmtextur_0001020410001100 -3 IDirect3DRMTexture::SetDecalTransparentColor=rmtextur_0001020410001200 -3 IDirect3DRMTexture::SetShades=rmtextur_0001020410001300 -3 IDirect3DRMUserVisual -3 IDirect3DRMUserVisual=rmuservz_0001020411000000 -3 IDirect3DRMUserVisual::Init=rmuservz_0001020411000100 -3 IDirect3DRMViewport -3 IDirect3DRMViewport=rmviewpt_0001020412000000 -3 IDirect3DRMViewport::Clear=rmviewpt_0001020412000100 -3 IDirect3DRMViewport::Configure=rmviewpt_0001020412000200 -3 IDirect3DRMViewport::ForceUpdate=rmviewpt_0001020412000300 -3 IDirect3DRMViewport::GetBack=rmviewpt_0001020412000400 -3 IDirect3DRMViewport::GetCamera=rmviewpt_0001020412000500 -3 IDirect3DRMViewport::GetDevice=rmviewpt_0001020412000600 -3 IDirect3DRMViewport::GetDirect3DViewport=rmviewpt_0001020412000700 -3 IDirect3DRMViewport::GetField=rmviewpt_0001020412000800 -3 IDirect3DRMViewport::GetFront=rmviewpt_0001020412000900 -3 IDirect3DRMViewport::GetHeight=rmviewpt_0001020412000a00 -3 IDirect3DRMViewport::GetPlane=rmviewpt_0001020412000b00 -3 IDirect3DRMViewport::GetProjection=rmviewpt_0001020412000c00 -3 IDirect3DRMViewport::GetUniformScaling=rmviewpt_0001020412000d00 -3 IDirect3DRMViewport::GetWidth=rmviewpt_0001020412000e00 -3 IDirect3DRMViewport::GetX=rmviewpt_0001020412000f00 -3 IDirect3DRMViewport::GetY=rmviewpt_0001020412001000 -3 IDirect3DRMViewport::Init=rmviewpt_0001020412001100 -3 IDirect3DRMViewport::InverseTransform=rmviewpt_0001020412001200 -3 IDirect3DRMViewport::Pick=rmviewpt_0001020412001300 -3 IDirect3DRMViewport::Render=rmviewpt_0001020412001400 -3 IDirect3DRMViewport::SetBack=rmviewpt_0001020412001500 -3 IDirect3DRMViewport::SetCamera=rmviewpt_0001020412001600 -3 IDirect3DRMViewport::SetField=rmviewpt_0001020412001700 -3 IDirect3DRMViewport::SetFront=rmviewpt_0001020412001800 -3 IDirect3DRMViewport::SetPlane=rmviewpt_0001020412001900 -3 IDirect3DRMViewport::SetProjection=rmviewpt_0001020412001a00 -3 IDirect3DRMViewport::SetUniformScaling=rmviewpt_0001020412001b00 -3 IDirect3DRMViewport::Transform=rmviewpt_0001020412001c00 -3 IDirect3DRMWinDevice -3 IDirect3DRMWinDevice=rmwindev_0001020413000000 -3 IDirect3DRMWinDevice::HandleActivate=rmwindev_0001020413000100 -3 IDirect3DRMWinDevice::HandlePaint=rmwindev_0001020413000200 -3 IDirect3DRMWrap -3 IDirect3DRMWrap=rmwrap_0001020414000000 -3 IDirect3DRMWrap::Apply=rmwrap_0001020414000100 -3 IDirect3DRMWrap::ApplyRelative=rmwrap_0001020414000200 -3 IDirect3DRMWrap::Init=rmwrap_0001020414000300 -3 Structures -3 D3DRMBOX=rmtypes_0001020415000100 -3 D3DRMIMAGE=rmtypes_0001020415000200 -3 D3DRMLOADMEMORY=rmtypes_0001020415000300 -3 D3DRMLOADRESOURCE=rmtypes_0001020415000400 -3 D3DRMPALETTEENTRY=rmtypes_0001020415000500 -3 D3DRMPICKDESC=rmtypes_0001020415000600 -3 D3DRMQUATERNION=rmtypes_0001020415000700 -3 D3DRMVECTOR4D=rmtypes_0001020415000800 -3 D3DRMVERTEX=rmtypes_0001020415000900 -3 Enumerated Types -3 D3DRMCOLORSOURCE=rmtypes_0001020416000100 -3 D3DRMCOMBINETYPE=rmtypes_0001020416000200 -3 D3DRMFILLMODE=rmtypes_0001020416000300 -3 D3DRMFOGMODE=rmtypes_0001020416000400 -3 D3DRMFRAMECONSTRAINT=rmtypes_0001020416000500 -3 D3DRMLIGHTMODE=rmtypes_0001020416000600 -3 D3DRMLIGHTTYPE=rmtypes_0001020416000700 -3 D3DRMMATERIALMODE=rmtypes_0001020416000800 -3 D3DRMPALETTEFLAGS=rmtypes_0001020416000900 -3 D3DRMPROJECTIONTYPE=rmtypes_0001020416000a00 -3 D3DRMRENDERQUALITY=rmtypes_0001020416000b00 -3 D3DRMSHADEMODE=rmtypes_0001020416000c00 -3 D3DRMSORTMODE=rmtypes_0001020416000d00 -3 D3DRMTEXTUREQUALITY=rmtypes_0001020416000e00 -3 D3DRMUSERVISUALREASON=rmtypes_0001020416000f00 -3 D3DRMWRAPTYPE=rmtypes_0001020416001000 -3 D3DRMXOFFORMAT=rmtypes_0001020416001100 -3 D3DRMZBUFFERMODE=rmtypes_0001020416001200 -3 Other Types -3 D3DRMANIMATIONOPTIONS=rmtypes_0001020417000100 -3 D3DRMCOLORMODEL=rmtypes_0001020417000200 -3 D3DRMLOADOPTIONS=rmtypes_0001020417000300 -3 D3DRMMAPPING=rmtypes_0001020417000400 -3 D3DRMMATRIX4D=rmtypes_0001020417000500 -3 D3DRMSAVEOPTIONS=rmtypes_0001020417000600 -2 Return Values=rmtypes_0001020418000000 -2 Immediate-Mode Reference -3 Macros -3 D3DDivide=d3dapi_0001020501000100 -3 D3DMultiply=d3dapi_0001020501000200 -3 D3DRGB=d3dapi_0001020501000300 -3 D3DRGBA=d3dapi_0001020501000400 -3 D3DSTATE_OVERRIDE=d3dapi_0001020501000500 -3 D3DVAL=d3dapi_0001020501000600 -3 D3DVALP=d3dapi_0001020501000700 -3 RGB_GETBLUE=d3dapi_0001020501000800 -3 RGB_GETGREEN=d3dapi_0001020501000900 -3 RGB_GETRED=d3dapi_0001020501000a00 -3 RGB_MAKE=d3dapi_0001020501000b00 -3 RGB_TORGBA=d3dapi_0001020501000c00 -3 RGBA_GETALPHA=d3dapi_0001020501000d00 -3 RGBA_GETBLUE=d3dapi_0001020501000e00 -3 RGBA_GETGREEN=d3dapi_0001020501000f00 -3 RGBA_GETRED=d3dapi_0001020501001000 -3 RGBA_MAKE=d3dapi_0001020501001100 -3 RGBA_SETALPHA=d3dapi_0001020501001200 -3 RGBA_TORGB=d3dapi_0001020501001300 -3 Callback Functions -3 D3DENUMDEVICESCALLBACK=d3dapi_0001020502000100 -3 D3DENUMTEXTUREFORMATSCALLBACK=d3dapi_0001020502000200 -3 D3DVALIDATECALLBACK=d3dapi_0001020502000300 -3 IDirect3D -3 IDirect3D=id3dapi_0001020503000000 -3 IDirect3D::CreateLight=id3dapi_0001020503000100 -3 IDirect3D::CreateMaterial=id3dapi_0001020503000200 -3 IDirect3D::CreateViewport=id3dapi_0001020503000300 -3 IDirect3D::EnumDevices=id3dapi_0001020503000400 -3 IDirect3D::FindDevice=id3dapi_0001020503000500 -3 IDirect3D::Initialize=id3dapi_0001020503000600 -3 IDirect3DDevice -3 IDirect3DDevice=id3ddevc_0001020504000000 -3 IDirect3DDevice::AddViewport=id3ddevc_0001020504000100 -3 IDirect3DDevice::BeginScene=id3ddevc_0001020504000200 -3 IDirect3DDevice::CreateExecuteBuffer=id3ddevc_0001020504000300 -3 IDirect3DDevice::CreateMatrix=id3ddevc_0001020504000400 -3 IDirect3DDevice::DeleteMatrix=id3ddevc_0001020504000500 -3 IDirect3DDevice::DeleteViewport=id3ddevc_0001020504000600 -3 IDirect3DDevice::EndScene=id3ddevc_0001020504000700 -3 IDirect3DDevice::EnumTextureFormats=id3ddevc_0001020504000800 -3 IDirect3DDevice::Execute=id3ddevc_0001020504000900 -3 IDirect3DDevice::GetCaps=id3ddevc_0001020504000a00 -3 IDirect3DDevice::GetDirect3D=id3ddevc_0001020504000b00 -3 IDirect3DDevice::GetMatrix=id3ddevc_0001020504000c00 -3 IDirect3DDevice::GetPickRecords=id3ddevc_0001020504000d00 -3 IDirect3DDevice::GetStats=id3ddevc_0001020504000e00 -3 IDirect3DDevice::Initialize=id3ddevc_0001020504000f00 -3 IDirect3DDevice::NextViewport=id3ddevc_0001020504001000 -3 IDirect3DDevice::Pick=id3ddevc_0001020504001100 -3 IDirect3DDevice::SetMatrix=id3ddevc_0001020504001200 -3 IDirect3DDevice::SwapTextureHandles=id3ddevc_0001020504001300 -3 IDirect3DExecuteBuffer -3 IDirect3DExecuteBuffer=id3dexbf_0001020505000000 -3 IDirect3DExecuteBuffer::GetExecuteData=id3dexbf_0001020505000100 -3 IDirect3DExecuteBuffer::Initialize=id3dexbf_0001020505000200 -3 IDirect3DExecuteBuffer::Lock=id3dexbf_0001020505000300 -3 IDirect3DExecuteBuffer::Optimize=id3dexbf_0001020505000400 -3 IDirect3DExecuteBuffer::SetExecuteData=id3dexbf_0001020505000500 -3 IDirect3DExecuteBuffer::Unlock=id3dexbf_0001020505000600 -3 IDirect3DExecuteBuffer::Validate=id3dexbf_0001020505000700 -3 IDirect3DLight -3 IDirect3DLight=id3dlite_0001020506000000 -3 IDirect3DLight::GetLight=id3dlite_0001020506000100 -3 IDirect3DLight::Initialize=id3dlite_0001020506000200 -3 IDirect3DLight::SetLight=id3dlite_0001020506000300 -3 IDirect3DMaterial -3 IDirect3DMaterial=id3dmat_0001020507000000 -3 IDirect3DMaterial::GetHandle=id3dmat_0001020507000100 -3 IDirect3DMaterial::GetMaterial=id3dmat_0001020507000200 -3 IDirect3DMaterial::Initialize=id3dmat_0001020507000300 -3 IDirect3DMaterial::Reserve=id3dmat_0001020507000400 -3 IDirect3DMaterial::SetMaterial=id3dmat_0001020507000500 -3 IDirect3DMaterial::Unreserve=id3dmat_0001020507000600 -3 IDirect3DTexture -3 IDirect3DTexture=id3dtext_0001020508000000 -3 IDirect3DTexture::GetHandle=id3dtext_0001020508000100 -3 IDirect3DTexture::Initialize=id3dtext_0001020508000200 -3 IDirect3DTexture::Load=id3dtext_0001020508000300 -3 IDirect3DTexture::PaletteChanged=id3dtext_0001020508000400 -3 IDirect3DTexture::Unload=id3dtext_0001020508000500 -3 IDirect3DViewport -3 IDirect3DViewport=id3dview_0001020509000000 -3 IDirect3DViewport::AddLight=id3dview_0001020509000100 -3 IDirect3DViewport::Clear=id3dview_0001020509000200 -3 IDirect3DViewport::DeleteLight=id3dview_0001020509000300 -3 IDirect3DViewport::GetBackground=id3dview_0001020509000400 -3 IDirect3DViewport::GetBackgroundDepth=id3dview_0001020509000500 -3 IDirect3DViewport::GetViewport=id3dview_0001020509000600 -3 IDirect3DViewport::Initialize=id3dview_0001020509000700 -3 IDirect3DViewport::LightElements=id3dview_0001020509000800 -3 IDirect3DViewport::NextLight=id3dview_0001020509000900 -3 IDirect3DViewport::SetBackground=id3dview_0001020509000a00 -3 IDirect3DViewport::SetBackgroundDepth=id3dview_0001020509000b00 -3 IDirect3DViewport::SetViewport=id3dview_0001020509000c00 -3 IDirect3DViewport::TransformVertices=id3dview_0001020509000d00 -3 Structures -3 D3DBRANCH=id3dtype_000102050a000100 -3 D3DCOLORVALUE=id3dtype_000102050a000200 -3 D3DDEVICEDESC=id3dtype_000102050a000300 -3 D3DEXECUTEBUFFERDESC=id3dtype_000102050a000400 -3 D3DEXECUTEDATA=id3dtype_000102050a000500 -3 D3DFINDDEVICERESULT=id3dtype_000102050a000600 -3 D3DFINDDEVICESEARCH=id3dtype_000102050a000700 -3 D3DHVERTEX=id3dtype_000102050a000800 -3 D3DINSTRUCTION=id3dtype_000102050a000900 -3 D3DLIGHT=id3dtype_000102050a000a00 -3 D3DLIGHTDATA=id3dtype_000102050a000b00 -3 D3DLIGHTINGCAPS=id3dtype_000102050a000c00 -3 D3DLIGHTINGELEMENT=id3dtype_000102050a000d00 -3 D3DLINE=id3dtype_000102050a000e00 -3 D3DLINEPATTERN=id3dtype_000102050a000f00 -3 D3DLVERTEX=id3dtype_000102050a001000 -3 D3DMATERIAL=id3dtype_000102050a001100 -3 D3DMATRIX=id3dtype_000102050a001200 -3 D3DMATRIXLOAD=id3dtype_000102050a001300 -3 D3DMATRIXMULTIPLY=id3dtype_000102050a001400 -3 D3DPICKRECORD=id3dtype_000102050a001500 -3 D3DPOINT=id3dtype_000102050a001600 -3 D3DPRIMCAPS=id3dtype_000102050a001700 -3 D3DPROCESSVERTICES=id3dtype_000102050a001800 -3 D3DRECT=id3dtype_000102050a001900 -3 D3DSPAN=id3dtype_000102050a001a00 -3 D3DSTATE=id3dtype_000102050a001b00 -3 D3DSTATS=id3dtype_000102050a001c00 -3 D3DSTATUS=id3dtype_000102050a001d00 -3 D3DTEXTURELOAD=id3dtype_000102050a001e00 -3 D3DTLVERTEX=id3dtype_000102050a001f00 -3 D3DTRANSFORMCAPS=id3dtype_000102050a002000 -3 D3DTRANSFORMDATA=id3dtype_000102050a002100 -3 D3DTRIANGLE=id3dtype_000102050a002200 -3 D3DVECTOR=id3dtype_000102050a002300 -3 D3DVERTEX=id3dtype_000102050a002400 -3 D3DVIEWPORT=id3dtype_000102050a002500 -3 Enumerated Types -3 D3DBLEND=id3dtype_000102050b000100 -3 D3DCMPFUNC=id3dtype_000102050b000200 -3 D3DCOLORMODEL=id3dtype_000102050b000300 -3 D3DCULL=id3dtype_000102050b000400 -3 D3DFILLMODE=id3dtype_000102050b000500 -3 D3DFOGMODE=id3dtype_000102050b000600 -3 D3DLIGHTSTATETYPE=id3dtype_000102050b000700 -3 D3DLIGHTTYPE=id3dtype_000102050b000800 -3 D3DOPCODE=id3dtype_000102050b000900 -3 D3DRENDERSTATETYPE=id3dtype_000102050b000a00 -3 D3DSHADEMODE=id3dtype_000102050b000b00 -3 D3DTEXTUREADDRESS=id3dtype_000102050b000c00 -3 D3DTEXTUREBLEND=id3dtype_000102050b000d00 -3 D3DTEXTUREFILTER=id3dtype_000102050b000e00 -3 D3DTRANSFORMSTATETYPE=id3dtype_000102050b000f00 -3 Other Types -3 D3DCOLOR=id3dtype_000102050c000100 -3 D3DVALUE=id3dtype_000102050c000200 -2 Return Values=id3dtype_000102050d000000 -1 DirectInput -1 New Information for DirectX 3=dinput_0001030101000000 -2 Overview -2 Introduction to Joysticks=dinput_0001030102010000 -2 Joystick Capabilities=dinput_0001030102020000 -2 Joystick Calibration and Testing=dinput_0001030102030000 -2 Joystick Position=dinput_0001030102040000 -2 Reference -2 Joystick Groups=dinput_0001030103010000 -3 Functions -3 joyConfigChanged=dinput_0001030103020100 -3 joyGetDevCaps=dinput_0001030103020200 -3 joyGetNumDevs=dinput_0001030103020300 -3 joyGetPosEx=dinput_0001030103020400 -3 Structures -3 JOYCAPS=dinput_0001030103030100 -3 JOYINFOEX=dinput_0001030103030200 -2 Return Values=dinput_0001030103040000 -1 DirectSetup -1 About DirectSetup=dsetup_0001030201000000 -2 DirectSetup Overview -2 DirectSetup Overview=dsetup_0001030202000000 -2 Using the DirectXSetup Function=dsetup_0001030202010000 -3 Preparing a DirectX Application for Installation -3 Preparing a DirectX Application for Installation=dsetup_0001030202020000 -3 Creating the Setup Program=dsetup_0001030202020100 -3 Setting Up the Application Directory=dsetup_0001030202020200 -2 Enabling AutoPlay=dsetup_0001030202030000 -2 DirectSetup Reference -3 Functions -3 DirectXRegisterApplication=dsetup_0001030203010100 -3 DirectXSetup=dsetup_0001030203010200 -3 Structure -3 DIRECTXREGISTERAPP=dsetup_0001030203020100 -2 Return Values=dsetup_0001030203030000 -1 AutoPlay -2 Overview -2 About AutoPlay=autoplay_0001030301010000 -2 How AutoPlay Works=autoplay_0001030301020000 -2 The Autorun.inf File=autoplay_0001030301030000 -3 Tips for Writing AutoPlay Applications -3 Tips for Writing AutoPlay Applications=autoplay_0001030301040000 -3 Opening a Startup Application=autoplay_0001030301040100 -3 Loading in the Background=autoplay_0001030301040200 -3 Conserving Hard Disk Space=autoplay_0001030301040300 -3 Using the Registry=autoplay_0001030301040400 -3 Setting the NoDriveTypeAutoRun Value=autoplay_0001030301040500 -2 Suppressing AutoPlay=autoplay_0001030301050000 -2 AutoPlay for MS-DOS-Based Applications=autoplay_0001030301060000 -2 Reference -3 Commands -3 defaulticon=autoplay_0001030302010100 -3 icon=autoplay_0001030302010200 -3 open=autoplay_0001030302010300 -3 shell=autoplay_0001030302010400 -3 shell\verb=autoplay_0001030302010500 -1 Glossary -1 A=glossary_0001030401000000 -1 B=glossary_0001030402000000 -1 C=glossary_0001030403000000 -1 D=glossary_0001030404000000 -1 E=glossary_0001030405000000 -1 F=glossary_0001030406000000 -1 G=glossary_0001030407000000 -1 H=glossary_0001030408000000 -1 L=glossary_0001030409000000 -1 M=glossary_000103040a000000 -1 N=glossary_000103040b000000 -1 O=glossary_000103040c000000 -1 P=glossary_000103040d000000 -1 Q=glossary_000103040e000000 -1 R=glossary_000103040f000000 -1 S=glossary_0001030410000000 -1 T=glossary_0001030411000000 -1 U=glossary_0001030412000000 -1 V=glossary_0001030413000000 -1 W=glossary_0001030414000000 -1 Z=glossary_0001030415000000 diff --git a/docs/winhelp/directx.hlp b/docs/winhelp/directx.hlp deleted file mode 100644 index 81616ef..0000000 Binary files a/docs/winhelp/directx.hlp and /dev/null differ diff --git a/docs/worddoc/autoplay.doc b/docs/worddoc/autoplay.doc deleted file mode 100644 index f184174..0000000 Binary files a/docs/worddoc/autoplay.doc and /dev/null differ diff --git a/docs/worddoc/d3dimref.doc b/docs/worddoc/d3dimref.doc deleted file mode 100644 index 48fbb7b..0000000 Binary files a/docs/worddoc/d3dimref.doc and /dev/null differ diff --git a/docs/worddoc/d3dover.doc b/docs/worddoc/d3dover.doc deleted file mode 100644 index 42474c4..0000000 Binary files a/docs/worddoc/d3dover.doc and /dev/null differ diff --git a/docs/worddoc/d3drmref.doc b/docs/worddoc/d3drmref.doc deleted file mode 100644 index 3cc2688..0000000 Binary files a/docs/worddoc/d3drmref.doc and /dev/null differ diff --git a/docs/worddoc/ddraw.doc b/docs/worddoc/ddraw.doc deleted file mode 100644 index 951d0cf..0000000 Binary files a/docs/worddoc/ddraw.doc and /dev/null differ diff --git a/docs/worddoc/dinput.doc b/docs/worddoc/dinput.doc deleted file mode 100644 index 7a8a4c7..0000000 Binary files a/docs/worddoc/dinput.doc and /dev/null differ diff --git a/docs/worddoc/dinput3e.doc b/docs/worddoc/dinput3e.doc deleted file mode 100644 index e5877f1..0000000 Binary files a/docs/worddoc/dinput3e.doc and /dev/null differ diff --git a/docs/worddoc/dplay.doc b/docs/worddoc/dplay.doc deleted file mode 100644 index 7d13e61..0000000 Binary files a/docs/worddoc/dplay.doc and /dev/null differ diff --git a/docs/worddoc/dsetup.doc b/docs/worddoc/dsetup.doc deleted file mode 100644 index bb15f08..0000000 Binary files a/docs/worddoc/dsetup.doc and /dev/null differ diff --git a/docs/worddoc/dsound.doc b/docs/worddoc/dsound.doc deleted file mode 100644 index e8a7f22..0000000 Binary files a/docs/worddoc/dsound.doc and /dev/null differ diff --git a/docs/worddoc/dxintro.doc b/docs/worddoc/dxintro.doc deleted file mode 100644 index e403daa..0000000 Binary files a/docs/worddoc/dxintro.doc and /dev/null differ diff --git a/docs/worddoc/glossary.doc b/docs/worddoc/glossary.doc deleted file mode 100644 index 3ce8298..0000000 Binary files a/docs/worddoc/glossary.doc and /dev/null differ diff --git a/docs/worddoc/readme.txt b/docs/worddoc/readme.txt deleted file mode 100644 index ee69e7d..0000000 --- a/docs/worddoc/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -The DirectX documentation in this directory contains the same information -as the WinHelp documentation in the WinHelp directory of this SDK. The -WinHelp format of the documentation is generally easier to use than the Word -format because of its many hypertext links and other navigational aids. - -Before printing any of the Word documentation, you should rebuild the table -of contents for that file so that the page numbers are accurate for your -printer. To do this, select the table of contents in Word, right-click the -selection, and then click Update Field. In the Update Table Of Contents -dialog box, click the Update Entire Table option, and then click OK. - -The Word format of the Direct3D documentation is provided in several -files so that the file sizes are more manageable. (The Direct3D -documentation appears as one section in the WinHelp format.) - diff --git a/foxbear/foxbear.art b/foxbear/foxbear.art deleted file mode 100644 index efe82d4..0000000 Binary files a/foxbear/foxbear.art and /dev/null differ diff --git a/foxbear/foxbear.exe b/foxbear/foxbear.exe deleted file mode 100755 index 83114e9..0000000 Binary files a/foxbear/foxbear.exe and /dev/null differ diff --git a/iklowns/data/backdrop.bmp b/iklowns/data/backdrop.bmp deleted file mode 100644 index 8aaa249..0000000 Binary files a/iklowns/data/backdrop.bmp and /dev/null differ diff --git a/iklowns/data/bang.wav b/iklowns/data/bang.wav deleted file mode 100644 index 2d270b9..0000000 Binary files a/iklowns/data/bang.wav and /dev/null differ diff --git a/iklowns/data/bigtbig.bmp b/iklowns/data/bigtbig.bmp deleted file mode 100644 index de42d96..0000000 Binary files a/iklowns/data/bigtbig.bmp and /dev/null differ diff --git a/iklowns/data/bigtbig.tle b/iklowns/data/bigtbig.tle deleted file mode 100644 index d162de0..0000000 Binary files a/iklowns/data/bigtbig.tle and /dev/null differ diff --git a/iklowns/data/bigtop.bmp b/iklowns/data/bigtop.bmp deleted file mode 100644 index e428d8d..0000000 Binary files a/iklowns/data/bigtop.bmp and /dev/null differ diff --git a/iklowns/data/bigtop.tle b/iklowns/data/bigtop.tle deleted file mode 100644 index a115364..0000000 Binary files a/iklowns/data/bigtop.tle and /dev/null differ diff --git a/iklowns/data/bigtsml.bmp b/iklowns/data/bigtsml.bmp deleted file mode 100644 index dcbafeb..0000000 Binary files a/iklowns/data/bigtsml.bmp and /dev/null differ diff --git a/iklowns/data/bigtsml.tle b/iklowns/data/bigtsml.tle deleted file mode 100644 index ee91246..0000000 Binary files a/iklowns/data/bigtsml.tle and /dev/null differ diff --git a/iklowns/data/bkgrnd.bmp b/iklowns/data/bkgrnd.bmp deleted file mode 100644 index 98ae0ca..0000000 Binary files a/iklowns/data/bkgrnd.bmp and /dev/null differ diff --git a/iklowns/data/blow1.wav b/iklowns/data/blow1.wav deleted file mode 100644 index aae9ebc..0000000 Binary files a/iklowns/data/blow1.wav and /dev/null differ diff --git a/iklowns/data/blow2.wav b/iklowns/data/blow2.wav deleted file mode 100644 index f75e99d..0000000 Binary files a/iklowns/data/blow2.wav and /dev/null differ diff --git a/iklowns/data/c1block.bmp b/iklowns/data/c1block.bmp deleted file mode 100644 index d1d1e0b..0000000 Binary files a/iklowns/data/c1block.bmp and /dev/null differ diff --git a/iklowns/data/c1block.spr b/iklowns/data/c1block.spr deleted file mode 100644 index e959d67..0000000 --- a/iklowns/data/c1block.spr +++ /dev/null @@ -1,77 +0,0 @@ -[BlockLeft] -C1blol01.dib=1 -C1blol03.dib=1 -C1blol05.dib=1 -C1blol07.dib=1 -C1blol09.dib=1 - -[C1blol01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[C1blol03.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[C1blol05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[C1blol07.dib] -X=171 -Y=0 -Width=57 -Height=133 - -[C1blol09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[Sequences] -BlockLeft=3 -BlockRight=3 - -[BlockRight] -C1blor01.dib=1 -C1blor03.dib=1 -C1blor05.dib=1 -C1blor07.dib=1 -C1blor09.dib=1 - -[C1blor01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C1blor03.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C1blor05.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C1blor07.dib] -X=174 -Y=133 -Width=58 -Height=133 - -[C1blor09.dib] -X=116 -Y=133 -Width=58 -Height=133 diff --git a/iklowns/data/c1duck.bmp b/iklowns/data/c1duck.bmp deleted file mode 100644 index cb71020..0000000 Binary files a/iklowns/data/c1duck.bmp and /dev/null differ diff --git a/iklowns/data/c1duck.spr b/iklowns/data/c1duck.spr deleted file mode 100644 index e0b00d2..0000000 --- a/iklowns/data/c1duck.spr +++ /dev/null @@ -1,78 +0,0 @@ -[DuckLeft] -C1ducl01.dib=1 -C1ducl05.dib=1 -C1ducl09.dib=1 -C1ducl13.dib=1 -C1ducl17.dib=1 - -[C1ducl01.dib] -X=0 -Y=0 -Width=58 -Height=132 - -[C1ducl05.dib] -X=58 -Y=0 -Width=66 -Height=132 - -[C1ducl09.dib] -X=124 -Y=0 -Width=74 -Height=134 - -[C1ducl13.dib] -X=198 -Y=0 -Width=70 -Height=134 - -[C1ducl17.dib] -X=268 -Y=0 -Width=63 -Height=133 - -[Sequences] -DuckLeft=5 -DuckRight=5 - -[DuckRight] -C1ducr01.dib=1 -C1ducr05.dib=1 -C1ducr09.dib=1 -C1ducr13.dib=1 -C1ducr17.dib=1 - -[C1ducr01.dib] -X=0 -Y=134 -Width=72 -Height=132 - -[C1ducr05.dib] -X=72 -Y=134 -Width=68 -Height=131 - -[C1ducr09.dib] -X=140 -Y=134 -Width=65 -Height=131 - -[C1ducr13.dib] -X=205 -Y=134 -Width=68 -Height=131 - -[C1ducr17.dib] -X=273 -Y=134 -Width=72 -Height=132 - diff --git a/iklowns/data/c1piefac.bmp b/iklowns/data/c1piefac.bmp deleted file mode 100644 index f4219cd..0000000 Binary files a/iklowns/data/c1piefac.bmp and /dev/null differ diff --git a/iklowns/data/c1piefac.spr b/iklowns/data/c1piefac.spr deleted file mode 100644 index 43125d0..0000000 --- a/iklowns/data/c1piefac.spr +++ /dev/null @@ -1,63 +0,0 @@ -[PieFaceLeft] -C1pfal01.dib=1 -C1pfal03.dib=1 -C1pfal05.dib=1 -Piefacel.bmp=1 - -[C1pfal01.dib] -X=0 -Y=0 -Width=70 -Height=133 - -[C1pfal03.dib] -X=70 -Y=0 -Width=70 -Height=133 - -[C1pfal05.dib] -X=140 -Y=0 -Width=70 -Height=133 - -[Piefacel.bmp] -X=210 -Y=0 -Width=70 -Height=133 - -[Sequences] -PieFaceLeft=4 -PieFaceRight=4 - -[PieFaceRight] -C1pfar01.dib=1 -C1pfar03.dib=1 -C1pfar05.dib=1 -Piefacer.bmp=1 - -[C1pfar01.dib] -X=0 -Y=133 -Width=70 -Height=133 - -[C1pfar03.dib] -X=70 -Y=133 -Width=58 -Height=133 - -[C1pfar05.dib] -X=128 -Y=133 -Width=58 -Height=133 - -[Piefacer.bmp] -X=186 -Y=133 -Width=58 -Height=133 diff --git a/iklowns/data/c1piehed.bmp b/iklowns/data/c1piehed.bmp deleted file mode 100644 index 4764726..0000000 Binary files a/iklowns/data/c1piehed.bmp and /dev/null differ diff --git a/iklowns/data/c1piehed.spr b/iklowns/data/c1piehed.spr deleted file mode 100644 index 8572f16..0000000 --- a/iklowns/data/c1piehed.spr +++ /dev/null @@ -1,63 +0,0 @@ -[PieHeadLeft] -C1phel01.dib=1 -C1phel03.dib=1 -C1phel05.dib=1 -Pieheadl.bmp=1 - -[C1phel01.dib] -X=0 -Y=0 -Width=100 -Height=133 - -[C1phel03.dib] -X=100 -Y=0 -Width=76 -Height=133 - -[C1phel05.dib] -X=176 -Y=0 -Width=57 -Height=133 - -[Pieheadl.bmp] -X=233 -Y=0 -Width=57 -Height=133 - -[Sequences] -PieHeadLeft=4 -PieHeadRight=4 - -[PieHeadRight] -C1pher01.dib=1 -C1pher03.dib=1 -C1pher05.dib=1 -Pieheadr.bmp=1 - -[C1pher01.dib] -X=0 -Y=133 -Width=101 -Height=133 - -[C1pher03.dib] -X=101 -Y=133 -Width=101 -Height=133 - -[C1pher05.dib] -X=202 -Y=133 -Width=101 -Height=133 - -[Pieheadr.bmp] -X=303 -Y=133 -Width=101 -Height=133 diff --git a/iklowns/data/c1poke.bmp b/iklowns/data/c1poke.bmp deleted file mode 100644 index e8deea4..0000000 Binary files a/iklowns/data/c1poke.bmp and /dev/null differ diff --git a/iklowns/data/c1poke.spr b/iklowns/data/c1poke.spr deleted file mode 100644 index 962601b..0000000 --- a/iklowns/data/c1poke.spr +++ /dev/null @@ -1,77 +0,0 @@ -[PokeLeft] -C1eyel01.dib=1 -C1eyel03.dib=1 -C1eyel05.dib=1 -C1eyel07.dib=1 -C1eyel09.dib=1 - -[C1eyel01.dib] -X=0 -Y=0 -Width=61 -Height=133 - -[C1eyel03.dib] -X=61 -Y=0 -Width=61 -Height=133 - -[C1eyel05.dib] -X=61 -Y=0 -Width=61 -Height=133 - -[C1eyel07.dib] -X=183 -Y=0 -Width=61 -Height=133 - -[C1eyel09.dib] -X=122 -Y=0 -Width=61 -Height=133 - -[Sequences] -PokeLeft=3 -PokeRight=3 - -[PokeRight] -C1eyer01.dib=1 -C1eyer03.dib=1 -C1eyer05.dib=1 -C1eyer07.dib=1 -C1eyer09.dib=1 - -[C1eyer01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C1eyer03.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C1eyer05.dib] -X=58 -Y=133 -Width=59 -Height=133 - -[C1eyer07.dib] -X=175 -Y=133 -Width=58 -Height=133 - -[C1eyer09.dib] -X=117 -Y=133 -Width=58 -Height=133 diff --git a/iklowns/data/c1run.bmp b/iklowns/data/c1run.bmp deleted file mode 100644 index eb82040..0000000 Binary files a/iklowns/data/c1run.bmp and /dev/null differ diff --git a/iklowns/data/c1run.spr b/iklowns/data/c1run.spr deleted file mode 100644 index 1293662..0000000 --- a/iklowns/data/c1run.spr +++ /dev/null @@ -1,119 +0,0 @@ -[RunLeft] -C1-rul01.dib=1 -C1-rul03.dib=1 -C1-rul05.dib=1 -C1-rul07.dib=1 -C1-rul09.dib=1 -C1-rul11.dib=1 -C1-rul13.dib=1 -C1-rul15.dib=1 - -[C1-rul01.dib] -X=0 -Y=0 -Width=110 -Height=125 - -[C1-rul03.dib] -X=110 -Y=0 -Width=94 -Height=137 - -[C1-rul05.dib] -X=204 -Y=0 -Width=91 -Height=134 - -[C1-rul07.dib] -X=295 -Y=0 -Width=107 -Height=131 - -[C1-rul09.dib] -X=402 -Y=0 -Width=110 -Height=123 - -[C1-rul11.dib] -X=512 -Y=0 -Width=95 -Height=131 - -[C1-rul13.dib] -X=607 -Y=0 -Width=91 -Height=137 - -[C1-rul15.dib] -X=698 -Y=0 -Width=106 -Height=130 - -[Sequences] -RunLeft=8 -RunRight=8 - -[RunRight] -C1-rur01.dib=1 -C1-rur03.dib=1 -C1-rur05.dib=1 -C1-rur07.dib=1 -C1-rur09.dib=1 -C1-rur11.dib=1 -C1-rur13.dib=1 -C1-rur15.dib=1 - -[C1-rur01.dib] -X=0 -Y=137 -Width=105 -Height=123 - -[C1-rur03.dib] -X=105 -Y=137 -Width=87 -Height=136 - -[C1-rur05.dib] -X=192 -Y=137 -Width=90 -Height=133 - -[C1-rur07.dib] -X=282 -Y=137 -Width=110 -Height=130 - -[C1-rur09.dib] -X=392 -Y=137 -Width=106 -Height=125 - -[C1-rur11.dib] -X=498 -Y=137 -Width=87 -Height=132 - -[C1-rur13.dib] -X=585 -Y=137 -Width=95 -Height=138 - -[C1-rur15.dib] -X=680 -Y=137 -Width=109 -Height=131 diff --git a/iklowns/data/c1sad.bmp b/iklowns/data/c1sad.bmp deleted file mode 100644 index 6e0da4e..0000000 Binary files a/iklowns/data/c1sad.bmp and /dev/null differ diff --git a/iklowns/data/c1sad.spr b/iklowns/data/c1sad.spr deleted file mode 100644 index f5313b2..0000000 --- a/iklowns/data/c1sad.spr +++ /dev/null @@ -1,151 +0,0 @@ -[C1SadDone] -C1sadl10.dib=1 - -[C1SadLeft] -C1sadl01.dib=1 -C1sadl02.dib=1 -C1sadl03.dib=1 -C1sadl04.dib=1 -C1sadl05.dib=1 -C1sadl06.dib=1 -C1sadl07.dib=1 -C1sadl08.dib=1 -C1sadl09.dib=1 -C1sadl10.dib=1 - -[C1sadl01.dib] -X=0 -Y=0 -Width=140 -Height=140 - -[C1sadl02.dib] -X=140 -Y=0 -Width=140 -Height=140 - -[C1sadl03.dib] -X=280 -Y=0 -Width=140 -Height=140 - -[C1sadl04.dib] -X=420 -Y=0 -Width=140 -Height=140 - -[C1sadl05.dib] -X=560 -Y=0 -Width=140 -Height=140 - -[C1sadl06.dib] -X=700 -Y=0 -Width=140 -Height=140 - -[C1sadl07.dib] -X=840 -Y=0 -Width=140 -Height=140 - -[C1sadl08.dib] -X=980 -Y=0 -Width=140 -Height=140 - -[C1sadl09.dib] -X=1120 -Y=0 -Width=140 -Height=140 - -[C1sadl10.dib] -X=1260 -Y=0 -Width=140 -Height=140 - -[Sequences] -C1SadLeft=10 -C1SadRight=10 -C1SadDone=1 - -[C1SadRight] -C1sadr01.dib=1 -C1sadr02.dib=1 -C1sadr03.dib=1 -C1sadr04.dib=1 -C1sadr05.dib=1 -C1sadr06.dib=1 -C1sadr07.dib=1 -C1sadr08.dib=1 -C1sadr09.dib=1 -C1sadr10.dib=1 - -[C1sadr01.dib] -X=0 -Y=140 -Width=140 -Height=140 - -[C1sadr02.dib] -X=140 -Y=140 -Width=140 -Height=140 - -[C1sadr03.dib] -X=280 -Y=140 -Width=140 -Height=140 - -[C1sadr04.dib] -X=420 -Y=140 -Width=140 -Height=140 - -[C1sadr05.dib] -X=560 -Y=140 -Width=140 -Height=140 - -[C1sadr06.dib] -X=700 -Y=140 -Width=140 -Height=140 - -[C1sadr07.dib] -X=840 -Y=140 -Width=140 -Height=140 - -[C1sadr08.dib] -X=980 -Y=140 -Width=140 -Height=140 - -[C1sadr09.dib] -X=1120 -Y=140 -Width=140 -Height=140 - -[C1sadr10.dib] -X=1260 -Y=140 -Width=140 -Height=140 diff --git a/iklowns/data/c1stand.bmp b/iklowns/data/c1stand.bmp deleted file mode 100644 index 9cb6933..0000000 Binary files a/iklowns/data/c1stand.bmp and /dev/null differ diff --git a/iklowns/data/c1stand.spr b/iklowns/data/c1stand.spr deleted file mode 100644 index d466bd8..0000000 --- a/iklowns/data/c1stand.spr +++ /dev/null @@ -1,21 +0,0 @@ -[StandLeft] -C1thrl01.dib=1 - -[C1thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[Sequences] -StandLeft=1 -StandRight=1 - -[StandRight] -C1thrr01.dib=1 - -[C1thrr01.dib] -X=0 -Y=133 -Width=79 -Height=133 diff --git a/iklowns/data/c1throw.bmp b/iklowns/data/c1throw.bmp deleted file mode 100644 index 065d6bd..0000000 Binary files a/iklowns/data/c1throw.bmp and /dev/null differ diff --git a/iklowns/data/c1throw.spr b/iklowns/data/c1throw.spr deleted file mode 100644 index f864750..0000000 --- a/iklowns/data/c1throw.spr +++ /dev/null @@ -1,63 +0,0 @@ -[ThrowLeft] -c1thrl01.dib=1 -c1thrl05.dib=1 -c1thrl09.dib=1 -c1thrl13.dib=1 - -[c1thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[c1thrl05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[c1thrl09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[c1thrl13.dib] -X=171 -Y=0 -Width=57 -Height=133 - -[Sequences] -ThrowLeft=4 -ThrowRight=4 - -[ThrowRight] -c1thrr01.dib=1 -c1thrr05.dib=1 -c1thrr09.dib=1 -c1thrr13.dib=1 - -[c1thrr01.dib] -X=0 -Y=133 -Width=80 -Height=133 - -[c1thrr05.dib] -X=80 -Y=133 -Width=79 -Height=133 - -[c1thrr09.dib] -X=159 -Y=133 -Width=79 -Height=133 - -[c1thrr13.dib] -X=238 -Y=133 -Width=73 -Height=133 diff --git a/iklowns/data/c1turn.bmp b/iklowns/data/c1turn.bmp deleted file mode 100644 index ee61630..0000000 Binary files a/iklowns/data/c1turn.bmp and /dev/null differ diff --git a/iklowns/data/c1turn.spr b/iklowns/data/c1turn.spr deleted file mode 100644 index 5900f19..0000000 --- a/iklowns/data/c1turn.spr +++ /dev/null @@ -1,64 +0,0 @@ -[Left2Right] -C1turl01.dib=1 -C1turl05.dib=1 -C1turl09.dib=1 -C1turl13.dib=1 - -[C1turl01.dib] -X=0 -Y=0 -Width=76 -Height=133 - -[C1turl05.dib] -X=76 -Y=0 -Width=60 -Height=136 - -[C1turl09.dib] -X=136 -Y=0 -Width=68 -Height=138 - -[C1turl13.dib] -X=204 -Y=0 -Width=86 -Height=138 - -[Sequences] -Left2Right=4 -Right2Left=4 - -[Right2Left] -C1turr01.dib=1 -C1turr05.dib=1 -C1turr09.dib=1 -C1turr13.dib=1 - -[C1turr01.dib] -X=0 -Y=138 -Width=84 -Height=135 - -[C1turr05.dib] -X=84 -Y=138 -Width=73 -Height=131 - -[C1turr09.dib] -X=157 -Y=138 -Width=65 -Height=135 - -[C1turr13.dib] -X=222 -Y=138 -Width=67 -Height=134 - diff --git a/iklowns/data/c1walk.bmp b/iklowns/data/c1walk.bmp deleted file mode 100644 index c8c1b83..0000000 Binary files a/iklowns/data/c1walk.bmp and /dev/null differ diff --git a/iklowns/data/c1walk.spr b/iklowns/data/c1walk.spr deleted file mode 100644 index d88d28c..0000000 --- a/iklowns/data/c1walk.spr +++ /dev/null @@ -1,105 +0,0 @@ -[WalkLeft] -C1wall11.dib=1 -C1wall13.dib=1 -C1wall15.dib=1 -C1wall02.dib=1 -C1wall04.dib=1 -C1wall06.dib=1 -C1wall08.dib=1 - -[C1wall11.dib] -X=0 -Y=0 -Width=64 -Height=137 - -[C1wall13.dib] -X=64 -Y=0 -Width=74 -Height=136 - -[C1wall15.dib] -X=138 -Y=0 -Width=83 -Height=135 - -[C1wall02.dib] -X=221 -Y=0 -Width=70 -Height=135 - -[C1wall04.dib] -X=291 -Y=0 -Width=68 -Height=135 - -[C1wall06.dib] -X=359 -Y=0 -Width=80 -Height=137 - -[C1wall08.dib] -X=439 -Y=0 -Width=83 -Height=136 - -[Sequences] -WalkLeft=7 -WalkRight=7 - -[WalkRight] -C1walr11.dib=1 -C1walr13.dib=1 -C1walr15.dib=1 -C1walr02.dib=1 -C1walr04.dib=1 -C1walr06.dib=1 -C1walr08.dib=1 - -[C1walr11.dib] -X=0 -Y=137 -Width=72 -Height=134 - -[C1walr13.dib] -X=72 -Y=137 -Width=79 -Height=139 - -[C1walr15.dib] -X=151 -Y=137 -Width=83 -Height=138 - -[C1walr02.dib] -X=234 -Y=137 -Width=74 -Height=138 - -[C1walr04.dib] -X=308 -Y=137 -Width=72 -Height=133 - -[C1walr06.dib] -X=380 -Y=137 -Width=83 -Height=135 - -[C1walr08.dib] -X=463 -Y=137 -Width=79 -Height=134 diff --git a/iklowns/data/c1walk45.bmp b/iklowns/data/c1walk45.bmp deleted file mode 100644 index 2fdba43..0000000 Binary files a/iklowns/data/c1walk45.bmp and /dev/null differ diff --git a/iklowns/data/c1walk45.spr b/iklowns/data/c1walk45.spr deleted file mode 100644 index 36ed46d..0000000 --- a/iklowns/data/c1walk45.spr +++ /dev/null @@ -1,237 +0,0 @@ -[InLeft] -c1u45L01.DIB=1 -c1u45L03.DIB=1 -c1u45L05.DIB=1 -c1u45L07.DIB=1 -c1u45L09.DIB=1 -c1u45L11.DIB=1 -c1u45L13.DIB=1 -c1u45L15.DIB=1 - -[c1u45L01.DIB] -X=0 -Y=0 -Width=67 -Height=133 - -[c1u45L03.DIB] -X=67 -Y=0 -Width=54 -Height=131 - -[c1u45L05.DIB] -X=121 -Y=0 -Width=57 -Height=133 - -[c1u45L07.DIB] -X=178 -Y=0 -Width=64 -Height=136 - -[c1u45L09.DIB] -X=242 -Y=0 -Width=59 -Height=135 - -[c1u45L11.DIB] -X=301 -Y=0 -Width=54 -Height=132 - -[c1u45L13.DIB] -X=355 -Y=0 -Width=60 -Height=134 - -[c1u45L15.DIB] -X=415 -Y=0 -Width=67 -Height=135 - -[Sequences] -InLeft=8 -InRight=8 -OutLeft=8 -OutRight=8 - -[InRight] -c1u45R01.DIB=1 -c1u45R03.DIB=1 -c1u45R05.DIB=1 -c1u45R07.DIB=1 -c1u45R09.DIB=1 -c1u45R11.DIB=1 -c1u45R13.DIB=1 -c1u45R15.DIB=1 - -[c1u45R01.DIB] -X=0 -Y=136 -Width=66 -Height=135 - -[c1u45R03.DIB] -X=66 -Y=136 -Width=66 -Height=132 - -[c1u45R05.DIB] -X=132 -Y=136 -Width=66 -Height=132 - -[c1u45R07.DIB] -X=198 -Y=136 -Width=69 -Height=134 - -[c1u45R09.DIB] -X=267 -Y=136 -Width=64 -Height=134 - -[c1u45R11.DIB] -X=331 -Y=136 -Width=66 -Height=131 - -[c1u45R13.DIB] -X=397 -Y=136 -Width=66 -Height=136 - -[c1u45R15.DIB] -X=463 -Y=136 -Width=66 -Height=137 - -[OutLeft] -C1w45l01.dib=1 -C1w45l03.dib=1 -C1w45l05.dib=1 -C1w45l07.dib=1 -C1w45l09.dib=1 -C1w45l11.dib=1 -C1w45l13.dib=1 -C1w45l15.dib=1 - -[C1w45l01.dib] -X=0 -Y=273 -Width=70 -Height=138 - -[C1w45l03.dib] -X=70 -Y=273 -Width=60 -Height=138 - -[C1w45l05.dib] -X=130 -Y=273 -Width=64 -Height=137 - -[C1w45l07.dib] -X=194 -Y=273 -Width=70 -Height=136 - -[C1w45l09.dib] -X=264 -Y=273 -Width=67 -Height=136 - -[C1w45l11.dib] -X=331 -Y=273 -Width=60 -Height=139 - -[C1w45l13.dib] -X=391 -Y=273 -Width=65 -Height=137 - -[C1w45l15.dib] -X=456 -Y=273 -Width=71 -Height=135 - -[OutRight] -C1w45r01.dib=1 -C1w45r03.dib=1 -C1w45r05.dib=1 -C1w45r07.dib=1 -C1w45r09.dib=1 -C1w45r11.dib=1 -C1w45r13.dib=1 -C1w45r15.dib=1 - -[C1w45r01.dib] -X=0 -Y=412 -Width=65 -Height=136 - -[C1w45r03.dib] -X=65 -Y=412 -Width=52 -Height=139 - -[C1w45r05.dib] -X=117 -Y=412 -Width=57 -Height=136 - -[C1w45r07.dib] -X=174 -Y=412 -Width=62 -Height=135 - -[C1w45r09.dib] -X=236 -Y=412 -Width=55 -Height=138 - -[C1w45r11.dib] -X=291 -Y=412 -Width=52 -Height=138 - -[C1w45r13.dib] -X=343 -Y=412 -Width=66 -Height=139 - -[C1w45r15.dib] -X=409 -Y=412 -Width=69 -Height=137 diff --git a/iklowns/data/c2block.bmp b/iklowns/data/c2block.bmp deleted file mode 100644 index d58f15c..0000000 Binary files a/iklowns/data/c2block.bmp and /dev/null differ diff --git a/iklowns/data/c2block.spr b/iklowns/data/c2block.spr deleted file mode 100644 index 1660be5..0000000 --- a/iklowns/data/c2block.spr +++ /dev/null @@ -1,49 +0,0 @@ -[C2BlockLeft] -C2blol01.dib=1 -C2blol05.dib=1 -C2blol09.dib=1 - -[C2blol01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[C2blol05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[C2blol09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2BlockLeft=3 -C2BlockRight=3 - -[C2BlockRight] -C2blor01.dib=1 -C2blor05.dib=1 -C2blor09.dib=1 - -[C2blor01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C2blor05.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C2blor09.dib] -X=116 -Y=133 -Width=58 -Height=133 diff --git a/iklowns/data/c2duck.bmp b/iklowns/data/c2duck.bmp deleted file mode 100644 index 98ab17d..0000000 Binary files a/iklowns/data/c2duck.bmp and /dev/null differ diff --git a/iklowns/data/c2duck.spr b/iklowns/data/c2duck.spr deleted file mode 100644 index 331c453..0000000 --- a/iklowns/data/c2duck.spr +++ /dev/null @@ -1,77 +0,0 @@ -[C2DuckLeft] -C2ducl01.dib=1 -C2ducl05.dib=1 -C2ducl09.dib=1 -C2ducl13.dib=1 -C2ducl17.dib=1 - -[C2ducl01.dib] -X=0 -Y=0 -Width=58 -Height=132 - -[C2ducl05.dib] -X=58 -Y=0 -Width=66 -Height=132 - -[C2ducl09.dib] -X=124 -Y=0 -Width=74 -Height=134 - -[C2ducl13.dib] -X=198 -Y=0 -Width=70 -Height=134 - -[C2ducl17.dib] -X=268 -Y=0 -Width=63 -Height=133 - -[Sequences] -C2DuckLeft=5 -C2DuckRight=5 - -[C2DuckRight] -C2ducr01.dib=1 -C2ducr05.dib=1 -C2ducr09.dib=1 -C2ducr13.dib=1 -C2ducr17.dib=1 - -[C2ducr01.dib] -X=0 -Y=134 -Width=72 -Height=132 - -[C2ducr05.dib] -X=72 -Y=134 -Width=68 -Height=131 - -[C2ducr09.dib] -X=140 -Y=134 -Width=65 -Height=131 - -[C2ducr13.dib] -X=205 -Y=134 -Width=68 -Height=131 - -[C2ducr17.dib] -X=273 -Y=134 -Width=72 -Height=132 diff --git a/iklowns/data/c2piefac.bmp b/iklowns/data/c2piefac.bmp deleted file mode 100644 index 2aea263..0000000 Binary files a/iklowns/data/c2piefac.bmp and /dev/null differ diff --git a/iklowns/data/c2piefac.spr b/iklowns/data/c2piefac.spr deleted file mode 100644 index 02d7dfc..0000000 --- a/iklowns/data/c2piefac.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2PieFaceLeft] -C2pfal01.dib=1 -C2pfal03.dib=1 -C2pfal05.dib=1 -C2pfacel.bmp=1 - -[C2pfal01.dib] -X=0 -Y=0 -Width=70 -Height=133 - -[C2pfal03.dib] -X=70 -Y=0 -Width=70 -Height=133 - -[C2pfal05.dib] -X=140 -Y=0 -Width=70 -Height=133 - -[C2pfacel.bmp] -X=210 -Y=0 -Width=70 -Height=133 - -[Sequences] -C2PieFaceLeft=4 -C2PieFaceRight=4 - -[C2PieFaceRight] -C2pfar01.dib=1 -C2pfar03.dib=1 -C2pfar05.dib=1 -C2pfacer.bmp=1 - -[C2pfar01.dib] -X=0 -Y=133 -Width=70 -Height=133 - -[C2pfar03.dib] -X=70 -Y=133 -Width=58 -Height=133 - -[C2pfar05.dib] -X=128 -Y=133 -Width=58 -Height=133 - -[C2pfacer.bmp] -X=186 -Y=133 -Width=58 -Height=133 diff --git a/iklowns/data/c2piehed.bmp b/iklowns/data/c2piehed.bmp deleted file mode 100644 index f808cdb..0000000 Binary files a/iklowns/data/c2piehed.bmp and /dev/null differ diff --git a/iklowns/data/c2piehed.spr b/iklowns/data/c2piehed.spr deleted file mode 100644 index 0da187b..0000000 --- a/iklowns/data/c2piehed.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2PieHeadLeft] -C2phel01.dib=1 -C2phel03.dib=1 -C2phel05.dib=1 -C2pheadl.bmp=1 - -[C2phel01.dib] -X=0 -Y=0 -Width=100 -Height=133 - -[C2phel03.dib] -X=100 -Y=0 -Width=76 -Height=133 - -[C2phel05.dib] -X=176 -Y=0 -Width=57 -Height=133 - -[C2pheadl.bmp] -X=233 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2PieHeadLeft=4 -C2PieHeadRight=4 - -[C2PieHeadRight] -C2pher01.dib=1 -C2pher03.dib=1 -C2pher05.dib=1 -C2pheadr.bmp=1 - -[C2pher01.dib] -X=0 -Y=133 -Width=101 -Height=133 - -[C2pher03.dib] -X=101 -Y=133 -Width=101 -Height=133 - -[C2pher05.dib] -X=202 -Y=133 -Width=101 -Height=133 - -[C2pheadr.bmp] -X=303 -Y=133 -Width=101 -Height=133 diff --git a/iklowns/data/c2poke.bmp b/iklowns/data/c2poke.bmp deleted file mode 100644 index 1822432..0000000 Binary files a/iklowns/data/c2poke.bmp and /dev/null differ diff --git a/iklowns/data/c2poke.spr b/iklowns/data/c2poke.spr deleted file mode 100644 index b118d17..0000000 --- a/iklowns/data/c2poke.spr +++ /dev/null @@ -1,49 +0,0 @@ -[C2PokeLeft] -C2eyel01.dib=1 -C2eyel05.dib=1 -C2eyel09.dib=1 - -[C2eyel01.dib] -X=0 -Y=0 -Width=61 -Height=133 - -[C2eyel05.dib] -X=61 -Y=0 -Width=61 -Height=133 - -[C2eyel09.dib] -X=122 -Y=0 -Width=61 -Height=133 - -[Sequences] -C2PokeLeft=3 -C2PokeRight=3 - -[C2PokeRight] -C2eyer01.dib=1 -C2eyer05.dib=1 -C2eyer09.dib=1 - -[C2eyer01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C2eyer05.dib] -X=58 -Y=133 -Width=59 -Height=133 - -[C2eyer09.dib] -X=117 -Y=133 -Width=58 -Height=133 diff --git a/iklowns/data/c2run.bmp b/iklowns/data/c2run.bmp deleted file mode 100644 index 2af321b..0000000 Binary files a/iklowns/data/c2run.bmp and /dev/null differ diff --git a/iklowns/data/c2run.spr b/iklowns/data/c2run.spr deleted file mode 100644 index fe6b5d5..0000000 --- a/iklowns/data/c2run.spr +++ /dev/null @@ -1,119 +0,0 @@ -[C2RunLeft] -C2-rul01.dib=1 -C2-rul03.dib=1 -C2-rul05.dib=1 -C2-rul07.dib=1 -C2-rul09.dib=1 -C2-rul11.dib=1 -C2-rul13.dib=1 -C2-rul15.dib=1 - -[C2-rul01.dib] -X=0 -Y=0 -Width=110 -Height=125 - -[C2-rul03.dib] -X=110 -Y=0 -Width=94 -Height=137 - -[C2-rul05.dib] -X=204 -Y=0 -Width=91 -Height=134 - -[C2-rul07.dib] -X=295 -Y=0 -Width=107 -Height=131 - -[C2-rul09.dib] -X=402 -Y=0 -Width=110 -Height=123 - -[C2-rul11.dib] -X=512 -Y=0 -Width=95 -Height=131 - -[C2-rul13.dib] -X=607 -Y=0 -Width=91 -Height=137 - -[C2-rul15.dib] -X=698 -Y=0 -Width=106 -Height=130 - -[Sequences] -C2RunLeft=8 -C2RunRight=8 - -[C2RunRight] -C2-rur01.dib=1 -C2-rur03.dib=1 -C2-rur05.dib=1 -C2-rur07.dib=1 -C2-rur09.dib=1 -C2-rur11.dib=1 -C2-rur13.dib=1 -C2-rur15.dib=1 - -[C2-rur01.dib] -X=0 -Y=137 -Width=105 -Height=123 - -[C2-rur03.dib] -X=105 -Y=137 -Width=87 -Height=136 - -[C2-rur05.dib] -X=192 -Y=137 -Width=90 -Height=133 - -[C2-rur07.dib] -X=282 -Y=137 -Width=110 -Height=130 - -[C2-rur09.dib] -X=392 -Y=137 -Width=106 -Height=125 - -[C2-rur11.dib] -X=498 -Y=137 -Width=87 -Height=132 - -[C2-rur13.dib] -X=585 -Y=137 -Width=95 -Height=138 - -[C2-rur15.dib] -X=680 -Y=137 -Width=109 -Height=131 diff --git a/iklowns/data/c2sad.bmp b/iklowns/data/c2sad.bmp deleted file mode 100644 index f30fa16..0000000 Binary files a/iklowns/data/c2sad.bmp and /dev/null differ diff --git a/iklowns/data/c2sad.spr b/iklowns/data/c2sad.spr deleted file mode 100644 index 9c19247..0000000 --- a/iklowns/data/c2sad.spr +++ /dev/null @@ -1,77 +0,0 @@ -[C2SadLeft] -C2sadl01.dib=1 -C2sadl02.dib=1 -C2sadl03.dib=1 -C2sadl04.dib=1 -C2sadl05.dib=1 -C2sadl06.dib=1 -C2sadl07.dib=1 -C2sadl08.dib=1 -C2sadl09.dib=1 - -[C2sadl01.dib] -X=0 -Y=0 -Width=54 -Height=135 - -[C2sadl02.dib] -X=54 -Y=0 -Width=57 -Height=136 - -[C2sadl03.dib] -X=111 -Y=0 -Width=59 -Height=136 - -[C2sadl04.dib] -X=170 -Y=0 -Width=62 -Height=136 - -[C2sadl05.dib] -X=232 -Y=0 -Width=64 -Height=136 - -[C2sadl06.dib] -X=296 -Y=0 -Width=65 -Height=136 - -[C2sadl07.dib] -X=361 -Y=0 -Width=64 -Height=136 - -[C2sadl08.dib] -X=425 -Y=0 -Width=61 -Height=136 - -[C2sadl09.dib] -X=486 -Y=0 -Width=60 -Height=136 - -[Sequences] -C2SadLeft=9 -C2SadDone=1 - -[C2SadDone] -C2sadl10.dib=1 - -[C2sadl10.dib] -X=0 -Y=136 -Width=45 -Height=130 diff --git a/iklowns/data/c2stand.bmp b/iklowns/data/c2stand.bmp deleted file mode 100644 index 7728dc7..0000000 Binary files a/iklowns/data/c2stand.bmp and /dev/null differ diff --git a/iklowns/data/c2stand.spr b/iklowns/data/c2stand.spr deleted file mode 100644 index 56bc79c..0000000 --- a/iklowns/data/c2stand.spr +++ /dev/null @@ -1,21 +0,0 @@ -[C2StandLeft] -C2thrl01.dib=1 - -[C2thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2StandLeft=1 -C2StandRight=1 - -[C2StandRight] -C2thrr01.dib=1 - -[C2thrr01.dib] -X=0 -Y=133 -Width=78 -Height=133 diff --git a/iklowns/data/c2throw.bmp b/iklowns/data/c2throw.bmp deleted file mode 100644 index cc00ac2..0000000 Binary files a/iklowns/data/c2throw.bmp and /dev/null differ diff --git a/iklowns/data/c2throw.spr b/iklowns/data/c2throw.spr deleted file mode 100644 index bae5341..0000000 --- a/iklowns/data/c2throw.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2ThrowLeft] -c2thrl01.dib=1 -c2thrl05.dib=1 -c2thrl09.dib=1 -c2thrl13.dib=1 - -[c2thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[c2thrl05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[c2thrl09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[c2thrl13.dib] -X=171 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2ThrowLeft=4 -C2ThrowRight=4 - -[C2ThrowRight] -c2thrr01.dib=1 -c2thrr05.dib=1 -c2thrr09.dib=1 -c2thrr13.dib=1 - -[c2thrr01.dib] -X=0 -Y=133 -Width=80 -Height=133 - -[c2thrr05.dib] -X=80 -Y=133 -Width=79 -Height=133 - -[c2thrr09.dib] -X=159 -Y=133 -Width=79 -Height=133 - -[c2thrr13.dib] -X=238 -Y=133 -Width=73 -Height=133 diff --git a/iklowns/data/c2turn.bmp b/iklowns/data/c2turn.bmp deleted file mode 100644 index 7adcb7f..0000000 Binary files a/iklowns/data/c2turn.bmp and /dev/null differ diff --git a/iklowns/data/c2turn.spr b/iklowns/data/c2turn.spr deleted file mode 100644 index 83129df..0000000 --- a/iklowns/data/c2turn.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2Left2Right] -C2turr01.dib=1 -C2turr05.dib=1 -C2turr09.dib=1 -C2turr13.dib=1 - -[C2turr01.dib] -X=0 -Y=0 -Width=76 -Height=133 - -[C2turr05.dib] -X=76 -Y=0 -Width=60 -Height=136 - -[C2turr09.dib] -X=136 -Y=0 -Width=68 -Height=138 - -[C2turr13.dib] -X=204 -Y=0 -Width=86 -Height=138 - -[Sequences] -C2Left2Right=4 -C2Right2Left=4 - -[C2Right2Left] -C2turl01.dib=1 -C2turl05.dib=1 -C2turl09.dib=1 -C2turl13.dib=1 - -[C2turl01.dib] -X=0 -Y=138 -Width=84 -Height=135 - -[C2turl05.dib] -X=84 -Y=138 -Width=73 -Height=131 - -[C2turl09.dib] -X=157 -Y=138 -Width=65 -Height=135 - -[C2turl13.dib] -X=222 -Y=138 -Width=67 -Height=134 diff --git a/iklowns/data/c2walk.bmp b/iklowns/data/c2walk.bmp deleted file mode 100644 index acd960e..0000000 Binary files a/iklowns/data/c2walk.bmp and /dev/null differ diff --git a/iklowns/data/c2walk.spr b/iklowns/data/c2walk.spr deleted file mode 100644 index b3ecf04..0000000 --- a/iklowns/data/c2walk.spr +++ /dev/null @@ -1,119 +0,0 @@ -[C2WalkLeft] -C2wall01.dib=1 -C2wall03.dib=1 -C2wall05.dib=1 -C2wall07.dib=1 -C2wall09.dib=1 -C2wall11.dib=1 -C2wall13.dib=1 -C2wall15.dib=1 - -[C2wall01.dib] -X=0 -Y=0 -Width=83 -Height=133 - -[C2wall03.dib] -X=83 -Y=0 -Width=64 -Height=134 - -[C2wall05.dib] -X=147 -Y=0 -Width=74 -Height=136 - -[C2wall07.dib] -X=221 -Y=0 -Width=84 -Height=137 - -[C2wall09.dib] -X=305 -Y=0 -Width=78 -Height=137 - -[C2wall11.dib] -X=383 -Y=0 -Width=64 -Height=137 - -[C2wall13.dib] -X=447 -Y=0 -Width=74 -Height=136 - -[C2wall15.dib] -X=521 -Y=0 -Width=83 -Height=135 - -[Sequences] -C2WalkLeft=8 -C2WalkRight=8 - -[C2WalkRight] -C2walr01.dib=1 -C2walr03.dib=1 -C2walr05.dib=1 -C2walr07.dib=1 -C2walr09.dib=1 -C2walr11.dib=1 -C2walr13.dib=1 -C2walr15.dib=1 - -[C2walr01.dib] -X=0 -Y=137 -Width=79 -Height=136 - -[C2walr03.dib] -X=79 -Y=137 -Width=71 -Height=137 - -[C2walr05.dib] -X=150 -Y=137 -Width=79 -Height=134 - -[C2walr07.dib] -X=229 -Y=137 -Width=84 -Height=135 - -[C2walr09.dib] -X=313 -Y=137 -Width=74 -Height=135 - -[C2walr11.dib] -X=387 -Y=137 -Width=72 -Height=134 - -[C2walr13.dib] -X=459 -Y=137 -Width=79 -Height=139 - -[C2walr15.dib] -X=538 -Y=137 -Width=83 -Height=138 diff --git a/iklowns/data/c2walk45.bmp b/iklowns/data/c2walk45.bmp deleted file mode 100644 index 9acbd41..0000000 Binary files a/iklowns/data/c2walk45.bmp and /dev/null differ diff --git a/iklowns/data/c2walk45.spr b/iklowns/data/c2walk45.spr deleted file mode 100644 index 732b420..0000000 --- a/iklowns/data/c2walk45.spr +++ /dev/null @@ -1,237 +0,0 @@ -[C2InLeft] -c2u45L01.DIB=1 -c2u45L03.DIB=1 -c2u45L05.DIB=1 -c2u45L07.DIB=1 -c2u45L09.DIB=1 -c2u45L11.DIB=1 -c2u45L13.DIB=1 -c2u45L15.DIB=1 - -[c2u45L01.DIB] -X=0 -Y=0 -Width=67 -Height=133 - -[c2u45L03.DIB] -X=67 -Y=0 -Width=54 -Height=131 - -[c2u45L05.DIB] -X=121 -Y=0 -Width=57 -Height=133 - -[c2u45L07.DIB] -X=178 -Y=0 -Width=64 -Height=136 - -[c2u45L09.DIB] -X=242 -Y=0 -Width=59 -Height=135 - -[c2u45L11.DIB] -X=301 -Y=0 -Width=54 -Height=132 - -[c2u45L13.DIB] -X=355 -Y=0 -Width=60 -Height=134 - -[c2u45L15.DIB] -X=415 -Y=0 -Width=67 -Height=135 - -[Sequences] -C2InLeft=8 -C2InRight=8 -C2OutLeft=8 -C2OutRight=8 - -[C2InRight] -c2u45R01.DIB=1 -c2u45R03.DIB=1 -c2u45R05.DIB=1 -c2u45R07.DIB=1 -c2u45R09.DIB=1 -c2u45R11.DIB=1 -c2u45R13.DIB=1 -c2u45R15.DIB=1 - -[c2u45R01.DIB] -X=0 -Y=136 -Width=66 -Height=135 - -[c2u45R03.DIB] -X=66 -Y=136 -Width=66 -Height=132 - -[c2u45R05.DIB] -X=132 -Y=136 -Width=66 -Height=132 - -[c2u45R07.DIB] -X=198 -Y=136 -Width=69 -Height=134 - -[c2u45R09.DIB] -X=267 -Y=136 -Width=64 -Height=134 - -[c2u45R11.DIB] -X=331 -Y=136 -Width=66 -Height=131 - -[c2u45R13.DIB] -X=397 -Y=136 -Width=66 -Height=136 - -[c2u45R15.DIB] -X=463 -Y=136 -Width=66 -Height=137 - -[C2OutLeft] -C2w45l01.dib=1 -C2w45l03.dib=1 -C2w45l05.dib=1 -C2w45l07.dib=1 -C2w45l09.dib=1 -C2w45l11.dib=1 -C2w45l13.dib=1 -C2w45l15.dib=1 - -[C2w45l01.dib] -X=0 -Y=273 -Width=70 -Height=138 - -[C2w45l03.dib] -X=70 -Y=273 -Width=60 -Height=138 - -[C2w45l05.dib] -X=130 -Y=273 -Width=64 -Height=137 - -[C2w45l07.dib] -X=194 -Y=273 -Width=70 -Height=136 - -[C2w45l09.dib] -X=264 -Y=273 -Width=67 -Height=136 - -[C2w45l11.dib] -X=331 -Y=273 -Width=60 -Height=139 - -[C2w45l13.dib] -X=391 -Y=273 -Width=65 -Height=137 - -[C2w45l15.dib] -X=456 -Y=273 -Width=71 -Height=135 - -[C2OutRight] -C2w45r01.dib=1 -C2w45r03.dib=1 -C2w45r05.dib=1 -C2w45r07.dib=1 -C2w45r09.dib=1 -C2w45r11.dib=1 -C2w45r13.dib=1 -C2w45r15.dib=1 - -[C2w45r01.dib] -X=0 -Y=412 -Width=65 -Height=136 - -[C2w45r03.dib] -X=65 -Y=412 -Width=52 -Height=139 - -[C2w45r05.dib] -X=117 -Y=412 -Width=57 -Height=136 - -[C2w45r07.dib] -X=174 -Y=412 -Width=62 -Height=135 - -[C2w45r09.dib] -X=236 -Y=412 -Width=55 -Height=138 - -[C2w45r11.dib] -X=291 -Y=412 -Width=52 -Height=138 - -[C2w45r13.dib] -X=343 -Y=412 -Width=66 -Height=139 - -[C2w45r15.dib] -X=409 -Y=412 -Width=69 -Height=137 diff --git a/iklowns/data/clouds.bmp b/iklowns/data/clouds.bmp deleted file mode 100644 index 6d66911..0000000 Binary files a/iklowns/data/clouds.bmp and /dev/null differ diff --git a/iklowns/data/clouds.spr b/iklowns/data/clouds.spr deleted file mode 100644 index 6bc4976..0000000 --- a/iklowns/data/clouds.spr +++ /dev/null @@ -1,31 +0,0 @@ -[Cloud1] -Cloud1-2.bmp=1 - -[Cloud1-2.bmp] -X=0 -Y=0 -Width=215 -Height=33 - -[Sequences] -Cloud1=1 -Cloud2=1 -Cloud3=1 - -[Cloud2] -Cloud2-2.bmp=1 - -[Cloud2-2.bmp] -X=0 -Y=33 -Width=136 -Height=48 - -[Cloud3] -Cloud3-2.bmp=1 - -[Cloud3-2.bmp] -X=0 -Y=81 -Width=149 -Height=43 diff --git a/iklowns/data/clown0.bmp b/iklowns/data/clown0.bmp deleted file mode 100644 index 0ea10d0..0000000 Binary files a/iklowns/data/clown0.bmp and /dev/null differ diff --git a/iklowns/data/clown0.spr b/iklowns/data/clown0.spr deleted file mode 100644 index 770c757..0000000 --- a/iklowns/data/clown0.spr +++ /dev/null @@ -1,21 +0,0 @@ -[Stand] -Clownl.dib=1 - -[Clownl.dib] -X=0 -Y=0 -Width=160 -Height=352 - -[Sequences] -Stand=1 -LeftStand=1 - -[LeftStand] -Clownr.dib=1 - -[Clownr.dib] -X=0 -Y=352 -Width=160 -Height=352 diff --git a/iklowns/data/credit.bmp b/iklowns/data/credit.bmp deleted file mode 100644 index 048120a..0000000 Binary files a/iklowns/data/credit.bmp and /dev/null differ diff --git a/iklowns/data/credits.bmp b/iklowns/data/credits.bmp deleted file mode 100644 index e233e67..0000000 Binary files a/iklowns/data/credits.bmp and /dev/null differ diff --git a/iklowns/data/foreg1.bmp b/iklowns/data/foreg1.bmp deleted file mode 100644 index 70cb855..0000000 Binary files a/iklowns/data/foreg1.bmp and /dev/null differ diff --git a/iklowns/data/foreg1.tle b/iklowns/data/foreg1.tle deleted file mode 100644 index 45891f0..0000000 Binary files a/iklowns/data/foreg1.tle and /dev/null differ diff --git a/iklowns/data/fw0.bmp b/iklowns/data/fw0.bmp deleted file mode 100644 index bc2e93e..0000000 Binary files a/iklowns/data/fw0.bmp and /dev/null differ diff --git a/iklowns/data/fw0.spr b/iklowns/data/fw0.spr deleted file mode 100644 index 034bed6..0000000 --- a/iklowns/data/fw0.spr +++ /dev/null @@ -1,109 +0,0 @@ -[Turn] -Ferris01.dib=1 -Ferris02.dib=1 -Ferris03.dib=1 -Ferris04.dib=1 -Ferris05.dib=1 -Ferris06.dib=1 -Ferris07.dib=1 -Ferris08.dib=1 -Ferris09.dib=1 -Ferris10.dib=1 -Ferris11.dib=1 -Ferris12.dib=1 -Ferris13.dib=1 -Ferris14.dib=1 -Ferris15.dib=1 - -[Ferris01.dib] -X=0 -Y=0 -Width=188 -Height=170 - -[Ferris02.dib] -X=188 -Y=0 -Width=188 -Height=170 - -[Ferris03.dib] -X=376 -Y=0 -Width=188 -Height=170 - -[Ferris04.dib] -X=564 -Y=0 -Width=188 -Height=170 - -[Ferris05.dib] -X=752 -Y=0 -Width=188 -Height=170 - -[Ferris06.dib] -X=940 -Y=0 -Width=187 -Height=170 - -[Ferris07.dib] -X=1127 -Y=0 -Width=187 -Height=170 - -[Ferris08.dib] -X=1314 -Y=0 -Width=187 -Height=170 - -[Ferris09.dib] -X=1501 -Y=0 -Width=187 -Height=170 - -[Ferris10.dib] -X=1688 -Y=0 -Width=186 -Height=170 - -[Ferris11.dib] -X=1874 -Y=0 -Width=186 -Height=170 - -[Ferris12.dib] -X=2060 -Y=0 -Width=186 -Height=170 - -[Ferris13.dib] -X=2246 -Y=0 -Width=186 -Height=170 - -[Ferris14.dib] -X=2432 -Y=0 -Width=187 -Height=170 - -[Ferris15.dib] -X=2619 -Y=0 -Width=187 -Height=170 - -[Sequences] -Turn=15 diff --git a/iklowns/data/fwstatic.bmp b/iklowns/data/fwstatic.bmp deleted file mode 100644 index e6ae9cb..0000000 Binary files a/iklowns/data/fwstatic.bmp and /dev/null differ diff --git a/iklowns/data/fwstatic.spr b/iklowns/data/fwstatic.spr deleted file mode 100644 index b22d017..0000000 --- a/iklowns/data/fwstatic.spr +++ /dev/null @@ -1,11 +0,0 @@ -[DontTurn] -ferris01.dib=1 - -[ferris01.dib] -X=0 -Y=0 -Width=188 -Height=170 - -[Sequences] -DontTurn=1 diff --git a/iklowns/data/ground1.bmp b/iklowns/data/ground1.bmp deleted file mode 100644 index c1d08cb..0000000 Binary files a/iklowns/data/ground1.bmp and /dev/null differ diff --git a/iklowns/data/ground1.tle b/iklowns/data/ground1.tle deleted file mode 100644 index 1d408db..0000000 Binary files a/iklowns/data/ground1.tle and /dev/null differ diff --git a/iklowns/data/iklowns.pal b/iklowns/data/iklowns.pal deleted file mode 100644 index 4fc3c3c..0000000 Binary files a/iklowns/data/iklowns.pal and /dev/null differ diff --git a/iklowns/data/instruct.bmp b/iklowns/data/instruct.bmp deleted file mode 100644 index 8b50459..0000000 Binary files a/iklowns/data/instruct.bmp and /dev/null differ diff --git a/iklowns/data/intro.bmp b/iklowns/data/intro.bmp deleted file mode 100644 index d462569..0000000 Binary files a/iklowns/data/intro.bmp and /dev/null differ diff --git a/iklowns/data/klown.mid b/iklowns/data/klown.mid deleted file mode 100644 index d22cc4c..0000000 Binary files a/iklowns/data/klown.mid and /dev/null differ diff --git a/iklowns/data/load.bmp b/iklowns/data/load.bmp deleted file mode 100644 index ed52811..0000000 Binary files a/iklowns/data/load.bmp and /dev/null differ diff --git a/iklowns/data/nyuk.wav b/iklowns/data/nyuk.wav deleted file mode 100644 index 9fdb5ef..0000000 Binary files a/iklowns/data/nyuk.wav and /dev/null differ diff --git a/iklowns/data/pie.bmp b/iklowns/data/pie.bmp deleted file mode 100644 index e039368..0000000 Binary files a/iklowns/data/pie.bmp and /dev/null differ diff --git a/iklowns/data/pie.spr b/iklowns/data/pie.spr deleted file mode 100644 index 90384f5..0000000 --- a/iklowns/data/pie.spr +++ /dev/null @@ -1,32 +0,0 @@ -[Sequences] -Pie=4 - -[Pie] -pie0.bmp=1 -pie1.bmp=1 -pie2.bmp=1 -pie3.bmp=1 - -[pie0.bmp] -x=1 -y=0 -width=8 -height=13 - -[pie1.bmp] -x=12 -y=0 -width=8 -height=13 - -[pie2.bmp] -x=1 -y=15 -width=8 -height=13 - -[pie3.bmp] -x=12 -y=15 -width=8 -height=13 diff --git a/iklowns/data/piefly.bmp b/iklowns/data/piefly.bmp deleted file mode 100644 index 8df56e8..0000000 Binary files a/iklowns/data/piefly.bmp and /dev/null differ diff --git a/iklowns/data/piefly.spr b/iklowns/data/piefly.spr deleted file mode 100644 index ab4ef46..0000000 --- a/iklowns/data/piefly.spr +++ /dev/null @@ -1,77 +0,0 @@ -[FlyLeft] -Piefll01.dib=1 -Piefll02.dib=1 -Piefll03.dib=1 -Piefll04.dib=1 -Piefll05.dib=1 - -[Piefll01.dib] -X=0 -Y=0 -Width=22 -Height=21 - -[Piefll02.dib] -X=22 -Y=0 -Width=22 -Height=21 - -[Piefll03.dib] -X=44 -Y=0 -Width=22 -Height=21 - -[Piefll04.dib] -X=66 -Y=0 -Width=22 -Height=21 - -[Piefll05.dib] -X=88 -Y=0 -Width=22 -Height=21 - -[Sequences] -FlyLeft=5 -FlyRight=5 - -[FlyRight] -Pieflr01.dib=1 -Pieflr02.dib=1 -Pieflr03.dib=1 -Pieflr04.dib=1 -Pieflr05.dib=1 - -[Pieflr01.dib] -X=0 -Y=21 -Width=22 -Height=21 - -[Pieflr02.dib] -X=22 -Y=21 -Width=22 -Height=21 - -[Pieflr03.dib] -X=44 -Y=21 -Width=22 -Height=21 - -[Pieflr04.dib] -X=66 -Y=21 -Width=22 -Height=21 - -[Pieflr05.dib] -X=88 -Y=21 -Width=22 -Height=21 diff --git a/iklowns/data/piehit2.wav b/iklowns/data/piehit2.wav deleted file mode 100644 index cf181b5..0000000 Binary files a/iklowns/data/piehit2.wav and /dev/null differ diff --git a/iklowns/data/plane.bmp b/iklowns/data/plane.bmp deleted file mode 100644 index 679b828..0000000 Binary files a/iklowns/data/plane.bmp and /dev/null differ diff --git a/iklowns/data/plane.spr b/iklowns/data/plane.spr deleted file mode 100644 index 3e2590f..0000000 --- a/iklowns/data/plane.spr +++ /dev/null @@ -1,109 +0,0 @@ -[Fly] -Plane-01.dib=1 -Plane-02.dib=1 -Plane-03.dib=1 -Plane-04.dib=1 -Plane-05.dib=1 -Plane-06.dib=1 -Plane-07.dib=1 -Plane-08.dib=1 -Plane-09.dib=1 -Plane-10.dib=1 -Plane-11.dib=1 -Plane-12.dib=1 -Plane-13.dib=1 -Plane-14.dib=1 -Plane-15.dib=1 - -[Plane-01.dib] -X=0 -Y=0 -Width=285 -Height=32 - -[Plane-02.dib] -X=285 -Y=0 -Width=285 -Height=32 - -[Plane-03.dib] -X=570 -Y=0 -Width=285 -Height=32 - -[Plane-04.dib] -X=855 -Y=0 -Width=285 -Height=32 - -[Plane-05.dib] -X=1140 -Y=0 -Width=285 -Height=32 - -[Plane-06.dib] -X=1425 -Y=0 -Width=285 -Height=32 - -[Plane-07.dib] -X=1710 -Y=0 -Width=285 -Height=32 - -[Plane-08.dib] -X=1995 -Y=0 -Width=285 -Height=32 - -[Plane-09.dib] -X=2280 -Y=0 -Width=285 -Height=32 - -[Plane-10.dib] -X=2565 -Y=0 -Width=285 -Height=32 - -[Plane-11.dib] -X=2850 -Y=0 -Width=285 -Height=32 - -[Plane-12.dib] -X=3135 -Y=0 -Width=285 -Height=32 - -[Plane-13.dib] -X=3420 -Y=0 -Width=285 -Height=32 - -[Plane-14.dib] -X=3705 -Y=0 -Width=285 -Height=32 - -[Plane-15.dib] -X=3990 -Y=0 -Width=285 -Height=32 - -[Sequences] -Fly=15 diff --git a/iklowns/data/plane.wav b/iklowns/data/plane.wav deleted file mode 100644 index 2bb51ee..0000000 Binary files a/iklowns/data/plane.wav and /dev/null differ diff --git a/iklowns/data/rollcost.bmp b/iklowns/data/rollcost.bmp deleted file mode 100644 index 8996627..0000000 Binary files a/iklowns/data/rollcost.bmp and /dev/null differ diff --git a/iklowns/data/rollcost.tle b/iklowns/data/rollcost.tle deleted file mode 100644 index 025fad2..0000000 Binary files a/iklowns/data/rollcost.tle and /dev/null differ diff --git a/iklowns/data/run.wav b/iklowns/data/run.wav deleted file mode 100644 index d3c9cf6..0000000 Binary files a/iklowns/data/run.wav and /dev/null differ diff --git a/iklowns/data/sideattr.bmp b/iklowns/data/sideattr.bmp deleted file mode 100644 index c2aa886..0000000 Binary files a/iklowns/data/sideattr.bmp and /dev/null differ diff --git a/iklowns/data/sideattr.tle b/iklowns/data/sideattr.tle deleted file mode 100644 index 7f5c108..0000000 Binary files a/iklowns/data/sideattr.tle and /dev/null differ diff --git a/iklowns/data/sideb.bmp b/iklowns/data/sideb.bmp deleted file mode 100644 index b8c2bd7..0000000 Binary files a/iklowns/data/sideb.bmp and /dev/null differ diff --git a/iklowns/data/sideb.tle b/iklowns/data/sideb.tle deleted file mode 100644 index c5d5864..0000000 Binary files a/iklowns/data/sideb.tle and /dev/null differ diff --git a/iklowns/data/sidef.bmp b/iklowns/data/sidef.bmp deleted file mode 100644 index 16c2899..0000000 Binary files a/iklowns/data/sidef.bmp and /dev/null differ diff --git a/iklowns/data/sidef.tle b/iklowns/data/sidef.tle deleted file mode 100644 index 083fa3f..0000000 Binary files a/iklowns/data/sidef.tle and /dev/null differ diff --git a/iklowns/data/splash.bmp b/iklowns/data/splash.bmp deleted file mode 100644 index d8b7a0b..0000000 Binary files a/iklowns/data/splash.bmp and /dev/null differ diff --git a/iklowns/data/throw.wav b/iklowns/data/throw.wav deleted file mode 100644 index 5d44698..0000000 Binary files a/iklowns/data/throw.wav and /dev/null differ diff --git a/iklowns/data/walk.wav b/iklowns/data/walk.wav deleted file mode 100644 index 468fbfc..0000000 Binary files a/iklowns/data/walk.wav and /dev/null differ diff --git a/iklowns/data/woob.wav b/iklowns/data/woob.wav deleted file mode 100644 index c8a4d0f..0000000 Binary files a/iklowns/data/woob.wav and /dev/null differ diff --git a/iklowns/iklowns.exe b/iklowns/iklowns.exe deleted file mode 100755 index f50f663..0000000 Binary files a/iklowns/iklowns.exe and /dev/null differ diff --git a/iklowns/iklowns.gam b/iklowns/iklowns.gam deleted file mode 100644 index ca89fe8..0000000 --- a/iklowns/iklowns.gam +++ /dev/null @@ -1,240 +0,0 @@ -[General] -useddraw=1 -doublebuffer=1 -; Sound Modes: 0=DirectSound, 1=waveOut, 2=sndPlaySound -soundmode=0 -dlls=krusty.dll,misc.dll -datapath=data -; If two-players on one machine, character for second klown -SecondKlown=Klown2 -; If one-player, computer generated klown... -RoboKlown=Klown2 -; If n-players, character for remote klowns -RemoteKlown=Klown2 -; if ForceProfile is given, real machine is ignored & this profile is used -;ForceProfile=Full - -[Profiles] -; processor, bus type, min system memory, min vid memory, video software -; see cgglobals.h for definitions of values -Full=3,3,8,1,1 -Med=3,0,8,1,1 -Low=0,0,0,0,1 - -[KRUSTY.DLL] -aggression=5 -mobility=15 -fastklown=0 -fastvel=200 -debugout=0 -piespeed=200 -pierange=600 -MouseSensitivity=75 -JoystickSensitivity=33 -RunThreshold=50 -RemoteUpdateInterval=1000 -RemoteTimeout=30 - -[Levels] -Rumble=1 - -[Rumble] -Full=RumbleFull -Med=RumbleMed -Low=RumbleLow -Bare=RumbleBare -; NOTE: must always have a Default -Default=RumbleGDI - -[IntroScreens] -Bitmap=credits.BMP,instruct.BMP -Delay=4 - -[OptionScreens] -Bitmap=BACKDROP.BMP -TextRect=150,100,590,380 -DefaultColor=255,0,0 -DefaultShadow=149,149,149 -SelectColor=255,255,255 -SelectShadow=0,0,0 -FontFamily=SS_TIMES -MouseSensitivity=75 -JoystickSensitivity=33 -Timeout=30 - -[CreditScreens] -Bitmap=BACKDROP.BMP -TextRect=100,5,590,475 -DefaultColor=255,255,0 -DefaultShadow=0,0,0 -FontFamily=SS_TIMES -LinesPerScreen=12 -ScrollRate=2 -Music=KLOWN.MID - -[LoadingScreens] -Bitmap=LOAD.BMP -HotSpot=333,273 -DefaultColor=255,0,0 -DefaultShadow=0,0,0 -FontFamily=SS_TIMES -TextRect=100,350,600,400 -SoundStart=blow1.wav,63,loop -SoundUpdate=blow2.wav,63,noloop -SoundEnd=bang.wav,127,noloop -Music=KLOWN.MID - -[RumbleFull] -WorldX=1920 -WorldY=704 -StartX=-390 -StartY=-240 -Music=KLOWN.MID -Palette=iklowns.pal -Graphics=RumbleGraphicsFull -WinLose=CREDIT.BMP - -[RumbleMed] -WorldX=1920 -WorldY=704 -StartX=-390 -StartY=-240 -Music=KLOWN.MID -Palette=iklowns.pal -Graphics=RumbleGraphicsMed -WinLose=CREDIT.BMP - -[RumbleLow] -WorldX=1920 -WorldY=704 -StartX=-390 -StartY=-240 -Music=KLOWN.MID -Palette=iklowns.pal -Graphics=RumbleGraphicsLow -WinLose=CREDIT.BMP - -[RumbleBare] -WorldX=1920 -WorldY=704 -StartX=-390 -StartY=-240 -Music=KLOWN.MID -Palette=iklowns.pal -Graphics=RumbleGraphicsBare -WinLose=CREDIT.BMP - -[RumbleGDI] -WorldX=1920 -WorldY=704 -StartX=-390 -StartY=-240 -Music=KLOWN.MID -Palette=iklowns.pal -Graphics=RumbleGraphicsLow -WinLose=CREDIT.BMP - -; graphics list for full profile (pentium, PCI, etc.) -[RumbleGraphicsFull] -Sky=Sky -sidef=TiledImage,14,-960,-105 -foreg1=TiledImage,1,-960,115 -BigTBig=TiledImage,20,-400,-40 -RollCost=TiledImage,72,100,-5 -BigTop=TiledImage,60,200,30 -BigTSml=TiledImage,70,40,104 -sideb=TiledImage,15,-960,-40 -ground1=TiledImage,13,-960,80 -; note: numbers are: zmin, zmax, xpos, ypos, numactions, preload, remote object name -; The actions MUST match the number of actions actually defined... -Ferris=Character,128,128,-60,20,1,1 -Plane=Character,129,129,700,0,1,1 -Cloud1=Character,180,180,300,0,1,1 -Cloud2=Character,260,260,350,50,1,1 -Cloud3=Character,340,340,0,40,1,1 -Klown=Character,2,12,-210,30,32,1,Klown2 -Klown2=Character,2,12,210,30,32,0 -Pie=Character,255,255,500,0,2,0 - -; graphics list for med profile (same as full with no PCI) -[RumbleGraphicsMed] -Sky=Sky -sidef=TiledImage,14,-960,-105 -foreg1=TiledImage,1,-960,115 -;BigTBig=TiledImage,20,-400,-40 -;RollCost=TiledImage,72,100,-5 -BigTop=TiledImage,60,200,30 -BigTSml=TiledImage,70,40,104 -sideb=TiledImage,15,-960,-40 -ground1=TiledImage,13,-960,80 -; note: numbers are: zmin, zmax, xpos, ypos, numactions, preload, remote object name -; The actions MUST match the number of actions actually defined... -StaticFerris=Character,128,128,-60,20,1,1 -Plane=Character,129,129,700,0,1,1 -Cloud1=Character,180,180,300,0,1,1 -;Cloud2=Character,260,260,350,50,1,1 -;Cloud3=Character,340,340,0,40,1,1 -Klown=Character,2,12,-210,30,32,1,Klown2 -Klown2=Character,2,12,210,30,32,0 -Pie=Character,255,255,500,0,2,0 - -; graphics list for low profile (dog slow machine) -[RumbleGraphicsLow] -Sky=Sky -sidef=TiledImage,14,-960,-105 -;foreg1=TiledImage,1,-960,115 -;BigTBig=TiledImage,20,-400,-40 -;RollCost=TiledImage,72,100,-5 -BigTop=TiledImage,60,200,30 -;BigTSml=TiledImage,70,40,104 -sideb=TiledImage,15,-960,-40 -ground1=TiledImage,13,-960,80 -; note: numbers are: zmin, zmax, xpos, ypos, numactions, preload, remote object name -; The actions MUST match the number of actions actually defined... -StaticFerris=Character,128,128,-60,20,1,1 -;Plane=Character,129,129,700,0,1,1 -Cloud1=Character,180,180,300,0,1,1 -;Cloud2=Character,260,260,350,50,1,1 -;Cloud3=Character,340,340,0,40,1,1 -Klown=Character,2,12,-210,30,32,1,Klown2 -Klown2=Character,2,12,210,30,32,0 -Pie=Character,255,255,500,0,2,0 - -; graphics list for bare profile (testing) -[RumbleGraphicsBare] -Sky=Sky -;sidef=TiledImage,14,-960,-105 -;foreg1=TiledImage,1,-960,115 -;BigTBig=TiledImage,20,-400,-40 -;RollCost=TiledImage,72,100,-5 -;BigTop=TiledImage,60,200,30 -;BigTSml=TiledImage,70,40,104 -;sideb=TiledImage,15,-960,-40 -ground1=TiledImage,13,-960,80 -; note: numbers are: zmin, zmax, xpos, ypos, numactions, preload, remote object name -; The actions MUST match the number of actions actually defined... -;StaticFerris=Character,128,128,-60,20,1,1 -;Plane=Character,129,129,700,0,1,1 -;Cloud1=Character,180,180,300,0,1,1 -;Cloud2=Character,260,260,350,50,1,1 -;Cloud3=Character,340,340,0,40,1,1 -Klown=Character,2,12,-210,30,32,1,Klown2 -Klown2=Character,2,12,210,30,32,0 -Pie=Character,255,255,500,0,2,0 - - -[Ferris] -Turn=0 - -[Turn] -SequenceFile=fw0.spr -SequenceName=Turn -Rate=15 - -[StaticFerris] -DontTurn=0 - -[DontTurn] -SequenceFile=fwstatic.spr -SequenceName=DontTurn - diff --git a/iklowns/iklowns.ovl b/iklowns/iklowns.ovl deleted file mode 100644 index aabcd33..0000000 Binary files a/iklowns/iklowns.ovl and /dev/null differ diff --git a/iklowns/krusty.dll b/iklowns/krusty.dll deleted file mode 100644 index 4c5f85f..0000000 Binary files a/iklowns/krusty.dll and /dev/null differ diff --git a/iklowns/misc.dll b/iklowns/misc.dll deleted file mode 100644 index 037c4ac..0000000 Binary files a/iklowns/misc.dll and /dev/null differ diff --git a/rockem/arena.x b/rockem/arena.x deleted file mode 100644 index fad6f8e..0000000 --- a/rockem/arena.x +++ /dev/null @@ -1,1450 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -Header { - 1; - 0; - 1; -} - -Mesh { - 164; - -509.760864;-418.136444;-863.679443;, - -466.708588;-418.137299;890.074646;, - -605.528442;-95.125122;678.490051;, - -998.383423;-418.136810;-48.462238;, - -880.561401;-418.136627;-474.215302;, - -738.448608;-418.136505;-676.000427;, - -139.410217;-418.136322;-996.193115;, - 205.181686;-418.136322;-987.733948;, - 483.728363;-418.136444;-888.068176;, - 818.229065;-418.136566;-599.525757;, - 986.405762;-418.136749;-243.946945;, - 1005.706177;-418.136932;148.922470;, - 818.229065;-418.137115;601.532104;, - 439.531586;-418.137299;912.321655;, - 156.429657;-418.137360;998.199402;, - -284.128326;-418.137299;965.702087;, - -801.209717;-418.137115;601.532104;, - -988.686340;-418.136932;148.922470;, - 997.246643;-188.884811;197.675293;, - 895.455627;-95.124893;223.171524;, - 742.920349;-95.125015;545.679260;, - 846.720764;-188.885056;561.077759;, - 648.046570;-188.885162;780.280945;, - 553.185669;-95.125153;735.414001;, - 348.130768;-188.885239;950.181030;, - 230.678268;-95.125198;887.949036;, - 57.975639;-188.885315;1007.896545;, - -125.652954;-95.125076;905.454468;, - -139.410217;-188.885284;998.199585;, - -331.111328;-188.885239;950.181030;, - -382.424255;-95.125160;827.563660;, - -631.026794;-188.885162;780.280945;, - -880.561401;-188.885025;476.221832;, - -836.237000;-95.124939;350.908905;, - -980.227173;-188.884811;197.675293;, - -895.941040;-95.124672;135.165833;, - -895.941040;-95.124680;-133.159500;, - -980.227173;-188.884689;-195.668777;, - -922.860046;-188.884583;-384.782928;, - -818.050415;-95.124565;-389.930847;, - -801.209717;-188.884430;-599.525757;, - -638.031372;-95.124420;-645.538086;, - -592.019043;-188.884384;-808.716370;, - -341.395660;-95.124344;-843.743652;, - -284.128326;-188.884277;-963.695496;, - -90.301964;-188.884277;-1002.249756;, - -36.355202;-95.124306;-912.242737;, - 253.460159;-188.884277;-976.892639;, - 273.930817;-95.124313;-873.972717;, - 609.038818;-188.884384;-808.716370;, - 622.547852;-95.124420;-676.483704;, - 721.349487;-188.884430;-711.836487;, - 853.256714;-95.124603;-348.902466;, - 939.879883;-188.884583;-384.782928;, - 1015.403198;-188.884735;-48.462208;, - 921.756226;-95.124718;-43.862041;, - -412.364868;-95.124382;-658.926392;, - -524.849854;-95.124451;-546.426147;, - -636.946472;-95.124504;-441.080963;, - -686.756287;-95.124550;-351.057495;, - -725.945435;-95.124588;-268.492096;, - 426.350616;-95.124367;-660.925049;, - 404.913300;-95.124359;-674.393066;, - -268.926666;-95.124496;-424.244751;, - -774.182434;-95.124657;-4.997503;, - -744.480225;-95.124634;-155.931580;, - -499.258789;-95.124687;-4.997503;, - -141.506195;-95.124588;-215.769913;, - -180.116196;-95.124619;-172.606064;, - -230.511444;-95.124680;-109.106934;, - 262.796906;-95.124489;-439.001526;, - -255.041565;-95.124763;-4.997503;, - -240.241516;-95.124725;-60.986412;, - 527.804749;-95.124420;-573.076050;, - -121.273987;-95.124832;75.974876;, - -141.310745;-95.124779;1.196889;, - -121.274124;-95.124725;-73.581116;, - -66.532890;-95.124695;-128.322464;, - 8.245086;-95.124680;-148.359268;, - 136.553513;-95.124634;-229.900833;, - 83.023079;-95.124702;-128.322647;, - -339.386353;-95.125191;702.153198;, - -239.844910;-95.125069;478.473114;, - -127.782547;-95.124924;226.657135;, - -63.752640;-95.124924;244.517105;, - 189.934555;-95.124672;-177.455978;, - 237.352859;-95.124695;-130.869339;, - 157.801254;-95.124771;1.196710;, - 83.023346;-95.124847;130.716019;, - 8.245354;-95.124870;150.752762;, - -66.532639;-95.124870;130.716110;, - 137.764450;-95.124733;-73.581451;, - -194.079697;-95.125153;743.516235;, - -87.321465;-95.125099;777.463013;, - 8.329406;-95.124916;264.622955;, - 72.383354;-95.124886;246.850861;, - 144.492859;-95.124840;226.843842;, - 272.529541;-95.124718;5.989942;, - 255.981567;-95.124702;-58.392082;, - 137.764587;-95.124802;75.974716;, - -36.737411;-95.125107;779.131714;, - 75.287613;-95.125145;779.404297;, - 246.068604;-95.125175;737.264404;, - 262.455902;-95.124985;440.721069;, - 372.871857;-95.125175;693.328247;, - 395.254669;-95.125168;681.496704;, - 546.636292;-95.124756;-22.868746;, - 753.291687;-95.124664;-195.022186;, - 729.310852;-95.124596;-304.452942;, - 705.464294;-95.124565;-349.093567;, - 649.686829;-95.124504;-446.248199;, - 790.122864;-95.124741;-48.503696;, - 8.329406;-92.201492;264.622955;, - 125.697510;-92.201477;774.895813;, - -112.442253;-92.201477;774.316345;, - 144.492859;-92.201309;226.843719;, - 395.254669;-92.201469;681.496643;, - -339.386353;-92.201485;702.153015;, - -127.782547;-92.201309;226.657028;, - -141.506195;-92.201347;-215.769928;, - -223.580521;-92.201324;-124.015350;, - -651.477112;-92.201118;-419.781830;, - -734.782532;-92.201363;-244.270538;, - -774.182434;-92.201332;-4.997512;, - -255.041565;-92.201332;-4.997512;, - -412.364868;-92.201378;-658.926453;, - 237.352859;-92.201401;-130.869324;, - 620.578003;-92.201149;-487.649506;, - 739.146057;-92.201248;-281.124725;, - 136.553482;-92.201172;-229.900818;, - 404.913361;-92.201088;-674.393250;, - 790.122986;-92.201355;-48.503719;, - 272.529480;-92.201271;5.989976;, - 157.801254;-92.277321;1.196713;, - 137.764587;-92.277328;75.974716;, - 8.245265;-92.277321;1.196759;, - 83.023346;-92.277336;130.716019;, - 8.245354;-92.277344;150.752762;, - -66.532639;-92.277336;130.716110;, - -121.273987;-92.277328;75.974876;, - -141.310745;-92.277321;1.196893;, - -121.274124;-92.277290;-73.581116;, - -66.532890;-92.277283;-128.322464;, - 8.245086;-92.277275;-148.359268;, - 83.023079;-92.277283;-128.322647;, - 137.764450;-92.277290;-73.581451;, - -605.528442;-95.125153;678.490051;, - 895.455627;-95.124893;223.171524;, - 742.920349;-95.125015;545.679260;, - 553.185669;-95.125153;735.414001;, - 230.678268;-95.125198;887.949036;, - -125.652954;-95.125076;905.454468;, - -382.424255;-95.125191;827.563660;, - -836.237000;-95.124939;350.908905;, - -895.941040;-95.124672;135.165833;, - -895.941040;-95.124680;-133.159500;, - -818.050415;-95.124565;-389.930847;, - -638.031372;-95.124420;-645.538086;, - -341.395660;-95.124374;-843.743652;, - -36.355202;-95.124306;-912.242737;, - 273.930817;-95.124313;-873.972717;, - 622.547852;-95.124420;-676.483704;, - 853.256714;-95.124603;-348.902466;, - 921.756226;-95.124718;-43.862041;; - - 222; - 3;37,4,3;, - 3;38,4,37;, - 3;40,4,38;, - 3;40,5,4;, - 3;42,5,40;, - 3;42,0,5;, - 3;44,0,42;, - 3;44,6,0;, - 3;45,6,44;, - 3;45,7,6;, - 3;47,7,45;, - 3;47,8,7;, - 3;49,8,47;, - 3;49,9,8;, - 3;51,9,49;, - 3;53,9,51;, - 3;53,10,9;, - 3;54,10,53;, - 3;54,11,10;, - 3;18,11,54;, - 3;18,12,11;, - 3;21,12,18;, - 3;22,12,21;, - 3;22,13,12;, - 3;24,13,22;, - 3;24,14,13;, - 3;26,14,24;, - 3;26,15,14;, - 3;28,15,26;, - 3;29,15,28;, - 3;31,1,29;, - 3;29,1,15;, - 3;31,16,1;, - 3;32,16,31;, - 3;32,17,16;, - 3;34,17,32;, - 3;37,3,34;, - 3;34,3,17;, - 3;54,19,18;, - 3;19,20,18;, - 3;18,20,21;, - 3;20,23,21;, - 3;21,23,22;, - 3;24,22,23;, - 3;23,25,24;, - 3;26,24,25;, - 3;27,26,25;, - 3;28,26,27;, - 3;27,30,28;, - 3;28,30,29;, - 3;31,29,30;, - 3;2,31,30;, - 3;32,31,2;, - 3;2,33,32;, - 3;34,32,33;, - 3;35,34,33;, - 3;35,36,34;, - 3;37,34,36;, - 3;38,37,36;, - 3;39,38,36;, - 3;38,39,40;, - 3;41,40,39;, - 3;42,40,41;, - 3;41,43,42;, - 3;44,42,43;, - 3;43,46,44;, - 3;44,46,45;, - 3;45,46,47;, - 3;46,48,47;, - 3;49,47,48;, - 3;50,49,48;, - 3;51,49,50;, - 3;50,52,51;, - 3;53,51,52;, - 3;54,53,55;, - 3;55,53,52;, - 3;19,54,55;, - 3;83,82,81;, - 3;84,83,81;, - 3;81,92,94;, - 3;94,84,81;, - 3;92,93,95;, - 3;95,94,92;, - 3;96,95,93;, - 3;93,100,103;, - 3;103,96,93;, - 3;100,101,103;, - 3;102,104,105;, - 3;101,102,103;, - 3;105,103,102;, - 3;112,114,113;, - 3;112,113,115;, - 3;115,113,116;, - 3;114,112,117;, - 3;117,112,118;, - 3;119,121,120;, - 3;120,121,122;, - 3;120,122,123;, - 3;120,123,124;, - 3;121,119,125;, - 3;126,128,127;, - 3;126,127,129;, - 3;129,127,130;, - 3;128,126,131;, - 3;131,126,132;, - 3;133,135,134;, - 3;134,135,136;, - 3;136,135,137;, - 3;137,135,138;, - 3;138,135,139;, - 3;139,135,140;, - 3;140,135,141;, - 3;141,135,142;, - 3;142,135,143;, - 3;143,135,144;, - 3;144,135,145;, - 3;145,135,133;, - 3;121,125,57;, - 3;56,57,125;, - 3;121,57,58;, - 3;58,59,121;, - 3;59,122,121;, - 3;59,60,122;, - 3;125,63,56;, - 3;60,123,122;, - 3;60,65,123;, - 3;119,63,125;, - 3;127,73,130;, - 3;130,73,61;, - 3;130,61,62;, - 3;123,64,66;, - 3;65,64,123;, - 3;119,67,63;, - 3;66,124,123;, - 3;71,124,66;, - 3;119,120,67;, - 3;68,67,120;, - 3;69,68,120;, - 3;120,72,69;, - 3;70,130,62;, - 3;70,129,130;, - 3;79,129,70;, - 3;71,120,124;, - 3;120,71,72;, - 3;127,110,73;, - 3;129,79,85;, - 3;139,74,90;, - 3;90,138,139;, - 3;139,140,74;, - 3;140,141,75;, - 3;74,140,75;, - 3;76,75,141;, - 3;141,142,76;, - 3;77,76,142;, - 3;142,143,77;, - 3;143,144,78;, - 3;77,143,78;, - 3;144,145,80;, - 3;78,144,80;, - 3;117,81,92;, - 3;117,118,81;, - 3;118,83,82;, - 3;118,112,83;, - 3;81,118,82;, - 3;83,112,84;, - 3;84,112,94;, - 3;98,126,86;, - 3;126,129,86;, - 3;85,86,129;, - 3;134,99,133;, - 3;133,99,87;, - 3;136,137,88;, - 3;137,138,89;, - 3;88,137,89;, - 3;89,138,90;, - 3;145,133,91;, - 3;145,91,80;, - 3;133,87,91;, - 3;92,114,117;, - 3;114,92,93;, - 3;100,114,93;, - 3;112,115,94;, - 3;115,95,94;, - 3;115,116,96;, - 3;95,115,96;, - 3;116,103,96;, - 3;132,126,97;, - 3;97,126,98;, - 3;134,136,99;, - 3;99,136,88;, - 3;100,113,114;, - 3;113,100,101;, - 3;113,101,102;, - 3;102,116,113;, - 3;104,116,102;, - 3;103,116,105;, - 3;106,132,97;, - 3;116,104,105;, - 3;106,131,132;, - 3;131,111,107;, - 3;107,128,131;, - 3;107,108,128;, - 3;128,108,109;, - 3;109,127,128;, - 3;127,109,110;, - 3;111,131,106;, - 3;156,155,157;, - 3;157,155,158;, - 3;158,155,159;, - 3;159,155,160;, - 3;160,155,161;, - 3;161,155,154;, - 3;161,154,153;, - 3;161,153,146;, - 3;161,146,152;, - 3;161,152,151;, - 3;161,151,150;, - 3;161,150,149;, - 3;161,149,162;, - 3;162,149,148;, - 3;162,148,147;, - 3;162,147,163;; - - MeshMaterialList { - 3; - 222; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2; - Material { - 1.000000;1.000000;0.000000;1.000000;; - 29.000000; - 0.768627;0.768627;0.768627;; - 0.000000;0.000000;0.000000;; - TextureFilename { - "gdk_fill.ppm"; - } - } - Material { - 0.066667;0.066667;0.066667;1.000000;; - 25.000000; - 1.000000;1.000000;1.000000;; - 0.000000;0.000000;0.000000;; - } - Material { - 1.000000;1.000000;1.000000;1.000000;; - 15.000000; - 0.000000;0.000000;0.000000;; - 0.000000;0.000000;0.000000;; - TextureFilename { - "gdk_fill.ppm"; - } - } - } - MeshNormals { - 281; - -0.478434;-0.023088;-0.877820;, - -0.513663;-0.019389;0.857773;, - -0.501055;0.722024;0.477100;, - -0.997321;0.003663;-0.073064;, - -0.910930;-0.039890;-0.410627;, - -0.724168;-0.010650;-0.689541;, - -0.170866;-0.031963;-0.984776;, - 0.146440;-0.008894;-0.989180;, - 0.478056;-0.014197;-0.878215;, - 0.807875;-0.032077;-0.588481;, - 0.971451;-0.033798;-0.234820;, - 0.989704;-0.037440;0.138148;, - 0.782155;-0.051683;0.620936;, - 0.477863;-0.040690;0.877491;, - 0.139034;-0.024856;0.989976;, - -0.188979;-0.046382;0.980885;, - -0.797178;-0.046338;0.601964;, - -0.965095;-0.040664;0.258724;, - 0.972871;-0.013218;0.230969;, - 0.669600;0.711620;0.212679;, - 0.697325;0.701086;0.149052;, - 0.617521;0.692520;0.372939;, - 0.844771;-0.010578;0.535024;, - 0.557100;0.717609;0.417943;, - 0.628008;-0.017369;0.778013;, - 0.437782;0.708062;0.554071;, - 0.422888;0.712077;0.560457;, - 0.328933;0.017757;0.944186;, - 0.265524;0.701979;0.660850;, - 0.154368;0.733160;0.662304;, - 0.024493;-0.047537;0.998569;, - 0.047594;0.715499;0.696991;, - -0.070257;0.728736;0.681181;, - -0.146855;-0.047353;0.988024;, - -0.134349;0.722061;0.678659;, - -0.374975;0.021236;0.926792;, - -0.268212;0.707827;0.653485;, - -0.282169;0.713143;0.641723;, - -0.646881;0.012618;0.762486;, - -0.446610;0.688458;0.571458;, - -0.889469;-0.022954;0.456419;, - -0.608299;0.702579;0.369262;, - -0.638423;0.719843;0.272475;, - -0.991217;0.023119;0.130210;, - -0.708505;0.690417;0.146100;, - -0.708948;0.699138;0.092735;, - -0.705655;0.701385;-0.100544;, - -0.981950;-0.026561;-0.187267;, - -0.705655;0.701385;-0.100544;, - -0.918966;-0.015847;-0.394019;, - -0.647672;0.708630;-0.279935;, - -0.612996;0.724978;-0.314074;, - -0.803183;0.014182;-0.595564;, - -0.569734;0.703672;-0.424557;, - -0.479766;0.730301;-0.486298;, - -0.602316;0.017757;-0.798060;, - -0.412756;0.697934;-0.585253;, - -0.284138;0.725851;-0.626423;, - -0.329137;-0.003467;-0.944276;, - -0.207799;0.712127;-0.670593;, - -0.032572;0.005332;-0.999455;, - -0.040220;0.703908;-0.709152;, - -0.035844;0.722861;-0.690063;, - 0.282509;0.028433;-0.958843;, - 0.153227;0.696015;-0.701487;, - 0.243429;0.723633;-0.645831;, - 0.545231;-0.007880;-0.838249;, - 0.371191;0.710825;-0.597449;, - 0.452377;0.734999;-0.505105;, - 0.749174;-0.007881;-0.662326;, - 0.541288;0.713241;-0.445302;, - 0.619892;0.717664;-0.317320;, - 0.913974;0.021393;-0.405209;, - 0.649879;0.707079;-0.278741;, - 0.997868;0.000082;-0.065269;, - 0.699072;0.714950;-0.012055;, - 0.705797;0.707079;-0.043472;, - -0.707155;-0.000015;-0.707059;, - 0.853247;-0.000011;-0.521507;, - -0.599156;0.517366;-0.611018;, - -0.796240;0.200626;-0.570746;, - -0.889629;0.000009;-0.456685;, - -0.932439;-0.167941;-0.319927;, - 0.519032;0.445579;-0.729428;, - 0.531977;-0.000064;-0.846759;, - -0.856075;-0.000014;-0.516851;, - 0.853247;-0.000011;-0.521507;, - 0.000000;0.000003;1.000000;, - -0.981182;-0.000000;-0.193086;, - -0.857495;-0.489219;-0.159271;, - 0.000000;0.000003;1.000000;, - 0.853247;-0.000003;-0.521507;, - 0.745330;0.000003;0.666696;, - 0.680916;0.444080;0.582362;, - 0.906795;0.000010;0.421571;, - -0.856075;-0.000014;-0.516851;, - 0.000000;0.000003;1.000000;, - 0.966793;0.000001;0.255561;, - 0.871114;-0.444071;0.209672;, - 0.672864;-0.142847;-0.725843;, - -0.707106;-0.000000;0.707108;, - -0.965926;-0.000000;0.258820;, - -0.965926;0.000000;-0.258818;, - -0.965926;-0.000001;0.258820;, - -0.965926;0.000000;-0.258818;, - -0.707108;0.000000;-0.707106;, - -0.707108;0.000000;-0.707106;, - -0.258820;0.000000;-0.965926;, - 0.258818;0.000000;-0.965926;, - -0.258820;0.000000;-0.965926;, - -0.856075;-0.000006;-0.516851;, - -0.700824;-0.000011;0.713334;, - 0.707106;0.000000;-0.707108;, - 0.258818;0.000000;-0.965926;, - -0.907564;0.114928;-0.403881;, - -0.273784;0.000060;0.961791;, - -0.913617;-0.000025;-0.406575;, - -0.208608;-0.973583;-0.092835;, - -0.913617;-0.000015;-0.406575;, - -0.907564;0.114928;-0.403881;, - -0.913617;-0.000015;-0.406575;, - 0.268675;-0.000035;-0.963231;, - -0.000000;1.000000;0.000001;, - 0.268676;-0.000038;-0.963231;, - -0.700824;-0.000011;0.713334;, - -0.866368;-0.000003;0.499407;, - 0.965926;-0.000000;0.258819;, - 0.965926;0.000000;-0.258820;, - 0.258820;-0.000000;0.965926;, - 0.707107;0.000001;0.707106;, - -0.258818;-0.000000;0.965926;, - 0.258820;-0.000001;0.965926;, - -0.707106;-0.000000;0.707108;, - -0.258818;-0.000000;0.965926;, - 0.965926;0.000000;-0.258820;, - 0.707106;0.000000;-0.707108;, - -0.000000;1.000000;0.000000;, - -0.248834;-0.482049;0.840066;, - -0.000001;1.000000;0.000000;, - -0.141809;-0.168636;0.975424;, - -0.000000;1.000000;0.000000;, - 0.000685;-0.000000;-1.000000;, - -0.000001;1.000000;0.000000;, - -0.267355;0.000003;-0.963598;, - -0.000001;1.000000;0.000000;, - 0.875644;-0.000020;-0.482957;, - -0.267354;-0.000040;-0.963598;, - -0.968520;-0.000023;0.248936;, - 0.104704;-0.000009;0.994503;, - -0.968520;-0.000001;0.248937;, - 0.965926;-0.000000;0.258819;, - 0.707107;-0.000000;0.707106;, - 0.000000;1.000000;0.000000;, - -0.013766;0.743938;0.668107;, - 0.000000;1.000000;0.000001;, - 0.094418;-0.100648;0.990432;, - 0.000001;1.000000;0.000002;, - 0.292164;-0.142842;0.945641;, - 0.000000;1.000000;0.000000;, - 0.875644;-0.000009;-0.482958;, - 0.000001;1.000000;0.000002;, - 0.372181;0.445604;0.814198;, - 0.000001;1.000000;0.000002;, - 0.875644;-0.000009;-0.482958;, - 0.467327;0.000018;0.884085;, - 0.104704;-0.000009;0.994503;, - 0.851901;-0.482114;-0.204529;, - 0.915645;-0.168639;-0.364904;, - 0.585462;0.743957;-0.322121;, - 0.810531;-0.100646;-0.576983;, - 0.969828;-0.000042;-0.243791;, - 0.104704;0.000003;0.994503;, - 0.000000;1.000000;-0.000000;, - 0.000685;-0.000018;-1.000000;, - 0.000000;1.000000;-0.000000;, - 0.172030;0.431894;0.885366;, - 0.000000;1.000000;-0.000000;, - -0.097626;0.320694;0.942138;, - -0.000001;1.000000;0.000000;, - -0.267355;0.000000;-0.963598;, - 0.875644;-0.000020;-0.482957;, - 0.000000;1.000000;0.000000;, - 0.875644;-0.000020;-0.482957;, - 0.372181;0.445601;0.814200;, - -0.000000;1.000000;-0.000000;, - -0.248834;-0.482049;0.840066;, - -0.913617;-0.000025;-0.406575;, - 0.000001;1.000000;0.000001;, - -0.913617;-0.000025;-0.406575;, - 0.268675;-0.000035;-0.963231;, - 0.000000;1.000000;0.000000;, - 0.853247;0.000001;-0.521507;, - 0.745330;0.000003;0.666696;, - 0.000000;1.000000;0.000000;, - 0.890720;0.000005;0.454553;, - 0.000000;1.000000;0.000000;, - -0.774106;0.285676;-0.564934;, - -0.000000;1.000000;0.000001;, - -0.932438;-0.167945;-0.319927;, - -0.000000;1.000000;-0.000000;, - -0.857489;-0.489230;-0.159269;, - 0.000000;0.000003;1.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;0.000003;1.000000;, - 0.966793;0.000001;0.255561;, - 0.000001;1.000000;-0.000000;, - -0.707155;-0.000023;-0.707059;, - 0.853247;-0.000011;-0.521507;, - -0.000000;1.000000;0.000001;, - -0.866368;-0.000003;0.499407;, - -0.000000;1.000000;0.000001;, - 0.680725;0.431920;-0.591657;, - -0.000000;1.000000;0.000001;, - 0.864722;0.320713;-0.386522;, - 0.000001;1.000000;0.000002;, - -0.856075;0.000000;-0.516851;, - -0.700824;-0.000011;0.713334;, - 0.000000;1.000000;0.000000;, - 0.519033;0.445576;-0.729429;, - -0.856075;-0.000014;-0.516851;, - -0.000000;1.000000;0.000000;, - 0.104704;0.000004;0.994503;, - 0.851901;-0.482114;-0.204529;, - 0.000000;1.000000;-0.000001;, - -0.968520;-0.000023;0.248936;, - 0.104704;-0.000009;0.994503;, - 0.000000;1.000000;0.000000;, - 0.965926;-0.000000;0.258819;, - 0.965926;0.000000;-0.258820;, - 0.000000;1.000000;0.000000;, - 0.965926;-0.000000;0.258819;, - 0.707107;-0.000000;0.707106;, - 0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.258820;-0.000000;0.965926;, - 0.707107;-0.000000;0.707106;, - -0.000000;1.000000;0.000000;, - 0.258820;-0.000000;0.965926;, - -0.258818;-0.000000;0.965926;, - 0.000000;1.000000;0.000000;, - -0.707106;-0.000000;0.707108;, - -0.258818;-0.000000;0.965926;, - 0.000000;1.000000;0.000000;, - -0.707106;-0.000000;0.707108;, - -0.965926;-0.000000;0.258820;, - 0.000000;1.000000;0.000000;, - -0.965926;-0.000000;0.258820;, - -0.965926;0.000000;-0.258818;, - 0.000000;1.000000;0.000000;, - -0.965926;0.000000;-0.258818;, - -0.707108;0.000000;-0.707106;, - 0.000000;1.000000;0.000000;, - -0.707108;0.000000;-0.707106;, - -0.258820;0.000000;-0.965926;, - -0.000000;1.000000;0.000000;, - -0.258820;0.000000;-0.965926;, - 0.258818;0.000000;-0.965926;, - 0.000000;1.000000;0.000000;, - 0.258818;0.000000;-0.965926;, - 0.707106;0.000000;-0.707108;, - -0.000000;1.000000;0.000000;, - 0.707106;0.000000;-0.707108;, - 0.965926;0.000000;-0.258820;, - 0.000000;1.000000;0.000001;, - 0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - 0.000000;1.000000;0.000001;, - -0.000001;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - -0.000000;1.000000;-0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - -0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - 0.000000;1.000000;0.000001;, - -0.000001;1.000000;0.000001;; - - 222; - 3;47,4,3;, - 3;49,4,47;, - 3;52,4,49;, - 3;52,5,4;, - 3;55,5,52;, - 3;55,0,5;, - 3;58,0,55;, - 3;58,6,0;, - 3;60,6,58;, - 3;60,7,6;, - 3;63,7,60;, - 3;63,8,7;, - 3;66,8,63;, - 3;66,9,8;, - 3;69,9,66;, - 3;72,9,69;, - 3;72,10,9;, - 3;74,10,72;, - 3;74,11,10;, - 3;18,11,74;, - 3;18,12,11;, - 3;22,12,18;, - 3;24,12,22;, - 3;24,13,12;, - 3;27,13,24;, - 3;27,14,13;, - 3;30,14,27;, - 3;30,15,14;, - 3;33,15,30;, - 3;35,15,33;, - 3;38,1,35;, - 3;35,1,15;, - 3;38,16,1;, - 3;40,16,38;, - 3;40,17,16;, - 3;43,17,40;, - 3;47,3,43;, - 3;43,3,17;, - 3;75,20,19;, - 3;20,21,19;, - 3;19,21,23;, - 3;21,26,23;, - 3;23,26,25;, - 3;28,25,26;, - 3;26,29,28;, - 3;31,28,29;, - 3;32,31,29;, - 3;34,31,32;, - 3;32,37,34;, - 3;34,37,36;, - 3;39,36,37;, - 3;2,39,37;, - 3;41,39,2;, - 3;2,42,41;, - 3;44,41,42;, - 3;45,44,42;, - 3;45,46,44;, - 3;48,44,46;, - 3;50,48,46;, - 3;51,50,46;, - 3;50,51,53;, - 3;54,53,51;, - 3;56,53,54;, - 3;54,57,56;, - 3;59,56,57;, - 3;57,62,59;, - 3;59,62,61;, - 3;61,62,64;, - 3;62,65,64;, - 3;67,64,65;, - 3;68,67,65;, - 3;70,67,68;, - 3;68,71,70;, - 3;73,70,71;, - 3;75,73,76;, - 3;76,73,71;, - 3;20,75,76;, - 3;119,117,114;, - 3;122,119,114;, - 3;114,136,140;, - 3;140,122,114;, - 3;136,138,142;, - 3;142,140,136;, - 3;144,142,138;, - 3;138,152,158;, - 3;158,144,138;, - 3;152,154,158;, - 3;156,160,162;, - 3;154,156,158;, - 3;162,158,156;, - 3;172,176,174;, - 3;172,174,178;, - 3;178,174,181;, - 3;176,172,184;, - 3;184,172,187;, - 3;190,195,193;, - 3;193,195,197;, - 3;193,197,199;, - 3;193,199,202;, - 3;195,190,205;, - 3;208,212,210;, - 3;208,210,214;, - 3;214,210,217;, - 3;212,208,220;, - 3;220,208,223;, - 3;226,232,229;, - 3;229,232,233;, - 3;233,232,236;, - 3;236,232,239;, - 3;239,232,242;, - 3;242,232,245;, - 3;245,232,248;, - 3;248,232,251;, - 3;251,232,254;, - 3;254,232,257;, - 3;257,232,260;, - 3;260,232,226;, - 3;196,206,79;, - 3;77,79,206;, - 3;196,79,80;, - 3;80,81,196;, - 3;81,198,196;, - 3;81,82,198;, - 3;207,86,78;, - 3;82,200,198;, - 3;82,89,200;, - 3;191,86,207;, - 3;211,99,218;, - 3;218,99,83;, - 3;218,83,84;, - 3;201,87,90;, - 3;89,88,200;, - 3;191,91,86;, - 3;90,203,201;, - 3;96,203,90;, - 3;192,194,92;, - 3;93,92,194;, - 3;94,93,194;, - 3;194,98,94;, - 3;95,219,85;, - 3;95,215,219;, - 3;110,215,95;, - 3;97,194,204;, - 3;194,97,98;, - 3;211,169,99;, - 3;216,111,124;, - 3;243,100,132;, - 3;132,240,243;, - 3;244,246,101;, - 3;247,249,102;, - 3;101,246,103;, - 3;104,102,249;, - 3;250,252,105;, - 3;106,105,252;, - 3;253,255,107;, - 3;256,258,108;, - 3;107,255,109;, - 3;259,261,112;, - 3;108,258,113;, - 3;185,115,137;, - 3;186,188,116;, - 3;188,120,118;, - 3;189,173,121;, - 3;116,188,118;, - 3;121,173,123;, - 3;123,173,141;, - 3;149,209,125;, - 3;209,216,125;, - 3;124,125,216;, - 3;230,150,227;, - 3;227,150,126;, - 3;234,237,128;, - 3;238,241,130;, - 3;128,237,131;, - 3;130,241,133;, - 3;262,228,134;, - 3;261,135,112;, - 3;228,127,134;, - 3;137,177,185;, - 3;177,137,139;, - 3;153,177,139;, - 3;173,179,141;, - 3;179,143,141;, - 3;180,182,145;, - 3;143,179,146;, - 3;182,159,145;, - 3;224,209,147;, - 3;147,209,149;, - 3;231,235,151;, - 3;151,235,129;, - 3;153,175,177;, - 3;175,153,155;, - 3;175,155,157;, - 3;157,183,175;, - 3;161,183,157;, - 3;159,182,163;, - 3;165,225,148;, - 3;183,161,164;, - 3;165,221,225;, - 3;222,170,166;, - 3;166,213,222;, - 3;166,167,213;, - 3;213,167,168;, - 3;168,211,213;, - 3;211,168,169;, - 3;171,221,165;, - 3;273,272,274;, - 3;274,272,275;, - 3;275,272,276;, - 3;276,272,277;, - 3;277,272,278;, - 3;278,272,271;, - 3;278,271,270;, - 3;278,270,263;, - 3;278,263,269;, - 3;278,269,268;, - 3;278,268,267;, - 3;278,267,266;, - 3;278,266,279;, - 3;279,266,265;, - 3;279,265,264;, - 3;279,264,280;; - } - MeshTextureCoords { - 164; - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.268884;0.856707;, - 0.207531;0.795346;, - 0.146390;0.737888;, - 0.119222;0.688786;, - 0.097847;0.643752;, - 0.726345;0.857798;, - 0.714652;0.865143;, - 0.347119;0.728705;, - 0.071537;0.500034;, - 0.087737;0.582358;, - 0.221489;0.500034;, - 0.416618;0.614996;, - 0.395559;0.591453;, - 0.368072;0.556819;, - 0.637138;0.736753;, - 0.354693;0.500034;, - 0.362765;0.530572;, - 0.781681;0.809882;, - 0.427654;0.455869;, - 0.416725;0.496656;, - 0.427653;0.537442;, - 0.457511;0.567299;, - 0.498297;0.578228;, - 0.568281;0.622703;, - 0.539083;0.567300;, - 0.308688;0.114332;, - 0.362981;0.236334;, - 0.424104;0.373683;, - 0.459027;0.363941;, - 0.597396;0.594098;, - 0.623260;0.568689;, - 0.579870;0.496656;, - 0.539084;0.426012;, - 0.498297;0.415083;, - 0.457511;0.426012;, - 0.568941;0.537442;, - 0.387943;0.091771;, - 0.446172;0.073256;, - 0.498343;0.352975;, - 0.533280;0.362668;, - 0.572611;0.373581;, - 0.642446;0.494041;, - 0.633420;0.529157;, - 0.568941;0.455869;, - 0.473762;0.072346;, - 0.534864;0.072197;, - 0.628014;0.095181;, - 0.636952;0.256925;, - 0.697176;0.119146;, - 0.709384;0.125599;, - 0.791953;0.509782;, - 0.904669;0.603680;, - 0.891589;0.663366;, - 0.878582;0.687715;, - 0.848160;0.740706;, - 0.924758;0.523764;, - 0.498343;0.352975;, - 0.562359;0.074656;, - 0.432471;0.074972;, - 0.572611;0.373581;, - 0.709384;0.125599;, - 0.308688;0.114332;, - 0.424104;0.373683;, - 0.416618;0.614996;, - 0.371852;0.564950;, - 0.138464;0.726270;, - 0.093027;0.630541;, - 0.071537;0.500034;, - 0.354693;0.500034;, - 0.268884;0.856707;, - 0.623260;0.568689;, - 0.832283;0.763288;, - 0.896953;0.650643;, - 0.568281;0.622703;, - 0.714652;0.865143;, - 0.924758;0.523764;, - 0.642446;0.494041;, - 0.579870;0.496656;, - 0.568941;0.455869;, - 0.498297;0.496656;, - 0.539084;0.426012;, - 0.498297;0.415083;, - 0.457511;0.426012;, - 0.427654;0.455869;, - 0.416725;0.496656;, - 0.427653;0.537442;, - 0.457511;0.567299;, - 0.498297;0.578228;, - 0.539083;0.567300;, - 0.568941;0.537442;, - 0.163232;0.126306;, - 0.985206;0.375649;, - 0.901675;0.199037;, - 0.797771;0.095133;, - 0.621159;0.011602;, - 0.426023;0.002015;, - 0.285410;0.044670;, - 0.036891;0.305697;, - 0.004196;0.423843;, - 0.004196;0.570785;, - 0.046850;0.711399;, - 0.145433;0.851375;, - 0.307878;0.959917;, - 0.474925;0.997429;, - 0.644845;0.976471;, - 0.835756;0.868322;, - 0.962097;0.688931;, - 0.999609;0.521883;; - } -} diff --git a/rockem/block1.wav b/rockem/block1.wav deleted file mode 100644 index 40e874b..0000000 Binary files a/rockem/block1.wav and /dev/null differ diff --git a/rockem/block2.wav b/rockem/block2.wav deleted file mode 100644 index cbb0452..0000000 Binary files a/rockem/block2.wav and /dev/null differ diff --git a/rockem/block3.wav b/rockem/block3.wav deleted file mode 100644 index a61bcc1..0000000 Binary files a/rockem/block3.wav and /dev/null differ diff --git a/rockem/cboo.wav b/rockem/cboo.wav deleted file mode 100644 index d358e7a..0000000 Binary files a/rockem/cboo.wav and /dev/null differ diff --git a/rockem/cloop.wav b/rockem/cloop.wav deleted file mode 100644 index 4bf936c..0000000 Binary files a/rockem/cloop.wav and /dev/null differ diff --git a/rockem/cyeah.wav b/rockem/cyeah.wav deleted file mode 100644 index eb73ff4..0000000 Binary files a/rockem/cyeah.wav and /dev/null differ diff --git a/rockem/debris_b.x b/rockem/debris_b.x deleted file mode 100644 index c4a3159..0000000 --- a/rockem/debris_b.x +++ /dev/null @@ -1,236 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -Header { - 1; - 0; - 1; -} - -Mesh { - 10; - 0.082451;-0.082450;-6.700000;, - 0.082451;0.082451;-6.700000;, - -0.082451;0.082451;-6.700000;, - -0.082451;-0.082450;-6.700000;, - 3.349999;-3.350001;-0.000000;, - 3.350000;3.350000;0.000000;, - -3.349999;3.350001;0.000000;, - -3.350002;-3.349998;-0.000000;, - 0.000000;0.000000;-6.700000;, - 0.000000;-0.000000;-0.000000;; - - 16; - 3;0,8,1;, - 3;1,8,2;, - 3;2,8,3;, - 3;3,8,0;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,5,9;, - 3;5,6,9;, - 3;6,7,9;, - 3;7,4,9;; - - MeshMaterialList { - 1; - 1; - 0;; - Material { - 0.274510;0.325490;0.905882;1.000000;; - 30.000000; - 0.768627;0.768627;0.768627;; - 0.000000;0.000000;0.000000;; - } - } - MeshNormals { - 26; - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;0.000000;-1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;-0.000000;1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.000000;-0.000000;1.000000;; - - 16; - 3;0,24,3;, - 3;3,24,6;, - 3;6,24,9;, - 3;9,24,0;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,17,25;, - 3;17,20,25;, - 3;20,23,25;, - 3;23,14,25;; - } - MeshTextureCoords { - 10; - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;; - } -} diff --git a/rockem/debris_r.x b/rockem/debris_r.x deleted file mode 100644 index 8e1fad2..0000000 --- a/rockem/debris_r.x +++ /dev/null @@ -1,236 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -Header { - 1; - 0; - 1; -} - -Mesh { - 10; - 0.082451;-0.082450;-6.700000;, - 0.082451;0.082451;-6.700000;, - -0.082451;0.082451;-6.700000;, - -0.082451;-0.082450;-6.700000;, - 3.349999;-3.350001;-0.000000;, - 3.350000;3.350000;0.000000;, - -3.349999;3.350001;0.000000;, - -3.350002;-3.349998;-0.000000;, - 0.000000;0.000000;-6.700000;, - 0.000000;-0.000000;-0.000000;; - - 16; - 3;0,8,1;, - 3;1,8,2;, - 3;2,8,3;, - 3;3,8,0;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,5,9;, - 3;5,6,9;, - 3;6,7,9;, - 3;7,4,9;; - - MeshMaterialList { - 1; - 1; - 0;; - Material { - 0.905882;0.274510;0.274510;1.000000;; - 29.000000; - 0.768627;0.768627;0.768627;; - 0.000000;0.000000;0.000000;; - } - } - MeshNormals { - 26; - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;0.000000;-1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;-0.000000;1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.000000;-0.000000;1.000000;; - - 16; - 3;0,24,3;, - 3;3,24,6;, - 3;6,24,9;, - 3;9,24,0;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,17,25;, - 3;17,20,25;, - 3;20,23,25;, - 3;23,14,25;; - } - MeshTextureCoords { - 10; - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;; - } -} diff --git a/rockem/defend1.wav b/rockem/defend1.wav deleted file mode 100644 index ff34787..0000000 Binary files a/rockem/defend1.wav and /dev/null differ diff --git a/rockem/defend2.wav b/rockem/defend2.wav deleted file mode 100644 index a83ac59..0000000 Binary files a/rockem/defend2.wav and /dev/null differ diff --git a/rockem/demech.x b/rockem/demech.x deleted file mode 100644 index 1e7dcd3..0000000 --- a/rockem/demech.x +++ /dev/null @@ -1,3819 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -template FrameTransformMatrix { - - Matrix4x4 frameMatrix; -} - -template Frame { - <3D82AB46-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template FloatKeys { - <10DD46A9-775B-11cf-8F52-0040333594A3> - DWORD nValues; - array FLOAT values[nValues]; -} - -template TimedFloatKeys { - - DWORD time; - FloatKeys tfkeys; -} - -template AnimationKey { - <10DD46A8-775B-11cf-8F52-0040333594A3> - DWORD keyType; - DWORD nKeys; - array TimedFloatKeys keys[nKeys]; -} - -template AnimationOptions { - - DWORD openclosed; - DWORD positionquality; -} - -template Animation { - <3D82AB4F-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template AnimationSet { - <3D82AB50-62DA-11cf-AB39-0020AF71E433> - [Animation] -} - -Header { - 1; - 0; - 1; -} - -Material x3ds_mat_01MECHHAND { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHHN.GIF"; - } -} -Material x3ds_mat_02MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHLA.GIF"; - } -} -Material x3ds_mat_01GROIN { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHGR.GIF"; - } -} -Material x3ds_mat_02MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHLL.GIF"; - } -} -Material x3ds_mat_01MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHUL.GIF"; - } -} -Material x3ds_mat_01HEAD { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHHD.GIF"; - } -} -Material x3ds_mat_REDPLASTIC { - 1.000000, 0.368627, 0.368627, 1.000000;; - 30.800001; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; -} -Material x3ds_mat_01BACK { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHBK.GIF"; - } -} -Material x3ds_mat_01MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHUA.GIF"; - } -} -Material x3ds_mat_01CHEST { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHCH.GIF"; - } -} - -Frame x3ds_xGroin { - FrameTransformMatrix { - -1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 0.000000, 35.534382, 1.024473, 1.000000;; - } - Mesh xGroin { - - 31; - -2.000033; -0.000005; -10.091250;, - -0.555553; -0.000005; -10.091250;, - 1.666685; -0.000005; -10.091250;, - -1.192545; -7.018511; -6.581248;, - -3.066506; -0.638034; -6.581249;, - -2.555453; 5.104383; -6.581252;, - -0.851815; 7.018551; -6.581251;, - 0.851807; 7.018506; -6.581251;, - 1.192535; -7.018467; -6.581248;, - -2.333362; -11.356153; 3.071271;, - -6.000067; -1.032373; 3.071292;, - -5.000066; 8.258989; 3.071267;, - -1.666681; 11.356154; 3.071267;, - 1.666685; 11.356243; 3.071267;, - 5.000067; 8.259121; 3.071267;, - 6.000000; -1.032373; 3.071269;, - 2.333369; -11.356200; 3.071271;, - -7.000063; -10.455877; 5.703794;, - -17.999998; -1.012086; 5.703773;, - -15.000134; 7.487371; 5.703790;, - -5.000066; 10.320596; 5.703789;, - 15.000134; 7.487412; 5.703790;, - 17.999998; -1.012087; 5.703768;, - 7.000071; -10.455922; 5.703794;, - -5.833399; -8.955485; 10.091297;, - -15.000132; -0.814138; 10.091291;, - -12.499999; 6.513076; 10.091294;, - -4.166667; 8.955388; 10.091293;, - 12.500134; 6.513030; 10.091294;, - 15.000134; -0.814141; 10.091295;, - 5.833402; -8.955529; 10.091297;; - - 53; - 3;1,4,0;, - 3;1,3,4;, - 3;0,5,1;, - 3;0,4,5;, - 3;1,5,6;, - 3;1,7,2;, - 3;1,6,7;, - 3;2,3,1;, - 3;2,8,3;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,12,6;, - 3;5,11,12;, - 3;6,13,7;, - 3;6,12,13;, - 3;7,13,14;, - 3;7,15,2;, - 3;7,14,15;, - 3;2,16,8;, - 3;2,15,16;, - 3;8,9,3;, - 3;8,16,9;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,20,13;, - 3;13,21,14;, - 3;14,22,15;, - 3;14,21,22;, - 3;15,23,16;, - 3;15,22,23;, - 3;16,17,9;, - 3;16,23,17;, - 3;17,25,18;, - 3;17,24,25;, - 3;18,26,19;, - 3;18,25,26;, - 3;19,27,20;, - 3;19,26,27;, - 3;20,27,13;, - 3;13,28,21;, - 3;13,27,28;, - 3;21,29,22;, - 3;21,28,29;, - 3;22,30,23;, - 3;22,29,30;, - 3;23,24,17;, - 3;23,30,24;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01GROIN} - } - MeshNormals { - 64; - -0.000000;-0.983877;-0.178844;, - -0.599572;0.408149;-0.688424;, - -0.560307;-0.381698;-0.735094;, - 0.000000;0.508170;-0.861257;, - -0.000000;-0.447290;-0.894389;, - 0.559687;0.421739;-0.713363;, - -0.000000;-0.447290;-0.894389;, - 0.937160;-0.239286;-0.253915;, - -0.880351;-0.277520;-0.384663;, - 0.000009;-0.721590;-0.692320;, - -0.680092;-0.595592;-0.427487;, - -0.956486;0.091041;-0.277212;, - -0.776351;0.298631;-0.555067;, - -0.612329;0.585593;-0.531164;, - -0.595762;0.530237;-0.603255;, - 0.000019;0.721585;-0.692326;, - 0.573074;0.533170;-0.622347;, - 0.634858;0.683287;-0.360658;, - 0.000013;-0.721591;-0.692319;, - 0.969727;-0.158439;-0.185813;, - -0.603915;-0.361812;-0.710196;, - 0.000004;-0.998923;-0.046402;, - -0.776502;-0.254344;-0.576501;, - -0.537039;0.077572;-0.839983;, - -0.815733;0.081072;-0.572719;, - -0.490500;0.710156;-0.505063;, - -0.643035;0.648313;-0.407671;, - -0.000027;0.999717;-0.023791;, - -0.010253;0.995713;0.091928;, - 0.398539;0.900274;-0.175139;, - 0.488511;0.525776;-0.696359;, - 0.507328;0.077991;-0.858217;, - 0.768552;0.139116;-0.624480;, - 0.584865;-0.268944;-0.765246;, - 0.845605;-0.234038;-0.479769;, - -0.000010;-0.998923;-0.046406;, - -0.654640;-0.753300;0.063125;, - -0.000009;-0.946205;0.323569;, - -0.582828;-0.600451;-0.547512;, - -0.943651;0.328188;0.042606;, - -0.654989;0.198844;-0.729006;, - -0.275500;0.960845;0.029596;, - -0.400693;0.869473;-0.288898;, - -0.014416;0.942381;0.334230;, - 0.328385;0.846238;-0.419578;, - 0.943441;0.328186;0.047052;, - 0.657040;0.204764;-0.725514;, - 0.655845;-0.753077;-0.052365;, - 0.593011;-0.504799;-0.627309;, - -0.000003;-0.946198;0.323589;, - -0.609542;-0.686312;0.396779;, - -0.000003;-0.946203;0.323573;, - -0.598574;-0.685369;0.414704;, - -0.799848;0.272917;0.534565;, - -0.802248;0.278457;0.528072;, - -0.263482;0.899018;0.349777;, - -0.132000;0.918501;0.372736;, - -0.028788;0.952884;0.301966;, - 0.168538;0.913545;0.370176;, - 0.807613;0.275554;0.521374;, - 0.802809;0.278603;0.527141;, - 0.596840;-0.672007;0.438393;, - 0.597512;-0.684374;0.417866;, - -0.000004;-0.946204;0.323572;; - 53; - 3;2,10,0;, - 3;2,8,10;, - 3;1,12,3;, - 3;1,11,12;, - 3;2,13,14;, - 3;3,16,5;, - 3;3,15,16;, - 3;6,9,4;, - 3;6,18,9;, - 3;8,22,10;, - 3;8,20,22;, - 3;11,24,12;, - 3;11,23,24;, - 3;13,26,14;, - 3;13,25,26;, - 3;15,28,16;, - 3;15,27,28;, - 3;17,29,30;, - 3;16,32,5;, - 3;16,31,32;, - 3;7,34,19;, - 3;7,33,34;, - 3;18,21,9;, - 3;18,35,21;, - 3;20,38,22;, - 3;20,36,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,43,28;, - 3;29,44,30;, - 3;31,46,32;, - 3;31,45,46;, - 3;33,48,34;, - 3;33,47,48;, - 3;35,37,21;, - 3;35,49,37;, - 3;36,52,38;, - 3;36,50,52;, - 3;39,54,40;, - 3;39,53,54;, - 3;41,56,42;, - 3;41,55,56;, - 3;43,57,28;, - 3;29,58,44;, - 3;29,56,58;, - 3;45,60,46;, - 3;45,59,60;, - 3;47,62,48;, - 3;47,61,62;, - 3;49,51,37;, - 3;49,63,51;; - } - MeshTextureCoords { - 31; - 0.546412;0.933469;, - 0.511654;0.933469;, - 0.458180;0.933469;, - 0.526982;0.782985;, - 0.572075;0.782985;, - 0.559777;0.782985;, - 0.518783;0.782985;, - 0.477788;0.782985;, - 0.469589;0.782985;, - 0.554433;0.369152;, - 0.642665;0.369151;, - 0.618602;0.369152;, - 0.538391;0.369152;, - 0.458180;0.369152;, - 0.377969;0.369152;, - 0.353907;0.369152;, - 0.442138;0.369152;, - 0.666728;0.256288;, - 0.931421;0.256289;, - 0.859233;0.256288;, - 0.618602;0.256288;, - 0.137338;0.256288;, - 0.065150;0.256289;, - 0.329843;0.256288;, - 0.638654;0.068183;, - 0.859233;0.068183;, - 0.799074;0.068183;, - 0.598548;0.068183;, - 0.197495;0.068183;, - 0.137338;0.068183;, - 0.357917;0.068183;; - } - } - - Frame x3ds_xChest { - FrameTransformMatrix { - -1.000000, 0.000000, 0.000000, 0.000000, - -0.000000, -1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.426950, -1.024468, 11.366159, 1.000000;; - } - Mesh xChest { - - 40; - -5.406384; -9.499996; -0.774913;, - -14.573050; -1.772723; -0.774910;, - -12.073050; 5.181822; -0.774907;, - -3.739717; 7.500004; -0.774907;, - 4.593616; 7.500004; -0.774907;, - 12.926949; 5.181822; -0.774910;, - 15.426949; -1.772723; -0.774914;, - 6.260283; -9.499996; -0.774913;, - -8.859015; -15.499998; 25.225092;, - -23.451246; -1.491749; 25.225090;, - -19.471548; 11.115673; 25.225096;, - -6.205883; 15.318148; 25.225096;, - 7.059781; 15.318148; 25.225096;, - 20.325445; 11.115673; 25.225096;, - 24.305143; -1.491749; 25.225090;, - 9.712914; -15.499998; 25.225092;, - -10.054240; -15.499997; 34.225082;, - -33.573051; -1.863631; 34.225082;, - -22.032743; 10.409095; 34.225082;, - -7.059614; 14.500003; 34.225082;, - 7.913515; 14.500003; 34.225082;, - 22.886644; 10.409095; 34.225082;, - 34.426949; -1.863631; 34.225082;, - 10.908140; -15.499997; 34.225082;, - -10.850827; -11.500252; 40.225082;, - -39.573051; -2.106037; 47.225090;, - -23.739717; 8.348755; 42.225098;, - -7.628605; 9.167019; 40.225098;, - 8.482507; 9.167019; 40.225098;, - 24.593618; 8.348755; 42.225090;, - 40.426949; -2.106037; 47.225090;, - 11.704728; -11.500252; 40.225082;, - -8.517495; -9.499994; 43.225082;, - -18.573050; -2.227266; 43.225090;, - -14.573050; 4.318189; 43.225098;, - -5.961939; 6.500007; 43.225098;, - 6.815839; 6.500007; 43.225090;, - 15.426950; 4.318189; 43.225090;, - 19.426950; -2.227266; 43.225090;, - 9.371394; -9.499994; 43.225082;; - - 70; - 3;0,9,1;, - 3;1,9,2;, - 3;0,8,9;, - 3;9,10,2;, - 3;2,11,3;, - 3;2,10,11;, - 3;3,12,4;, - 3;3,11,12;, - 3;4,13,5;, - 3;4,12,13;, - 3;5,14,6;, - 3;5,13,14;, - 3;6,15,7;, - 3;6,14,15;, - 3;7,8,0;, - 3;7,15,8;, - 3;8,17,9;, - 3;8,16,17;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,21,13;, - 3;12,20,21;, - 3;13,22,14;, - 3;13,21,22;, - 3;14,23,15;, - 3;14,22,23;, - 3;15,16,8;, - 3;15,23,16;, - 3;16,25,17;, - 3;16,24,25;, - 3;17,26,18;, - 3;17,25,26;, - 3;18,27,19;, - 3;18,26,27;, - 3;19,28,20;, - 3;19,27,28;, - 3;20,29,21;, - 3;20,28,29;, - 3;21,30,22;, - 3;21,29,30;, - 3;22,31,23;, - 3;22,30,31;, - 3;23,24,16;, - 3;23,31,24;, - 3;24,33,25;, - 3;24,32,33;, - 3;25,34,26;, - 3;25,33,34;, - 3;26,35,27;, - 3;26,34,35;, - 3;27,36,28;, - 3;27,35,36;, - 3;28,37,29;, - 3;28,36,37;, - 3;29,38,30;, - 3;29,37,38;, - 3;30,39,31;, - 3;30,38,39;, - 3;31,32,24;, - 3;31,39,32;, - 3;37,39,38;, - 3;36,39,37;, - 3;36,32,39;, - 3;35,32,36;, - 3;35,33,32;, - 3;34,33,35;; - MeshMaterialList { - 2; - 70; - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_01BACK} - {x3ds_mat_01CHEST} - } - MeshNormals { - 88; - -0.650995;-0.723751;-0.228890;, - 0.000000;-0.974391;-0.224860;, - -0.630534;-0.747987;-0.207225;, - -0.894967;0.321720;-0.309080;, - -0.899082;0.303417;-0.315579;, - -0.272342;0.915691;-0.295533;, - -0.255614;0.918875;-0.300549;, - 0.000000;0.957642;-0.287961;, - 0.000000;0.957642;-0.287961;, - 0.272548;0.916640;-0.292383;, - 0.256974;0.923763;-0.283949;, - 0.899082;0.303417;-0.315579;, - 0.894967;0.321720;-0.309080;, - 0.649687;-0.721872;-0.238346;, - 0.623476;-0.739614;-0.253474;, - 0.000000;-0.974391;-0.224860;, - -0.592597;-0.735803;-0.327753;, - 0.000000;-0.993577;-0.113156;, - -0.627516;-0.684776;-0.370547;, - -0.846659;0.369049;-0.383368;, - -0.915063;0.288852;-0.281468;, - -0.288159;0.954384;-0.078204;, - -0.286130;0.941081;-0.180268;, - -0.000000;0.994932;-0.100550;, - 0.000000;0.994932;-0.100550;, - 0.288029;0.953917;-0.084156;, - 0.284948;0.937354;-0.200430;, - 0.805421;0.413325;-0.424806;, - 0.840105;0.278624;-0.465394;, - 0.612424;-0.738201;-0.282836;, - 0.664713;-0.722563;-0.189894;, - 0.000000;-0.993577;-0.113156;, - -0.405419;-0.910419;0.082297;, - 0.000000;-0.957096;0.289770;, - -0.528719;-0.784443;-0.324201;, - -0.656992;0.692463;-0.298087;, - -0.789210;0.537054;-0.297861;, - -0.169555;0.935537;0.309874;, - -0.269038;0.931504;0.244784;, - -0.000000;0.917665;0.397355;, - 0.000000;0.917665;0.397355;, - 0.167433;0.931814;0.322007;, - 0.275612;0.957904;0.080362;, - 0.660560;0.741019;-0.120626;, - 0.729124;0.541464;-0.418562;, - 0.446769;-0.890468;-0.086398;, - 0.573798;-0.817112;-0.055524;, - -0.000000;-0.957096;0.289770;, - -0.136334;-0.572759;0.808307;, - 0.000000;-0.832067;0.554676;, - -0.195803;-0.806978;0.557179;, - -0.175779;0.515191;0.838856;, - -0.544400;0.783128;0.300564;, - -0.005950;0.707002;0.707186;, - -0.061460;0.847479;0.527259;, - -0.000000;0.747432;0.664339;, - 0.000000;0.747432;0.664339;, - 0.013296;0.633065;0.773985;, - 0.045031;0.769592;0.636946;, - 0.179371;0.455292;0.872087;, - 0.488614;0.794147;0.361368;, - 0.133669;-0.718562;0.682496;, - 0.323520;-0.890918;0.318748;, - 0.000000;-0.832067;0.554676;, - -0.415209;-0.574084;0.705712;, - 0.000000;-0.832017;0.554750;, - 0.000000;-0.000000;1.000000;, - -0.125496;-0.398449;0.908565;, - 0.185278;-0.113227;0.976141;, - 0.000000;-0.000001;1.000000;, - 0.124763;0.127164;0.984004;, - -0.039366;0.155367;0.987072;, - 0.000000;-0.000001;1.000000;, - 0.001540;0.487185;0.873297;, - 0.000000;0.747367;0.664412;, - 0.000001;-0.000001;1.000000;, - 0.000000;0.747366;0.664413;, - 0.173828;0.686055;0.706479;, - -0.000000;-0.000000;1.000000;, - 0.042888;0.569361;0.820968;, - 0.085553;0.052282;0.994961;, - -0.000001;-0.000000;1.000000;, - -0.050303;0.118343;0.991698;, - -0.182465;0.252282;0.950295;, - -0.000001;-0.000000;1.000000;, - -0.044699;-0.323568;0.945148;, - 0.000000;-0.832017;0.554750;, - -0.000001;-0.000000;1.000000;; - 70; - 3;0,18,2;, - 3;3,19,4;, - 3;0,16,18;, - 3;19,20,4;, - 3;5,22,6;, - 3;5,21,22;, - 3;7,24,8;, - 3;7,23,24;, - 3;9,26,10;, - 3;9,25,26;, - 3;11,28,12;, - 3;11,27,28;, - 3;13,30,14;, - 3;13,29,30;, - 3;15,17,1;, - 3;15,31,17;, - 3;16,34,18;, - 3;16,32,34;, - 3;19,36,20;, - 3;19,35,36;, - 3;21,38,22;, - 3;21,37,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,44,28;, - 3;27,43,44;, - 3;29,46,30;, - 3;29,45,46;, - 3;31,33,17;, - 3;31,47,33;, - 3;32,50,34;, - 3;32,48,50;, - 3;35,52,36;, - 3;35,51,52;, - 3;37,54,38;, - 3;37,53,54;, - 3;39,56,40;, - 3;39,55,56;, - 3;41,58,42;, - 3;41,57,58;, - 3;43,60,44;, - 3;43,59,60;, - 3;45,62,46;, - 3;45,61,62;, - 3;47,49,33;, - 3;47,63,49;, - 3;48,67,50;, - 3;48,64,67;, - 3;51,70,52;, - 3;51,68,70;, - 3;53,73,54;, - 3;53,71,73;, - 3;55,76,56;, - 3;55,74,76;, - 3;57,79,58;, - 3;57,77,79;, - 3;59,82,60;, - 3;59,80,82;, - 3;61,85,62;, - 3;61,83,85;, - 3;63,65,49;, - 3;63,86,65;, - 3;81,87,84;, - 3;78,87,81;, - 3;78,66,87;, - 3;75,66,78;, - 3;75,69,66;, - 3;72,69,75;; - } - MeshTextureCoords { - 40; - 0.427128;1.000148;, - 0.312615;1.000148;, - 0.343846;1.000148;, - 0.447949;1.000148;, - 0.552051;1.000148;, - 0.656154;1.000148;, - 0.687385;1.000148;, - 0.572872;1.000148;, - 0.383997;0.458321;, - 0.201706;0.458321;, - 0.251421;0.458321;, - 0.417140;0.458321;, - 0.582860;0.458321;, - 0.748579;0.458321;, - 0.798294;0.458321;, - 0.616003;0.458321;, - 0.369065;0.270766;, - 0.075261;0.270766;, - 0.219426;0.270766;, - 0.406475;0.270766;, - 0.593525;0.270766;, - 0.780574;0.270766;, - 0.924739;0.270766;, - 0.630935;0.270766;, - 0.359114;0.145729;, - 0.000307;-0.000148;, - 0.198102;0.104050;, - 0.399367;0.145729;, - 0.600633;0.145729;, - 0.801898;0.104050;, - 0.999693;-0.000148;, - 0.640886;0.145729;, - 0.388263;0.083210;, - 0.262646;0.083210;, - 0.312615;0.083210;, - 0.420188;0.083210;, - 0.579812;0.083210;, - 0.687385;0.083210;, - 0.737354;0.083210;, - 0.611737;0.083210;; - } - } - - Frame x3ds_xRU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - -22.158115, 0.000006, 34.682274, 1.000000;; - } - Mesh xRU_Arm { - - 12; - -5.501477; 0.000004; -2.449525;, - -2.458304; 6.273185; -0.692550;, - 3.628045; 6.273181; 2.821392;, - 6.671256; -0.000001; 4.578400;, - 3.628039; -6.273170; 2.821389;, - -2.458306; -6.273180; -0.692544;, - 8.608694; 0.000001; -22.981846;, - 10.805939; 4.394533; -21.713266;, - 15.200456; 4.394531; -19.176115;, - 17.397690; -0.000002; -17.907520;, - 15.200446; -4.394547; -19.176085;, - 10.805936; -4.394485; -21.713276;; - - 20; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - -0.716210;0.493166;-0.493793;, - -0.719557;-0.487560;-0.494492;, - -0.499999;-0.000001;0.866026;, - -0.718101;0.487469;-0.496693;, - 0.037713;0.997151;-0.065320;, - -0.499999;-0.000001;0.866026;, - 0.037713;0.997151;-0.065320;, - 0.785986;0.493148;0.372868;, - -0.499999;-0.000001;0.866026;, - 0.788019;0.487565;0.375908;, - 0.785740;-0.493168;0.373360;, - -0.500000;0.000001;0.866026;, - 0.789195;-0.487476;0.373548;, - 0.037714;-0.997151;-0.065321;, - -0.500000;-0.000001;0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.715906;-0.493147;-0.494252;, - -0.499998;0.000002;0.866027;, - -0.714286;0.498840;-0.490870;, - -0.715906;-0.493147;-0.494252;, - 0.499999;0.000001;-0.866026;, - -0.716210;0.493166;-0.493793;, - 0.037713;0.997151;-0.065320;, - 0.499996;-0.000007;-0.866027;, - 0.037713;0.997151;-0.065320;, - 0.783919;0.498709;0.369811;, - 0.499996;-0.000007;-0.866027;, - 0.785986;0.493148;0.372868;, - 0.782250;-0.498838;0.373156;, - 0.499996;-0.000007;-0.866027;, - 0.785740;-0.493168;0.373360;, - 0.037701;-0.997152;-0.065325;, - 0.499999;-0.000002;-0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.712222;-0.498712;-0.493989;, - 0.500003;0.000001;-0.866024;; - 20; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_xRL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - 13.822151, 0.000003, -20.565968, 1.000000;; - } - Mesh xRL_Arm { - - 24; - 8.013477; 0.000005; -35.874058;, - 12.494552; 9.237302; -33.286903;, - 21.456678; 9.237297; -28.112616;, - 25.937769; -0.000003; -25.525463;, - 21.456680; -9.237155; -28.112616;, - 12.494545; -9.237296; -33.286919;, - -4.837206; 0.000002; -3.067563;, - -2.639963; 4.394546; -1.798980;, - 1.754547; 4.394532; 0.738177;, - 3.951795; -0.000002; 2.006753;, - 1.754554; -4.394534; 0.738174;, - -2.639967; -4.394532; -1.798978;, - 5.120436; -0.663049; -1.830179;, - 10.395203; -0.663048; -7.844885;, - 9.816457; -0.663051; 4.948281;, - 5.120435; 0.336947; -1.830175;, - 10.395203; 0.336951; -7.844885;, - 9.816456; 0.336949; 4.948285;, - 15.652800; -0.663047; -15.309710;, - 20.927570; -0.663046; -21.324427;, - 20.348825; -0.663049; -8.531265;, - 15.652801; 0.336953; -15.309710;, - 20.927568; 0.336950; -21.324423;, - 20.348825; 0.336947; -8.531264;; - - 32; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;, - 3;12,13,14;, - 3;13,17,14;, - 3;13,16,17;, - 3;14,15,12;, - 3;14,17,15;, - 3;16,15,17;, - 3;18,19,20;, - 3;19,23,20;, - 3;19,22,23;, - 3;20,21,18;, - 3;20,23,21;, - 3;22,21,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 64; - -0.811971;0.490075;-0.317063;, - -0.814533;-0.484496;-0.319062;, - 0.500000;0.000000;-0.866025;, - -0.815268;0.484377;-0.317359;, - -0.068845;0.990475;0.119243;, - 0.500000;0.000000;-0.866025;, - -0.068845;0.990475;0.119243;, - 0.679969;0.490008;0.545467;, - 0.500000;0.000000;-0.866025;, - 0.683580;0.484497;0.545876;, - 0.680568;-0.490079;0.544656;, - 0.500000;0.000001;-0.866025;, - 0.682472;-0.484384;0.547362;, - -0.068833;-0.990476;0.119249;, - 0.500000;-0.000000;-0.866025;, - -0.068833;-0.990476;0.119249;, - -0.812373;-0.490007;-0.316139;, - 0.500001;0.000001;-0.866025;, - -0.808639;0.495752;-0.316753;, - -0.812373;-0.490007;-0.316139;, - -0.500002;0.000000;0.866024;, - -0.811971;0.490075;-0.317063;, - -0.068842;0.990475;0.119244;, - -0.499998;0.000000;0.866027;, - -0.068845;0.990475;0.119243;, - 0.676328;0.495497;0.545035;, - -0.499998;0.000000;0.866027;, - 0.679969;0.490008;0.545467;, - 0.678635;-0.495752;0.541927;, - -0.499998;0.000000;0.866027;, - 0.680568;-0.490079;0.544656;, - -0.068843;-0.990476;0.119239;, - -0.499999;-0.000001;0.866026;, - -0.068833;-0.990476;0.119249;, - -0.810178;-0.495497;-0.313201;, - -0.499996;0.000000;0.866028;, - -0.000000;-1.000000;-0.000000;, - -0.822008;-0.000003;0.569476;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045193;, - -0.000001;1.000000;0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - -0.000000;-1.000000;-0.000000;, - -0.822007;0.000001;0.569477;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;0.000001;0.569477;, - -0.822007;0.000001;0.569477;, - 0.000001;1.000000;0.000000;, - 0.998978;0.000002;0.045192;, - 0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;-0.000001;0.569477;, - 0.000001;1.000000;0.000000;; - 32; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;, - 3;36,38,40;, - 3;39,47,41;, - 3;39,45,47;, - 3;42,43,37;, - 3;42,48,43;, - 3;46,44,49;, - 3;50,52,54;, - 3;53,61,55;, - 3;53,59,61;, - 3;56,57,51;, - 3;56,62,57;, - 3;60,58,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xR_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 17.201626, -0.532497, -26.974564, 1.000000;; - } - Mesh xR_Hand { - - 8; - -6.156250; -13.356396; -4.582500;, - 6.843750; -13.356392; -4.582499;, - 3.756248; -0.356396; -2.650548;, - -3.068748; -0.356396; -2.650548;, - -6.156250; -13.356396; 4.582500;, - 6.843750; -13.356392; 4.582499;, - 3.756248; -0.356396; 2.650487;, - -3.068748; -0.356396; 2.650487;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032627;0.773816;, - 0.032627;0.773815;, - 0.231505;-0.195808;, - 0.231505;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777202;-0.195808;, - 0.777202;-0.195808;; - } - } - } - } - } - - Frame x3ds_xLU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - 22.800379, 0.000008, 34.682274, 1.000000;; - } - Mesh xLU_Arm { - - 12; - 5.988962; 0.000003; 0.629320;, - 2.475010; 6.273185; 0.629320;, - -4.552896; 6.273124; 0.629312;, - -8.066902; 0.000002; 0.629321;, - -4.552895; -6.273167; 0.629311;, - 2.475007; -6.273119; 0.629326;, - 4.035431; 0.000003; -24.207542;, - 1.498257; 4.394476; -24.207481;, - -3.576344; 4.394535; -24.207447;, - -6.113496; 0.000003; -24.207460;, - -3.576342; -4.394542; -24.207460;, - 1.498262; -4.394542; -24.207493;; - - 20; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - 0.867150;0.493170;-0.069530;, - 0.870399;-0.487563;-0.068461;, - -0.000001;-0.000001;1.000000;, - 0.870241;0.487469;-0.071097;, - -0.000009;0.997152;-0.075422;, - -0.000001;-0.000001;1.000000;, - -0.000009;0.997152;-0.075422;, - -0.867118;0.493150;-0.070072;, - -0.000001;-0.000001;1.000000;, - -0.870397;0.487569;-0.068456;, - -0.867151;-0.493168;-0.069524;, - 0.000000;0.000001;1.000000;, - -0.870238;-0.487476;-0.071089;, - 0.000007;-0.997152;-0.075422;, - 0.000000;-0.000001;1.000000;, - 0.000007;-0.997152;-0.075422;, - 0.867118;-0.493148;-0.070077;, - -0.000002;0.000002;1.000000;, - 0.864021;0.498848;-0.067959;, - 0.867118;-0.493148;-0.070077;, - -0.000022;0.000001;-1.000000;, - 0.867150;0.493170;-0.069530;, - 0.000011;0.997151;-0.075427;, - -0.000007;0.000007;-1.000000;, - -0.000009;0.997152;-0.075422;, - -0.863800;0.498709;-0.071685;, - -0.000007;0.000007;-1.000000;, - -0.867118;0.493150;-0.070072;, - -0.864027;-0.498838;-0.067955;, - -0.000007;0.000007;-1.000000;, - -0.867151;-0.493168;-0.069524;, - -0.000001;-0.997152;-0.075423;, - -0.000002;-0.000001;-1.000000;, - 0.000007;-0.997152;-0.075422;, - 0.863799;-0.498711;-0.071691;, - -0.000006;0.000001;-1.000000;; - 20; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_xLL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.446584, 0.000005, -24.389263, 1.000000;; - } - Mesh xLL_Arm { - - 24; - 9.756407; 0.000006; -35.407063;, - 4.582108; 9.237305; -35.407040;, - -5.766471; 9.237184; -35.407040;, - -10.940788; 0.000005; -35.407043;, - -5.766469; -9.237268; -35.407063;, - 4.582115; -9.237293; -35.407051;, - 4.482169; 0.000002; -0.570457;, - 1.945006; 4.394486; -0.570453;, - -3.129325; 4.394474; -0.570462;, - -5.666486; 0.000001; -0.570473;, - -3.129334; -4.394471; -0.570465;, - 1.945009; -4.394471; -0.570457;, - -4.525237; -0.663046; -4.414725;, - -6.085963; -0.663051; -12.261003;, - -11.981339; -0.663046; -0.892426;, - -4.525237; 0.336950; -4.414725;, - -6.085961; 0.336952; -12.261005;, - -11.981338; 0.336954; -0.892433;, - -6.906761; -0.663049; -21.354527;, - -8.467486; -0.663040; -29.200804;, - -14.362860; -0.663049; -17.832241;, - -6.906761; 0.336958; -21.354527;, - -8.467486; 0.336956; -29.200804;, - -14.362861; 0.336954; -17.832237;; - - 32; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;, - 3;13,12,14;, - 3;17,13,14;, - 3;16,13,17;, - 3;15,14,12;, - 3;17,14,15;, - 3;15,16,17;, - 3;19,18,20;, - 3;23,19,20;, - 3;22,19,23;, - 3;21,20,18;, - 3;23,20,21;, - 3;21,22,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 64; - 0.861718;0.490078;0.131402;, - 0.864937;-0.484496;0.130951;, - -0.000000;0.000002;-1.000000;, - 0.864723;0.484376;0.132795;, - -0.000012;0.990475;0.137689;, - -0.000000;0.000002;-1.000000;, - -0.000012;0.990475;0.137689;, - -0.861601;0.490013;0.132404;, - -0.000000;0.000002;-1.000000;, - -0.864933;0.484503;0.130952;, - -0.861717;-0.490079;0.131403;, - -0.000001;0.000001;-1.000000;, - -0.864721;-0.484379;0.132795;, - -0.000003;-0.990475;0.137691;, - -0.000001;0.000002;-1.000000;, - -0.000003;-0.990475;0.137691;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000002;-1.000000;, - 0.858676;0.495758;0.130003;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000000;1.000000;, - 0.861718;0.490078;0.131402;, - -0.000003;0.990475;0.137691;, - -0.000002;-0.000002;1.000000;, - -0.000012;0.990475;0.137689;, - -0.858232;0.495502;0.133849;, - -0.000002;-0.000002;1.000000;, - -0.861601;0.490013;0.132404;, - -0.858676;-0.495757;0.130005;, - -0.000002;-0.000002;1.000000;, - -0.861717;-0.490079;0.131403;, - -0.000000;-0.990475;0.137691;, - -0.000003;0.000000;1.000000;, - -0.000003;-0.990475;0.137691;, - 0.858232;-0.495502;0.133850;, - -0.000002;-0.000000;1.000000;, - 0.000000;-1.000000;0.000001;, - 0.427141;0.000000;0.904185;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000000;0.904185;, - 0.427141;0.000000;0.904185;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000000;-0.460352;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000006;0.904185;, - 0.000001;1.000000;0.000000;, - -0.000001;-1.000000;-0.000001;, - 0.427140;-0.000000;0.904185;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000000;0.904185;, - 0.427140;-0.000000;0.904185;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000000;-0.460352;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000003;0.904185;, - -0.000001;1.000000;-0.000000;; - 32; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;, - 3;38,36,40;, - 3;47,39,41;, - 3;45,39,47;, - 3;43,42,37;, - 3;48,42,43;, - 3;44,46,49;, - 3;52,50,54;, - 3;61,53,55;, - 3;59,53,61;, - 3;57,56,51;, - 3;62,56,57;, - 3;58,60,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xL_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -1.719950, -0.532492, -32.044582, 1.000000;; - } - Mesh xL_Hand { - - 8; - -6.357616; -13.356400; -4.582500;, - 6.642384; -13.356396; -4.582499;, - 3.554882; -0.356400; -2.650548;, - -3.270115; -0.356400; -2.650548;, - -6.357616; -13.356400; 4.582500;, - 6.642384; -13.356396; 4.582499;, - 3.554882; -0.356399; 2.650487;, - -3.270115; -0.356399; 2.650487;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032628;0.773816;, - 0.032628;0.773815;, - 0.231506;-0.195808;, - 0.231506;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777203;-0.195808;, - 0.777203;-0.195808;; - } - } - } - } - } - - Frame x3ds_xHead { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - 0.000000, 0.000000, -1.000000, 0.000000, - 0.000000, 0.320932, 43.031708, 1.000000;; - } - Mesh xHead { - - 14; - 0.425325; 1.962787; -19.572998;, - 8.670237; -5.947898; -18.382002;, - 11.100914; 4.408364; -18.855011;, - 1.451953; 10.441894; -18.855013;, - -9.223644; 5.996317; -18.855013;, - -8.846230; -4.605626; -18.382004;, - -0.560038; -8.044583; -15.549453;, - 8.843442; -3.382582; -2.678222;, - 11.100921; 4.408369; -3.122056;, - 1.451952; 10.441850; -3.122057;, - -9.223644; 5.996321; -3.121079;, - -8.571328; -2.049199; -2.677742;, - -0.522815; -9.619122; -0.089201;, - 0.425325; -0.037214; 3.679871;; - - 24; - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;0,6,5;, - 3;0,1,6;, - 3;1,8,7;, - 3;1,2,8;, - 3;2,9,8;, - 3;2,3,9;, - 3;3,10,9;, - 3;3,4,10;, - 3;4,11,10;, - 3;4,5,11;, - 3;5,12,11;, - 3;5,6,12;, - 3;6,7,12;, - 3;6,1,7;, - 3;13,11,12;, - 3;13,10,11;, - 3;13,9,10;, - 3;13,8,9;, - 3;13,7,8;, - 3;13,12,7;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01HEAD} - } - MeshNormals { - 60; - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - 0.081687;-0.064598;-0.994562;, - -0.201835;-0.348186;-0.915439;, - 0.967436;-0.252527;0.017281;, - 0.263240;-0.952568;0.152705;, - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - 0.973545;-0.228497;-0.000000;, - 0.530181;0.847885;-0.000000;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - 0.530184;0.847883;0.000002;, - -0.384421;0.923158;0.000003;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - -0.384425;0.923156;-0.000000;, - -0.998267;-0.057694;0.011560;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.999136;-0.034537;0.023112;, - -0.542700;-0.839759;0.016782;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - -0.354072;-0.930491;-0.093913;, - 0.406709;-0.912942;0.033536;, - 0.960443;-0.276327;0.034547;, - 0.406709;-0.912942;0.033536;, - 0.568127;-0.118223;0.814405;, - 0.465161;-0.363520;0.807142;, - 0.967436;-0.252527;0.017281;, - 0.530181;0.847885;-0.000000;, - 0.310171;0.496038;0.811012;, - 0.568127;-0.118223;0.814405;, - 0.530181;0.847885;-0.000000;, - -0.384421;0.923158;0.000003;, - -0.227200;0.545780;0.806538;, - 0.310171;0.496038;0.811012;, - -0.384421;0.923158;0.000003;, - -0.996729;-0.080813;0.000000;, - -0.576846;-0.001758;0.816851;, - -0.227200;0.545780;0.806538;, - -0.998267;-0.057694;0.011560;, - -0.700901;-0.701945;0.126536;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.542700;-0.839759;0.016782;, - 0.535392;-0.840126;-0.086851;, - -0.514933;-0.269185;0.813870;, - 0.465161;-0.363520;0.807142;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.227200;0.545780;0.806538;, - 0.310171;0.496038;0.811012;, - 0.568127;-0.118223;0.814405;, - 0.465161;-0.363520;0.807142;; - 24; - 3;0,10,6;, - 3;1,14,11;, - 3;2,18,15;, - 3;3,22,19;, - 3;4,26,23;, - 3;5,7,27;, - 3;8,34,30;, - 3;8,12,34;, - 3;13,38,35;, - 3;13,16,38;, - 3;17,42,39;, - 3;17,20,42;, - 3;21,46,43;, - 3;21,24,46;, - 3;25,50,47;, - 3;25,28,50;, - 3;29,31,51;, - 3;29,9,31;, - 3;54,48,52;, - 3;55,44,49;, - 3;56,40,45;, - 3;57,36,41;, - 3;58,32,37;, - 3;59,53,33;; - } - MeshTextureCoords { - 14; - 0.023465;0.004861;, - 0.658502;0.065512;, - 0.821431;0.041424;, - 0.999136;0.041424;, - 0.180988;0.041424;, - 0.342098;0.065512;, - 0.493676;0.209760;, - 0.695904;0.865226;, - 0.821431;0.842624;, - 0.999136;0.842624;, - 0.180988;0.842657;, - 0.305883;0.865234;, - 0.497409;0.997055;, - 0.480761;1.188995;; - } - } - - Frame x3ds_xSpike01 { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - 23.054602, 0.275466, -15.502022, 1.000000;; - } - Mesh xSpike01 { - - 11; - 20.302296; 3.477874; -0.000000;, - 20.272556; 3.517951; -0.047165;, - 20.272556; 3.517951; 0.047166;, - 12.276608; -2.642800; 0.000000;, - 11.329418; -1.366189; -1.502582;, - 11.329418; -1.366188; 1.502582;, - -22.691582; -3.647179; -0.000001;, - -22.691582; -0.615793; -2.957998;, - -22.691582; -0.615791; 2.957999;, - 20.282467; 3.504585; 0.000000;, - -22.691582; -1.626259; 0.000000;; - - 18; - 3;0,9,1;, - 3;1,9,2;, - 3;2,9,0;, - 3;0,4,3;, - 3;0,1,4;, - 3;1,5,4;, - 3;1,2,5;, - 3;2,3,5;, - 3;2,0,3;, - 3;3,7,6;, - 3;3,4,7;, - 3;4,8,7;, - 3;4,5,8;, - 3;5,6,8;, - 3;5,3,6;, - 3;6,7,10;, - 3;7,8,10;, - 3;8,6,10;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 26; - -0.802935;-0.596066;-0.000210;, - -0.416581;0.546239;0.726693;, - -0.416545;0.546192;-0.726749;, - -0.802935;-0.596066;-0.000210;, - -0.416558;0.546177;0.726753;, - 0.479311;-0.877645;0.000000;, - -0.803289;-0.595589;0.000000;, - 0.479311;-0.877645;0.000000;, - -0.416582;0.546239;-0.726693;, - -0.152721;0.683170;0.714112;, - -0.224967;0.667993;-0.709348;, - -0.219854;0.670684;0.708411;, - 0.236642;-0.971597;0.000000;, - 0.236642;-0.971597;0.000000;, - -0.154600;0.681720;-0.715092;, - -0.020056;0.698250;0.715573;, - -0.018467;0.727343;-0.686026;, - 1.000000;0.000000;0.000000;, - -0.015613;0.729119;0.684209;, - -0.022052;-0.999757;0.000000;, - 1.000000;0.000000;0.000000;, - -0.022052;-0.999757;0.000000;, - -0.015212;0.698309;-0.715635;, - 1.000000;0.000000;0.000000;, - -0.802935;-0.596066;-0.000210;, - 1.000000;0.000000;0.000000;; - 18; - 3;0,24,3;, - 3;3,24,6;, - 3;6,24,0;, - 3;1,11,9;, - 3;1,4,11;, - 3;5,13,12;, - 3;5,7,13;, - 3;8,10,14;, - 3;8,2,10;, - 3;9,18,15;, - 3;9,11,18;, - 3;12,21,19;, - 3;12,13,21;, - 3;14,16,22;, - 3;14,10,16;, - 3;17,20,25;, - 3;20,23,25;, - 3;23,17,25;; - } - } - } - - Frame x3ds_Spike02 { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - -22.163496, 4.231537, -15.502023, 1.000000;; - } - Mesh Spike02 { - - 11; - -20.302298; 3.477874; -0.000000;, - -20.272558; 3.517951; -0.047165;, - -20.272558; 3.517951; 0.047166;, - -12.276606; -2.642800; 0.000000;, - -11.329420; -1.366189; -1.502582;, - -11.329420; -1.366188; 1.502582;, - 22.691582; -3.647179; -0.000001;, - 22.691582; -0.615793; -2.957998;, - 22.691582; -0.615791; 2.957999;, - -20.282469; 3.504585; 0.000000;, - 22.691582; -1.626259; 0.000000;; - - 18; - 3;9,0,1;, - 3;9,1,2;, - 3;9,2,0;, - 3;4,0,3;, - 3;1,0,4;, - 3;5,1,4;, - 3;2,1,5;, - 3;3,2,5;, - 3;0,2,3;, - 3;7,3,6;, - 3;4,3,7;, - 3;8,4,7;, - 3;5,4,8;, - 3;6,5,8;, - 3;3,5,6;, - 3;7,6,10;, - 3;8,7,10;, - 3;6,8,10;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 26; - 0.802935;-0.596066;-0.000210;, - 0.416581;0.546239;0.726693;, - 0.416545;0.546192;-0.726749;, - 0.802935;-0.596066;-0.000210;, - 0.416558;0.546177;0.726753;, - -0.479311;-0.877645;0.000000;, - 0.803289;-0.595589;-0.000000;, - -0.479311;-0.877645;0.000000;, - 0.416582;0.546239;-0.726693;, - 0.152721;0.683170;0.714111;, - 0.224967;0.667994;-0.709348;, - 0.219854;0.670684;0.708411;, - -0.236642;-0.971597;0.000000;, - -0.236642;-0.971597;0.000000;, - 0.154600;0.681720;-0.715092;, - 0.020056;0.698250;0.715573;, - 0.018467;0.727343;-0.686026;, - -1.000000;0.000000;0.000000;, - 0.015613;0.729119;0.684209;, - 0.022052;-0.999757;0.000000;, - -1.000000;0.000000;0.000000;, - 0.022052;-0.999757;0.000000;, - 0.015212;0.698309;-0.715635;, - -1.000000;0.000000;0.000000;, - 0.802935;-0.596066;-0.000210;, - -1.000000;0.000000;0.000000;; - 18; - 3;24,0,3;, - 3;24,3,6;, - 3;24,6,0;, - 3;11,1,9;, - 3;4,1,11;, - 3;13,5,12;, - 3;7,5,13;, - 3;10,8,14;, - 3;2,8,10;, - 3;18,9,15;, - 3;11,9,18;, - 3;21,12,19;, - 3;13,12,21;, - 3;16,14,22;, - 3;10,14,16;, - 3;20,17,25;, - 3;23,20,25;, - 3;17,23,25;; - } - } - } - } - } - - Frame x3ds_xRU_Leg { - FrameTransformMatrix { - -0.996195, 0.000000, -0.087156, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 0.087156, -0.000000, -0.996195, 0.000000, - 6.849589, 0.163909, 2.374461, 1.000000;; - } - Mesh xRU_Leg { - - 8; - -11.013890; -7.083223; -1.154131;, - 3.719292; -7.083223; -1.154224;, - 3.719293; 7.083232; -1.154223;, - -11.013890; 7.083232; -1.154134;, - -10.314070; -5.595806; 40.157955;, - 3.019466; -5.595746; 40.157955;, - 3.019406; 5.595754; 40.157948;, - -10.314070; 5.595694; 40.157944;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - -0.000006;0.000000;-1.000000;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;0.000005;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.999857;-0.000000;0.016939;, - -0.000005;0.999352;0.035982;, - -0.000006;-0.000000;-1.000000;, - 0.000000;0.999352;0.035984;, - -0.999857;0.000000;0.016937;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;, - 0.000005;-0.999352;0.035981;, - 0.999857;0.000005;0.016937;, - -0.000000;0.000001;1.000000;, - 0.999857;0.000005;0.016937;, - -0.000005;0.999352;0.035982;, - -0.000000;0.000001;1.000000;, - -0.000005;0.999352;0.035982;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_xRL_Leg { - FrameTransformMatrix { - 0.996195, -0.000000, -0.087156, 0.000000, - -0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - -3.359494, 0.259708, 38.976967, 1.000000;; - } - Mesh xRL_Leg { - - 26; - 9.229027; -71.518196; -17.699999;, - -10.562513; -71.518204; -17.699999;, - -8.726734; 0.601814; -5.908439;, - 7.393265; 0.601810; -5.908437;, - 11.931103; -75.798187; 11.700004;, - -13.264593; -75.798187; 11.699999;, - -8.726734; 0.601814; 5.908560;, - 7.393263; 0.601810; 5.908562;, - -9.401619; -8.003811; 0.055164;, - -9.401621; -19.983799; 0.055164;, - -21.381618; -5.008812; 0.055162;, - -9.401619; -8.003811; 1.552658;, - -9.401621; -19.983799; 1.552658;, - -21.381618; -5.008812; 1.552657;, - -9.406624; -28.501522; 0.062683;, - -9.406624; -40.501522; 0.062684;, - -21.406624; -25.501520; 0.062688;, - -9.406624; -28.501522; 1.562678;, - -9.406624; -40.501522; 1.562678;, - -21.406624; -25.501520; 1.562676;, - -9.411629; -50.486736; 0.070203;, - -9.411633; -62.506737; 0.070203;, - -21.431629; -47.481735; 0.070202;, - -9.411629; -50.486736; 1.572698;, - -9.411633; -62.506737; 1.572698;, - -21.431629; -47.481735; 1.572697;; - - 30; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;6,1,5;, - 3;2,1,6;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;, - 3;8,9,10;, - 3;9,13,10;, - 3;9,12,13;, - 3;10,11,8;, - 3;10,13,11;, - 3;12,11,13;, - 3;14,15,16;, - 3;15,19,16;, - 3;15,18,19;, - 3;16,17,14;, - 3;16,19,17;, - 3;18,17,19;, - 3;20,21,22;, - 3;21,25,22;, - 3;21,24,25;, - 3;22,23,20;, - 3;22,25,23;, - 3;24,23,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 66; - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - 0.995537;0.039363;-0.085767;, - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - -0.998354;0.039138;-0.041929;, - -0.000000;0.161357;-0.986896;, - -0.999676;0.025446;0.000000;, - 0.000000;1.000000;0.000000;, - 0.000000;0.161357;-0.986896;, - 0.000000;1.000000;0.000000;, - 0.997858;0.049375;-0.042925;, - 0.000000;-0.989569;-0.144059;, - 0.997858;0.049375;-0.042925;, - -0.000000;0.075587;0.997139;, - 0.000000;-0.989569;-0.144059;, - -0.995087;0.052754;-0.083776;, - -0.000000;0.075587;0.997139;, - -0.998354;0.039138;-0.041929;, - 0.000000;1.000000;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;1.000000;0.000000;, - 0.998241;0.059291;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970143;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;-0.000000;, - 0.242536;0.970143;-0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - -0.000000;-0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;; - 30; - 3;6,0,3;, - 3;9,0,6;, - 3;15,1,12;, - 3;4,1,15;, - 3;18,5,16;, - 3;7,5,18;, - 3;21,8,19;, - 3;10,8,21;, - 3;13,11,22;, - 3;2,11,13;, - 3;20,14,23;, - 3;17,14,20;, - 3;24,26,28;, - 3;27,35,29;, - 3;27,33,35;, - 3;30,31,25;, - 3;30,36,31;, - 3;34,32,37;, - 3;38,40,42;, - 3;41,49,43;, - 3;41,47,49;, - 3;44,45,39;, - 3;44,50,45;, - 3;48,46,51;, - 3;52,54,56;, - 3;55,63,57;, - 3;55,61,63;, - 3;58,59,53;, - 3;58,64,59;, - 3;62,60,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xR_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - -0.849463, -62.299637, -2.502151, 1.000000;; - } - Mesh xR_Foot { - - 8; - -37.191723; -17.003931; 4.286171;, - 7.580331; -17.003948; 6.445354;, - 5.179023; -0.329530; 4.340307;, - -27.147438; -7.877935; 1.341817;, - -37.191738; -17.003931; -4.286145;, - 7.580253; -17.003933; -6.445303;, - 5.179095; -0.329522; -4.340269;, - -27.147472; -7.877943; -1.341796;; - - 10; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 20; - -0.123025;0.309552;0.942890;, - -0.000000;-1.000000;0.000000;, - -0.672464;0.740130;0.000001;, - -0.047832;0.118323;0.991822;, - -0.000000;-1.000000;-0.000001;, - -0.123025;0.309552;0.942890;, - -0.227388;0.973804;-0.000001;, - -0.192728;0.486970;0.851890;, - -0.227389;0.973804;0.000000;, - -0.672466;0.740128;0.000006;, - -0.000000;-1.000000;0.000000;, - -0.672466;0.740128;0.000006;, - -0.123024;0.309551;-0.942891;, - -0.000000;-1.000000;0.000000;, - -0.047831;0.118323;-0.991822;, - -0.227388;0.973804;-0.000001;, - -0.123024;0.309551;-0.942891;, - -0.227388;0.973804;-0.000001;, - -0.672466;0.740128;0.000006;, - -0.192727;0.486968;-0.851891;; - 10; - 3;5,0,3;, - 3;7,0,5;, - 3;13,1,10;, - 3;4,1,13;, - 3;17,6,15;, - 3;8,6,17;, - 3;11,9,18;, - 3;2,9,11;, - 3;16,12,19;, - 3;14,12,16;; - } - } - } - } - } - - Frame x3ds_xLU_Leg { - FrameTransformMatrix { - -0.996195, 0.000000, 0.087156, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - -0.087156, -0.000000, -0.996195, 0.000000, - -5.995696, 0.163911, 2.695590, 1.000000;; - } - Mesh xLU_Leg { - - 8; - -2.905127; -7.083223; -0.791073;, - 11.828092; -7.083163; -0.790935;, - 11.828092; 7.083232; -0.790933;, - -2.905124; 7.083232; -0.791067;, - -2.205291; -5.595747; 40.521160;, - 11.128267; -5.595746; 40.521164;, - 11.128268; 5.595754; 40.521152;, - -2.205273; 5.595753; 40.521152;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - 0.000009;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.000004;-0.999352;0.035981;, - 0.999857;-0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.999857;-0.000000;0.016937;, - -0.000000;0.999352;0.035983;, - 0.000009;0.000000;-1.000000;, - -0.000000;0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.000001;1.000000;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.999352;0.035983;, - -0.000000;0.000001;1.000000;, - -0.000000;0.999352;0.035983;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_xLL_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, 0.087156, 0.000000, - 0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 3.943336, 0.259716, 39.672768, 1.000000;; - } - Mesh xLL_Leg { - - 26; - -9.017391; -71.197044; -17.699999;, - 10.774149; -71.197052; -17.699999;, - 8.938375; 0.922958; -5.908498;, - -7.181622; 0.922955; -5.908498;, - -11.719472; -75.477051; 11.700000;, - 13.476221; -75.477051; 11.700000;, - 8.938375; 0.922958; 5.908501;, - -7.181622; 0.922955; 5.908501;, - 9.618265; -7.680378; 0.062687;, - 9.618269; -19.680382; 0.062687;, - 21.618265; -4.680378; 0.062687;, - 9.618265; -7.680378; 1.562681;, - 9.618269; -19.680382; 1.562681;, - 21.618265; -4.680378; 1.562681;, - 9.618265; -28.180374; 0.062689;, - 9.618265; -40.180374; 0.062689;, - 21.618265; -25.180378; 0.062694;, - 9.618265; -28.180374; 1.562683;, - 9.618265; -40.180374; 1.562683;, - 21.618265; -25.180378; 1.562684;, - 9.618269; -50.180374; 0.062691;, - 9.618265; -62.180374; 0.062691;, - 21.618269; -47.180374; 0.062691;, - 9.618269; -50.180374; 1.562685;, - 9.618265; -62.180374; 1.562685;, - 21.618269; -47.180374; 1.562685;; - - 30; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;, - 3;9,8,10;, - 3;13,9,10;, - 3;12,9,13;, - 3;11,10,8;, - 3;13,10,11;, - 3;11,12,13;, - 3;15,14,16;, - 3;19,15,16;, - 3;18,15,19;, - 3;17,16,14;, - 3;19,16,17;, - 3;17,18,19;, - 3;21,20,22;, - 3;25,21,22;, - 3;24,21,25;, - 3;23,22,20;, - 3;25,22,23;, - 3;23,24,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 66; - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - -0.995537;0.039364;-0.085767;, - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - 0.998354;0.039138;-0.041929;, - 0.000000;0.161356;-0.986896;, - 0.999676;0.025446;0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;0.161356;-0.986896;, - -0.000000;1.000000;0.000000;, - -0.997857;0.049375;-0.042925;, - -0.000000;-0.989569;-0.144060;, - -0.997857;0.049375;-0.042925;, - -0.000000;0.075588;0.997139;, - -0.000000;-0.989569;-0.144060;, - 0.995087;0.052753;-0.083776;, - 0.000000;0.075588;0.997139;, - 0.998354;0.039138;-0.041929;, - -0.000000;1.000000;0.000000;, - -0.000000;0.075588;0.997139;, - -0.000000;1.000000;0.000000;, - -0.998241;0.059291;0.000000;, - -0.000000;0.075588;0.997139;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242535;0.970143;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;; - 30; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;, - 3;26,24,28;, - 3;35,27,29;, - 3;33,27,35;, - 3;31,30,25;, - 3;36,30,31;, - 3;32,34,37;, - 3;40,38,42;, - 3;49,41,43;, - 3;47,41,49;, - 3;45,44,39;, - 3;50,44,45;, - 3;46,48,51;, - 3;54,52,56;, - 3;63,55,57;, - 3;61,55,63;, - 3;59,58,53;, - 3;64,58,59;, - 3;60,62,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xL_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - 1.061086, -63.263023, -2.697744, 1.000000;; - } - Mesh xL_Foot { - - 8; - -36.996124; -15.719404; -4.210043;, - 7.775687; -15.719419; -6.330903;, - 5.374388; 0.954521; -4.263234;, - -26.951843; -6.593406; -1.317977;, - -36.995773; -15.719404; 4.210084;, - 7.775620; -15.719404; 6.330931;, - 5.374463; 0.954529; 4.263263;, - -26.951632; -6.593413; 1.317985;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 20; - -0.121241;0.305074;-0.944580;, - 0.000000;-1.000000;0.000000;, - -0.672469;0.740125;0.000028;, - -0.046996;0.116259;-0.992106;, - -0.000000;-1.000000;0.000001;, - -0.121241;0.305074;-0.944580;, - -0.227378;0.973807;0.000001;, - -0.190220;0.480642;-0.856037;, - -0.227375;0.973807;0.000021;, - -0.672460;0.740133;0.000056;, - 0.000000;-1.000000;0.000000;, - -0.672460;0.740133;0.000056;, - -0.121242;0.305075;0.944579;, - 0.000000;-1.000000;0.000000;, - -0.046997;0.116259;0.992106;, - -0.227378;0.973807;0.000001;, - -0.121242;0.305075;0.944579;, - -0.227378;0.973807;0.000001;, - -0.672460;0.740133;0.000056;, - -0.190222;0.480644;0.856035;; - 10; - 3;0,5,3;, - 3;0,7,5;, - 3;1,13,10;, - 3;1,4,13;, - 3;6,17,15;, - 3;6,8,17;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,16,19;, - 3;12,14,16;; - } - } - } - } - } -} -AnimationSet x3ds_animset_0 { - Animation x3ds_anim_0 { - {x3ds_xGroin} - AnimationKey { - 0; - 9; - 0; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 77; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 85; 4; -0.000000, -0.000000, -0.675590, -0.737277;;, - 93; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 115; 4; 0.000000, -0.000000, 0.000000, -1.000000;;, - 135; 4; 0.000000, -0.000000, 0.000000, -1.000000;;, - 160; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 161; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 216; 4; -0.000000, -0.000000, -0.707107, -0.707107;;; - } - AnimationKey { - 1; - 5; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 93; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 29; - 0; 3; 0.000000, 35.534382, 1.024473;;, - 1; 3; 0.000000, 23.889210, 1.024473;;, - 15; 3; 0.000000, 18.884680, 2.903347;;, - 30; 3; 0.000000, 23.889210, 1.024473;;, - 33; 3; 0.000000, 23.889210, 1.024473;;, - 43; 3; 0.000000, 20.962900, 1.024473;;, - 52; 3; 0.000000, 25.059750, 1.024473;;, - 61; 3; 0.000000, 23.518040, 5.044694;;, - 68; 3; 0.000000, 18.818790, 12.939010;;, - 76; 3; 0.000000, 23.518040, 5.044694;;, - 77; 3; 0.000000, 23.518040, 5.044694;;, - 93; 3; 0.000000, 23.518040, 5.044694;;, - 100; 3; 0.000000, 29.812460, 75.539871;;, - 104; 3; 0.000000, 19.677170, 97.369331;;, - 115; 3; 0.000000, -67.336800, 139.859100;;, - 135; 3; 0.000000, -67.336998, 139.859100;;, - 145; 3; 0.000000, -13.702706, 104.629173;;, - 146; 3; 0.000000, -12.018229, 99.536301;;, - 160; 3; 0.000000, 23.518040, 5.044694;;, - 161; 3; 0.000000, 23.518040, 5.044694;;, - 175; 3; 0.000000, 33.713287, -37.066116;;, - 178; 3; 0.000000, 24.016308, -39.583458;;, - 181; 3; 0.000000, 33.713287, -37.066116;;, - 184; 3; 0.000000, 24.016308, -39.583458;;, - 187; 3; 0.000000, 33.713287, -37.066116;;, - 190; 3; 0.000000, 24.016308, -39.583458;;, - 193; 3; 0.000000, 33.713287, -37.066116;;, - 207; 3; 0.000000, 33.713287, -37.066116;;, - 216; 3; 0.000000, 23.518040, 5.044694;;; - } - } - - Animation x3ds_anim_1 { - {x3ds_xChest} - AnimationKey { - 0; - 23; - 0; 4; 0.000000, -0.000000, -0.000000, -1.000000;;, - 1; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 15; 4; 0.317305, 0.000000, -0.000000, -0.948324;;, - 30; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 31; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 43; 4; -0.095846, -0.000000, -0.000000, -0.995396;;, - 52; 4; 0.442381, 0.058240, 0.116812, -0.887278;;, - 61; 4; 0.258819, -0.000000, -0.000000, -0.965926;;, - 68; 4; 0.332019, -0.072538, -0.264839, -0.902420;;, - 76; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 77; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 85; 4; 0.535255, 0.003802, -0.087074, -0.840182;;, - 93; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 95; 4; 0.221903, -0.017679, -0.071612, -0.972275;;, - 102; 4; 0.122182, -0.024167, -0.140528, -0.982212;;, - 115; 4; -0.000001, 0.000000, -0.000000, -1.000000;;, - 135; 4; -0.000001, -0.000000, 0.529919, -0.848048;;, - 139; 4; 0.030693, 0.002685, 0.581681, -0.812834;;, - 160; 4; 0.258820, -0.000000, -0.000000, -0.965926;;, - 161; 4; 0.258820, -0.000000, -0.000001, -0.965926;;, - 175; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 207; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 216; 4; 0.258820, -0.000000, -0.000001, -0.965926;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 0.426950, -1.024470, 11.366163;;, - 77; 3; 0.426950, -1.024470, 11.366163;;, - 115; 3; 0.426950, -1.024470, 11.366163;;, - 135; 3; 0.426950, -1.024470, 11.366163;;; - } - } - - Animation x3ds_anim_2 { - {x3ds_xRU_Arm} - AnimationKey { - 0; - 30; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.065263, 0.113039, 0.495722, -0.858616;;, - 15; 4; -0.056193, 0.117811, 0.426828, -0.894864;;, - 30; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 31; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 43; 4; 0.053090, 0.119242, -0.403256, -0.905730;;, - 52; 4; -0.220806, -0.041267, 0.855768, -0.466049;;, - 61; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 68; 4; -0.025312, 0.111794, -0.475054, -0.872459;;, - 76; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 77; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 85; 4; 0.133832, 0.353720, 0.308203, -0.872916;;, - 93; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 96; 4; -0.200990, -0.200282, 0.412420, -0.865679;;, - 97; 4; -0.132674, -0.082403, 0.416033, -0.895837;;, - 98; 4; -0.201870, -0.265437, 0.361052, -0.870881;;, - 99; 4; -0.134623, -0.131057, 0.365286, -0.911739;;, - 100; 4; -0.228976, -0.420777, 0.283694, -0.830683;;, - 115; 4; -0.000001, -0.398748, 0.000001, -0.917061;;, - 135; 4; -0.078327, -0.125349, -0.524098, -0.838734;;, - 139; 4; -0.071913, -0.092789, -0.291009, -0.949491;;, - 160; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 161; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 175; 4; -0.165429, -0.450070, 0.634668, -0.606026;;, - 178; 4; -0.307408, -0.362634, 0.387903, -0.789638;;, - 182; 4; -0.174187, -0.394643, 0.618206, -0.657068;;, - 185; 4; -0.280338, -0.279007, 0.343836, -0.851671;;, - 188; 4; -0.185051, -0.307103, 0.545153, -0.757794;;, - 192; 4; -0.218786, -0.219812, 0.386801, -0.868447;;, - 216; 4; -0.065264, 0.113036, 0.495726, -0.858615;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -22.158115, 0.000001, 34.682266;;, - 77; 3; -22.158115, 0.000001, 34.682266;;, - 115; 3; -22.158115, 0.000001, 34.682266;;, - 135; 3; -22.158115, 0.000001, 34.682266;;; - } - } - - Animation x3ds_anim_3 { - {x3ds_xRL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 15; 4; 0.909961, 0.414693, -0.000000, -0.000000;;, - 30; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 31; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 43; 4; 0.622515, 0.782608, 0.000000, -0.000000;;, - 52; 4; 0.998630, 0.052336, -0.000000, -0.000000;;, - 61; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 68; 4; 0.987688, 0.156435, -0.000000, -0.000000;;, - 76; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 77; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 85; 4; 0.673714, 0.675106, -0.106243, 0.281164;;, - 93; 4; 0.866025, 0.500000, 0.000000, -0.000000;;, - 96; 4; 0.846469, 0.531913, 0.010984, -0.020921;;, - 115; 4; 1.000000, -0.000001, -0.000000, 0.000000;;, - 135; 4; 0.913546, 0.406736, -0.000000, 0.000000;;, - 139; 4; 0.981076, 0.193621, -0.000000, -0.000000;;, - 160; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 161; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 175; 4; 0.898794, 0.438370, -0.000000, 0.000000;;, - 178; 4; 0.668687, 0.743544, -0.000000, 0.000000;;, - 182; 4; 0.826796, 0.562503, -0.000000, 0.000000;;, - 185; 4; 0.651408, 0.758727, -0.000000, 0.000000;;, - 188; 4; 0.705617, 0.708593, -0.000000, 0.000000;;, - 192; 4; 0.616021, 0.787730, -0.000000, 0.000000;;, - 216; 4; 0.866010, 0.500027, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 13.822151, 0.000000, -20.565975;;, - 77; 3; 13.822151, 0.000000, -20.565975;;, - 115; 3; 13.822151, 0.000000, -20.565975;;, - 135; 3; 13.822151, 0.000000, -20.565975;;; - } - } - - Animation x3ds_anim_4 { - {x3ds_xR_Hand} - AnimationKey { - 0; - 11; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 52; 4; 0.085633, 0.098509, -0.650446, -0.748253;;, - 68; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 77; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 85; 4; 0.095461, 0.089019, -0.725097, -0.676164;;, - 93; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 160; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 161; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 216; 4; 0.083025, 0.100717, -0.630637, -0.765023;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 17.201632, -0.532498, -26.974579;;, - 77; 3; 17.201632, -0.532498, -26.974579;;, - 115; 3; 17.201632, -0.532498, -26.974579;;, - 135; 3; 17.201632, -0.532498, -26.974579;;; - } - } - - Animation x3ds_anim_5 { - {x3ds_xLU_Arm} - AnimationKey { - 0; - 31; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.017037, 0.129409, 0.129410, -0.982963;;, - 15; 4; -0.027138, 0.127674, 0.206133, -0.969779;;, - 30; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 31; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 43; 4; -0.326088, 0.265924, 0.458283, -0.782897;;, - 52; 4; 0.023797, -0.004380, -0.508650, -0.860633;;, - 61; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 68; 4; 0.039250, 0.124485, -0.298134, -0.945558;;, - 76; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 77; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 85; 4; 0.014321, -0.216242, 0.302516, -0.928180;;, - 93; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 96; 4; 0.012473, 0.472295, 0.098587, -0.875821;;, - 97; 4; -0.005733, 0.314325, 0.091301, -0.944897;;, - 98; 4; 0.002467, 0.403792, 0.085230, -0.910869;;, - 99; 4; -0.005563, 0.316457, 0.079674, -0.945239;;, - 100; 4; 0.010565, 0.509467, 0.073742, -0.857260;;, - 115; 4; -0.000001, 0.566409, -0.000008, -0.824124;;, - 135; 4; 0.176893, 0.283087, -0.499530, -0.799400;;, - 139; 4; 0.283098, 0.024951, -0.406064, -0.868531;;, - 160; 4; -0.017038, 0.129412, 0.129402, -0.982964;;, - 161; 4; -0.017038, 0.129412, 0.129403, -0.982964;;, - 175; 4; 0.405692, 0.534219, 0.553941, -0.493126;;, - 178; 4; 0.585778, 0.368487, 0.379184, -0.614249;;, - 182; 4; 0.448058, 0.532485, 0.549044, -0.462877;;, - 185; 4; 0.592036, 0.367183, 0.377829, -0.609849;;, - 188; 4; 0.502752, 0.483163, 0.496528, -0.516967;;, - 192; 4; 0.598794, 0.362383, 0.372267, -0.609543;;, - 207; 4; 0.476089, 0.472560, 0.479925, -0.565420;;, - 216; 4; -0.017039, 0.129409, 0.129408, -0.982964;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 22.800381, -0.000005, 34.682266;;, - 77; 3; 22.800381, -0.000005, 34.682266;;, - 115; 3; 22.800381, -0.000005, 34.682266;;, - 135; 3; 22.800381, -0.000005, 34.682266;;; - } - } - - Animation x3ds_anim_6 { - {x3ds_xLL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.819152, 0.573576, -0.000000, -0.000000;;, - 15; 4; 0.848048, 0.529919, -0.000000, -0.000000;;, - 30; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 31; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 43; 4; 0.737277, 0.675591, -0.000000, -0.000000;;, - 52; 4; 0.642787, 0.766045, 0.000000, -0.000000;;, - 61; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 68; 4; 0.939693, 0.342020, -0.000000, -0.000000;;, - 76; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 77; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 85; 4; 0.441186, 0.831001, 0.214867, -0.261961;;, - 93; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 96; 4; 0.932169, 0.360972, -0.014558, 0.023425;;, - 115; 4; 1.000000, -0.000000, -0.000000, -0.000000;;, - 135; 4; 0.874620, 0.484809, -0.000000, -0.000000;;, - 139; 4; 0.980002, 0.198988, -0.000000, -0.000000;;, - 160; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 161; 4; 0.819152, 0.573577, -0.000000, 0.000000;;, - 175; 4; 0.902585, 0.430511, -0.000000, 0.000000;;, - 178; 4; 0.674571, 0.738210, -0.000000, 0.000000;;, - 182; 4; 0.836374, 0.548160, -0.000000, 0.000000;;, - 185; 4; 0.666576, 0.745437, -0.000000, 0.000000;;, - 188; 4; 0.756143, 0.654407, -0.000000, 0.000000;;, - 192; 4; 0.686772, 0.726874, -0.000000, 0.000000;;, - 216; 4; 0.819140, 0.573595, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -0.446586, 0.000001, -24.389267;;, - 77; 3; -0.446586, 0.000001, -24.389267;;, - 115; 3; -0.446586, 0.000001, -24.389267;;, - 135; 3; -0.446586, 0.000001, -24.389267;;; - } - } - - Animation x3ds_anim_7 { - {x3ds_xL_Hand} - AnimationKey { - 0; - 10; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 68; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 77; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 85; 4; 0.099989, 0.083901, -0.759491, -0.637289;;, - 93; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 160; 4; 0.088182, 0.096234, -0.669811, -0.730970;;, - 161; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 216; 4; 0.088182, 0.096234, -0.669810, -0.730970;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -1.719951, -0.532492, -32.044598;;, - 77; 3; -1.719951, -0.532492, -32.044598;;, - 115; 3; -1.719951, -0.532492, -32.044598;;, - 135; 3; -1.719951, -0.532492, -32.044598;;; - } - } - - Animation x3ds_anim_8 { - {x3ds_xHead} - AnimationKey { - 0; - 26; - 0; 4; -0.000000, -0.999048, 0.043619, -0.000000;;, - 6; 4; -0.000000, -0.997564, -0.069756, -0.000000;;, - 15; 4; -0.000000, -0.999657, -0.026177, -0.000000;;, - 26; 4; -0.000000, -0.999391, 0.034899, -0.000000;;, - 52; 4; 0.057153, -0.973623, -0.220877, -0.002109;;, - 61; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 68; 4; -0.328848, -0.929469, 0.165640, 0.022582;;, - 76; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 77; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 85; 4; 0.130447, -0.990841, 0.034601, 0.004555;;, - 93; 4; 0.000000, -0.999391, 0.034900, -0.000000;;, - 115; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 135; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 175; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 177; 4; 0.121753, -0.991602, 0.043296, 0.005316;;, - 179; 4; -0.017436, -0.998896, 0.043614, -0.000761;;, - 181; 4; 0.139040, -0.989326, 0.043196, 0.006071;;, - 183; 4; -0.034867, -0.998440, 0.043594, -0.001522;;, - 185; 4; 0.121752, -0.991602, 0.043296, 0.005316;;, - 187; 4; -0.026153, -0.998706, 0.043606, -0.001142;;, - 189; 4; 0.142432, -0.972455, -0.180232, 0.039500;;, - 191; 4; -0.109249, -0.975409, -0.173314, -0.081269;;, - 193; 4; 0.130401, -0.990501, 0.043248, 0.005694;;, - 195; 4; -0.043578, -0.998097, 0.043579, -0.001903;;, - 197; 4; 0.173153, -0.983648, 0.043642, 0.023447;;, - 199; 4; -0.065922, -0.988029, 0.137452, 0.023655;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 8; - 0; 3; 0.000000, 0.320922, 43.031700;;, - 93; 3; 0.000000, 0.320922, 43.031700;;, - 115; 3; 0.000000, 0.320922, 43.031700;;, - 135; 3; 0.000000, 0.320922, 43.031700;;, - 160; 3; 0.000000, 0.320922, 43.031700;;, - 161; 3; 0.000000, 0.320922, 43.031700;;, - 175; 3; 0.000000, 0.320922, 43.031700;;, - 216; 3; 0.000000, 0.320922, 43.031700;;; - } - } - - Animation x3ds_anim_9 { - {x3ds_xSpike01} - AnimationKey { - 0; - 6; - 0; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 77; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 93; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 115; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 135; 4; 0.706433, -0.706434, 0.030844, 0.030844;;, - 175; 4; 0.706433, -0.706434, 0.030844, 0.030844;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 23.054602, 0.275461, -15.502029;;, - 77; 3; 23.054602, 0.275461, -15.502029;;, - 115; 3; 23.054602, 0.275461, -15.502029;;, - 135; 3; 23.054602, 0.275461, -15.502029;;; - } - } - - Animation x3ds_anim_10 { - {x3ds_Spike02} - AnimationKey { - 0; - 6; - 0; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 77; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 93; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 115; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 135; 4; 0.706433, -0.706434, 0.030844, 0.030844;;, - 175; 4; 0.706433, -0.706434, 0.030844, 0.030844;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -22.163496, 4.231531, -15.502030;;, - 77; 3; -22.163496, 4.231531, -15.502030;;, - 115; 3; -22.163496, 4.231531, -15.502030;;, - 135; 3; -22.163496, 4.231531, -15.502030;;; - } - } - - Animation x3ds_anim_11 { - {x3ds_xRU_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 21; 4; 0.124791, -0.009789, -0.874977, 0.467703;;, - 30; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 37; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 43; 4; 0.125169, 0.001125, -0.912411, 0.389664;;, - 52; 4; 0.125097, 0.004401, -0.922298, 0.365647;;, - 61; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 68; 4; 0.125154, 0.002217, -0.915776, 0.381687;;, - 76; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 77; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 85; 4; 0.124485, 0.013117, -0.945558, 0.300420;;, - 93; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 100; 4; 0.240075, 0.038409, -0.943098, 0.226838;;, - 115; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 135; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 139; 4; 0.230082, -0.060758, -0.927524, 0.288220;;, - 146; 4; 0.215704, -0.060817, -0.923441, 0.311497;;, - 150; 4; 0.209892, -0.016602, -0.963089, 0.167717;;, - 160; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 161; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 175; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 178; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 181; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 184; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 187; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 190; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 193; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 207; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 216; 4; 0.124939, 0.007674, -0.931554, 0.341378;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 6.849594, 0.163909, 2.374462;;, - 77; 3; 6.849594, 0.163909, 2.374462;;, - 115; 3; 6.849594, 0.163909, 2.374462;;, - 135; 3; 6.849594, 0.163909, 2.374462;;; - } - } - - Animation x3ds_anim_12 { - {x3ds_xRL_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 1; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 11; 4; 0.438280, 0.897779, -0.019136, -0.039198;;, - 21; 4; 0.422215, 0.905446, -0.018434, -0.039533;;, - 26; 4; 0.439586, 0.897141, -0.019193, -0.039170;;, - 30; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 37; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 43; 4; 0.484348, 0.873787, -0.021147, -0.038150;;, - 52; 4; 0.499524, 0.865201, -0.021810, -0.037775;;, - 61; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 68; 4; 0.573030, 0.818373, -0.025019, -0.035731;;, - 76; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 77; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 93; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 115; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 135; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 139; 4; 0.319106, 0.946715, -0.013933, -0.041334;;, - 146; 4; 0.007542, 0.999020, -0.000329, -0.043618;;, - 150; 4; -0.025078, 0.998734, 0.001095, -0.043606;;, - 160; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 161; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 175; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 178; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 181; 4; 0.655435, 0.753991, -0.028617, -0.032920;;, - 184; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 187; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 190; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 193; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 207; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 216; 4; 0.536789, 0.842588, -0.023437, -0.036788;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -3.359494, 0.259702, 38.976971;;, - 77; 3; -3.359494, 0.259702, 38.976971;;, - 115; 3; -3.359494, 0.259702, 38.976971;;, - 135; 3; -3.359494, 0.259702, 38.976971;;; - } - } - - Animation x3ds_anim_13 { - {x3ds_xR_Foot} - AnimationKey { - 0; - 29; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 11; 4; 0.693619, 0.137449, 0.693620, -0.137448;;, - 21; 4; 0.703851, 0.067776, 0.703851, -0.067776;;, - 26; 4; 0.702932, 0.076726, 0.702932, -0.076726;;, - 30; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 37; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 52; 4; 0.700211, 0.098511, 0.700211, -0.098511;;, - 61; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 68; 4; 0.690345, 0.153046, 0.690346, -0.153046;;, - 76; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 77; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 93; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 115; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 135; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 139; 4; 0.636494, 0.308019, 0.636494, -0.308019;;, - 146; 4; 0.705581, -0.046427, 0.705581, 0.046427;;, - 150; 4; 0.682577, -0.184629, 0.682578, 0.184629;;, - 160; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 161; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 175; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 178; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 181; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 184; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 187; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 190; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 193; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 207; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 216; 4; 0.701057, 0.092298, 0.701057, -0.092298;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; -0.849455, -62.299629, -3.801312;;, - 115; 3; -0.849455, -62.299629, -3.801312;;, - 135; 3; -0.849455, -62.299629, -3.801312;;; - } - } - - Animation x3ds_anim_14 { - {x3ds_xLU_Leg} - AnimationKey { - 0; - 30; - 0; 4; -0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; -0.128543, 0.007574, -0.976382, -0.173483;;, - 11; 4; -0.134779, 0.015787, -0.981832, -0.132631;;, - 21; 4; -0.128729, 0.003084, -0.969733, -0.207452;;, - 30; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 37; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 43; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 52; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 61; 4; -0.128543, 0.007574, -0.976383, -0.173482;;, - 68; 4; -0.128751, 0.001960, -0.967886, -0.215906;;, - 76; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 77; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 85; 4; -0.128751, 0.001960, -0.967886, -0.215907;;, - 93; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 100; 4; -0.098715, 0.012488, -0.994248, -0.039635;;, - 115; 4; -0.199368, -0.000000, -0.979925, -0.000000;;, - 135; 4; -0.180689, 0.084257, -0.888113, 0.414134;;, - 139; 4; -0.148626, 0.124737, -0.776470, 0.599538;;, - 160; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 161; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 175; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 178; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 181; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 184; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 187; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 190; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 193; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 207; 4; -0.124735, 0.031962, -0.991546, 0.016007;;, - 212; 4; -0.128488, 0.008447, -0.977538, -0.166852;;, - 216; 4; -0.128542, 0.007575, -0.976383, -0.173479;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -5.995693, 0.163913, 2.695592;;, - 77; 3; -5.995690, 0.163913, 2.695592;;, - 115; 3; -5.995690, 0.163913, 2.695592;;, - 135; 3; -5.995690, 0.163913, 2.695592;;; - } - } - - Animation x3ds_anim_15 { - {x3ds_xLL_Leg} - AnimationKey { - 0; - 34; - 0; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 1; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 6; 4; 0.551866, 0.832791, 0.024095, 0.036360;;, - 11; 4; 0.510806, 0.858589, 0.022302, 0.037487;;, - 21; 4; 0.521998, 0.851831, 0.022791, 0.037192;;, - 26; 4; 0.541375, 0.839649, 0.023637, 0.036660;;, - 30; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 37; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 43; 4; 0.522001, 0.851829, 0.022791, 0.037192;;, - 52; 4; 0.544120, 0.837873, 0.023757, 0.036582;;, - 61; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 68; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 76; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 77; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 93; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 104; 4; 0.564968, 0.823959, 0.024667, 0.035975;;, - 115; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 135; 4; 0.087073, 0.995247, 0.003802, 0.043453;;, - 139; 4; -0.244382, 0.968698, -0.010670, 0.042294;;, - 155; 4; 0.218585, 0.974843, 0.009544, 0.042563;;, - 160; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 161; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 168; 4; 0.350698, 0.935472, 0.015312, 0.040844;;, - 172; 4; 0.439930, 0.896972, 0.019208, 0.039163;;, - 175; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 178; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 181; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 184; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 187; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 190; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 193; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 207; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 212; 4; 0.495151, 0.867712, 0.021619, 0.037885;;, - 216; 4; 0.580152, 0.813340, 0.025330, 0.035511;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 3.943333, 0.259710, 39.672764;;, - 77; 3; 3.943333, 0.259710, 39.672764;;, - 115; 3; 3.943333, 0.259710, 39.672764;;, - 135; 3; 3.943333, 0.259710, 39.672764;;; - } - } - - Animation x3ds_anim_16 { - {x3ds_xL_Foot} - AnimationKey { - 0; - 34; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 6; 4; 0.680588, -0.191834, 0.680588, 0.191834;;, - 11; 4; 0.677475, -0.202553, 0.677475, 0.202553;;, - 21; 4; 0.676210, -0.206736, 0.676210, 0.206736;;, - 26; 4; 0.677620, -0.202065, 0.677621, 0.202065;;, - 30; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 37; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 43; 4; 0.681390, -0.188966, 0.681390, 0.188966;;, - 52; 4; 0.690346, -0.153046, 0.690346, 0.153046;;, - 61; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 68; 4; 0.679364, -0.196123, 0.679364, 0.196123;;, - 76; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 77; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 93; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 100; 4; 0.705872, 0.041770, 0.705872, -0.041770;;, - 104; 4; 0.698511, 0.109917, 0.698512, -0.109917;;, - 115; 4; 0.707107, -0.000002, 0.707107, 0.000002;;, - 135; 4; 0.612373, 0.353552, 0.612373, -0.353552;;, - 139; 4; 0.672346, 0.218976, 0.672346, -0.218976;;, - 155; 4; 0.659223, -0.255782, 0.659223, 0.255782;;, - 160; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 161; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 168; 4; 0.705347, 0.049859, 0.705347, -0.049859;;, - 172; 4; 0.706854, -0.018889, 0.706854, 0.018889;;, - 175; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 178; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 181; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 184; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 187; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 190; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 193; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 207; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 216; 4; 0.687562, -0.165103, 0.687562, 0.165103;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; 1.061092, -63.263000, -4.043970;;, - 115; 3; 1.061092, -63.263000, -4.043970;;, - 135; 3; 1.061092, -63.263000, -4.043970;;; - } - } - -} - diff --git a/rockem/demechbk.ppm b/rockem/demechbk.ppm deleted file mode 100644 index eb79012..0000000 Binary files a/rockem/demechbk.ppm and /dev/null differ diff --git a/rockem/demechbt.ppm b/rockem/demechbt.ppm deleted file mode 100644 index 175a1a3..0000000 Binary files a/rockem/demechbt.ppm and /dev/null differ diff --git a/rockem/demechch.ppm b/rockem/demechch.ppm deleted file mode 100644 index c71d873..0000000 Binary files a/rockem/demechch.ppm and /dev/null differ diff --git a/rockem/demechgr.ppm b/rockem/demechgr.ppm deleted file mode 100644 index ed3ebeb..0000000 Binary files a/rockem/demechgr.ppm and /dev/null differ diff --git a/rockem/demechh1.ppm b/rockem/demechh1.ppm deleted file mode 100644 index 043967e..0000000 Binary files a/rockem/demechh1.ppm and /dev/null differ diff --git a/rockem/demechh2.ppm b/rockem/demechh2.ppm deleted file mode 100644 index 1c0c79a..0000000 Binary files a/rockem/demechh2.ppm and /dev/null differ diff --git a/rockem/demechhd.ppm b/rockem/demechhd.ppm deleted file mode 100644 index 95cbfd4..0000000 --- a/rockem/demechhd.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 32 -255 -ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$L$$L$$L,,L$$L,,L$$L$$L,,L$$L$$L$$L$$L$$L$$L$$L$$L$$L,,L$$L$$L$$L$$L$$L,,ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒT,,L,,ÔÔÜÔÜÔ$$ÜÔÜÔÜ$$ô<<́44Ü$$ÜÔÔÔÔÔÔÔT$$L$$ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL,,L$$L$$L$$L$$L$$L$$L,,L,,L$$L$$L,,L,,L$$L$$L,,L$$L$$L,,L,,L$$L,,L$$L$$L$$L$$L,,L$$L,,ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$L$$L$$L,,L,,L$$L,,L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L,,L,,L$$L,,L$$ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL,,ŒŒŒL$$ŒŒŒŒŒŒ””ŒŒŒŒŒŒ”Œ ŒŒŒL$$ŒŒŒL$$ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$Ố<<ä44L$$ÔÜÔÜÔ$$ÜÔÔǗ<<́44Ô$$ÔÔÜÔÔÔÔL$$ÔÜ$$́44L,,ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$Ǘ44́< - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -template FrameTransformMatrix { - - Matrix4x4 frameMatrix; -} - -template Frame { - <3D82AB46-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template FloatKeys { - <10DD46A9-775B-11cf-8F52-0040333594A3> - DWORD nValues; - array FLOAT values[nValues]; -} - -template TimedFloatKeys { - - DWORD time; - FloatKeys tfkeys; -} - -template AnimationKey { - <10DD46A8-775B-11cf-8F52-0040333594A3> - DWORD keyType; - DWORD nKeys; - array TimedFloatKeys keys[nKeys]; -} - -template AnimationOptions { - - DWORD openclosed; - DWORD positionquality; -} - -template Animation { - <3D82AB4F-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template AnimationSet { - <3D82AB50-62DA-11cf-AB39-0020AF71E433> - [Animation] -} - -Header { - 1; - 0; - 1; -} - -Material x3ds_mat_BLUEPLASTIC { - 0.043137, 0.152941, 0.650980, 1.000000;; - 23.600000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; -} -Material x3ds_mat_01MECHHAND { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHHN.GIF"; - } -} -Material x3ds_mat_02MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHLA.GIF"; - } -} -Material x3ds_mat_01GROIN { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHGR.GIF"; - } -} -Material x3ds_mat_02MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHLL.GIF"; - } -} -Material x3ds_mat_01MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHUL.GIF"; - } -} -Material x3ds_mat_01HEAD { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHJD.GIF"; - } -} -Material x3ds_mat_01BACK { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHBK.GIF"; - } -} -Material x3ds_mat_01MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHUA.GIF"; - } -} -Material x3ds_mat_01CHEST { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHCH.GIF"; - } -} - -Frame x3ds_Groin { - FrameTransformMatrix { - 1.000000, -0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, -1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 35.534382, 1.024473, 1.000000;; - } - Mesh Groin { - - 31; - -2.000034; -0.000005; -10.091249;, - -0.555553; -0.000005; -10.091249;, - 1.666685; -0.000005; -10.091249;, - -1.192545; -7.018517; -6.581245;, - -3.066506; -0.638034; -6.581247;, - -2.555454; 5.104384; -6.581249;, - -0.851815; 7.018556; -6.581249;, - 0.851807; 7.018508; -6.581249;, - 1.192535; -7.018472; -6.581245;, - -2.333362; -11.356157; 3.071276;, - -6.000068; -1.032373; 3.071294;, - -5.000067; 8.258990; 3.071271;, - -1.666681; 11.356154; 3.071271;, - 1.666685; 11.356246; 3.071271;, - 5.000068; 8.259124; 3.071271;, - 6.000000; -1.032373; 3.071272;, - 2.333369; -11.356207; 3.071276;, - -7.000064; -10.455878; 5.703798;, - -17.999998; -1.012086; 5.703774;, - -15.000135; 7.487373; 5.703794;, - -5.000067; 10.320599; 5.703794;, - 15.000135; 7.487417; 5.703794;, - 17.999998; -1.012087; 5.703772;, - 7.000072; -10.455922; 5.703798;, - -5.833400; -8.955488; 10.091302;, - -15.000134; -0.814139; 10.091294;, - -12.499999; 6.513080; 10.091298;, - -4.166667; 8.955393; 10.091298;, - 12.500135; 6.513032; 10.091298;, - 15.000135; -0.814141; 10.091298;, - 5.833403; -8.955536; 10.091299;; - - 53; - 3;1,4,0;, - 3;1,3,4;, - 3;0,5,1;, - 3;0,4,5;, - 3;1,5,6;, - 3;1,7,2;, - 3;1,6,7;, - 3;2,3,1;, - 3;2,8,3;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,12,6;, - 3;5,11,12;, - 3;6,13,7;, - 3;6,12,13;, - 3;7,13,14;, - 3;7,15,2;, - 3;7,14,15;, - 3;2,16,8;, - 3;2,15,16;, - 3;8,9,3;, - 3;8,16,9;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,20,13;, - 3;13,21,14;, - 3;14,22,15;, - 3;14,21,22;, - 3;15,23,16;, - 3;15,22,23;, - 3;16,17,9;, - 3;16,23,17;, - 3;17,25,18;, - 3;17,24,25;, - 3;18,26,19;, - 3;18,25,26;, - 3;19,27,20;, - 3;19,26,27;, - 3;20,27,13;, - 3;13,28,21;, - 3;13,27,28;, - 3;21,29,22;, - 3;21,28,29;, - 3;22,30,23;, - 3;22,29,30;, - 3;23,24,17;, - 3;23,30,24;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01GROIN} - } - MeshNormals { - 64; - -0.000000;-0.983877;-0.178844;, - -0.599572;0.408149;-0.688424;, - -0.560307;-0.381698;-0.735093;, - 0.000000;0.508170;-0.861257;, - -0.000000;-0.447290;-0.894389;, - 0.559687;0.421739;-0.713363;, - -0.000000;-0.447290;-0.894389;, - 0.937160;-0.239286;-0.253915;, - -0.880351;-0.277520;-0.384663;, - 0.000009;-0.721590;-0.692320;, - -0.680092;-0.595592;-0.427487;, - -0.956486;0.091041;-0.277212;, - -0.776351;0.298631;-0.555067;, - -0.612329;0.585592;-0.531163;, - -0.595763;0.530237;-0.603254;, - 0.000020;0.721585;-0.692326;, - 0.573074;0.533170;-0.622347;, - 0.634858;0.683287;-0.360657;, - 0.000014;-0.721592;-0.692319;, - 0.969727;-0.158439;-0.185813;, - -0.603915;-0.361813;-0.710196;, - 0.000004;-0.998923;-0.046402;, - -0.776502;-0.254344;-0.576501;, - -0.537039;0.077572;-0.839983;, - -0.815733;0.081073;-0.572719;, - -0.490500;0.710156;-0.505063;, - -0.643035;0.648313;-0.407671;, - -0.000027;0.999717;-0.023792;, - -0.010253;0.995713;0.091927;, - 0.398539;0.900274;-0.175139;, - 0.488511;0.525776;-0.696359;, - 0.507328;0.077991;-0.858217;, - 0.768552;0.139116;-0.624480;, - 0.584865;-0.268944;-0.765246;, - 0.845605;-0.234038;-0.479769;, - -0.000011;-0.998923;-0.046406;, - -0.654640;-0.753300;0.063125;, - -0.000010;-0.946205;0.323569;, - -0.582828;-0.600451;-0.547512;, - -0.943651;0.328187;0.042606;, - -0.654989;0.198844;-0.729006;, - -0.275500;0.960845;0.029596;, - -0.400693;0.869473;-0.288898;, - -0.014416;0.942382;0.334229;, - 0.328384;0.846238;-0.419578;, - 0.943441;0.328185;0.047052;, - 0.657040;0.204764;-0.725514;, - 0.655845;-0.753077;-0.052365;, - 0.593011;-0.504799;-0.627309;, - -0.000003;-0.946197;0.323591;, - -0.609542;-0.686312;0.396779;, - -0.000003;-0.946203;0.323573;, - -0.598574;-0.685369;0.414704;, - -0.799848;0.272917;0.534565;, - -0.802248;0.278457;0.528072;, - -0.263482;0.899018;0.349777;, - -0.132000;0.918501;0.372736;, - -0.028788;0.952884;0.301965;, - 0.168538;0.913545;0.370176;, - 0.807613;0.275554;0.521374;, - 0.802809;0.278602;0.527141;, - 0.596840;-0.672007;0.438393;, - 0.597512;-0.684374;0.417866;, - -0.000004;-0.946204;0.323571;; - 53; - 3;2,10,0;, - 3;2,8,10;, - 3;1,12,3;, - 3;1,11,12;, - 3;2,13,14;, - 3;3,16,5;, - 3;3,15,16;, - 3;6,9,4;, - 3;6,18,9;, - 3;8,22,10;, - 3;8,20,22;, - 3;11,24,12;, - 3;11,23,24;, - 3;13,26,14;, - 3;13,25,26;, - 3;15,28,16;, - 3;15,27,28;, - 3;17,29,30;, - 3;16,32,5;, - 3;16,31,32;, - 3;7,34,19;, - 3;7,33,34;, - 3;18,21,9;, - 3;18,35,21;, - 3;20,38,22;, - 3;20,36,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,43,28;, - 3;29,44,30;, - 3;31,46,32;, - 3;31,45,46;, - 3;33,48,34;, - 3;33,47,48;, - 3;35,37,21;, - 3;35,49,37;, - 3;36,52,38;, - 3;36,50,52;, - 3;39,54,40;, - 3;39,53,54;, - 3;41,56,42;, - 3;41,55,56;, - 3;43,57,28;, - 3;29,58,44;, - 3;29,56,58;, - 3;45,60,46;, - 3;45,59,60;, - 3;47,62,48;, - 3;47,61,62;, - 3;49,51,37;, - 3;49,63,51;; - } - MeshTextureCoords { - 31; - 0.546412;0.933469;, - 0.511654;0.933469;, - 0.458180;0.933469;, - 0.526982;0.782985;, - 0.572075;0.782985;, - 0.559777;0.782985;, - 0.518783;0.782985;, - 0.477788;0.782985;, - 0.469589;0.782985;, - 0.554433;0.369152;, - 0.642665;0.369151;, - 0.618602;0.369152;, - 0.538391;0.369152;, - 0.458180;0.369152;, - 0.377969;0.369152;, - 0.353907;0.369152;, - 0.442138;0.369152;, - 0.666728;0.256288;, - 0.931421;0.256289;, - 0.859233;0.256288;, - 0.618602;0.256288;, - 0.137338;0.256288;, - 0.065150;0.256289;, - 0.329843;0.256288;, - 0.638654;0.068183;, - 0.859233;0.068183;, - 0.799074;0.068183;, - 0.598548;0.068183;, - 0.197495;0.068183;, - 0.137338;0.068183;, - 0.357917;0.068183;; - } - } - - Frame x3ds_Chest { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.426950, 1.024469, 11.366162, 1.000000;; - } - Mesh Chest { - - 40; - -5.406384; -9.499996; -0.774913;, - -14.573050; -1.772723; -0.774910;, - -12.073050; 5.181822; -0.774907;, - -3.739717; 7.500004; -0.774907;, - 4.593616; 7.500004; -0.774907;, - 12.926949; 5.181822; -0.774910;, - 15.426949; -1.772723; -0.774914;, - 6.260283; -9.499996; -0.774913;, - -8.859015; -15.499998; 25.225092;, - -23.451246; -1.491749; 25.225090;, - -19.471548; 11.115673; 25.225096;, - -6.205883; 15.318148; 25.225096;, - 7.059781; 15.318148; 25.225096;, - 20.325445; 11.115673; 25.225096;, - 24.305143; -1.491749; 25.225090;, - 9.712914; -15.499998; 25.225092;, - -10.054240; -15.499997; 34.225082;, - -33.573051; -1.863631; 34.225082;, - -22.032743; 10.409095; 34.225082;, - -7.059614; 14.500003; 34.225082;, - 7.913515; 14.500003; 34.225082;, - 22.886644; 10.409095; 34.225082;, - 34.426949; -1.863631; 34.225082;, - 10.908140; -15.499997; 34.225082;, - -10.850827; -11.500252; 40.225082;, - -31.573050; -2.106038; 41.225090;, - -23.739717; 8.348755; 42.225098;, - -7.628605; 9.167019; 40.225098;, - 8.482507; 9.167019; 40.225098;, - 24.593618; 8.348755; 42.225090;, - 32.426949; -2.106038; 41.225090;, - 11.704728; -11.500252; 40.225082;, - -8.517495; -9.499994; 43.225082;, - -18.573050; -2.227266; 43.225090;, - -14.573050; 4.318189; 43.225098;, - -5.961939; 6.500007; 43.225098;, - 6.815839; 6.500007; 43.225090;, - 15.426950; 4.318189; 43.225090;, - 19.426950; -2.227266; 43.225090;, - 9.371394; -9.499994; 43.225082;; - - 70; - 3;0,9,1;, - 3;1,9,2;, - 3;0,8,9;, - 3;9,10,2;, - 3;2,11,3;, - 3;2,10,11;, - 3;3,12,4;, - 3;3,11,12;, - 3;4,13,5;, - 3;4,12,13;, - 3;5,14,6;, - 3;5,13,14;, - 3;6,15,7;, - 3;6,14,15;, - 3;7,8,0;, - 3;7,15,8;, - 3;8,17,9;, - 3;8,16,17;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,21,13;, - 3;12,20,21;, - 3;13,22,14;, - 3;13,21,22;, - 3;14,23,15;, - 3;14,22,23;, - 3;15,16,8;, - 3;15,23,16;, - 3;16,25,17;, - 3;16,24,25;, - 3;17,26,18;, - 3;17,25,26;, - 3;18,27,19;, - 3;18,26,27;, - 3;19,28,20;, - 3;19,27,28;, - 3;20,29,21;, - 3;20,28,29;, - 3;21,30,22;, - 3;21,29,30;, - 3;22,31,23;, - 3;22,30,31;, - 3;23,24,16;, - 3;23,31,24;, - 3;24,33,25;, - 3;24,32,33;, - 3;25,34,26;, - 3;25,33,34;, - 3;26,35,27;, - 3;26,34,35;, - 3;27,36,28;, - 3;27,35,36;, - 3;28,37,29;, - 3;28,36,37;, - 3;29,38,30;, - 3;29,37,38;, - 3;30,39,31;, - 3;30,38,39;, - 3;31,32,24;, - 3;31,39,32;, - 3;37,39,38;, - 3;36,39,37;, - 3;36,32,39;, - 3;35,32,36;, - 3;35,33,32;, - 3;34,33,35;; - MeshMaterialList { - 2; - 70; - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_01BACK} - {x3ds_mat_01CHEST} - } - MeshNormals { - 88; - -0.650995;-0.723751;-0.228890;, - 0.000000;-0.974391;-0.224860;, - -0.630534;-0.747987;-0.207225;, - -0.894967;0.321720;-0.309080;, - -0.899082;0.303417;-0.315579;, - -0.272342;0.915691;-0.295533;, - -0.255614;0.918875;-0.300549;, - 0.000000;0.957642;-0.287961;, - 0.000000;0.957642;-0.287961;, - 0.272548;0.916640;-0.292383;, - 0.256974;0.923763;-0.283949;, - 0.899082;0.303417;-0.315579;, - 0.894967;0.321720;-0.309080;, - 0.649687;-0.721872;-0.238346;, - 0.623476;-0.739614;-0.253474;, - 0.000000;-0.974391;-0.224860;, - -0.592597;-0.735803;-0.327753;, - 0.000000;-0.993577;-0.113156;, - -0.627516;-0.684776;-0.370547;, - -0.846659;0.369049;-0.383368;, - -0.915063;0.288852;-0.281468;, - -0.288159;0.954384;-0.078204;, - -0.286130;0.941081;-0.180268;, - -0.000000;0.994932;-0.100550;, - 0.000000;0.994932;-0.100550;, - 0.288029;0.953917;-0.084156;, - 0.284948;0.937354;-0.200430;, - 0.805421;0.413325;-0.424806;, - 0.840105;0.278624;-0.465394;, - 0.612424;-0.738201;-0.282836;, - 0.664713;-0.722563;-0.189894;, - 0.000000;-0.993577;-0.113156;, - -0.460440;-0.868344;0.184319;, - 0.000000;-0.957096;0.289770;, - -0.546338;-0.811570;-0.207047;, - -0.753038;0.645392;-0.128076;, - -0.789210;0.537054;-0.297861;, - -0.169555;0.935537;0.309874;, - -0.269038;0.931504;0.244784;, - -0.000000;0.917665;0.397355;, - 0.000000;0.917665;0.397355;, - 0.167433;0.931814;0.322007;, - 0.275612;0.957904;0.080362;, - 0.753370;0.657303;0.019667;, - 0.778010;0.578988;-0.243874;, - 0.468713;-0.883303;0.009149;, - 0.573798;-0.817112;-0.055524;, - -0.000000;-0.957096;0.289770;, - -0.309902;-0.616721;0.723613;, - 0.000000;-0.832067;0.554676;, - -0.357822;-0.755836;0.548339;, - -0.413278;0.254886;0.874205;, - -0.677530;0.516275;0.523844;, - -0.005950;0.707002;0.707186;, - -0.061460;0.847479;0.527259;, - -0.000000;0.747432;0.664339;, - 0.000000;0.747432;0.664339;, - 0.013296;0.633065;0.773985;, - 0.045031;0.769592;0.636946;, - 0.446324;0.289292;0.846821;, - 0.686668;0.532100;0.495334;, - 0.318002;-0.685018;0.655458;, - 0.392151;-0.818553;0.419747;, - 0.000000;-0.832067;0.554676;, - -0.415209;-0.574084;0.705712;, - 0.000000;-0.832017;0.554750;, - 0.000000;-0.000000;1.000000;, - -0.283804;-0.500875;0.817667;, - -0.150574;0.092016;0.984307;, - 0.000000;-0.000001;1.000000;, - -0.131964;0.040870;0.990412;, - -0.039366;0.155367;0.987072;, - 0.000000;-0.000001;1.000000;, - 0.001540;0.487185;0.873297;, - 0.000000;0.747367;0.664412;, - 0.000001;-0.000001;1.000000;, - 0.000000;0.747366;0.664413;, - 0.173828;0.686055;0.706479;, - -0.000000;-0.000000;1.000000;, - 0.042888;0.569361;0.820968;, - 0.085553;0.052282;0.994961;, - -0.000001;-0.000000;1.000000;, - 0.118785;0.035793;0.992275;, - 0.150620;-0.208254;0.966408;, - -0.000001;-0.000000;1.000000;, - 0.223800;-0.466352;0.855821;, - 0.000000;-0.832017;0.554750;, - -0.000001;-0.000000;1.000000;; - 70; - 3;0,18,2;, - 3;3,19,4;, - 3;0,16,18;, - 3;19,20,4;, - 3;5,22,6;, - 3;5,21,22;, - 3;7,24,8;, - 3;7,23,24;, - 3;9,26,10;, - 3;9,25,26;, - 3;11,28,12;, - 3;11,27,28;, - 3;13,30,14;, - 3;13,29,30;, - 3;15,17,1;, - 3;15,31,17;, - 3;16,34,18;, - 3;16,32,34;, - 3;19,36,20;, - 3;19,35,36;, - 3;21,38,22;, - 3;21,37,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,44,28;, - 3;27,43,44;, - 3;29,46,30;, - 3;29,45,46;, - 3;31,33,17;, - 3;31,47,33;, - 3;32,50,34;, - 3;32,48,50;, - 3;35,52,36;, - 3;35,51,52;, - 3;37,54,38;, - 3;37,53,54;, - 3;39,56,40;, - 3;39,55,56;, - 3;41,58,42;, - 3;41,57,58;, - 3;43,60,44;, - 3;43,59,60;, - 3;45,62,46;, - 3;45,61,62;, - 3;47,49,33;, - 3;47,63,49;, - 3;48,67,50;, - 3;48,64,67;, - 3;51,70,52;, - 3;51,68,70;, - 3;53,73,54;, - 3;53,71,73;, - 3;55,76,56;, - 3;55,74,76;, - 3;57,79,58;, - 3;57,77,79;, - 3;59,82,60;, - 3;59,80,82;, - 3;61,85,62;, - 3;61,83,85;, - 3;63,65,49;, - 3;63,86,65;, - 3;81,87,84;, - 3;78,87,81;, - 3;78,66,87;, - 3;75,66,78;, - 3;75,69,66;, - 3;72,69,75;; - } - MeshTextureCoords { - 40; - 0.427128;1.000148;, - 0.312615;1.000148;, - 0.343846;1.000148;, - 0.447949;1.000148;, - 0.552051;1.000148;, - 0.656154;1.000148;, - 0.687385;1.000148;, - 0.572872;1.000148;, - 0.383997;0.458321;, - 0.201706;0.458321;, - 0.251421;0.458321;, - 0.417140;0.458321;, - 0.582860;0.458321;, - 0.748579;0.458321;, - 0.798294;0.458321;, - 0.616003;0.458321;, - 0.369065;0.270766;, - 0.075261;0.270766;, - 0.219426;0.270766;, - 0.406475;0.270766;, - 0.593525;0.270766;, - 0.780574;0.270766;, - 0.924739;0.270766;, - 0.630935;0.270766;, - 0.359114;0.145729;, - 0.000307;-0.000148;, - 0.198102;0.104050;, - 0.399367;0.145729;, - 0.600633;0.145729;, - 0.801898;0.104050;, - 0.999693;-0.000148;, - 0.640886;0.145729;, - 0.388263;0.083210;, - 0.262646;0.083210;, - 0.312615;0.083210;, - 0.420188;0.083210;, - 0.579812;0.083210;, - 0.687385;0.083210;, - 0.737354;0.083210;, - 0.611737;0.083210;; - } - } - - Frame x3ds_RU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - -22.158115, 0.000006, 34.682274, 1.000000;; - } - Mesh RU_Arm { - - 12; - -5.501477; 0.000004; -2.449525;, - -2.458304; 6.273188; -0.692550;, - 3.628045; 6.273185; 2.821392;, - 6.671256; -0.000001; 4.578400;, - 3.628039; -6.273173; 2.821389;, - -2.458306; -6.273183; -0.692544;, - 8.608694; 0.000001; -22.981846;, - 10.805939; 4.394536; -21.713266;, - 15.200456; 4.394535; -19.176115;, - 17.397690; -0.000002; -17.907520;, - 15.200446; -4.394550; -19.176085;, - 10.805936; -4.394485; -21.713276;; - - 20; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - -0.716210;0.493166;-0.493793;, - -0.719558;-0.487559;-0.494492;, - -0.499999;-0.000001;0.866026;, - -0.718101;0.487469;-0.496693;, - 0.037713;0.997151;-0.065320;, - -0.499999;-0.000001;0.866026;, - 0.037713;0.997151;-0.065320;, - 0.785987;0.493148;0.372868;, - -0.499999;-0.000001;0.866026;, - 0.788019;0.487564;0.375908;, - 0.785740;-0.493168;0.373360;, - -0.500000;0.000002;0.866026;, - 0.789195;-0.487476;0.373548;, - 0.037714;-0.997151;-0.065321;, - -0.500000;-0.000002;0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.715906;-0.493147;-0.494252;, - -0.499998;0.000002;0.866027;, - -0.714286;0.498840;-0.490870;, - -0.715906;-0.493147;-0.494252;, - 0.499999;0.000001;-0.866026;, - -0.716210;0.493166;-0.493793;, - 0.037713;0.997151;-0.065320;, - 0.499996;-0.000007;-0.866027;, - 0.037713;0.997151;-0.065320;, - 0.783919;0.498709;0.369812;, - 0.499996;-0.000007;-0.866027;, - 0.785987;0.493148;0.372868;, - 0.782250;-0.498838;0.373156;, - 0.499996;-0.000007;-0.866027;, - 0.785740;-0.493168;0.373360;, - 0.037701;-0.997152;-0.065325;, - 0.499999;-0.000002;-0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.712222;-0.498712;-0.493989;, - 0.500003;0.000001;-0.866024;; - 20; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_RL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - 13.822151, 0.000003, -20.565968, 1.000000;; - } - Mesh RL_Arm { - - 24; - 8.013477; 0.000005; -35.874058;, - 12.494552; 9.237309; -33.286903;, - 21.456678; 9.237304; -28.112616;, - 25.937769; -0.000003; -25.525463;, - 21.456680; -9.237155; -28.112616;, - 12.494545; -9.237303; -33.286919;, - -4.837206; 0.000002; -3.067563;, - -2.639963; 4.394549; -1.798980;, - 1.754547; 4.394535; 0.738177;, - 3.951795; -0.000002; 2.006753;, - 1.754554; -4.394537; 0.738174;, - -2.639967; -4.394535; -1.798978;, - 5.120436; -0.663049; -1.830179;, - 10.395203; -0.663048; -7.844885;, - 9.816457; -0.663051; 4.948281;, - 5.120435; 0.336947; -1.830175;, - 10.395203; 0.336952; -7.844885;, - 9.816456; 0.336949; 4.948285;, - 15.652800; -0.663047; -15.309710;, - 20.927570; -0.663046; -21.324427;, - 20.348825; -0.663049; -8.531265;, - 15.652801; 0.336953; -15.309710;, - 20.927568; 0.336950; -21.324423;, - 20.348825; 0.336947; -8.531264;; - - 32; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;, - 3;12,13,14;, - 3;13,17,14;, - 3;13,16,17;, - 3;14,15,12;, - 3;14,17,15;, - 3;16,15,17;, - 3;18,19,20;, - 3;19,23,20;, - 3;19,22,23;, - 3;20,21,18;, - 3;20,23,21;, - 3;22,21,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 64; - -0.811971;0.490075;-0.317063;, - -0.814533;-0.484496;-0.319062;, - 0.500000;0.000000;-0.866025;, - -0.815268;0.484377;-0.317359;, - -0.068845;0.990475;0.119243;, - 0.500000;0.000000;-0.866025;, - -0.068845;0.990475;0.119243;, - 0.679969;0.490008;0.545467;, - 0.500000;0.000000;-0.866025;, - 0.683580;0.484497;0.545876;, - 0.680568;-0.490079;0.544656;, - 0.500000;0.000001;-0.866025;, - 0.682472;-0.484384;0.547362;, - -0.068832;-0.990476;0.119249;, - 0.500000;-0.000000;-0.866025;, - -0.068832;-0.990476;0.119249;, - -0.812373;-0.490007;-0.316139;, - 0.500001;0.000001;-0.866025;, - -0.808639;0.495752;-0.316753;, - -0.812373;-0.490007;-0.316139;, - -0.500002;0.000000;0.866024;, - -0.811971;0.490075;-0.317063;, - -0.068842;0.990475;0.119244;, - -0.499998;0.000000;0.866027;, - -0.068845;0.990475;0.119243;, - 0.676328;0.495497;0.545035;, - -0.499998;0.000000;0.866027;, - 0.679969;0.490008;0.545467;, - 0.678635;-0.495752;0.541927;, - -0.499998;0.000000;0.866027;, - 0.680568;-0.490079;0.544656;, - -0.068843;-0.990476;0.119239;, - -0.499999;-0.000001;0.866026;, - -0.068832;-0.990476;0.119249;, - -0.810178;-0.495496;-0.313202;, - -0.499996;0.000000;0.866028;, - -0.000000;-1.000000;-0.000000;, - -0.822008;-0.000003;0.569476;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045193;, - -0.000001;1.000000;0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - -0.000000;-1.000000;-0.000000;, - -0.822007;0.000001;0.569477;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;0.000001;0.569477;, - -0.822007;0.000001;0.569477;, - 0.000001;1.000000;0.000000;, - 0.998978;0.000002;0.045192;, - 0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;-0.000001;0.569477;, - 0.000001;1.000000;0.000000;; - 32; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;, - 3;36,38,40;, - 3;39,47,41;, - 3;39,45,47;, - 3;42,43,37;, - 3;42,48,43;, - 3;46,44,49;, - 3;50,52,54;, - 3;53,61,55;, - 3;53,59,61;, - 3;56,57,51;, - 3;56,62,57;, - 3;60,58,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_R_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 17.201626, -0.532497, -26.974564, 1.000000;; - } - Mesh R_Hand { - - 8; - -6.156250; -13.356396; -4.582500;, - 6.843750; -13.356392; -4.582499;, - 3.756248; -0.356396; -2.650550;, - -3.068748; -0.356396; -2.650550;, - -6.156250; -13.356396; 4.582500;, - 6.843750; -13.356392; 4.582499;, - 3.756248; -0.356396; 2.650486;, - -3.068748; -0.356396; 2.650486;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032627;0.773816;, - 0.032627;0.773815;, - 0.231505;-0.195808;, - 0.231505;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777202;-0.195808;, - 0.777202;-0.195808;; - } - } - } - } - } - - Frame x3ds_LU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - 22.800379, 0.000008, 34.682274, 1.000000;; - } - Mesh LU_Arm { - - 12; - 5.988949; 0.000003; 0.629316;, - 2.474997; 6.273188; 0.629317;, - -4.552909; 6.273124; 0.629308;, - -8.066915; 0.000002; 0.629317;, - -4.552907; -6.273170; 0.629307;, - 2.474994; -6.273119; 0.629322;, - 4.035422; 0.000003; -24.207560;, - 1.498248; 4.394476; -24.207499;, - -3.576368; 4.394538; -24.207462;, - -6.113520; 0.000003; -24.207476;, - -3.576366; -4.394546; -24.207474;, - 1.498253; -4.394546; -24.207510;; - - 20; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - 0.867150;0.493170;-0.069529;, - 0.870399;-0.487563;-0.068461;, - -0.000001;-0.000001;1.000000;, - 0.870241;0.487469;-0.071097;, - -0.000009;0.997152;-0.075422;, - -0.000001;-0.000001;1.000000;, - -0.000009;0.997152;-0.075422;, - -0.867118;0.493150;-0.070072;, - -0.000001;-0.000001;1.000000;, - -0.870397;0.487569;-0.068456;, - -0.867152;-0.493168;-0.069523;, - 0.000000;0.000001;1.000000;, - -0.870238;-0.487476;-0.071088;, - 0.000007;-0.997152;-0.075421;, - 0.000000;-0.000001;1.000000;, - 0.000007;-0.997152;-0.075421;, - 0.867118;-0.493148;-0.070077;, - -0.000002;0.000002;1.000000;, - 0.864021;0.498848;-0.067959;, - 0.867118;-0.493148;-0.070077;, - -0.000022;0.000001;-1.000000;, - 0.867150;0.493170;-0.069529;, - 0.000012;0.997151;-0.075427;, - -0.000007;0.000007;-1.000000;, - -0.000009;0.997152;-0.075422;, - -0.863800;0.498709;-0.071684;, - -0.000007;0.000007;-1.000000;, - -0.867118;0.493150;-0.070072;, - -0.864027;-0.498838;-0.067955;, - -0.000007;0.000007;-1.000000;, - -0.867152;-0.493168;-0.069523;, - -0.000001;-0.997152;-0.075423;, - -0.000002;-0.000002;-1.000000;, - 0.000007;-0.997152;-0.075421;, - 0.863799;-0.498710;-0.071691;, - -0.000007;0.000001;-1.000000;; - 20; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_LL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.446584, 0.000005, -24.389263, 1.000000;; - } - Mesh LL_Arm { - - 24; - 9.756407; 0.000006; -35.407063;, - 4.582108; 9.237311; -35.407040;, - -5.766471; 9.237184; -35.407040;, - -10.940788; 0.000005; -35.407043;, - -5.766469; -9.237275; -35.407063;, - 4.582115; -9.237300; -35.407051;, - 4.482169; 0.000002; -0.570457;, - 1.945006; 4.394486; -0.570453;, - -3.129325; 4.394474; -0.570462;, - -5.666486; 0.000001; -0.570473;, - -3.129334; -4.394471; -0.570465;, - 1.945009; -4.394471; -0.570457;, - -4.525237; -0.663046; -4.414725;, - -6.085963; -0.663051; -12.261003;, - -11.981339; -0.663046; -0.892426;, - -4.525237; 0.336950; -4.414725;, - -6.085961; 0.336952; -12.261005;, - -11.981338; 0.336954; -0.892433;, - -6.906761; -0.663049; -21.354527;, - -8.467486; -0.663040; -29.200804;, - -14.362860; -0.663049; -17.832241;, - -6.906761; 0.336958; -21.354527;, - -8.467486; 0.336956; -29.200804;, - -14.362861; 0.336954; -17.832237;; - - 32; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;, - 3;13,12,14;, - 3;17,13,14;, - 3;16,13,17;, - 3;15,14,12;, - 3;17,14,15;, - 3;15,16,17;, - 3;19,18,20;, - 3;23,19,20;, - 3;22,19,23;, - 3;21,20,18;, - 3;23,20,21;, - 3;21,22,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 64; - 0.861718;0.490078;0.131402;, - 0.864937;-0.484496;0.130951;, - -0.000000;0.000002;-1.000000;, - 0.864723;0.484376;0.132795;, - -0.000012;0.990475;0.137689;, - -0.000000;0.000002;-1.000000;, - -0.000012;0.990475;0.137689;, - -0.861601;0.490013;0.132404;, - -0.000000;0.000002;-1.000000;, - -0.864933;0.484503;0.130952;, - -0.861717;-0.490079;0.131403;, - -0.000001;0.000001;-1.000000;, - -0.864721;-0.484379;0.132795;, - -0.000003;-0.990475;0.137691;, - -0.000001;0.000002;-1.000000;, - -0.000003;-0.990475;0.137691;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000002;-1.000000;, - 0.858676;0.495758;0.130003;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000000;1.000000;, - 0.861718;0.490078;0.131402;, - -0.000003;0.990475;0.137691;, - -0.000002;-0.000002;1.000000;, - -0.000012;0.990475;0.137689;, - -0.858232;0.495502;0.133849;, - -0.000002;-0.000002;1.000000;, - -0.861601;0.490013;0.132404;, - -0.858676;-0.495757;0.130005;, - -0.000002;-0.000002;1.000000;, - -0.861717;-0.490079;0.131403;, - -0.000000;-0.990475;0.137691;, - -0.000003;0.000000;1.000000;, - -0.000003;-0.990475;0.137691;, - 0.858232;-0.495502;0.133850;, - -0.000002;-0.000000;1.000000;, - 0.000000;-1.000000;0.000001;, - 0.427141;0.000000;0.904185;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000000;0.904185;, - 0.427141;0.000000;0.904185;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000000;-0.460352;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000006;0.904185;, - 0.000001;1.000000;0.000000;, - -0.000001;-1.000000;-0.000001;, - 0.427140;-0.000000;0.904185;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000000;0.904185;, - 0.427140;-0.000000;0.904185;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000000;-0.460352;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000003;0.904185;, - -0.000001;1.000000;-0.000000;; - 32; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;, - 3;38,36,40;, - 3;47,39,41;, - 3;45,39,47;, - 3;43,42,37;, - 3;48,42,43;, - 3;44,46,49;, - 3;52,50,54;, - 3;61,53,55;, - 3;59,53,61;, - 3;57,56,51;, - 3;62,56,57;, - 3;58,60,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_L_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -1.719950, -0.532492, -32.044582, 1.000000;; - } - Mesh L_Hand { - - 8; - -6.357616; -13.356400; -4.582500;, - 6.642384; -13.356396; -4.582499;, - 3.554882; -0.356400; -2.650550;, - -3.270115; -0.356400; -2.650550;, - -6.357616; -13.356400; 4.582500;, - 6.642384; -13.356396; 4.582499;, - 3.554882; -0.356399; 2.650486;, - -3.270115; -0.356399; 2.650486;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032628;0.773816;, - 0.032628;0.773815;, - 0.231506;-0.195808;, - 0.231506;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777203;-0.195808;, - 0.777203;-0.195808;; - } - } - } - } - } - - Frame x3ds_Head { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - 0.000000, 0.000000, -1.000000, 0.000000, - 0.000000, 0.320932, 43.031708, 1.000000;; - } - Mesh Head { - - 14; - 0.425325; 1.962787; -19.572998;, - 8.670237; -5.947898; -18.382002;, - 11.100914; 4.408364; -18.855011;, - 1.451953; 10.441894; -18.855013;, - -9.223644; 5.996317; -18.855013;, - -8.846230; -4.605626; -18.382004;, - -0.560038; -8.044583; -15.549453;, - 8.843442; -3.382582; -2.678222;, - 11.100921; 4.408369; -3.122056;, - 1.451952; 10.441850; -3.122057;, - -9.223644; 5.996321; -3.121026;, - -8.571328; -2.049199; -2.677688;, - -0.522815; -9.619122; -0.089148;, - 0.425325; -0.037214; 3.679924;; - - 24; - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;0,6,5;, - 3;0,1,6;, - 3;1,8,7;, - 3;1,2,8;, - 3;2,9,8;, - 3;2,3,9;, - 3;3,10,9;, - 3;3,4,10;, - 3;4,11,10;, - 3;4,5,11;, - 3;5,12,11;, - 3;5,6,12;, - 3;6,7,12;, - 3;6,1,7;, - 3;13,11,12;, - 3;13,10,11;, - 3;13,9,10;, - 3;13,8,9;, - 3;13,7,8;, - 3;13,12,7;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01HEAD} - } - MeshNormals { - 60; - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - 0.081687;-0.064598;-0.994562;, - -0.201835;-0.348186;-0.915439;, - 0.967436;-0.252527;0.017281;, - 0.263240;-0.952568;0.152705;, - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - 0.973545;-0.228497;-0.000000;, - 0.530181;0.847885;-0.000000;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - 0.530184;0.847883;0.000002;, - -0.384421;0.923158;0.000003;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - -0.384425;0.923156;-0.000000;, - -0.998267;-0.057694;0.011560;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.999136;-0.034537;0.023112;, - -0.542700;-0.839759;0.016782;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - -0.354072;-0.930491;-0.093912;, - 0.406709;-0.912942;0.033537;, - 0.960443;-0.276327;0.034547;, - 0.406709;-0.912942;0.033537;, - 0.568130;-0.118225;0.814402;, - 0.465164;-0.363520;0.807140;, - 0.967436;-0.252527;0.017281;, - 0.530181;0.847885;-0.000000;, - 0.310173;0.496041;0.811010;, - 0.568130;-0.118225;0.814402;, - 0.530181;0.847885;-0.000000;, - -0.384421;0.923158;0.000003;, - -0.227197;0.545783;0.806537;, - 0.310173;0.496041;0.811010;, - -0.384421;0.923158;0.000003;, - -0.996729;-0.080813;0.000000;, - -0.576846;-0.001758;0.816851;, - -0.227197;0.545783;0.806537;, - -0.998267;-0.057694;0.011560;, - -0.700901;-0.701945;0.126535;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.542700;-0.839759;0.016782;, - 0.535392;-0.840126;-0.086851;, - -0.514933;-0.269185;0.813870;, - 0.465164;-0.363520;0.807140;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.227197;0.545783;0.806537;, - 0.310173;0.496041;0.811010;, - 0.568130;-0.118225;0.814402;, - 0.465164;-0.363520;0.807140;; - 24; - 3;0,10,6;, - 3;1,14,11;, - 3;2,18,15;, - 3;3,22,19;, - 3;4,26,23;, - 3;5,7,27;, - 3;8,34,30;, - 3;8,12,34;, - 3;13,38,35;, - 3;13,16,38;, - 3;17,42,39;, - 3;17,20,42;, - 3;21,46,43;, - 3;21,24,46;, - 3;25,50,47;, - 3;25,28,50;, - 3;29,31,51;, - 3;29,9,31;, - 3;54,48,52;, - 3;55,44,49;, - 3;56,40,45;, - 3;57,36,41;, - 3;58,32,37;, - 3;59,53,33;; - } - MeshTextureCoords { - 14; - 0.023465;0.004861;, - 0.658502;0.065512;, - 0.821431;0.041424;, - 0.999136;0.041424;, - 0.180988;0.041424;, - 0.342098;0.065512;, - 0.493676;0.209760;, - 0.695904;0.865226;, - 0.821431;0.842624;, - 0.999136;0.842624;, - 0.180988;0.842657;, - 0.305883;0.865234;, - 0.497409;0.997055;, - 0.480761;1.188995;; - } - } - } - } - - Frame x3ds_RU_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, -0.087156, 0.000000, - -0.000000, -1.000000, -0.000000, 0.000000, - -0.087156, 0.000000, -0.996195, 0.000000, - -6.849588, -0.163910, 2.374464, 1.000000;; - } - Mesh RU_Leg { - - 8; - -11.013890; -7.083223; -1.154131;, - 3.719295; -7.083223; -1.154224;, - 3.719296; 7.083232; -1.154223;, - -11.013890; 7.083232; -1.154134;, - -10.314070; -5.595809; 40.157955;, - 3.019470; -5.595746; 40.157955;, - 3.019406; 5.595754; 40.157948;, - -10.314070; 5.595690; 40.157944;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - -0.000006;0.000000;-1.000000;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;0.000006;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.999857;-0.000000;0.016939;, - -0.000005;0.999352;0.035982;, - -0.000006;-0.000000;-1.000000;, - 0.000000;0.999352;0.035984;, - -0.999857;0.000000;0.016937;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;, - 0.000005;-0.999352;0.035981;, - 0.999857;0.000006;0.016937;, - -0.000000;0.000001;1.000000;, - 0.999857;0.000006;0.016937;, - -0.000005;0.999352;0.035982;, - -0.000000;0.000001;1.000000;, - -0.000005;0.999352;0.035982;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_RL_Leg { - FrameTransformMatrix { - 0.996195, -0.000000, -0.087156, 0.000000, - -0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - -3.359494, 0.259708, 38.976967, 1.000000;; - } - Mesh RL_Leg { - - 26; - 9.229027; -71.518196; -17.699999;, - -10.562513; -71.518204; -17.699999;, - -8.726734; 0.601814; -5.908435;, - 7.393265; 0.601810; -5.908433;, - 11.931103; -75.798187; 11.700004;, - -13.264593; -75.798187; 11.699999;, - -8.726734; 0.601814; 5.908564;, - 7.393263; 0.601810; 5.908566;, - -9.401619; -8.003811; 0.055164;, - -9.401621; -19.983799; 0.055164;, - -21.381618; -5.008812; 0.055162;, - -9.401619; -8.003811; 1.552658;, - -9.401621; -19.983799; 1.552658;, - -21.381618; -5.008812; 1.552657;, - -9.406624; -28.501522; 0.062683;, - -9.406624; -40.501522; 0.062684;, - -21.406624; -25.501520; 0.062688;, - -9.406624; -28.501522; 1.562678;, - -9.406624; -40.501522; 1.562678;, - -21.406624; -25.501520; 1.562676;, - -9.411629; -50.486736; 0.070203;, - -9.411633; -62.506737; 0.070203;, - -21.431629; -47.481735; 0.070202;, - -9.411629; -50.486736; 1.572698;, - -9.411633; -62.506737; 1.572698;, - -21.431629; -47.481735; 1.572697;; - - 30; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;6,1,5;, - 3;2,1,6;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;, - 3;8,9,10;, - 3;9,13,10;, - 3;9,12,13;, - 3;10,11,8;, - 3;10,13,11;, - 3;12,11,13;, - 3;14,15,16;, - 3;15,19,16;, - 3;15,18,19;, - 3;16,17,14;, - 3;16,19,17;, - 3;18,17,19;, - 3;20,21,22;, - 3;21,25,22;, - 3;21,24,25;, - 3;22,23,20;, - 3;22,25,23;, - 3;24,23,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 66; - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - 0.995537;0.039363;-0.085767;, - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - -0.998354;0.039138;-0.041929;, - -0.000000;0.161357;-0.986896;, - -0.999676;0.025446;0.000000;, - 0.000000;1.000000;0.000000;, - 0.000000;0.161357;-0.986896;, - 0.000000;1.000000;0.000000;, - 0.997858;0.049375;-0.042925;, - 0.000000;-0.989569;-0.144059;, - 0.997858;0.049375;-0.042925;, - -0.000000;0.075587;0.997139;, - 0.000000;-0.989569;-0.144059;, - -0.995087;0.052754;-0.083776;, - -0.000000;0.075587;0.997139;, - -0.998354;0.039138;-0.041929;, - 0.000000;1.000000;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;1.000000;0.000000;, - 0.998241;0.059291;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970143;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;-0.000000;, - 0.242536;0.970143;-0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - -0.000000;-0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;; - 30; - 3;6,0,3;, - 3;9,0,6;, - 3;15,1,12;, - 3;4,1,15;, - 3;18,5,16;, - 3;7,5,18;, - 3;21,8,19;, - 3;10,8,21;, - 3;13,11,22;, - 3;2,11,13;, - 3;20,14,23;, - 3;17,14,20;, - 3;24,26,28;, - 3;27,35,29;, - 3;27,33,35;, - 3;30,31,25;, - 3;30,36,31;, - 3;34,32,37;, - 3;38,40,42;, - 3;41,49,43;, - 3;41,47,49;, - 3;44,45,39;, - 3;44,50,45;, - 3;48,46,51;, - 3;52,54,56;, - 3;55,63,57;, - 3;55,61,63;, - 3;58,59,53;, - 3;58,64,59;, - 3;62,60,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_R_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - -0.849463, -62.299637, -2.502151, 1.000000;; - } - Mesh R_Foot { - - 8; - -37.191723; -17.003931; 4.286171;, - 7.580331; -17.003948; 6.445354;, - 5.179023; -0.329503; 4.340307;, - -27.147438; -7.877935; 1.341817;, - -37.191738; -17.003931; -4.286145;, - 7.580253; -17.003933; -6.445300;, - 5.179095; -0.329495; -4.340262;, - -27.147472; -7.877943; -1.341796;; - - 10; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 20; - -0.123025;0.309552;0.942890;, - -0.000000;-1.000000;0.000000;, - -0.672464;0.740130;0.000001;, - -0.047832;0.118323;0.991822;, - -0.000000;-1.000000;-0.000001;, - -0.123025;0.309552;0.942890;, - -0.227389;0.973804;-0.000001;, - -0.192729;0.486970;0.851889;, - -0.227389;0.973804;0.000000;, - -0.672466;0.740128;0.000006;, - -0.000000;-1.000000;0.000000;, - -0.672466;0.740128;0.000006;, - -0.123024;0.309552;-0.942891;, - -0.000000;-1.000000;0.000000;, - -0.047831;0.118323;-0.991822;, - -0.227389;0.973804;-0.000001;, - -0.123024;0.309552;-0.942891;, - -0.227389;0.973804;-0.000001;, - -0.672466;0.740128;0.000006;, - -0.192728;0.486969;-0.851891;; - 10; - 3;5,0,3;, - 3;7,0,5;, - 3;13,1,10;, - 3;4,1,13;, - 3;17,6,15;, - 3;8,6,17;, - 3;11,9,18;, - 3;2,9,11;, - 3;16,12,19;, - 3;14,12,16;; - } - } - } - } - } - - Frame x3ds_LU_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, 0.087156, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - 0.087156, 0.000000, -0.996195, 0.000000, - 5.995695, -0.163910, 2.695593, 1.000000;; - } - Mesh LU_Leg { - - 8; - -2.905133; -7.083223; -0.791073;, - 11.828092; -7.083160; -0.790935;, - 11.828092; 7.083232; -0.790933;, - -2.905131; 7.083232; -0.791068;, - -2.205294; -5.595747; 40.521160;, - 11.128267; -5.595746; 40.521164;, - 11.128268; 5.595754; 40.521152;, - -2.205276; 5.595753; 40.521152;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - 0.000009;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.000004;-0.999352;0.035981;, - 0.999857;-0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.999857;-0.000000;0.016937;, - -0.000000;0.999352;0.035983;, - 0.000009;0.000000;-1.000000;, - -0.000000;0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.000001;1.000000;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.999352;0.035983;, - -0.000000;0.000001;1.000000;, - -0.000000;0.999352;0.035983;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_LL_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, 0.087156, 0.000000, - 0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 3.943336, 0.259716, 39.672768, 1.000000;; - } - Mesh LL_Leg { - - 26; - -9.017391; -71.197044; -17.699999;, - 10.774149; -71.197052; -17.699999;, - 8.938375; 0.922958; -5.908498;, - -7.181622; 0.922955; -5.908498;, - -11.719472; -75.477051; 11.700000;, - 13.476221; -75.477051; 11.700000;, - 8.938375; 0.922958; 5.908501;, - -7.181622; 0.922955; 5.908501;, - 9.618265; -7.680378; 0.062687;, - 9.618269; -19.680382; 0.062687;, - 21.618265; -4.680378; 0.062687;, - 9.618265; -7.680378; 1.562681;, - 9.618269; -19.680382; 1.562681;, - 21.618265; -4.680378; 1.562681;, - 9.618265; -28.180374; 0.062689;, - 9.618265; -40.180374; 0.062689;, - 21.618265; -25.180378; 0.062694;, - 9.618265; -28.180374; 1.562683;, - 9.618265; -40.180374; 1.562683;, - 21.618265; -25.180378; 1.562684;, - 9.618269; -50.180374; 0.062691;, - 9.618265; -62.180374; 0.062691;, - 21.618269; -47.180374; 0.062691;, - 9.618269; -50.180374; 1.562685;, - 9.618265; -62.180374; 1.562685;, - 21.618269; -47.180374; 1.562685;; - - 30; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;, - 3;9,8,10;, - 3;13,9,10;, - 3;12,9,13;, - 3;11,10,8;, - 3;13,10,11;, - 3;11,12,13;, - 3;15,14,16;, - 3;19,15,16;, - 3;18,15,19;, - 3;17,16,14;, - 3;19,16,17;, - 3;17,18,19;, - 3;21,20,22;, - 3;25,21,22;, - 3;24,21,25;, - 3;23,22,20;, - 3;25,22,23;, - 3;23,24,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 66; - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - -0.995537;0.039364;-0.085767;, - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - 0.998354;0.039138;-0.041929;, - 0.000000;0.161356;-0.986896;, - 0.999676;0.025446;0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;0.161356;-0.986896;, - -0.000000;1.000000;0.000000;, - -0.997857;0.049375;-0.042925;, - -0.000000;-0.989569;-0.144060;, - -0.997857;0.049375;-0.042925;, - -0.000000;0.075588;0.997139;, - -0.000000;-0.989569;-0.144060;, - 0.995087;0.052753;-0.083776;, - 0.000000;0.075588;0.997139;, - 0.998354;0.039138;-0.041929;, - -0.000000;1.000000;0.000000;, - -0.000000;0.075588;0.997139;, - -0.000000;1.000000;0.000000;, - -0.998241;0.059291;0.000000;, - -0.000000;0.075588;0.997139;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242535;0.970143;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;; - 30; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;, - 3;26,24,28;, - 3;35,27,29;, - 3;33,27,35;, - 3;31,30,25;, - 3;36,30,31;, - 3;32,34,37;, - 3;40,38,42;, - 3;49,41,43;, - 3;47,41,49;, - 3;45,44,39;, - 3;50,44,45;, - 3;46,48,51;, - 3;54,52,56;, - 3;63,55,57;, - 3;61,55,63;, - 3;59,58,53;, - 3;64,58,59;, - 3;60,62,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_L_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - 1.061086, -63.263023, -2.697744, 1.000000;; - } - Mesh L_Foot { - - 8; - -36.996124; -15.719404; -4.210043;, - 7.775673; -15.719419; -6.330903;, - 5.374375; 0.954521; -4.263234;, - -26.951843; -6.593406; -1.317977;, - -36.995773; -15.719404; 4.210084;, - 7.775607; -15.719404; 6.330931;, - 5.374449; 0.954529; 4.263263;, - -26.951618; -6.593413; 1.317985;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 20; - -0.121241;0.305074;-0.944580;, - 0.000000;-1.000000;0.000000;, - -0.672469;0.740125;0.000028;, - -0.046996;0.116259;-0.992106;, - -0.000000;-1.000000;0.000001;, - -0.121241;0.305074;-0.944580;, - -0.227378;0.973807;0.000001;, - -0.190220;0.480642;-0.856037;, - -0.227375;0.973807;0.000022;, - -0.672459;0.740134;0.000060;, - 0.000000;-1.000000;0.000000;, - -0.672459;0.740134;0.000060;, - -0.121242;0.305076;0.944579;, - 0.000000;-1.000000;0.000000;, - -0.046997;0.116259;0.992106;, - -0.227378;0.973807;0.000001;, - -0.121242;0.305076;0.944579;, - -0.227378;0.973807;0.000001;, - -0.672459;0.740134;0.000060;, - -0.190222;0.480645;0.856035;; - 10; - 3;0,5,3;, - 3;0,7,5;, - 3;1,13,10;, - 3;1,4,13;, - 3;6,17,15;, - 3;6,8,17;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,16,19;, - 3;12,14,16;; - } - } - } - } - } -} -AnimationSet x3ds_animset_0 { - Animation x3ds_anim_0 { - {x3ds_Groin} - AnimationKey { - 0; - 11; - 0; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 77; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 85; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 93; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 115; 4; 0.000000, 1.000000, 0.000000, -0.000000;;, - 135; 4; 0.000000, 1.000000, 0.000000, -0.000000;;, - 160; 4; 0.707107, 0.707106, -0.000000, -0.000000;;, - 161; 4; -0.707107, -0.707106, 0.000000, 0.000000;;, - 175; 4; -0.705815, -0.705815, -0.042718, -0.042718;;, - 193; 4; -0.706998, -0.706997, -0.012419, -0.012419;;, - 216; 4; -0.707107, -0.707106, 0.000001, 0.000001;;; - } - AnimationKey { - 1; - 5; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 93; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 29; - 0; 3; 0.000000, 35.534382, 1.024473;;, - 1; 3; 0.000000, 23.889210, 1.024473;;, - 15; 3; 0.000000, 18.884680, 2.903347;;, - 30; 3; 0.000000, 23.889210, 1.024473;;, - 33; 3; 0.000000, 23.889210, 1.024473;;, - 43; 3; 0.000000, 20.962900, 1.024473;;, - 52; 3; 0.000000, 25.059750, 1.024473;;, - 61; 3; 0.000000, 23.518040, 5.044694;;, - 68; 3; 0.000000, 18.818790, 12.939010;;, - 76; 3; 0.000000, 23.518040, 5.044694;;, - 77; 3; 0.000000, 23.518040, 5.044694;;, - 93; 3; 0.000000, 23.518040, 5.044694;;, - 100; 3; 0.000000, 29.812460, -75.539803;;, - 104; 3; 0.000000, 19.677170, -97.369301;;, - 115; 3; 0.000000, -67.336800, -156.016006;;, - 135; 3; 0.000000, -67.336800, -139.858002;;, - 145; 3; 0.000000, -13.702700, -104.629097;;, - 146; 3; 0.000000, -12.018200, -99.536301;;, - 160; 3; 0.000000, 23.518040, -5.044694;;, - 161; 3; 0.000000, 23.518040, -5.044694;;, - 175; 3; 0.000000, 33.713280, 22.388664;;, - 178; 3; 0.000000, 24.016300, 24.758060;;, - 181; 3; 0.000000, 33.713280, 26.460903;;, - 184; 3; 0.000000, 24.016300, 25.572514;;, - 187; 3; 0.000000, 33.713280, 26.460907;;, - 190; 3; 0.000000, 24.016300, 26.386951;;, - 193; 3; 0.000000, 33.713280, 26.460903;;, - 207; 3; 0.000000, 33.713280, 26.460907;;, - 216; 3; 0.000000, 23.518040, -5.044694;;; - } - } - - Animation x3ds_anim_1 { - {x3ds_Chest} - AnimationKey { - 0; - 23; - 0; 4; 0.000000, -0.000000, -0.000000, -1.000000;;, - 1; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 15; 4; 0.317305, 0.000000, -0.000000, -0.948324;;, - 30; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 31; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 43; 4; -0.095846, -0.000000, -0.000000, -0.995396;;, - 52; 4; 0.442381, 0.058240, 0.116812, -0.887278;;, - 61; 4; 0.258819, -0.000000, -0.000000, -0.965926;;, - 68; 4; 0.332019, -0.072538, -0.264839, -0.902420;;, - 76; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 77; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 85; 4; 0.535255, 0.003802, -0.087074, -0.840182;;, - 93; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 95; 4; 0.221903, -0.017679, -0.071612, -0.972275;;, - 102; 4; 0.122182, -0.024167, -0.140528, -0.982212;;, - 115; 4; -0.000001, 0.000000, -0.000000, -1.000000;;, - 135; 4; -0.000001, -0.000000, 0.529919, -0.848048;;, - 139; 4; 0.030693, 0.002685, 0.581681, -0.812834;;, - 160; 4; 0.258820, -0.000000, -0.000000, -0.965926;;, - 161; 4; 0.258820, -0.000000, -0.000001, -0.965926;;, - 175; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 207; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 216; 4; 0.258820, -0.000000, -0.000001, -0.965926;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 0.426950, -1.024470, 11.366163;;, - 77; 3; 0.426950, -1.024470, 11.366163;;, - 115; 3; 0.426950, -1.024470, 11.366163;;, - 135; 3; 0.426950, -1.024470, 11.366163;;; - } - } - - Animation x3ds_anim_2 { - {x3ds_RU_Arm} - AnimationKey { - 0; - 30; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.065263, 0.113039, 0.495722, -0.858616;;, - 15; 4; -0.056193, 0.117811, 0.426828, -0.894864;;, - 30; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 31; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 43; 4; 0.053090, 0.119242, -0.403256, -0.905730;;, - 52; 4; -0.220806, -0.041267, 0.855768, -0.466049;;, - 61; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 68; 4; -0.025312, 0.111794, -0.475054, -0.872459;;, - 76; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 77; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 85; 4; 0.133832, 0.353720, 0.308203, -0.872916;;, - 93; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 96; 4; -0.200990, -0.200282, 0.412420, -0.865679;;, - 97; 4; -0.132674, -0.082403, 0.416033, -0.895837;;, - 98; 4; -0.201870, -0.265437, 0.361052, -0.870881;;, - 99; 4; -0.134623, -0.131057, 0.365286, -0.911739;;, - 100; 4; -0.228976, -0.420777, 0.283694, -0.830683;;, - 115; 4; -0.000001, -0.398748, 0.000001, -0.917061;;, - 135; 4; -0.078327, -0.125349, -0.524098, -0.838734;;, - 139; 4; -0.071913, -0.092789, -0.291009, -0.949491;;, - 160; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 161; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 175; 4; -0.165429, -0.450070, 0.634668, -0.606026;;, - 178; 4; -0.307408, -0.362634, 0.387903, -0.789638;;, - 182; 4; -0.174187, -0.394643, 0.618206, -0.657068;;, - 185; 4; -0.280338, -0.279007, 0.343836, -0.851671;;, - 188; 4; -0.185051, -0.307103, 0.545153, -0.757794;;, - 192; 4; -0.218786, -0.219812, 0.386801, -0.868447;;, - 216; 4; -0.065263, 0.113040, 0.495724, -0.858616;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -22.158115, 0.000001, 34.682266;;, - 77; 3; -22.158115, 0.000001, 34.682266;;, - 115; 3; -22.158115, 0.000001, 34.682266;;, - 135; 3; -22.158115, 0.000001, 34.682266;;; - } - } - - Animation x3ds_anim_3 { - {x3ds_RL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 15; 4; 0.909961, 0.414693, -0.000000, -0.000000;;, - 30; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 31; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 43; 4; 0.622515, 0.782608, 0.000000, -0.000000;;, - 52; 4; 0.998630, 0.052336, -0.000000, -0.000000;;, - 61; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 68; 4; 0.987688, 0.156435, -0.000000, -0.000000;;, - 76; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 77; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 85; 4; 0.673714, 0.675106, -0.106243, 0.281164;;, - 93; 4; 0.866025, 0.500000, 0.000000, -0.000000;;, - 96; 4; 0.846469, 0.531913, 0.010984, -0.020921;;, - 115; 4; 1.000000, -0.000001, -0.000000, 0.000000;;, - 135; 4; 0.913546, 0.406736, -0.000000, 0.000000;;, - 139; 4; 0.981076, 0.193621, -0.000000, -0.000000;;, - 160; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 161; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 175; 4; 0.898794, 0.438370, -0.000000, 0.000000;;, - 178; 4; 0.668687, 0.743544, -0.000000, 0.000000;;, - 182; 4; 0.826796, 0.562503, -0.000000, 0.000000;;, - 185; 4; 0.651408, 0.758727, -0.000000, 0.000000;;, - 188; 4; 0.705617, 0.708593, -0.000000, 0.000000;;, - 192; 4; 0.616021, 0.787730, -0.000000, 0.000000;;, - 216; 4; 0.866026, 0.499999, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 13.822151, 0.000000, -20.565975;;, - 77; 3; 13.822151, 0.000000, -20.565975;;, - 115; 3; 13.822151, 0.000000, -20.565975;;, - 135; 3; 13.822151, 0.000000, -20.565975;;; - } - } - - Animation x3ds_anim_4 { - {x3ds_R_Hand} - AnimationKey { - 0; - 11; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 52; 4; 0.085633, 0.098509, -0.650446, -0.748253;;, - 68; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 77; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 85; 4; 0.095461, 0.089019, -0.725097, -0.676164;;, - 93; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 160; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 161; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 216; 4; 0.083025, 0.100717, -0.630637, -0.765023;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 17.201632, -0.532498, -26.974579;;, - 77; 3; 17.201632, -0.532498, -26.974579;;, - 115; 3; 17.201632, -0.532498, -26.974579;;, - 135; 3; 17.201632, -0.532498, -26.974579;;; - } - } - - Animation x3ds_anim_5 { - {x3ds_LU_Arm} - AnimationKey { - 0; - 31; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.017037, 0.129409, 0.129410, -0.982963;;, - 15; 4; -0.027138, 0.127674, 0.206133, -0.969779;;, - 30; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 31; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 43; 4; -0.326088, 0.265924, 0.458283, -0.782897;;, - 52; 4; 0.023797, -0.004380, -0.508650, -0.860633;;, - 61; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 68; 4; 0.039250, 0.124485, -0.298134, -0.945558;;, - 76; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 77; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 85; 4; 0.014321, -0.216242, 0.302516, -0.928180;;, - 93; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 96; 4; 0.012473, 0.472295, 0.098587, -0.875821;;, - 97; 4; -0.005733, 0.314325, 0.091301, -0.944897;;, - 98; 4; 0.002467, 0.403792, 0.085230, -0.910869;;, - 99; 4; -0.005563, 0.316457, 0.079674, -0.945239;;, - 100; 4; 0.010565, 0.509467, 0.073742, -0.857260;;, - 115; 4; -0.000001, 0.566409, -0.000008, -0.824124;;, - 135; 4; 0.176893, 0.283087, -0.499530, -0.799400;;, - 139; 4; 0.283098, 0.024951, -0.406064, -0.868531;;, - 160; 4; -0.017038, 0.129412, 0.129402, -0.982964;;, - 161; 4; -0.017038, 0.129412, 0.129403, -0.982964;;, - 175; 4; 0.405692, 0.534219, 0.553941, -0.493126;;, - 178; 4; 0.585778, 0.368487, 0.379184, -0.614249;;, - 182; 4; 0.448058, 0.532485, 0.549044, -0.462877;;, - 185; 4; 0.592036, 0.367183, 0.377829, -0.609849;;, - 188; 4; 0.502752, 0.483163, 0.496528, -0.516967;;, - 192; 4; 0.598794, 0.362383, 0.372267, -0.609543;;, - 207; 4; 0.476089, 0.472560, 0.479925, -0.565420;;, - 216; 4; -0.017038, 0.129412, 0.129402, -0.982964;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 22.800381, -0.000005, 34.682266;;, - 77; 3; 22.800381, -0.000005, 34.682266;;, - 115; 3; 22.800381, -0.000005, 34.682266;;, - 135; 3; 22.800381, -0.000005, 34.682266;;; - } - } - - Animation x3ds_anim_6 { - {x3ds_LL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.819152, 0.573576, -0.000000, -0.000000;;, - 15; 4; 0.848048, 0.529919, -0.000000, -0.000000;;, - 30; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 31; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 43; 4; 0.737277, 0.675591, -0.000000, -0.000000;;, - 52; 4; 0.642787, 0.766045, 0.000000, -0.000000;;, - 61; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 68; 4; 0.939693, 0.342020, -0.000000, -0.000000;;, - 76; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 77; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 85; 4; 0.441186, 0.831001, 0.214867, -0.261961;;, - 93; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 96; 4; 0.932169, 0.360972, -0.014558, 0.023425;;, - 115; 4; 1.000000, -0.000000, -0.000000, -0.000000;;, - 135; 4; 0.874620, 0.484809, -0.000000, -0.000000;;, - 139; 4; 0.980002, 0.198988, -0.000000, -0.000000;;, - 160; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 161; 4; 0.819152, 0.573577, -0.000000, 0.000000;;, - 175; 4; 0.902585, 0.430511, -0.000000, 0.000000;;, - 178; 4; 0.674571, 0.738210, -0.000000, 0.000000;;, - 182; 4; 0.836374, 0.548160, -0.000000, 0.000000;;, - 185; 4; 0.666576, 0.745437, -0.000000, 0.000000;;, - 188; 4; 0.756143, 0.654407, -0.000000, 0.000000;;, - 192; 4; 0.686772, 0.726874, -0.000000, 0.000000;;, - 216; 4; 0.819152, 0.573576, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -0.446586, 0.000001, -24.389267;;, - 77; 3; -0.446586, 0.000001, -24.389267;;, - 115; 3; -0.446586, 0.000001, -24.389267;;, - 135; 3; -0.446586, 0.000001, -24.389267;;; - } - } - - Animation x3ds_anim_7 { - {x3ds_L_Hand} - AnimationKey { - 0; - 10; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 68; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 77; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 85; 4; 0.099989, 0.083901, -0.759491, -0.637289;;, - 93; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 160; 4; 0.088182, 0.096234, -0.669811, -0.730970;;, - 161; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 216; 4; 0.088182, 0.096234, -0.669810, -0.730970;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -1.719951, -0.532492, -32.044598;;, - 77; 3; -1.719951, -0.532492, -32.044598;;, - 115; 3; -1.719951, -0.532492, -32.044598;;, - 135; 3; -1.719951, -0.532492, -32.044598;;; - } - } - - Animation x3ds_anim_8 { - {x3ds_Head} - AnimationKey { - 0; - 26; - 0; 4; -0.000000, -0.999048, 0.043619, -0.000000;;, - 6; 4; -0.000000, -0.997564, -0.069756, -0.000000;;, - 15; 4; -0.000000, -0.999657, -0.026177, -0.000000;;, - 26; 4; -0.000000, -0.999391, 0.034899, -0.000000;;, - 52; 4; 0.057153, -0.973623, -0.220877, -0.002109;;, - 61; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 68; 4; -0.328848, -0.929469, 0.165640, 0.022582;;, - 76; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 77; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 85; 4; 0.130447, -0.990841, 0.034601, 0.004555;;, - 93; 4; 0.000000, -0.999391, 0.034900, -0.000000;;, - 115; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 135; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 175; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 177; 4; 0.121753, -0.991602, 0.043296, 0.005316;;, - 179; 4; -0.017436, -0.998896, 0.043614, -0.000761;;, - 181; 4; 0.139040, -0.989326, 0.043196, 0.006071;;, - 183; 4; -0.034867, -0.998440, 0.043594, -0.001522;;, - 185; 4; 0.121752, -0.991602, 0.043296, 0.005316;;, - 187; 4; -0.026153, -0.998706, 0.043606, -0.001142;;, - 189; 4; 0.142432, -0.972455, -0.180232, 0.039500;;, - 191; 4; -0.109249, -0.975409, -0.173314, -0.081269;;, - 193; 4; 0.130401, -0.990501, 0.043248, 0.005694;;, - 195; 4; -0.043578, -0.998097, 0.043579, -0.001903;;, - 197; 4; 0.173153, -0.983648, 0.043642, 0.023447;;, - 199; 4; -0.065922, -0.988029, 0.137452, 0.023655;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 8; - 0; 3; 0.000000, 0.320922, 43.031700;;, - 93; 3; 0.000000, 0.320922, 43.031700;;, - 115; 3; 0.000000, 0.320922, 43.031700;;, - 135; 3; 0.000000, 0.320922, 43.031700;;, - 160; 3; 0.000000, 0.320922, 43.031700;;, - 161; 3; 0.000000, 0.320922, 43.031700;;, - 175; 3; 0.000000, 0.320922, 43.031700;;, - 216; 3; 0.000000, 0.320922, 43.031700;;; - } - } - - Animation x3ds_anim_9 { - {x3ds_RU_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 21; 4; 0.124791, -0.009789, -0.874977, 0.467703;;, - 30; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 37; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 43; 4; 0.125169, 0.001125, -0.912411, 0.389664;;, - 52; 4; 0.125097, 0.004401, -0.922298, 0.365647;;, - 61; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 68; 4; 0.125154, 0.002217, -0.915776, 0.381687;;, - 76; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 77; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 85; 4; 0.124485, 0.013117, -0.945558, 0.300420;;, - 93; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 100; 4; 0.240075, 0.038409, -0.943098, 0.226838;;, - 115; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 135; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 139; 4; 0.230082, -0.060758, -0.927524, 0.288220;;, - 146; 4; 0.215704, -0.060817, -0.923441, 0.311497;;, - 150; 4; 0.209892, -0.016602, -0.963089, 0.167717;;, - 160; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 161; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 175; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 178; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 181; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 184; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 187; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 190; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 193; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 207; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 216; 4; 0.124939, 0.007674, -0.931554, 0.341378;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 6.849594, 0.163909, 2.374462;;, - 77; 3; 6.849594, 0.163909, 2.374462;;, - 115; 3; 6.849594, 0.163909, 2.374462;;, - 135; 3; 6.849594, 0.163909, 2.374462;;; - } - } - - Animation x3ds_anim_10 { - {x3ds_RL_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 1; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 11; 4; 0.438280, 0.897779, -0.019136, -0.039198;;, - 21; 4; 0.422215, 0.905446, -0.018434, -0.039533;;, - 26; 4; 0.439586, 0.897141, -0.019193, -0.039170;;, - 30; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 37; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 43; 4; 0.484348, 0.873787, -0.021147, -0.038150;;, - 52; 4; 0.499524, 0.865201, -0.021810, -0.037775;;, - 61; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 68; 4; 0.573030, 0.818373, -0.025019, -0.035731;;, - 76; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 77; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 93; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 115; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 135; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 139; 4; 0.319106, 0.946715, -0.013933, -0.041334;;, - 146; 4; 0.007542, 0.999020, -0.000329, -0.043618;;, - 150; 4; -0.025078, 0.998734, 0.001095, -0.043606;;, - 160; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 161; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 175; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 178; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 181; 4; 0.655435, 0.753991, -0.028617, -0.032920;;, - 184; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 187; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 190; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 193; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 207; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 216; 4; 0.536789, 0.842588, -0.023437, -0.036788;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -3.359494, 0.259702, 38.976971;;, - 77; 3; -3.359494, 0.259702, 38.976971;;, - 115; 3; -3.359494, 0.259702, 38.976971;;, - 135; 3; -3.359494, 0.259702, 38.976971;;; - } - } - - Animation x3ds_anim_11 { - {x3ds_R_Foot} - AnimationKey { - 0; - 29; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 11; 4; 0.693619, 0.137449, 0.693620, -0.137448;;, - 21; 4; 0.703851, 0.067776, 0.703851, -0.067776;;, - 26; 4; 0.702932, 0.076726, 0.702932, -0.076726;;, - 30; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 37; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 52; 4; 0.700211, 0.098511, 0.700211, -0.098511;;, - 61; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 68; 4; 0.690345, 0.153046, 0.690346, -0.153046;;, - 76; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 77; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 93; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 115; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 135; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 139; 4; 0.636494, 0.308019, 0.636494, -0.308019;;, - 146; 4; 0.705581, -0.046427, 0.705581, 0.046427;;, - 150; 4; 0.682577, -0.184629, 0.682578, 0.184629;;, - 160; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 161; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 175; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 178; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 181; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 184; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 187; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 190; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 193; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 207; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 216; 4; 0.701057, 0.092298, 0.701057, -0.092298;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; -0.849455, -62.299629, -3.801312;;, - 115; 3; -0.849455, -62.299629, -3.801312;;, - 135; 3; -0.849455, -62.299629, -3.801312;;; - } - } - - Animation x3ds_anim_12 { - {x3ds_LU_Leg} - AnimationKey { - 0; - 30; - 0; 4; -0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; -0.128543, 0.007574, -0.976382, -0.173483;;, - 11; 4; -0.134779, 0.015787, -0.981832, -0.132631;;, - 21; 4; -0.128729, 0.003084, -0.969733, -0.207452;;, - 30; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 37; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 43; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 52; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 61; 4; -0.128543, 0.007574, -0.976383, -0.173482;;, - 68; 4; -0.128751, 0.001960, -0.967886, -0.215906;;, - 76; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 77; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 85; 4; -0.128751, 0.001960, -0.967886, -0.215907;;, - 93; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 100; 4; -0.098715, 0.012488, -0.994248, -0.039635;;, - 115; 4; -0.199368, -0.000000, -0.979925, -0.000000;;, - 135; 4; -0.180689, 0.084257, -0.888113, 0.414134;;, - 139; 4; -0.148626, 0.124737, -0.776470, 0.599538;;, - 160; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 161; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 175; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 178; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 181; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 184; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 187; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 190; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 193; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 207; 4; -0.124735, 0.031962, -0.991546, 0.016007;;, - 212; 4; -0.128488, 0.008447, -0.977538, -0.166852;;, - 216; 4; -0.128542, 0.007575, -0.976383, -0.173479;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -5.995693, 0.163913, 2.695592;;, - 77; 3; -5.995690, 0.163913, 2.695592;;, - 115; 3; -5.995690, 0.163913, 2.695592;;, - 135; 3; -5.995690, 0.163913, 2.695592;;; - } - } - - Animation x3ds_anim_13 { - {x3ds_LL_Leg} - AnimationKey { - 0; - 34; - 0; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 1; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 6; 4; 0.551866, 0.832791, 0.024095, 0.036360;;, - 11; 4; 0.510806, 0.858589, 0.022302, 0.037487;;, - 21; 4; 0.521998, 0.851831, 0.022791, 0.037192;;, - 26; 4; 0.541375, 0.839649, 0.023637, 0.036660;;, - 30; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 37; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 43; 4; 0.522001, 0.851829, 0.022791, 0.037192;;, - 52; 4; 0.544120, 0.837873, 0.023757, 0.036582;;, - 61; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 68; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 76; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 77; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 93; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 104; 4; 0.564968, 0.823959, 0.024667, 0.035975;;, - 115; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 135; 4; 0.087073, 0.995247, 0.003802, 0.043453;;, - 139; 4; -0.244382, 0.968698, -0.010670, 0.042294;;, - 155; 4; 0.218585, 0.974843, 0.009544, 0.042563;;, - 160; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 161; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 168; 4; 0.350698, 0.935472, 0.015312, 0.040844;;, - 172; 4; 0.439930, 0.896972, 0.019208, 0.039163;;, - 175; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 178; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 181; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 184; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 187; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 190; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 193; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 207; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 212; 4; 0.495151, 0.867712, 0.021619, 0.037885;;, - 216; 4; 0.580152, 0.813340, 0.025330, 0.035511;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 3.943333, 0.259710, 39.672764;;, - 77; 3; 3.943333, 0.259710, 39.672764;;, - 115; 3; 3.943333, 0.259710, 39.672764;;, - 135; 3; 3.943333, 0.259710, 39.672764;;; - } - } - - Animation x3ds_anim_14 { - {x3ds_L_Foot} - AnimationKey { - 0; - 34; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 6; 4; 0.680588, -0.191834, 0.680588, 0.191834;;, - 11; 4; 0.677475, -0.202553, 0.677475, 0.202553;;, - 21; 4; 0.676210, -0.206736, 0.676210, 0.206736;;, - 26; 4; 0.677620, -0.202065, 0.677621, 0.202065;;, - 30; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 37; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 43; 4; 0.681390, -0.188966, 0.681390, 0.188966;;, - 52; 4; 0.690346, -0.153046, 0.690346, 0.153046;;, - 61; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 68; 4; 0.679364, -0.196123, 0.679364, 0.196123;;, - 76; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 77; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 93; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 100; 4; 0.705872, 0.041770, 0.705872, -0.041770;;, - 104; 4; 0.698511, 0.109917, 0.698512, -0.109917;;, - 115; 4; 0.707107, -0.000002, 0.707107, 0.000002;;, - 135; 4; 0.612373, 0.353552, 0.612373, -0.353552;;, - 139; 4; 0.672346, 0.218976, 0.672346, -0.218976;;, - 155; 4; 0.659223, -0.255782, 0.659223, 0.255782;;, - 160; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 161; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 168; 4; 0.705347, 0.049859, 0.705347, -0.049859;;, - 172; 4; 0.706854, -0.018889, 0.706854, 0.018889;;, - 175; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 178; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 181; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 184; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 187; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 190; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 193; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 207; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 216; 4; 0.687569, -0.165072, 0.687569, 0.165072;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; 1.061092, -63.263000, -4.043970;;, - 115; 3; 1.061092, -63.263000, -4.043970;;, - 135; 3; 1.061092, -63.263000, -4.043970;;; - } - } - -} - diff --git a/rockem/skmechbk.ppm b/rockem/skmechbk.ppm deleted file mode 100644 index 3bc590d..0000000 --- a/rockem/skmechbk.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 128 -255 -,<DDDLDLDLDLDDDDDDLDLLDDLLDDDDL$$TDDLL$$LLDLDLDLDLDD$<DLDDDDDDDDDDDDDLDDDLDLDLDLDLDLDLDLDLD$DDDDLDLDLLDDDDDDLDLDLDLDLDLDLLLLLDLLLLLLLL$<LD́üüüüüüüüüüüüüüüüüüüüüüüüüüǜ̀̀ÔÔÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLDüüTTüTTüTTüTTüTTüTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTüTTüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLüüTTüTTü\\ü\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLDüüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLLDüüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLüüTTüTTü\\üTTüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLĹüTTüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLüüTTüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDDLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüüDLDüüTTüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDLLüüTTüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüLüüüDLLüüTTüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüDüüüDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüô$<LLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüü$<LDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüü LLüüôDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüôLLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüLLüüôDLLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüLLüüôDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüTüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüLDüüôDDLüüü \üüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüDüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüLDLüüôLDLüüüLüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüǘLLLüüôDLDüüüDüüüüüüüüüüüüüüüüüüüLDLLL””œÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüü DLLDüüüDLLüüüLüüüüüüüüüüüüüüüüüDL DD LDLœœœ¤¤¤ÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüDLDLüüüDLDüüüLäüüüüüüüüüüüüüüüDLLDLDLD””œœœœÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüLDLDLLüüôDLDüüüLäüüüüüüüüüüüüüüüDLLDLDLD””œœœœÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüLDLDLLüüôDLLüüü DLüüüüüüüüüüüüüôü DL DLDLLD”””œœœœœœœœœÜÜÜÜÜÜüüüüüüüüüüüLDLL LLLD LDLLDüüôLLLüüüLLüüüüüüüüüüüüüLLLDLDLLLL””œœœœœœœœœœœœœ¤¤¤LüüüüüüüüLLLLDDLDLLDLDDLüüôDDLüüüLDüüüüüüüüüüüüLDLDLDLLDLDœœœœœœ”””œœœ”””””œDDüüüüüüL DLDLDLDDLDL DLLDüüüDLLüüüLLLüüüüüüüüüüDLLLLDLDDLLL””œœœœœœœœœœœœœœœœDLLLüü LLLLD LDL DLDLLLLDDLüüôLDLüüüDLLDüüüüüüüL DL DLDDLDLDLDLœœœœœœœœœ”””œœœœœœL LDLDDLLDDLDLLLD LDL DDLL DüüüDLLüüü LLL LLüüüüLDLDDLD LDLL DL DLD”””œœœœœœœœœœœœ”””LDLLDLDDLDLLDLDLLLLDLDDLüôôDLDüüüLDLDLDDLLLL DLLLLDL DLLLDDL”””œœœ”””œœœ”””””œLLL LLDLLLL LLLDDLDL DLD LLLüôüDLDüüüLDLDLDDLLLL DLLLLDL DLLLDDL”””œœœ”””œœœ”””””œLLL LLDLLLL LLLDDLDL DLD LLLüôüDLLüüüL DDLDLDLDLDLL DL DLLLLDLDLD””œœœœœœœœœœœœœœœœDDLDLLL LDDLDLLLLLDLDLDLDüôôLLDüüüLDLDDLLLLDLDLLDLDLDDLDLDLœœœœœœœœœ”””œœœœœœLLLLD LDLDLDLDLLDDLDL DLL LüôôLLLüüüLDDLD LDLDL LLDDLLD DL LDD LLL”””œœœœœœœœœœœœ”””LDLDLDLLLLL¤¤¤¤¤¤¤LLLDDLüôôDLDüüüLLL LLLLDLDLDLLDLDLDDLDLDLœœœœœœœœœœœœ”””””œDD LLLLDLD¤¤¤¤¤¤¤¤¤¤DLLLLôüüDLLüüüLDDLDLDLLDDLDDL LLLLLDLDLD”””œœœœœœ”””œœœœœœDLLLDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDLDüôôLDLüüüüLLDDLLL¤¤¤¤¤LDLDLDLDDLDLœœœœœœ”””œœœœœœ””œLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLD LôüüDLDüüüüLLL LLD¤¤¤¤¤¤¤LDLDLLLDLLD””œœœœœœœœœœ”””œœœLœ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLLüôüüDLDüüüüLLL LLD¤¤¤¤¤¤¤LDLDLLLDLLD””œœœœœœœœœœ”””œœœLœ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLLüôüüDLLüüüüDLDDL¤¤¤¤¤¤¤¤¤LLLDDLLLLLœœœ”””””œœœœœœœ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤L DLüüôôDLDüüüüü LLLL¤¤¤¤¤¤¤¤¤¤DDLLDDLDLœœœœœœœœœ¤¤¤´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDDüôüüDLLüüüüüLDLD¤¤¤¤¤¤¤¤¤¤œLLDLLDDL¤¤¤œœœ´´´´´´¼¼¼´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDLüôôôLLDüüüüüDLDL¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LL LüôüôDLDüüüüüLDDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDLüüô ́äüüôüüüüL LDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´¼¼¼´´´¼¼¼´´´¼¼¼¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLLüôüôüüüüüüüüDLLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤”LDLüôüüüüüüüüüüDLLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤”LDLüôüüüüüüüüüüLDDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLDDüüôôüüüüüüüüLLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´¼¼¼´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DDL LüüüüüüüüüüüüLDLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´¼¼¼´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤œLDLüüüüüüüüüüüüüDLLDœ¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDDLüüüüüüüüüüüüüüLDLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´¼¼¼´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤L DLDüüüüüüüüüüüüüüLLLLœ¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLDLüüüüüüüüüüüüüüüDLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLDLLüüüüüüüüüüüüüüüDLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLDLLüüüüüüüüüüüüüüüLDDLD¤¤¤¤¤¤L DL DL DDLDL¤¤¤œœœœœœœœœ”””¤¤¤LDLDLLDLL¤¤¤¤¤¤¤œLLL LüüüüüüüüüüüüüüüüLLLDLD¤¤¤LDLDDLLLLDLDœœœ””œœœœœœœœœœœœœDLDLDL LLDLD¤¤¤¤¤LLLDLüüüüüüüüüüüüüüüü LDD LL DLDLDLDLDLDLLLLLœœœœœœ”””œœœœœœ””œLLDDLLDD LDLD”¤LDLDLDüüüüüüüüüüüüüüüüüüLLDLDDLDLDLDLDLDLDDLœœœ”””œœœœœœ”””œœœD LLL LLLLLLLL LLLLLLLLüüüüüüüüüüüüüüüüüüüDLDLDLLLLLDDLLDDLLDœœœœœœ”””œœœœœœ”””LDDDDDD DDDDDLDLDDLDLüüüüüüüüüüüüüüüüüüüLLLD LDLDL LLL LLLLL LLœœœœœœœœœœœœ”””¤¤¤LLLLLLLLLL LLLDDLDLLLüüüüüüüüüüüüüüüüüüüüDDLDLD LüüüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüǘLDDL LüüüüüüüüüüüüüüüüüüüüüDDLDLD LüüüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüǘLDDL Lüüüüüüüüüüüüüüüüüüüüü LDLLLLüüüüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜäääüüüüüüüüüüüüüüDD LDüüüüüüüüüüüüüüüüüüüüüüüLDLüüüüDDLDDLLDDLDLDLDLDDDDLLDDLLD́üüüLDLüüüüüüüüüüüüüüüüüüüüüüüT LüüüüLDLDLLDLDDDLDLDLDLDLLDDLDLLLLDüüüLLüüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLLLDLDLDLDDDDDDDDDDDDLDLDDDDLD́üüüüüüüüüüüüüüüüüüüüüüüüLüüüǘDDLŒ ´”´”´Œ ´Œ´Œ ´Œ´Œ ´Œ´Œ´Œ´”´”´Œ´”´Œ´”´Œ´Œ´Œ´Œ´Œ´Œ´Œ´”´”´Œ ´DLDDüüüüLüüüüüüüüüüüüüüüüüüüLDüüüDLLD”´”´”´”´”´”´”´”´”´”´´´´´´´´´´´´´´´´´´´”´”´”´Œ´”´”´Œ´Œ´”´”´”´DDDLüüüLLüüüüüüüüüüüüüüüüüüüü \üüüLLŒ¬”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´Œ ´¼¼¼´´´´´´´´´´´´´´´”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´”´”´$<LLTü\DLüüüüüüüüüüüüüüüüüüüü \üüüLLŒ¬”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´Œ ´¼¼¼´´´´´´´´´´´´´´´”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´”´”´$<LLTü\DLüüüüüüüüüüüüüüüüüüüüüDLLDDŒ ´Œ´Œ´¤ü¤ü¤ü¤ü¤ü¤üœüœü¤üÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔܤü¤ü¤ü¤üœü¤üœüœü¤üœü”¤„¬”´DDLDL \üüüüüüüüüüüüüüüüüüüüüüLDDL”´”´”´¤üœü¤ü¤üœü¤ü¤üœü¤üœüÜÜÜÔÔÜÔÔÔÜÜÜÔÔÔÜÜܤüœü¤üœü¤ü¤üœü¤ü¤üœü”üŒ´Œ´”´DLL \üüüüüüüüüüüüüüüüüüüüüüüü \\<d”´Œ ´œüDd”¬¬<üœü¤üœüœü¤üœü¤üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœüœü¤ü¤ü¤ü¤ü¤ü¤üœü¤üœüŒ´„¬Œ´DLüüüüüüüüüüüüüüüüüüüüüüüüüüüü„¬”Äœü¤ü<\Œ´¼Lü¤ü¤ü¤ü¤üœü¤üœüÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜœüœü¤üœü¤üœü¤üœü¤üœüœüœüŒ´Œ´Œ¬üüüüüüüüüüüüüüüüüüüüüüüüüüüüüŒ´Œ´¤ü<dŒ´Œ´¬<ü¤üœü¤üœü¤üœüœü¤ü¤üœüœüœüœüœü¤ü¤ü¤üœü¤üœüœü¤üŒ´œüœüœüŒ ´Œ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüüŒ´Œ¬<dD\Œ´Œ¬¼Lü¬<ü¤üœü¤üœü¤üœüœüœüœüœüœüœüœüœü¤üœü¤ü¤üœü¤ü¤üŒ ´Œ´œüœüœü„¬üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”¤œüL dD\Œ¬Œ ´¬<ü¬<ü¤ü¤ü¤ü¤ü¤üœüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔܤü¤ü¤ü¤ü¤ü¤ü¤ü¤üœüŒ´”´œüœüœüŒ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”¤œüL dD\Œ¬Œ ´¬<ü¬<ü¤ü¤ü¤ü¤ü¤üœüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔܤü¤ü¤ü¤ü¤ü¤ü¤ü¤üœüŒ´”´œüœüœüŒ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœüDd<\Œ´Œ´¬<ü¼Lü¤üœüœü¤üœü¤üÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜܤü¤üœüœü¤üœü¤üœü¤ü”´Œ´”´œü”üŒ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœüL dD\Œ´”´¼Lü¬<üœü¤ü¤ü¤ü¤ü¤üÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜœü¤üœü¤üœüœü¤ü¤ü¤üŒ´Œ´Œ´D\D\”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœü<\Dd”¬Œ´´Dô¬<ü¤ü¤ü¤üœü¤üœüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔ¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü”´Œ¬”´D\<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\D\Œ´”´´Dü´Düœü¤üœü¤üœü¤üÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜܤüœü¤ü¤üœü¤üœü¤ü¤üŒ´”´Œ´<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœü<\L dŒ´Œ´¬<ü´Dü¤ü¤ü¤üœü¤üœüÜÜÜÔÔÜÜÜÜÔÔÜÜÜÜÜÜܤü¤ü¤ü¤ü¤ü¤üœüœü¤ü”´Œ´Œ´D\<dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüDdD\Œ¬Œ´´Dô´Dü¤üœü¤ü¤ü¤ü¤üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœü¤üœü¤üœü¤üœü¤üŒ´Œ´Œ¬Œ´D\Dd”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ´Œ´´Dü´Dü´Dü¤ü¤üœüœü¤üœüœüœü”üœü”üœüœü¤üœü¤ü¤ü¤ü¤üŒ´Œ ´Œ´Œ ´D\<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ´Œ´´Dü´Dü´Dü¤ü¤üœüœü¤üœüœüœü”üœü”üœüœü¤üœü¤ü¤ü¤ü¤üŒ´Œ ´Œ´Œ ´D\<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüL dD\Œ´„¬´Dü¬<ü´Dü¬Düœü¤ü¤üœüœüœüœüœüœüœüœü¤ü¤ü¤üœü¤üœü¤üŒ ´Œ´”´Œ´<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ¬Œ´¬<ü¼Lü´Dü¬<ü¤üœüœü¤üÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜܤü¤üœü¤üœüœü¤üŒ´Œ´Œ¬Œ´”´D\<dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”üL dD\Œ´Œ´´Dü¬<ü¬<ü´Dü¤ü¤ü¤ü¤üÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜœüœü¤üœü¤üœü¤ü”´Œ´Œ ´Œ´Œ ´<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ ´Œ¬”´Œ¬¬<ü´Dô´Dü´Düœü¤üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔ¤üœü¤ü¤üœü¤üœüŒ ´”´”´Œ´Œ´D\Ddœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\L dŒ´”´Œ ´Œ´Œ ´´Tô¬<ü¬Dü´Dü¤üÔÔÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜœü¤üœüœü¤üœü¤üŒ´Œ¬Œ´”¬”´<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœü<\DdŒ´Œ´Œ´Œ´”´Œ´Œ´´Dô¬Dü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜܤü¤ü¤ü¤üœü¤üœüŒ´”´Œ´Œ´Œ´D\DdœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüDd<\Œ´Œ ´Œ´”´Œ´Œ´Œ ´Œ´Œ¬¬<ǜ̀̀ÜÜÜÜÜÜÔÔÜÜÜÜÔÔܤü¤üœüœü¤ü¤ü¤üŒ ´Œ´”´Œ´”´<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüDd<\Œ´Œ ´Œ´”´Œ´Œ´Œ ´Œ´Œ¬¬<ǜ̀̀ÜÜÜÜÜÜÔÔÜÜÜÜÔÔܤü¤üœüœü¤ü¤ü¤üŒ ´Œ´”´Œ´”´<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ´”´Œ ´Œ´Œ ´Œ¬Œ´”´Œ ´Œ´Œ´Œ¬œüœüœü¤ü¤üœü¤ü¤üœüœü”´”´Œ¬Œ´Œ¬Œ´Dd<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\L dŒ´Œ´”´Œ´Œ´”´”´Œ¬Œ´”´Œ´Œ´œ́œüœüœüœü¤ü¤ü¤ü¤ü”´Œ ´Œ´Œ´Œ´”´Dd<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ ´”´Œ´Œ´Œ´Œ´Œ ´”´Œ´Œ´´´´´´´´´´´´´´´´´¬¼¤üœü¤üŒ´Œ´Œ´Œ´Œ¬”´Œ´Œ´D\L d<\”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\L dŒ´Œ´”´Œ´Œ´Œ´Œ´Œ´”¬Œ´´´´¼¼¼¼¼¼´´´´´´´´´Œ´”´Œ¬”´Œ´Œ ´”´Œ´Œ ´”´Œ´Dd<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<dD\Œ´”´Œ¬”´”´Œ ´Œ´”´Œ´Œ´´´´´´´´´´´´´´´´´´´”´Œ ´”´Œ´”´Œ´Œ¬”´Œ´Œ´Œ ´L d<\DdœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüL d<\D\Œ ´Œ´Œ´Œ´Œ´Œ´Œ´Œ ´”´´´´´´´´´´´´´´´´´´´Œ¬Œ´Œ´Œ´Œ´”´Œ´Œ ´Œ´Œ´D\D\<dL dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüD\<d<dD\Œ´Œ´Œ´Œ´Œ ´”´”´Œ´Œ´„¬Œ$´Œ´Œ´Œ$´Œ´Œ´Œ¬Œ´”´Œ´Œ´”´Œ´L d<\<\DdD\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüD\<d<dD\Œ´Œ´Œ´Œ´Œ ´”´”´Œ´Œ´„¬Œ$´Œ´Œ´Œ$´Œ´Œ´Œ¬Œ´”´Œ´Œ´”´Œ´L d<\<\DdD\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\L dL d<\D\L dL dŒ´Œ´Œ´Œ´Œ´Œ´Œ´Œ´„¬Œ´Œ´„¬Œ´Œ ´Œ¬Œ ´Œ´”´Œ´„¬D\DdL d<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüD\<d<dD\D\<d<\D\D\Œ´Œ´Œ´Œ$´Œ´Œ´Œ´Œ´Œ´Œ¬Œ´”´Œ´”´Œ´Œ´D\Dd<dD\<\Dd<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”üD\DdL d<\<\L dL d<d<dL dL dŒ¬´´´´´´´´´´´´´´´´´´Œ´Œ´Œ´Œ´Œ´DdD\<\L dL dD\D\<dL dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü¤äœüD\DdDdD\D\D\D\D\D\D\D\<dœœœœœœœœœœœœœœœœœœDdL d<\<\Dd<\L dL d<\D\DdL d<\D\œüüüüüüüüüüüüüüD\L dD\L dDd<dL dL d<dDdL dL dDd<dL dL d<\L dL d<\<\L dL d<d<dL dL d<d<\L dœœœœœœœœœœœœœœœœœœD\<\DdDdD\L dD\D\DdL d<\D\<dL dL d<dDdL dL dDd<dL dL d<dDdL dL dD\DdD\D\D\D\D\D\D\D\D\D\D\D\D\D\D\DdD\D\DdDdD\D\D\D\D\D\D\DdD\<\D\D\<\Dd<\DdD\DdD\DdD\DdDdD\D\DdD\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\DdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdD\DdD\DdD\DdD\DdD\D\DdD\DdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdD\DdD\DdD\DdD\DdD\D\DdD\DdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDd \ No newline at end of file diff --git a/rockem/skmechbt.ppm b/rockem/skmechbt.ppm deleted file mode 100644 index 3f6819d..0000000 Binary files a/rockem/skmechbt.ppm and /dev/null differ diff --git a/rockem/skmechch.ppm b/rockem/skmechch.ppm deleted file mode 100644 index 4c6c0dc..0000000 --- a/rockem/skmechch.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 128 -255 -LL LLLLLLLLLLLLLLLLLLLLLLL LLL LDœœœœœœ”””œœœœœœLLLLLLLLLLLLLLLLLLLLLLLLL LLL DLDLLLLL LLL LLL LLLLL LLL LLL LLLLLLœœœœœœœœœœœœœœœLLLLLLL LLL LLL LLLLL LLL LLL LLLLLLLTTüTTü\\üTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\üTTü¼¼¼œœœ”””œœœ¼¼¼\\ü\\üTTü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTüTTüLLL\\üTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü´´´œœœœœœœœœ´´´TTüTTü\\üTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üLLDTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTü\\üTTüTTü´´´œœœ”””œœœ´´´\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüLLDTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTü\\üTTüTTü´´´œœœ”””œœœ´´´\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüLLL\\üTTüüüüüüüüüüüüüüüüüüüüüüüüTTüTTü\\ü´´´œœœœœœœœœ´´´TTü\\üTTüüüüüüüüüüüüüüüüüüüüüüüüTTüTTüDLDTTü\\üüüüüüüüüüüüüüüüüüüüüüüüüTTüTTü´´´œœœœœœœœœ´´´\\üTTüüüüüüüüüüüüüüüüüüüüüüüüüüTTüLLLTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüü\\ü´´´œœœ”””œœœ´´´TTüüüüüüüüüüüüüüüüüüüüüüüüüüüTTüLœœœœœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜ´´´´´´œœœœœœœœœ´´´´´´ÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ´´´œœœœœœœœœ´´´´´´ÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´´´´œœœ”””œœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜ´´´œœœœœœœœœ´´´´´´ÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´´´´œœœ”””œœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜ´´´œœœœœœ”””´´´´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ´´´´´´œœœœœœœœœ´´´´´´ÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœ””œ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœ””œ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜ´´´œœœœœœœœœ´´´ÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜ´´´œœœDL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LLLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´¬¼œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤ LDLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´¬¼üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LLL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LLL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ””œœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤DLL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ¼¼¼üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤Lœœœ¤¤¤œœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ”””¤¤¤œœœ¤¤¤œœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ”””¤¤¤œœœ”””œœœÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔ´´´œœœ”””œœœ´´´ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœœœœœœœœœœœœœœœÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜœœœœœœœœœœœœ”””ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ”””œœœœœœœœœœœœÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜœœœœœœœœœœœœœœœÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ””œœœœœœœœœœœœœÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ””œœœœœœœœœœ””œÜÜÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜœœœ¤¤¤LDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ””œœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLLD¤üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü ¬LLLDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´¬¼üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´¬¼üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLL L¤üüüüüüüüüüüüüüüüüüüüüüüüüü´¬¼œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü ¬ LLLDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLLL¤üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü¤DLLLL¤¤üüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüü¤¤DDœœœœœœœœœœœœœœœÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔœœœœœœœœœœœœœœœœœœœœœœœœœœœÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔœœœœœœœœœœœœœœœ”””œœœ”””œœœœœœÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜœœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””ÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔ”””œœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœœœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœœœœœœœœœœœœ”””œœœœœœœœœœœœ””œ””œ””œ”””œœœ””œ””œ¤¤¤ÔÔÔÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÔÔÔÜÜÜ””œ”””””œœœœœœœœœœ””œœœœ ¬¤LL DL ¬¤¤¤ ¬üüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüü ¬¤¤¤¤ DL LLL¤¤LLLL D¤¤¤¤¤¤üüüüüüüüüüüüüüüü ¬´´´œœœœœœœœœ´´´¤üüüüüüüüüüüüüüüü¤¤¤¤¤¤LD DL D¤ ¬¤ L DLDLD¤¤ ¬¤ ¬¤¤üüüüüüüüüüüüüü¤´´´”””œœœ”””´¬¼¤üüüüüüüüüüüüüü ¬ ¬¤¤ ¬¤ ¬LL LDLL¤ ¬¤ L DLDLD¤¤ ¬¤ ¬¤¤üüüüüüüüüüüüüü¤´´´”””œœœ”””´¬¼¤üüüüüüüüüüüüüü ¬ ¬¤¤ ¬¤ ¬LL LDLL¤¤¤LLL LLLLL¤¤¤¤¤ ¬ ¬üüüüüüüüüüü ¬ ¬´´´œœœœœœœœœ´´´¤¤üüüüüüüüüüü ¬¤¤¤¤¤¤LLLLLLLœ¤ ¬¤LL DLLLLL DL¤¤¤¤¤ ¬¤¤¤¤¤ ¬¤¤¤¤¤Dœœœœœœœœœ””œœœœ D ¬¤¤¤ ¬¤¤¤ ¬¤¤¤¤¤ ¬ ¬œ DLLLLLDD L¤¬¬¤ LDL DLLLLLLLœ¤ ¬¤¤ ¬¤¤ ¬¤¤¤¤¤ LDL””œœœœœœœœœœœœœLLL¤ ¬¤¤¤¤¤ ¬¤¤ ¬¤¤ DLLLDLD DLLL¤ü¤¤D LLLLDLLD L DLLLLLLLLLLLLLLLLDLDLDLDDLLLLLLLLLLLLLLLLDLLL LLL DL ¬ü¤¬¤DLL LLLLLLLLLLLLLLLL LL LL LL LL$$L$$T$$L$$TLL LL LL LL LLLLLLLLLLLLL LLDDLLLüü¤¬¤DLL LLLLLLLLLLLLLLLL LL LL LL LL$$L$$T$$L$$TLL LL LL LL LLLLLLLLLLLLL LLDDLLLüü ¬¤¤LLDLLL ¬¤¤ ¬¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´¬¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ LLDLüüœ¤¤ DLLL L¤¤¤ ¬¤ ¬ ¬¤¤ ¬ ¬¤¤ ¬¤¤ ¬ ¬¤¤ ¬ ¬´´´´´´´´´´´´´´´¤¤ ¬ ¬¤¤ ¬ ¬¤ ¬ ¬¤¤ ¬ ¬¤¤ ¬¤ ¬¤¤¤LLL Lüüü¤¤LLDL¤¤ ¬üüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÔÔÜüüüüüüüüüüüüüüüüüüüüü ¬¤ DLLLüüüü¤LDL L¤ ¬üüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüü¤LLLLüüüü¤LDL L¤ ¬üüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüü¤LLLLüüüüü$<LDLL\\üüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÔÔÜüüüüüüüüüüüüüüüüüüüüüüüD LL LüüüüüüüLDLTTüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüL¤”üüüüüüüüLLLTTüTTüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüD ¬¤üüüüüüüüü ¬ LLTTüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüü LL¤üüüüüüüüüü¤LDTTüTTüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüL ¬¤üüüüüüüüüü¤LDTTüTTüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüL ¬¤üüüüüüüüüüü¤LTTü\\üTTüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüTTüL¤¤üüüüüüüüüüü ¬”LTTü\\üüüüüTTü\\ü\\üTTüTTü\\üTTü\\üTTüTTü\\ü\\üTTüTTüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜTTüTTü\\ü\\üTTüTTüTTüTTü\\üTTü\\üTTüTTü\\üüüüüüü\\üDL ¬üüüüüüüüüüüü¤¤LTTü\\üTTüüüTTüTTüTTüTTü\\üTTüTTü\\üTTü\\üTTüTTüTTüTTüTTüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTü\\üüüüTTüTTü LL¤üüüüüüüüüüüü¤¤LLTTü\\üTTüTTüTTüTTü\\üTTüTTüDLDDDDDDLDLLDLLDDL LLLL LDLDDLTTüTTüTTü\\üüTTü\\üTTüL¤üüüüüüüüüüüüü¤¤LLTTü\\üTTüTTüTTüTTü\\üTTüTTüDLDDDDDDLDLLDLLDDL LLLL LDLDDLTTüTTüTTü\\üüTTü\\üTTüL¤üüüüüüüüüüüüüü ¬DLDTTü\\ü\\üTTü\\üTTüDLLL DL LLLLDD LD LLLDDLDLDLLLDLLLLTTüTTüTTüTTüTTüTTüTTü D¤üüüüüüüüüüüüüüü¤LDTTüTTüTTüTTüTTü$DLD¤¤¤¤¤¤¤¤ ¬¤¤¤¤¤¤ ¬¤¤¤ ¬ ¬¤¤¤¤¤¤DLLLTTü\\üTTüTTüL¬¤üüüüüüüüüüüüüüü¤DLTTü\\ü\\üTTüDL¤¤ ¬¤ ¬¤ ¬¤¤¤¤¤¤¤¤¤¤¤ ¬¤¤¤¤¤¤¤ ¬¤ ¬¤ ¬LDTTüTTüTTüLL¤¤üüüüüüüüüüüüüüü ¬¤LLTTüTTüTTüL L¤<dD\DdD\D\DdL dD\<\L dDd<\D\DdD\<d<\D\D\Dd<\D\L d<\L dD\L dD\¤¤D LLTTü LDL¤ ¬üüüüüüüüüüüüüüüü ¬¤LD LLL¤D\L dLdL dDdDdL dDdL dL dDdD\L dDdD\DdD\L dLdL dL dL dL dDdDdL dD\D\DdL d¤¤LLLLLL ¬üüüüüüüüüüüüüüüüü ¬¤LD LLL¤D\L dLdL dDdDdL dDdL dL dDdD\L dDdD\DdD\L dLdL dL dL dL dDdDdL dD\D\DdL d¤¤LLLLLL ¬üüüüüüüüüüüüüüüüü¬¤DLLL ¬¤DdL dŒ ´”´”´”´”´”´”´”´”´”´œœœ”””œœœ”””œœœ”´Œ ´”´”´”´”´”´”´”´”´”´”´D\<d¤¤L DL L¤üüüüüüüüüüüüüüüüüüü ¬ ¬DLD¤<\LT”´”´Œ ´”´”´Œ ´Œ ´”´”´Œ ´”´œœœœœœœœœœœœœœœ”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´Œ ´”´Œ ´L dDdL dœ¤LD¤¤üüüüüüüüüüüüüüüüüüüü¤¤¤¤DdL dŒ ´”´¤ü¤üœüœü¤üœü¤ü¤üœü¤ü´¬¼´´´¼¼¼´´´´¬¼¤üœü¤üœü¤üœü¤üœü¤ü¤ü¤ü”¬”´D\<\L d¤ ¬ ¬¤ ¬üüüüüüüüüüüüüüüüüüüü ¬¤¤¤D\L\”´”´œü¤ü¤ü¤ü¤ü¤üœüœü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤üœü¤üœü¤üœü¤üœü¤üœü¤üŒ ´”´L\L d¤¤¤¤üüüüüüüüüüüüüüüüüüüüüü ¬¤L dDd”´Œ ´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´”´D\<d¤¤ ¬üüüüüüüüüüüüüüüüüüüüüüü ¬¤L dDd”´Œ ´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´”´D\<d¤¤ ¬üüüüüüüüüüüüüüüüüüüüüüüü<dL d”´”´¤ü¤ü¬<ü´Dô´Dü´Dô¬<ü´Dü¬<ü´Dô¬<ü´DôÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜ´Dô¬<ü¼Lü´Dü¬<ü¬<ü´Dü´Dô¬<ü´Dü´Dü´Dü´Dü”¬”´D\¤ ¬üüüüüüüüüüüüüüüüüüüüüüüüüL dD\”´Œ ´¤ü¬<ü¬<ü´Dü¬<ü¬<ü´Dü¬<ü´Dô´Dü¬<ü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜܬ<ü¬<ü´Dü´Dü´Dü´Dô´Dü´Dü¬<ü´Dü¬<ü´Dü´Dô´DüŒ´L düüüüüüüüüüüüüüüüüüüüüüüüüüüDdL d”´¤ü¬<ü¼Lü´Dü¬<ü´Dü¬<ü´Dü´Dü¬Dü´Dü´Dü´DüÜÜÜÔÔÜÜÜÜÔÔÔÜÜܬDü´Dü´Dô¬Dü¬<ü¬<ü´Dü¬<ü´Dü´Dü¬Dü´Dü¬<ü´Dü”´D\üüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\Œ ´¤ü¬<ü¬DüD\Dd<\D\DdL dD\<\L dDd<\D\<dL dL dDd<dL dL dD\Dd<\D\<\L dL dD\´Dü¬<ü”¬L düüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\Œ ´¤ü¬<ü¬DüD\Dd<\D\DdL dD\<\L dDd<\D\<dL dL dDd<dL dL dD\Dd<\D\<\L dL dD\´Dü¬<ü”¬L düüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d”´´Dü¬<üDdL dDdL dDdL dDdL dDdL dD\L dD\D\D\D\D\D\L dD\L dL dLdDdL dDdD\L dL d´Dü¬<üD\üüüüüüüüüüüüüüüüüüüüüüüüüüü<\L dŒ ´´DüDdD\”´”´”´”´”´”´”´”´”´”´œœœœœœœœœœœœœœœŒ ´”´”´”´”´”´Œ ´”´”´”´”´”´DdD\´DüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d”´¬DüD\L d”´Œ ´”´”´Œ ´Œ ´”´”´Œ ´Œ ´œœœœœœœœœœœœœœœ”´Œ ´”´”´”´”´”´”´Œ ´”´”´Œ ´L\L d¬<üDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dŒ´L dDd”´”¤¤ü¤ü¤ü¤üœü¤üœü¤ü¤ü¼¼¼´´´´´´´´´´¬¼œü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü”´L\D\<düüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL dD\”´”´¤ü¤üœüœü¤ü¤üœü¤üœüœü´´´´´´´´´´´´´´´¤ü¤üœüœü¤ü¤üœüœü¤üœü¤ü¤üŒ ´”´L d<\üüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL dD\”´”´¤ü¤üœüœü¤ü¤üœü¤üœüœü´´´´´´´´´´´´´´´¤ü¤üœüœü¤ü¤üœüœü¤üœü¤ü¤üŒ ´”´L d<\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\Ld”´Œ ´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´DdL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d”´¤ü´Dü¬<ü´Dü´Dü¬<ü´Dô¬<ü´Dü´Dü´DüÜÜÜÜÜÜÔÔÜÜÜÜÜÜܬ<ü¬<ü´Dü¬<ü´Dü´Dü¬<ü¬<ü´Dü¬<ü´Dü¬<üœüœüŒ´DdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\Ld¤ü¤ü¬<ü´Dü¬<ü´Dü¬<ü¬<ü´Dü´Dü¬<ü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜܬDü´Dü´Dü´Dü¬<ü´Dü¬<ü¬<ü´Dü´Dü´Dü¬<üœüœü”¬L düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d¤ü¬<ü¬<üDdD\D\DdL dDdL dD\L d<\<\L d<\DdD\<\L dDdD\<\DdD\L d<\D\¬<ü¬<ü¤üœüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d¤ü¬<ü¬<üDdD\D\DdL dDdL dD\L d<\<\L d<\DdD\<\L dDdD\<\DdD\L d<\D\¬<ü¬<ü¤üœüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\Dd¤ü¬DüL dD\DdDdL dL dD\DdLdDd<\D\DdD\D\DdL dDdL dDdL dDdL dDdL dL dDd¬<ü´Dü”üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüDdL d¤ü´DôD\DdŒ ´”´”´”´”´”´Œ ´”´œœœœœœ”””œœœœœœ”´”´”´”´”´”´”´”´”´”´L\L d´Dü¬<üœüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\¬<ü´DüL d”´”´”´Œ ´Œ ´”´”´”´”´œœœœœœœœœœœœœœœ”´Œ ´”´”´Œ ´Œ ´”´”´Œ ´”´”´L\D\¬<ü¬<ü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d´DüD\”¬”´”´œü¤üœü¤üœü¤ü¤ü´´´¼¼¼´´´´´´´´´¤$́œü¤ü¤ü¤ü¤üœü¤üœü¤üŒ ´”´L dDd´DüD\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL\¬DüL d”´Œ ´œü¤üœü¤ü¤ü¤üœü¤ü´¬¼´´´¼¼¼´´´´¬¼œü¤ü¤üœü¤ü¤ü¤ü¤üœü¤ü¤ü”´D\Dd¬<üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL\¬DüL d”´Œ ´œü¤üœü¤ü¤ü¤üœü¤ü´¬¼´´´¼¼¼´´´´¬¼œü¤ü¤üœü¤ü¤ü¤ü¤üœü¤ü¤ü”´D\Dd¬<üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d´DüL dŒ´¤üœüœü¤ü¤üœüœü¤ü¤ü´´´´´´´´´´´´´´´œüœü¤ü¤üœü¤üœü¤üœü¤ü¤üœü”´L d´DüD\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüDd¬<ü<\¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´<\D\<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\L d¤ü¤ü¬<ü¬<ü´Dô¬<ü´Dô´Dü´Dô´DüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´Dô´Dü´Dô´Dü´Dü¬<ü´Dü´Dü¬<ü¼Lü¼Lü¬<üœüL dDdL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¤ü¬<ü´Dü´Dü´Dü´Dü¬<ü¬<ü´Dü¬<üÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜ´Dü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dô´Dü¬<ü¬<ü´Dôœüœü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¤ü¬<ü´Dü´Dü´Dü´Dü¬<ü¬<ü´Dü¬<üÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜ´Dü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dô´Dü¬<ü¬<ü´Dôœüœü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüDdD\¤ü¬<ü´Dü¬<ü´Dü¬<ü´Dü´Dü¬<ü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜܬ<ü¬<ü´Dü´Dü¬<ü¬<ü´Dü¬<ü´Dü¬Dü´Dü¬<ü¬<ü¤üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<\L d¬<ü¼Lü¬<üL d<\D\DdL d<\D\DdL d<\L dDdD\Dd<\D\DdDd<\DdD\L dDd´Dü´Dü¬<üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d¬<ü¬<üLdL dDdDdL dDdL dD\DdDdD\D\DdDdL dL dL dD\D\L dL dDdL dL dD\´Dü´DôD\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\L d¼Lü¬<üD\”´”¬”´”´”´”´”´œœœ”””œœœœœœœœœŒ ´”´”´”´”´”´”´”´”´”´D\Dd´Dü¬Dü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¬<ü´DüD\”¤”´Œ ´”´”´Œ ´”´œœœœœœœœœœœœœœœ”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´Œ ´L d<\¬<ü´DüL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¬<ü´DüD\”¤”´Œ ´”´”´Œ ´”´œœœœœœœœœœœœœœœ”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´Œ ´L d<\¬<ü´DüL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\¬<ü¬DüDdœüœüœüœüœüœüœü´´´¼¼¼´´´´´´¼¼¼œüœüœüœüœüœüœüœüœüœü<dL d¬<ü¬DüDdüüüüüüüüüüüüüüDdD\Dd<\Dd<\Dd<\Dd<\DdL dDdL dDdL dDdL dDdL dDdL d<\œü”ü”üœüœüœüœü´¬¼´´´´¬¼´´´´¬¼œü”üœüœüœüœü”ü”üœü”üDdD\<\DdL d<\D\L dDdD\L dDdD\<\DdL d<\D\L dDdL dD\D\L dL dD\D\L dL dD\L dL dD\D\L dL dD\D\L dL dD\L dL dD\D\L dL dD\D\D\D\D\D\D\DdL dD\D\L dL dD\D\L dD\D\L dL dD\D\L dL dD\D\L dD\D\L dL dD\D\L dL dD\LdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDd \ No newline at end of file diff --git a/rockem/skmechgr.ppm b/rockem/skmechgr.ppm deleted file mode 100644 index b6d1cf6..0000000 Binary files a/rockem/skmechgr.ppm and /dev/null differ diff --git a/rockem/skmechhn.ppm b/rockem/skmechhn.ppm deleted file mode 100644 index ce1be9c..0000000 Binary files a/rockem/skmechhn.ppm and /dev/null differ diff --git a/rockem/skmechjd.ppm b/rockem/skmechjd.ppm deleted file mode 100644 index dd47891..0000000 Binary files a/rockem/skmechjd.ppm and /dev/null differ diff --git a/rockem/skmechla.ppm b/rockem/skmechla.ppm deleted file mode 100644 index a77499a..0000000 Binary files a/rockem/skmechla.ppm and /dev/null differ diff --git a/rockem/skmechll.ppm b/rockem/skmechll.ppm deleted file mode 100644 index 2873eb8..0000000 --- a/rockem/skmechll.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 128 -255 -œœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœüüüüüüüüüüüüüüüüüüüüüœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœüüL LLLLLLLLL LLLLLLLüüœœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœüü LL LLL LLL LLL LLL LL Lüüœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””üüL¤ ¬¤ ¬¤ ¬ ¬¤¤¤ ¬¤¤¤”Lüüœœœ”””œœœœœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœüüL¤ ¬ ¬¤¤ ¬ ¬ ¬ ¬ ¬ ¬¤ ¬ ¬ ¬Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœüüLüüüüüüüüüüüüüüü Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœ”””üô LTTüTTü\\ü\\üTTüTTüTTüTTüTTüTTüTTüTTü\\üTTü\\üLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœ”””œœœ”””œœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ””””””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœǘL\\ü\\üTTüTTü\\ü\\ü\\ü\\ü\\ü\\ü\\ü\\ü\\ü\\üTTü Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœǘ LTTüTTü\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœüäLüüüüüüüüüüüüüüü Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœǘLüüüüüüüüüüüüüüüLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœ””””””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœœœœœœœ”””œœœüü Lœ ¬ ¬¤ ¬¤ ¬ ¬ ¬ ¬ ¬¤¤ ¬¤Lüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœ”””œœœœœœœœœœœœ”””œœœ”””œœœœœœ””””””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœüüLLLLL LLLLLLLLLL L Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœ”””œœœ”””œœœüü L LL L LL LL LLL LLL LLLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœüüL¤¤¤¤ ¬¤¤¤¤¤¤¤¤¤ ¬ Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœüüL¤ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¬ ¬Lüüœœœ”””œœœœœœ”””œœœœœœ”””œœœ”””œœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœüüLüüüüüüüüüüüüüôü Lüüœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ””””””œœœœœœœœœœœœ”””œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœüüL\\üTTü\\üTTüTTüTTüTTü\\üTTüTTü\\üTTüTTü\\üTTü Lüüœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœüü LTTü\\ü\\ü\\ü\\ü\\ü\\üTTü\\ü\\üTTü\\üTTü\\üTTüLüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœüüLTTüTTüTTüTTüTTüTTü\TüTTü\TüTTü\TüTTüTTü\\üTTü Lüüœœœœœœœœœœœœœœœœœœ”””œœœ””””””œœœ””””””œœœ””””””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœüü Lüüüüüüü üôüüüüüüLüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””œœœ”””œœœ”””œœœœœœ””””””œœœœœœœœœœœœœœœ”””œœœ”””œœœœœœ”””œœœœœœœœœüüLüüüüüüüüǘüüüü ́Lüüœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœüüL ¬¤ ¬ ¬¤ ¬ ¬¤ ¬ ¬¤ ¬ ¬¤œLüüœœœ”””œœœœœœœœœ””””””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ”””œœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœüüL LL LLLLL$<$<$<$<$<LD LLüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœüü LLLLL LLLL L LL L LLL$Düüœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””œœœ””””””œœœ””””””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœüüüL ¬¤¤¤¤¤ ¬¤¤ ¬¤¤¤ Lüüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ””œüüü L¤ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤¤ ¬Lüüüœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ””””””œœœœœœœœœœœœœœœœœœœœœœœœœœœ””œœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœ”””œœœœœœ”””œœœœœœüüüDüüüüüüüüüüüüü Lüüüœœœ””œœœœœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœ””œœœœœœœ””œœœœŒ„„„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€„„„€€€„„„„„„€€€€€€üüüLüüüüüüüüüüüüüLüüü€€€„„„„„„€€€„„„€€€„„„€€€„„„€€€„„„€€€€€€„„„€€€€€€€€€„„„€€€€€€„„„LLLLLLTTTLLLLLLTTTLLLLLLLLLTTTTTTLLLTTTTTTLLLTTTTTTLLLTTTTTTLLLLLLTLLLLLLLLL LLLLLL LL LLLLLLLLLTTTTTTLLLTTTLLLTTTLLLTTTLLLTTTTTTLLLTTTTTTLLLLLLLLLLLLTTTTTTLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL LLL LLL LLLL L LL L LLLLL \LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL„„„„„„€€€€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€€€€„„„LL ¬ ¬œüüüüTTü\\ü\\üüüüüœ ¬ ¬ DL€€€„„„€€€„„„€€€„„„„„„„„„€€€„„„€€€„„„„„„€€€„„„€€€„„„€€€„„„€€€„„„„„„„„„„„„„„„„„„„„„„„„„„„€€€„„„€€€€€€„„„€€€„„„„„„„„„„„„€€€„„„„„„„„„LL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬¤ ¬L D„„„„„„„„„€€€€€€„„„€€€€€€€€€€€€„„„„„„€€€„„„„„„„„„„„„„„„„„„€€€„„„œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœ DL¤¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬¤LLœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœ”””œœœ”””œœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ”””œœœL L¤¤ ¬üüüüTTü\\ü\\üüüüü¤ ¬¤ LLœœœ”””œœœœœœœœœœœœœœœœœœ””””””œœœ””””””œœœ””””””œœœ””””””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ””””””œœœœœœ””œ”””œœœ””œ””œœœœ””œ””œœœœ””œ””œ””œ””œ””œ””œœœœœœœ””œœœœLL ¬ ¬ ¬üüüü\\ü\\üTTüüüüü¤¤ ¬LLœœœœœœ””œ””œœœœ””œ””œ””œ””œ””œœœœ””œœœœ””œ””œ””œ””œœœœœœœ”””œœœœœœœœœLLLTTTTTTLLLTTTTTTLLLTTTTTTLLLLLLLLLTTTLLLLLLTTTLLLLLLTTT”””L L ¬¤¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœLLLLLLTTTLLLTTTTTTLLLTTTLLLLLLTTTLLLTTTLLLLLLTTTLLLLLLTTTœœœœœœœœœLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLTTTLLLLLLLLLLLLLLLLLLTTTLLLœœœLL¤¤ ¬üüüüTTü\\ü\\üüüüü ¬¤ ¬ DL””œTTTLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLTTTLLL””œœœœœœœLLLLLL LLLLLLL LLLLLL DTLLLLLL””œDL ¬¤ ¬üüüü\\üTTü\\üüüüü ¬¤¤TLœœœLLLLLLL DLLLLLLLLLLLLLLLLLLLœœœœœœ””œLLLLLLL¤ ¬¤ ¬¤¤ ¬¤¤ ¬¤¤LLLLLLLL””œLL ¬ ¬ ¬üüüü\\üTTü\\üüüüü ¬¤ ¬LTœœœLLLLLLLL¤ ¬¤ ¬¤¤¤ ¬¤¤¤”LLLLTTT”””œœœœœœLLLLLL L¤ ¬ ¬¤¤¤ ¬ ¬ ¬ ¬¤ ¬LLTTTLLLœœœL L¤¤ ¬üüüüTTü\\ü\\üüüüü ¬¤ ¬ DL””œLLLTTTLL ¬¤ ¬¤ ¬ ¬ ¬ ¬¤ ¬¬ ¬ LLLLLLLœœœœœœœœœLLLLLLLüüüüüüüüüüüü LLLLLLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬¤L DœœœLLLLLLL LüüüüüüüüüüüüLLLLTTT””œœœœœœœLLLTTTLüüüüüüüüüüüüLLLLLTTT””” LL ¬¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬ ¬ DL”””LLLTTTLLüüüüüüüüüüüü LLLLLLLœœœœœœ”””LLLLLLLTTü\\ü\\üTTü\\ü\\üTTü\\ü\\üTTüTTüTTüLLTTTLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬¤ ¬L LœœœLLLLLLLLTTü\\ü\\üTTüTTüTTüTTüTTü\\üTTüTTüTTüLLLLTTT”””œœœœœœTTTLLL L\\üTTü\\üTTü\\ü\\ü\\üTTüTTü\\ü\\üTTüLLLLLLLL””” LL¤¤ ¬üüüüTTü\\ü\\üüüüü ¬¤¤LL””œLLLTTTLLTTüTTüTTü\\ü\\ü\\ü\\üTTü\\üTTü\\üTTüLLLLLLLœœœœœœœœœLLLLLL LüüüüüüüüüüüüLTLLLLLLœœœLL ¬¤ ¬üüüü\\ü\\üTTüüüüü ¬¤ ¬ DL””œLLLTTTLLüüüüüüüüüǘüLTTTLLLœœœœœœœœœLLLTTTLüüüüüüüüüüüüL \TTTLLLœœœL L ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬¤ LLœœœLLLLLLL DüüüüüüüüüüüüLLLLLLLœœœœœœœœœLLLLLL L¤ ¬ ¬¤ ¬ ¬¤¤¤ ¬¤ ¬ DTLLLLLLœœœLL¤¤ ¬üüüüTTü\\ü\\üüüüü¤ ¬ ¬LLœœœLLLLLLLL ¬ ¬¤¤¤¤¤¤ ¬¤¤¤ DLLLLLLœœœœœœ”””LLLTTTTœ ¬ ¬¤ ¬ ¬ ¬ ¬ ¬¤ ¬ ¬LLTTTLLL”””LD ¬ ¬¤üüüü\\üTTü\\üüüüü ¬¤ ¬L DœœœLLLTTTL D ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤¤ ¬LTTTLLLœœœœœœœœœLLLLLL LLLL LLLLLL LLL LLLLLLLLœœœ LD ¬¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬ ¬LLœœœLLLLLLL LLLLLLLLLLL LLLLLLLLLœœœœœœœœœLLLLLLL LLL LLL LLLL LLLLTTTLLL””œLD ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬¤ LLœœœLLLLLLLLLL LLL LLL LLLL LLLLLLLœœœœœœœœœLLLLLLLœ ¬¤ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤¤LLTTTLLL””œLL¤¤ ¬üüüü\\üTTü\\üüüüü ¬¤ ¬L D””œLLLTTTL D ¬¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤ LLLLTTT”””œœœœœœLLLLLL Lüüüüüüüüüüüü LTLLLLLLœœœ LL ¬¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬ ¬LLœœœLLLLLLLLüüüüüüüüüüôüLLLLLLLœœœœœœœœœLLLTTTLüüüüüüüüüüüüLLTTTLLLœœœLL¤¤ ¬üüüü\\üTTü\\üüüüü ¬ ¬ ¬L DœœœLLLTTTL Lüüüüüüüüüü üüLLLLLLLœœœ”””œœœLLLLLLL\\üTTüTTüTTü\\ü\\üTTü\\ü\\üTTü\\üTTüLLLLLLLL””” LD ¬ ¬¤üüüüTTü\\ü\\üüüüü ¬¤ ¬TLœœœLLLLLLLL\\üTTüTTüTTü\\üTTü\\ü\\üTTü\\üTTüTTüLLLLLLLœœœœœœœœœLLLLLLLTTü\\ü\\ü\\üTTüTTü\\üTTüTTü\\üTTüTTüLLLLLLLLœœœLL¤¤ ¬üüüü\\üTTü\\üüüüü ¬ ¬ ¬ DLœœœLLLLLLLLTTü\\ü\\ü\\üTTü\\üTTüTTü\\ü\\ü\\üTTüLTTTLLLœœœœœœœœœTTTLLLLTTüTTüTTüTTüTTü\TüTTü\Tü\TüTTü\\üTTüLLTTTLLLœœœLL ¬¤ ¬üüüü\\ü\\üTTüüüüü ¬¤¤LLœœœLLLTTTLL\\üTTüTTüTTüTTü\TüTTüTTüTTüTTüTTüTTüLLLLLLLœœœœ””œœœLLLTTTLüüüüüüüüüôüüLLLLLLLLœœœLL ¬ ¬ ¬üüüüTTü\\ü\\üüüüü ¬¤¤ LLœœœTTTLLL LLôüüüüüüüüüüäLTTTLLLœœœœœœœœœLLLLLL L¤ ¬ ¬¤ ¬ ¬¤ ¬ ¬¤ ¬¤ LLLLLLLL””œL D ¬¤ ¬üüüü\\üTTü\\üüüüü ¬¤¬LL”””LLLLLLLL ¬ ¬¤ ¬ ¬¤ ¬ ¬¤¤¤ ¬DLLLLLLœœœœœœ”””TTTLLLLœ¤¤ ¬¤ ¬¤ ¬ ¬¤ ¬ ¬LLTTTLLLœœœ LL¤ ¬ ¬üüüü\\ü\\üTTüüüüü ¬¤ ¬ DLœœœLLLTTTL D¤¤ ¬¤¤ ¬ ¬ ¬¤ ¬ ¬¤LLLLLLL””œœœœœœœLLLLLL LDLL LLDD$<$<$<DDLLLLLLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœLLLLLLLL LL L$<$<$<$<D$<DDL LTTTLLLœœœœœœœœœLLLLLLLLLLLLLLLLLLLLLLLLLLLœœœL L¤ ¬ ¬üüüüTTü\\ü\\üüüüü¤¤ ¬ DLœœœLLLLLLLLLLLLLLLLLLLL LLLLLLLœœœœœœœœœLLLLLLLLLTTTLLLTTTLLLLLLTTTLLLTTTTTTLLLLLLLLLLLLLLLLLLLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü¤ ¬ ¬L L”””TTTLLLLLLTTTLLLLLLLLLTTTLLLLLLLLLTTTLLLLLLLLLLLLTTTLLLLLLœœœœœœ”””LLLLLLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLLLLœœœLT ¬ ¬¤üüüü\\üTTü\\üüüüü¤ ¬ ¬LLœœœLLLTTTœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ””””””œœœ”””LLLTTTœœœœœœœœœLLLTTTœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœLLLLLLœœœ DL ¬ ¬ ¬üüüüTTü\\ü\\üüüüü¤ ¬ ¬ DLœœœLLLLLLœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœLLLLLL”””œœœœœœLLLLLLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLTTTœœœL D ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœLLLTTTœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLTTTœœœœœœœœœTTTLLLœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœTTTLLLœœœ DL¤¤ ¬üüüü\\ü\\üTTüüüüü¤¤ ¬ DLœœœLLLLLLœœœ”””œœœœœœœœœ””””””œœœ””””””œœœ”””œœœœœœœœœLLLLLLœœœœœœ””œLLLLLLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœLLLLLLœœœL D ¬¤ ¬üüüü\\üTTü\\üüüüü ¬ ¬¤ DLœœœLLLTTTœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””LLLTTT”””œœœœœœLLLTTTœœœœœœ””œœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœœœœLLLLLLœœœLL ¬¤¤üüüü\\üTTüTTüüüüüœ¤ ¬L LœœœLLLTTTœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLLLLœœœœœœœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœL DLLL LL LL LLLLL LL LLLLLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€TTTLLLœœœL LLL LL LLLLL LL LL LLLD LLœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€LLLLLLœœœœœœœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœLTLdDdLdL dL dDdL dL dDdL dL dLdL dL dLdL dDdLLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€TTTLLLœœœL DDdL dL dL dL dL dL dL dL dL dL dL dL dL dL dDdDd LLœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€LLLLLLœœœœœœœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœ DLL dŒÄŒÄŒ̀Œ̀Œ̀Œ̀”ČԌ̀Œ̀Œ̀Œ̀Œ̀Œ̀ŒÄL dLLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLLLL„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœ DLL d¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üDd LLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLLLL„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœL DDd¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üLdLLœœœLLLTTT„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœœœœœœœTTTLLL€€€„„„€€€„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLTTT””” LLL d¼Lü¬<ü´Dü¬<ü´Dü´Dü´Dü¬<ü´Dü´Dü¬<ü´Dü´Dü¬<ü¼LüDd DLœœœLLLLLL„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœœœœ”””LLLTTT„„„€€€„„„€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€LLLLLLœœœLLDd¬<ü´Dü¬<ü¬<ü´Dü¬<ü´Dü´Dü´Dü´Dü´Dü´Dü´Dü´Dü¬<üL\ LLœœœLLLTTT„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„TTTLLLœœœœœœœœœTTTLLL€€€„„„€€€„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœL LL d¼Lü¬<ü´Dü´Dü¬<ü¼Lü´Dü¬<ü´Dü´Dü¬<ü´Dü´Dü¬<ü´DüL dLDœœœLLLLLL„„„€€€€€€€€€„„„€€€€€€„„„„„„€€€„„„€€€€€€„„„„„„LLLLLLœœœœœœœœœLLLLLL€€€€€€„„„€€€€€€„„„€€€€€€€€€€€€€€€€€€„„„€€€„„„TTTLLLœœœLLDd¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üL dL LœœœLLLTTT„„„„„„„„„€€€„„„€€€€€€€€€€€€„„„€€€€€€€€€€€€€€€LLLLLLœœœœœœœœœLLLLLLllllllTTTllllllllllllllllllllllllllllllTTTlllTTTLLLœœœLLL dŒÄŒ̀Œ̀ŒÄŒ̀Œ̀Œ̀Œ̀Œ̀”ÄŒ̀Œ̀Œ̀ŒÄŒÄDd LLœœœLLLTTTlllTTTlllTTTlllllllllllllllllllllllllllllllllLLLLLLœœœœœœœœœLLLLLLlllllllllllllllTTTTTTllllllllllllTTTlllllllllLLLLLLœœœLLL dŒ̀ŒÄŒÄŒ̀ŒÄŒÄŒÄŒÄŒÄŒÄŒÄŒÄŒÄŒ̀ŒÄL dLLœœœLLLLLLllllllllllllllllllllllllllllllTTTllllllllllllLLLLLLœœœœœœœœœLLLLLLlllTTTlllTTTllllllllllllllllllllllllTTTllllllLLLLLLœœœD DDdL dDdL dLdL dLdLdL dLdLdL dLdL dL\L dL dLLœœœLLLTTTllllllTTTlllTTTlllllllllTTTllllllllllllTTTlllLLLTTTœœœœœœœœœLLLLLLllllllllllllllllllTTTllllllllllllTTTlllllllllLLLLLLœœœ LLL dL dLdL dL dDdL dL dDdL dL dDdL dL dDdL dDd LLœœœLLLLLLllllllllllllllllllTTTllllllllllllllllllllllllLLLLLL”””œœœœœœLLLTTTllllllTTTlllllllllllllllTTTTTTlllllllllllllllLLLLLLœœœLLL dL dL dL dL dL dL dL dL dL dL dL dL dL dL dLdL\LLœœœLLLLLLlllTTTlllllllllTTTlllllllllTTTlllTTTlllllllllLLLTTTœœœœœœœœœLLLLLLlllllllllllllllTTTlllllllllllllllllllllTTTlllLLLTTT””œ LLL dŒÄŒÄŒ̀Œ̀Œ̀Œ̀”ČԌ̀Œ̀Œ̀Œ̀Œ̀Œ̀ŒÄDd LL””œTTTLLLllllllllllllllllllllllllTTTlllllllllTTTllllllLLLLLLœœœœœœœœœLLLLLLllllllllllllllllllllllllTTTTTTlllllllllllllllLLLLLLœœœL LL d¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üDd LLœœœLLLLLLllllllTTTllllllllllllllllllllllllllllllTTTlllLLLLLL”””œœœœœœLLLLLLlllllllllllllllTTTlllllllllllllllllllllTTTlllTTTLLLœœœLLD\¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üLdLLœœœLLLLLLllllllllllllTTTlllTTTllllllllllllTTTlllllllllLLLTTTœœœœœœœœœTTTLLLlllTTTllllllllllllTTTlllllllllTTTllllllllllllLLLLLL”””LLL d¼Lü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dü¬<ü¬<ü´Dü´Dü¬<ü´Dü´DüLd LLœœœLLLLLLlllllllllllllllllllllllllllllllllllllllllllllLLLLLLœœœœœœ””œLLLLLLlllllllllTTTlllllllllllllllllllllllllllllllllLLLTTTœœœL LDd¬<ü¬<ü¼Lü´Dü´Dü¬<ü¬<ü´Dü´Dü´Dü´Dü¬<ü´Dü¬<ü´DüD\LLœœœLLLTTTlllTTTlllllllllTTTllllllTTTlllTTTlllTTTllllllLLLTTT”””œœœœœœLLLLLLllllllTTTlllllllllTTTllllllllllllllllllllllllLLLLLLœœœLLL d¼Lü¬<ü´Dü´Dü´Dü¬<ü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dü¬<ü´DüLd LLœœœLLLLLLlllllllllTTTllllllTTTllllllllllllllllllllllllLLLLLLœœœœœœœœœLLLTTTllllllllllllTTTllllllllllllllllllTTTlllTTTlllLLLLLLœœœLLL d¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üDdLLœœœLLLLLLlllllllllllllllllllllllllllllllllTTTlllTTTlllLLLLLL”””œœœœœœLLLLLLlllllllllTTTlllllllllllllllTTTlllllllllllllllLLLLLLœœœLLL dŒ̀Œ̀ŒÄŒ̀ŒÄŒ̀Œ̀Œ̀ŒÄŒÄŒ̀Œ̀Œ̀Œ̀”ÄDdLLœœœLLLLLLlllllllllllllllllllllllllllTTTlllllllllllllllLLLLLLœœœœœœ”””LLLTTTllllllTTTlllllllllllllllTTTllllllllllllllllllLLLLLLœœœLDL dŒÄŒÄŒ̀Œ̀ŒÄŒ̀ŒÄŒ̀ŒÄŒÄŒÄŒÄŒÄŒÄŒÄDd DL”””TTTLLLllllllllllllllllllllllllTTTllllllllllllllllllLLLLLLœœœœœœœœœLLLLLLllllllllllllTTTlllllllllllllllTTTllllllTTTlllTTTLLLœœœLDLdL dDdL dL dDdL dL dDdL dL dLdL dL dLdDdL dL LœœœLLLLLLlllTTTllllllTTTlllllllllllllllTTTllllllTTTlllTTTLLL”””œœœœœœLLLLLLlllllllllllllllllllllllllllllllllllllllllllllLLLLLLœœœ L$ -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -CFG=MyFoxBear - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "MyFoxBear.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "MyFoxBear.mak" CFG="MyFoxBear - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "MyFoxBear - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "MyFoxBear - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "MyFoxBear - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "D:\code\dxsdk3\sdk\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 winmm.lib fastfile.lib ddraw.lib dsound.lib dxguid.lib dinput.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /libpath:"D:\code\dxsdk3\sdk\lib" - -!ELSEIF "$(CFG)" == "MyFoxBear - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "D:\code\dxsdk3\sdk\inc" /I "D:\code\dxsdk3\sdk\samples\misc" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# SUBTRACT CPP /X -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 winmm.lib fastfile.lib ddraw.lib dsound.lib dxguid.lib dinput.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"D:\code\dxsdk3\sdk\lib" - -!ENDIF - -# Begin Target - -# Name "MyFoxBear - Win32 Release" -# Name "MyFoxBear - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\bmp.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\ddraw.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\misc\dsutil.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\fbsound.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\foxbear.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\foxbear.rc -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\gameproc.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\gfx.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\plane.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\sprite.c -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\tile.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\sdk\samples\misc\dsutil.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\fbsound.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\foxbear.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\gameproc.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\gfx.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\plane.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\rcids.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\sprite.h -# End Source File -# Begin Source File - -SOURCE=..\..\sdk\samples\foxbear\tile.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/samples/MyFoxBear/MyFoxBear.dsw b/samples/MyFoxBear/MyFoxBear.dsw deleted file mode 100644 index f8d727a..0000000 --- a/samples/MyFoxBear/MyFoxBear.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "MyFoxBear"=.\MyFoxBear.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/samples/MyFoxBear/MyFoxBear.ncb b/samples/MyFoxBear/MyFoxBear.ncb deleted file mode 100644 index 8a0d380..0000000 Binary files a/samples/MyFoxBear/MyFoxBear.ncb and /dev/null differ diff --git a/samples/MyFoxBear/MyFoxBear.opt b/samples/MyFoxBear/MyFoxBear.opt deleted file mode 100644 index 4b332f3..0000000 Binary files a/samples/MyFoxBear/MyFoxBear.opt and /dev/null differ diff --git a/samples/MyFoxBear/MyFoxBear.plg b/samples/MyFoxBear/MyFoxBear.plg deleted file mode 100644 index cb7769e..0000000 --- a/samples/MyFoxBear/MyFoxBear.plg +++ /dev/null @@ -1,16 +0,0 @@ - - -
-

Build Log

-

---------------------Configuration: MyFoxBear - Win32 Debug-------------------- -

-

Command Lines

- - - -

Results

-MyFoxBear.exe - 0 error(s), 0 warning(s) -
- - diff --git a/samples/MyFoxBear/backlist.dat b/samples/MyFoxBear/backlist.dat deleted file mode 100644 index 0432733..0000000 --- a/samples/MyFoxBear/backlist.dat +++ /dev/null @@ -1,15 +0,0 @@ -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 123 118 118 118 118 119 120 118 118 118 118 118 118 118 118 118 121 122 118 118 118 118 -118 118 118 118 118 121 122 118 118 118 118 118 118 118 118 118 119 120 118 118 118 118 123 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/samples/MyFoxBear/forelist.dat b/samples/MyFoxBear/forelist.dat deleted file mode 100644 index e449c3e..0000000 --- a/samples/MyFoxBear/forelist.dat +++ /dev/null @@ -1,15 +0,0 @@ - 27 44 44 44 44 44 44 44 44 43 44 44 44 38 0 0 0 0 0 0 0 27 44 44 44 44 44 41 44 44 44 44 44 44 38 0 0 0 0 0 27 44 44 44 44 44 44 44 44 43 44 44 44 38 0 0 0 0 0 0 0 27 44 44 44 44 44 41 44 44 44 44 44 44 38 0 0 0 0 0 - 26 44 44 41 44 44 42 44 44 44 44 44 36 37 0 0 0 0 0 0 0 26 44 44 40 44 44 44 44 44 44 43 44 36 37 0 0 0 0 0 26 44 44 41 44 44 42 44 44 44 44 44 36 37 0 0 0 0 0 0 0 26 44 44 40 44 44 44 44 44 44 43 44 36 37 0 0 0 0 0 - 25 24 44 44 44 44 44 44 44 30 31 34 35 0 0 0 0 0 0 0 0 25 24 44 44 44 39 44 44 44 30 31 34 35 0 0 0 0 0 0 25 24 44 44 44 44 44 44 44 30 31 34 35 0 0 0 0 0 0 0 0 25 24 44 44 44 39 44 44 44 30 31 34 35 0 0 0 0 0 0 - 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 0 0 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 0 0 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 - 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 - 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 51 52 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 51 52 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 - 49 0 0 0 0 0 1 2 0 0 45 46 47 48 0 0 0 0 54 53 0 0 0 0 0 0 0 1 2 0 0 57 58 0 0 55 56 0 0 0 49 0 0 0 0 0 1 2 0 0 45 46 47 48 0 0 0 0 54 53 0 0 0 0 0 0 0 1 2 0 0 57 58 0 0 55 56 0 0 0 - 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 - 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 diff --git a/samples/MyFoxBear/fox.ico b/samples/MyFoxBear/fox.ico deleted file mode 100644 index 2e2b890..0000000 Binary files a/samples/MyFoxBear/fox.ico and /dev/null differ diff --git a/samples/MyFoxBear/foxbear.art b/samples/MyFoxBear/foxbear.art deleted file mode 100644 index efe82d4..0000000 Binary files a/samples/MyFoxBear/foxbear.art and /dev/null differ diff --git a/samples/MyFoxBear/foxbear.def b/samples/MyFoxBear/foxbear.def deleted file mode 100644 index 67ea40c..0000000 --- a/samples/MyFoxBear/foxbear.def +++ /dev/null @@ -1,3 +0,0 @@ -NAME FOXBEAR - -DESCRIPTION 'Fox & Bear Sample Game' diff --git a/samples/MyFoxBear/jump.wav b/samples/MyFoxBear/jump.wav deleted file mode 100644 index 134cd88..0000000 Binary files a/samples/MyFoxBear/jump.wav and /dev/null differ diff --git a/samples/MyFoxBear/midlist.dat b/samples/MyFoxBear/midlist.dat deleted file mode 100644 index e3674b6..0000000 --- a/samples/MyFoxBear/midlist.dat +++ /dev/null @@ -1,15 +0,0 @@ - 0 110 117 117 117 117 117 114 117 117 117 117 111 0 110 117 117 117 117 117 114 117 117 117 117 111 0 110 117 117 117 117 117 114 117 117 117 117 111 0 - 0 99 117 112 117 117 117 117 117 117 117 117 109 0 99 117 112 117 117 117 117 117 117 117 117 109 0 99 117 112 117 117 117 117 117 117 117 117 109 0 - 0 98 117 117 117 117 117 117 117 115 117 108 107 0 98 117 117 117 117 117 117 117 115 117 108 107 0 98 117 117 117 117 117 117 117 115 117 108 107 0 - 0 97 117 117 117 113 117 117 117 117 117 105 106 0 97 117 117 117 113 117 117 117 117 117 105 106 0 97 117 117 117 113 117 117 117 117 117 105 106 0 - 0 96 95 117 117 117 117 117 117 117 117 104 0 0 96 95 117 117 117 117 117 117 117 117 104 0 0 96 95 117 117 117 117 117 117 117 117 104 0 0 - 0 0 94 93 92 91 89 90 100 101 102 103 0 0 0 94 93 92 91 89 90 100 101 102 103 0 0 0 94 93 92 91 89 90 100 101 102 103 0 0 - 0 0 84 83 0 0 87 88 0 0 0 0 0 0 0 84 83 0 0 87 88 0 0 0 0 0 0 0 84 83 0 0 87 88 0 0 0 0 0 0 - 0 86 85 82 81 80 78 79 0 0 0 0 0 0 86 85 82 81 80 78 79 0 0 0 0 0 0 86 85 82 81 80 78 79 0 0 0 0 0 0 - 0 0 0 0 0 0 76 77 72 73 74 75 0 0 0 0 0 0 0 76 77 72 73 74 75 0 0 0 0 0 0 0 76 77 72 73 74 75 0 0 - 0 0 0 0 0 0 69 70 71 0 0 0 0 0 0 0 0 0 0 69 70 71 0 0 0 0 0 0 0 0 0 0 69 70 71 0 0 0 0 0 - 0 0 0 0 0 0 67 68 0 0 0 0 0 0 0 0 0 0 0 67 68 0 0 0 0 0 0 0 0 0 0 0 67 68 0 0 0 0 0 0 - 0 0 0 0 0 0 65 66 0 0 0 0 0 0 0 0 0 0 0 65 66 0 0 0 0 0 0 0 0 0 0 0 65 66 0 0 0 0 0 0 - 0 0 0 0 0 0 63 64 0 0 0 0 0 0 0 0 0 0 0 63 64 0 0 0 0 0 0 0 0 0 0 0 63 64 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/samples/MyFoxBear/miss01.wav b/samples/MyFoxBear/miss01.wav deleted file mode 100644 index 8300b78..0000000 Binary files a/samples/MyFoxBear/miss01.wav and /dev/null differ diff --git a/samples/MyFoxBear/miss02.wav b/samples/MyFoxBear/miss02.wav deleted file mode 100644 index 8e5e9da..0000000 Binary files a/samples/MyFoxBear/miss02.wav and /dev/null differ diff --git a/samples/MyFoxBear/rgb332.pal b/samples/MyFoxBear/rgb332.pal deleted file mode 100644 index 189199b..0000000 Binary files a/samples/MyFoxBear/rgb332.pal and /dev/null differ diff --git a/samples/MyFoxBear/stop.wav b/samples/MyFoxBear/stop.wav deleted file mode 100644 index 834b1ee..0000000 Binary files a/samples/MyFoxBear/stop.wav and /dev/null differ diff --git a/samples/MyFoxBear/strike01.wav b/samples/MyFoxBear/strike01.wav deleted file mode 100644 index 0615e4a..0000000 Binary files a/samples/MyFoxBear/strike01.wav and /dev/null differ diff --git a/samples/MyFoxBear/strike02.wav b/samples/MyFoxBear/strike02.wav deleted file mode 100644 index 513c0a8..0000000 Binary files a/samples/MyFoxBear/strike02.wav and /dev/null differ diff --git a/samples/MyFoxBear/stunned.wav b/samples/MyFoxBear/stunned.wav deleted file mode 100644 index 3950a8c..0000000 Binary files a/samples/MyFoxBear/stunned.wav and /dev/null differ diff --git a/samples/MyFoxBear/surflist.dat b/samples/MyFoxBear/surflist.dat deleted file mode 100644 index 90c984f..0000000 --- a/samples/MyFoxBear/surflist.dat +++ /dev/null @@ -1,15 +0,0 @@ - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/samples/MyFoxBear/throw.wav b/samples/MyFoxBear/throw.wav deleted file mode 100644 index 87cd36d..0000000 Binary files a/samples/MyFoxBear/throw.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/jump.wav b/samples/MyFoxBear/wavdata/16-22/jump.wav deleted file mode 100644 index 134cd88..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/jump.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/miss01.wav b/samples/MyFoxBear/wavdata/16-22/miss01.wav deleted file mode 100644 index 8300b78..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/miss01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/miss02.wav b/samples/MyFoxBear/wavdata/16-22/miss02.wav deleted file mode 100644 index 8e5e9da..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/miss02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/stop.wav b/samples/MyFoxBear/wavdata/16-22/stop.wav deleted file mode 100644 index 834b1ee..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/stop.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/strike01.wav b/samples/MyFoxBear/wavdata/16-22/strike01.wav deleted file mode 100644 index 0615e4a..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/strike01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/strike02.wav b/samples/MyFoxBear/wavdata/16-22/strike02.wav deleted file mode 100644 index 513c0a8..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/strike02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/stunned.wav b/samples/MyFoxBear/wavdata/16-22/stunned.wav deleted file mode 100644 index 3950a8c..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/stunned.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-22/throw.wav b/samples/MyFoxBear/wavdata/16-22/throw.wav deleted file mode 100644 index 87cd36d..0000000 Binary files a/samples/MyFoxBear/wavdata/16-22/throw.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/jump.wav b/samples/MyFoxBear/wavdata/16-44/jump.wav deleted file mode 100644 index 5c0b8bd..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/jump.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/miss01.wav b/samples/MyFoxBear/wavdata/16-44/miss01.wav deleted file mode 100644 index 15b38be..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/miss01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/miss02.wav b/samples/MyFoxBear/wavdata/16-44/miss02.wav deleted file mode 100644 index 1a15f40..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/miss02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/stop.wav b/samples/MyFoxBear/wavdata/16-44/stop.wav deleted file mode 100644 index 7becea5..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/stop.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/strike01.wav b/samples/MyFoxBear/wavdata/16-44/strike01.wav deleted file mode 100644 index 1654965..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/strike01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/strike02.wav b/samples/MyFoxBear/wavdata/16-44/strike02.wav deleted file mode 100644 index 5826391..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/strike02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/stunned.wav b/samples/MyFoxBear/wavdata/16-44/stunned.wav deleted file mode 100644 index ad75538..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/stunned.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/16-44/throw.wav b/samples/MyFoxBear/wavdata/16-44/throw.wav deleted file mode 100644 index a7f9e8a..0000000 Binary files a/samples/MyFoxBear/wavdata/16-44/throw.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/jump.wav b/samples/MyFoxBear/wavdata/8-11/jump.wav deleted file mode 100644 index 232381b..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/jump.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/miss01.wav b/samples/MyFoxBear/wavdata/8-11/miss01.wav deleted file mode 100644 index a2d84db..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/miss01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/miss02.wav b/samples/MyFoxBear/wavdata/8-11/miss02.wav deleted file mode 100644 index 27f2373..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/miss02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/stop.wav b/samples/MyFoxBear/wavdata/8-11/stop.wav deleted file mode 100644 index c5eeaba..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/stop.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/strike01.wav b/samples/MyFoxBear/wavdata/8-11/strike01.wav deleted file mode 100644 index 300c5e0..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/strike01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/strike02.wav b/samples/MyFoxBear/wavdata/8-11/strike02.wav deleted file mode 100644 index 68e1213..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/strike02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/stunned.wav b/samples/MyFoxBear/wavdata/8-11/stunned.wav deleted file mode 100644 index 8fa5a5f..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/stunned.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-11/throw.wav b/samples/MyFoxBear/wavdata/8-11/throw.wav deleted file mode 100644 index c187ba6..0000000 Binary files a/samples/MyFoxBear/wavdata/8-11/throw.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/jump.wav b/samples/MyFoxBear/wavdata/8-22/jump.wav deleted file mode 100644 index dd9b2a4..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/jump.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/miss01.wav b/samples/MyFoxBear/wavdata/8-22/miss01.wav deleted file mode 100644 index 9b96d94..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/miss01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/miss02.wav b/samples/MyFoxBear/wavdata/8-22/miss02.wav deleted file mode 100644 index 7ec24c1..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/miss02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/stop.wav b/samples/MyFoxBear/wavdata/8-22/stop.wav deleted file mode 100644 index cebe334..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/stop.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/strike01.wav b/samples/MyFoxBear/wavdata/8-22/strike01.wav deleted file mode 100644 index ef2cb56..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/strike01.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/strike02.wav b/samples/MyFoxBear/wavdata/8-22/strike02.wav deleted file mode 100644 index 06de180..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/strike02.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/stunned.wav b/samples/MyFoxBear/wavdata/8-22/stunned.wav deleted file mode 100644 index 2a1a5d4..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/stunned.wav and /dev/null differ diff --git a/samples/MyFoxBear/wavdata/8-22/throw.wav b/samples/MyFoxBear/wavdata/8-22/throw.wav deleted file mode 100644 index da2a301..0000000 Binary files a/samples/MyFoxBear/wavdata/8-22/throw.wav and /dev/null differ diff --git a/sdk/media/banana.ppm b/sdk/media/banana.ppm deleted file mode 100644 index 48549cc..0000000 Binary files a/sdk/media/banana.ppm and /dev/null differ diff --git a/sdk/media/bang.wav b/sdk/media/bang.wav deleted file mode 100644 index 2d270b9..0000000 Binary files a/sdk/media/bang.wav and /dev/null differ diff --git a/sdk/media/bangbang.wav b/sdk/media/bangbang.wav deleted file mode 100644 index 84cf9e1..0000000 Binary files a/sdk/media/bangbang.wav and /dev/null differ diff --git a/sdk/media/bigship1.x b/sdk/media/bigship1.x deleted file mode 100644 index f5c0dd7..0000000 Binary files a/sdk/media/bigship1.x and /dev/null differ diff --git a/sdk/media/blow1.wav b/sdk/media/blow1.wav deleted file mode 100644 index aae9ebc..0000000 Binary files a/sdk/media/blow1.wav and /dev/null differ diff --git a/sdk/media/blow2.wav b/sdk/media/blow2.wav deleted file mode 100644 index f75e99d..0000000 Binary files a/sdk/media/blow2.wav and /dev/null differ diff --git a/sdk/media/bounce.wav b/sdk/media/bounce.wav deleted file mode 100644 index 33bd786..0000000 Binary files a/sdk/media/bounce.wav and /dev/null differ diff --git a/sdk/media/c_bang.wav b/sdk/media/c_bang.wav deleted file mode 100644 index 4dc29b9..0000000 Binary files a/sdk/media/c_bang.wav and /dev/null differ diff --git a/sdk/media/camera.x b/sdk/media/camera.x deleted file mode 100644 index a8166d6..0000000 Binary files a/sdk/media/camera.x and /dev/null differ diff --git a/sdk/media/chainsw.wav b/sdk/media/chainsw.wav deleted file mode 100644 index 9271f8a..0000000 Binary files a/sdk/media/chainsw.wav and /dev/null differ diff --git a/sdk/media/checker.ppm b/sdk/media/checker.ppm deleted file mode 100644 index 779e3d4..0000000 Binary files a/sdk/media/checker.ppm and /dev/null differ diff --git a/sdk/media/cherry.x b/sdk/media/cherry.x deleted file mode 100644 index 6e0792f..0000000 Binary files a/sdk/media/cherry.x and /dev/null differ diff --git a/sdk/media/cube.x b/sdk/media/cube.x deleted file mode 100644 index 4ccc49f..0000000 Binary files a/sdk/media/cube.x and /dev/null differ diff --git a/sdk/media/d_bang.wav b/sdk/media/d_bang.wav deleted file mode 100644 index f6c6658..0000000 Binary files a/sdk/media/d_bang.wav and /dev/null differ diff --git a/sdk/media/dropship.x b/sdk/media/dropship.x deleted file mode 100644 index 1e0bd0f..0000000 Binary files a/sdk/media/dropship.x and /dev/null differ diff --git a/sdk/media/egg.x b/sdk/media/egg.x deleted file mode 100644 index 5eb91a5..0000000 Binary files a/sdk/media/egg.x and /dev/null differ diff --git a/sdk/media/gunfire.wav b/sdk/media/gunfire.wav deleted file mode 100644 index 44b37b1..0000000 Binary files a/sdk/media/gunfire.wav and /dev/null differ diff --git a/sdk/media/hum.wav b/sdk/media/hum.wav deleted file mode 100644 index dae8d35..0000000 Binary files a/sdk/media/hum.wav and /dev/null differ diff --git a/sdk/media/jump.wav b/sdk/media/jump.wav deleted file mode 100644 index 134cd88..0000000 Binary files a/sdk/media/jump.wav and /dev/null differ diff --git a/sdk/media/lake.ppm b/sdk/media/lake.ppm deleted file mode 100644 index 5fa228f..0000000 --- a/sdk/media/lake.ppm +++ /dev/null @@ -1,1915 +0,0 @@ -P6 -256 256 -255 -{œØy›Ù|œÚ{œÙzÛzÜzÛ}ŸÛŸÚ}Úƒ¡ÛŸÛ„¡Ü€ Ü„£̃‚¡Ü‚¡Üƒ£à‚ Û„¤̃ƒ¡̃…¢Üƒ¡Ü¢à„¥ßƒ¢Üƒ£Ư…¤Ư†¦̃ˆ¦ß¦̃‰§ßˆ¦̃‹¦Ư§ßˆ¤Ü©̃‹¨àŒ§̃ªá‘©ß¨̃¨ßªà“ªß¨̃“ªß”©̃“©̃”«à’©à–«ß“­ă–­à˜­ß˜¯ß™¯à™¯à°á›®ß±â®ßœ±â¡±ß ´â°á¢µâ³â±á µăŸ³âŸ´âŸµâŸ°ß±ß£¶à ´â¦µá¦´â¦´ă¦·ă¦µă§·ăªºä¦¶ă¨·áª¹â¦¹å¦¶à¥·ă¥¸ă¥·äª¹ä©¹ă©·á®ºä¨¸â©ºä¨»æ¥·ă¢¶ă§¶á§¹ä¤·ă¥·á§¹ä§¹ä§¸â§¸â«¹ă©¹ăª¹ä©¹ă°ºâª¹ä¨¹ä¬ºäªºä©¸á­¹â®ºă­¹á¯ºă®¸á±ºá­·ß±ºă¯¸ă²¹á³ºß´¹̃µºâµ»â¶»á¶½ă¶½ăµºà³¹à²»á°½ă±ºâ´¼á³»áµ½ä²ºâ²½ăµ½ă±½â³Àä¶Àå·Áä·¿ă¸¾ß·Àå¸Áă¹ĂäºĂæ¹Âă»Áă½Âä½ĂäÄÇä¿Âá¾ĂåÂÇçÂÆåÄÇäÂÆæÅÆåÅÆæÅÇæĂÄäÇÉçÆÈæÅÆåÆÆäÆÄâÆÇåÅÄáÇÊéÈÇáÉÈâÉËçÉÇßÍËäÊÊằËäËËäÉËåÉÊäỀçÍÍäÍ̀ăÍÍèÊÊåÊÊăÈÊäÉËèÇÉäËËæÈÊçÇÊçÉËçÊËæĂÉçÅÉçÇÊèÂÈåÅÈæÁÈçÀÆâÁÆå¾Äæ¿Ăå¿Åæ¹Æç¹Âă²Ă窾棼ç·å¸å•¸å·å—µă–¸æ’µå–·å™¸ä•·å–´ă“³ä•¶å“³ä³ä“µå—¶å“³ä“µå”³ä“³ä”³ä—´ä•´ä”³ä“³ä”³ä‘²ä–´ä²ä’³ä‘³ă•³â–³ä•´ä‘²ä~ Û{œÙ€ÙzœÚŸÜxœÚ~ Ü|Ù‚£̃|ÛŸÛ€ Û‚ Ü‚¡ƯƒŸÛ‚¢Û‚¢Ư‡¥à…¡Ú Ú† Ú„¢̃ƒ£̃†£Ü†£Ûˆ¥Ư‡¦ß†¦̃ˆ¦ßŒ¦̃©à‰¦̃‹¨à«àªà‰¨àŒ¥Ü‹§Ư©̃§̃ªá«à©ß‘§Ú©̃ªá”ªß•ªß”«ß”«á–ªƯ—¬̃•«ß•¬̃–®â•­à˜±â›³ăŸ²â™«̃™±ă²à›¯àŸ³á¢²à²ăŸ³â²âœ²â¡²áŸ´ä›±á ²à ²à¡³á ¶ä£µà¡µă¢°à¥µá¥¶â¨µß§¸ă§¹ä§¹ä¨¸á§¸ă§·á¦¶à£·ă¤¸äª¹ä©¹ä«ºä©¹ä¬ºä§¹ä§¹ä¥¹å¤¸ä¥¸ä¦¸ă§¹ä§¹ä§¹ă§¹ä§ºä§¸ă¨¸â¤¸ä¦¸ăª¸à«¹ă«ºăªºäª¹ä«¹ă¬ºä­¸à©·á¯¹â¯ºä°¸à­¸á®·ß´»â°ºá±¹á³»ă³¹̃²ºâ´»áµºă´¹à°ºâ¯¸ß±¼ä³ºâ±ºâ±ºâ´½â±¸ß±»ă´¾â±¾å´¾ä°¿å²¾ă´¿ä´¿å´Âç·Àå´Á涿àµÂå·Âå¸Àă»ÄåºÂă¿Åä¹Áå½Äå¾Åæ¿Ææ¾Åæ¿ÄæÁÅæ¿ÄåÄÄäÀÄáÀÄåĂÅâĂÆåÅÇæÂÁàÅÇåÆÇæÅÅâÅÅäÇÇâÅÅáÉÉäÉÈăÇÉåỀçÉÊäÉÊåỀæËÊäËËăËËăÊÊåÍ̀æËËằ̀åÉÊåÉÊäÇÉåÊÊåÈÊæÇÊæÇÊçÇÊæÇÉäÆÊèÄÈåĂÇäÂÈæÀÆåĂÇç¿Çä¼Åæ»Ăæ»Âæ½Äå·Áä´¿å²Àă¬ÀçªÀç¼ç»æ—µåµä—µäºæ˜¸æ—·å–¸æ“´â—´ă•µå•¸æ“µå“³ä”´ä–µå–¸å–´ä–¶å”³ă—³ä—´ä“¶å”´ä”´ä•´ä’³ä˜³ä˜´ä•³ä“³ä”³ä–³ă•µå’´ä{Ú|Ù|Ú}ŸÚ|Ú|ŸƯ} Ư€ Û€¡Ư‚£̃€¢Ü Û„¡Û…¢Ư„¡Û…ŸÛ‚ŸÜ‡¤̃…¥ß†¢Û†£Ûˆ£Ư…£Ü†¥̃†£Û†¤Ư…¦àˆ¦ß‰§̃ˆ¤Ü‰§á‹©á‹§̃‰§̃ˆ§ß©á©ßŒ©ßˆ¦̃¦Ü¨̃©á©à‡Í¥Ú’«á¨̃‘¨Ư•ª̃’ªß”ª̃”¬à•¬à”«̃–­à•¯â–¯ă°âœ°à°âœ°àœ°àœ°ßœ¯ß³ăŸ³â¡²á ´â¢´â³â°ßŸ²á¯ß²á ³ă´ă¢µáŸ±á¢¶ă¥µá¤¶â¢µâ¦¶ă¦·ä¦¹ä§¹ă¨·á©¸ă¥¸ä¦·â¦¸ä«ºä§¹ä©¹ä«ºä§¹ä§¹ä§¹ä¦¹ä¤¸ä§¹ä¦¹ä¦¹ä¢·ă¨¹ă§¹ä¨»å§ºå§¹ä¦¹ä¦¹ä«¹â©¹âª»ä­¼å­ºă®¹ă®¹â¬¸àª·á¬·ß°¹â°ºă¯»ă²»â³ºâ³ºá²¹á³¸ß²ºáµ»â´ºß¶¼áµºà³»ă±»â³¼ă´ºá²»ă±½ă³»ßµ½á´½ă¶¿ä²½å±¼á±½â±¿æ°Áç´Àă±¿ä·¿ăµÂæ¶ÁäµÀâ¸ÄæºÀâ»ÂäºÅçºÁå¾Ăå¼Ăä½ÄăÂÆçºÁå¾ĂăÀÆçĂÈçÀĂäÀÄàÁÄàÄÇä¿ĂäÅÉçÂÇæĂÇçÅÄáÅÄâÈÈæÆÅáÆÈăÇÆâÈÊçÉÊåÉÊæÉÊäÉÊåÉÉâÈÊåË̀çÉËæËËå̀̀çỀçÈÊçỀæÈÉăÉÊæÇÊçÇÉåÇÉäÇÊèÇÊæÇÊçÅÊçÅÉçÁÈæÆÊæÅÇæÄÈçÀÆç¼Ăá¸Äæ»Ăå¹Âæ¸Áâ´Âå¶Äç³Ăç­ÁèªÀ袽æ¶ä›ºæ¹å™ºå¸æ™·å–¶å–µå–¸å–µä“¸æ’µå–¸å—¸æ•³ä˜ºæ–¶å–µä”´ä”²ä–µå–¶å•·å—¶å”³ä˜·æ–¶å˜´ä•³ă‘³ă“³ä’±â•µä•µå‚×{Ø}Ù|ŸÚ}ŸÛƯ{ŸÛ Û€ Û€¢̃†¤Ư‚ Ú„¢Ü†¤Ư‚¡Ü† Ú†¡ÚƒŸÚ…¢Ü‰§àˆ¤Ư‡¢Ưˆ¤̃‰¨à‹§Ư‰¥Ư†¥Ư‡§ßˆ§̃ˆ§ß‹¦̃Œ¨ß‹©à‰¨àªáŒ¨ßªßˆ§ß¨̃©ß«á‘©ß‘ªà’ªà’©̃‘ªá¨ß”«à’«à’«à•¬á“«ß–±ă”­á–¯á—¯á™±â˜¯â™±â—°â ´ă ±ß³â™¯áŸ±â¯àœ±ă¡³á¡´áŸ²á±à²â›³ăœ²âŸµä¡¶ä¡¶ă±ß ¶ă£¸ă¦·â ¶ă¦¸äŸ²à¦¸ă§¹ä¨¸â«ºă§ºå§ºä¨¸ă¨¹ä©¹ä«¹ä¬»äªºä¨ºå§¹ä¨¹ä¥¸ä¦¸ä¤¸ä§ºå§¼å¨ºă¨·á§¹ä¨¹ä¦¸ä§¹ä©¹ä¬ºâ©¹ă«ºä¬»ä¬¼ä®»ä²¼ä¬»ă¬·à°·Ư°ºă²»ä³¼â³¼â±¸à²ºáµºâ³¹â´»â·½á¶½â³½áµ½â²ºă¯ºâ±½ă¯¿ä¯¾å²½ă³¼ă±½åµ¿ă´¿ä´¿ä°½ă®½ă°Àæ¶Ă糿ă¸Äæ¸ĂæºÁåºÄç½Åæ·ĂæºÁä·Àă·Äæ»Äæ¾Åæ½Æç½Æç½Çè¾Åæ¼Ăă½Äå¾ÂåÁÇæ¿ÆæĂÆäÄÉæÅÇăÄÊèÅÇæÅÅåÅÇäÆÇåÈËçÆÉèÇÉçÅÇåÈÆâËÊèÇÇăÈÉåÊÊä̀ËäÊËçỀçÉÍè̀ÍçËËâÍÎåÊÊäÎ̀å̀̀æÉËæÇÉäÇÊæÆÉçÇÊçÇÉåÇÊæÅËèÄÉçÅÉåÂÅăÂÇæÂÅåÁÅæ¸Âæ¾Æä¾Äå¸Äæ¸Ăăµ¿ä³Á毿æ¯À橼娾礽碼碻噸ä·å¸å™·å—·å™¹æ—·å¹æ˜·å”¶å•·å—¹æ™·å¸å—¸æ”·å—·å”³ä•µå”´å”´ä•·å¸å¸å“¶å–¶å•¶å”µä—¶å˜·å™¹æ~›Ù€ ̃×Ù€¤á{Ü„¡Ư€¡̃¢Ư€ Û„£̃ƒ¤̃¢Üƒ¡Úƒ Ù…¤ß„¤ß…¢Ư…¡Ú‰ Ûˆ¢Ư‰§̃ˆ¥ß‰¥Ü‰¤Üˆ§̃ˆ¦ß‡¦̃ˆ¥Ư‹¨àŒ¨ßŒ¥Ü‹¨àˆ¦̃«à«ßŒ©ßŒªá©̃ªáªâ’«à§Ư©̃‘¬ă“­â«ă’«á‘«â’ªà“¬à”®â—°á•«à”®á˜°â˜±â˜°â™¯â°áŸµä±â›±ă›²â³âœ±â±á±âŸ²ă ´â³ăŸ²â´ä³â´ă´äµä ´á´ă£·ă£¶â¤·â¥¹ä¢¶â§¸äª»å«ºä¨ºă©»å¨»ă©ºăªºå©¼å¨¹ä§¸ă©ºä¬½åª»å¦¸ä©¼å¦ºå¦¸ä¨»å¨»å©»ä¨¸â¦¹åª¹ä§·áª¹ä«ºäª¹ă¬ºá¬¼äª»äªºăªºä°½ä¬¹â¯ºâ±¹á±»ă³ºâ³½ă´ºà´½ă¯»ă±»ă³¾åµ¾ä¶¾ăµ»á³¼â³¼â²ºâ±½ä±¾ä¬¼å¯½å·¾ăµ½ăµ¿å¶½â¶½ă¶Á泾岼ă·ÂæµÁå·Áă¶Áå¸Ăæ·Âæ¹Âæ¸Ăç¶Âæ¹Ăå¸Äå¸Âä¹Ăæ¸Ăæ»Åæ½Âå¹Âç·Âæ¾Æå·Áâ»Äç½Æå¼Åå¾ÅèÁÆæÄÈçÀÆåÅÈæÆÈæÄÆäÆÈåÇÈäÈÈäÇÈæÆÈåÈÊæÉËåÆÇăÆÈæÇÈăÉËæÊÊăÊËåÈÉäÊËåÇÉæÇÈăÊËæÈÊæÈÊåÉËçÇÊæÇÊçÄÆâÇÉæÅÉæÅÉäÀÆæĂÆåÆÊçÀÆæÄÈæÁÇå¿Çæ¾Äæ¾Äæ¸ÁæºÄ浿â´Áå·Ăæ±Áç³Âç­À穾社矿蜻场䜺晸曺営å»æ˜¹æ›¹æ˜¶å˜·å™¸å•·å–·å˜¸å—¶å–¸æ–·å™¶å—³ä—¶å–·å–·å¶ä™´ä•¶å”´å—µå–·æ–µå”·å”¶å„Û€ÙƒŸØ‚ŸÚ¢Ü¢Ư¢à‚¢Ü€ Û€ŸÛ‚¡Û…¡Ú„¢Üˆ£Ú…¤̃†¡Ư‡£Ü‰¦Ưˆ¤Ư‡¢Üˆ¡Ü£Üˆ£Û‰¤Ü‹§ß‰¦̃Œªâ¨ß‰¥ƯŒ§̃‘«á‰§ß‹ªá‰§ßŒªà‹ªâ‰¦ßªáŒªâŒ©áŒ©à©̃ªƯ©à©̃ªá«áªà¨à«á«ß’­ă˜±ă“­á•­à˜±â™±â˜°â™°â˜°âœµä›²â™±â™°ß›¯ß³â ²â¢¶äœ²âŸ²áŸ³á³â±â¢¶ä¡µâ ¶ă›´ä›´ä¢·ä£·ă¢¶ă¥¸ä§¸ă§¹ä§¹ä¨¹ä¬»ä¨¹ă«ºă¬½å§ºå©»å©¼å¨»ä©ºäª¼æ©ºă©ºå¬¼å¨»å¨ºä¨¼æ¥¹å§¹ä¦»å¨¹å©ºä«¹äª»äª¸á«¸â­½ä­¼ä¬»â«¼å­ºä¬ºä¯¹á²»á°½â²ºá²ºă±ºă²¾ă°»á³½â²½â³¾ă·¼â·¼âµ¾â°ºáµ¾ă´½ă³¼ă´¼ă³¿æ³¼â³¾á¶¾à·Â涾䶾峾å¶Àäµ¿ă³¾ä¸Âä³Àæ¶Âæ´Àå·Âå»Ăä»Ăä¸Ăæ·Ăç¹ÁâºÄåºĂå·Äç¸Ăæ¹Ăæ¼Æ綿ă»Åç»Äç·¿ă¸Áä»Ää¹Âæ»ĂäÂÅåÄÆäÅÆâÄÈäÅÅäÅÇçÂÄăÆÈäÇÊåÆÅáÊÊåÊÉăÇÈåÈÇâÈÊåÈÊåÈËçÊÊäÉÉăÈÊæË̀èÉËçÉÊæÇÊçÉËçÈËçÊÍèÆÊçÇÊçÆÊçÇÉæĂÈåÂÈæÆÉäÂÈçÂÈçÅÉç¾ÄäÀÆæ¿Åå¾ÆçºÄæ¹Ăä¼Åç¸Âă·Âå¹Äå´Ăç´Âæ¯Ăè¬Á觾æ½ç½æœºå»ç›»ç¿è›·ä¹æ™ºæ¸å™¶ä›ºæ›¼æ™¹æ—¹æ™»æ¸å™¸å•µå™¸æ™¹æ˜¹æ·å¶å–¶å–µä™·å™¶å—³ä˜¶å–µå˜¹æ–·åƒŸÚƒ Ùƒ Ú Ü~ŸÛÙ¡Ư¢ßƒ¡Ư‚×…£Ü„£Ư†¥Ư…¡Ø…£Ü†¦á…¢̃ˆ¥ßˆ¤Ư‰¤Ü‡¥à‹¦̃‰¥Ü‹¨ß£Ú§ÜŒ¨àŒ©à¨ß‹§ßŒ©àŒ¨ß‹ªáˆ¤Ü©ß©á‹§ß¨ß‹©à©Ưªß¬á©ß¦Ư‘«ßªß’¬à’¬ß‘«á“®â“®â‘«â—±ă–°â“ªß–°ă™°á–®á—±ä˜²ă˜±ă˜¯â²ă˜³ä±á±á²àŸ´ăŸ´â´ă´ă³ă³á¡´âŸ´ă´ăŸµä´ă¤·ă¦¸ä¥¸ä¤¶ă¤µá¦¹ä§¹ä¨¹äª¹ă¬¹ăªºä¬»ä§¹ä©½æ§¹å§¹ä¨¹ä©»å©¼å¨ºä¬¼å¨»å¢¶â¨¼å¨ºå¨ºå©»å«»ä©¹äª¸á©»ä­¹âª¹ă­¹â¬ºă­½ä­ºä¯»â¯¹á«¸ß®º̃³¼á±¸̃±½ä°¼ă´½ä®ºâ²¼ă´¼á·¾ă¶¾ăµÀá²Àä±¼á²½à³¾ă´¾ä²ºă¶¾å°½â³¾ă³¾ä¶À䶽á·ÀăµÀ峿ä¸Áâ³¾ă´À䲾䳿ă¶Áä·Âå¶Á䶾à¸Ăå·Àä·Áæ·Ăæ¶Àå·Ăæ¸Ăæ¹Âæ¸Äç¸Äç¹ÄåºÂă¶Áæ¶Àă¸ÂăºĂå½Àà¿ÄåÅÈåÆÈåÆÇăÇÈåĂÆäÄÆăÆÈåÄÅåÇÉäÇÉäÈÉæÈÆăÇÉåÆÇäÉÊæÉÊåËËåÉÊæÈÊçÇÉäÇÊçÇÉäÇÊæÈËçÈËåÇËçÈËçĂÇæÀÇçÄÉçÄÉçĂÉæÄÉçÁÆå¾Åæ¾ÆæÂÈç½Æä¾ÅäºÄæ¸Åç¶Áå»Åæ·ÂåµÂæµÂè±Àæ²Áç­Áç¬Àç¬¾ă§¿ç ¼ç¡¼ç»æ›¼ç›¹åœ·â¹æœ¼æ™»æ—¶å›ºæ˜·å˜ºæ»æ›»ç™¹æ˜¹æ¹æ·åºæŸ»å›¹æ™·å™¹æ’´ä™¶å—´å¶å–·å–»ç™ºæ·å„¢Ú…£Ưƒ¡à† Ú¡̃‚ Ûƒ¢Üƒ£ß„£Ư…¥̃„¤Ư„¡Ûƒ¡Ú‡¥Ưˆ¥Ư†¥̃†¤ßˆ¥̃‰¤Ü‰¥̃‰¤Ü‰¦ß‹¨à©á§̃¨ß§Ư¨Ư©ßŒ§ß©àŒªáªáªàªß‰§à«áŒ©à«á«ß©à­ă«ß«à•°ă¬â•°â’­à‘«ß‘¬à’­à”¯â•®â—²ä•¯â•®á˜±â˜°â—±ă˜²â²â™³ăµăœ³â¡±âŸ±âŸ´â¢´áŸµä ´â³á´ă´âŸµä ³ă¢·ä¡·ä¡¶â¤¸ä¦¸ä¤¸ä§¸ä§¹ä§¹ä§¹ä§¹ä¨»æ«»äª»å«¼å§¹ă­¾å¨¸â§¸ă§ºä¨ºä©¼å¨»å§»æ¨»å©½æ¨½æª¼æ©¼æ°¿ă«»äª»å«¹ă®½ä­¼ä§¸ăª¹ă­»â¯Àæ®¼ă­ºâ¯½ă²¾ä±¼â±¼â¯¼ä²¼ă³½ä²½ă³¾â´»ă´¾ä´¼ă²½ă¶¿ă³¿å´»â³¾ä²½â´½â¶¿åµ¾ä·Áä¶À嶾䷾䷾ල⶿尽å¶Ăæ·Áä²Àå´ÁåµÂæµÂæ¶Âæ²Áç´Àă¶Ă泿äµÁæ´Âæ³ÁçµĂçµÂæ·Âå¹Åç»Äæ·Ăæ¸Ăå¹Ăâ¸Ăå¹Ăå¼Äç»Àă¿ÄäÆÈçÀÅæĂÅåÆÆæÁÄäĂÅàÈÈäÆÆáÇÈäÈÊåÊÉçÇÉåÇÊèÇÉåÈÉåÇÈåÊËçÊËçÆÈăÇÉåÇÉäÇÊèÇÊçÆÊçÅÉäĂÈçÄÉçÅÉçÀÇçÆÊçÂÈæÀÆäĂÉè¿ÈçÀÆæ¾ÆæÂÈçÀÆæ½ÆçºÄæ»Æç¸Âæ·ĂæµĂæ³Ăç¶Ăæ°Áç´Ăç²Áç­Á欿äªÂ覿禿矼æ¾ç›»æ›ºå›¸æ¹æ¹æºæºæ˜¹æ™ºæ˜¶å»ç›ºæ¹æ™¶åŸ»çŸ¸å£»å »æ»æ˜¸å—¸å™¹æ™¸åŸ»æ¤¿é¢¾ç¥½è¤½ç€ Ư… Ù‰¤Ü€ŸÚƒ¢Ư„¤Ư…£Ü‚¢̃„¡̃ƒ¥à…¢Ü„ Ù…¢Û‡¤Ư„¥à…¥̃„¢Ư‡£Ü†¤Ưˆ¥̃‰£Úˆ§á‹§á¨ßªá’¨Ư¦̃Œ¦ÜŒ¨ß¥ƯŒ¨ßŒ©à‹¬â«âªà‹¨̃Œ¨̃©á«àªß©ß’­â’­̃­á¬à“­á“®â”®áªß’®â”¯â“¯â”®á‘®â”¯á–²á–±ă–°á—³ă–±ă³ă˜°â™³ă—°áŸ±á³âœ²á ³ä¡³áŸ¶ăŸ¶äµâŸ´ä¢·ă¥·ăŸ·ä¡·ä¥¸ä¦¸ä¤¸ä§¹ä§¹ä§¹ä§¹ä§¹ä¨¹ä«¹ä«¼å§ºäª»å©¸á¨¹ă¨ºä§ºä©¹âª½æ¨»ä§ºä§¼æ§»å¨¼ä¥»å§¼æ¨ºåª»ă¬»ä«¼å­¼å¬¹áª»ă©»åªºäª¼å­¼ä¬¹á®ºä°¹á²¼â³»á±¾ä°½å³¾ă°¹âµ¼âµ¼ß´¼äµÀå³»á²¿ä´¾å°¼á¶½á´½á±¾ă²½â²»ăµ¾åµ¼â´¿å·À嶽â¸Àà·¿â¶¾å´¼ă´¿å³¿ä³Áæ²¾ä´Áå¶Áæ¶À岿ă´Äç±Àå³Áä±Âæ³Âå´ÁæµÄè±Âç¶Ăç·Âå·ÂåºÅç¸Âæ·Áä·ÂäµÄ縿â¾Åæ¿ÅåĂÈçĂÇæĂÆåĂÅåÂÈæĂÇåÂÄăÅÅäÇÉäÅÅäÇÉåÇÊåÇÉåÇÈăÇÈâÅÆăÆÉçÇÆáÇÈăÇÊçÅÇåÇÊçÆÊçĂÈåÁÇäÇÊçÀÈçÁÈçÀÆæÁÈçÂÈç¼ÅçÂÈæ½Åæ¿Èç»Èê¾Çç¿Æè»Åæ¸Åç·Áå·Âæ¶Äæ³Áå³Áæ±Â竾歿歿笽⪾å«Á觾磾砼æ¹æ›ºæœ¹å™ºå˜¸å™·ä™ºæ·å˜ºæ¸æºæ›ºæºæœºæ¡½æ¦À覼æ«À椽埻眾瘷ä¹ç¦¾ç¨¾æ¬Â觿穾櫿愡Ư†Ÿ×„ŸØ„£̃ƒ£Ư‚£Ü†¤Ü‰¦Ư‡¥ß„¡Ü„¤̃‚£ß…¤áƒ£Ư¦̃ˆ¤Ü‰¦̃‰¦Ư¨áªáŒ¦Ư¥Ü¨áŒ§á¨Ưªá”«à©ß¨ßŒ©à©à©Ư‘¬ßªáªá«ß«ß«à«à“¯ă­áªà’°à¬á’«à“¬â«á”®á’¯â¯ă•°ă°ă•±ä–±â”®à•²ä•±ă•±â•²ä–²ă˜´ä˜³ă´ă›°áœ²á ´â±â£µă¡´ă¡·ä ¶â¢¶â¤¸ä¡¶ä¦¹ä§¹ä¥¸ä¥¹ä¥¶â§¹ä¥¹å¦¹ä¦»å©½æ§¹ä¨»å«ºä¨ºäªºâ¨»å¨¼æ¨¸ă¨ºä¦ºå¨ºä«¼å«¹â¨¼å§»å§»ä¦½å©½æª¾æ¨»åª¼å®½â¬½å¬»å¬»â²¼á­»å¯½ă«¼æ®¾å²½â²½ä­»ă±»ä²»â³¿ä²½â²¾â±»ä¸¿ä¶¿å³¼ă´¼ä·¿ă³»â´¾å¶Àä´Àå´¿ä²½â´¾ăµ½ă³À治᷾ä¶À嶾䶿ă¶Áå´¿ä¶Áă¸Àă³Áæ·Ă䯿䲿å³Âæ³Ä籿å³ÂæµĂæµĂç´Âæ²Áæ±Àæ¶Äç²ÂçµĂæ¶Åç·Ăç¸Ăæ¸Äç·Ăæ¹ÇéºÅå»Âä½Âå¿ÄäĂÆåÂÆæÄÆäÁÆæÂÆåÆÅâÅÇæÁÄåÅÉçÇÉæÅÇåÅÇçÇÊçÆÉæÇÊçÆÇæÇÉçÇÊçÇÊçÈÉäÂÆæÄÉçÄÉçĂÈåÄÉçÄÉçÂÆçÂÅåÂÈæÁÅæ¿Çæ½ÄäÂÆæ¿ÅæÀÇç¼ÄæºÄæ¿Æè¸Åç¸Äå¸Ăç¶Ăæ°Ăè°Ăè°Âç­Á竿檿çªÀ禾樾å¨Àè¤Àç¤Àè ½ç»å»æ›»æœ½æ›½ç˜¸ä¾ç˜¹æºæ›¼æ»ç¼ç¼ç¦¾ç©À穾æ­Âå®Àæ©À襼æ¦À裾硾è£À礿覼槼æ®Ăè®À扟ւ¥á„¡Û‰¥ß†¤̃‡¡Ù†¥̃…¤̃‰¤Ü‡¤̃‡£̃‡¥̃‰¥Ư‰§à‡¦ß…¤Ư‰¥̃ŒªáŒ¨àªá©à¨Ư‘ªà§̃“©̃«â«á’«ß©̃«á©̃Œ¬á‹ª̃«à«â‘¬â“®â­â®â­â«á®â¯ă¬â‘­ă—±â¬à“­á‘­â“¯ă‘®â“®â—±ă–±â–²ă–²ä•³ä˜³ä˜³ä“¯ă˜³ă–²ă›µä´ä¶ä¡µä¡´ăŸ´ä´ăŸ¶ä¢·ä£¸ä¢·ä¥¸ä¤¸ä¨¹ä¥¸ä¦¸ä¥¸ä¦¹å§»æ¥»æ¥»æ¨¾ç¨ºä¨»å¨¼å¨ºä¬½æ©¼æ¨»å©½æ©½æª¾æª½å©ºå¨ºä¨½æ¦¼æ«¾æ¨¼å¥¼æªÀ穼媽婼宼䮼䭾毾峾䲾᫺⭽䰽ä³Àå¯À沽崿嵿䲻ಾä³Àå°½ä±Àå´Áæ´¿ă¯¼âµÁå±Áå³Ă貿æ³Áç´À嶾ä¶Àå¶Áæµ½ă¸Âă·½â¶¾â·Áå·ÂæµÀå´Áæ´Âç²Âæ°Àæ°Àæ°Àå¶Âå°¾å³Ăç´Â篾ä³Áæ²Âæ¯Áç²Àå´Ăæ´Âç´Âæ·Äå¸Åè¸Åç¸Æç¹Åæ»Æç½Ăå¿Åæ¾ÂăÁÆåÀÄăÀĂåÂÄå¿ÆæÂÄäÂÆåÅÊçÅÈçÅÆåÇÉæÇÇăÇÈăÇËçÆÈæÆÇæÄÈæĂÈäÄÈæÆÈæÇÊæÆÊçÅÉçĂÇçÁÇäÄÉæÅÉæÁÇäĂÈçÂÉç¼Åæ¸ÄæÀÇæÀÈç¿Æç¿Ää¿Çæ½Çç¼Æç¸Ăæ¸ÅæµÂæ´Ăç²Ăæ¬Àç­Àç­Áè¬Àç¨Á覾樾ä¦Àè¤Àç ½ç£Àè¤Àè½æ£Àå À碾砽柽碾礿砿蟾祽橿槿æªÀè«À窾ç«À竿窿ç¨À秾ç©À襼å§Àç¥À穽妽å«Àè¬Á燡܆¤áƒ£Ü†¤Ư¢ß…£Ư†£Ü…£à‡¥àˆ¥ß…¥à…¤ß‰¥̃…¡Ú‡¤Ư‡¦̃ˆ¥Ư‰¨à‹§ß©àªá“¬á¨á“«à“¬âŒ©̃‘ªà©ß«à«ß¬â«áªß­ă“¬á‘«á‘«á’®â¬à¬â®â®ă¬á‘®â‘­ă”±ă”®á–°â—²ă–²ä—²ă—´ä–³ä–±ă—³ä–²ä—³ä—´ä™´ä³ä˜³ä™´ä—³äµäµä¡´ăŸ´ă¢¶ä¡´ăŸ¶ä¢·äŸ¶ä¢·ä£¸ä¥¸ä§¹ä¥¸ä¨¹ä§ºä£ºæ¨½è¦½ç§ºäª¾è©¼æ¨»åª½æ¬¿æ¨½æª¾æª½æ¦»å¦»åª½æ¨¼å¨»å©¼åª½å©¿ç¦¼æ§»å§½æ©¿æª¿çª½å¬¾æ«¼ä¬ºä­¾æ«¼å°¿æ°¿å¬½ă­¾å­¾æ°½å°¿æ°¿å²¾ä¯¼ă³Àæ±Àä³Àå³Áç¯Àæ°¾æ°Áæ­¼äµÂ毿å³Ăç³Àæ³Âç²Àæ³Áæ´¾ă¸ĂçµÁæ·Âå¸Àâ¶¿ă·¿å¸Á泿å¸Âä´ĂæµÁæ²Áæ±Àæ´Äè´Äç¯Àå±Àå¯Âè³Áå´Âæ°Áç²Âç³Äè¶Äç´Äç¶Äè¸Æç·Ăæ·Âæ¸Åç»Ăæ¿Æç¼Äæ½Ăæ¼ĂåÂÇç¿Äå¿Ăå¿ÄæĂÇæÁÆäĂÆåÂÆæÄÅâÆÉäĂÈæĂÉæĂÆåÅÆæÄÊçĂÈåÅÇăĂÈåÄÇäÆÊèĂÇæÂÇæÄÈæÅÉçÁÈæ¿ÆåÀÇç¿ÇæÀÈçÀÇç¿Èç¾Çç¾Çç¾Æç½ÅæÀÈç¾Æç½Çç¹Æé»Äç·Äç¶Äç°Ăè°Ăè®Âå¬Áç«Á訿ç©ÁçªÀç©À袾ç£Á衽秾çªÂè«Âæ¨ÂèªÁæªÁçªÀæ®Âæ­Ăè®Ăé¯Äê¬Âè®Âè®Â調ç­Àç¬Áè¬Âè¬Âè«Áè«Àç«Áè¯Ăè­Ăè«Àç¬Âé¬À秾禿詾ç®Á燢܉¥Ư„¢Ư†£Ư…¤̃ˆ¦̃ˆ¥Ưˆ¦àˆ¦ß‰¦ß§ß‹¤Ûˆ§á‰¥̃©à‰¨ß§̃Œ¨ß©̃ªá©à“ªßªá‘ªà“¬â”­à“ª̃“®â¬â’®â©ß«á­áªà‘¬à“­à“­à­à¬â‘­â‘¯â‘®ă¬á­á±ä–²ä–¯â˜²ă–±ă™³ä—²ä—²ä™´ä—³ä–³ä™³ä˜´ä˜³ä—³ä–³ä™´ä™µäœµäœ´äµăŸµă¢µä¥·ä ·ä¢·äµä¤¸ä¥¸ä¥¹ä£¹å¥¹å¦ºåª¼æ©½ç§»å«¿ç¨»å¥ºå©½æ¨½æ©¼å«¿ç©¼æ©½æª¾æ«¿æ¨½ä§½æª½å«½ä®½â©½æ®¿ç«¿çª¿æ«À椼樿窿竾笽款款孽嫾欽å°À毾ä¯Àç°Á篾孽å­Àç°¿æ±Áç³¾å³Àå¶Ăç´¿æ±Áæ²Áæ°¿æ±Áç¸Äç±Â粿å¯Áç³Ăç³Áæ·Âæ´Áå³ÁæµÁå·Âæ·Áå¶Á浿â¸Âå·ÁæµÄç´Ăç³Âç³Áæ´Ăç²Äè¯Ăè®Áå²Ăæ³Âç¯Áæ¯Áç²Ăè³Âæ´Ăç¶Åé´Ăè³Ăæ¶Åç¶Äç¶Ăç¸Åç¹ÄçÀÇè¿ÄåÁÅå¼ÄåÀÂâ¿ĂåÀĂäÁÈçÁÅåÂÅåĂÇæÂÅåÆÈăÄÇæÄÇæÄÊèÆÊçÁÇæÅÉçÂÈçĂÈåÅÊèÂÈèÅÈæ¿ÆæÂÈæÅÈæĂÈçÁÈæÂÈçÀÇçÁÈç¿Èè¾Çè¾Çè½Æç»Æç¿Çæ»Äæ½Çç¾Çé¼Çè¹Äç¶Æè¶Åç´Äè°Âç¬ÂèªÂç¬Âç¨Àç¦Àç¥Âé¨Á褿ç¤Àç©Áè®Âç°Ăè°Ăç³ÄçµÅè·Çé»Éè¿Ëè¼Çç·Æè»Çè¸Çé¸Åç·ÅçµÅç²Ăç±Âç®Âç±Ăç­Âè­Àå°Àå¶ÅèºÅæºÅä³Äè®Äé­Áç©¿ç³Äè´Ăæ³Â牧ߣڈ¥Ư‡¤Ưˆ¦̃‰£Û¥̃‰¥Ưˆ¥Ư‹§̃‰§ßˆ£Ú§̃¥Ư¨̃‹¨à‹¨̃©â©ß«á”«à«âªá«á”­â”¬â­â“±ă¯â’­á«á‘­á’­à«̃“®ă”­à’®á“®â“¯ă¯â“²ă’°á’±â”±ă‘¯ă•²ă˜´ä˜³ä—°ă™´ä—³ä•°ă´ä–²ă•²ä˜´ä–³ä—´ä™´ä˜´ä™¶å˜³ä¶äµä¡·ä¡¶ă£¶ä¡µă¡¶ä¡¶äµä¥¸ä¤¸ä§¹ä ·ä¥¹å¨¹ä¥ºå¦½æ©»ä¬¼åª¾ç«¾ç©¾è§½ç©½å«À笿欿橿欿橾橾ç¬À穼å¬Âç°À簿檿橾槾秽檿秾窾æ¬À欿櫾欿櫾殾孽å°Àæ®Àç²Áæ¯Àç¯À歾沿対ä±Àæ®Àæ±Àæ´ÂçµÂæ±Âç³Àå³Áæ´Äè±Âç®Àæ°Ăç³Ăè¯Âç±Àæ±Âç´Äç³Âæ´Áæ¶Âå·Âæ´Ăæ¶Áå·Â沿ä¶Äæ¶Ăæ¸Æç²Áæ²Áæ°Ăè°Äè°Ăè°Ăç¯Ăè±Ăæ±Âç°Âç³Âç¯Áç³Äè²Äç´Äç´Äç´Äç·Åç»ÄæÂÉè½ĂæÀÇåÀÄåÁÅå»ÁăÂÅăÂÈçÅÇåÁĂåĂÆæÅÊèÄÊèĂÈçÇÊçÇÊçÂÈæÄÉçÂÈçÄÉçĂÉçÄÉçÂÈçÀÆæĂÉçÄÉçÁÈçÀÅăÀÈçĂÉç¿ÇçÄÉçĂÊê¾Çç½Çç¼Çé·Äç¿Èé½Çç½Çé½ÇèºÆè¹Åè·Åç¸Åç¸Æè³Äé¯Âç«Âè©ÁèªÁè¬Âè¬Á姿è¨Àç³ĂçºÇè¾Ëé»Èè¸Çè¼ÈèẰéÅÍéÅÎềÑëÆ̀çÀÊèÅÍéÁÉèÁËêÀÉé¸Åç¶Åç´Äè²Äç·Åç·ÄçµÄæ¶Äç»ÆçÀÇç¿Çæ¹Æç´Äç´Äç´Åç·ÅçÀÈçÀÈç¨̃‡£̃‹¥Ư‰¤Ü§à¦̃ˆ¤à¥Ưˆ£Úˆ¥Ü‰¨àˆ¥Ư‹§ß‹¦ƯŒ¦ƯªàŒ©àªàªß•­à’«á“¬á«â”«à•¬á”ªß’­á“­á¬á’­á¬â’«á”®á‘­à‘¯ă’«ß•®â‘­ă–³ă¬â‘­â•²â“°ă”¯ă“®â•°ă—±ă™³ä—±ă˜´ä–²ä™´ä™´ä–²ä–³ä•³ä–´ä˜´äµå¶å¶ä·å¶ä·åµä¶ä¡¶ä¥¹ä£¸ä ·ä¡·ä§¹ä£·ä¡·ä£»å¤¼ç¦»å£·ä§ºå¨ºå©¼ç«¿çª¾ç¨ºå©¼å©¾æ­Àç«¿æ«À秼䩿櫾歾婾歿ä¬Áè±Àç´Âæ®Á窿楼奾稽橾窿窾æ¯Âç­¿æ«Àç®Àæ®Àæ­¾å°À毿歿欿æ²Áæ±Àå´Á岽䳾ă²À沿ä²Àæ³Ăç±Àæ´Äè³Âç´Æë±Äè­Áç­Àç±Ăç±Âç°Âç°Ăè³Âç²Âæ²ÄçµÄç³Àæ³Âä³Áå¶Áä²ÁåµÄçµÂæµĂçµĂç²Àä­¾å°Ăè­Âè®Âè­Âè¬Àæ¯Âç®Áç¯Âè±Äé³Äè®Ăè²ÄçµÄç·Åç¹Åè¼ÆçĂÇæ¿ĂæÂÆæÀĂæ¿ÄåÁĂá½ĂæĂÇæÄÈå¿ÅçĂÇæÆÉçÅÉçÄÈèĂÈçÇÊçÁÆăÄÉæÆÉæÈÊçÆÊçÀÇçÂÈçĂÉçĂÉçÂÈèÀÆăÁÇåÀÆåĂÈæÄÊèÅÍéÂÉèÀÈç½ÆçÀÊêÀÈèÀÈèÄÊéÀÈèÁÈç¿Èè¾Çç¹Æç¸Åç·Æê³Åê¯Âå¯Âè«Áè©¿ç¬Âæ¨Áæ®Ăç¶Æê¼ÉèÂÊéÄ̀èÂÈåẰéÄÍéÉÎéÈ̀èÇÍéÈÎêÇÍæÆÉåÅ̀éÂÉèÂÊèÁÈè¼Çè¼Éé¶Äæ¼Æç¸Åç»Çè½Èæ¼ÆçÂÉçĂÉç¿ÇçÂÉèÀÈé¼Æç¼Æç¿ÇçÆÊçÄÊ蒪ߦƯŒ£Ù§Ư¨àŒ¦̃Œ¨á‹©à¦̃§̃«áŒ¨ß¨̃Œ§̃©á’«áªá‘©Ư’«à‘¬á‘«á‘¬á–¯â”¬á‘«á”¬à”¬à“­à®â’­á˜°â“­á•­à“ªß—¯á‘­â•®ă’®â“®á“¯á’®â—°â—¯á—°â˜±ă˜²ä–¯á™³ă™´ä´äœµä™´ä™µä™´ä™´ä™¶å·å›¶å›ºæœ·åµäµä ¹æ¡ºç ¶ä¡·ä£¸ä¢·äµă¤ºæ£¸å¤¸å¥¸ä¡¹å¡ºæ£»ç¥ºå©½æ¨»ä©½æ¨»å«¾å®Â諾窿櫽䬿窾ç¬Â訾æ¬À竾孾䬿æ°Âæ±Áæ´Àæ¸ÂåµÁæµĂç±Âæ­ÁèªÀè«Âè¬Àç­Âé±Âç±Ăç¬À檿æ­Áå­Âç¯Àä²Áæ°Àæ¯Àæ´Äè±Äç·Äå¶Ăæ±Âç²Âç³Ăæ²Âæ¸ÄçµÄçµÄç¶Åç¹Çé¶Åç¶Åè²Äè°Åë²Áæ²Ăè²Äè´Åè±Ăè²ĂçµĂç´Ăç±Åê²ÄéµĂæ·Âå¶Äå·Äç¶ÄçµÅç´Äç´Äç±Äç®Âè­Âè²Äè°Ăç·Äå±ĂçµÅè°Ăè²Âç²Äè·Åç¸Åç»Çè½ÅæÀÇèÁÇç¿Âå¾ÅæÁÄäÀĂåÀĂäÁÄáÂÄâÅÈæÆÇäÆÉæÂÈçĂÈåÇÉçÄÉçÅÉçÅÉçÆÊçÄÈåÄÉèÅÊèÉ̀éÆÊèÁÈçÅÉçÇÊçÈÊçÅÉåÇËåÇÎéÆ̀éÉÏéÅ̀èÈÍêÁËêÆÍéÈÎëÁÈèÂÉèĂÊê¾Çç¾Çç½ÆçÁËé¼Ëê¸Çè³Åè´Åè´Åè®Âè°Ăè«Âç¯Âç¶Åç¿ËêÁÉçÅÊäÆ̀æÇËçÊĐêÊÏéÈ̀èÈ̀èÉ̀èÊÍèÉÎêÈ̀èÇ̀èÈĐêĂÊèÅ̀èÅÍéÅËèÇ̀èÇ̀èĂËèÄÍëÂÊéÅËæÆËèÇËèÄÊèÈ̀èÆÍéÇÍéÆÊçÅËèÈËçÇÍé“©̃–©Û“¥Ù’ªß©̃Œ¥Ü¥Ưªá‘¨àŒ¨àªá¨ß‰¦̃ªá¨ß”«à•¬á“«à“¬ß“­â’«à”®â–¬ß–¯â•°â–­à˜°á˜³ä”¯â–°ă›²â›±â˜°á”¯â—¯â–±ä”®â–°â–±ä–±ă—°ă–°á™´ä—°â–°ă˜²ä™³ä˜²ä˜²äœ³ă›µä™´ä™¶å™´ä·å·å™¶å›µä›µä¡¸ä¶äœ¶ä ¶ä·å£·ä ·ä£¸ä£¸äŸ·å¥»ç¡·ä¦ºæ¤ºå¤ºå¢ºå¤ºå¢·ä§¾é¨¼åª¾æª¾ç«¾è­Àç®Àè°Áæ®Àæ­Àæ°Âæ¯Á穽æ°Áç®À款æµĂå´Ăç·Ăæ¸Äæ¹ÄèºÇêºÅç½ÇçµÅè°Åê®Âè²Äè³Äç·Åç³Âç²ĂèªÁè¯Ăè°Ăè¯Áç²Ăè´Äç¹Ää·Åè¸Åè¹Æé¸ÅçµÅç´Äè²Äç¶Åç¸Åç¸Åç¶Åç·Æè¼Éé¹Çé·Æê¶Æë¶Æê³Äé³Äè²ĂèµÄç°Ăè±Ăç²Ä笿æ®Ăê²ÄéµÄç¶Äæ¸Äæ³Áå·Åç¶Äç´Åè³ÅéµÅç¯Åé¯Äé²Äè°Ăç±ÄéµÅè´Æê¶Åé´ÅèµÅè¸Åç¸Åç½ÇéÀÅæÁÅæÁÅçÁÅåÄÇæÂÆåĂÇæ¿ĂăÄÈæĂÈæÁÅăÆÊæĂÉçÄÉçÇÊæÄÊèÆÊçÇËçÈÊçÅÈäÆÉæÆÊçÇ̀éÇ̀éÉÎéÆÉçÇ̀éÈ̀èÊÏèÊÏéËÏèÊÑëÊÑêÉÎêÉĐêÊÑëÈ̀èÉÏéÆÎêÆÏëÄÊçÆ̀ëÄÉèÁÊé¾ÈèẦéºÇç¿̀êµÆé·Çê³Æé¯Âè²Åé°ÅéµÅé¼ÉèÄ̀èÁÉèÄ̀èÆËçÇËçÈ̀èÈÍèÈÍèÇËçÇËçÈÍèÉ̀æÈÍèÈ̀èÉ̀æÇËèÈÍèËÏéÈÍéÉÏéÅËæÆ̀èÆÍéÉÎéÊÑêÉÍçËĐéÊÍèÉÎéÇ̀èÇ̀êÈÍéÈÎêÅËéÆÊç ®à˜ªÜ–©Ư’©̃“©̃‘©ß‘ªß’«à’ªß’ªß¨Ưªà§Ü©ß©ß’©̃©ß–¬á“«ß–¬à”­á‘ª̃’¬á–¯â–¯ă—°á³á³á´â¢¶ä¢´ă¢³á£¶ă µá˜±â˜°â”¯â—±â—°ă–°ă—±ă”¯á˜³ă—¯á›´ä™´ä™´ä˜²ă˜²ă³äœµäµäœµä›¶å™¶å™µä›ºæ·åµå™µä»æ¸å¢·ä¥»æ¡·å£¸ä¤¸ä¦»å¡¸åŸ¸å¤ºå¤¹ä¤»æ¦»å¥¸ä¤ºå¡¹æ£ºå§»æ«À穼檽櫿ç°Âç¯Àç´Âç±Àæ²Áä¯À泿â³Âæ°Âç²Äç·Äç¶Âæ¸Äæ·ĂæÁÉêÂÈéÂÇçÀÇç¹Æç¸Åç¶Åç·Åç¸Åç¸Åç¸Æé¶Æé±Ăç±Ăè±Äè±Áæ³Äè´Äç´ÄçµÅè¹Æé¹Æè¸Åç¸Åç´Äç¸Åè¶Åè·Åç·Åç¸Åç¹Æè¹ÇéºÈê¸Çê»ÇéºÆè´Åè²Ăç²ÄçµĂç±Äé¯Ăè°Äè®Âè­Áç°Ăè³Äè¸Åç·Åç³Äç¸Äå·Åç¸Åç¶Åç°Ăè±Åê±Äé³Åê·Åè³Åê³Ăç¶Åê¹Æê¸Åç¼ÈéºÇè½Çè¾ÄåĂÉçÁÅç¿Äæ½Ăå¾ÄåÂÄåĂÈæÄÈåÆÊçÂÇæÄÇäÇÊæÆÊçÈËçÈ̀èÇËçÈ̀èÈ̀çÈËèÇÊåÈËçÇËçÇÊçÈ̀èÉÏêÉÍèÊÍèÊÎèÍÏéÎÏéÑ̉êÍĐéÏ̉ềÑ́̀ĐêÊÎèËĐêÊĐêÊĐêÇÎêÂËçÇ̀èÈÏêÈÏêĂÍéĂËèÀËéºÈèºÈéºÉê´Åè«Âè²Ăè¶Æè¹ÈêÀÊè¾ÇçÁÉèÆÊçÆ̀èÅÊèÇËèÈËèÉÍèÈËæÉÎéÈÊèÈËçÈÍèÉÎèÉÎèÊÏçÈËæ̀ĐêÊÎçÊÑéÊÎèÉÍé̀Ïè̀ÏéËÑềÎèÎĐéÍÏèÍÏéËÎèÈ̀èÈ̀èÇÊéÈÎéÉÎ饰᢮ܫۗ«̃–«̃“©Ư‘¨Ư’¨Ư¨̃’ªà§Ư“¬à©̃©ß’«á‘ªàªà•­â˜­â›¯ß˜¬à˜°ß—®ß™®ßœ³â²ă ·ä¢µă§·â¦´á§¶â§²ß©·ă¤·ăµă™°â•±ä—²ă˜°â˜²ă”¯â—²â™´ä˜³ä—¯á˜³ä™´ä™´ä˜²ă˜´ä›µä´ä´ä¸åœ¶å™´ä›¸å¸åœ¶äœ¶ä¸åµäŸ·å¥ºå¢¸å¤ºæ£¹å£·ä ¹å ºå¡¸å¤»å£ºæ¥»å¤»å¤¼æ¤½ç£¹åª¾æ«¾çª¾è©¾æ­Àæ²Âç®Àç²Àç¶Ăç´Áæ°Áæ°¾á¶ĂæµĂç¸Äç²Áæ¶ÄçºÄæÁÈçÆÊçÄÊéÄÉèÀÆæÁÈçºÆç¿Èç½Çç¼Çé¾Çè¹Åç¹Æç¹Åç´Äé¶Äç²Áæ·Æè·Åç¶ÅçºÇèºÇê½Éè¾Éè¿Çç½Æç¼Çé½Éé¸Åç¼Èè»ÉéºÆå¼Èç¹Èé¼Éê»Èè¸ÆéµÅè´Æç°Âç±Äè®Âè®Ăè°Äê°Ăè¯Ăè¯ÂèµÅè³Äè²Ăç¸Åç¸Æè¹Æé¸Åæ´Äç±Äè²Æë°Ăè³Æé¹Èé¸Ḉ»ÇèÁËéÀÉè¿Êê¿ÉéÁÉçĂÊèÀÈçÁÆæÂÆæ½ÄåĂÄåÂÆæÀĂåÁÇçĂÇæÄÉçÆÊæÆÉåÇÊèÇÊçÇÊçÇËçÈÍèÈ̀èÈÊäÇÊåÆ̀êÈ̀èÈ̀èÆÊçÉÍèÊÏéÎÑéỀèËÍçĐ̉éĐĐè̉̉éÏÑéÏÑéĐÓëÏ̉êÉÏé̀̉ë̀ÍåÊÎèÉÏéÉÎçÉÎêÉÏéÉÎéÇÏêÉÏéÆÎéÄÍé¼Íë»ÉêµÅè®Ăè¶ÅçºÈè»Çè¹Çè¿Èè¿Èè¿ÈçÁÈåÂÊèÉÍèÈ̀æÆËçÅÊåÈËèÈÊåÆËæÇ̀èÊĐêÉÍéÉÏé̀ÏèÍÑéËÏè̀ĐéÎĐé̀ĐéÍÑêÍÎçÏÑèÍÏæÏĐè̀ËåÎÏéÎĐéÈ̀éÈËæÈËçÉÎéÉÍ許̃¦¯ß¡±à¢®̃¡¬ß–¬à”¬á©̃‘ªàªà©à”ªƯ“«à’«à’«à“¬á•¬á›­̃®̃Ÿ²à ±á ³â¯ß°à¡´âŸ²â£´ă¤µă¨µà©µßªµƯ©µá«ºä§·ä¦·ăœ´ä—¯á—°â—°á˜²ă˜±â™´ä˜°á´ä—°â—²ă˜³ä³ă›²ăœ¶ä™´äŸµä¶ä´äŸ¶ä¶å ¸å¡¸ä ¸æŸ·å¡¹å ¸ä¢¹å¤»æ ¸åŸ¸å¢¹å ºå£»æ¨»æ¡·ä¦½æ£ºåª¼å¤¹ä¥½æ¥¾ç£»æ¦»å¨¾ç«Àç­À毿æ°Àç®Áè³ÁçµÂè¸ĂçµÄç³Âæ·Äç¹Äæ»ÆçºÆçÁÈèÂÉéÆËéÈ̀éÈËçÈËçÇÊçÄÊèÅÊéÇÊèÅÊèÅ̀éÄÈæĂÉçÀÇç¿Çç¾Çç¾Çè¼Çè½ÈéºÆç¼Çç¾Çæ¿ÉéÂÊèÄÊèÁÈçĂËèẰéẰê¿ÊêÁ̀éĂÍéẰéÂËé»ÊéÀÊè¿ÊéÀÍí¹Èè·Êê¶Ăç²Äç¶Åç¶Äç²Äè³Åé±Åè±Åé¶Çê³Åè¹Çè·Äç¶Æê¹Çê¹Èè¹Æç¶Èê®Ăè³Ăç´Æé¹Éê¾Ëê¾ËéÅÎêÅ̀éĂÍê¿ÊéĂÊèÆÉçÅËéÅÇæ¾Åè¿ĂăĂÄäÁÇç¿Äå¿ÄåÅÈæÅÉçÆÊçÉËçÈËçÇÊçÇÊçÇÊçÈÍèÈËçÈÍèÉÏéÉ̀æÊÏæÊÍçÊÍé̀Ïè̀ÎèÎ̉êËÎæÎÎèÑÑéĐÑéÑ̉éÔƠểÔểÔë̉ỚĐÓêÏÓêÏ̉éÍÏé̀̉́̀ÑêÉÍèÉÎéÉÏêÈÎéỂëÈÍèÇḮÀ̀ë»Êë¶Æê´Èê¹ÉéºÉéÁËé»Çæ¾Éé¾ÊëÁÊéÀÉèĂÈåÅËçÅÊçÄÊçÇ̀éÉÍéÈ̀çỀæÇËèÉÎèÊÎéÊÍåÊĐéÍĐèÍÎéÍÏèÏ̉êÍÏéÍÏéË̀ăÏÏæÏÑèÎÏéÎÏèÏÏèËÍèÊÎéÈËæÈÍèÊÍèËĐꫲ۪²ß©³Ư§¯Ü¢¯áŸ­à–¬á”¬á“ª̃¨̃’©̃”ª̃‘©ß•«ß’¬á–­á–¬ß­̃›­ß£°à ±̃ ®̃¢²á³â¤·ă¥¶á¤³â¦µâ§´àª´Ư¬³ß©´â­ºă«¸ä«¹ä¥µá£´ß˜²â–°â˜²ä™³ä™°á˜¯ß²ä˜²ăœ±ßœ³ă›´ă²ăµä³ăŸµä³âŸµă ¶ä ¶ä¡·ä ¹å¸å¶ä£¹å¢·ä¡·ä¤ºå¦ºå ·ä ¸ä§¾æ¥»æ¥½æ¥ºå§»å¤ºä¥¼æ¤ºå¥¼æ¡¼æ¥¾è¦¾ê¨¿è«¾æ¬¿æ®Á篾æ´ÀæµÁæ´Áå·Äç·Åç¶Åè¸Äæ¼Äå¾ÇçÁÈçÁÉéÄÊéÈËçË̀è̀ÎéÈÍéÇËèÈ̀éÇËçÆÊèÈËèÆ̀éÄÉäÂÈæÅÊêĂÉèÆËèĂÊèÅÊèÅËèÂÈç¿Èé½ÇçÂÉçẰêÄ̀éÄÊèÄÍéÅÎêĂËêÅËèÅÎêÄÏèÆ̀èÆÍèÁÉåÆÏíẰêÄÍé½ËéºËêºÊê¾̀êºÈé¹Æç·Æè¸Çç°Äè²Äè³ḈµÆê¹Èè¸Åç½Éè¹Æè¹Èé·Æè³ÇêµÉë±Æê³Çë¹ÇéÅÏëÂËéÆÎêÈÏêÅÍéÊÏéÈÏëÆËéÄÉçÆÉçÀÅæÄÇæÂÅåĂÆåÁÆæÆÈäÄÉæĂÈäÆÉæÉ̀èÈ̀èÈËèÉ̀æÈ̀çÇÊçÈ̀èÉËåÉÍçÉÏèËÏèÈ̀èÍÎè̀Îæ̀ÏèÍÏéÍĐèÑÓêÑÔêÑ̉èĐĐèÑ̉éÔÖë̉ÓéÓÔêÓƠëÑÑèĐÑéÏĐéĐÔëËÏé̀ÎéËÎæÉĐéÉÎéÉÎéÇÎéÄÎëºÈè¼Ëë´Åè·Æè¶ÇèµÅèÁËé¾Èæ¼Èç¿Êé¾ÈèĂËèÀÈèÄÊèÆÊçÆÉâÆÊæÅËèÅÉåÈÎéÉÍèÉ̀æÉÎèÊÍç̀ÏéÍÎåË̀ăÍÏèÎĐéÍÏèĐÑéÎÏèÎÑé̀Ïæ̀ÏéÊËä̀̀æÍÏæÉ̀èÉÍçÉÍæ̀ÎæÊÎ魵వƯª±Û­µ̃¦³à¦¯Ü£°à—«Ư“ª̃•ª̃–¬à”ªà”ªß˜­á°áœ²á±âŸ³à¡²ß¨³ß¨²Û¦³à¦°ß¥²ß§µà©¶â¯ºă«¸ă«³̃©¶â°ºă«¶á«¶â²¹ă³»äª¸â©¹ă£·ă²á›³ă™±ă³ă™±â›²ă±áµä³ă›´äœ´äŸµä´ăŸ´ä£µá´ăŸ¶ă¢·ä ·äŸ¶å¤»æ ºæ¦»å¥ºä¥»æ ·ä¤¹å¦¼æ¢¸ä¦¹ä ¹ç¤½ç¦»å¢ºå¥½æ¥½ç£ºå£½æ¥¼æ§¿ç¥»æ§½æ¨À驾æ­Áç±Áç¶Âç²Ăç´Ăé´Áæ·Äç¸Åæ¹ÄäÅÊèÂÈçÀÉèÄËèÈÊçÉÍéÈ̀éÉËçỀçÍĐéËÎé̀̀æỀåÇËèÇÊç̀ÏéỀèÈ̀èÇÉçÄÉçÇÉçÇÊçÈÎéÇÊçÀÈçÄËéÅËçÄÍëÈÎêÅÊçÈ̀èÆËçÇÏëÆÍéÈĐéÇÏêẰéÈÎéÇ̀çÈÍèÈÍèÈÍéÆÎêÂÍêÁËéÂḮºÈéºÈèºÊé¹Éç¼ÉéµÆè·Æè·Æé¸Çè¸Åè½Êé»ÆçºÊé¹Éé¹Éé°ÀäµÆè¹Éë¼ÊëÉĐ́ÈÏéÇÑëÉĐêË̉ëĐÑéÎÏèÉ̀èÅÉçÇËçÆÈæÇÉçÂÅåÅÈæÂÆæÄÇåÂÈæÆÉäÇÊçÇÊçÈ̀èÅ̀éÉÏèÉÍèÈËç̀ÎèÊÍéÊÎçÎÑç̀ÏèÍĐéËÍèÏ̉ềĐéÎÑéÏ̉ểÔêÑÓểÓçÓÔéÓƠêÖÖë×ÖêƠÖêØØëÖÖêÑÔểÔêÑÓêÏĐéÏ̉êÊĐéÍÓêÊÏéËÑêÄÎêÆÏêÀ̀ê»Ëé¼̀ê»Êé¼̀ê¼ËéÁËèÄÍêÀ̀éÁËéÀËêÂÉçÂÈçẦéÄ̀éÄÊçÇ̀èÇ̀æÇÊæÇÍéÈÍèÊĐèÉÍæ̀ÎéÍÑéËÍæÎÑèÏ̉êĐÑéÏÑéÑÓéĐÑéÎÏéÏĐè̉ÓéỀå̀ÍæÑ̉éËÍèËĐêËÎè̀ÎçÍÎ浺ⰵ̃²µƯ³¶Ư«³̃®µ̃­µà¦±ßŸ±á²á¡²á¤±á¢°̃¡¯à¤´â§´ß§²ß§¶ă«·àª¶á¯·à«¹ă­¹ă¯¸á¬·à¯·à¯·á±¹á±ºă°¹ă°¹âª¹â®ºä²¼ä²ºă¯¹á­¹â­»ä¥¶â¡´â ¶ä›³ăœ²âŸ²â µá´ă¤·ä´ä ·ä¶äœ´ä£¶ă¡¶â¢µâ£·â¡·ä¢¸åŸ¸å¤¹å¤ºæ§»å¢¹å ·ä¢¸å¢ºå¤¼æ¥»æ¦»æ¦»å¦¼æ¤»ç£¼æ¦¼æ¤¼æ¥¼æ¨¿ç¤¾è§½ç¨¾ç§¾ç©Àè©Àè²Åë³Åê³Áç´ÂèµĂç¶Äç¸Åç¸Æè¹ÅéÄÉèÄËéÇÍéÇ̀êÈ̀èÈËé̀ÏêÍÏè̀ÎèÏĐéÍ̀çË̀ç̀ÎèËÎèÊÍèÍÑë̀ÏêËÍçÉËèÉÎéÈ̀èÈÍèÊĐéÉÎéÈÍêÇÍêÆÏëÅËèÈÍêÈÍéÇÍéÆÍéÉÎèÇÍèÊÑêÊÏéÈÍéÊĐêÆÎêÉÑ́ÉÎéÊĐêË̉êÈÎêÇÏëÄḮẦé»Ëé»Ëê·Èé¼ËëºÊê¸ÆèºÈé¸ÈèºÉèÁÍêÀÎë¼Éè¹Èê¼ËêÀËé¿Íë¿ËêÄÏêÉÑêËÑêÎỚÎÑêĐÔí̉ÑéÍÍçÉ̀æÉÍéÆÉåÇÊæÇÊçĂÇæÇËèÆËéÄÊçÇÊçÇÊçÄÉçÆËèÆËèÉÍéÆÎéÈ̀èËÎéÏĐé̀ÎèÎÑèÏ̉éÍÏéĐÓêÏÑé̉̉éÏĐéĐÑéÓÔêÔÔéƠÖëÔƠêÔÔëÖ×ë××ëØ×ê××ëÛÙëÖƠèÓƠéÔÖëÓƠểÔêÏÓêĐ̉êÍÑéÏÓêÍÑêÇĐêÇÏêÅḮ¿̀êÁÎê¿ÈèÂÎêÅÍéÉÏéÆÏê¾Íê¼Éè¾Ëé¾ÇåÂÊçĂÊèÁÉèÄÊèÆÍèÈ̀æÆÍéÈÏéÈ̀èÊÑêÊÎéÍÏèÎĐèÏÓëÏ̉êÏĐçÓƠêÑ̉êĐÑçÓÓéÑÓêÍĐéÏĐçÍÏèÍĐéĐÑéËÏèËÏéÏĐèÏ̉ềÏ赸߱³Ü´µƯµ¸ß´·̃¶»á²¸â­·ă®¶á®¶á¨´à¨±Û¨´à©³ß©²ßª´à¨¶â«¸ă¬´ß®·á²¶̃°¸à­¶à¯·â°µà­·á°¹â±·à°¹á¯ºä°ºă¬¶ß¯¹â±ºá±ºă²ºăµºă®¹ă§¹ä¨¶á¤¶â³ă³â µä³â±ă¢·ä¢¶ä´ă¤¸äµä¤¸ä£¶â¡´áŸ·ä¢·ä§ºå¥ºä¡ºå¡¸å¤¸ä¡¸å¤¹å ·ä¤ºå¢·ä£¸å£¸ä¦¼æ£¼æ£¹å¢ºå¦¹ä¤ºå§½æ¤½ç©¿æ¤ºå¨¿ç§½ç¨½ç«¿ç¯Ăê²Ăê±Áç´Âç²ÂçµÄçµÄé¸Äç¸Æè½Èê¾ÇèÇÊçÉ̀é̀ÏêỀç̀ËæÎÎèÎĐéÍÏé̀ÍèĐĐé̀̀çËËçËÍçÊÍèĐÑéÍÏèÈ̀çÍÏè̀ÎèÍÏèÎÏèÍÎèÊÍè̀ĐêÈ̀éÉÏêÉÏéÈÎéÉÎéÈÏëÈÎêÉÏéÈÍèÉĐêÉÎé̀ÓëÉÏëÊÏêËĐêËĐéÊĐéÎ̉êÊĐêÄḮÆÎêÁËé¿̀éºÈè¾ÍêºÈè¼̀ê»ÉéÀ̀éÁ̀èÇÏêÅÏëĂËè¾ÍëĂÎëÇÏëÉÏêÇĐ́ÈÎéÏÔêÑƠểÔë̉Ôë̉ĐèÍÎèË̀èËÍéËÎèÈ̀èÆÉçÇÊçÈËçÇËéÇÊéÆÈæÇÊçÇËéÇÍéÈ̀èÅËèÆÍéÇÎéÊĐéÊÎéĐ̉éÍĐé̀ÏèÎÑéÏÏèÎĐéÑÑéÏÑéÑÑéÓ̉éÓ̉éÓ̉éÖÖê×ÔéÖÓé×ƠèØ×êÖÖêƠÔêÛØëØØêƠÖểÓêÑƠëÑƠểÓçÑÔëÎÓềĐéËĐêÆ̀éÅÎéÆĐë¿ËéÄÍéÅÏéÆÏéÈÎéÊÑêÈĐêẰéÀÍêÆÎêÁÊèÀÊèĂÊèÄ̀èÈÍéÅÍèÁËèÅ̀èÉÍèÉÍèÉÍèÍĐèÉ̀èËÏéÍÏèÍÎæÎÎåĐÓèÎĐéÏ̉ë̀ÎçÑÑèĐĐèÎĐèÍÎè̀ÏèÍÏæÎĐçÍÎè̀ÍèĐ̉ềÏ鵶Ưµºàµ¶Ưµ¸Üµºâ´·Ư´¹àµ¸à±¸á´¹à²¸á²¸ß°¸à³¸à°·â¯¹ä«¶á°·ß®µß´¹á±¶à´¹á®¶à«µà³ºá¯·ß´ºâ°¹â³ºâµ»ă³»ă´ºâ³ºă³ºă´½ä²¼ä³»ä²¾å°ºă¬¹â©¹ă§¸ä¤¶â¡¶ä ³ă¢·ä¤¶ä¡´ă³ă£¸ä¡¶ä¢·ä¡µäŸ¶ä¥¸ä¦¹ä¤¹ä¥¸ä¢ºæŸ·å§»å¨½æ¡ºæ¤ºä£¹å¦ºå£¹ä¤»æ¦»æ§½ç¤½æ¦»å¨½æ¨½ç¤¼æ¦¿ç¦¿æ¨½æ¥¾ç¥¾çªÁ誾ç«Áê­Àç²Äç³Äè²Äé²Ăè´Ăè³ĂçµĂç¸Çê¼ÇèÇËéÉÍèËÎé̀ÎéÏĐéÏÎçÑĐèÏÎèĐĐéÑÏèÎÍç̀Îè̀ÍèỀèÎÏèÏÏè̀ËæÎÍäÎÏéÎÎèÑÏèÑĐçÎÏèÏÑéÍÏèÊÍæ̀ÏèËÎè̀ÏèÈÎéÈÏéÇÍèÇ̀è̀ÏèËÏçÎÑêÍĐéÎÑéÍĐéÏÑéÍÑé̀ĐéÍĐéÊĐëẰêÅ̀éÅÎêÀËé¾ÉéÀ̀éÆÏêÇÎéÆÍéÇÎéÈĐé̀ĐêÉĐêÈÑêËÑë̀Ñë̀ÑëÍÔí̀ÑêÔƠêÓÔêÓƠêÑ̉êÑĐèÏĐèÍÎèÎÎçËÍèÍÎèÉ̀èËÎç̀ÍæÎÎèËÍèÊÍèÍÎèÎÏéÍÏèÈÍèÇÎéÅ̀èÈ̀èÏ̉éĐĐé̉ÓêÑ̉éÏĐèÓÓêÓƠëÓÔêÔÔêÑ̉é̉̉éÓ̉éÔƠêÔƠêÖƠêÖÔéÖÓè×Öé××ë××êÚØêÓĐäÛÙê×Øë××êƠÔêÔƠêÓƠêÓÓéÓƠêÑÔëÍÑë̀ĐêÉĐêÇÑëÉĐêËÑêË̉êËĐêÍ̉ề̉êÇÎêÄÍéÇÍéÅÍéĂÍéÀËéÅËèÂÊèẰéÂÊçÆ̀èÆÎèÇ̀èÇÍèÊÏéÉÎéÊÎé̀ÑéÎÑéÎĐèÎÑè̀ÑèÏÓêÑÑæÍÏçÏĐæÍÎæÏ̉êÎĐềÏéÎĐèÍÏéÍÎè̀ÏèĐ̉êÍÏ綹߻»Ư¸¸à´¸̃·»̃µ¹ßµ¹ß´µ̃¶»â¶ºàµ¹̃¶¹̃´¹̃³¹ßµ»ăµºáµ¹ß±¹ß´ºáµºà´¶̃µ¹à³¸ß±·ßµºß²¸ß´ºâ¶¼ă´»âµ»ăµ»á¶¼âµ»ă¶½ä·¾äµÀåµ¿å¶¼ă´»ă®ºă®ºăª·ă§·ă¤¸ä¤µă¢´ä¤·ä¡¶ä¢¶ä´ä¢µă¤¸ä¢¶ä¤·ä§¹ä§¹ä£¸ä¥¸ä¤½ç¡»ç¢¼ç¦½æ£»å¦»å§»æ¥¼æ¤ºå¥ºæ¦»å©½æª¾æ£½ç£¼æ©¿ç¤¼ç¨Àç¥Àç§À稾檿ç­Ăè«Àç«Àç­Âç²ÄéµĂç´Ăè°Âè´Ăè´Åè·Æé·Åè¼ÆçÇÍêÄËçÉËçÍÍçĐÑéÎÏèÍÏèÍĐêÏÎè̉̉êÏÎè̀̀çÎÎèĐÎæÎÍæÍÍèĐĐèÎÎç̉̉éÎÎçÏÍåĐÑéÑÑéÏÏéĐ̉éĐĐèÎÏèÑÓéÏÑéËĐéÇÍéÇÎéÊÏéÊÎéÉĐéËĐëÍÏèÎ̉ềÏéÏÑêÎÑềĐéËÑêÊĐêÆÏêÇÑ́ÆÍêÄÍéÄÎ́ÈĐëÇÎéÉĐêËÑêỂềÓ́ĐÓëÏ̉éÑÓêÎ̉ëĐÑéÑÑèÔƠëÑÖ́ÓÔêƠÖ́××́ƠƠëÓÔêĐ̉éÑÏèÑÏèÏÏèÎÎèÑÑèÑÑéÑÑè̉ÓéÏÑéĐÏé̀ÎèÍÎèÑÔềÏéÊÏéÉĐéÍ̉êÑÔêÔÓể̉êÓÔểÔéÔƠêÓÓéÔƠêÔÔêÔƠêÓÓêÓÓéÔÓê×Öê×Öê×ÖêÖÖêÛ×ëƠÓéÔƠêÙØê×ÖéØÖêƠƠêØ×êÓÔêÓÓé̉ÓèÔÖëÓÓéÑÑêÏ̉êÍỐĐÖ́ÎÓêĐÔêÑÔëÎ̉êĐÔëÍÑéÏÓëËĐéÊÑëÈÍèÊÑëÅ̀éẰéÇ̀èÆÍèÅÎéÇÍéÈËèÄ̀éÆÍéÆÍéÉÏéËĐèÊÎæÉÍçÊĐéËÏé̀ÑêÎ̉êÎÏæÏÏåÍĐèÍÏèĐ̉êÎÑèÏÑçÍÏéÎĐéÏĐé̀ÎèÍÏèÏ̉êÏÏ縺Ưµ¸Ư¹·Ü´µÚ·»á¸ºßµ¹ß¶ºà¸ºƯ¸ºƯº»Ư¶¸̃´¶Ư´·Ư´·̃µ»â³»â³¹ßµºâµºáµ¸Üµ¹ß²¶̃¶¸̃´ºá´¹̃µºá·¼ăµ»âµ¹à¶¼ă¹À䶾䶼â¹Àä»Àă·¿ä¶¾å´»ä«ºä¯¹ă®¹ă¬¹ă¬¶à§²à£µă¢¶ä¡¶â¥¸ä¡²â ²á¡¸äŸ¶ä¦¸ä£·ä ·ä¤·ä£ºæ¥À裼礼碽礹婽格楽䤻婽礼槹⦻娽祺娾禼檾槿ç©Àç«À窾æ«Áè­Ăé¬Áè«Áè²Ăé·Âæ¶Ăç²Ăè´Äç¸Äç¶Åê»Èê½ÆçÅÊèÇ̀êÉÎéÊÍèÍÏèÊÎéÎÎèÏÎèÎÍéÑÎèÎĐéËÍèÎÏèĐĐæÍÍäÑĐèÓÑèĐÏèÑÎç̉̉èÑÑçÓÑéÓ̉éĐÑéĐÑé̉ĐèÏÏæĐ̉êÎĐé̀ĐéÈÎêÆÍéÆÍèÆ̀éÉÎéÊÎêÊÎé̀ÏéÎ̉ëÎÑë̀ĐềÏéÍĐéËÑêÊÏéÉÎèÊĐéÊĐêÉÎêÍ̉ëÎ̉ềÑêĐÔëÏĐè̉̉éÔÔêÔÔêÔÔé̉ÓểÓêÑÔểÑèÓÖ́ÔÓêÓ̉éÖÙíỔéÓÓêÖ×ëÓƠêÏÑé̀ÍçÏÍçÓÑèÔÔêÓ̉éÔÔểÓé̉̉éÑ̉éÓ̉éÏÓ́ÍÏéÊÎé̀ÑêÔÖêƠÖêÔÖëÔƠêÔƠêÓƠêÓÓéÓÔêÔÔéƠ×ëÓÓçƠÓèØÖêÖÖêÚ×ëỞèƠƠêƠ×ë×ÖêƠÓê×ÓèÖÖéØØëØÖêÔÔêƠÖê××ëÖƠêƠ×ëƠ×ëƠÖêÑÓểÓêÔÔểÔêÎÏèÑÓêÏÔëÎ̉êÏÓêÎÑéĐ̉êĐÓêËĐéÈÎèÊĐêÇ̀èÆ̀èÇÍéÅÍèÇÎéÂËéÇ̀èẰéÄÍéÅËæÈ̀èÉÎéÊĐæÉÍæÉÎçÉĐêËÑëËÎéĐÓêËĐéÍÏéÍÎéÏ̉è̀ÍçÎÏèÎĐéÍÎçÎÎçÎÎèÍĐé̀ĐéÍĐ鵺ཻٶºà¸¹Ü·¹Ưº»ß¹»á¸ºß¶¸ßº¹Ü¹»ßµºá¶ºá¹ºƯ¸ºà¸»âµºà·¹̃¶¸à¸»à¶¹Ưµ¹Ư´¸ßµ·ß´ºà¶»á·½âµ»á¸¾ăº»à¾¿ä¹¼â¾½ßº¾ä·¿ä¹Àä·¿å¶¾æ°¸á°ºâ­¸ă°¹á¬¸â±¹ă¨¸ä«¸ăª¹ä¨¸ă§µä£·ä ¶ă¦¹ä£¸ä¤´ă¤·ăŸ´â¥¹ä¦¹å£¸ä¨½æ¦¾ç§À馻梸壽樿橽橽楼橽槾窽æ«Àè®Áç¬Áç©À竿窿穿ç«Áè«Áé«¿ç§Àç«Âè²Äé´ÄéµÆéºÅå¹Æç¸Åê¸ĂçºÈé¼ÈéĂÉéÇËéÆËëÉÎéË̀ç̀ÍèÎÑêÍÍçÎÍçĐĐéĐĐéĐĐçĐĐæĐĐèÎÎç̉ÑèĐÏå̉̉éÑĐç̉ĐèÓÑé̉ÑèÓÑéÓÓé̉Ñé̉ÓêÓÔé̉̉éÎÑềĐêÊÎèÇÍéÇĐêÉĐêÉÏêÉĐêÍĐềÏèÏÓ́̀ĐêËÏêÏ̉éËÎèĐÔêËĐêÈÎéÊĐêĐÔëÏĐèĐ̉é̉ÔêÓÔêÓÓêÔÔêÖÖëÓÔéƠÔêÖƠéÔÖëÓ̉éÔØíÓÓéÓÔêØÖêÖÖêØØëÚ×ë××ëÚÖê×ÖëÓÖë̉ÔêÑĐèÓÔêÔÔéƠƠêØÖêÙØëÔÖêÓÔêÓÓêÓƠểÔêÑÓêĐ̉êÓÔêÖ×ëØØë×Ù́Ø×ê××ëƠ×ëÚØêØ×êÖÖëÙÙ́Ù×ë×ÔéØƠçÔƠëÔÓçƠÓèƠÔéÖƠêÖƠêỔèÚ×éØ×ëÔƠêØÙëØÖêÙÙë×ÖêÔÔé××êÔÖêÔÖëÔÔêÓÔểÔêÑƠêÓƠểÔêĐÓêÓÖ́ÏÔëÓÖëÑÖëÎÓềÑềĐêÈÎèËĐçÆÎéÅÍçÄÍéÄÊåÄ̀éĂËéÄÍéĂÍèĂËèÅÍêÆÎéÇ̀èÉÎéÉÍéËÑë̀ÍèÏĐéÎÑéÊÍèËÏéÊĐéÎÔềÎèÍÑềÑềĐéÎÑêÊÍè̀ÑéËÏ軸ںºƯ·ºƯµºâ¸¸Ù¾»Ü·»ă¹»̃¸·Û·»á¸¼ăµºá¸»â»¼áº¼ăº½ä»»Ư·¸Û¶ºà»¼ß¶ºßµ¹ßµ¹àµºà¸¼á¸ºƯº¾â¾»Ưº¾ăº¾â¼½â·½ă½¾â¼¾ă½Àă·¾ă¸¾ä·¼ä³ºă°·à³ºă±»ă°¹â°ºă®¸ă®ºă¯¸à¯·àª¶áªºä¦¸ä£µă§¹ä¦¸ä¡·ă¤¶â§¹ă¤¹å§¼æ§»å¦¾æ«¿ç¨»å¨»å¦»æª¿æ¥ºåª¿ç§¿ç§¾æª½å©¿è¦¿èªÀ窾æªÀç¬Âè¬Â觿ç«Áé¬Âè¬Áç«Âè®Ăè±Äè´Äè¶ÆéºÈ́¸Åé¹Æé¶Ăç¹ÈêºÆè½ÇèÄÉçÄÉçÅÊçÇÊçỀç̀ÏéË̀çËÍèÎĐèÑ̉éÑÏçÑÎçÑ̉éĐĐéĐÏçĐÍäÓÓé̉Ñè̉̉èỔé̉ĐèÓÑèÑÏèÔÔêÓ̉é̉Ñè̉̉èÏÏèÑÑéÍĐè̀Ïç̀ĐéÉÎéÈÎéÊĐëÉÍèÊÏêÉÏë̀̉êÊÏéÍĐéÍÑéÎÑéÊÏéÉÑêÊÎéÏ̉ểÓéÑÓêÔƠêÔƠëỔéÓÓéÙƠéÛ×êÙ×êÖÔéƠÔêÓƠë̉ÔëÔÔéØ×êƠÖê×ØëØÖêÚØëØ×́Ø×ëÖÖ́ÔÔêÔÔêÓƠëÓÓéÙ×êÚ×êÚÖéÙƠêƠÖë××ëÔƠëƠÖëÓ̉éƠÔéÖ×êÖ×ëØØëƯØêÙ×êÖǾÚÖçƠÔéÙ×êØ×ë××ë×ƠêÖÙíÖÖêØÖêỞèƠÓêƠÔé̉Ñè̉Đè̉ÑèÑÏè×ÖéÖƠç×ƠéÔÓçÔÓéƠÖêƠƠêƠÔêÔÓéÓÔêÓƠểÔêÎ̉çĐÔêĐÔëÑÔêÑÓêĐÔëÑ̉êĐÓêÏÓêÑÔêÎƠëËĐéÊÏé̀ÑêÊĐêÇÎéÅÍéÁÊçÂÉçÂÉç¿ÉçẦéÁÊè¿ÉèÆ̀èÄ̀èÄÎêÈÍèÇËèÆËèÍÏèÊÏéÎÑéËÍèËĐçËÎçÎ̉ềĐéËÏéÍ̉ëÉÎéÎÑçÍĐè̀ĐæÊÏ涸Ư·¸Ư¹¸Úµ¶Ú¼¹̃·¹àººß¹»á»¼à·ºƯ¸ºß¶¹à¹»â»»ß·»â·»á¹»ß¹º̃·¸Ư¸¼ăµºßµ·Ü´·̃¶ºß¶ºà¶ºà»½â¼½̃¼¾â½¿â»¿âº¿ă¸ºá¹¼á½¿à·¿äµ»ăµ»ă´»ă´¸à°·à³»ä³ºă³¸à­·â­¶â¯·à¯¹á¬¶̃ª¹ăª¸ä¦µăª¶ă©¹ä¦¹ä¨¹ä¦¸â¥¸ä¥¹å¦ºå§»å§¹ä¥¸ä¦·â¥»å¥»æ§½æ©Â褼橿秽æ¨Àç¬Áè«Á窿ç«Áè«Áè¬Âç«Áè«Áç¬Áè°Âç±Äê®Âç²Äè±Âè·Æé¶Äè¶Âç¹Æè¸Æé·ÅèºÈê¾Éë¿ÉéÆÊèÅÊèÈ̀èÉÎêÊÍèËËèÍÏêÏĐèĐĐéÏÏæÑĐè̉Ñè̉ÑèĐÎèĐĐéÔÔé̉ĐèÔÑæ×̉è̉ÑæỞèÓ̉éÔÓéÔÔêÓÓêÑÑéÓ̉éÔÔêĐĐéĐ̉é̀ĐéÍÑêÊÑêÊÏêÊĐëËĐéÉÎéÉĐéỂêÉÎéËÎè̀Ñề̉ëÍÑêÑÓéÏÑé̉ÑéĐÑéƠƠê××ëÛ×êØÔéÛÖêÓÓêÙÖêÙÖêÚƠéÓÖ́××ëÓÔëÙ×ê×ÙíÛÚëÙØëÜ×éÚÙ́ÚÖêÖØíÖƠêÓÔêƠƠêƠÔéÛØëÛØêÚÙëÙ×ëÚÙ́ØÚíÚǾ×ƠêƠÖêØØëÖØëÙ×êÜÙêßÛ́ƯÛ́ÛÚ́ÛØêØÖêØÖêÚÙëÖÖëÙ×ë×Öê×ƠéÖÔéƠƠêƠÔéØƠêỔèÓ̉èÓ̉éƠÓéÓÓéÔÑå×ÖêƠÓèƠÔêÖƠểÓêƠ×́ƠÓèÔÖêƠƠêÑÓểÓéĐÑèĐ̉éÍÑéÍÑêÏÏèÏÑéĐÓêÏÓêÑƠëĐƠêËĐé̀ÑêÈÎéÉÎéÉÍèÄ̀éÄËèĂÊèÄ̀çẦè¿ËéÅÎêÄÍéÄÍéÆÍéĂËéÆĐêÂÍêÇ̀èÉÍèÉÎéÊĐêÊÎæÊÏè̀ÏéÍĐéÍĐéÊÏéÎĐèÉÏé̀ÏéÊĐéÊÏéÉÎé´·Ư¶´Ü¹¸Ư¶ºà¹»ßº¼à··ß¶¹à¸»à¹¸Ư··̃µ¸á¶ºàµ¶Ư¸»á¸»á¸¹ƯººƯº»à·¸̃´¹à·µƯµ·Ü·¹Ư¶¹ßµ¹ß»½â¼¼̃¼½Ưº¼àº½à¼¾à¹¾â¸»à¼¿ă¹½à´¸̃·»â²ºă²ºá«µß³ºă°»ă²ºâ©´à«¸â«¸ä°´̃­µà¬·â­´à«³à­·â­¶áª¶â«¹â¨¹ä§¹ä¦¹ä¨¼æ§¹ä§¹ä§¹ä§ºå¨»å¨¼å©¼å¨¾æ¦¼æ©¾æ§½æ¬Á觾è«Áè«Âè¬Ăë­Ăê¬Âé¬Ăê¬Âè­Ăé°Äé¯Ăé­Ăé±Ăç³Äè¶Æê³ÅêµÆë·Ăè¸ÄèµÅè¸ÆèºÇé¼ÈéẰêÂÊèĂÊéÈÍêÈÍéÇËéËÏéËÏéĐ̉ëÑĐéÑĐé̉̉éĐÏè̉ĐçĐĐæÓ̉éÓÓé̉ĐçƠÓéƠƠêÖÔéÖÓéÖÓé̉ÑéÓÔé̉ÑèÔÔêÔÓể̉êÑ̉éĐĐèÎĐéÏÑêÍÓíÈÏëÊÏéÉÎéÉĐéÉÏéÊÑëÊĐêÍ̉êËĐêÏÑêĐƠëÑÓêÓỐÑÓêÖǾ×ÔéÙÖêÖ×ëÙÖêƠÖëÛÙëØ×ëØƠéƠØëØ×ë×ÖëÚǾÖ×íÚÙ́ÙØêÛ×êÙ×êÛÚëØÖêƠÔéØÖêÙ×ê×ƠéÙ×êÙØëØ×ëÙÙ́ÚÙ́××́ÙÚíØÙí××ëÛÚëƯÚëÙ×êàÛëÚǾÜÚ́̃ǗÙǾÚ×êØƠéØÖêÖƠêØÖêÚØëØØëÙ×êØƠêÖƠêỔè×ƠéỔèÓÑèÖÔçÓÔé̉ĐéÓÓêỔç̉ÑæØÔéÓ̉é̉ÑèÔÔêÓÔéĐÑéÎĐéÍĐéÑÓéÎĐéĐ̉éÍÏèÍĐéÍĐéÎĐéÎÓëËĐêĐÓêÏÓềÑêÈ̉ëÇÎéĂËèẰéÁÍêÂËèẦéÂÊèÀÊéĂÎêẦêÁÍêĂÎêÁÍêẰéĂÍéÅÍéÅÍéÈÎèỂëÈ̀æÉÏéÊĐềĐéÍÑềĐéÊÍèÉÏéÊÎéÊÏéËÏéËÎ赶ܵ±×·º̃¸¸Ú¸¶Øµ·Ü¶ºàººÛµ¹Ư¶·Ư´·̃³´Ü¸·Ùµ¸ßµºß¸ºƯµ¶Ư¶ºà»¼̃¹¹ÜººƯµºâµ¸ß´µÚµ¸Ư¶¹Ư»¼ß¼¿ä¹º̃·¼à¶ºßµ¹̃·»à·ºß¶»á·»à´ºà³¹à±¸â±·̃®µƯ±·à¯¹á°µ̃§²̃¬¶ß­µß«³Ư©³Ư¯µƯ¬´̃©±ßª·â©´Ư­µà®¶à¨¸ä§ºä¨¹ä§¹ä§¹ä§¹ä¨¹äªºä§»å§ºä¨»å¨»å¨»å­À秽橽檿è«Àç©Âè«Ăè­Ăê­Äê¯Ăè¬Ăê­Ăè°Æë®Ăé°Æë±Äé°Äé´Äè¸Çë³Âç³ÅéµÄè¶Åè·Æé»Çè»ÇèÁÉê¾ÇçĂÉèÄÍëÉÍéÇËèÉÏềĐề̀æĐĐèÑĐèÓÑèÏÍçÑĐè̉ÑèÓ̉êÑĐæÑÑæÖƠé̉ÑæÖÓçỞæ×ÓéƠÑèƠÓéÓÓêÓÓéÓÓé̉ÑéÑĐèĐ̉é̉ÓéÍÏé̀̉́ÊÎéÉĐêÈÍèÊÏêÈÎêÉ̉ëËĐé̀̉ềÑë̀Ïé̉ÖëÎ̉êÏÑéĐĐèƠƠểÔëÖ×ëÓÔëÚØëƠÔêÚØëØÔéƠÓéØ×êÔÖëƠǾØƠéØƠêÛ×êÛØëØ×ëÙ×êÙÙëÚÖéØÖêÙƠê××ëÙ×êØØëÚØë×ƠêØØíÚ×ê×ƠêÙÚíƠØíØÖêÜØêÜÚ́ÛØễÚëÙØë̃ÙêÛÚ́ÚØëÛÖêƠƠêÚÙ́ÙÖê×ÔéÛ×êÜ×êØƠêƠƠêỔéÑÑçÑÑè̉ĐèƠÑèÖ̉èỞçÑÑæÑÑåỔåÔÔéÓ̉èÓ̉èÓÓéÓÑé̉ÑèÎÎçÏÓêÏÑçÑÓé̀ÎèÎ̉êÊÎéÍÑéËÍèÍÏè̀ÑêÍÓêÎÖ́ÎỐÊÏéÊĐêÈÏéÅ̀èÆÍèÀËè¾ÉèÀÉè½ËéÁ̀ê¾ÊêÀËéĂÍêÁ̀é¼̀êÁËéÂḮ¾ËéÄÍéÇÎêÄÏêÄÍêÄÎêÈĐêËĐéËĐéÊÏéÉÎéÊĐêÈÍéÈ̀èÈÎèÇÎé´´Ú´¶Ư·¹Ü¸º̃¸¶Úº·Ú¶¸Ư¸¹Ü¹·Ù¸¹̃¸¸Û²¶̃´¸̃´¶ß¸¸Ü¹»à··Ü·»àºº̃¶¹Ư¶¹ß´·ß´¸ß³¶̃µ¸Ưµ¹̃·»â¸»à¸º̃º¼̃¶ºßµºàº¼á·»áµ¹̃¶¸Ư´µÛ­¶à®¹ăµºâ±¸ß°µß­³̃¯µß®¶à¬´ß­´Ư¬´ß¨²̃­´̃­µàª´à©µß«³̃¬´à¨²̃¨¸ă¦¶áª¹ă¨¹ä©ºä¬ºä§¹äª½å¨»å¨ºä¨ºä©¾ç­Ăê«Á觽æ«Àç«Áè«Áé­Ăë«Áè¬Äë¬Ăé°Ăé°Âé±Äé±Åê³Åê°Ǽ±Åê­Âé³Åé³Äê²Áè¸Æé´Åê·Çë·Æé¹Èé¸Æé»ÇèÀÇçÁÊéÀ̀́Æ̀êÈÏëỀè̀ÎèÊÏé̀ÏèĐÏçÓĐè̉ÔêĐĐèÔÓé̉ÓéƠÓèÖ̉è×ÔêƠÑæ×Óè×ÔèÖ̉èƠÑèÓÑèÓ̉ç××ểÓêÑĐèĐÑéÓ̉éÑÔêÎÑềÑêËÑëÉĐëÉÏé̀̉ëËĐé̀̉ëÍÓ́ÉÑëÎƠíÏĐéÎ̉êÏ̉êÑ̉é̉̉é××ê×ÔêÖ×́ƠƠêØØëÖÙíÙ×êÛƠéÙØêÔƠêÙÖêÖÖëÙÖéÛÙëÔ×íƯÚëÛÛí×ÔéÜ×êÚÙ́ØÖêÙÖêØƠéØÖê××ëÜÙëÙØëƠÖê×ƠêØ×ëÙǾÙÚ́ÚÚ́ÜØêÜÙëßÚëÜÙễÚëßÛ́ÚƠèÛ×éÚƠçØÖéÙÔç×ƠéØÖêÛØêÚƠé×Öê×ÔéÖƠéÑÑæÓÓèÓÑè̉ÑçÓ̉èÔĐåÑÎæƠÔéÔĐèÓ̉é̉ÑéĐÏç̉̉éĐĐæĐÑèĐÏæÍÎçĐÑè̀ÏéÍÏèĐÓèÎĐè̀ÏéÊÏè̀ĐèÍ̉êÍ̉ëÎÓíËÑêÉÎéÊĐêÇÏéÆÏêÆÎéÆĐê½Êè¿̀é¿Îë½Ëé»Éê½ÍêÀÏë¿Íê¾Ëé¾̀é¼ËêÀËéẦé¿ËêÁÎêĂÎêÄÍéÇĐêÉÎèËÏêÈÎéÉÎéÈÏéÊÑêÈÎéÉÏêÉĐ겲ش´Ù¶¶Ü³·ßµµÜ¶¸Ü¸¹Ư·µÜµ¸Ưµ·ƯµµÛµºßµ¸Ư´µÜ¶¹̃·ºà¸¹Ư¹»ß¸¸Û´´Üµ¹ßµ¸ß³¶Ư±´Ü´¶Ưµ¶Û¶ºßµ¹Ư¶¹̃¸ºƯ¹ºß¶¶Ü´¸̃³·Ư¯³Ü°´Ư²²Ú²·à¯·ß¯·à­³Ư®¶ß¬°Ú®´Ư®´ßª³̃¬´ßª³á¨¯Ư©®Ü§±̃©´̃«¶àª³ßª²̃©µ̃«µß¦·â§¹ä§¸ä©»å¨ºä©»å§¹ăªºă«ºäª¼å©½ç¨ºåªÀçªÀç¬Âè¬Àç«Áè¬Äë¬Âé®Áé­Âè®Áæ²Äè²Äê¶ÆèµÆé³Åè²Åé²Äé¶Æê´Åé³Âæ´Âè¶Äé¸Æé·Çë¹Çë¸ÆèºÉë½Éê¿ÉêẦêÁÍëÄËéÇËèÊÏéËÎéÊÎèĐĐé̉ÓêĐÑé̉Đè̉̉éƠÓç̉ÏæÖ̉èÔĐåÖÓéÔÑèÙ×êƠƠéÖ̉æƠÓéÔÓèỔè̉Ñé̉̉é̉ÓéÓÓé̉ÔêÏÏè̀ÏéÏÔëÊÏêÊÑêÊĐëÉÎêÍ̉́ËÏêË̉ëÍ̉ëÍĐéÎÑêÏÏèÑ̉é̉ÓêƠÖêÓÓêƠÔêÖÖëÖÔéØ×ê×Ơê××ëƠƠéÚÖçÜÙëÜ×ê×ØëØØëØÖêØÛîÛÙëÙÖêÚØëÙ×ê×Öê×Öê×ÔéÖ×êÖÔé××ë××ëÖƠêØØëØ×ëØÖëÚØëÚØëÜÙë̃Úë̃ÚëƯÙêàÛëÜØëÚƠçƯÙéÚØê×ƠêÛØé××ëÖØë×ÔéØÔé××ë×ÔéÓĐæÑÑèỔæ̉ÑçÑĐæĐÎåÏÎăÏÎä̉Đé̉ÏèÑÎçÏÎåÎĐç̉ÑéÍÍåÊÍæ̀ĐéÉÎèÊÍæÍĐèÍĐçÎĐé̀Îç̀ÑềĐéÉ̀åÑÖ́ÍÓ́̀Ó́ÎÓ́Ë̉êỂëÉÏéÇÏéÄÏê¾ËéÀ̀é»Ëé»Ëë»Ëê»Ëé½Îë½̀ë½Îê»Ëêº̀êºËê¿ÎêÀÎ́½ÍëÂÎêÂÎéÁÏëÅÏêÆĐêÆÍéÇÏêÉĐëÇÏéÊÏêÇÎêÉÑ́ÇÎé±³Ù³²Ø´´Ú³²Ú´´Ü´´Ú·¹̃¹»̃¸¶Ø¶·Ưµ¶Ư´µÛ´¶̃µµƯµ¹ß´¹ßµ¸à¸º̃¸º̃µ·̃´µƯµ¹à²·ß´¸̃µ¸̃²¸Ư´¶Ü¯µ̃³·ß´¹à²¶̃²´Û³¸̃®²Û®´Ü«²Üª²Ü°¶̃¯²Ü±¶ß©²Ư­³Üª²Ü©±Û¬²Û¬²̃¥­Ü¦³ß¬²̃ª°̃©­×¨±̃®³Ü©³Ư¯µ̃¨³̃«¶à«¶àª¸â¦·ä©¸ä©¹ä«ºä«¼å¬»ä«ºä§ºä¨¼æ©¼æ«½æ­¿æ¬Áç­Âè¬Ăé¯Âç°Äê¯Âé®Âç¯Åê°Äé´Äê²Æé´Æé´Æê²Åé²Äè³Æë·Çë¶Äæ´ÄçµÄè¹ÇéµÄç¶Æê·ÉëºÈé»Ë́À̀ê¿Î́ÁÍëÆÍëÈÍèÉĐ́̀Ïé̀ĐêĐĐè̉̉éÑÑéÑ̉é̉ÑèÔÓç×ƠêÔÔéƠÔèƠƠéÓ̉éÖÖêỞéÔĐçÖÔçÑ̉èÖÓæƠÔé̉ÑèÔÓéÑ̉êÑĐéÔÔêÏ̉êĐÔëÍÑêÍĐêÎỚỂí̀ÓëÈÎëËÏéÍÑéÏÓêÎÓêËÏèÎÑéÑÔëÓÓéÓÓê×ƠêÖÓéØÖêØØëÖ×ëƯØêƠƠëƠǾÖƠêÙÙ́Ơ×́ÙƠêÛØêÚÚ́Ö×ëÚÖéÙ×ëÙǾÚØêØ×ëÛØëÖ×ëÖÖêÖÖê××ë×ÚîƠÖê×Ù́ØǾÜÚëØ×ëÚØëƯÛ́ÜÚëÛÛ́ÛÛîÜÙêßÛëÜØêÚØêØǾÛØêÙ×ëÛØêØƠéÙ×êÓÔéƠÓéÓÑèƠÑçÓÑé̉Ñé̉Đè̉ĐèĐÍåĐÍäĐÎèÏÍçÎÎèÍÎèÎÎèĐÏèÍÎçÎÎäÎÎè̀ÏèËÎæÎĐçÎ̉êËĐêËÏçÊÏè̀ÑêỂëÊÑëÊÑ́ÍỚËÓíËÓ́ÉÑêÇĐêÆÏêẦèÁ̀é¿Íê»̀ê¼Îë¼Íë¼̀́¼Í́»ÍëºÊé»Ëê¼Îë¼Í́½Đ́ÀḮÁÎëÄ̉ë¿ÍëÇ̉íÄÏëÈÑêÊĐêÉ̉ëÉĐëÊĐéÊÑëÊÑêỂëËÑ꯱ٯ°×°µÛµµÚ²¶Ư³³Ù·¹̃¸ºÜ³´Û²¶̃´¶Ü²³Ú³³Û³·ßµ·Üµ·̃µ¸̃¶¸Ưµ¶Üµ·Ü³³Û²´Û¬°Ú¬°Ù°²Û±µÜ³µƯ®±Ú­²Ú°±Ù«°Ú«´ß±¸ß«®Ø¬²Û®´Ü­³Ư­²Ü¯³Û«¯Ü©±Ư«°Ûª°Ú¬±Û§­Ø§®Û§®Ú§¯Ú¨±Ưª°Ûª®Ùª²Ü¨°Üª´̃¨²Ü©²Ư¨¶â§²ß«·à¨¹ä§¸ä§·à§¹äª½æ©¹ä¬ºä«ºäª¹ăªºä©ºå©½æ­Áç¬Àç¯Äé­Âé²Äé¬Ăè¬Áç²Âç¯Áè±Åê°Ăè³Ăè¶Æé³Åè·Åè³Äç¶Åç´Ăç¶Äè¹Åë¸Çë¶ÄçµÅè¶Çé¹Çé¹ÉéºËë»ËëẦêÇÎêÇËéÉÏéÊÏêÍÍéÍĐêÑ̉éÑĐèÑ̉éÑÑéƠ×́ÑÑæƠÔç×ƠéỔèÖÔéƠÑèÔÑèÖ̉æØÖêÔÑæØÔéÑĐç̉̉è̉ÏèÓÓé̉ÑçÓÔé̉ÔëĐÓëÎÓêÏÓêÍÓ́Ë̉́ÊĐëËĐéÉĐë̀Ó́Í̉êÏ̉é̀ĐèÎÔë̉ÖëÓÓêÖƠê×Ù́ÖÖêÙÖêÖÓéØÖéÜÖéƠƠêÖƠéÖƠêÙ×ëØÖë×ƠêÖÖëÚØêÙØêÖÖëÛÙ́ÙÖëØ×ëƠƠê×ÖêƠƠêØØëÓÓéÚÖêƠÔêƠ×ëÖ×ëƠ×ëÜÙêÚÙëØÔéÜÙëÛÙë̃Úë̃ÚëÛÙêÜÙëÛ×êÛØêØ×êƯÙê××ê×ƠêØ×ê×ÔéĐÎåƠÑçƠÑåÑĐæÑÍåÏ̀æÎÍæÏÎèÎÍç̀Ëä̀̀åÎÎèÉ̀çĐÏèË̀çÈÍæËÏèÍÏèÎÏéÍĐèËÎçÏ̉êỀèËĐéÉĐêÉÏêÈÎéËÑêËÓëÍĐêÏỚÊĐêË̉êÄÎéÂÎëÅĐêẰçÀÎë»̀ê¼̀é¾̀ê»ËêºÊé¼Îë¼Î́»̀êºËê¼Îë¼Îë½Ïë¿ÍêĂÍéÀÎêÀÏëÅÏêÅÏêÊÑêÉÏéËÓ́Ë̉ë̀Ó́ËÑêÊĐéÑƠëÎ̉é±³Ú°°Ù¯±Ù°³Ú°²Ø­±Ú³µƯ²´Ü´¶Ư¯³Û®´Ư±³Ú®´̃±´Ư®²Û³¸ß³µÛ²¶Ü²µÜ³µƯ«°Ú«²Û­±Ü«­Ø¬°Û¬°Ú®´̃«¯Ùª°Ú¬°Ù¬²Û¬±Û¬²Üª²Ü¬³Ü°²Ú«¯Ù®³Ư®³Ư«²̃«±Ư¨²Ü©¯Ú©°Û¨¯Ú¨¯Ù§®Ù¨­Ùª°Ù©®Ûª±Ư¨°Ư©¯Ü§²̃¦±Ưª³̃©¶â«·ă©¹ä¥µă§¹ä©¹ä©ºä©ºäª¹ä©¸ä©¹ä­¼å©ºä«¼å§»åª¾æ¬Áç¯Âè¯Áè°Äë³Âç±Áæ²Âè²Âç²Åê³Åé¶Æê´Äè²Åé´Äè¶ÄçµĂèµĂç·Äè¶Åé·Äè¸Äç·Çé¶Æè¹Æè»Êé¾Ëê¿̀ëĂÍêÇÎêÇÍêÊÏéËÑêÍĐêĐÑéĐÑéĐÑé̉Óé̉ÑéÔÔêÓ̉éÔÓé×Ôé×ÔèỞæÚƠèỞé×ÔèÓÔêÔÑçØÔéÓĐæÔÔéÓ̉é̉ÓèÑÑæÔÔêÔƠë̉̉ểÔêÏ̉ềĐéÍ̉ëËÑëÊÑ́ÉÏêÍ̉́ËÑêÍÑêÍ̉êÏÓêĐÓéÓÔêÔØíƠ×ë×Öê××ëÙƠêÖÖëÖ×ëØØë×ÖêÙƠêÚÖéÙÖê×ÖêØÖêÚÚ́Ú×ëØ×́ÙÙíÙƠéØ×ëÔÔêÔÔêÔÖêØØëƠ×́××ëÖÖêØØëÚ×êÛØëØƠéÙ×éØ×êÛ×êƯÛ́̃Úë̃Úë̃ÚëÜÙëÙØëƯØéÜÖèÙƠé×ƠêÙƠçØÔè×Ôé̉ĐçÔÑçÔÑæ̉ÑçÏÎæÎ̀åÎ̀æÍ̀æËËäÉÉäËËæỀçÍÏæÍÎè̀ÍåËÏèỀç̀ÎçÑ̉êÏÑçÍĐçËÎé̀ĐéÈÎèÈÍèÉÎéÉĐêÊĐêËÔíÊÑëÍÔëÇÏéÄÏêÅÑëĂÍëĂÎëÂÍêÀÏë¿Ïë¼Ëê¿Đ́½Ïë¿Đë¿Íë¿ÎëÂÏê¿ÍêÀÏëÁĐëĂÏëĂÎêÆÑëĂÏëÅÑëÄÑëÅĐêËÓëỂëÍÔëÏÔëÍÑéÏÓé̉ÖëÑƠêÍÑ誱ګ®Ùª¯Ú©­Ø³³Ù¯°Ú²²Û¯³Û­µƯ¯¶Ư°²Ú²°×¯²Ú®¯×¬±Ü¬³Ư¯²Û®²Ù°µƯ°±Ù®±Ú«±Ú­±Ù¨°Ú§¯Úª®Ù¦®Û¦­Û¨­Øª®Ùª³Ư¬°Ú©¯Û¨®Ù§°̃«°Ú§¯Ù­´̃¬°Ü«µà¬´Ư©²Ü§¬Ø¦¬Ù¤¬Û§¬Ø§®Ù©­Øª®Ø§°Û¨¯Ú§®Ú©®Ù§­Ư¥²á¦µá¦µâ¦´â§¸ä¦·ä§¹ä©ºä¨¹ä©·ä¬¹ä«¹ä¬¹ă®ºäª¹ä­¹ă¬»å¯Àç°Ăè¬À謿禵ிå²Ăé·Ăè³Ăé¶ÂèµĂé´Âè·ÄèµĂæµÁæµÂæµĂç·Ăç·Âæ´ÁæºĂæ·Àå´Âæ¸Æç¾Èé¼Êé¿̀éÀ̀́Å̀êÈĐëÉÎéÊÍèÍÏèÏĐéÑÔêÑỐÓÔêÓÓé̉Ñè̉ĐèÓ̉èÓÓéỔèƠÔéØƠêØÔé̉ĐèØÓèÖÓéÓ̉èÓÓéÓÓêÓÔé̉ÑèÑ̉éÓÔêÓÓéÓÓêÔÓêÔƠểÓểÓêĐÓêÏÓêËĐéÊĐë̀ÔíËÑêÍ̉ëÍ̉êÎÓëÎ̉êÑÓêÓÔêƠÖë̉ÓêƠ×ëÔƠëƠƠêÚØêÖ×ëØ×ëÚ×êØ×êØØëÚ×êÙ×êÖÖêÖÓéÖǾ×Öê×ǾÔƠêÔÔêÓÓé×ƠêƠ×́××ëÔÖê××êÙÖêÙØëØÖêÛ×é×ƠèÛÙëÚÖéÜÙëÛÚíàÚêƯÚëÜØêÜØêƯÙéÚÔäÚÖêÙÔèÙƠé×ÔèÖÔéĐÏăÔÔçÑÏæĐĐè̀̀æ̀̀æỀå̀ÊăÊÊåÍ̀åÇÉăÈËçÍÎæËÍçÏÏéÍÏè̀ÍæÍÑềÎæÍÑè̀Ñé̀ÎèËĐéÉÎçÈÎèÉÏéÇÏêÆÏêÈÑ́Ç̉́ÄÎêÁĐ́ÁÑ́ÁÏëÀÎ́Ç̉íĂĐëĂÑëÀ̀éÁĐëÀÏëÁÍêĂÎê¿ÏëÁÏêÅÍéÈÑêÆĐëÅÎêÅĐëÅÓíÆÑîÆÑëÅĐêÅ̉́É̉êËÓë̀ÑèĐƠêÑÔë̉ÔểÖëÓÖë̉ÔéĐ̉箵ߪ¯Ú¨²̃¯±Ù®±Ú­°Ù¬°Ù«°Û°´Ü®¯×®°Ø®±Ø¬³Ư®²Ú­²Ü¨¯Û¨±Ư­°Ù­±Û«²Ü¨±Û¬´Ư¨¯Ú§®Û¦­Ú¦ª×©®Ú§®Ú¨­Ø«¯Ú©®Ù­®×­²Ü®°Ú¬³ß¬´ß¨¯Ú©±Ü®¶̃¬³ß¬²Ư¯´̃«¯Ú¨¯Ú¤«Ø©¯Ü¨¬Ø¬®×ª°Ú¥®Ü¦­Ú¦¯Üª¯Ù§¯̃§±ß©´ß¨µâ¦µà¥·ă¤¸ă§ºæ©·â¬ºä°»ä«ºä«¹ă«¹ă­¹ă«ºä±¾æ®½æ²Àç«»å©ĐÆ”»– É°»Ư·Ăè²Áè·Æê·Ăç¸Åë·Äè´Àå·Àå¶Áå·ÄèºĂ涾å·Âå¹Äè¹Âæ¸Âå¸Âä»Çè½ÊéÁ̀éÁÍ́ÁÉèÇÏëÈÍèÉÍèÊÎèÍÏéÎÔíÓỚÑÓêÑÓéÑÔëÑ̉êÓÓéÔƠêÓÔêÔÓéÖÓéÖ̉è×ÔéƠÓèỞçỞæ×ƠêÑĐæÔÔéÔÓêƠÔéƠÔéĐĐäƠƠéÔÓéÓÔéÔÔêÔƠểƠêÑÓêÑÔëËÓíË̉ề̉́ËÑëĐÔêÎỐÏỚĐÔëÓÖíÑ̉ể̉éƠÖêÖǾ××ëÓÔêƠÖêƠƠêØØêÚ×êÙ×êÙ×êØƠéÙ×ëƯØêÖƠê×ÖêƠÓéÚÖéƠÖêƠ×ëÔƠêƠÖëÙØêÖƠêÙÖêÚÙ́ØÖêÛØë×Ơè̃ÙêÚ×êØƠéƯ×éƯ×êÜÙëƯÙễØéƯØễÙê×ÔèÙƠé×ƠêƠÓéỞç×Óè̉ÑèÑĐçÎÎăÍ̀äÍ̀áÍÍäÍÎé̀ËæÍÍçÈÊçÉËæËÎæÎÎæ̀Ïé̀ÎæĐ̉è̀̀ăÍÏæ̀ĐéÎ̉êÑÓềÑéÊÎäÉÏèÇÏêÉĐéÄÍèÅĐêÄÓ́Ä̉́ẨëĂÑ́ÁÏëÀĐëÁÑíĂÏíÄĐ́¾ĐëÂḮÅÏë¿ÏëÀÏêÁÎëÂÎëÂÎëÁÎêÄÏêÄÎêÈÑëÉÓ́ÇĐëỂíỂëÈÑëÇÑëÉÑëË̉êÎÓểÖë̉ÔểƠêĐÓè̉ÖëÓÖëÔÖꥦͯ²Ü¯¶á°³Ư«±Ư®²Ü­³Ư«²Ü°³Ú«²Ü¬¯Ú«¯Ú©­Ù¤­Ù¦®Ú§­Ù¦ª×¬³̃©®Ùª®Ú§­Ø¦­Û§¯Ü¨¬×¥©Ö£ªØ¦«Ù£«Ù¥ª×¤­Ù¨¬×¦«Ø§¯Û§«×¨«×§¬×§­Ú¦°̃§²ß®±Ûª°Û§°Ư¨­Û¦«Ù¨¬Ø«°Û«®Ú¨¬Ùª®Ù«­Øª«Ø­®Ù¨¯Û¨¬Û¨°Ư¨´â¦³â›¬Ü”¦×˜£ÏŸ¯Ư¦´à¬¹ä­¹ä¬¸ăª·á¨·áª·â®ºä¬¼æ±¾ç¨²Û™ÄŒ’º•½”¸•¼“˜Áœ¤Đ ¬Ù«µÜ°½å´¼ä¯¼äµÂè·Äç¹ÂçºĂç¹Áå¹Áå»Áå¼Â庾༿亾á»Ăå¾ÅåĂÊèĂË́¿ËëÇÎíÅ̀êÊÏêÇÉçÈ̀ềÏêÏ̉êÏ̉êĐÑéÓÑé̉̉ể̉éÓÖ́ÓÔêÓÓêÖÓéỔêØÔéÖÔéÓ̉éÓÑçÓ̉éƠÓèỔèÓ̉êÖÓéÓ̉éƠÓèƠÔçÓ̉èÓÔêÓÑéÔÔêÓÔéÏ̉êÎÓ́ÏỐËÓ́Ë̉́̀ÑëÎ̉êÎ̉ëÏƠëÏÔë̉ƠëƠ×ëƠÙíƠØíÔǾÔØíÓÓéÔÖêØØëÖÔêÙÚíÙ×êØØëÙƠê×Øë××êØÖê×ƠéƠƠêÖÔéÔƠêƠÖê××ëƠ×ë×ƠêÖ×êÚØë×ÖêÖ×ëÚ×êØÖéÙØëÙØëÚØêÜØêÚØëÛÙëâÛëÛÖçØÔèÚØêÙØëÙÖéÙÓè×ÓéÚƠé̉̉æÑÏçÑÎçÑÏçÎÎåĐÏäÏÎæÍÏé̀ÍçÊËç̀ÊăÍ̀åËÍçỀæÍÏèÏĐçÏÓêËÎèÍÏç̀Đé̀Đé̀ĐéÍĐç̀̉êÊÏçÈÏéÆĐêÆÓëÇĐéÇÑêÄĐêÆÓ́ÀĐëÁĐîÁÑíÀÏëĂḮ¿̀êÀÎê¿Ñ́ÁĐë¿Îê¿Ïë¼ÍêÄÑ́ĂÎ́ĂÎêÄÑíÉ̉́ÉÑêỂëÊÓ́È̉́ÉÓíÇÑ́Ç̉êÆÑëÎƠíÎÓëĐÔë̉ÖëÔ×ëÔƠéÓƠêÔÖëÖǾNXijmƒŒ°¢¥É¬¯×¯µß¯´à®µ̃¦¯Ư§®Û«¯Ú©¯Ú§­Ø¥«×§«×§¬Ø¦«Ö¦¯Ü§¬Ù¥«Ù¦­Ú©®Ú¥¬Ü¡ªØŸ¥̉¢«Ø¢ªØ ©Ø ªÙ¬Ú§®Ù§¬Ø¤¬Ü¦¬Ù¥¬Û§¬Ú§®Û¨®Ú¦¯ßª¯Üª¯Û¦­Û¦®Ù§«Ø©¬Ù«¯Û¦®Üª­Ø«°Û¬¯×¬«Ö¦¬Ú¤­Ú¨¬Ø§­Ú¥­ƯŸ§Ơ™ÉŒ–Ä’¹Œ™Ë̀£Ñ§´á­ºå¨µă¨µà©ºä¬ºäª²̃œ¤Î•¾““¶•¼‰’¾…’½ˆ“»–¼—™ÂŜƛŸË ŸË–̀¨®×¹Âæ¹Åè¹ÂæºÂæºÂæ¼ÁäºÁä½ÁᶻâºÀâ¼Áă»Áä¹À䮲ڥ¬Ơ§¯Óµ½àÅ̀éÅÉèÈËèËÍèĐ̉ëÎÑëÔƠíƠỚÑÏèÓÖ́ÔƠëỞèƠÓéÔƠêỔéÓÓêÓ̉çỞè×ÔçÓÑè̉Ñè̉ĐçÑĐèÖƠêÓÓéÔÓéÖƠêÑÓç̉Ñç̉ÑæÓÓêĐÓëÑƠëÑÓêÎ̉êĐÔëỂëËỐÎÔëÓ×íÓ×íÍÓëĐỚÏ̉êÑÖíĐÔëÑÖ́ÏÓëƠƠêƠ×ëƠ×ë×ÖêƠÖëÛØëƠƠêØÖêØ×ëØÖê××ëÖ×ëØÖêÖÖêØǾ××êƠÖëƠ×́×ƠêÙØë×ÖêÛØêÙ×êÚØëÙÖêÛØêÛ×êÛ×êÚƠéÚØêÜÙêÜÙêÛ×êÛÖéÛ×êÜ×êÚÖéÚÔæÖÓç×ÔéÔÓéÑĐæÏÎçĐÏéÏÎåÍËâÊÊäÎÎç̀̀ä̀ËæË̀å̀̀åË̀äÍÏæÍÏéÎĐéÍÏèÎĐé̀Îé̀ĐèÉÎèËÏé̀ĐéËĐêË̉ëÇÏçÅÎçËÓëÂĐëÆÓíÄÓ́Å̉ë¿Ñ́Á̉íẲ́Ẳ́¾Đ́ÁÑ́½ÎëÀÎêÁÏëÀÏêẨ́½ÎëĂÑíÂḮ¾ÎêÇÓíÅÑëỂëËÓëË̉ëỂëÉƠîÈ̉ëÉ̉ëËÓëÑ×íÑÖ́ÑƠëÏÔêÑÔêƠ×ë̉ÔêƠÖëÔƠê4?O+9MY,:S.@]9AOVYm}ˆ¦¦®Ü§³ă¤­Û¡«Û¥­ƯŸ¨×Ÿ©Ù¡Đ¥Ô–¢Ö ¢Î¤ÓŸ£Ñ¤Ó›£̉œ£Ó¡¨×§Ơ¤Ô¢¨Ơ¡¦Ơ¡§Ô£©×¡§Ơ¡©×¨¬Ø¡§Ơ£©Ö¤¦̉¡ ̀œÊ›œÊ¥ Ê¡¡̀¤¥Ñ¡¤Ñ¨¢Ë¤¤ÏŸ¡Î¥¢̀§¥Î¤¡Ë¤£Ï¨¦Ï¡ŸÊ¢¢Í¨£̀¨§Đ«§Ï§£Í§¤Í£¦Ó¨¢Ë¦¡ËŸ̀¨¤Î¢ÇœÈ¦¡Ê¦ŸÇ¥Å¦ É«©̉°©Ñ­©̉²ªÑ±«Ơ²ªÑ°ªÑ®¨Ï­§Î­¨Ï«¨̉ª¤̀§£Í§¥Î§§̉¨¦Ñ­©̉¬§Î«§Í¨£̀©¥Î©¡Êª¤̀¨¢ÉœÅ›—»œ™¿›Á–˜Â›˜»—•·›—º‡®y¢eoƒemVd}M^yci~œ±«¬Ä̀ËáÔÔí̉̉́ÑÓêÑ̉éÓ̉éÔÔêƠÓè̉ĐèÑÑèÏÑêĐÑéƠ×́ÎĐéÏ̉êÍĐêÎÑëÍÑêÍĐéÑỐÑÓêÎỚÍÓ́ÎỐÍƠïÍÔíÎƠíĐÖíĐÖîÑƠëĐÓë̉Öë̉ƠëÑÔë̉ÔêÑỚ̉Ơë̉ÔéÓƠêÓÔëÔÖëÔÖëÔ×ëÔÖë̉ÔêÓÓêÑƠë̉Ö́ÎÓ́̉ØîÑÔêƠÙíÔ×́ƠØí××ëÙÖéÖÔéÛÙëÙÙíÜÙêÛØêÚØëÚÙëÜØêÖƠéØØëßÙêØ×ëÙ×ë×Ơê×ƠéØ×ë×ÓæÖÓçÓÓéÏĐè̉ÑéÏÏèĐ̉é̀ÏçÆÈäÏ̉ëÊÏéËÎé̀Ïæ̀ÏèÊĐêÉĐë̀ÑêÊÏèÉÏèÉÏæÉĐéÈÎèÆËæÆËèÆÍéÊÑêÊÏêÅÏêÆÍéÆÍéÅÍéË̉ëÇÏêÈ̉ëÈÑëÇ̉́È̉́ÆÓíÄĐëÄÓíÅ̉ïẲíÄ̉ëÄ̉́ÊỐËÖïÈƠï̀ƠíÎÖíËÔëÏỚ̉×íĐ×îÑ×íÎÓ́ÏÖíËỐÏÔëÍƠíĐØî̀ÔëÍÔëÎÔëĐØîÍƠíÏƠëÑ×í̉ƠêD>I55E39L56G.2B*5F,;T6>N17I4@Y9DVDMaIVlnu‹•¸¡«Ú¥®̃£­ß§Ú—Í’É‘˜Â“œÊ–œřʔ›É’Ïœ¢̉¢Đ¤̉Ÿ¤Ñ¥Ô¡Ï©Û §Ö¨ªÖ¦×£ƠË ¢Ï ̀ Ê ÉœœÉ¢È£ŸÉ  ̀£È§£Í©¥Î¨ É§¤Î§¦Đ©¦Ï¡ŸÊ§¡Ë«ªƠ¨¤Ïª¤Í®§Î¯¨Đª¦Đ­«Ô«¨Ñ¤£Ï¤ Ë¦£Î©¦Ïª¥Î¤ŸÉª¤Í¬¥Î©£̀«¥Í²«Ó³ª̉³«Ó²«Ó±«Ô³ªÑ³ª̉¯§Í¬§Î­©Đ¬§Ïª¤̀¬¥Í¬¨Đ­¨̉«§Ñ®ªÓ®©̉­¨Ï©¥Í§¢Ê§¡É¨¦Ï¡ŸÊ›Á›˜½˜–»››Â˜˜¼”–½––º“”µ‘²t|•kwŒhrŒfqˆZk…XgXe|Yhƒs|”•—²¤ÆĐĐêÔÖëÓÔêÔ×ëÑ̉éÍÍç̉ĐèÎÓ́ĐÑéĐỐĐ̉ëÍÑé̀ÏéËÑêÎ̉êÎÓëĐÓề̉́̉ØîÎ̉ëÍÔî̀Ó́ËÔíÍÖîÏƠíÏÖîĐØîĐÓêÏÖ́ÑÖ́̉Ö́Ô×íĐÔë̉ÖëƠÖ́ÔƠëÔƠëƠ×ëÓÔêÔÖëÔ×íÔƠêÔÔểÔêÑỚÎÓ́ÏƠíĐƠíÏƠîÓÔêÔÖëÔ×́ÖØëÖÖëÛÙëƠÖëØ×êÚØëÚ×êÜØê×ÖêØÖêÚØëÙÖêÛ×êÛØêÛ×ê×ÔéÖƠêÔƠêÓ̉éÑ̉èÏÏæĐÑéĐÑèÍÏèÍÎè̀ÎåÍĐèËÑé̀ĐèÍÔëÊÏéÊĐêÉÎéËĐêÊÏéÉĐêÆÍéÊĐêÊĐéÊÑéÇĐèÅÎêÆÎéÈÑëẰèÇÍèÉÏéÈĐéÉĐêÇĐềÓëỂëÈ̉ëÈÓëÊƠíÊỐÉÓ́ÅÓ́ÇÓíÆÔïÆ̉ëËÓ́̀ƠíÎ×îËƠîËÓ́ĐÖëÓǾÔÙîÑÖ́ÑƠë̉×́Î×íÎ×îÎỚÏÔëĐƠëĐÖ́ÑǾĐ×́ĐÖíÏỚĐÔêÑƠëÍ̉êJ@HDR/8L1?T6Gb9F[CNdKYqQ^slx”‰“»‹”¸}‡¬s}¢ƒ…¥‡±…‹³Œ²„‹´‰³¹Œ—Á’˜Ä•Æ Đ–¢Ôœ¢Ñ ¡Í›£Ô›¡Ó¢Ï•̀˜Æ—œÊœÈ È™œÊ œÇ–œ̀ œÇ œÆ¡ Ë¢¡Í¨¤Í¨£Í¦ŸÈ¦¨Ô§¥Ï¨£̀¦¡Ê«¢Ê«¤Í«¥Ï«¦Đ±ªÑ²«Ô³«Ó´«Đ©¥Î¥¤Í¤ Éª¨̉ª¦Ï­¬Ö­¥Í¬§Ñ­§Ï®©Ñ¬¥Í®§Î°ª̉³®Ơ³­Ô³­Ó±©Ï®¨Í³ªÑ±«Ó¯§Î¯¦Í¬§Î®©Î¬§Đ®¨̉³«Ñ®¦Í­¥̀¬¨Ï©¤̀¨§Đ§ È§¡ÊŸÉŸ¿—™¿—”²˜˜½ Å”•¸°’®…‰§u‚ux†lqƒls`nˆ_m…_mises‘hrw|•°¯ÅÓÓëÖ×đÙÚñÑỐÇ̀çÑÓêÏÑéÍĐéËÏéÍÑëÎÓë̀ĐéÍÑëËĐêÍ̉́ÍÑèÊÑëÍÓ́̀̉́ÍÓ́̀Ïé̀ƠíÎỚÑ×íÏÖíÍÔíĐÔëÓØîÏÔíÑ×íÑÔëÓØí̉×́ÓÔểÔëĐÔêÓÔểƠëƠ×ëÓÖ́̉ÖëÓÓéÔÔểÔêĐỚÏÔëÎ̉ểỚ̉ÔêÔƠêÔ×́Ơ×ëÓÔéƠÖëÔƠêÖƠêƠƠëÛÙëÖÖêƠƠêÖƠêÚÖéÚØê××ëØÔéÙƠéÖƠêÓÓéÓÓé̉ÑèÑ̉éĐÑæÎÎæ̉̉è̀ÍçÏ̉êÍÏèÍÎçÊÎçÊÑêË̉ëÊÑêÊĐéÉ̀æÊÑêÉÏéÉÏéÈÎéÆÎèÇĐêÉÏéÆÎéÉÎæÇ̀èÇÎéÅÍéÄÎêÆÎéÉÏèÈÏéÇÏêÈÏêÆÏêÉÑêÆÏéÊỐÈÑëËỐÈÓ́ËỐ̀ÖïÊÓ́ËƠîÏ×ïÓØíÍ×îÎÔëÑÙïÔÙí̉ÔêÑ×íÑÖë̉Öë̉×íĐ×îĐỚÏƠëÏƠëÎƠíĐÖëĐÖ́ÏƠëÍÓèÎ̉éĐÔêÏÔëJDQMEVKH[DDMCCSBBS7?U7DY6@V6AW8G]ALaLRd\`qVbzRcdpirŒnw“x}t~Ÿs~¡…«…‹´ƒ‹µˆ‡¬¸Œ“¼“·”»•½™È–›È•Æ–Æ–Æ‘™Æ˜Çœ›Å›œÇœ›ÆœÊ˜œÊ È™Æ¢Ç¢ŸË¢¡̀©£Ë¨¨̉§¥Ï¦¢Ë§¥Ï¨ É©¦Đª£̀®¨Ñ­ªÓ°ªÑ®ª̉¬¦Í±ªÑ³«Ó°©Ñ®¦Ï¯©Đ¬¦Î°©Đ§¢É°¨Ñ²ªÑ°§Î¯©Ó­§Î¬¥̀°¨Î±ª̉³«Ñ´¬̉²«̉°ª̉³ªÑ³«̉³«Ñ³ªÑ±©Đ±«Ñ°¨Ï­§Î±©Ñ¯ª̉ª¦Î®¥Ë«¥Ë¨ È§¤Î§Æ£ÆœÀ¡›À”•º—•¶•—½–¸’“¹‹‰¨…†§‚‚w{—t|“pwjrˆktbofq‹gt“nvluksgl„…·¡¤¿¾ÀÙÏỐÓØđÑÓêÍ̉ềÑêÏỐÎÓëÍÑêÍ̉́ÍĐêÍ̉êËÑêÍ̉ëÍÓ́ÍÓ́ÎÓëË̉ëÍỚÍÓ́ĐÖíÏÖî̀ÔîĐÖíĐ×íÑØïÓØîÓ×́ÓØîÓÖëĐƠëĐÔêÑỚÓÖëĐÓêÔÖëÔƠëƠ×ëÓƠêÔƠêÔƠêÑÔëÔÖëÑÔëÔØíÔ×́Ô×ëÖ×ëƠ×ëƠ×ëƠ×ëƠǾƠǾƠ×ëƠ×ëƠÖë××ëÚÙëØÖêØ×ê×ƠêÚÖéØÖê×ÖêÔƠêÓÓéÔÓể̉éĐÔëĐ̉éĐ̉êÍĐéÏÑè̀ÑéËÑéÊÎèËĐêÊĐêÊÑëÈÏéË̉éÊÓ́ÉÑëÉĐêÆĐêÇÑêÅÎéÆÍéÇÎéÉÏéÇÎêÈÎéÆÎéÅÏéÇĐêÇÏêÇÑëÅÎëÇĐëÇĐêÊÑëÈÑëÉĐềƠí̀ƠíÍÖïÍÖî̀ƠîÎ×îĐØïÑØîÔÙîÑØîƠØíÓÙîÓ×íÓ×í̉×́̉Øî̉ÖëÓØíÏỚĐÖëÑÖëÑÖëĐ×íÏỚÎÔëÎÔëÎÓêÍÓ́ĐƠëÍ̉êDQkLTpJPj=EU;;LACQKGQOJOMEQHDQ?DUNRgSUeMVnHTqNZx_i‹epous{˜ox”ox˜z„¨‚…©€‡­‰³‹Œ²‹²Œ®’µŒ¶‘’·‹˜Å‘˜Ä’˜Â™¿“˜Á™™Á—™¿œÇŸ›Â›Ç™™ÁœÅ—ÄŸÇȢȡȤ¡Ë§£Í§¢Ë§Æ©¡É®¨Đ¬¦Î­¥̀®¥̀­§̀¬¦Ë³ªĐ°©Đ±ªÏ²¬Ñ°¬̉³¬Ô²ª̉µ¬Ï°¨Ï­¨Ñ¯¦Í´«Ñ°¨Đ¯§Ï²«̉°©Ï²ªÑ³«̉¶¯Óµ¬̉´«̉²¬̉±ªÑ´¬Đ´«̉°ª̉¬¦Î¯§Í¯§Í°ªÓ­¥Í­§Í© Çª£Ë§ŸÇ§ŸĂœÄ ›Â£¹¥›¾Ÿ™½“•»–µ”“³‹©„…£†ˆ¡||™yz–vwsv‰gq‡\j`mƒ]nergsdl‡a^vd[ojfypq~hn}ƒ–ˆ¥­­ÅËÍèÎÓíË̉́ÊÑíÊÑë̀ÑềĐề̉́Î̉ëËÓë̀Ó́̀ÑëÍỐÍ̉ëËÔíÍỚ̀ƠîÎØđÏƠíĐÖíÍÔëÎÖíĐ×ï̉×íÎÓëÔØíÓÙïÏỚĐÔëÑ×îÓÖ́Î̉ë̉ÔëÔ×́ĐỚÔÖêÑÔëÔ×́ÓÔëÓÖëÓƠêÓƠëÔƠêƠ×ëƠ×êƠǾƠǾƠÙíƠǾƠ×ë×ǾÙØëØÙ́Ơ×ëÖƠéØÔéÜÙê×ƠêÖÖëÖ̉é××ëÔƠêÔÔéÓƠëÏĐéÎĐéÍ̉êÍÑêÎĐç̀ÑèËÏçÏ̉êËĐéÊÏéÆÍéÈÑëÆĐëÇĐêÇÑ́ÉÑ́ÅÎêÉÑêÄ̀èÆÎéÇÏêÆÏêÊĐêÄÏëÇÎéÇÎéÅÏêÉÑêÅÎêÈ̉ëÆÎêÆĐëĂÎêÈÏëÉÓëÈÑề×ï̀ỐÎÖíÍÖîÑÙîĐØí̉×́̉ƠëÔÙíÔÚî̉×́Ô×́ƠØíƠÙíƠ×ë̉Ö́ÑƠëÓØíÏÖí̉ÙîÏÖ́̉ǾÍỚÍÓ́ĐƠëÏÔëÍÓëÍÓ́ÍÑëÏÔëT_yFSoAOl5Da(8R)8P3?VGGYML_KH\WQg_Xl\ZpRVqMXuY`zkgpsnw“lw•nx–ty–{€¢|¥€‡«„†¬‡µ”º¼·“’¶’”¹™Å•™À•Ä—–º’˜Ă™À“śŜř™ÁÀœÇ›Ç™Àœ›Ă¥Ä§ŸÇ¦¡É¦¡Ë¥ É§¢Êª¢Ë«£Ë®¦Íª¡É®¤Ê¯¨Î®¨Î°©Đ²ªÑ±©Đ³ªÏ³©Í³«̉±©Đ³«Ô±ª̉±¨Í®¦Í²©Đµ¬Ñ°§Í²ª̉°©Đ³«Ó³¬̉³­Ô¶­̉´¬̉³­Ó³«̉´¬̉´«Ñ²©Ï²ª̉­§Đ¯¦̀±§Í¬¥Í«¥̀ª Ç©ŸÆ¦Æ¥ÅŸ›Â§Â Ä™»–´“”¹œ”º“’²‹©‰„›‚œswnw’svŒlr„cj{]iz_h[k‚^m‡apgo„_`rtp~…ƒ—}~˜nsˆqw‰sz‹lz•|† ­²ËËÑí̉Øñ̉Ụ́̉×îÏƠïÎÖîËÓíÍỐÍÓëÍÔíÍÓ́ÏÖïÎÓêÎÖîÍƠíÎÖđÍƠíÑ×íÎÖíÎØïÎÖî̉×íÍỐĐ×íÓÚïÑ×́ĐÖ́ÓØîÓÖ́ĐÔëÔØîĐÖíĐ×íÓƠëÓƠêÔØíƠÖëÓƠêÔ×́Ó×́ƠÙ́ÔƠëÓƠé×ØëƠƠêƠ×ëØÙ́ÖÙ́ƠÖ́Ơ×êÔ×ëÔƠêØØëÙØêØ×êÓÔçØØëÔÔêƠÖëÑÓëÓƠéÔƠểÓéÑƠêÏÔëÍÓêÎÑéÍÓë̀ÑêÍÓềÑêË̉êÉÑêÊÑêËÓêÉÑëÈÏëÈĐêÇÑ́Ç̉́È̉́ÈÏêÈÑëÅÑëÆÏêÉĐêÇĐêË̉ëĂÏêÆÑëÇĐëÈÑêËÓ́Ë̉ëÉĐêÆÑëËÓëÉÓëÊÓ́ËỐÎÔëÏỚÏÙđÑÚđÑØî̉ÙîÖÛíÓÛđÓÙîÔÙíƠØíÔÙíƠǾÓ×́Ô×́ÔÚïÑ×í̉×́ÑÖëÓÖëÑÖ́ĐƠëÑØîÑÖ́ÎÓểƠëÑ×íÎỐKYt?Mi3Ea:Jh-=[2Cc@PoETuMQn\Un]\yTWrYWo[YsS[r^f}ijfmoy—wy“qx“y{›}›{€¡‡‰°²­‹’¼’º’°’–½˜—º’—À˜—½“¸——ÁĂ™—¾œ—¹ ›¿•›É˜™Áœ›Â˜¾›™¿Ÿ›Ä§ŸÆ§ È§¢Ê¥¡Ê¤ŸÉ­¥̀«¢Ëª¡È¬¢É­¥Í­¦Î¬¤̀®¨Ï°§Í³ªÑ³ªĐ³«Ó°©Ï±©Ï±©Ï³ª̉³ªĐ²¨Í®¨Î±©Ï±©Ï°§Ê®¦Ï®¦Î³«Ñ³ªĐ³ª̉³ª̉³«̉´«Đ¸®Đ±©Í¶­Í²©Đ¯©Ñ®¦̀¯¥̀®¤É© Å«¢É¨ŸÇ¨ Å§ÆÁ¢™¼¡œĂ¢›Á˜”³œ˜¸”’¸•²–‘±§‰vy“ltŒousvrufkvbk‚Tc|Ui†cn…`n‰bmfm~vz‡€y|z{|”t•£mz“gq‹z€›‹¨£¦Â»½ÙÂÅßÈĐëĐ×̣ĐỌ̈ÑÚó̉×ïÍÓ́ÎƠîÍƠî̀ƠïÎ×îÏØđĐỚÓÚđÍÖîÍÖîÓǾÏØï̉ØíÑÚđ̉×íÑÙîĐỐÎÔïÓ×́ÏÔë̉×îĐƠí̉Ö́ĐÔëƠ×ëÑÓéÑ̉éƠÖëÔ×́ÔÖ́Ó×́ØØë×ØëÖ×ëƠÖë×ØëÔÖ́×Ù́ÖÙ́×ØëÔÙîƠ×ëƠǾØÙ́Ø×êƠǾÖÚîÔÖëÔƠë̉ƠëÏÓêĐÔëÑÖ́ÏƠíÏÓềÓêÍÔëËÓëË̉êËÑêỂêËÓëỂëÉĐéÉÑêÊÔîÇÑ́ÇĐëÈÑêÄĐêÈĐëËÔíÇĐêÇĐêÈ̉êÉÑêĂĐëĂÑíÉ̉ëÄĐ́ÂÏëÉÓ́ĂÏêÇ̉́È̉íÅ̉îÈÓ́Ç̉́ÉÓë̀×ïÎÖíËÔíÎ×íÏÙïÏÖíÑØîÓÙî̉ÙîÑØîÔǾƠǾƠÚîƠÚîƠÙíÔÖëƠÙí̉Ö́ĐƠë̉×íĐƠëÑƠëÔ×ë̉ÖëÑÔëÎ̉èÍÔëĐÔëÍÓ́?Kh=Kh7HfAMfDOiALhJUqRUqQYy^[|T\{NSqLLkOSn[XrW[schmn…uy‘uy—{{–wy•}|—~~•†…£…§Œ‡¦‹¬‹³‘‘¶—³•—•–¸”—¾–˜Áœ¿•˜Á˜˜À˜—À—™Ä›”·™–½™ÁŸ™½™›ÄŸ½¡›Â¡ŸÊ¦Ä¦ŸÇ§ É¬¡Ç«£Ë«¢É¬¢É© È«£Ê¬¥Í¨ŸÄ«£É°῭«£É±¨Í²©Î±©Ï²«̉°¨Í³©Î±ªÑ°ªĐ®¦̀®¥É·­̀®¥Ê±§̀¯¦̀°¨Í²©Î³ªĐ³ªÑ²©Ï²©Í²ªÓ²ªÓ¶®Ñ²ª̉³ªÑ²©Î®¥Ë¯¦Í§ŸÆ«¡Æ§œÁ¦Ä¤›Á¢™¼™ÀŸ˜º›–¹˜•¸—“·”±“‘°ˆ©‰§…€~{ywŒvwuwtx’ho†ou‰hrƒ^k€\lˆcoˆirŒln}pt‚ry†{€‚˜ˆˆŸ|ƒƒ‡Ÿtz‹kq‚jk~ffuonzsvˆqn€{x’”–¨”–ª•­º¾Ö̉Ụ̀ĐỤ̀̀ÓíÍƠíÎØđÍ×ñÏ×îÍÔíÏØî̉ØíÑØîÑÙïĐØï̉×í̉ÚđÑÙï̉ØíÏƠëĐỚÔØíÓØî̉×îƠƠêÓÖêÓÔêÔ×́ÔÔêÓÔéÓƠë××ëƠÖëÖ×ëƠ×ëƠǾƠ×ëÔ×ë×ÙíƠǾƠ×ëÖÙíƠÙíƠ×ëƠǾ×ØëÖØíƠØíƠ×́Ơ×́ÓÖëÑƠëÑƠëÎÔëĐ×îÏƠíÍỐËÓëËÓëËÓëËÓëỂëÊÓëÉ̉́ËÓ́Ë̉ëỂë̀Ôí̀ƠíÊÓëÉÓëÇÑëËÓíÈÓ́Æ̉ëÅĐëÉ̉ëÆĐêÇÑëĂÑëÇÑêÇ̉́ÄÎëÇ̉íÈÑëÅÑ́ÇÓíÈ̉íÇÑëÊÔíÈÓëËÓë̀ÖîÎ×íÎ×î̀ÖîĐØîÏ×íĐ×íÏỚÑ×íƠǾÓÙîÔÖëÓ×ëƠ×́Ô×ë̉Öí̉Ö́̉Ö́̉×́ÏÔëĐƠëÎÔëÏÔëĐƠëĐỚĐỚ̀ÑềĐéDNjEOlFMeKTmN\zEPnCPmGStQ\zY[zW[zYZpVQnTVo`^{_[odf€ll„rx{{—z{”||’z|—€~–|}™‚Ÿ…‚£„…©ˆ¬•±”’·“”¼˜˜½”•¸“•»”˜À–™Ă™˜¿”•º–™À•À˜–¼’˜À˜›ÇÀœÁ£œÁ Â¥œÄ¦Å¦Æ¨ŸÅª¡É© È«¢Ê©¡Èª¡É«¢Éª Ç­¤Ë­¤Ëª¡Ç¬¤Ë¯¦Ê®¥Ê¯¦̀­¥Ê±§Ë¯¦Í¯¦Ê²©Ï²ªÍ²ªÎ±῭±῭µ¬Ï¬¥̀¬§Î®¥É±§Ë²©̀³ªÎ´«Đ³«Ñ±©Ñ°¨Î±¨Ë±§Ê®¤Ê¨ŸÇ¨¡È¨ŸÆ¦œÁ—¶ ™º˜º—”³™•·’µ­•´•®³•‘°‰¦‰† „•€y‹st‡tt„qr€gm„em`m\kƒXien€jr†rt€tv€nr€|{Œs{…‡˜„˜sx“ut…iapkixsqooƒkk‚kjzg_ia`pffuggwgfw–›³ÅÉåÔỤ́ÑØïÏØïÑÚñÍÖîÍÖíÏØïĐØïÏØï̉ÚđĐ×íĐÖ́̉ÙîĐ×îĐ×í̉ÙîĐÖë̉ØíÔÚïÔØîƠÖêƠÖểÔêÓƠëÔƠêÖǾÖ×ëƠÖëÚ×êÔƠêƠÖëÔ×íÔÖëÔ×́ƠØíÓÔëÔØíÖǾƠÙíƠ×ëƠ×ëƠØíÔÙîƠǾÔÖ́̉Öë̉ƠëÏÖíÏÔëÎỐÏÔëÏÖ́ỂëËỐËỐÊÑèËÓëÍÖí̀ÖîÇĐêỂëÊÓëÈÓíÉÔîÈÓ́ÉÓëÉÓëÊÓëÇƠîÊÔîÊÓëÈÓëÅ̉ëÉÓ́ÅÑëÆ̉ëÆ̉ëÇÓíÇÑêÅĐ́ÅÑ́ÆÔîÊÑêÆÓ́Ç̉íÉÓíÉÔíÉÓëÉ̉ëËÔíÎÖîÍƠíÍÖíÎÖíÑØíÑØîÓØîÓ×́ĐÖ́̉ỚÏƠë̉ÖëĐÔëÑÖí̉Ö́̉ØíĐ×í̉×íÍỐÏỚÏÖíÎÔí̀ÓîĐÓêÎÓëËÑêFOhFUqLTlITnM[uJ[yGTsHVwQZxTZy\Ys[\qWYs]ZoY]rgdzkh~no†tsvwŒwwŒwz–z|œ~|˜}}››„›‡¡‡¨Œ°‘±–’¯””¸“¹•–¾µ–—¼—“¸—“¹›—ºŸ˜½—˜½œ™½›œÅ˜¸ŸÁœœÇ¡œÅ¡œÄ£œÅ¦Å¦Å§Å¦ŸÈ§ŸÇ¨ŸÅª¡È©¡È©¡É©¡É­£É­£É­¤É«¢Ç¬¢È¯¦Ê®¦Ê±¨Í¯¦Í°§̀°§Í³ªÎ­¤̀´¬Ó±¨Đ±¨Í°§Ï«£Ê¬£É­£È®¤È®¤É¯¦̀±¨Ï³ªÏ¯§Í°§Ê¬£Ë¬£Ê§ŸÅ¡Æ¦Â›Ä¡¾˜–µ•²•Œ¬ˆ©“­Œ‡¤’¨“­‰¨‘­†‚—‚„zxtk{ut‚qwjtˆel~ikxak…ipƒ\athgnllvsr‚qruv…x~“}€“‚‘zzynnbwrj|pq|mn~mlzklzgepaate^nkfsiamhet||»¿ØØß÷Öà÷ĐÙñ̀Ố̀ÖíÊƠëÖ̃óỠơÖỰÔÙîÏ×íĐÖ́ÓÙîĐØîÓÚïƠÚïÔØíƠǾÖǾƠ×ëÔƠëƠ×ëÓÖëÓỚÔǾƠƠêƠ×ëÔƠêƠÔêØǾ×ÖêÓÖëÔØíÓ×íÖ×́ƠÙíÔÚîÓ×́Ơ×́×Ù́ÖÙ́×ÚîƠÙíÖÙíÓ×́Ñ×íÑ×íĐ×íÍÔëÎ×îÎÖíÍỐÍƠí̀Öî̀ÓềỐ̀ÔíÍ×íËỐÉƠíÊỐÉÓ́È̉́Ç̉́ÊỐÈ̉ëÉ̉ëÉÓ́ÇÓîÉÓíÇÓëÆ̉ëÉỐËÔíÆÓîÉÓëÉÔíÆ̉ëÆ̉́ÇÔîÇÓíÇÓ́ÉÓ́ÇÔîÆ̉́ÉÔíÊƠîÍÖ́ÎỚÍỚÏÖ́ÏØîÏØï̉Ùï̉×îÓØîÔÚï̉ØíĐÖíÑØîÔ×́̉Øí̉ÛđÏÖíĐ×íĐÖ́ÏÖíÎỚÎỚ̀ỐÏÓêÏÔëÍỚÍÔë̀ỐOVpM\vR\sIXvQ\xQ\{T]u\^t^_x^awed{bZo[VrbZsb]qeajf~haxpkƒqq‹xtŒ{{”€{’yz•€|•z”~†Ÿ‰‚¤‡„ªŒ²ª‘‘°‹«‘´‘²•±–µ”Œ¯–¹–“²•”·”–¼™•¹¤›¿Ÿ›Â››Å¤›¼ ›Â¢›Á¥Ä¥Å¦Ä¦Æ¦Å§Æ© È«¢Ê©¡Éª¡È¬£É«¢É© Ç¬£É¯¥Ê­¤È¬¤Ê°©Î«£É¯¥Ê© Æ¯¦̀¬£Ë¯§̀±§Ë±§Ê®¥È±©̀¬£Ë¬¢È¯¦Ê«¢Çª¡È¬£É¯¥Ê±¨Í«¢Éª¡Çª¡Ç§ŸÅ¨À¡ÅŸ¼˜º˜—¼•±—®Œ„¦Œ†§Œ„Ÿ‚‚‰ƒ™‚~“€{‘…{|w‡ys€pjxmm{kk}qr~pn}jdrb`q]Wghk|twŒpr}bfygmƒ€„—y}‘sxˆy|vv…on…rj}m^okhsil|dm€jexeasbapg\p_[n_cwdfutmzœ·¡ªÀŒ”­†yu~‘–ª©®Å½ĂƯÏÖëÓỤ́ÖỰƠỰÓÙîÔÙí̉Øí̉×́ƠÙíØÙíƠ×́ÔǾÔƠëƠÖêÔƠëÓƠëÔÖëÓØîÓÔëÓÓêƠ×́ƠƠêÓÖ́ÔØí×ǾÔÖ́ÖÖêƠÙíƠÚïƠ×ëØÛïÖÙíƠÖëÔÖểØí̉ØíÑÖ́ÍÔëĐ×îÎÖîÎ×ïÍỚÏØî̉ÚîĐ×íËÖíÎØíÊỚÉƠíÊÖíÉÔíÉÓ́ËỐÇ̉ëÉỐÇÓ́ÄÑëÈÑëÈÔíËỐÊÖîÊƠíÈỐÇỐÇÓíÇÔíÈÓëÆ̉íÅÓîÇÓíÈ̉́ÆÓíÄÓíÉÔîË×đÉÔîÇÔíÈƠï̀Öï̀Ố̀ÔëÎ×í̀ÖîÍÖíÍÖî̉ÚđÑỚ̉ÚïÏ×îÏ×îÑ×íÓØíÎỚÏƠíĐÔëÑÔêÎỚÏÖ́ÍỚÏÖíÏ×î̀Ơî̀ỐÍỚËỐÍƠíY\q^_tRWpSYoXWm`]u\Ytnfqmg|f]re\oZXuUQm^[mfZpeb{ibvki}nkƒmq‹sqŒxx‹|y{x€z€{”…|–†|–†ƒ¡ƒ¢„¦ˆªŒ‰¬Œ‹°Œ«°•°–³‘Œ±—’¹•”¶’´›”¶›•¸›”¹—º–ÅŸ™½™™¿¡™º¦œÁ˜¼¥œÁ¦›¾¦Æ¨ŸÇ© È­¤Ç®¤Ç­¤È«¢É©Ă­¤É­£Ê®¤È«¡Èª Ç«¢Ê«¢Èª¡Çª¡È«£Æª¡Æ«¢Ç®¥È«¢Ç¬£Çª¢É© Ç¬¢È­£Ç§Â«¢É­¤Çª¡Æ®¤È¨ŸÈ© È¦Ä¦œ½¡ºœ™¾˜¸•“´“•º”Œ¯‘«‹¨‹ƒ˜‹“ˆ‚˜…”‰•…z’ˆƒ—‚”|ytˆshwrjvkdxjewrlƒrkzjcpe]nfYhogummxkjwgokp€wx„v{Œnsˆvvƒnq‚qyŒcj}eesll|W_uPTmebod`uf_nh\i`\lS]pZbt\cuY]p\Ue[[i^bragwejybeof_hljty‘–«¼ÂÙÓ×íÛà÷Øàô×ỰÙÙ́ÛÛíÙ×ëÓÖëÙØëÖÖêƠ×́ÖÖë×ØíÔƠëÔ×́ÔƠëÔÖëƠ×́ÔÚïƠÚïƠÚîƠÙí×Ù́×ÖêƠÚîƠÙíƠÙíÔÙîÔǾÔÙíƠÚïÓÚđ̉ÚïĐØíÑÚîÑÙîÑÛïÎØđĐÚđÑÙíĐÛñËÖîÎ×íÍØíÎÚïÎØîÊÖí̀ƠíÍØïÍ×îÊÓëÊỐÊÑëÉÓ́ÈÓíÊƠíÈÓíËƠî̀ƠíËÖíÅỐ̀×íÎÙïÉÓ́ÉỚÉỐÈÔíËƠíËÖïÆƠîÉÔïÈƠïËƠîÆÖíÊ×ïÎÙđÏØïËÔíËƠîÍ×đÍỚÍỐÏ×íÍØđÏÖíÏÖí̉×íĐØïÑÚđÏƠëĐƠëÑÖ́Ñ×íÏỚÎÖ́ÎỚÎƠëÍỐËÔíÍÖî̀ỐËƠîËÔë[Wed^w^UlgYid[laZohYod[mdZmb^wb^paUj]Yjb]ugbxniƒmj}op„vq„oswx{vws}xŒ~x€y‚{€{™z}œ‡‚„¢„…¤ˆª…¨”®“¯‹‹±•¬’Œ­‘‘¹“±–®“·“Œ®™–·˜“º•’¶œ˜¹œ•´›˜»¤›¼ ›Á¥¼¥œÁ¦Æ¦Ä§Á¨ Ç§ŸÆ¥›Ă¬¢Å¨ŸÆ«¢É«£Éª ÂªŸĂ¨ŸÈ«¢Ë© Ç­¤É§Ç®¦Æ¨Á­¤É¬¤Êª¢Çª¡È¨ È© Éª Å³ªÊ© Æ¬£Ç°¦È© Å¬£Ê¬£Ç¦œÁ ™» —µ›•´™“³•³”²›’°Œ¯‰«‡¨ˆ„—„~—‰|‘€x‹…z„}‚€‡~‰‚zwm~tjzkdrjakd^mkeqmjsjbpg\l`Wc`YfaZjiktnq~nr„iplowrr|zyŒormnwnt„el{XdwXbuY`sISiDPi^XkdZli[j_Zna_t\]m_]lf\jd[pb\q\[o`]njanfZrg^qc^nnen…zŒ¥¡²¾ÀÖÑÑæØÜñâàóßßñÚ̃đÚÛí̃ÜíØÙíÖ×ëÙ×êƠØíÔƠëÔǾÔǾƠ×ëÖÙí×Ûî×ØëƠÚîÙÚíØÚíÔÚîÔÚïÔÚïƠÚïÔÙíÓØíÓÙï̉ÚđĐØîÓÜđÏØïÔÚíÑÛđĐÛđ̀ÙñĐÚïÍØîĐÚîÎÚïÎÛï̉ƯïÍ×î̀ØđÎÙđĐÛñ̀ØïÍØîËỐÉƠíÊƠïÍ×ïÉƠîÈÓ́ÉÔíÍØđÊÖîÊƠíËÖíÆÔîÎÙđÈØđËÙïË×íÇÖîÊƠîÉƠđ̀ØïÊƠîÍ×íËÖíÊÖíĐÜđÏÚđ̀ØđÏØïĐÚđÎØïÍÙñÏ×í̀ÖîÍ×ïÏ×îÑØíĐØïÑ×íÑ×í̉ÙîÑ×íÎÖí̉ÙîÓÛïÎÖíÏÙï̀ƠíËÔë̀ÔëÍÔëËÖïËƠîc\jf]ll]mnarhZjjZebTfeXkdXdfZgfYji^nibykduqm…mh}ml…tj€nk€ur„rk‹tu‹un†roŒvq†tttyzzz{—}™}}˜ƒ~œ‡|™‹„ŸŒ†©‰„¦…©ˆª‹‰©‘°‘‰©•­“®•®”­±—“®—“¶—°›—ºœ•¸—»Ÿ™» ›¿¦œÁ§œÁ§Ă¦œĂ¦œĂ¦œÁ¥›Â¨Æ©ŸÆ©¡Â§Å¬¢Çª¢Å© ĂªŸÆ©ŸĂ¨ŸÄ¨ŸÁ©ŸÂ§Â¨ŸÅ§Â¥›Á§œÀ¬¢Å¨ŸÄ«¢Ä©ŸÆª¢Æ­¥É«£È¨Á¨À¦›½£™·•²“±˜®™¬“Œ©’‹¥…§‹…£ˆ‡ z€zƒz‹}xŒ‡|‰~ƒ}††–ˆƒ‘‹ƒ…’wƒljxhbp_\mjbllgokblaWgeYh[O_aSegaqnqƒpt†qs|gbmhfkhcrd]mkkrioyfhve_la_q`ZlZWiZ\k]_nSTk`Vii[jh^k`Xhb_njamgYlVUkd[n[\sRYs_`nk]jk`ri\lh\id[llbnpn€‰ˆ¦¤·¿¾ƠÓÏäàßóÙÜïƠÙíÖÖë×ƠéƠ×ë×ÖêÔ×íÓÖëÔǾƠ×ëÓØî×ÚîƠǾÖǾ×ǾÔÙíƠÙíƠÙíÔÙîÓ×́ÓÚîÑÙî̉Ùî̉ÚîÓÛïÑÛđÏÙî̉ÚîÓÛîĐÚïĐÚïÍ×îÏÙï̉ÜđËØîÑÚîĐÙîÍ×î̀×ïÎÙïÎØíÍØîÊÖîÇÔí̀Øđ̀ÖîËÓ́ÆÓîÈÔíËØîÉƠîË×î̀ÙîÄÓ́̀ƠíÊØîÉÖïÍÙïÅÔíÍÙîÊ×đ̀ÙđËÖí̀ØïË×ïÇÖïĐÚđÍØîÍØđÏÙïÍÖí̀×ï̀ÖîĐÚđÎÙđÏÙï̉ÚîÎÖí̉ÚïÑØîÏÖ́ÓÙî̉ÙïÑÙîÏ×îÑÚđÏÙïĐ×íĐØíÑÚîÎÖ́ÍÖ́ËỐÍỚj\kiZji[mh[sdWgbVe\Tb]Uf[OVcUbi[lf^olbpmjylj|cb‚kfvk`rh_upj{pl€ps‹vv‹qq„ru‰otˆlrŒko‹zz|{“yy’‚‚|”€{—‚€Ÿƒ ‰‚¡ƒ¤‡¢Œ‡©‹†¨«‘©‰«Œ±ˆ©’°’¯±’‘²›’²•®—˜¼—–ºŸ—¸¢˜· ™»¥›¼¥›¼¦›»§›½¦›¾¦›½¦œÁ¦Ä¦œÂ¨Á©Ÿ¿¬À©Ä¬¡Â¥›¿¦›¿¦¼¦œÀ¦›¾¦»§›¼¨Ă©ŸĂ¦œÁ¥›À§Â¬Á§›¿¦›¼¨œ¿¤™¹–²˜‘°—®”¯’ˆ¨”ˆ¡„…¡™ˆ€w†so}|tz{w†|~‘„ƒ’†‘ƒ‚‘~}~z{x‚vv„~em…dclkdokcmh\j`Vdxtzzrvnenj^eg\mjkvajzbk~dlv__k^Zmjm|gisjfvkfumgsg\hh[ilYckdogdvjkzhdqibmacpd[lhZihYdQUkLSg@Lc3Gc=Mh\_ra\sa_u_]o\`wYWp[ZlVTeYXidjxxrˆ±¦ºØÔçßáơÚØîÚÚíÛÛ́ƠØë×ÙíÓ×́Ô×́ƠǾÔÙîØÜïÖǾƠÚîÔ×íÓÙîØÚíÖÙíÔÛđÔÙíÔÙí̉Ùí̉ÚíÓÜïÓÛîÑÚîÓƯđ̉ÛïĐÛđÏÙîÏÙîÓÜïÏØîÍØïĐÛîÎÛïÎÚîĐÛïÏÚïÑÚđ̀ÚđÎÙîÊÖïÏÙîÏØîÉƠï̀×íËÖí̀ÙîË×íË×đÊÖíË×í̀ỚÊÖïÇƠïÏÙîÉÖïËÖđÑÛïÈ×îÍÙîÆƠíËÙñÉ×îÊÙïËÙñ̀ÙđÎ×í̀ƠíÏ×́ÎÖ́Î×îÎØđ̀×đÍ×îÏÙđÏØîÎÖ́ÑÙíĐÙîÎ×íÑØîĐÙîÑÙíĐ×îÏØî̉ÚïÏ×íĐÙíÍÖ́Í×íÍỚ̀ỐcTccWadXegZhaVaYNZ\RZ]SY\TcUKVZP__Vj`Vpf\kf]ldZrd\oh^oj`voh|on‚vq‡usvvˆrtŒplut‰on‚tu‰ts‰nsxuŒwwŒ}z€{”‚{”…|–†|—†€œˆˆ¡‰‚¢Œˆ¨…¦‰„¦Œ„¤‹…§‹…¢‡¦‡§‘¨ˆ¦œ”±”‹©—©–³›•³™‘² —´ –´¢™¸¢–µ¦º¥™¹¦¹§›½§›¾ªœ¼¥›½§œ¾¥º¦™¹¥¸¥¶¦›º¦™µ¦›¼¦¹¦»§›½¨›¼¦›¼¦›½§›½¨·¥»£½—®”‹ª“Œ©­ª‹§‘ˆ¡ˆ Œ†}–‡||tˆunyksvlzpl}zp}€y‚ˆƒ’ƒ|‘kmvvr{„|…srykktmlyognkbmg^ordjlbllhqkgnlcismvb`ha_oedtd`n``ma`of_nfdvno|yvƒthsnfwk_ihYji^molrnfsl\ii]kf^ngXf_XeLOdEKa@Ka9Lf4E`7HbGOeJRhMVlRVhW[pVYnYVjUSdUWkRShWXn~v©§»ÇÄÓÙÖîåâôÜƯđÖ×ëÖØîÖǾÔ×ëÔÙîÖÚí×Ú́ÙÛï×ÙíØǾÙÛíÖÚîÖÜîƠÙîƠÜîÓÚïÓÙîÓÚíÓÚíÔÜî̉ÚîỠï̉ÜïÎØîĐÚïÓ̃đÑÚî̀ÙîÎÙîÏÚîĐÚî̉ƯđËØîÓƯđËØîÊÖîÎÚîÍØîÎØîÍ×íÊØîÎÙîÍØíÏØí̀ØïËØîÊÖíÎÙîËÙï̀ÙïĐÚï̀Øđ̀×îÎÚđÍÙî̀ÙïË×îÍÚï̀ØîÈƠîËØïÍÙïÍØîÏØîÍØïÏÙïÏØîÎÙñÏÚđÍÙîÍØîÓÜïĐÙîÍ×íÓƯïÍ×íÎØîÓÜïĐÙíĐ×íÎØîĐÙîĐØíÑØí̀×íÍ×íÎÖíÏ×íNHPaPVaS`_LPdOY[JM\HLhY`b\gJNYNELOKSQKYQKcRI`ZVi\WjfYk\[tji|kd}nr‰qm…op‡tpƒmk‰opƒpl…qr…ki}mn…totm‚upŒzs‡z}|{z’z€}”‚yƒ~’‹‡Ÿ‰‚™ˆ‚œ†›‰„¤‰‚Ÿ†}•‰—ƒ™‚™‚„ —‰£…¤“©’‹¥¯”Œ®“²—‘¯•±œ’°¦¶¡˜´¤™´§›¹§µŸ’¯£—¶®Ÿ“°’­ª¤¶§›¹§›¸¦›º¦·¤»¢º¡›¿¨ÀŸ”³Ÿ•³–•¹‘§„¥…‹„‹ƒ™ƒ¡‰œ‚–†‚—€y‘}w‡xwrma_xc_ruguulwso{~{Œ€›‚~‘}w‡y}v„{s{spwihxngslbthYihWacWceWa\T\f\cbXlq^cnfji`hiZfh^i]T^^Ugicmopzpktsnpizh]modnwjtynwqfut^ikX^h]hp[ffVfWQhMLf[RcHMcKMbFK]OlITiVVf^Tg]QfELg5D`1DcFPg^_ociy€„Ÿ µÄÀ̉ÍÍç¾½ÜØ×ëƠǾÖǾ×Ùí×ÜïƠÜđÙÚíÚÛí×ÜïÓÛîƠÜîƠÜïỖñÑÜñÔÜđÔÜïÑÚî̉ÛîĐÚïỖđÓƯïÑƯđÑÛîÑÜïÑƯïĐÚîĐÛïĐÚî̀Ùî̉Ưï̉ÜïÍÙî̉ƯđËÙñÑÜï̀Úï̀ÙñÑÜđË×íÍÚîÍØîÍÛïÍÛïËÙïĐÛïÏØíÎÙïĐÛï̀Úî̀ÚïĐÚïÍÚïÍÚïÍÙîÎÚï̀ÚđÏÙïÏÚïÎÙîÊ×ïÎÙïÎÙïÎÙñÑÙîÊØîÎÚđ̀ÚïĐÙîÏÛï̉ÛîÑÚîÊ×íÎÛïÎØï̉ÛîÏØîÏ×íÑÚïÑÚïÑÚï̀Ö́ÏǾÏÙíËÖ́ÍÖíÏÙïKHLOEPUERVCNVENVENQCKK=GL>FQDLP@GJBHKEMJGNMEPSN`WQd]RgYVk`\nkfukl€ljmjrnqo€km‰mo‰lj|degi‚iiqhysi{qj~qp…xtŒuuŒ{wŒ{ywwxwy}™ƒ•€}—‚€œzx|z’†{’†|•‰|“‚Œ™€—†{‚“•¢…— –§”¦•¨•¬ ‘©’­œ‘¬›’³Ÿ•´—¬œ–±–’±©Œ©˜ªŸ”©œ‘« ”¬Ÿ–³¢—± •²‘§–‘¯¡’®—‘³”±™“¨‹¢‹†¤y’„}‘…|•‹—‡€”‚~’|yzo|tjvtrkhzVXp]\pa^qpgqpr†uw‡ˆ‡•z}‘‡‚—st„vqwlitjm}baphdnieqg\ghZhiW^f\h_\kj[ijbpk^mmZbqY^gYeeQ^jYj_Shh]hganmk~ogscWhe\ol`nliujfvslvp`kgZij]kgYiialognaasPLe\O^_T\YS`BKa5F]0D]-?Y0B\FNeQQcKMdVSgQPeIG=GN>IRAIHAJ;4AE;G@:EG:ED\2E\4G_0Gb4F`1AZLZy««ÀỮñÜƯïƠØîƠǾ×ÜîƠÛïÖÜïƠƯïÔƯïÖ̃đƠƯïỘ̃ÑÛîƠßñÔƯïÑÛïÓƯđÖ̃đỖïÓƯïỖñÓƯđỠïĐÙî̉ƯđÓ̃đỠđÓ̃đÖàñÏÛñÔƯïỖñÓÜïØàđÑÜïỖđÑÛïỖïÔƯïĐÚđỖñ̉ÜïĐÙîÍÚđÓ̃ñÓƯđÓÜïƠßđ̉̃ñ̉ÜïĐÙîÓƯđÏÜđĐÙîƠƯïÑÜđĐÜđÔßñĐÜđ̉Ưđ̉ÛîÓÜđÍÚïÍÚđĐÜđ̉ÜđÎÙï̉ÛđÏÙïÑÚîÓÜï̉ÛđÑÛî̀ÙïĐÚîÏ×́Ó̃ñ̉ÛîÎØîÎØíĐÛîÏØîĐÚîH=9D;:D9;K;6E:<@:IPLVOOURMTXVaVQ^aSUVMX[KSXNSaNUbSViSWbTWYPT\S[`W]eW\iYedWbgXei]kj\feV]j`ka_nb[hk^mgXfj]kn^lj_jwfjqhwtcl{h|}hpzermp{oupw‚oxuzz|‹y}‹yŒyt{†s€ˆvxrt‡r}€kz~ft…owu{}onˆhot{…js‚jzkxˆor„q„‰}‘€”~’‡|Œ‡|†u„wj{qclu_gsdif^i]SfeUbi[igXiiWbkZhoakrimokouiuym|zƒwruvs{ljslema`oYVdl\iff`\dbcd]PWPY]blhfhhhnlmflgam_YjcK\TQe^SfUV\\PQ]OQV^[c\^c]fhypjwninnaoff\akcgkldakcjtnolkm`gofegiahgalaanecmY[hVahbhv[bs@Mf.@Z=H]IMZ=H]2BZBGZUMeLSiITh:Kf)A\,Da+?U8Hb7Hf5F_:Ki‰’¯ß̃ñỤ̈̃ÙÚíƠÙîƠÛîƠÙíÖÜîƠƯïỠïƠƯïØáñÓƯđÖàñ̉ÜđÖ̃ïỖđƠßđỖđØàđƠßñÓƯđÖßñ̉ÛîỠđỖđỠđỠïÓßñĐÛđƠßñ̉̃ñỠđÖàñÔÜïÖßđ̉ƯđÑÜïỖđ̉Ûï̉Ûđ̉ƯïÏÙîÑÛï×àñ̉̃đÑÜïỖïỠïÓ̃ñ̉ƯïÔƯïÎÛđ̀ÙïÑÛđÖßđÏÜđÑƯđÎÛđÏÜïÎÛïÑƯđ̉ÜñÎÛñÑÜïĐÛîÎÛđĐÛïÑÛî̉ÛïÑÛñĐÙïÑÚîÏÙîÓÜï̉ÚîƠßđÏÙïÔÜîỠïÎ×íĐÚîÑÜï@15?37=08I:;602813C;A@71B9;N>IK>FUGOQAFQ@H^GK]GHXAF[EIVFLLBHMA@I>GQEGdPP^MOdVWSIPJENSBMjRQbQRSJQRGLPGSUJQ[SR]SUbVXcUTeUTiX\cQ\cOW]KNnRW_OP`[dtZbv_fj[hm\ducem^komullvm_jtdjp]hv_mbh„hkƒgl†op…of‹pk‰qrpmˆdi‡jp‚im‚gm~\c{\e…elgqygk|af~bm{ep|_gs^fnZcxbmsap…kt‰z‡‰yw€…q{€p{{ir~kxoezn\ieYhp^coZ\fXYhZekUbjUamZ^o_irejlajf^nriturxtorsdmlguvknrehj^lfajRXdBQVIQYNVRX^Znmlcjdnlogmhitg]mbP_QXqcZib[TUcX^g``nhjljoth|vZnoj[^YVafJQ^`f_fdbb_erqqjkkY]bdikzrovl|tm~zrpmpRU`adl`eqAOa6DY8G^AG^QK[HJYE89D>FJ@DKFI<=L@DHDGI5<85/@7:94;88B:>.6F$+-&/9D>K57@@:>`EGlLPeMNhKJhNIiROnQOuQOyWQpOO_IMqKHvPPmRNzYU{WS_\|[OmUYwVRqUWlWUrafkWVjRPkQUjNQoQTzXP\a{Y]‡YZˆY[ˆZ[ƒZ^‰\d‹^b‚\d†af‡`b„\_ƒ[c„XZx^glZhhFGrYXzZ_zX\pZboY`qXVtY`qZdu[fy\h„ip…fq†jtl{xfm{bjt`ov]`q]d`SZVKTZJMaJQcRQ^SX]QVIIRDCL`S]jbhRRX9@NBFT>CQDK[SP[YMWVPY_MU]LVQa\I^UJZ`L\Sjspljftmiikk]c^PXU@JHCMVJMZZTbqbeyhnjchZRZlojrngYacVea=IQ:JPMUTV]`QSZ_\g_`dcidbinutjƒ~m}wgpmhvmeupkuql^_fkfmafmO]cUWjaUebXne[llevibqnl|f^ocUcXS`AL^W;2.2<68O;7P:;I:BdEBfMIuLI{WZ€WQyUMzVU„XR€VQwULsWNsXTzYOoXSiTUlU\qROmQWpSLkUQsTM|UO}ST~UP„YX^Z‹\YYU…YXŒYTYUƒVP‹_\‰\^‡Z_ˆZ^†ZY‡XUˆabiPQiLWoRUtVSvOL|SQyXUsTSsSSyWVuWVmXZzY_|]g‚fn‰jr†hs‡cg~[fz[cnOPkSVnX\rZbmJOkLQ€[ZpXUWPXEBK^HMcNRnY^n\aoURl[`eVVgSRUPRXHSWLQOJPUVZVf[FXZ@LSX`]agfOSTf`dqop\afCKSKNOVTZphijgjymq…w~_^mDI\Xa`aji[d^Q^];KMERSO\bZbced]khjhcfbc`jniusp†|k|vepnfyngytgƒ|kˆ{lypj\W\QWdf[hg^gf]k`\ka]k\Yh\Xaebm\]vXRiZXf[UZSW`LYf6Ie5Gc.2N66M:3N95H46\HHfPMdPJaHD[NO`SUdUaiTWdCBhEBiEA\>>ZEIgE@cDGeCEaFCF:>eA?xNKrWO`DEJ:9_BCtKDuNHQKWN…^Nƒ]RƒWNYN…ZOˆ^UzVNqbcs[Wo__‚nnq`^qQNrPNsOO‚UNƒWO…[W‹_YŒ[V…WQXQ‹YUVLŒXQYWŒZYYT‹YSVH‰XVXRŒXO‹YW‹Z[{]c_FNhDJUW{VY{TS€RVuNM„VOuQQyQRxSOuWQtWX}X^…ee†lhlo‚_e^e|[d…Z\sOUoQWnQU€XW~[Zy\\oOPrVUrTMhRRlTPƒZXˆd^~ZZ}\Z^^`Yƒ]ZjPTfX[eY\WURSbZYg\Ua[U`SrpmiehQTYlcjqmh[ac7HM>FM[[\gghpjnlhl‹†iagQTXTZURYW^d\Xe]ALQQVZW_Tbj][_Zgef|nc€yg‹j‡}l‡|l~slcfauqhƒ‚n|ylˆyayiwhvlhkjnompnhm\Tg`WeWVfJMbKOeQWeVQeSTlZYl[SfTWe?Pd;MgV^mqpupsxintQ_p2Ec7GdWVelas†œ¾½Í×ßñ̃è÷̃èöÛäóÚăó×ạ́ÚặÙâñÚặÛạ̈ÚặÙậÚặØáñÙâñØáñ×áñÖàñÙâñØáđ×ßđØáñÙâñØáñ×ßđÖàñØáñÖàñ×áñÔƯïÖßđỠđƠßđÖßđ×àđØáñÙáñ×áñỠđÔƯïØâñƠßñÖßđ̉ÜïỖđØậÑÜïÔßđÓ̃đÖàđÖßđÓƯđÖßñÖàđÓ̃đÓƯïÓàñÓƯï̉Ùí×ßđỖđ̉ÚïÓÛî×àđ̉ÜïÓƯđÔƯïỠđÎÚđÔÜïĐÙíÔÜîB21C.-M:sIB[=7ZLKcIAwUJnIHmKJ`KKaFB^XyZG|VN}TN€MC†UK„VM_O‡]T`TWFŒ\K„^R†ZP’_UƒYL€^PqbYufa{rovaZWMƒOHuRL‡]R[N“aSYM\MUI“WJVKUL‘WNŒVOSHUM‰VQ’UI”VIULbT›fX…__qNPzLP‰SP…PG‡VTXP‰XTƒSQ‹WL~VQ†VT‚XQXT_a]Vƒef‡ff‰ljˆefƒ_f‰_^yVT}WW…TSwQR~_a‡[T}SSrPO‚\]|US]Y…b\”l`‰ga‡bX€d_u\UqXQ}a[nYTvc]}e`e]W]cY_aUW^YOXS^`_tlg}vtvtxa`a]^^:GNPTVPT\IHN`Z`lht—…~jisiehnc\\Wdj]U`]HRTPUVOOONQOEMQTWStic~f€jˆ|j†l€jvtj€‡lˆ†l}yk}ybvpb~sb…{pwvpmoonlekdlpjxgcrHLXJQ^UZkYUfXPbPL_PUmVT_MTeQ^rfjqekq]jy^gqfkw_cmGRhX[r`XobTmkawƒ’¡¤¹ºÁÔĐÙëØßíÜäó̃åôÚăóÖßñÖàđØặÚäóÛåôßèøßé÷Ûạ̈×àñÙâñÖßđØáñÚăñƠàñÖàñÙâñ×àđ×ßđ×àđÖàñØáñ×àđ×àđØáñÖàđÖßđ×áñÔßđÓƯïƠßñÓßđÙâñÔßđÔƯïÔƯïƠßđỠïØáđÑÜïÔƯïÖàđÑÚîÓƯđÙâñÖàñ×̃ïƠƯđÑƯđÑ̃đÖßđÓƯđỖñ×ßđÎÙíÖßđ̉ƯđÔƯđÓÛîÓƯđÓƯđ̉ÛïỠđÓÜîÓÛîK1/=.0O51E/+]94_=8bKEgQN_FB^PJma\jYS`OIoVRnXZoPHrD>xLCwK@wMx[OtQGmOLfTL‚gU‹`PŒbR‚\Qˆ[O{TKƒVN‡XNXKYJ’YLWL‘WM…VLŒ[M…eW†lbk^yXM‚VP‹VMTJ–\N•\Lœ_Nœ]PœeY•l`¡vkzpshk\¡uh­~i«zm£zn£yi¥ti¤tf›rfg\„SH”[J¢aP aRŸbL hS™aS”_P gY™^R fZe\“\T‘ZQ”i]—i\b^dc–gdoidg‡ef`W‰^Z†ZT„UPh]‘f_`Sa^_W†aZ‡]V™lZœqc‘ofxzzjk}e^†n_ƒmax\UsSOy^Wsiame]g^\[XXUYYVXWV[Zmpoopl[_`PZZESRRV_RT\TQV{vqyun…€ˆyl~uibhY]^Zii\vu]nn]LUWZ^XQWY\_Wxu_‚y[€w^‚wdtlcgbXda^keX‹}d‚k—kˆj†ƒj~|m‰pkˆ}i…{p†€mƒ|•ˆƒ‚wjpiqkdnbbmbYgj\hiamjallhsdio\gj_it\dq^am`epikzgdw`\i]Xkb\o^TiPRn]Wmmmyoq€nt‹„‡œ’† †€‘{ƒ~’‰Œ¦’œœ¡°°¸ÍỠđáêùÜåôÚặÙâñØâñØáñÙâñÖàñØáñÙâñÖ̃ïØáđØáñÚăñÙâñÙâñÖàđÙáñƠßđØáđÖßđÖßđÖßđØáđØáđ×áñÑƯïƠßđƠßđÖàđÓ̃ñỖđÓƯïỖđÖßđÖßñ×áñÖßđĐÜđƠßđÏÜï×àđ̉ÜđÔßñỖñƠßđỠïỖđƠßđ̉ÛîÖ̃đÔÜïÓÛîÓÜïÓÜđÖ̃đE3*U71X;6S70oH>iHBiHCdOMcJDkTKs_\kabsQJrOGrSK|LEtNH~P@€OD†P>lF9XHAhUPnZSƒoh‡iZ†YL€]J‘cO–cOˆXHtGC|P?}P?UJ‡NC‰WLŒTGŒQE‹TLOC„SJƒ]QaN^PŒTG…QC_P˜bW”cY—mbŸrd¨|u¢|r¦tbŸma©}iª~lª~oªsc«|o¯we©hV­ygªwh±zfµˆp¸›§}°‚°‡y¤€t¥|r®‚q«ymªsc¤r^¥l\¤eS©jP¢bQ¨n\¦p_h`–g^›i]£sf™le–lmdZ’ocœka’dWŒf\_PbU†fT—m`‹fYaYƒ[VqQR‰^S–e_§‰~’ƒt˜„~‹pe‘gYx]PoQN„^[p[XdVRfWPj^`\XVga\WYTTXVY][kjaljjNWYDO[``fvwd}„n~m€}mˆ„k‹qyrjg`Xqj^rp\xpXfj\5@J1=>\^Z|vbgm]aeVpsh|zaZXR`dWhngf`b“ycŸ}g„wjpqg‚€iw{i|}iˆ{k’p‹f€f‡d†j–q•†wvnœvj wo”wt†wyvr{†w|‚y~€yv{{jlkX[cQ^nTanmpxc]ndYoji|gbocdpZdppjupk|bYj\RkbVmbTieXdcUpeYkdVgaWj_[khl}¦©·Ë̉æ̃çøßè÷àèơÜæôÜạ̊ÙậÙâñÙâñØáñÙâñÙâñÙâñØáñÖßđÚăñÙâñÙâñÚăñÖ̃ï×àđ×àđØàđØßïØáđỠđÙâñ̉Üï×áđÙâñÔßñØáñÖàñÖßđƠßñƠßñØáñÖßïỠïÖßïƠǗ×àđỖñÔƯïÖßđÔƯîÖ̃ïỠïÖßđÖ̃ïÖ̃ïƠÜïƠƯïỠđÓÜïA/*V60b<7iC;hB8jB9i@;jJFuZTt]Vuc]jY[pXPXMNbSOwXO‚SCyG9pD:k>3`>5ˆXLoMD‡cTˆjX‰eRYJ…VB~N>ŒUJ‰SH‚MF…RE…TJ†XP]S“^S]S‹WL‡]S‹d\†cV\Q”h]j]fW–g^tf§p­r™pdl\¨n_«jR©gMªgP«gR¨dM©hO²nY¯jR¹oT³pX´tY«hQ²jR¶uZªnV°tbµƒu®s°|©‚s­yª‰z¦‡{§}©‰|qwjk^Ÿnb¡k]]T—f]ld”e`“l_“mb’ha˜h\’bW™eY‡^X„ZQ‚\SˆeZ‰_U}[MƒWSZQSMb_’bW`W‘k]–wj•qb‡_V~SR‹UO„a[i^X_VXZQPXMM[YWWVWRPPQWUOON][[kjlQWRAISyvf„pym|l{|lywk}{jyyk‘vcˆr`uk]idW@KJ$./:HGrxaqrg^jVZg\‡„n}tdbgZgkagda‘n’€e€r`yvbz}k†‰rlq^yxc–‰j¨‘i”€g„m‚}`qs^zubysfwpf”th˜whkesrzrrzz{xrw‡{uˆr‚}nsrkWalXckVerfdpomyoourupeuj^stagzmhwmfqe_na\mg[pdWncZneZmdZq^XnaWkgaufas]_rspƒ™¥º½̀ÄËÚÍÑáØßđƯæöƯæö̃è÷̃çơÛäóÙâñÙâñÙâñØáñØáñÙâñÙâñÙâñØáñØáñ×ßđÙăñ×àđ×àđÙâñÖßđÙáñÙâñØâñ×ßđÚăñØáñ×àđ×áñØâñ×áñÚâñÖßđÙâñØàđÖßïØáñÚăñ×àđÔƯïÖßđỠïØàđỠïÔƯïØàđÖ̃đƠƯđÔƯï`A?oE8yICzKCvE=~OISIuZXp\]qXToaVp]VoWS\JI\QP\OLlMHzG:q?/\:1~QG^P‚RH~OD€M=uUMcS„fZke†g_‹i]}\Wto‘j^‰id‡rcqj’vkl\qfnc…f`‹f]vkys’ve¬xc©mV¤fQ©kV¥cO¬eNµqV¯hS¬lP³mS±hR«gQ±kQ±nT¨hQ®iO¯hP²kW°jT¯fS¹u[«hP­^K³oY­jS°kS©iU¨kW«oW©nR¤lZpc–ma€m~p”zqœ‚z™}v–vk›tjeb‘b[‡`Yˆ^Ue]_V…]Uƒ`X†^X‡dT„^TvVMxUM†XNWLŒZOfZ‘[NYP”XN`UbVŒYO“XP‡XTrVSoSLeTO_VYROPIKRYSOFKQLJLUOJQSVqd]yg[ztgƒkmx}lszc‹vzuhuvcpue}k\n]RX^RFON=EKBLHjqeo~c_l^WaUkskryl}xcnlVljb~qk}kƒtato[q{gjxmi{tvƒj‹‡jŒ{e‡|g‚wc|ycƒj—…kkg]PWVNTOxl`–xk„rj˜~pœzptpvqphnrfgnhllhjnYjnZwunZdlb^kjkomkjnnmmskaojVarilxkn}]ir[evacy`Yo]Sj^RldXn\UieVjjZhg\qb^yf\pbXih_sjavnh{~’“•¥œŸ¯»¾ÍÂÉÙ̉ØéƯæöƯæôÖàñÙâñÖßđØáñØáñÙâñÙâñÙâñ×àđÖßïÖßđ×àđÙâñØáñÖßñ×áñ×ßđØáđÔßñ×áñÙáñ×áñØáñ×àđ×ßđÙâñ×ßđ×àđƠßđÔƯđỖñ×áñÖßđÑÚïÖ̃ïØáñỖđÔƯïØáđỠïÓÜïỠïjI=wR@wNDyVJrJ>{OErSN|\Un\ZmZStc]raWf\WMEAYKJ_QJ^JGW40P7/hOG[Q‰YN}ZLtVR‚_X‡VK‰]P™dV™k^dX“[N—`S—cT”`R•]L–eSZK—`MZJ–XJ˜ZL\L]K_Qœu^¤r\­mT\K¤\J¤]K¤^M­gO­iO¯iP­kV§gO«eR¯hR­hP¬bR«_L¨eM§fO­fQ¬lT¦n^°q_­dQ©eO±m[©fU§aP©iS¨cN¢^Mœ^P”VI ]K—XJ™ZK¢eV—eWŸl_“i^”me—vp’uk’vvtnnV~nSoa‡sW€iT}_Qˆ\M…SK†WLˆVL‰[L^N‹YS–ZP‘_R[N‘VL‹TN‡QI‡SK‚TOtQJlUMnUOiSOXQOOHJMJIUPPKKMVRPSPPKHK_PMo\Y€vj}€okoeqy]nw`‚}lvrcahX|s`‰lYu_Wo^PhZKcmTfsfjqg`lYVe]frhrvkQ`Waf\}tgpkj~rlwom‡rby`lwgtmeqe\hiQ\[rfZˆ~iqn]zu\vr`ˆg{fzxbfe[—„h’ƒj~~jzk{ukyun~{f}}mci]]idko`]d[rtacdaljnmpsosnmqu^glbgh_bifkpckwjmw]cp_`u_^uXMhXMh`Tj^QheWidXjh[olcvli{i[mfWkeWrjWqdVmbWke^ph`rkjx~€“¡·ÊĐáàç÷ØâñÙâñÙâñÙâñÙâñÙâñÙâñÙâñØáñÙâñØáñÙâñÙâñÙâñØáñÙâñÙâñ×àñÙâñÙâñØâñÖßđØáñØáñÙâñØàđØáñØáđØáñÖàñỖđÖßđÖßđÖßđØáđÖßđ̉Üđ×àđỠïÓÜîÖßï„bYzbY~ke~i\zdZyf`‚mi|gcl^^aRNgb^jc`l_VZPL797KIG@:;949L=?bJ@kH=xK>ƒR@†TE‡QBŒTB˜WEV@VGœTEZF›[L\G•YE¦dOYD•XD™YI [HŸYF§dN¤fNŸ`N¤eP¨mU©eO¥_L¤[K°kP¤`L¬hQ¬jO¦`L«gM©dO§fP¨cOªkU¦cQ©eR®mXªeQ¬]K¦eN¬oW¥ubr`¦o]¦gU©hO§`P£\K¤_J¦fR[Mœ^N˜ZL˜YK–YLœZL›[O™\N˜YL\OfW’^V’cPsf…m„r[tjU~rX}nYo[Lr]P‹bO‘aO„VLŒVLYN‰UIŒWOVL‡SN’`Zl_‰_WWKQI{PN|XPiWSYQWcTSWMKTNRFHOH@DOJLECH@CE?96V:0oC3k;3vG@ŒTHUCM=‘WD‘XF˜YJOB™WC“WDZK›YL›]I˜]FŸ\MaP¦iT¡aQ [KŸZIbPfS§iS¨fO¤]L¨iM§eN©dP¨fQ«gN§`M¬iV­kP¤_N­gP¯jT®hSªkO¥aO¥^M¶nX´eUªcM²sV¬t^¢ub|]•ub•wi¡jU§aPeS›aR•YM_M¨fN _MœXK–VI’WK\NbP¢aNœgP”iYdWƒkOkbKniM„oPwmTxoStl\i^OpdUw_V‚VH{OH‹ZO†YN\K“[O‚QIƒUK~bS‡}wrgˆ\M‰RJ‹aN{_Qq`[eZWYNQ\PNWVXPPSIHQJJPB@J=AI879:7:;38ZTHzvbuy`ht]QaMMWS^lSekYglZfhM_WIaTMop]gm^R^MYc\}oXxSoiTfmb}m€ztojn}~–~•}k‰tbwoalr_bfcZf^\cW~x`•‰l‚h‰g‰noiVxtYrn_vr^‡hpngdl]kocnn_{t^ag]MZ[V`[gma‚€hqp^_`Y]fdenb[iaaol\gn_jjblpbg`[cc^da…wk‚sfrmbgjfhfcsnlssmqqrssykdqaYnebrbduhbxqk}qfui`vcUfWUiTTofWnn\hi]po_qmhuchqku…ÀÅ̉äêù̃æóÙặÚăñÙâñØáñ×ßïØàđØâñ×ßïØáđÙâñÙâñØáđÖ̃ïØáñ×àđ×àđÖßđÙâñØáñØáñ̉ÛïÖßñØáñ×àđ×àđ×àđÓƯđÖàñƠßñÙâñÔÜî×àđØáñÖßđØáñỠđÖàñÖßđc;,sB5mB9lA:~LBƒQ@{L;SCnTK^QLlb]EABAAEKKHrdZlO@sG;pF;vK<„Q?„TF‡UD~RG{OF‘fS˜YK`T’k`ZJ˜TD™YI–SD—WE“WCZH\M\K£^L˜`Q˜jP©jS¤]J©_FµtZ§cR¡\G¬gP©cM¦fN«kO¥]L§\N¤^M¥hV¥aPªfN¦_L§dQ¨fO¨dM¯jT®jU°kS®nX›rX•ƒeŒhya’wj£uitgœqc£obcW¤gQ\K–YKŸdP‘[M”VLaQ˜_RŸeT—bT˜dVaWvmRceIZYEVMA]WCUVESRH`ZFcWJiVOcSI…_WbQ•\R—]QYNSK‡]Wo\r^…rd|cR~bT‘_OhTb[pe`eXXd[\YUVFOR09E5@D…SFŒVJsF:IHC[WMTYOILG‡tmˆyoILF^XO‹†wqcZ\…vxrqxqrmglca\bf[LUNmjlcƒbmm[hhcc_W^`QjiaY^[Z^XAHHTTUyp_qmbgkZ^kSLVST`X`nXbm^pm]‰}l|zg|{ebd^bd\^af][_X_c\chxqouqh~wetl\kicif_ffdxmitslfjfWa\jlecc_FR_Z_aX_a`gs[du]eq^dsglvbjvObwQPh^TecWkZQjTPm\VqMUnNZqe`tdWreYh‹‡–•§—¡´ÁÉÚâèöáé÷àçôáçôáçôÚăñÛăñÙâñÚăñÙâñÜăñÚăñÛáđØáñØâñÙâñÙâñÙâñÙâñÙâñØâñØáñÙâñÙâñÛâñØáñÙâñÙâñÚâñØßï×̃ï×ÜîØßđØáđÓÛî…PCƒU?VF‹P>ŒVG\H”aQ”g^™vc–{`”q^™gQnWbT[IyI=vE{L;„MC…MDŒWHƒN>’UD˜XC˜XG”SFŸ^M \GZD]K§iU¦`K¥\F§_M©bL¤\L›XK«[KªaL£_L¥aO¥_J¥^L¨cN¤`JŸZE£\LYI£[E¢[K©cP¢YG§^M­fP¸qV¤uX–zbŒ}]sX‰w]ˆsbqX’rZ—eTŒiV„dR’eZ\P”VIVEZJœXJ™ZMœZL–YK’bJ“j[‹]TW@oeSkiLWYSGLBAD3_WL[KGaG?iNKMKGkOCrOFyc`|g]†meƒme”zˆol‡YQ„QJVJUJVLZN]R…QJULŒZMZVhZ”‚b“{fˆva€cWuUP}WPw_Wk^Wdd[U\SO[Jk|_euWtA6c:1c9/sD9S‡ND}JA‹PC”S?“YI˜SDXK™ZM\K¥cM]H¦^J¤\L¤]J¬aLŸZD[K ^M›WH”L=˜YI™ZF^L˜ZJ˜YLZMœ[KŸ[K¦\JŸZI¤]K§_L¨_M¯lW¬dM¬uV‚Z~qS„vV†sX…jSkY‘qZ‹hUiW_R`V]TSG‘UAQB“WJ™TD’UBTJ‘^H’]KŒUD€_JidHypNdaLMRJQVEZ\KUQB[PLTCDUI?PAA^FFdORbJKkFFvUL’cU‹a[{aWƒjb^WwRK|OH„KB…RHˆQJƒNH‡RI^P‘v\soOwiU}y]ƒlQaT]Ya[g_V]^XR\UGZP]iPWoQ9FCIYBNbIPULKMI5488:7FICBMILXCRPNxnn^L]WN~qmxxf^a]ZbZW_\XZQOSie`pYibVvjdaaWY^UupfV[QZ]Uig\lf[jgaffc`^W~eQ }dzdysZVbUO]TEWHO[U]bVfm`alafk`_k\Vd_ow`…„l•‚k˜€i”‚k”ƒrhmfgg]mk]je_sqcimefd^a\XW\^Tad\d`R[\lolrkfvjaWbbDScESjO^gWdlLZpGTfMQaMLiQMh\RgfYjbYjfYkeYq`TjeXkh[ihZihYkhZpeZihdsngv|udnˆly“ËĐăǻùßæó̃ăñÜâñ̃åóáåñÛáđßạ̊̃ạ̊̃ạ̈ÛăñÛáđÜâđÜâñÜăñÚăñÙâñÚâñÜáđÚâñÚăñØàđÙâñÙâñÙâñØàđØßđÙáđ×àđtP;hF1†T>{RE‡XGy_CvZCƒS:G;qC3tJ:†T@†XHQ>„WE‚P9‡Y6€R;lB4o?5wD6j>/qL6|H81E8;N2+a@>d=`WDaJ?tfM•|C¤v>—t:‘i4‘r9yA‘q=‹n;rBuP4W<‚N?€RD‡P>PE”RB“YF”XCœZF—[GZC ]FœZK¢[D¡XE¤`I_D¡[EYD•WD£ZK˜UB”TB–UE•W@’V@“TA’SB—TF•UF‘P?’WAŸZKXGVH—VDXG¢\L—UAL: aF—tY}V”†\‘a‚]ymNymO…wV„uXjRq\KrNA‡P?VG†O:wF:}F8}E7|K@€bMƒkL|rQ„zOqjFwoGvmIbYIm\TwgO{lKoaKKG8QL@@>8-'*;*/A01I55L80[;9Q58P9:T;:Z<9rID\MhWŒo`¥‡r·hĂ—jÊ¡q£djoQbiF\eJ{‚\~rR…tXx^NsOHuZL{RE€WMcS{hXukV`[MPNDI@@FA>B>;bVOŒ|m„vmvleuhXmcZiYO}f_ngg[Yk][Ÿ’yypoZUW\ZV^cVJTNKWSLVTxhc‘~h‚sƒo‰oye‰}c}`olWbhOfnVljUtl]loUVTIqcTkkV_lZen^hrXefYjgRIPGLSR]h^Zg[WdWJUNpo`‡v]†q^Œzg^cV_cZpsb|w^hd[JUXSUYOSZNV\ANS@QTGWVO\UFRZ@SZ6IYFX]KZd˜XB˜S>ŸZEŸ[G•YD‹S8N:PC™WH•WGˆS=‰T=“QA“WEˆRBTD…OAK;“UAWC—YF‘WG”V;“Q?”YA‘TB [F£_K¢[KœYH›pQ ‡X˜‹a€|RWŒ~[}xS?F1DE-jiM‚`acQ_YJu\IˆI:rD6l:.X2)a9*\<,vC;‰iOzQpnElf9heEjjHQS7=D3MF>‡gKtNueIhXGRA9Q@;HHNdUSs]ZwKCnG?]=7rIGqMNpKH{RJYMhS“g[•eN´c¡‹h‰c¸•goOQ[F[gG[ZByrY‚~\zqY…mTƒaUzVJrF@qKG~QMcQ„aT•aQ…[M\SWLyUGŒq\ˆxgwh`‚n^wm`yk~kbo]aUJ‰qm{u•|˜pm‡shpkek`U\[P@FI5BJ4?;ƒsf¢w{zg{xh…c’\„]†wXƒ{WklOijXofW_a_\b]ADN^OH„n_U_T9FBU`N`fRjdZRRKM\JKYPHXQVjVMaWRaTgj^um`ˆw`jgT>IGO[Lr\‰u_ldYib]INUHNX8FR0BJ7HPUIRD…K6‚L;‡SApK8K?~D9~C;}G<|G?xG:S>tK8ƒM>tH@vB<‚T5O;„RB•ZLŒUD“XB‡M?‘M>•SC¥eOaMœcO¡xV™ƒR”yN’xMkE˜rN‚rMpoGUT==B1go[myaYgLQ[FbZBtQIM3+J.(M7,G.%^IF`[RmqWir[YYC‚sMdc@UZADG;"$ $A8/kR=QE/WS:jUNkba{v|t{sh]}WK‡\MŸq]¥s`›eP•`N—cS’`KŒZDªwV‹`muRˆ‚RÁk†oQegO_ˆsU‹uZ‰€^Œve—l{k{nh]oTMqNKqOE_BEuMIxVN‹^T—aT‰aNŒoc|f„ma|k[tpawjxm]€l`dTP›…}²•‹›–~p€lVrfPvk]jeU@KO9BI%/:h_\˜ˆm{^‚z^|Y~vX€|^~qOxpQslNwlTRNM>?FWXPr\P’lR™v]\cTT^Kkw_lo[olW\\K@PR:GH,?C2AF9HM7BOT`PSVQqg^@BE*8>=JQ^iTccVohXd^UbedCQV+9F/>P%8F,8E;MW=IYLYXN^[=M^&?LBQcgkelmdfbjb_mVbgR^jXhrPUjSOiZWkTTbSL^WPgZVkOXpdcncWihXci[lbWdeXhdVhbVjfcrlftfWgdWggeuhp„¥±ĐTf‚DYt¤¶ăçó̃æóáæ̣̃ạ̈Üạ̈ßạ̊Ưâñßâñ̃ạ̈ÜâñÛáđàåñÜáđÛáđƯäñÛăñÛâñ̃ăñV:,QD4KB-SK<[H2qVumFxw;†w<€u6ug.vg/s_*T@"WG#qY+hW%N@!UP'{m8sg5cM*^I#rV,hN$aD*ˆS1‹S<—YEUCTGƒL@ƒJ@{H9tB;†SGvMD8R{J2‰N?‡Q=ˆS>…J?‹L=™^I™YKRD eNtV—tS—~ZkB¯{=¥rF¨xAc3“g;–|QuMcbNptYJT@?I32A2CD3d[LB((A$#@#!\=3gaU>I6GUJ2@3?E1eaKf]LCD2&4#!'&%=--S=4\G8fRE€[P˜hU‰]H™eP›cObOŸcR¤fP­pQ¢aN¦iW cO¡_P¢hU²]†YqpNŸ‰`ƒW€W~]weOl[NsjTw|\mlU€sc…cZ‹iY|p•qzj}iap^\w[VpJGsKJtNJ‡\S•{l‘yh|g^ng\wq^ojXa\Qr_Qvc\‚y …x‚q‰sRw`‚o]€rdvo[ag\gfZ6=D^VR˜ˆdz{bqtYˆ|`€vVtSzSthOqhPZVEGMEHPSEHIq_[~iS\aVVaLxz_pq[GSFKTAHVQTiOVbT;NG1FF>LCOZThn`\]UWQNJHD(2;,7?2=HELNdgRUZTeqd\n\?NO:EE4GN)9P,@K?KR=;?:"#PTDcj[RVT…ZL¥_M¥bMbN­jS«kP§gTµoX®jU«cM­fS¯kR´nV©dSªdN§dP°iR¦bP«wV‹yZxyU±”i”~T“{ZwkPprYup[goRjrQfiLnnOzpVy^SsNI{XO‡eZsh“|j—‚l”td~g]yc\„nY‚m€k`vh_}s`tr\geQVZO@>:G>9o_UnbT_WQ}jP†ub†s_odPleQkjXsgTwlTƒza‡…bqsY„U‡€Z‰uS{iSugObWKtmO]XKKOF\]]`_dagXfmVJZMN[GemR`eI@SD>LDBODj{U{„b]hN^k][pYTbL]i]QSW\WOWYL%3C,8>'07FKOtkR|~cdr\YeZbpabqbQb`4DUDMN`cYqmbCNX.>N?OWR_Z\a^S\eLYXM\\[b`U_m?WbJZfYUgVTgWYkWSgTNeXSf^XfVUbPOcSMb[OcZ[gWbr[dmfiq_bpFVq]Wmv^iucon_pk]ki`rkp‡_o™¦Ăˆ•²ÀÆÛ́đưàạ̈áåñßăñßâđƯáđ̃ạ̊ÛáđƯăñÜâñßâđÚàïàăđÜáđÚàïI;5k\SMM532(MP9zeGxHnm5}v8G?Z@mU$P4/1%m[I”uY„ˆnbhQIL4eWC§kV¼x^Á{`¸v\¹pZ¬dPµgS³cP²lS®iT¶pS¶pW´iR¶iP»vZºuX¶iO´pN¡hKz^C‡]¶“d€_pzXhmQprVpy^enN^[ANS:_X=?62W88qB?NI€RH{WO‚`Y…aPˆeU‰tgŒya~sec]XsoaipYV[X\_PbbLLD9UWRxrV‡~g†iinbamTUgcVgXVhY9LGvqawxayw_hkcY`Y?ISKYYAN\NY[DT_KZ_JUbP\`CV[8H[?FXLL[VTheaj`\dWRdYPb\UeWTeRQ\YR_^`c[fiblkmnj`hm_hkrmt…lp‹oljkr]p|bmj[iPXpIWm6IeHYt™¢³È̀ăÓÙî̃ạ̈̃äñƯáđáæ̣âæóäêöæë÷̃åôßçôâèơßạ̈Ưßï-)<7-^^EQS>J<4;-LP5pmTreDlmRhsW[`DtmKggMktR`SA’ZG `P¥bN¶qX²mO§cL±cM®iW¬bPªZL¬hPºuU½uW¿oWºoR¾u\Äw]Ɔ]»ƒa©€Z™rQ{`IP;hdGruZU[AY[@AM7GQCBJC372525D20Y84K66R52d;3sFEzTLwPEzPLyXS`U…ZP^N•kV—s\v_›}e£‡z¢‚‡~y{v\viUe^PZRGD@8MO>meMl`OUMFDEQQwK~sDodAVP:;4&,!8(#v;/•P7„N7]H’iOŒlMfMr_EjZFpX>t_9w[,sP)b,”g1xW&o3sR-M>%UN5k^B^RmmRisWfhNdp[]kU]dKa_Li_EƒT<®iS·lR«_N®fI¯eM¬hO­`N§\L¡ZF­fM«iP¯dN±bM¾uXÀoYĂw\ĂxWÆ{]ÅŒcÊm¹’u‘hTŸ‚azq[HD7J?PLGZ?:W62T23W85_=:];?l@BpJFpO@QM‰TLyQI{XQ…aW†`V\OgT›iRœkW—o`|mˆo…wf†zh{i\laTp_IaTIAG?-6-RVMmhUroKdU@qbPf[C>=5TKDg\IqcLf\PIOALNHbWLbXMZ[E8I8AB@LBL`SKZK*3%3BUMRbWbhWcjVluWupZkkOaeShn_ajTfiRfgMhj[\gQbk]XaS`h^fm``h`ZbZT]dimnWe\"ja/vg7RE"bX*a_)SO$VD*ie4gY(r]/k[+k_/ZO$RG92!&&--99"13:7/+4,+)I=+s]*\M.w`6n]6ƒn@|a4VA)HA%D;#J8I<'_K'nV3kfKO[E7<,/8%8@95<2GI;/7$ER?gvZdkUgX=f[HZX>ML3?6,U=µkSgT‹m`kY˜nT£bM«bN²hO­eJ¤UF¦`M­dHªeL±eNĂrPĂiO½gQÂhQ̀‚aÇ~[É…hÊs¼–vŸ†o~jbM7-WC5K=: $*54,^PD^RNX<6a<7kBhC3tJ>iC?rLC–jWhW™~^¤•m†f€a¦‰q›f†cV‘ePUG‚UKƒZKcOˆf[tjzoŒ|rkdZ?AB>>B]YV[ROcXL€oW‹sRxeHkdGLHC`WKubFfTE:?3CE?864.48:EF7CBAPK1<9-:6F_FVfN]gTEMD/9BALN/7.&,NYJ\dNahUYdTQXKNTHuvX_kVJSKBIGln[ssWS]KDLE>RO2A=RSQLTVDSUPSQbfdljeS[Y/9C3ALATM9MV=NK7MN;EKZe[QUN[_aFM^Q\Y_gZMST^X]gUa[YaLZaL\YM\XCST5DD8KURa[GX[BNSQ[Rce[vh[ph_U`dJY[NXWN\[SZVR\[Wf\Udcglrkil’¦§Ç“¯@YkJ\nZhuM_nTcqF\lNckMciD9)G3"VI&[W1FAl`,^Y([[,H<RP$gY*[S%UO$jc,YM%RG!j['ZS%99?GKP(8B#@L$=B"IK&<8@4D>0[J8eO^WEd_?SV?OU7QS:NN6ORYSDziJYQAUPBZN?KC?254764B:8WKKPYHZjSPbR?[L=RI@JE7??!*0"(=FFOYMKPDJM@_dSqpX_cR^bSJHHENClvViu]\dRafPcjUjmWjvWTaK$21+65?BGMIDKS_[Upifmg_[d[]`T\SOKPO;DK3?J3BC?FO]b]MVRLTSKYX[a^IOLBJN\W^mU^lW[[aaSbXEP_CXZ9OLFXQM[W9HL;HLIWXKY[][Vihj\gbM]\GTWGURK]]IVU?LUT`Ynthts^lj`imr\kxH_hRevH]lIaeRihOafJ]mG\dD4"M@,OI&I?I>U> T>"Q7 Z5"^L*YI&UO%kb3HH%#$!C:N@<6eU(=;"*6>%''(13'WI5’mF]B…_CvU;qT6‰];gOœjN¦fF¥jJqS‰yL€pHxpJvqGodDfeA_cDkdO_[;MO7MK3KQ1=D*FG1GH1DF1TW4GF*LH*gV)>/dF!jM(qS%+'F=&dU@LH2JG4E=+ZG+eW-A9PCbT+dV/p^9h\@_WC]YAh_RmdNcdM]YLFMC_dIMXAT^JVYDwkLƒ~_‚uWT[D^U?gM7d\BTR;a]IKJ8@D3=/)­jT»tX´vV¤hO²nV³pV»|`³‡g´iª}^Ÿz_ª~_¥u[¾}bÅ_À€a¶a±„i^n]¬jX¦aL¡eQ–`QRCœZH‰T?XB’S=ŸhV£jY­‚b­h©Œg~a¤`¡yX§_{Z¯†gª‡gxjPwwX€sZ’bQ•_UWKZP~UO]Q‡ZSf\m`‹i_zo•u‰xquida\O†qW]R?DA:C85A87530034R@=x[MsdQS]LF]D7HCM]JL[M?HF@HI8@EBHGLTIPZOtuXloUsu_bhP^aLlpTqzam{TcqRWbRY_Iw€gozY`gURWU6BD+:98DJIR\WZpfda[^X]XdidZUSjQRcQ]hVVcRT`LMdRLi]\d`]TXZ^hXNUSDOG>GKNNVlUXnV\d]bNYV=IM6AG9JQ>NM6@?=FI8CF4CH7DLPWVY_[=UPBS\CWVGZWL^bHXUFUXNZPKUKRaXU]YdcYS[]R[^WfmXjnUdhLagK`pTinIYk0,61 \R-\S+^R'nT,iM+u[,fM*S>"A4kV(XO!?772B=:3KD#KF#OI"G691=<,0   ]H0”h;›n3Œ[1ƒ\5|U3™hHrL9h@+‰\;‹X=ŒhK„~QzrKvuI|vIrkCngFc`C]]?XT:SO4RS9HH1@?,:;%LJ2LC,9>(CH+48#/629<,lR lO#qS)@949%TR8KK.NN/TN.FE*NB&QB]O$|lBkZ=vkFvlPb]IWP;]S=pgOukTymPobN—wZkdNc[=WO4KL7f_Dc]DIH3E>-I7'V?0bP9dO8[O8hYHV?5T7&­hQ´oX¹vY¯wY®b¤y\©‰d¤€]˜xVyYqPoOlO£oS¯}b®‡i±‹t«„r£wgs`›pX¥t^¢zc§~f¦ƒfz`xW¦w_£qY£xb{dz^¤}e¦ƒe«c¢~\pWŸ^—wXwX‘sQgKreJhTH”ZM˜]O¢gV”_R„UMƒSLPLˆXPaS’jWp\˜we¥…m”|p™‡v“€oxh]paY}`Z}eVgMEYDAiRHvVK}\PlTIYUBOUGP[HIOEHPNYZSRSIHIF9@CKPJyu[rmWikO_cPJP9joVx€\puTajRT_NLWGoy\gvZVgWTdW@PH#/>?CJJMSYUUzoiwomje_af\[UTeNRcLXdOVmVZpOUoOTiVXdZXVXVHJHFHMFNSKLNCFPQHP\NQ^[UIZWCY]?ML>NPSW?LML^R@QQUNOD>8QI&ID?AgJ(jF,pL5_E1N:#<0ˆ[0«q4„b8yW6sN*nI,fI*cN/xS2‰e:}i<†kAt`9n\;hT2dgGh^?rW6raH[XAJG0PO3CF647)LD3_R:VL6.1#=?(::&8;, ;=fU"yi/n+ZE%*3 DJ0EG.OQ69=-JK7[[@-3!$*a`@shLYU:rgHVU;ZW=@B-DD,VY@QVPGA‘eP‹lTfZHd^EeZIbVI€cP©rV¥^J°xW£ƒXƒX‘{SSˆxNuQ”xR|jGp\Ar`C‹bI˜vX~_hN–s\…nYœv\qYŒr\•s\“rZ™q[oQy]—~`‘€^„tW‚y]…{XxuY‰watcLŒrU€lRoVqX…pX“pX“sU‡jITN;‹]P“YM£eS›\O£cN\K“ZM”lWœ„j‘{auX†mRya“^‚nQ‡hZŒn\n_–oh˜ymxp€g^aPQ]KEuRI‹c[pf”vh€k^q]Ui_T]WPdXUdZPgNFbSHmmQqmSohLZdOFJ@uzVsxYuyWv}YkZbqU`kOYhPWhOet`4BA".:;DNKPj[\m_`e\_of[jifUNVSDIfMVcHMlOOiOQaDKhPRiXYeYXMKYPHG]YYZUWMDSJAIRMSPVQDPQCOH;GH9LLGSN`]Z_[PbdSBLO9IR5CIeqgxvO[Y2@F>MI3EF:MK>SRG`NEZU%dS,cO.dO*G8![A'rM#L:"z]+iX(?=?9a[.FEME/,!! 6,a@S7jJ&sL.wR/oI&‚U$˜i+‹a*}V){V%œj=[.wQ+}[1w\4}a7pY6z`9]P2oX7wc@k`>YZ@_Y6[S8\S;JH0SK6HE0:8#JG1RJ2KF3=@%IL1@A$:A%23\F"y\-fT'iM$L= "/=D.QV>MM4AG-S[;)-34ZW2tpLjdHd`@\\ADF,XW=LK/FG158,&0;*IO7NP6R^E[YCzlRRQ>i^HkjQIK@LP:>C7CA9~jRlUCi\LggS;H/EF6…cP­jP°|X“„Z’V–Z…rS†wLuNˆwLoMxiGwjGnP›}^sU…pR‚kOpRrUq]L…jO~dO€dNu\NpVK~hR}eLjVC_R9kdC{qPzsTlbJj\FuTu]€jPm[H‘x[‘oW„cKkPMA6wRC—[O_McV cS¤`PŸfQ¥|b™wf‰t_‰tUseO{t_‘ƒa‹mX‹oWqX˜oV~UH}VK¡m`œth•xo}j^|g^gUNŒf[•iV‘dVoUjYmYT]ROcSMpFB‹m\sqZigQgfOfeOCK>iqRgpXu}[hqR`oQ_mVcmVFWFIZIR`S@NK'.2'1=WU\‹xn}l`rf\j\TVPLGCKNAMcQTZAHXJKUJOUDG_LMgSPZHLXJOfVYpZ_gUWdSU^QRmSNfKJIBE8@E0>9.ANIKL“pT§ƒ^¦~Z—zYxq\c`PtzeymZjTCSW>MK1>@?SI=OO6LI?XK0^R+ha:jW7fT6–y>›z5z:vh2w`0kV/z^0ƒq4rb*VK64 =&L5c@wR.gK&{Q)‘f2…TnR)mP&J8K2_G"‚Y&^;\B"VB&XI(ZB!aO,\L/pZ3VT0QT7QQ=SN4ZO;OT8BE.<7&FD&&ED&9=)bG!wS'uO'*'PJ'9849 UO:OJ3C@/[^@-1 &hhGmkKfcCb[>_]=*]V;;A,NT@UYHEN:EM:KN9DK1WN6[D3NH9YePUaR]f[PXJ@H:8:/iNºƒ^¤|V•€UnM‹xU}gEqN“RyW‚mTlY>l\B€nPrVxiHh`JbYBh`JhcGseP‚dOxgHcYDfWBt^?v^OqXDhM=nYKVL8_ZAYˆtTwUrSwiMeZGkX=ˆnO„nN…jPt\JD=:99?78>gd]‰sj~j]_WQQNNta]ve`kX[g^€la}^YlKMpZX’xokcz^VlNRr`cn]]fTXhNRTJToXVpVQcXtg^jbY~oQ–sQœxTrRuQ—wU§€\¥ƒe§k­†isX\kT5LM2EL@1F;,a\JLWAFT:TM:dXChY>SK:mcG~lKo]FfK|aI‘nR…pRn\Hw\HgNAuLE‹^R¤fS™cS¢hV§mZ­{f¡i}_‹x\ƒbœ{YŸƒb wX‘rW–wX’sU¨uZ«xcva‹`R‹VI¨gRdT™hWyltsi]mYS„cX›vg•hX|ZO{^TrXusRghPefRlgSPQGdfJ^`JltU^fJ`gSm{VdgTŸq]“aQ’h\~]QsRNjWKˆq_pezi`r^Zg]of“p`Ÿyg¢‘t iyc‹kn‘|j‚k†ykydnY[[RSTPMd\bqZ^t\Y‡x}zd`Œxcm¢‹d£c›wTˆkI‰jP‘xX“lN’mLrLwcF‡mT”tR€pU^hcPcV?PGa`N‚X‡ZS–„YT‹OyOyJ•†SqfHxlBviE~mJ~sSŸr:™o2‘i2¯ˆBŒv2q.kUs!•q-q\'^Nyg(mY$vZ#_RIE?5P>dD${V1V0„Z.x^7r;†ZtO^K!XDM5[D}_+_D'8/?7302*:2E:aS1ZN/LE#`O,TN/]W7VX:@I,LQ1HH+>G(WT>HE-TT4GL19;(@@*OK1RR8><&XI$t]/pQ#>5nY(\E!45 VU;TR7FQ6+:#CI2}xVnqMXY;c\@^^@YU=QN/JP.DF-66')'=>)VV:EC28@.%.#'17(=8%40#19.HN4fP9[XLG8eU=GB)./*KB5]V?tbLteC…lL|eMfIoXAhU@TF8C=9J@4wPC cQ„[G‘aR§…g¨’m”„k‘„e“€cŸ}Z¦}_˜wW‘pU¡yXkReR’lW sZ¨{_¥}apb¤kZ«q]¢q\®‡r³‘„—zq“te„k\vXTˆkWtdƒoZsrVkhRhdJ][FLN<”w¨“|~^flQovTksWSaKnfS‰cX˜g\–aY¤q_œkY„_P„`S‚`S“g[£zmzl‘rg{cW‹phŒzbokZ‚rd—m†dtn_|^T‚XScTSXSWobbtcdkRUvWTqh’~e c­Œb…b¡|WƒmR}hK†mB„kI‰fG‹eFmSœ~Y„oR|cO‰rW†}_ffS{xT…R†PsvRunB‹uH†{JnfDvjIxk:mc?ZYAujBj\Dg`G u,ª3¦z)¦z2n%o,G8?2aNv[&^IC?c\!VMbKTF=4@5YD ˜i2…a3•zG€b8ƒ`1~^%WAUA lR#hEnM#aKA/^FgL"4,1*A7MJ%KM'WZ4IK'EB'JH1OL&GJ0IA(07 AK0AH.BE.SE-EA.EB/>@-EC)28"@@4<9)AB/88OO%LN&xc,`S%-*PT7xtO[Z@TS6giAvuL^cIec;ihGe_FKK2SS3>B**1#CB3QH3IH.[\8LI1!#.)&`R7UC,BK=GO:.9$14(_WD“yXªŒ]Ÿ‡a¤‰e•Y|M“€UzO{R†pG”€PvN{gJuZviM{pQ}jO{kJqcCf[AukOZU:XN;fU=j\DEE0N@/s_JzeHlYESI8NF;KIeRDkXB‰iV“uZ…fJ™lUœoY¦…k—„f“~[}tT€xZvkQ€mT¦~`£€a¢|Z—qQmPnUx`H{`Hy^DŸ„g©h¡‚k¢wcŸkW–lXªc¼™†±–‹‚eY}g]•w`€g€vZyqQiiOigQeaPpkY™€q˜„o…}gmtR`lJFO!XX0]R3RK1F/GJ3JK1GP/39&-3%/2$7@+15(BF6$*$%%23"!)-*,%!kR7œ„\¢‰[—…Z|R‰yQ›QŒzL‡zK{L‚vM‘]yWŒyUxXˆzXwqPsfD]S;a\:ifIc]?\T9^UCcaK[Y>HD6I=1t`DoaDfVBQG8SI;971/0(::+m\FfU>n_@eR9><0f^>`[CyhK|hLWL6}iJy_J~aIœw\t[‡mXzf’|dŒ‚c|y[tiKshM£_§€b•vX¡_˜x]€iPœyYz`HJF7TG5oWF™w]„d­j©ˆf”jX›ybƒgª”sº¥»¤‰vc{l[ƒo]Œ|\ƒw[xqTynWjdUx{XwyWrpVˆ…bquYnwUNY@2=5_\M–kY“_O\Q”]X—[N”i^oe¢xk¨{j­yeŸgY“lZuch]dZ£la­oZ©v_}dVmYSvVRYR™aU¥p_dY{_VˆiZ„h•~f™~`Ÿ‚]‚W–{RuStTˆ`D‰gJiIxgJ˜}PuQw\>ƒlMyZ¡€\†lQ‚pVˆWomIY^I}zL•‡Vˆ‚NvoLwmFˆ~R™†P™PƒJ}MuFuiATFMEkU$]QePyk(ti*}p,{]!pa"Œo#n[$4/\GE<ZHfW!yf cRN;dIxW)kQ!^KvT#lR#RGTB7/-&/)0)# @-U:@.5.H;[O(WT-LR)]`0NP&7;$5>) ,(/@A(@B-@G1O[=S\9?B(@?%KL2CE3=A+59!@D aOdM"kR&WP216"UN,LP4T]@_bBcgDOW3DL,AF125GP3BF--1$@F2\]=5<%/:=)DH1"(,8!!* )+!AB0#8* ENJFQENF5w^AƒqG‡X~N{c>xk?˜…V“ƒSƒwGsL{qNmbAfeJc\?^P;^X=pdDhcEKL9OQ;XZ=XV:`\CAE0A@)76(41&\L;pXAq_DZR@FB0;5)D<3?>121'27/;<'H?2A7($(43(SC7\VBeU>gXgJ=fT™u^›‚b†`’|\‹{by]^v\œ‚f’w[yX‚kO{fNƒqS\VEh[AlZDq[GzbKœtX“u\£e¥†k®†h}jyg–{]‚i·|wm}`KŒs`{mYƒ|Z…_tqTl]@}rVzVddJ‡fnuZ_gCY^I]iQfQ¦jY§hV”cV˜j]`Z¡}l«sb¥k\¨se±yg¯u_¯ua´wb°ud¡lX§oS©eQ§hT¬s_®xg­va«r]¨l]¬pX¬tdŸr`—„j™d™|a †b¢^œWwlMqN|dKfY;h`C`Y5^I-, 45cS!/,D:YJU@IEl_$XH#''&ZP*NM,GF(IP-3:!A@*;:--*..8!>F)TV7LQ3CG*ZS3VO6HJ2IH+QM%ie)tZ SG I=J>$'87SY@hgAZbAEI0LP1XeA19%$-PO/MH2RV9\];>B..3":<+>H/-5$"'RP59;+IG5#&%=H8kmN~sP…XƒxMˆxS|uGgb7aT2shBuOˆsGpl?zsNUT2OQ6ZW7SW†sNqHa^7zpHz2{d&{p#d[h_-BC54SFB?HG>; aO”~1fT"90 i%—v+SA -  % "% ?6mU!WObN#\I{[!gOfT!‰h-cH#iEdA8*(!WD hT3ID0>;"7,6241;=$33&.)1 ;=&RN556&?@+?F+\[+_[(sk2i]%_Rne0)(=/ #&-/II1PV=__4JU2*4'13[Y7UP6[Y7bZ:X\?UU3UQ6>E126"76 TT:6?%17# - :8'PP7990 $"bP-ƒsJuoEyzKnlJOT4XR.i^=‹uK–[WV;da?qtQfjOgmLLV>CI3R\BSU9^aEKT7JQ;`hL[_?JI2;7&PA+iXCgZ@VK5KA+fXCt_KcRCA<0.1)MRBPL7TG9HF4?8&%&'$&!(&53*SJ3TC4QC5qM¡ˆ`¥‚dœw_}wQroOffJ}zV€[acJmaGqUuP…y[’}VxdK}dP‰pS”zWˆrN`WBcYClM˜t[¡†`Ÿˆgªƒ^©€a­k‚dŒy]›v\©tµ}’†dkgDvoM‡ct‚agxVqx_p}Yt{VdkNHT@WYD™pXªgR¡cT¢bQ£r`·g¯oYªlW¢iXœn]œaW•gXŸhV³€e‘t¼ˆfº†o¬r^¦iW¦gO«nY¬o[®mZªo[¨jV¨oa«q]£y[–€a€d‡€^{YelR‘†[~R„tPmhGupL[V9sPxR—Y•~RŒyS§–d¯—fµ–Y±£i¤–[µ¡kÁ¨h¤’`‹{R¬^„]¶“c­]ƒvM…}MvjBypA|j;b[8ypERJh]!]YWT ^\#85 //#0*A>  ! PL:5G:9-fQjX`SF4I85*>5<0--4-H?!`(„YtXK8sR(wV"T9W;O=aE$3-9*fT-`X=nZ:eB)503.ZN.1/&$%'15 @@&;5RQ-mc2(`S@„~YƒxY‰b–o¢h–ˆ`v[~Z–|ZƒkOuY~mLsfKvgKjcJdZAVH:gVDyhM†pOkL—{X{\®„dÉ–mÆ‘fÆ“a¹l«”n©ƒkpZ§‡q¥i|qL•ƒdkfvQUdJixUjxX_oSeqU[U=eO@ŸdR”[NœaU§mZ¬jSªgR¤^K‡[Q“{g—r“ƒh—va»‘mÓ´yÖ¸vʱyÉ­t¸—lœlYaV¥ue¢p]¢qa qa¡te¥~j…q`tcU’{a“ƒa„{TekWrpL¡…]“vOrlL`_CukIm`?neG‚oQ„uR‡sM|O¨—eœŒU€wGŒ‹U”\­™a~MR‚yL¢—^ŸW˜‹\©‰W·•\½™X§‡U’yJrfAZY5mjAYS%g\,NI hb*ee&SRKP36AAABEF^U#J@pZ"G?[Mt^"ob#TI‰h$’k+”t){c"‚[!eJH@eO fX(Q@_JN=`B`IE13$E+U6J2?,E3=973LK+>5.,-1 $&$)(30kU/rd6vi5gb'w`'M?qb%zi(]Iƒh*TF&20D=&;2"hT0kh@}xRooMW\?WT7uqCZa>ekBY_=SU3FM4WY:5>!")"*+2 &-,3!+2"" %,#*0%5<0!  -  B6&vhGspKmlDxsDvvN}{TujCzsDuhC„T[X8WS9qkHuoP_^BSS75A/'/'5<*8>,3<'7<)cdD_dG`_@IA+$#WH5iW8qbGoeF]U?MI`bCd`:rK€qG}L¨“\®Z©’VvM…xJ}Rmh.ok6[Y%\["fe%MN:=EH:=XVPOrb$l\%w\ qc#68LP"RZ*=3”v1„l+XG6.00D=KF=8^OD:@6$%<1E<5,0%7-) 9)8&#1.,-=@+?D$75-5GE$=?! (, ,-MCje1nn6lg-^Y(\Mpd)UHwe2vl8pi5f_2ie<<9 WP/[]:qiBvvHgkD^[;{wN`Y?d_>jgEdeEU]8Z_9RQ0!*2AC)[Q1ZY7LH10/"#!&),'37(=?7*,& IJ0f_9feA{vKpqELV2\\<ƒrI‘U‰‚U}ItoCa`7]]9ZZBAJ1:D+?B-fh>srQnpOhkHb^?QL9LI2CC/LG/33'"E>0ML4II5[S9HE.LG4ZSAUO?J?-88)US877'!'&'//92]jQgqTU]ConOv~W{vRƒtQ…VxnV{oPnhF‹yS‰pUmbM`[BvbHv[F—|^…qU~uTmeKbV@›„RªœT£ˆL†GŒ‰L{tCngS`f]ryfxxe®´¡†h‡ˆsbqRXfN\iPI^D”„Xd[d`Nx\N{cT–„n®ƒÇ¯¤œ†}‡†zƒ›}™s–‹l¬£„¦‚”t¤–[¢™`«¦m£œf“]Y®›…¤—•µ¤ˆ£˜c”V§]—ˆf•‡c§‹d›…`…€[„Z™’aŒV‰Y†xS–‚ZWƒ~T|ƒ_q€]`iE{pW‘b©”]™W¡”]’V±¡b‰€T‰ƒUVX6[ZBXS8kjC—ˆ]‘zP¢‰X~uKrnA„zI‹S¨V£‡_^b-hd-=B58>AB>=7<95:i`"l_aP VX"lb'rk(?>w|Djm9{n*RF8/ZJ#^PAAHGSL!(1222&'  )( &&%(#'"!" .")%2/5,JC 14BC;?/2@F&#'&-()0`^-jv=um6oc2ib&qf/PL!IF e^-NQ'MK'TR*LO(8;$RS6Y`7ƒtN„uRpmDkiEkj@OR1LF+DJ6MX7RX>ST5FF/01 IM'SR7?@(PX55:$)/ "! '+% &*/%  -   "!_c:clHbh@de?qhD~vG‹€R|Sde=kj?QU@T[?P\@FO2@K0\kLLX88@*CP?CJ4/9'.8$5=',3(68'A;%_V>j]BXO:aX6FC,MH3`Z=FJ6#)&-@BLK]PYLSQj\!XTl^&ji,rq0f`"++(.BEfW%SN!aXQF -  '(,0 !)+%( ;..($  #<2+- '"8:"@D"-0  26DICK"fX&}l0cQWR$UR(ZY.db5X\054AA'OO0ID)HE*ni@wuN‹{PsJ€kFsKWP5RQ6EJ.IS6W]>AE(#*;>(FM00:)#+'0*#)-#   - *+8?(E@&ƒyJ~{KszM…Y¢‘dyxLrkEosKpzVcpS:F&DQ8=H0'(NO7VZF>C1Z[@JP0AD346(JD4[T7SJ531!?4(J@3H@3RM7F?-?7+JR<\Z=GI9  '!# %/!RUa[;ed>X[8ˆ€V‘[sw@liIwtD`fA^cA~{JefC}C|{Isc@„qORQ$HMPU+HN%@F 7ABB!JB"SN#34%+VPeW[R7=ZZ#db&aZJ=-1.013$%+" ?@#(    - ))$$ -3!$  !%*"%2/3)54NO-*.CB'8=46'' - !AC =>" dZ"~w7aU ld6rf=xj8v=YQ.cf?cf<[[-ZY1JL(UQ*smEyQdXteItfLm`HHC1/0#))$)#  "&AF0svR‰|ZzXtzRfpQX^K|qQ„lLxgIrhNWV?_aC]c?uiFCH2'0)-1!MI5QR@lgEueDNW9clFXaCflS£kY¶QE¼véÛÙëêôë́÷éäëĐÏ̃½´ºÓÆǬœ¡¥›’•™”˜“o¤™q³£l° e½¨cʱeؼq¾£¬—Y`M=L7TYJwr[^_Jko`¸£z½£}`aNjtVhq[kg^Ä»ÊÓÉ×®›§”l¦l’Œd{tN–‚¯¡¢˜‹…|oe~f—ŒglkB’‚P†vNmkC‡\~}]lqMcf?†Y}~TfkK‡…X„€J}rN…|K—ˆU’Y‚_md@œ’Y¥—W’‹SvJde:em?|zM‘‘Z–YLˆ~J¢Z YUU&YX'SS$QT&13?Bba/QJ&05./;4MK*GD GB), MK"RR k`%aY'5,3(  '.2<+0   - $"     - TK VK!%!_W6zsFfe9]Z,B@!WI,LE&&-%/$.+,+7C(($! #   - -  - - - #ccA5spQtiJzqO†W”gƒa|xYccB.0;=-~|YzSbaITP<(,#/7(``DsfJmdGc^DhcHbdMibIBJ?ZH8w8:B<GGAB #5.]W&WR)F@ TM5.!# +* -;:)0  - - %+GC-/ ',%$$)*  - 8<83aY0QK$@B %&,.QP+}qAQO+C@*41/2")-#  -.ic0kk3ab0kq@SX-HJOU,CB$::'(,ac;{vLsoJII,fdFI003#&2!'  -   -  -  - +07YV3ywMW]5af>vxMYZBSZCNZ>Q\?O^DV^EgmBUZ9ikIfdELU>KZ>4A1HS:,4$"65%IC261#dV:_T6^TBbZ@TK7;>)<9$66$.)*,)0''+"!!$# !(3/ ?:'02&16(W]=MU>KN2€}NzUƒ`‡}UnoD;C3@C/‡]kfI:H+/5,+5+$-!;?,]bJ[]?OO83=/BROF%JH37:;9:.,&'  ,:DE*3  #," ,7#){i#j\~f(|e,>3   &)^U.US%HH ML"kb3ACI?LK+"% (0 -  - "% SU%NP)TX+]d4DJ%"(1:>G'39,-NT9r}QR[5VY0ED#WR4dc;ka=[S8>C&okATM36:8B'09!#"=B(IJ-CC(37'   - - - -.2AB%ag@EN-uwK{wO|sMokCceMdjMcfJfmK`hIJX&)+kkHsuY>A1.7&$3(2A,GD-qnP`]D]Q=:B.).):;+-8/)2-!+*)-'‰nBÍ©fª‘N©–Y§ˆJ¤Œhçâæîëđîääíëộïôɹ±ăßèÄ·²txP„‰V”–^ƒRœŸ^££`¥¢U“‘XtwUfbH}oc‹eƒƒc^jNmhK†U‹qOgG;{eU}]€}V^eLiqL_jGprH”xYpW@ŒsX¶—u³Ÿ€¶‡¸¡¹ƒ·›„º É‰ÈrÏØŸyȇjËuΖo¯•`—‡T‹zNqjIlgAkc>‚„N‰„SuvFNY4LY5€‡P“Y•‰Sfb8ng9‡KYZ68;(hc6~‚D‡G‰I—Vxs4j_1ZY(?::<IEXZ/GERX)EF!:8,43<'$ -    -(,!% !>@^Y!‹p*£…4q'bSIB)"      55][-?<HA VT,,/''.5  ! -   & $']c3[b2\X.:=!1> )229%>A,LF+ipF`gAPX:SX8@C*5;%?B"lgneDhdH;C.CF3ACA"**%/,#!,1-lkL¦^~PsuQŒ€QqmS›‹u¯¾´´¦¾«’º ̀® Ÿ“Œd±Ÿ‚´¡…¥s¨¢}¢œ|–’m¢”o¬œ|²Ÿ}£˜‰œ›‰““~–’|z]kbIxhZ›†u–r€…k’’zˆˆp…ƒjˆ„n¬”ƒ•†n}pa‘…c Œm©”s´‘i®’n¦nµ“q‰pÄaÅu]Â~f°}_´“u·£~ …f¥ƒb£Œb‡~W¥–k¨•b„SŒƒQopF¢™]‹ŒU‘’S¥œ\fn;gl:²¥c¤_\[2LG0PK)bm:˜–[™ˆXrsEjc7HG<>,0:5/,LS(=B").01//(,*/ $&AA $ $$ !& ''LF{h%}h+\SULLJ "   /2 &)-YV,MJ%>BGL#-/      &&:6  -35Ya1sr;:>"14,/' ),^_5Y^9JQ-MP0kj?tiB[S.0/ZX4nkC\W5TL.>='MG'QO1LT@CB)AF.KP2LL2--! HF.YS3^]847&((,#9=1"!%,.$)!   $+2>% )[^=t{X`iJ^g=acBOL-†S=¢rN£qT¥\°c¨‰l¦o£‹oŒb|^uV|ZrfG_tiLX[EN[9^gFMS<:>)HL68=.'-%.0*16.-3%.32HJArmV†}l‰rƒlœp‰…r›‘x¢•„§—‡§–zª™„¨ƒ¨™¨–€¯ˆº¦˜Î³¨Ä­•¼¡Æ­¼«’¾­•»©«¢‡¿®–¯˜¹«³©†µ¦·¡‚´“u¤_§d«†k¯“t«i¶Ÿ…¬›ˆ®—‚µ•‚µ“¹¥™®‚„_£–‰µ£½¢—¿¥™¾­£¾›†¸•‡°zxe¥‹u»£—½¡–®¡™—ˆl¡jb•jŸ˜c–‹\¢•`‹†OqjG£—_ŒP|H†J‰‡OvyD«”Z›‰QwL¾¡aŒJ‹M–’Xœ‰Qª–X&-  % - -!+3   -   - '- !' -&+ APcc,XV(UQQI35 -23   HC -.EE+%#a^1s{?CI =<).$'HG68  \O%YN#HD#JH!43 AF SS#Y[*Y[15;MH$7aV+QJ,BA+GD.$%&(KO689"C@!ƒzGga8fa7tlATO5:?'9:""$%#$  -7%>K,kiGhrQV^>@M4!$"$5;%#(PV;&?@/psR[\G-4%12'AD08E2@G6ZbG“a«œk¨œv©¢w¬¢q¯§w¯£y·¨{µ¤|º§~³ €¼¢¼¦ˆ¾ªŒ®¨†¿²Á¢²“l®—r´|¼Ÿ~¹¡ƒ³¨ˆÀ´‹µ¬„µªw³©x³©¹«€µ¦u¬œo¯¡v±q±s¯m®•h¶—g®‘fª^«S¤qO•oL‹|R‘Z€|T„z[Œƒc‘‚b³˜…³’zvWœw[~\~W†rR¬”‚Á¨›±–}¦‘x¥›o”[|R”†]œV–‹X’ˆT¢™b£™]“ˆG|‚Lrs=zC•U¤’UŸM§“[¥‰R­™[¤N©U·¢e³[GJ%-  -  -!)/0*,&*2501&)'.&("&,0%/  *1df.ƒ9tn+DD";B-2C?/2 20GIDDON#>@\^2QV(@DAC!# (/9C=8D7 MJ"aW,96 #*DI#>A"EM$_c.Q[)MR&RU2af4if706E@"39!KR*DG)jk>vnDrqAFF*wlDokBfZ7XP/FE'YP2_R/64!LJ6WY:57"gbBG?'85OW2TU0ztJzpGto>qlCvs@AB)!&#'.1101!#&#'(&'KJ0DK0 )GPC#"- IO3LV;;<''("31()PG2:6)    $>I2hgB\X8KJ5QK;I/ A%J'Y.!P3&S6*rF,‘]DªvY͈cÆ€X¶wT¾Œf¿…b¶\Âi­i»—r·‘i«hyVrQ¡ƒ^„pQ45%$,34"IC,')$72&;6+KF3ZY>qqOˆ^™m§o¤l¨Ÿn©¤p©v¬¢u«k¶¨z¹¨ỳº«Ê¬œ½wĂª„Ä®¹§zº®€¨œoTŒdy^v[£‹fµu´¢tª¡s¨¡q©¦r­¨w®¦t­£q°¦q´m±¨|®©w±ªyµª~°©}¶«z¸¦y³¥vºœt«k¬—gª•j¨‚[£ƒ`£‹Z“\sT¨y[¢uY¦yY¬~a­„Y›uRnTŸrW¨ˆ_©“a\{qC‚R¡‘]ªœW–U¥—S—Ub^5:@#FP2vVX]-~zA¥‘PˆzC¸¦e²`®Rº–U¸—YƠ°g³[`X#DE $*06" %)097OK,$*KL&DDAC=<D="!$  QS_Z " - +)75"#  - 157:37jg7ba.22$)12HG04%( 00-qd.d_.pf,[T(JB"1.20   -0<LZ)MV,@F"TW0W\.GL&e]2QO%WQ)]f5BJ&DB*xtMˆvI|mExnDtiDe^8ME+aQ:NG-bV3LF,TN0<9%_Z=PQ3;<'JH,86&:?%GH'MO(JL,EI&UU+\X0;< /6$4=&/4#'--04<'16&53!40 6151ZN-L@(CA'21-//;%EXA$55$LJ-_R;&# 8/ #" -," "+%,12!TI2‘Z¬—X·¨i°£`M¡S¨W¸–U()"! - //FB%:?!7A -1   $ %$ $($*&()) - - -    TU#CG#DE ).36CC;8DDVQ1HE/).E@H"-3UU1wrFsa;|hKˆ{ME@%C@)HI&bY:FG4NF'ID&$#:2 [W1Y\C6.!$"1+33e[5VN+NK,qg?l[9E:!A7!//'!9%" %%%=7OG"OH"dG!_9¯O–sAmHpcClmDRV2MR. , ")+&1. !"#94&@=0$%!)%""0+H6%H9$F;#,%6/!G9(E3 >/%F1#<%6#I#K2$†V3œbA¾VÁxR½rOÁxWÅx[Ăh·˜i²ˆ^¦qQ·ƒ\»‰cÄ“nÀ’i›pÄvĂ£~È¥Ŧx»¨~¶¥zµŸu¸¥~¶ªƒ²ªz®¥x±«}¸¯†³ª½¦Á˜oÈ—uÂkÄ„cÈhÈ‹gÉmÈqƒgÁ\Á€^¾ˆe³–j¹›o°–m²’k·wºœs ŒT’†X|S‡x\“V‚O‹‚Oª”dX†‚Sœ’eµ¥{±©y¾±…¼¬ˆºª~Á¬~¾«z¼ª{¹¦vºŸm¹ r¿p·l¸x½¨{¼¨vµ¢vµ¥€»¡vµ˜h´”n·£z®eµ|Z·}[¼‡b¾ˆcÁ…]¾|T³vQ¸yP¤sG…gGupD^dFXJ0NG/^W8e[G–ŒTqi=_W:MM-…^‡R'-;E)EL->> aa5NR2cb?ˆyM¡…LÆV34[Z5GG*,*  -65cZCLK<#' 04   "! "#    - (! 1, "    ;8494#7'@*>2kO+\.•o>Œg=­wBªrI¯yQ´ˆ`“yU˜wW€]€gD]P:5/!%'("+%:7!//'"t`­Ÿ™rdXSB.o\iU<\F5YB)s]?y^Ct\A‰iOŸw[¢uU•uM |W™uX’vU›xW›~Y»›o¹—j»—s¼q¿p¹–lº›o²›k£‘a…~O‰}Q¥b¯™o«—p²›l±¤t²¦t´¦y¬¥z¬§t­©y¬¨}¬¦ª¦|­§|¯§y³«…±¨»®»®„½ z¸xÅ“nĂ”u—u¿qÉ”oÁ–w¿sƃfÀ…eÀ~Z½{[¿zY¹i½o´”k·…d¾˜s¤Z•ƒZ„{Y„{[ƒuYqN±—]ª”[†RyzDŒˆX‚Q•ŒaªŸt¹«·©w¶©wÁ«zÀ©w²Ÿs»©wº¦{º£o·©y· v°™nµ¨w¹¦w®Ÿp©”l¥‘b°r½¤r®’h±„[³€_¼d¹‘eÁ_¼`¹]¾‡Z³W’qS˜‚TtnHcV8ybDzfAuY•}XME.g`D$'xuVbX<.8 7B'3<&079ˆR¤–Y·H«€>>>BE!')<@3979)- ,0&) - BG')2 -   -   -8/UQ"SR#LB#K8 F86-85$61#F;%ZP/C?!UI"PAkU.TC%AF*KN"A:LF&\T)me1SW!NS SK&DD YU)35%&OH&VO)750/2;17 3>;D,0(1 -4JT.PR)MK%#)+WM6RN5=>"IH'=D!8?#(1!%+/A?14 -1.1;7'84.1,3;@IJ.ST2=@"XT+gd8g]6<<":363#52%P:'m@&§`;¤j=²vQ¡m?›tI²„\¬„X±…^²^³zS«}]·†c±†c¢yVˆgG‚fHrR—|Vœ€[”zZua?­mϬ“~^€Yµ–i³”j¶•g­d©’i¬“i¾o½œu¸Ÿsµ›r²£tº¤v·«w¶¨u¹ªº¨u­v·¥s²i _£’a¦–i‹V…Sª›l‰TklYd:hsDv|IQ¡—\²K°‚=HJ,;B!PN"ho=W_.ma4^[0LT&UP(LC)65KG(=C!&1'!'  -" @=>=9@RR"ZV'FFWR#MHSN&GA"(+ &)55;?<9VGkR,J>49=<84a\%?>$0/GA$YR1n^>OF+=9$&-2DA ,,:4j`5}uBD@"X@"zX7g?s`?„sVpI¡uNœwL¨\ª‘a§a¯Y©|R´Z»€]¶ˆ^´‘iµ–o¼•n¼˜q¿s±›kµp·Ÿw¬s¯p±Ÿo® t¯—n°›o«o°¤w°¡s®¡r²¦y¶ªy¹¦x¯¤r±¨y­£s©£v®§t«¤v«¤y¬¥t¯¢o²Ÿsª™k­i¦•i›ZŸ™d„S„€LvxA„PwH{GƒzMmb9ywHˆ€P]­¥q±§q¨¨w®©z¯¨y³ªx®§s°¨w²¬z«¦w¨¦t§¥q®«w²¯{¯¨u±¢t°¡w± x¼ z¾ª¹«v¼©¸¨‰·Ÿtº’mÀ—s­t¶“r·ˆiÂj½€aÇfÈfƒb¾~^«^w`CufHd^Ag\@ƒgR´ŒfnF}lGnX8—~[¯i¶˜n¸m¶¤u¾­Á¨w´mº¥r¼¦xÈ­~À¬Å¬À¦xÄ«…ʲ„Ç®~¿©zÅ®~¿¬zÆ«{ĤwÀ¦s½¡p tĂr½Ÿy¶mº›nº”k¼›r·˜tĂp¿˜pÀ p¶pÀŸs¿Ÿrΰ”œ‡{xe@…kFSL4}tXe]M;:*‹l¡S¹­jwnAk]/‡v?›‚?¶S[\8uuDsr=KJ$PO"NL#LK$FO#7A#&04==D"T]0?N&@L DCFG"j`-pl;[X'?=-4'  - ""$8<@=FB$&8.=3'NN6]\>;?&?@4:$  AH'HJ$JGSJ(&)&*  ()'.#  '$CJ)fh7JJ(;:1*   - -0/je=II';;!IC%—{W¦‰c|QxjBja:kb=cU<*'d[BRL*{q?]V1=7B8yX7¾’j¯e«”^¥•k£Œa¢[¬’_¬‘b±d­Œ[¶^°…Y¥|GŸ|U®’f´’h±”k±•m¯o­£s¥n q¡¡qœf¥¥m« p±¤w¯¥s¬¨s­£q§o§£v¤¥t§£u¢¢sŸu ¤s¢ s¢q p›¤u­§wªq£’\“][›]œ_„Q‚M•XŒ‚R–aUxvPdf=fg=msEkoB_f5~zE•] ›gª§q¦ªy¢¥t¬§s±¬y±¬z¬¨{¯¨w¯§s¬§v¯©u®¦r®§s±¢q¯¦u´¡l¹¡{º’mµ’g¼tÄœw«a¼…fÁcĂ•tÂŒiÄnÁ‡eăećgº‘lÁ‰bÅ…]ºvT hHœhO™sT®}[ºxU·Œe·”h¿‡`¸wW·Œeº‘f¤‰Y¶•jÀ›mÂ{ăÀ©Ù·¡º˜vÔ³½¡z°§rʳˆÍ³’·¦x¸«}Ʊ‚ì{¸­}·«x¼ª€°£y³¢v¾¢u¾k¼r¹—o±’m´“m»“gÄ•l¼•mÇ“rÄ•w¾™p·h¾—v°‘i±™s¤m«–oª”h¯hÀ¤‡„tPA'xhP¦ˆ\®‰B~C˜uAœ|A—‚Iœ‡K¶[Wb17@ ( +&/8@'0 - *2QY,=IkqCZf8BL$(0 !$+JW,U]4[fgh8O’]œ’g„VqtHpsEIO+elIsxI‰~M™X•d“’Z ›o¤¤r¬¬}¯«w¯§yĂº”Ž¦ªx©¦v²©v´­y­«x¦¥s¦¦u­j°£s°¨~¸¡v·¥x¸¢wº¤zª‘i·˜pº—p¢‘m²—r¿Ÿw¾˜tÈj¼„g±‰d¹‡eÀ€`ƆaÄ^ÄbÀ‚a¹‚[À~\LJcĐ`Å~_Ç„a»~^¸yZª{W³…]°ˆ^¨i“pÇ«’Ơ‚ܶ̉§‰µœqÔ¶–äʶ³ |±l¸¦t²©u¶­x´ªsÀ«xµ¤n·¢mµoµl·™p¾“o¹”r´’k¹’l–rÆ›tĂ“oćȣŒĂ”oÈo¶•m­’r«l¼„¸±“j‚_‡^ª_ĂŸƒª–oŒ‚M¥…J³‚IĂœX­M¢„GÉ•L[a0AC"* )*15>0;$+ +3LR)‡†Xac@`f>bc@fn>KT+PN.@D NV,”–ca•aˆ†W‰Œ\wƒUz…R‰‘d‡‘_lyFK[+1<*- >@‡|Mh`1mi=woCrDuf5\K+bO+]W;! MR%PN4IM(:B%O\4hc)66& #EV'AK"=?CI&fP4‚lN;<%+506%9@ 9<JP6T`7X\/w[[W?GL(KO(lg9¥•q†]X§œk©£m™en¢i¥e¤o nœŸmŸ¦r›l˜l i˜¢p›£n Ÿi ¡sœ nœ¤q™ pŸ¢lŸ¥rœ£s˜j ¤o££q¢¥rŸ¥q¢¡n¥¤q®¦f¬§q££j¡¤h¦§nœf¤œg¨¡k¡—m˜^ •]£f”Xˆ…VlwLqvE‹‰YœŸk‰‰SƒUˆazwK_a8UY6€tYxtC‰…T†„SŒ‘[¦¦s©§rª¨t¥¦s¬§s¯ªxªŸp¥ i§¥r¨£r¬§v·«~³©y°§u®¥q¯§s­¨t±Ÿq³¤w·¦{¶©w²¤q½©†µ›r–“iŸc²•oÀœz¾“m¸‹g¾d¿i¼ƒ_Å‹fÆiÅ‘k·~]«‚a«€dÁƒeÅ~d¾{]¾bÈ…iÀ‚a¹g¨‹c¥–g¨—l•`µ‡c¨…f–‘k¼Ÿz¸™{ຜ໢‡mN£‹b¼¤u¸¡s½¦nµ¦r­¥q¯¢o³ pºŸm²˜m¸˜q¸’h»•l¹’k»i»”nÁo“n¾—tÀ™yÅ–t•oÅx¨’n´“q¼—m·˜sÀ›z˜‚X¥„\°–d­l£‹g°]Àœ`«†LÈ–E°…=©ŒKĂRdd1RX%6BQW$ai3EH!AJ#US$SV3lkH‚Vs}Q‡UŸ™b[‹ŒU—–\…XŒŒXe––[–”a•’b——]œ›f›h ¤k˜—dOY+[a4ol;dc:em@y|FkpA?B';2'bgENU4l^CWD2;6"2;/47?![j?YeCCK%woT}zbJ'(+DD$--   -#*"$QE!7/$.  &" ::%5A’‰ka^?55" "DP+IR#EN'knGvoKth@aY1:@$   +0hgFfo@W_6Z\4Xa6FK*ZW/nrB|„I“•Y¡¥tŸ¡mŸh”—b› oŸ¥r¥£o¢rœŸq£§s˜ p £pœ¦t ¤r¨¢r ¤r£sœ¢m—Ÿiœ¥pŸi£ i§¡i¤¡rœŸi¡ m¡ l¤¤j›£l££jŸ¤m¨¦q¢¤o¢œgª¥j¨¦pª¨u­¤w£Ÿh¨¢k® j’‰]†ƒOˆ„PnwDdm=ƒP£›gªd§f’‹[ ”e~}Mx}Mdh?‹~SLO-RX7x|LrzF‰‹W¨c ¡l¥s¤s ¥v¡¤q©¡j¥ oŸ–d¦¡o¯£r¶£t±Ÿs¯l»£v«m£g¯•k±•gµŸq´§v¿¨‰Íµ¡¯£t½¨{·q¹¢{·Ÿu±‘pºdÀd§„\±Œl»‹kÄ…fµ‚]±€W±zZºzVĂ‚`Âz[¿uW½uZĂ„a»†[“k³lŸ’a¯‘hÍŸx˜{[“„]†Z”ˆ^Â…¬ƒxzV²–|É¢„¿œv¼rµ“k·m²£qµ£q°iµq³m±”k·œn»”h¿’e¿k¿‰qºŒp¾j¶‘jĂuÅ–rÁ“oÆ›|»–r¼“oº•sÄ”p¿•rÄ“n¿”n¨fÀ“a²ˆ_s?¾£c±V«PªJ¯†C;D$p~G}ˆQw†OurJedHdiEWf?Yg7gn7‚‡Q]‘Y‰ŒV‹T„Z––_’“`\›–f˜—f’‘X“’Z”’`•a•\fk:|~T¡œh–h˜˜gª¡rœ˜grPseIhiI+ " )%/8AHT.b^?Ø°»Ÿ‹dZ917$  #OV5]kAZc9CH"JO-dh=jl?‚I‰…Q•]¢p§§q²«»¹¤ª§|¢pª¦r§©u¥¤q¦¦r¤¥q¢¤r¡¡m¢§t«¨t¨¦p›k™Ÿmd­¦p£ l¥¢o e¥£l¬§m£¡m§¡n¨¦j™Ÿl¢¤o©¦l©¤n  n¤r¤¦o¡£hÁ±†̉»œ£”d§œe•dˆ‡R~€K€„O_f@JP,€tS˜X†OwuB„Q‰…^[c@np@GU+e^?W^B^fDgl;rn@lpE¢j¡¤q¥pŸ¥s £s©¦t o¥o¦ fŸ i«¡p°m®kµ›k³—i´’l¯”m·o¹hº™kµi¸˜s̀¹™ª¡w·¦w¸ u´¤z½Ÿt»¢x» wĂ™p¸l°Œi­f¼j¼“l½—v¼’l·“l¼“kƇiĂ{^€^Â}_Ç€`À{[²ƒ^°’b¯—g­•i·’sƦ€¯™l«—l¤dh…„[²™s¶—x²•m¾y¹œw´“j¯•l°–m°›f°•d¬•i®”b¯’d°g²g±b¹i¸fµŒdµi¿k¿’lÀ“lÈ–oÊ•o¼’g¶•rÅŸ€Ç—xÁyÅ•oĂ•iÅ•kÈœt®V¹’Q¡P}>³‘E‡r=NY,IZ*wyMz…QvˆSa‡„bv{Js…L†PyƒQ„T‚U‡VV†S‡Z‚‹Z…U~ˆRŒ‘[”˜b i œl¦¦r•—g”_Œ‰Z–—b¤¡n¨¡s¥£kŒYxT}‚VƒQuqHV[/IE%>7SM+TE47$%>A!"$%''3,3S[:yxLxlG»¢|³¡€®§’BL#C@ ?B$)408![]=ª[ŒWs{IY]1osB\a;KS2rtOcfCuyJ¬£pÚǪѼº¼¬§˜a©j¢˜j¥œl¡ j¢h¡£k Ÿn¦ l©¦r§£q£p› kjŸ£kœ¢l¡¡nŸ¡l ¤l jœ£nŸl¦¤r¦¦p¤¥m£¥pŸ¤k£p›¤l¤k¡lŸŸn«Ÿp¢’]›–bŒ‰Ujs>tvD€„ZquFAJ'YT8kfJ:C%^d7szHjl=]b=R\1KR5lqJvzMXe=V[.ag7MY/mxD‹Z¢k¦¨u¡s u§¢k­¤qª¢v¥¥uŸ¤w¥¤k§¡h¬¡l¯k» d²g°Ÿm½§x¹¤w§’h¬–h´ p§–g¯q½¥‚º¥x¾uº›o°—k«“e¿›n²‘jµ•h½™mÀ•l»•q°—nºŸw¹“l¹’k¸Œg¹‹e¼`¾’l¶“h¶k·l­j±£p±¤l¯ q¯–m· o°¦s¸§s´Ÿo®n±”`µn¯–p²x±–r¸p¬h±“j±”b¸—g°–hª“bŦ€Í«Ç z·–i¯’d³’g®bµ‹aµ‰e¹’kĂ“l¾•n¿”k¼“iŦˆ»›‹½•s²Œg¯…b°b»˜kÀ˜l°”c¢U v5¨@„InsRM*V^)V_6UR1em8z†LyƒL‹U[—_†TZ‡[’”\”Z‘“]‘’]”d‹V‘Y–`•˜b˜™j—f”—b_’—d›iŸb™f˜˜c‘X‘—g~„VDJ%?>hd;97^R)ZN'E>aU(vGsd6l]08;9<^Z(oc5WQ(08.79;[Z2US+_[-?5E9K>   99 -7$82QL)vlETX,FW'LU)`a6YZ2sj?soAQŒ[7= k_:g_;LU-BH+[aCyGŒn>€{F|ƒOxyIOQ8¦~CHD! 59.38?>?QP!\d0YV&Yb.ef2ƒR“\“‘^‘VˆˆR˜“\–•_“\“’\’’[˜•a•—aŒZˆ^”›e’Y‡Y™\d•˜`~…R‚ŒW‹“Z”•_…†Oif2dZ-CDGA>7 MH*WR'm]*dU.H=;9iP-te2NFKF#) @B"FBcP%aT+\O(L;=3IAG?! !;A %9>OY+HS+$0!+15G9 OD&PO+5<O[3RU2<:^_7LK*œ—iŒS{kElX7{hCjlEJQ*?J/:G#a`:|vLrqBhmCfoJ_m?fs?syIXb0?B(e`8yk@_W4`c?ulFƒZ›—d¤¤q¥¦r¢¦u­¨}¨¦tª¦x£¥v¥¦r¢¥q¦¦n¦§z¥¦t§¦r©¦s¥¦t£¥s£¦s¨¦r¬§p©¦m¤¦s¨¦w¦¦t¥¥q¤¥k¥¦tœ¥s¢¦tŸ pœ n¡Ÿp—–]—–b™ŸowPmwIwR–dƒ{Sbo=dj:~vK|pE‡{MVR–…]†{WV‚„UuyI{|HtxM_b8nn@œ n¥§s£¥r¤s£m¤¦q£¥q¤¦t¥¦x¡¦s£¥q¥¦s¡§t ¦s¨§u¤¨y¥«wª§x«ª{ª®{®¦w¦“f­’u›ˆdŒX•‚\«dŸ‹\¬£s·¬y«¨sª©u¬©s¯©t±ª{±«yµ«xº«x¹©r§›d®Ÿo­¦r­¨s°¨t´¨r®§x¯§t©§r­§t²ªw¬£q©¢p¬¥s®¡r®£r³¢p²¤t±tµ¢„·Ÿ}¼£º y­™m®™dº£w®x¶jƠ®ŒäÊÁàĶɢ‰²‘i²cº•m²“h¼”jµ’e´•oº“oÀ‘kÀ•n½™p¯f£ƒ`œƒa˜{X¨‰e™~]­‘uº˜s°˜Y “]‡R˜…GCA"**),!" *0RI#@;C@PGNP bk4t‚G~UvˆJz†O}‹T‚Q„ŒRWˆZ‘TƒS‹Y‡SƒU…Y‹S”‘WˆU‰’WW^5U\)q|HƒVs{L`d5nm>qtEak9CM%<8-njFx{JgY0{jFbb3LR)\P)hV-L;"D>!@J&1@!0;KR(i\/TN'`W-IB $#//"**/8>LO%CIac1TV,"+&76XP-{g@l]6HA+MP,OR+]i:RZ2[\=yLwwMqb@€mI‚eBscAFA#6;DF&KW-do;q}Egk;srF‚‡\ck@mn>§¢pw€MWb9fmBb];\[5{xP‡ƒV{uIw{Lœo²®ª§z¬§u®§s§§x¬©z¥¥o¦¦s²ªz³¬{²©w¯§w§¨u²ª|ª§{¥¨x¥§v¥¦s¦¥s¬§rª§s°¨x­¨w¬§w¨¦sª¨v­§y¢¤u¬¯}¬©t©¤tŸ¥s—œjguCntDu}M€€R™‘f–bw„P{{I}|MijBdf<†J“€XwkAuFQX1Ye:V]5ouJ—›m“™i¤¨{¢¥z ¥w›¥{¤¦u¤§| ©y¡¤u¥¨x¦§z¥q¤¥u¡¨|£¨z¤¨¥ª|­«|¦¦{¢¦{¦©z¯¡m•„T‚W‘ˆd˜h•Œb‘‡^€V˜ˆZ¬ŸnŸ]‹[‡ƒ[ˆ‚T‰[‘‘`¥˜i™Œ[S…X™]˜_ª¦z¦¦v¥¦s¥§w¥¦v¢¥t§§w¤¥u¡¡o¥r¡¦rŸŸqŸs¡¢v£¤rŸ¢rŸs ›q¢Ÿp£o§Ÿq©¢n¢–h¢–i¥j·›s¾¢|À¡|º–t»›v¯f¶g²“f³‘j¸•r³”nªg¯l¹k°i‹e{U‚^¤Œd¨‰b[§ˆd¯iµ˜e½Ÿc¹’D›|63:-.(++(()JG"8;GKGF$44>DP\,as;q…Lw†Nv†TyˆQ‰Q€VZŒWx‡Y„T€R‘YŒ]Z†V†Vz„I OI)NH#LX/]m>csDu|PpvIFZ,:>FJ)    # )62?HM&:>! -/1ZL/]I'}qEh\;niBfi@ [c5'/ED&ˆ‡U[\6bc>xkFyRbW8ojll8mwMo{J^p?U^5keDwtU–’c”e~~S`d8ouG°«zª¦sª§w¦¦tª¥q¬«yª¨y®¨s«¬z«ªx§¦pª¦u¢©x§«y¥¦s§ª|¦¦u¦§z§«y©¦v¢¥t§¦v¥¦|£¤u£¥r²°‚²¯‡¬§}¥Ÿr­¥p¥ k•Z”‘^”e†‹Wko<€S‘jtƒN†TovBƒ‚RnpGqrHKzGj^8„{[ppS-?FU2{€P’iŸ¨s¡¥sœ¤sŸ¥t¦uœ¤r›¤s¦u¦uœ¦t¥s™¥s¥s™£s¤wœ¤z˜¤}Ÿ¤w›¤tœ¦|ª¢r”ˆY}ySˆz\†d”f–g•ˆe”„Y‡zRˆuO—€ezvPjqNsvP‡~P‚yO…Y…RyyS„V†\’aª¤y¢¦}Ÿ¤t¡¥xŸ¦x¦y¤§x¥q›£rœ¥r¡¤x˜Ÿq¡v£¦uœŸq› r™¡o—›oŸ q¢o™›j¡qŸpœm¢›o¡œoœ–g›”i“l›fŸhŒh˜Œb£e³”m§‘l—d ‰b®ˆk­‰k}UxSŒ}Tœ†b¨b€Z›„\£„Y¿ b¼ T½›J›~>+/%- *I!09+046>Idr4u†JhƒEn‡I~Rr†Jq…Fr†Oz‰Vq‡Jn„Ky‰PS†W{X†‹T~‹QT^0-;9G!Sl:Rb0ho@s‚RwˆP_o<.:DD0]QA<>$yuIrc9SQ5T\9NQ.cd9kf>^[/LV,hzD^‰ZXi93B  - -    *#* ',4'0.4ID(VM3KQ1]aR'N^/ˆWs|PoxBUa5t~I:F%JU6]m;)MF>$1fj:?='FP2ctFsq>„S|oEbZ.b`6`a1grAo…JM_+ )  - -   '&1*2&!-,6>"EE**'6;!bo=‚ŒVXm58H!(2P\4†“^rMv~IyzPX[:jf=fjBM]/>H#x†[Vf3K[.P^1ryGq~TN^1‚X‘›g…Œ[‘i…]™’hŸm– u–—k› sŸ¨v¦t˜Ÿl™l¥v¢§pœ¤q£r™¤o—sŸ¥uŸ§xŸ¦{¥|›£s¥vœ¥t¥xœ¦tœ¤r›¤s™¤y¤w¤q£q£§y™ uŒ–i£¡y ¤v£–d’‚TllR”iº¤u¼§~º¨v¿ªÇ«†Ó¶›Ä¡v¸•g¯Y¶–i¡c‡zK£‰W•VtdB†tL~W±‰hÄ™v¿œ{®Œi¹—r·—u½—o¸g·‚\»–n¼¢~Àv¹—j»—mÆtÆŸo¾–nĪ|Ä¢q̀¦|Ç¥r¨xƧzÀ¨u½§r¼¡u“~V¡’n“zXYtmI³“iÆ¥z¦–nUxhH˜€\ŒtM“…c€b¡c®k…uN~R¶«§Ÿ{¤p©¡vŸ£{©¨€¬¡}¦’m¥›t“m§˜m²¢v«›v©Ÿt³¤v² s©¡t£ o œq¡t©¥xŸs¤¢y­¤u¦¨{–mœ£s—œnœn¡pœn—™n˜˜o—™nœoœn˜o£“pdƒTjoN}yR‡uQ‹xQ¢Œk¤j­™d ”_©b®‘Vº–Zµd° `ªŸZèZ+2-8EG-KH35C2C2D2B3A+A/F!5M#-F$-A!+7 )55E:Q$2L'2C 6D.@1B.?,<2A6E&+>"0" ,3AKQ&LU$bf6le:^[/CS'6J"9@'IE4--0; GC1@A$nn@ch@_dA[P-]G#AG"?H2>)71@".    -) );#0!$4 !3<#&0Wd9Wr8Xl>Nd,9K"Xm=k„IqxK{sN`g;G'7A%m}LUa07?3>Wf8‹Yp|Pv‡Sˆ–a‡\‚^•i–c~ˆZw‡V‰‹`€Œ_‰˜f|Œa•\Œ˜f‡Wv~Po…Sj|OTvGf~Kz†W{’^v‡[†Œ^•—o”›q–m£v ¦x£§rŸ§z¨©z¦¤v¢ l£l©¤r°©uªª€­©¦§~«Ÿq«”f±™m·l¯d¼tµœr»›vÁ˜kÓ±”½‚¦…]®_™‚T¡g¤_ˆ\…uGSI%fZ7¸–jΤ|Êm¶œˆtr–p\–rĂ–nÆ™vĂ—lÆ“jÄ’i¿“pº‹i³Œdµd¾‹jĂ›xÈvÅ’kÈ—mÉ›yÆŸv¿•oÅ•lÆw¸˜o¶—k´—t¦d–xZ‰b» sä{¹w®yµŸxÀ§~¥gŒd®˜n¹œu¼Ÿx«”j½y·™j®o¶˜j‚]¬›m°qo‰c„yX’€]jŒf“t—m—h¡”m¾¤w»©³œm©–fc¡‰a²•n¸y¯t¹©|»¬}£ q£‘d›”k•“i–˜oœ™p˜m¡q¢i¬k˜‡b„uPƒU“Œ`¬q´ªn•†WzXŒ„X”ŒO“‹KȬnÀ¥g¼¢aɪb¼¥_§G²SCE-?E1?D-$!$"""$)!,#/$0$0(:,@.F.E)8-@0B3E%;+>%+^T5_Z26="/*81?&2!-&#  + (4#/.<*8$.  - -$!..E!&:*=&1%18K'AR*1?;D%MS1`c43? QM3$.$%/7E/>+9.<>L%DT'>K(Z/=_6Gf9WrERrASm_1Nj?Lh9Ol;Oj;Sl?YnAayCbyDcyNx†W‹”^œh  s© k«œf¯Ÿp¡•l›lª¦r¬£u§§u­¢u¯£w·¨w®j¯¥q«—g½˜pµ“h±™l¾ €Ä¯¤²”p¾¤v©’eº¥}˜„`‡ZŸ‚Zª_²“hÉ™tÊŸqÉ›vÍ°†Í«„­pµl¾˜kÁ™qÁ”j·‘bÁ“j”p³ˆd·Œh©ˆeÀ’iÅœxĂ É£}̀¡|Ó®ŒÎ«È¥{Ä¡~Ȥ‚¿¢}ŦyÎ¨ĐªĂ”tÉ {Ë {À”q´–p»˜w¿œ{¸–x¾›}º‘i£~Z´†f¿hרyÖ²‰ÄœrÆs²‰h¦`»kÇrµŒc±Œ`qJ—vR«f™|X–}TˆuQhYA€mN«‰e°”p„X”vT¯‡d´‡cªY§}]§†g²’pÉ¥|´£z²¤€° xœg’h™“l¤—i¦›nœ–pŒwWneJYQ3b]CŸeű‹OhgB^XDic@‹x3²’Kΰd¾©i¯^½ Q­KœE·—R !#  *$0!.*)) -'61B+;'65E:L1C&2%"$&'2+9+9& -%3!.,II(@@*#*,;\P8%!pXMg\M$$EB @?")#,!-%2%2(5#%&#  !(>M%;J!%   #%!#%'!)&!-=G/8D%@K,TU:*4%6;*9?%HI'5A$*5!,:5@'/=2A$:G,4@%5C&/=%LW>€m3H'8I,6F+7M+:T.A^9@f;A_5Jd=Fe<=_3Ba?@]2LlBNl;TjCMg5Tn?WoBawAyˆQ]—]‘b’f—Ÿm¦l¡¥r¢Ÿp¢o£lŸ¡p¥Ÿg®¢n«Ÿk¨¡r®§u«¦t´ªz¼¤u³d¾˜mº™k·˜hɱ™Ç®’¼r¶™l®n§\Ê›mÈ–rĐœpË uÄ™lÊœsФ|ѨzФzÇ£̀­ƒÊ£}ĂuÁ¤{¸pÅ—qÁsǘoÈ•lÄ›nÔ¯‡Đ¨‚Û·•̃µØ¬‹̃µ’⸓å·Ưµ̉²Í«‡Ø±‹Ù®‹̉¨…ÎœwËŸwËŸwÈ™qÅx¹˜nÊ¥ƒ»o¯‚h³„n´‹s¼’oĂ•uÓ¢‚Ë¢»œw½™v«‡g¨€e®‰kµ”m§‡b™z]‚iP‚iP—}YsQ‹tSlLpcC|tV¡j o’†j`™†_˜€_†f¦d—k£j¤k•hf¨”t¦–u“Œd„]„]‘†[’†cz]‡qYtiQdkLƒP¬›m\eaBqfI~r[•M³€6Í¡I±˜Lzs-§G“‰K£’PªG      $#  %%#$*7+9$1('(+8) ,+<0D @P&7D4D2A2@(83@FP$7@HG&>>%:>>BDB&‚p_‚nYscN6/SG#?>"/+-/*"--:1@ /=*7!-"&2+7*/""   - -'3AN#6D"   -$&%( ,%'$$(3u|QruVMM0CE,8;0*/,0-9%. !."-)"/(6#(%1.;&WX?zti/<%1=#7D'9G+GS-EM1Z[7SR.QS5UX9`_;rl>lpHktBgk@x|RmoDu{KˆO˜\ª“cªœc¤œh£›d¦¡h£•[™bŸjŸ™e˜˜h•”_¡dŸ fd›£r£¥s o› t¢q¥t¥ pª¥wª¢u£•c±•`Ç°’·s Z«p·”x¼‘g³†Yªˆ^³”hÀœl©Œd{R‹fEˆeBoIŸ‚a¯h¦fŸc¨™q¥—t²Ÿn¢]‚Q˜…[—xT©€S¹‹iÍ¡}̉¥€Û®ŒÖ°Ú´Ñª‚Ö¬‰Í}Ơ°×¬È›|ÊzÄœzÈyÀ s°“m®h¼y´’m£…e™…f¡l™l›pœ‰gªkœ“m”qœ—s¢™v–”m“k‹„e‡~W}vR‚Y…b†eƒ]‹„_‹ˆ`—‰a›l—i’c“j”f•e’‹fg•c–eŒ`•b§’k¼›€§–s’Œd€\‘ˆa†_“†\’ƒ_€`ƒxUttO‹Z¡‹XT”^‚R‰|Q ƒ[±~;m%t`)uv0·œJ¡D—Q£’K -      *$## "'&$$!%3 -%'7)70@9JBS)AP/=.<,<>HB;@AFM!ST)MS*ga;c_;aY4IE#•{^uUdM0TAXD%SH+3+KC=924:;'! ##  /1!   -  - -(/I[/L_1"        $!$)kgDb\+FG2S[AeoOOQ4YI)uZ(gZ)B=#D7!eX4^R/_R0se=}qF‚wKbbAZS0\V0a];zhGˆpO†pHvC†mEoBkR&hM!R> }i?ƒkB„nB“xJ›†R™€P”{O–K}l;cU*‘zMsJŸ‚Q§‰U¨‹W«d¦Œ^¾lÇs¼›j¯‰V¬d¼l¹”d®[«X±“d¼’iÈœoÁk¹œi¹n©_´™fÀ˜hÊ¢sÁn¼r¼–cË[³Ml9eZ4(2AH$LL+6.SI5klLbg?_iBTe9KZ8tpUZ\=alAqyByM‚a[ˆY^‘“e›•h¤h£‹hŸˆ`§‰_¡[£b ‡\´’t­‘tˆzSumA‡uV‚rYwnK~qO‰|T…vQujEjb=qfBtiIrfHuiBynAziFymKymJrJyR…yNXX–ˆ^˜‹cœˆd„`”‡_™…\”ƒ`—‰f…g—ˆ_…_’‡e˜‹b’†\†c–‡]“…_”…`•†\[„^U“U‚\¤†m®q¦ƒ_—W’W”vR{RxV‘}RŒwTvPçpħr¢}Ck4¤‰IϯeÍ®_¤˜Q€s+{h+yh)Ÿ{7©q0p1µ•[˜‚F -   -   " (';8 -  -  -    .+?2-$ &#   &!,(*&&B8OC$[H&UH)>?#=B ;?+402_R7SB)+#   -  - %(%,!"! !!   -&*7*7  -  !/3G&:R)I\.AN0E\4Ne*JB:RF.?7!8;;5?> GQ*S[3Q[3T^2Qe6Ne2FZ0H]-G[4Ic5Re6# -.<#3C$ >O-:J$>O&(4)3"%,5*3 &37"`cCTW6//#)+&)++ - )L0sC†[8w_ExT)~Q4]7“iDˆgB„^<ƒgGwX7nV6ZM5R?(L?-OI+[Q3aY7\X9HL3}mS½…x_\Y8qlCvtJnoHkm=usEqsGqpFosBnrDquFprBywNxtJmo@lhvr5Hƒ6™‚8«‡;   "&%%'  '&&&(!"$!.  -   $#%".&36C(DQ5;E%:>#OQ1HH*B=/ -TH:2,"EL!LN+RZ1`p;ao>`n9`uF\r@_xAbvAaxCau>Pf97E# -  -/:&. - :H(.90?"-  -   - E50-% -   &(**01"(*56.1 ''   -  "R<#hV@R8b;sN-wU1gW7TK0ZM,74 4,   P?6º™‰qdU''94 GA&JE.DE,ON/RP4WT:QT4WU8[\6``:`e>dg>^_9X];]Z5bfehCkj>vsEzqE‡`”…h•„h‹v^ƒvW‹ua~qP€}NzwH…{O~{LzMx}IxyKy}Nw~MhsEnwJwzNpwMkvKqxGnwMtwQyzPy~M~{M€vMˆ{RV“€V”€\ ‰i¨‘pµ—„»¡“´˜‰®”}¨“… v‚q‚g…xT€pMxkDxgCzfCygIwkC~lH|hEmH}i@wiGwjH‚sM‡pP‚{T|U‚R‚X”^[“X€Z‚\•_’„[^‹€W‰_aˆ}`‹…_‹a‰\†{Z‹~W]yWyVwWyW–{_`“z`ŒrRˆtR„vR‚qO€tN¡ˆ]—ƒMvY+Á“b¾™ZÀ–O§N„u1~n*ƒt5–€:¤ƒ9©‹;Q‹Eq{A‡H˜‡5©”=3;29/7#' (!*&   '+% #   - -   -  -      -  -    !   !" RF<'&  - '$! - -  -  - -  #  - -   - 63--! -   ,28:!64""*(  !)E@.i\L+". J6K75.)'16 *'+      B>5B7+  !2,3023 -2!22!=;'NG-IJ1GL.OP-ON,MH+YR.YW4_YwhFmF€mK|iBxgHnOƒrL„uP„zP€Y~T’‡[—‡^›„\…]z^ƒV˜†_…`…`Y’‡b…Y‹zT„_‚]‘€a‰yRR|XvR‰wRwR”yUœ|^~b‘vRuO†tP†rK‚rJrN…qHtNv=ª€O»ZÊœS§•QœK‚g#’7Ÿƒ2³’Aud(ƒz7©£eqm5~w?£„8¥›T687:+1# % $ #*   - $(+ "#)04     -#     -   -  -     $!  $   -   -  -   - -   -  - -    - ""  - :7!540-?C%"  !% )!(     67!iaC -  )   "# - -    !'&97<8"?;%@9;7!A<%F=%IG-RK+`O/sX8‰oJ ‹mxYrOxn>{oA‚tSed@oo@\`2U`;om>kkAjo?qqCyyKtwM_kCci9nuFfn?enDbkFkpFnrHrvEtxJxvKuNƒwQˆyRxR–U‰dp±“~¹˜‰·›°˜Œ¥«“…¥~˜m‚f|U€sJ}eDrdwe@nGƒuM‹zQzQ‚V}V‘„`›ˆd ‡]”„[”ƒ\€Y“„[Ÿ…]˜‡_|Y‘‡`’†^Œ\€Wƒ[b‚W‚WsIwOŒtMwLxR›{Tz]–tT‹sQrHsG‚pGzi>~lE }Q¿OĂ¥\©h­‘J¶P ‚=¬G·¡[r+g*dQYO}l*¡“\¯C¿.§> -  -  -          8:!   +4 (    -           '&9:%;3.* - -  -  - - -  - - - - -  -    -  -  -     ;65<;&A4%NF(H?)TD&gP,ŒsQ•|d~lB~pDpj|tQ\Z5ieAXY3IP-XY3ec>]^7ni=vqHjlF[c:Xa5`f;[b=W\?`e>\h;cl>knEmmDppFvnH|rK†tLsQyW™†`±•z³œ¸—Ä£œ°–†±˜¬“ˆ¥ƒŸ’w•o‹xYsM|pDsaBq`>uc>n^D~nD|kA†nFygBth?~tI†sO|S‹~TŒR€SƒT„cŸ†b”|W•„W”X•ƒ` ˆf•‚_~U~XˆY‚Y…U‘‚\€VX{TxMtJwHrHtRœ~X£†\Ÿ„^sN‡pGqI‘yL›†Zœ}C¹SÁ‘P›‚7¬ˆ=½Eº›O¶”Oº¤e¦‘[rf,y\3O?iX€_†K„E¢y/—†C  -   - -  -      ,2 -   - + 6@*0 -  -   -   ""(%&&     "&#    - - -    - -        -     -$, &.5.1)('*&(4##($27&.   (.,.*.HI+<>%.2$*    *2 - - ,.+(    #39%18/333IJ/IK,D?$@B)?>'FH%?>"C^`9KT2HS6TW7QY8LQ2MU7X[7W]9[etfFwkB|mCwjFsfCugE{lF|rNwO†|PˆzNxK}S‘T•€U~V’ƒ]{V~\ˆa~_X}T…U‡|RƒX€U‚W~Z~TsNrHwI”sP“rK¥~R²V­^Á¡g˜T—€M‘N·§p¾_º’L¿’K´I®ˆF¾’GÆ–[±‚Ie"£|=ˆzC‚F˜w)q^%\P)ª›P½¨Y³—Ew;  -  - - - - - -  - &0.8 - -     # --4 (   -  -    -   #  41( !" 655,*'  - - - - - -  -  -    -  - -  --'" $%  %(%&?:"GC#)*  %0*4$*# $#+   - &$(01AA'JJ)C@07#(, !#% ,   - - -"  "*%)+,();=%DF&DE$^b6`^9ibCtiF…qJsP•}V¥‡qµœÊ°¯É®²» ¢¾£½­©·¡–¬”¢’}\wOviCqfAma>neQH*QG'WZ6\X0ZX0SR+ML-_W5RO-GF'IH,&*KM2OU8QU6PR2[YbL"r.‰‡<ƒw0™‡?·¤S†#.0--03(+,.9: LL1;8?!II*@F(47*.266=#4525$;9"5<(8?+FG*JN2LM4PR5[V9n\=„nG”~d³Ÿ›̀²¯ÖÄÈÑÄĐ˸¿Ê¶»Ä´»Ăª©·¦¤µ£œƒlxqInl9mlEjkBpm@qnAvqEvtKpoJffFdfDjmErsRruP}yQvP~uMwtM}tM|uL|yL}tO|rTƒyRyV‰_zU|xVztOytT‚wX„wX„yY‹xY‡rK†oJˆhE`<’uM¨†X³]¨“S£ˆO°M·‘U¥„?´”WpY%³…B¶—MœKÁ¢_Đ¯_È­\Ư¸uÆ›]«y7¬{2³OŒx-ÁœF›x6]QqV$‹e(x\”€3  -    -   "&   -    -  - - -   **ME;:A>/*     ! -     +(20       -  !'&& #    -  "! &   - %*10/2!,%2:#%&(=4IB%?9$70!   #'.0;4B'   "01\W,WP.VR8QH$?@&15,1-3%-"+(2!!+%/#,$ !!#&&   " !$96!>@#29%BF)/3**+0$('+24AB-.344CH'GJ$JK*FF)?D"SM+NJ*GD'$=C&ohBom@ttFuuC{uIsoJljG`^@]_FabFfnGknFtuLyvHrlCniCtoDuoFoiEpjHxqP{uRwd€fxsSrkLumK|sP|tPtS…wWuU‰pL„iGgFƒbHÀ™d̀©k¶“]˜G†nE|F²M™ƒ>‚I‰wC«…H¢I´•P¶‚?¦~6 {,ÆŸYÀB¢r%¢|/‘q‚n+}=•sA©‚7”j(•q9¢I–1     !!   -! -    -   -      #  %"   -    !! $&   53  .*/*  -   -#!/*%   (' -  - -    " -.!"!"-/82378!% 83 !# #09;A5>>B?@"$  - HK!IN)IH+QQ2BF'9:/8#1?!%+#!('0&&2.7 &.$!"()*)&'#&&)!$&) 9:"HI(FL*GM'67*0*0 ' %03 ;?(&,&+9;%??#=F+FA":=GF)JG,AA&7> $>?#7;49%,1 &,(0 &+#'+./200!95 ID'@B"=A?A&HC-_L/xaB{a»¢“×ĂÇäØăä×ßƠĂỀÁÍĐ¿Ằº»³Ÿ¥µ ›…noUnm>wqGtuIyuI|tIwwKsoLffKW[;UX:[bAadAkgCpnHrnFob:nd>mdHmhFc_Egc@llNwtX‰€b{atlPngGrkLtnP|sX~yX€vZ‚q]†pOƒjM~_AwWB¢{SŘ^ª‹P‰mFwgDƒlC‡r<”x>¶œW¬‘B}8©^¾®yµ’Gl7Œ}?½£e¼‘D¨ƒ.qa+[Jxt0XOwg*ÄCº‹Gq0©8ˆs,  -     -   -    -    - -      - -     "$ $%2/&$! *(6/*+,-   -       - - -  -  -  %2!  - - - - (/+/&,"&   -  & (4#." )/7&.(0+/   !$EI!GK!49QR-GF&9< 8@(9G),8$, * &-*8"-"!  "%'%#))+(%)&*,-(%!" !15NO.X]/R[4@@"*3$/ (+/7:-$&$(6\`EZ]Fhi@qbCnb:d\8b^>]^CW[8]X@cbLwoVˆxg~nymWhgIpdLphOuoV{pQ~sS{rR}nM}gM{_BrS:†b?̀¡i»—[¸•X…Jj`0rh3˜w<ÈQ˜‰8§OÅ«lÍ´s¤¢[£‹;†vH~Z*o-ήY¨ŒK†`*B?fg!ph”h6·u5»E³Z|d0 -     .1!   !!  -  $&.-%( &'  -   -   - - - - -  -      '(%& - - %#%&) #  - -     - -    - - - -  -    ".  - -  - ( (**,#    !#&     04,1)-38BA"?B"LM(CI!3637.6/:!*$#+"+#+)/!!'%" "#! "#*)//)'!$"+,9:"GJ$\_3KP(2:(."(!9:"MP-;A"2:=@#>=$56!(-(.;>(88-359697: 8=&AA#79&.3,/!(+#%)+/!/2":7#E?*PI+OJ*PK-JH+LF-XC1kK=”{i­®ÜÍÓå×Ü×ÊÔÉ·ÁĪ´Ä²¹´¦®–•©–•€yo]_Ef\8rkCxO†{Pƒ|M|vNolIZZCNN7CG1KQ8VV@^[BbaAmc?kckU3‘}G¯‡RÑ U­•G“CŒ„G¦SÁ¨c½˜R¦_  ]­¤b„@€>‹i;tVc#•p({`!j\'k],u;ŸAv*n*Ÿo/ƒu7|9 -     $ $&2,  10 .2"% -   - !%  - - -   - -     "--@;+  -     -&( #   -  -   - - () -  - - - -  -     -    !&.%%       ./-15=8> ,1$*:<DC!HJ*AC!<>*5'0)&'"$ &%!"""%"&$"!((&)36ZU-MN)KM(8A#6;$DE&[_5WZ.SS-NL+RO079!&+ &CA)8; 659<#>>!GF&C@%D?'78&35/2 21"$)%()20C=&QH,eO.`T-_S-ZM,RE+RE8bF0ˆraº¦§ÚÉÍăÖßÚÈ̀·¢¥­–±¢ª¡’¦•”–‡stiOPF^U1oiCtM‰}S€uNzuQfcHVR@OM:FG4IK8RR=XX=da@lf:b\8[V7ZV5VU2VL5UK5^XAokPwoP{v[voYh^GZRE\[GgZHlaEjeAhbGoa:j^9eQ/_O2\O3€d8³ẀX®S«”^²§lº§pȬoÇ”RÀT³ŸU´œO ?£’]“vB~m(…j(ªˆ:Ÿƒ>¡G G¨C—ƒ8  ! $  "!   - -    -    !! ''   -   -     -  -  -  - - -    - -  -  -    -  -  -  -          - -0%, -   - %"0489;EH ;? 46,2&/(#,5 .7#+!$&%"$!!"!((::TR,TN2II&VZ+@H'IK'!&26JO#UV,PS-BA%IM'=?$02%26#9<$JH';;!>?$ED&<<'C:)86%44!6598!01$++()--KA-cR1pZ0o\1n\0aP,ZM/UK5VK9j\M¶ ¢âÔƯÏÀȱŸ•ƒ~Œ‘‰ƒ}€}u‚wiij\JJ9TJ4i\>|oI†|V€wWvoKd\HUQ=CE1FH6KH4PO7UXBc_;fc>g^:b_2YY2WR5WK0TM2[TAoZGvoLzrUpiM`[@VR>WRBcZBaYBa`Bb[7c\9aX9\Q3RH/MG/j4ÄœF¬‹E‡k5Ÿ|8M›„=Ũ]¸P­VŸ’VÄ¢\·K¬‰V¥‘L~t7cU˜y;¹•Hœy,¦R®QJ@…o0£o2©€=°Yµ—T  -  - -   -  +- (&   -)' "!     "   ! !  '  -  - -+&    -   -  - - - - - - - -   - - -  -   - -   -   -  -     -   - -  -  '05   -(&*+*+(-#,39@>>;<:EH'57+/(-16&%)&)2!"*/*.#' %%#!#%#'#&%,.[X1NP+VS)VS+JJ#KN+7:25?E HG"ST,AD$59%.5(,!%)/=?"HG)?< <:$GC,>9(?8$:6 46 95$66$:331./54OB)jR3qW6{]0qZ2hW0_R6ZN>TJB8==(QG0eQ8ocGodIqgEp_E]V>QIÆ®\»™R§ŒM¿‹As+g$´ƒ?ƒ5ª›P©H¬’Cˆr*ΫZƠ½pr)”{<˜h.‘m4y/…w-  %   -       -   -     - - "%)!+ -'  2% - -      $ -  - &1$  - - - -  -   - - -   "."    - -       $("   " %,),%&    !>?:; .4&/%1(,9944EB342368#',<;$28,.#(%  !#&(**$ +)-,+))+! %$ (+64MH,YW.VT.US/ED&DE#EFAC&JG%CG#6;,02715.47<A? CB%EB"B@%7485"<363!?6"74#53"4054"C9)SE-gQ1kS3pX6t[RUEOR:26*14!B:%UM3hT:mb>p]EcTDUK7PE9KB7GB2IG4TH6VR9]YAb\:XW9ZU1QI+RM0PF2M@/PH8VQ:_YA`[?]R9QM:OH0OJ7WQ6XQ7XT2XV6[W2YS0WO-KD&VH(—‹Q°–X°y=€j>}K›6vY!w@Ú·oªAs<›s9”‚<¯–F­…B¿IÏ­m®›U‘z3¯—N¶–2ÈJåµuÆZ”n,¿˜E…Ck_&  - & - - -  -  -  - -  -  -     -    - "  %!    -       -     -  -  -           -  -     &'&*1<<,-24 MD$HM$$C*V?,`E2\C3ZK;dW:bV:PI5D,A=,43$17&6:'69);B)8D//HE:RK=OL8VO6]X7QI/IE)FC,@;-F@1J>.H@+OH2SL6MJ6JB-CA2B;,LE1LF0OL,OL5PK,PH/MF*G?'MB+vW/qDº h½¢`¡a¸ŒMˆ_+•y<·‘A®U¡J“€>pU,j:»¦r¼¬a¦‡Hhj2‡Awf0³“aÚºv©|6¬~F§P£ŒP§G«€:  - -      -  - - -    -  - - -  #!     -  -      - -    !$ #$ $'       -  -  ! -    "  - -/460/&)         -    -## #&)'  -<+NB%NJ'JJ'J@";8OI*OJ)?A 57,.+''*)+!#&$***+.0") %## &!    #"67((%'('?1V<*R8"aR3VN2IH%JG*TO.YL*SD%ED'D:&C>%:7533.+(.,:39.1-9.K9'P<'O7*Q;-XD1QE6PE3SG1D8&72(83"=4%>6)77%/53415/4%DA0DG3;@(5="&1#,''(70"=4&>4/84+<51;4,C8.?<0?9.J>1K@3JD0PJ2QM2MJ3BB)B>+B8'D9,=5*@:-G>.IC2@?.>8'<8,A;,GB.B@/FH2PR>LK0NG,J?%E=(GB3tlB‹P¾ŸWµ‘I¤‚7«ƒ=›f6£‰K½˜U¡…U{9•~>r^8³€F>sv6vE¥—`©“U°ŒKЬe½O£—L» T¡•L–MœDbT   -  %! +)  ! -    -  - - - -  '&    -$   ! -      -  - -  -!  -  !   -     ! -" ")4655-.//#'  - " "   -    #%(*5625&)9643  $ ;7MF#NG(NG+E>!OC&JC!>@@< 76A:97!34!1/ 1.42,, '%!!&'*%! !# %&!(&53%$'$.*7)B(N-[?*]K4WN2KC(=;(:7?4"93"D7"EB'@9 8.:2.+&'*(+'/)>2S>,N:-L;)O<&L>/C;)C8(<2$=4 91$0(60#94$:8.1.0*1$.IH6KK4=B,05"&0"-'(1/&2)0$* * 5-'84+?6,=5)C;,F?.B9,A8*GD/LF-@;+A<':8,@7-:7(<3'=5*75%35)94%63,<6+=;5DA3BA.JH6HF-GE%DB&E?'BB,RK+~h¹‘M½‹?pT(\Z;vyD—Nª\Ë“Z†i>29!ŒVµ›VÁYʼnGÏZ¾•P­J¦”BÁ¢X­ŒP«ˆB©‰B - -  &# ('  -  -E6($  -#  - - <+ -  -  -   - -"&    -% &* (*     -  !$ !+ $ !   -!+/55+.10,.(* - #% $   -"$07*-03.3("! (&  - $"C>LC"EA$FE!LFD=9892<8B@ ?8 88 ?6938944%%!")($#%($&-,  *$(%$#    !%% $"$'&.).*2,/+" %#!( >$X4W6!P>,ND$>=#2.54<2$G;$RF*UD-I<&=4"751,%&% (70%F6&D5&:3)B6)C4%7/3(6,6,!.)) * 30"36(,(*'+%@A.EC25=%*3%/&1($*+ -' *& 1.!42)4-!31)94'85";9':7+>9(33"73#73&45,12'52(3-3/$01%/-64%2/#54+;:&>@-BA/FA)HC*IF8>>+=9-B<-IE5SI/s;‘~@£N£g‘k@›ErhHrgD«”M©ŒM–zM’o9hX,­˜[³“O­’Sªq>˜i;x<ºœ]ĐœP¿~&b%¤[¸¦l        -     - ->-/#!  -#   -   -       -   !!  - & &   - -  - #   -  %(.0//'',-.2$(#%() # # $ ('.'(*$#$ )-TC&NE%KG"LJ%@=$:97665:87787513/+.,-%& &,*,-($!+(.(%%!)*##6180,*/- 0''"!3'B)G(!I+I3 H7"JF%@@"<=&97D<#MA*UE)P@'G7$I9)=3 .,5..'5-#0'2+50%6.7+6/$0(&##!+%"!,+23 ',&))) ,27;%-5&.'$.$.'!(#( !".)#0/'.,&10%21(0, 51*53+32&00%/*"1)12(00&1. -.".0%/-#)' *-&/* 43*25*:8*89(=:%FA%@;+EH¤x8¡v>Ù¡f¸ Y|/…c(§TŒ=     -   -   -  ! - -    , 2$ 0$ *' - ,       !  -    -     - -#% !      ,! -   -    &($$ ,2!&##&   (# "'"""#("'$+ &" T?$eG%\J#NH(>9868/?<22#".) $()- %'"$#,,&%## %#'%&%%% ""$"!&),):-502,0($ 5'F+J2A)<%A) 5!A4)LA)ID)CA*B@'H>%G<)N>%L9!K:G>%H8"=-D4*"+"-),&+ (' #$!!!,2'+&)$)#$+18*4+*"-)3!",&&'�*3. 0-$-+"()")%*("-+#+( ("(&!/2",."'+&(*&(*&#!)$ +$12+/1&23$22%84=:"=6!>8(?;+=7&33!¡‚aÛevR&ˆj/>²˜O´z4¥ŒG—’S¾¯o±ªeDZb¸X§”O¤”Cˆv6}Sƒƒ[¡ŒC«}7Å‹M®W€n3˜d$œk%¦ƒ6   - - - - - -   -#  -   - * 1" 1%'  * 4"#  **" * 0*&'     -  -  - - -  -        - -      -   ).    8?;43;8 @;"841-'(2373&(!$ #'+-+*'(&"!%$'&#!*$&!" ('..,-211.('+(616+1)3. 7&H.!<( B(;/$C3)?2%H9,F:&;:)88$48#=7$B9M>$J@'MA)H9"E5#3(.!* )& "*.&+$(&%,'1)2$0(!+&2%/)'"!++%((((%') ! !#!$""$% )) (+!&(# !#&!!#!#'$'($*+&.10/311924;2@IDBG@HHBB>3EF?HKL<=8_SB’b?vW~nR†}L­”EÉ¥f¶”Q¨I¨›N™”Q³’J­¢]–M§”K©‘O¾™O¹^±—P²~5¿ˆH²•HµŒM±x>¢})Ä©I - -  - - - - - - - - -   - - - %  -    ,A,>,1"& ' 6$+ * 7&2'9153 - -        -  -    #    -      )- - -  -"&$"(6)))$%! - .!* &"22N&\+T0ZD$F?!A85010=9911+)("!;2H?):5%71*+-,.,0*;.6.-**&,"4*,%#($'(54:9#56 ;1G;(0,<181=4"?5:18.2*"E7);-!6/%B6*>7-04'<4*>7'95 32-/5:"=7@3J8M=+<3*!!   !)',!")"$1%0#-'3!')(2#-!'& "")#!&!% # %!% "!!&%(-+)+,&'-4;M1:C6=HWCLLIPVOT\WcpFLNZXVzgiÉp¨XrwP©—YÚ¶j¤’b£•h´¥`¶¦`…5‹€<‘{;±< {6»–U¶‰C¦E¬“JfBvQ+uQ'­w8¸“J›> - - - - - - -    - -  - -     #   -   ?'J2=)0!# 3#.('*")/#+(  - &&       -  - ! $)"#     -  -   - $ '+#( %#!! '&,$#"  $O.f4d8`>([F(TAC<51:2@5!0-,'+)90M?+;7 <03/3.!3.1*:.8- A4$@5#84$>15/":74390D<$E<%H=&E8L<'D7!J6#A6 <3!?13/6."12 =;*4. 1*".* ,-&+)#53A68000;=$A9:4802-/,""%+!' '/ )4&-)"+$'1$-# ,#$&+&$%)#('$'%!(,"'$&/3&+/'.8'.59@K:DR;BN=LXKZgGUfM\lM[oM\tdpzn^¬p¸¥‹Ç¦q´d”}YƠ¯cÆ¥_¬R¸˜\ª”R”<—‰3˜~/®};¡|K›tBqEv>”…Eyp@‚b?tJfY7‚lE›‰q©›‰ -  - -        -    -#   -  -  53**&  # &  %$% )$  '! ((# !#        - -(* '*&)   -  -      -  #"  &%+4/1)*&  ,#5'$ '!B-d6#a5"e9j9l>*]<%ZE'RB&E: E7 B2>41/*&4. <;"91:14)9,)!+#,"2$=08/:04(4+C8!=2L=*RF#OF)LA&M<(I< D<%K:N<%D7"++ '++,+'*)"46"?<76 <6 ;9&,+)#! ! #  - #)&*%#$+(2%,#-)&#,'1'$#!$&#&   #$"&$$ !#)0@$)5-3;?Mb09BCQdPf~HUc9DMATofmyrt~¯—gà¸q̉±d¶ŒSÍ eÀTÉ¢_Ê«cÀ’K·=©€:˜€?|=“g)§W¬‘QÍ¥]wS{T$Ă›PyL¿–mÖµl±¢zhnj]dccr -  - - -   -     -  -  -)(   -$   + =82:?:5214*41) -* (%(*!*"!    ,!   " /0!      ))73"! ''*& -  -  -  -  -   ' (&  J)@,0/)/#*(;-X4 ^2h7X)j9#j:j:%j9g>!cC.R;K:M>F9!B7!"$#"%%'  # '*+ )' )!3+40!F=!><%C?#=?%C?"C8MC*RI'NC%A7&++)$ ""%!)*/,#$%%)*488; :6!.. ""!##!!$' (&%!*(0$-#-& ()%.!)%#!&(#%$!"!  "##"  *16(,*)3D(4E4CX0>P;RaJ\p>O]MYpnvw²¡i¬ˆj§”r̀°qÊ¥aÔµtÅŸW¶–K¹¦]´§YÂL·BÄ•Wkk5\K-o2‡‰¥`y?“€D›…I}n4ƒ|j­£‡Ê¯iÈ©pˆ[—nGueQ          -!  -  -  -!%#     % ,1558BEFCC@88<:77+ 1239"4(/$#! ! ) 1#$   '$!    - -  ($)'  -  " &         #  'E*A0!?3"A2!@)O-X-V-a6']1^3!X2^1Y.^5U5G2B5UM$E>46 +&"%&#&*&,$-&, -)0+9875!229A6<36<4!D>&32!)*,+$ %$)+$% $'1++)'/",.32367/0((%(&("%"##!  %""$&$-"+$,$)"(%0&#%& &&"* (%# ! !&&!$"$'"$".>%))4C2>L;Lh8F\8CMFZpOh†Zo“—v¿³pÈŸc­ZǶwŬmÔ°qÈ£UĨTĂ™P”‚6¶ˆPÁŒ<Ö¨X‡QY[acadolj•q–w@ŸD«Fzp4ɽ•©–fƒEŸx:¢Gi$^2  )  - -% 1- -& +!  -    .+ '#  - # ($ ')+37;;<EDB?@B5>!36</3;";#7'/$.#6*8,-( 7&;*) 4&%%  "   - " &")"( .&'$ -,!#&   - -!  &4.&42*3(8 @$C!H)O(N(H%F%D N0A5)'B9JC @;33!*$,#)")"'%)!('!+"**.$,2):4 ./$%&-1 37 &)"&! !#<7+86,**.*/.!&'"& &!$)(%%/%0'/120.*,))(%"$$## #% &#!&% ! ''&-(,&'%% $) (%- '!%!!" #"'"'"$&1&/>,7H+4=0>T;H^I]|EcUm†Vo”q{u”r± s¾ªd³mζtÄ’Q°z2Ă“GƠ¡PÁ’I«ˆA¬‚FÄ–JU‹‚f„˜ˆo€R°t.®P‘sGquA®“A§|0}g*yz)xg4]-§s; !  $ ("3,;-9) * $ &! ,& ,)   *!  - - !   -" '.1,64?F&C>EDDBFA74.0 =9<"D)E+B'J,H,?K*Z7I2I3*$&!  %% -# (&%%%#"  '' )% %"*    - -  "% - #)6"1+D#@+:$J7B>$*88K@A;53,)$'%)'!)!%!#% %%) (3%(!31 0+!#$()',$(1/#') BQiTo’[u“‹˜¹¨~­n̉µfÔ¹iÊ«a—b½?‘D§†T—J²–S¬|?ºŒIĂ¡G¨˜y¬“`¬‹_²‰>¯•W¢‘^“Œaœy<Á–ib3lc(³„QƯªdĂ—U   - - - -+! 6)-$ *! )# ," (      $ *& ' *.+56B":>4D"FEDCDF?8<9=45:= ;EQ,L(U)`7H3?+/ 1!, ( -0')( "  #)()*"!   -     '."-  - - - - -  %) -(C/H> '(0QF<5'*#$$&&0#(1.$%'%%') #/()*"%$$*()$#75,'$*(+&72*@9/31&#$"%! 12!08$)0,0')*,.,**'' &('*'$$%"""% #&%%"##  $ "")%+)',4'2C>Pq>RrEVuFWuFTjKa…Lf…QlKfŒ[w]x¡€ª·’idz‚Ķs̉¯c©zCzZ+•R¢T®œlÓ®qϨY¼|9²˜^£˜p`‡xW¤[¥b™…R|3°–:ÄŸhÀ”_̀›f½ŒGĂÌ•X¿‘P  -'#          -& &  % ) +2!/-629240=3E I"F D?F!FI=DE=B@=:;@BG!KO,P/3!6 1/. .'0)./%  )1- /2 %   -  -#!+((*$%   $!"-$/).'PC(ME$;7UG;/ $%.&$(')50,%%#(  ! *+"%$"&" ++#2.#$#<92+-#"  98'49#14&22 0/.1-.-/$(#( " 0) &$$ $! & !&"#!$ &"'*4)4D,8N8Hf³„A "!  - -    - # ! )))**-0-15<75598;"GFC"DBDDE#CEACDB<?G"G$I!V,<$I*=(5#8)0.,$.&$*  0!61+62  %&.$+! !        $*"*# !/&*)5"QD&YI%YI(K>'("'"%(*/%-"(  ()%'!(' !$"..'#&# +.0364)45&41.0)+)."%$" !#)(!&%%*!"  &%'3#.=.D6m(„[) -    -  -      - -( (*).10 -2054;/6<4=><F"GBJG G'DG!K$CCBD#F F%E&F$J%R)G+H*@.1)/*,()$($-))$)!.$851431#-#-&/#1,$-##      ""#*',(,'*!$))'#/1"M:aF$QH&(,#" )(*'('#$! &("$$!#2.*+'!#&%!$! (*-1#+/%%$#'$ "'"%%% #%%   !! %-+;6$*!&$( #  ! #&.)5%/B2?WOd…Qi‘Qh\tl‡¶mˆ·i€¬oŒ¼f€²•¹§©¢–ƒ¯‹dª…VÆ^º;Ä™@¨„5ˆkU˜|l«†m™‰jÀ±‹¿¡So+}i=†~m’”a„Œf§¡…­’_°•T¥¦€‘—¤ƒV|dA‹i4|ng•{Q‡RtT&             #' ' '+(-*+-.,- 54718<; D"C>@BC C!BE E!E DE#CE"G"K"I!D&<+,*+*+)+(*'5,0$1&9(="<9:75=1/5(+ $      ),'"$(%, +") )'+(2$:,+%"#(#"$     "1-"&&-/'#" !#$$)"%,*.,""$(&!  &&"**,+22!!& %!"( #!#"!#$  & *9!,=,;S@SvNe^w£h€­nŒÂl‡µl‰»tŒ»|”țǛ¡¶¢“¯—œ¡®‡q¶cÅ•TÀŒG̀ŸQ›‰G”ˆa•Œo­¡—ºœ‰¹–R«œP¨P€x=¡™k¹l¨g›S†M”{>ˆz:¬¡w“‰‹ƒ^‘O“~Zzy|fT4YI*hY(       -        - -    !  - !  -#  "+.(%*,!)4*#8,"2'4&B"?9A>CE E"DGK!G$D C K#I G!CA(<.//0+2*;*C'D#@*91 568519537"7)!  * )()% '&+%,'&&+% #" - - -      ! --!%'!%+* %(&+,( +."$*"&%#:/30#(%!&%!#*%/)0!3222!00')#" !#%!&#"%% !"%!# # %")"+$/%#1#*<"-@5FbLga±i‡»rĂ}–̀x•Í€˜Đ}”Æ~™̉…Ơ¨™¥Ú TÂqƤ‘§¡Æ°¸¢¢¹l¦‹H¿—T»œQ´®‰kÀh±Ÿp¯¡e£a§–P™C£‘V£‡Sº–L–2gf2USmj3›Œ„‰|Cwk±¤{uOjgSRL&VV5z|O - - -  -    -          % '   -  " $% &#.* /"6;%7( >!FM&DGL#DJS"G$AE!GL#C!87+1%:$C$I(F#CF!56955*/214$:0%-&0-#$(%!#   "$())+)))+%%"#    - -   %!" 2.  !($!$!+-*-+# "!'# "'$'*&%*(#&&!(/0 ')$'!&#) #$&(! $$#$  "$!*$*#(%#,'4F.>U#)2D6Hf1>XRrEY}\y©[x¦qÄ|Ñ}™Ï„ Ù…Ö‡Đˆ¡×~œ×†¡ÖŒ£Ù‘¡»À°{Ô›]È—_‹}X„J±—O£>Æu5”K¼›Lo(jY*wf.¬L­}Hª‹Xµ‡T”e:…zgƒ8„|\psT“…j›•À¤vÛ½‹¤—r’pF¦’P^M!$ \L ¿”G©‹A - - - -    -    -     -          - -   -  #  #   - -  #  #  # ( ,2'1-5!5$A1$=-@*E#I(J+H+I0 E%M4#WA.K1B'>(B6*?7)F8%<.<*A3$=4&4-!5&0".1#+#-".***$$#$$$ $-(.())&#  &#$ $"  !  &###'!$$!%'!"(*0(*')$)%'"%+""#"""''  ##"!$ $"  "# ,8B:MeCVuI`„;PrJ`…`y©^z©YsŸWo–i‚°i‰½nĂw–̀… Ú…ÖƒŸØ…¢×€œÔƒÔÔ‚ØŒŸÙ¾«˜Ïªw¿œwÆŸ——¶‹o{BŒOŸs6¨p-c&cW-Xet©¢×¤dÙ¢^äjkjq\awo{™‹‹}·£_¹±‡¸œmË£gÅ°z™„Hs2¦r7¡ŒLee3xn2ƒq*¾^¶–Z - - - -    - -   - -    - - -   - - - -   -    -   #         -  & )( +* , ,!4(,"/ +5%;*9+7(8&:":)3%$08'9"70$6#+23. 1 /+()+)(()()%&&&*# !$2$( 5' + /(/$#     ("$)&#% - - %%##! )&!# !&*.%*!%!$%)*,-/ %) ' !#$!&!"$ $%$$#%!!"#"++(2; '."*7$*#/$,8'3E+6F*8MWs h„³c¯g‚µl‰¾l‡»j†¸pÇqŒÁqÂv“ʃׄ×~ƠœØ„¡ÙÖ‚›Óƒ Ø€œƠ„Ö€›Ø¢¾¥¢¿¨¢Äœp§™¯’~lY„v[”};` xd$WSw‘´Œ›̉̀˜TÏ®k©–v‘ª€Üu…’˜e¯Vèb¹˜TĐªj½¯~xo<“}1£v0‰€3™L¡Q –N­£uª f - - - - -   - -   - - - - - - - - - - - - - - - - - - - - - -         -    -  -  " ($$* ' (*+( % & '#$#)"' -$' '')&&&"()(&'( #'%*#% &)!,*")*'$$     '%"%+&#! "   !$!!"$$ "&#!!!!*$)#'" %#'##&1.(+#*!&#'$"  ! %) $,"'/'1?'1A8H`+7J0@Z1>V/;M)7N6HeH\Ea‹PiBY€Tl—x•Ïv—̉t“ËtÅu¼|—Đx”Ë~Ôz—Ñz–Ï‚œÔƒØ~Ó~œÓ€Ø~›Ơ€̉€›Ô}›Ö}›Ơ›ƠÓ}Üœº°•À§‡¾¦’–”{{¤R±¢X ‹JMbgS{›Ç›Ø¡›®œ– £•«¯–¥ •©•—§‹=‡|.mi,zg$£w*¸‡7†>|r:œ›[¾ª`}5w;{{6²£j - - - - -     - - - - - - -   - - - - - - - -     -    -  - -        -  )# #  (!! % - -    ""!#()" !   !'#!*'! &  $"+*!#%%#%!"(++)-%)!%$*$($ 0,)'()&$! #&!!)!(#!",;N5He9Nm6JhFZ{Yu£Xs OeŒRf‹]w¤NdVo—b}®b}®l¿`}«`€´m‹Á~™Ó~˜Ñ}˜̉{—̉€›Ó€œÖ~›Ơ‚œÖ‚×}›Ơ€œÖ{—̉„̉™Ñ{™Ô}›Ơ~›ƠÔ|›Ö{˜̉~œÖ~Ôz—Ó~Ö¹²¿Ë³˜®¢¦¡¤µ‹µ­È¢gµ–O¡‰oˆ‹{ˆzv½¯¶®¡¥­“„È·“…›Ë¹‚™…S‘ypˆm¹`G‰|.…q=¸Œ=«mœm(¹‘F±¦^À™Fg*kS!ƒK£Q - - - - - - - - - - - - - - - - - - - - - -     - - - -   - -       -     -     -      -"  -    -  -     -  - !#           #")!(!&    "#"+*-&" &%%(..+.*.$(&*!*'-"*!1'%%!   !! "/$/?CX{Zx§e†¼n‘̀v“Ëu“̀y–Đv”Ï{˜Ór‘Êv“Êv–ÓoÅfƒ·oŒÂw”Ê}˜Ó›Ơ|™Ôx—Ñx™Ôy˜Óy™Ơz™Ô}›̉z˜̉x˜Ôy™Ô|™Óv—Óx–Đx™Ó{™Ô|—Ñw—Óz˜Ó|›Ơz™Óy—̉}—ÑÊ™«Ă ¼­­’´…˜Ă¢’¯¿˜™Ú¨]¥†T•ynlgwlt•·˜~Ç¥ƠŸ`ªœ‹˜£o…‰c¥iœs#ˆo2¡x>½ŸT®—S¡…,~r(sY˜t%· Mƒ]"g)©†@ ‰FD - - - - - - -  - - - - - - - - - - - - - - - - - - -       -  -    -                   -                   ,**(&(%"#")%'$%$)#+$**.!" .5Fa?SsQj—mŒÅw”Î|—Êx˜Ó|Ös’Ëz–Ï~™̉w–̉z—̉w—Óy—̉u”Ïw•Ïy˜Ôy˜Ô}Ôz—̉v–̉x˜Đx˜Đy™Ôx—̉y™̉{Đx–Đw–Ñv”Ë}Đy—̉v–Ó{Ơ}›̉v•Đ|™Ó|—Ñv•Ñ~Óv–̉w—Ö »œ™€‡˜™°Ÿ–§¥¬¨—£±gˆ—·‘†£§–q˜â©·¬˜§˜’d~¹®¯§»jŒyg}K°‚A¿“Y·Z¶ªx³›Y{{*_Ye^$®ŒE«ƒ;–x;†i&„w%«‰I«¤M - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - -   -                           - -       -!     "&"$ "$#'!#%((.#(!"      &3 0A+Pld€²x™Ö|™Ôv–Ñ|Đu–̉w–̉y—̉t•̉v–Ñs•Ñx–Ñu•Ñw–Ñ}˜Ñv–̉t•Ñx˜Óv–Đv–Ñx–Đw—Óv–̉y—Ñu–̉w–Ñy˜Ït•Đt•Ïw”Ëx—̉u“Íx—Ît”Ív–Óy˜Ót•Ñt”Đt”Đv–̉s–Óz–и€º“{„£­’™¶ˆ|¶”’±r’Éœ·®˜…›ºw”Ë–”§´z³–W’e“©‰ˆ m‡„Œ¡‘U¨™Wª’b§Z§Hu+nn)‡r-“1qQ#F(‘o4lK">$ -MX - - - - - - - - - - - - - -  - - - - -      -  - - -   -             - - -              - !    - #"!"""'"     ):=V|vd€j.xa-§‡7——H­T§‰>ˆM“h±—h•6   - - - -   - - - - - -            "  " $#'&!#$%!% "% # !&#%* (&                   -          '5J_z©m½rÁu“Ér‘Çv’Çs‘ÈpÅoĂr‘Ër“ÎqÄoÁt”ÍpÆt”Îr‘Çr’̀r’ËrÆr‘Éo‘Ër‘Ér“ÍkÆoÊqÆs“̀oÊmËpÆq’ËmÈp‘Ês”ÎoÇr‘Éq’̀oËr’ÉqÇnÊq’̀m̀lÈs“ÍqÇpÇr’ËuÅpŒÅtÆ¥–€½ €²›—§™‚uyoÊpÇuŒ¸|‹¯qÊŸ–—ƒ…}’À‚’•ƒ…‘Z”“¡› ¨¤Kua-”x,‚^‚Q‘y;Ũdy3‰1”4°‰8¹B¨˜s’}J - - - - - - - - -  -    "  "!$%%$! "!&!*%$$"!) !($,""($#* %,$)-#'2#(/%-7")2 &- $(!( "(#"("", %") (! "#!#('+7#*8'-6)6 #(##(!     !!        -              - -       -    - F^ƒi„²u¿x‘Ăs‘ÈuĂn‹¿rÅr‘Èq‘Ës‘ÉnÄp’ÏnÈkŒĂmÇkŒĂnÊe‰ÄlÈpÊmÆkŒÄkÈiÂjÊhÈh‰ĂlÇk‹ÂlÇeÆi‹ÈhŒÇgÅjŒÇlÄhŒÇjŒÄg‰ĂhŒÇk‹ÂjÉpÊoÊfˆÅg‰ÂmÇjĂh‰ÄmËq’Íi‰Án“̉‹ —ªª˜›“\”¨lĐkÀnÈkÉk‹Âp‘É’­k“`Œf‰u„’ƒ±˜™n~‰mRR?:9&jQ&¡s,0:*0?-19.5?+2>+2B*05)/6'.:&/8.5;*.9.14*3@+4<)-7(0@%+;)4E*2@&-5!*7#/@ )%!+ *(&   "   -                     - - -   - - - - -           - +>Wrr½pŒ½l‡·tÂm‰¼t¼nˆ»n¾jˆ¾h‡¼nÆi‰ÁlŒÄj‡»iˆ¿h‡¼f…¿hˆÀfÇf†»iÂ`„¾l‹ÅfˆÀeˆÄj‹ÅhÂh‹Äc†Àd‡½c‡Æh‡¿c…¾c…ÀfÈd†ÀhÆa…Ăc‡ĂiÂa†Âb‡ĂgˆÀe‹Êg‰Äf…¹gÅa‡Âf‡ÀiÉc…¿e‡Àf‰Âc…¾k‹Æh‡¿h†¼hˆÂ_…Åa†Ăh‹Æh‡¾fˆÀe‡Ă~·‘”«Ñ·”¸£©}˧]É­iµX—z>µ†_É¥|mVSI)78.;<.MVdD;/45'(€y\ª£`–q-uQ&lsi -  - - -  -       $#%%%%.#1!/)!.#1%3&5"/'8%3$4"/".!)4!)/(7&0>$0?&+8',:&0@&/=%/C&1E,6F-9J-3?-6G-8G-6E.9H,4F+7M,6C,4D*5E(1?*0>,5C)1A+3A+4I.9G.5:+2F.9J(3F-6B,2A")=#*9&/:&/$/$-", *'$ !!                     -    -        - !-)< -LBKWhoyHDBG3Ÿ”dysD–8£FxsJ - - - - -  - - - - -      $+'(*/!-&:#8%2'8 *$5 *;'6%4&8'5)3'3'8(<",<':*3@&/B*4D)3G)6K-8G+2C+5G'4P-8J.7C,7H+9R-7G,8M,8I39H.8G-9K,5I,2D-3<,7M-5A-6@,9O.8I,8K.8J.7E-9N-6E.4;*5F$.>$+3$-%0#(#-)($ "$.       -                - -      - - - -   #->9MoBY~@X|=Rsfªl†¶j„²l‡·jƒ´p‡·k‚³j„µl…·l‡ºf‚³h‡ºh‡»h„µbƒ¸i‡¹i†¸c…¾cƒºa…¾_‚¼eˆÄb†Àb†Ác‡Æc„¾e†Á_„»e‡¿a€¸_‚»cˆÄb…¾`¹d†¾d‡Àc‚º`…¿]€·b†Â_‚º_ƒ¾^„¿^ƒÀ^ºb…½_ƒº`„Á^ºc‚¹^ºb…Á^ƒ¿`„½`ƒ½_»^‚½bƒ¹_„½aƒ¸]~´b…À`ƒºa„¼]‚Àd„»v„£¯~ek-ah6jƒ¨ƒ‹£’Œ–Yl”b{•€‡{zgzyZojr^v¡l¢h}¤j{“^jƒW[SwmL|hXwi=vb@rme - - - - - - - - - - -      #"%%+ 4#4!5'=(9#1&3(4%2!)$0D );%/=,6F+4A(5F(6M+6F*8M'2E+7J-9J.8L,9N3:O29K09M/8H2:L.9N/9O-8H,5D+1D-7B.9N-8H.7E.7F09L19K5:K.8I+7L+3H-8I.9I)2@!)<#+:&3'0#+ )&!  '                     -  - -     - -  - - '7R=On`x¤j‚±e~¬e€­i€®i€­i­i®jƒ³k„µl…·l†¶k…´i°i…ºk…¹e·e€²h†¼f…¼dƒ¶e‚³f†½g‡¾`„¼^ƒÀ\ƒÀ_„¾_‚¹a‚¹\€»^…Ă_¸_‚»`ƒ¿[½\‚¾]~´]€·\~µb·^€´]º\»[~·_»[¹[€¹\»]~µ]º^·[·_€¶\‚¿Y{±d‡Á_„¿\»^ƒ¾Z~¸\€¹\¸]}´^º]}±`ƒ¹^‚¹_ƒ½]·b‚¼b†Ä—Œ‘x}`}¥d…½u±tˆ¥h‰Áh„¶f€±c~¬w‰­¨‘¶~³m‰»PlŒ-4,Vhvpxip‚¥Sc‚VWeUj - - - -  - - - -     !!'/++#6$5":'9&7)=&9':"*7(<);!.B",= +@!-B,>#*>$*:)4H%0F'1@*7L(5H*7L+6J-7E,7I.:R-9M-8M7;M-:P09N/:Q4#.B$0#-8%6*,'''       -                 -  - "  "1#4OD]ƒ`w£e|¨i€­iªi}¦g|¨c|¨g|¥g~ªh|§h~ªf{§i‚³g~¬h€¬g­f}©f|©f²a|­f€¯e~¬a{ª`´a€µ]|°^€¶eƒ·]|±]€»\~¶^·YºZ~¸Z€¹Z}´ZºY}¶Y|µ]³Z~µ[¹]€¶[|±Y|²Xx¬Xy¯Xz°]µYz®Y{°Y|±Y{°Y|³Wz²Wy¯Y}·Y}¶Y}´X|³X|·Y|³Y{°\€µZ}±X{±X{²Y}¸Wx­]¸Z}³\¶_}´]}³Ww«\}²Z}µc‚·]³^¹Vz²…ˆ¢‹²£†‹“‡œÏ…K¸‡V€~‹™’Ÿ|Œ°dƒºh…»bƒ¹c®q€a…¿]º]z¨ -  -   - - - - -  -   #&%(*'!20%;(:&?(A*? ,A'<(A!,@ +B .I .C$0F"1F".B*5F"0H*6M'4H#1F+8O,7F-4C)3G+6J+4I,:S+9Q4:N2:N.9O09O4:N9U7>S.;P8>O.O39N29O19N3=T4T2@S5?Q7P7?P1=T6BV7=R6;Q7AX-;R1=Q3&1D(3H+5J+3G+9R,:Q,9P+9P2:N.9O+9O-:P/Q/X5AX4BZ1?U8BQ-:P0R0=S0=R1>S3>P2Y†4P|JjœXx©Z{°\z­Xx¬[y¬Yxª[xª_z©_y¨cxbw¡\sby¢avbz¢^z¦^v¢]u _x¢`vcz¤`x¢_y§by£bz¦a{©^z«`y¥e{§c{©bz¨`z©_y¨_zªYy«\{­Zw©]y©\yªX{°Xw«Ww«VwªWy­WwªWx¯X{±Xy°Wx¬Wx¬XwªXx«WwªUt¥Qq¡Rs¥Pp Us£Us¢Us¡Wv©Wv¨Vt¥WwªWw©WwªWw«Vv©WwªWw«WwªVv©Ww«Wx¯Xx¬Ww©Ww¬Wy°Ww«Wx¬Xy«Wx«Wx¬Xy°X{°Xz°Xy­Xwª]|®]|®_}®[z­b}¬_y¨a|¬b²^|±^~°]|¯a€¶c{¥[z¬Xx¬Z}²Yz®ZxªVy±TuªOi’Yy« - - - - - - - - - -   $"*-3%:&<':,D.G-A-G!0I$1G$3M 0I)B"/B /D!/D/H-C .D 0G$0A$0E'4H$3K+6L*8P)7N*5G*7M,6G-8K,9Q.9P,9O29K.:P/:R3R5R1?T/U1=P5@P+9R.S4@W/=W.:T.9M,9Q(3G#.B#+8 +>'7&6):#1)##$#!           %  - -  - - &)6M$5  /EAX{PoŸVwªXx«Ww©Yy­[|±Z{°Ts¦Ww¨Ut¥Vu¦Wv¨Vu§UsŸXw©VwªYw¦ZxªYt [u¢Ys]uŸ]r˜\r]u`w[t^w Ws¡`xŸavœ_y¤cwZt \x¦ay¥_y¨bv`w£_vŸ_y§^w¢]u _uœZv¤^y¨Zu¥Xu¥by¦\v£Ut¦Us¡Vu¥Tt¦Vv¨Vv¨Vu¦Wv§Rt¦Uu¦Ut¤Rs¦Rs¥Tr Ut£Rr£Jk™Us¡Vt¤Ss£Vv¨Uu¨Ut§Vu¥Wv§Ww©Vv¦Ts£JmŸOoWu§Vv©Uu¨Ww«Uu§Ss¦Wv¨Wv§Xx«Vu¥Ww©Vu¦Wv©Wx«Xx­Xz®Xxª[xªXwªZxªZz­Zy¬\y©]z«]y©\x§_y¨[xª]yªWx¨[y¦]y£Xy­Vu¥Zy«\{¬Tt¦HlKl„kro†b - - - - - - - -  .M"7[1V3[,M-$(08#8+F+D.D%3L#0E"3N#3N&8Y'8T#3M 1K .F .B.F/E.C -? ->!/F#.B*7O%4J(4G+8N&5M+8M)5I*5F'4H,7I.9P,9P+9P-9P.:Q1=S0=U/;Q2>X1>T0>V2?W6?O6AZ/?Y/>Z0?V2AV.=W0;P4>S-T3?S4>Q29M*6G)4C$1F%2F$/C'6+>'6!0(7!+ * +",*&"               %1D ."("1H4Hh7Mr.@[*):RWw©Xw§Vt¢Us£Ur TqœTs¢Qq¢Wv§Vu¥UrWu¥Vu¦Ur¡Vt¡UrŸTrŸWw©UrŸVs¢YsŸZsœZqYsXrœYsœVs¢ZsZr™[t\sœZu¤^r–^v ]s›]s›_u_u›]s›bt—\v¢\tŸ^u[tŸat]tœZrœZs\r˜Zr›UpYrTqŸUqTs£Tp›TpœTr¡SqŸPm˜TpœSqŸRq Pp¡Vt£Pn›Qm•KlœOm™LmUs£OnQoœLmQp Tt¦QpRr¢Rn™Qn™JmRoœUqMnŸTrŸWu¦Us¢Rq¡Vu¥Tt§Rs¥Vt¤Ts£Us¢Us£UrŸWu¤Wu¥Yxª_x¥Yw¨^x¨Zw¨^y§\yª`x¥Zu£\v¢]uUs¡\x¦Zw§Wu¦WsŸUs£Vt£Ww©Ut¥`t“Œ‰xzj_“‚q¯’g - - - - - -  &;&;c*@h)=a%:_$8Y&;`#6V 5W/P,H.I 1M1P"3M"4R#4O$7W'6O%6S%7U&8V'7S'9X(8T%4N0L%2G$1D$1F"1H .C -@$3L&3G)6J)7N,9P,9O,:Q,:R-:P+9N2:O.9N+8N+9R1R/;P3C\.?Z1@Y.;S/?[.=V4S6?S2@U.=U4C\2?S1>V3@S1>R+9P,8N&4H%2F"0F&0> +8"/A ->"0%3(4%2!*#/"/%"           $$5#3(:0FjDaŒKg’Mi–Wt¤HbKh”Lh’RpŸPo›So™TpPq£QoRqŸVu¦SqTqSs¢Wu¦TqœVu¦TrŸYv¢VrTqVs£Ur¡UqUqUqWq›XrYq™Yq—[sXqYr[u¡Yq›bu^t[sœ^uŸ^s—Zp–^s˜^t›Zu _s]t]tœ\uŸds’cv]q–]s˜Wp—YsWrŸSn˜Tm”SpQoRn™Rn™Mk—MmœOl—SqŸMl™Jj™Nk–PpŸVt£Mk—KmOnHlNnœPn™PoœTs£PoQn™On›KhTpœNnGi™Ml˜QnRqŸSn˜Ml˜MmIj˜Vt¥On›Ro›Tt¥QpŸVs¢Ur¡Xw¨Yx©]u[w§[v¤Zx¨^w¢Ys _w¢[v¡\x©\u \w¥\v¡Zv¡]x§Ws¢Yv£Xv£VrUsŸUs¢Pp¢oyˆ—…h‡v]usc‚z| - - - -  -#!0L.Ci.Di0Dd/Aa.@a);])<^*;W'8U$6S&8W%5N(9V$8T 3Q'9W&9X$:_'7Q$8Y(9Y)8R&8W)9W(;],;X$5R'6Q'6O#2I+@ -C!.H#0F+9Q+9P,9P,9P,9P,9N,9O,9N,9Q+9P-9Q29I,8K/=T2=Q,9Q.R,9Q2=P0=Q-;Q.=T0=U4?P0>T3=T/T/+<(6+=#/&3#1#1!-&&         - -  $%80Hi;V€5P|E\PiOl•Pn™Pj”Ml›Lh‘Pn›Pn™OnœOm™Mk•PpMmœKk˜NnœJlOoQn›SpœTr Rn—TpœTpœSpTp›Sm–Ur Tp›SoRn—Yq˜Tn•Vp™Xn’Wo”\p”Wo–[r˜Yr™\q”_r–^t›\p“_u]s™Yp˜ZsZsŸ]tœ]t›]r—Yrœav[o‘_q“bs–Zr™Xo”Wo–Zq–Um“XmQkTo˜Tn™Pk”Nm™NlPm–Lj•Mj•Kj–Li“Ok•Pk‘Kj–Mk—Qm–JhIi˜Ki”JkœMk–Hg’Ef“KhFdLfLj”Be•Ok•LhIi–JlœIj™Nl—Ij—Rn™On›OoNoQq¢UqUt£Ur¡VrVpXt¢]u \u [u¡^v \s\tŸZv¤\v¤]tYu¢XsWs¡Wt£SpœTs¡Ws Vq›YqSpTt¦Zs j€ŸLl[qŒ - -  !#3N/Dj1Eg2Ee0Dc2C`3Fg/A\/@\.>Z,=\-9P*;X(8T(9W%6R(8S%8T&:Z'7S%9Y(9W*:U*9U):X*<\):W&;`(:Z+:T):Y(;\'8T%3I'4I%4J&6O*8O(6N-:P,9P,9Q-8I,8L-8I.9P,9P,:Q-:Q.:O0;Q,9Q/=T2@W0=T/=S.=W.:S09P/=V1>S1@X.U.;R0>U5?T0@Z/>W.!.>!->,?+<'6&4"/$.".#-(         - #2(6L):S;RsKfHeˆ>Vw>TwOk“Pl–LgJgMiGfPjPiNhOk“Ni‘Ol˜Mj”Ok•Qk“Kj—Mm›Nm›Pk“Sm–Ok”Rn™Tn—Rn–SpSm•Sn˜Rm•Rn˜Yq—Tn—SpœRn˜Yq™Xo•Vn•Sm”VqœSoVq›ZsUo[sœZp•\s›Yo”[q—ZsXq™Xq^r—Vn”Yq›`q‘]oar’_r–[p“Yo“Xn’[nXo”UlSjPiSm•Sn—Lh’Nj”Oj‘Ii–Lj•Ff‘Ki–Ii–Mj•Nk•KhLhJh’Ii—Li‘Nk•JfLi•Gg’Kh‘HfGf’Hg”KgLhGePl”Lj”Df“NmMi’OoMl—Om˜Pp¢OoWu¤Us TqœWt¡Yv¥\uœ^s[sœ[s`s˜\q˜\v¡[u¡\u Zr™]u Xp™Vu\s˜Vr›Ut™UpTp™Tm•Sp›UrŸSpœPmSpŸsƒ "3(9S/Ch3Gi6He4Ge1Hi2Db0Cb3C]/?Z/A_-\+;Z+U2>Q/?W."/>*8*=(5&8".'6#1"      !0FOj‘Rl“Rl”Sl’Rl‘Sk‘QiQjNiPk‘KhLiMhGdMgLhLi“NgOj”Mi‘Jj—Nl–NiKi•LlMl˜Pl–Rm•Oj’Pl”Ok•Rl“So™So™Sn–Rl”Rm•Tn—Yp—Vo—Rk‘Pl”Wn’Tm•Tm”To—To˜VpSn˜]r˜Vo–Yp–VqWo—\r™Yn’Zp•Wn’Wo”]o^p‘Zp–bu™ap^q“\p‘VmWlYmYmPjQjQjPjMi‘QjOiQjKi‘HdJfG_‡MgRm—Gc‘Ni“Df’MhFeHdLfGe’FaJd‹DbŒIf’Bc“FdHg•Ij—MiGg’Lk–Pj‘LhMi‘Ml˜LlNk˜Qq¡QpŸPoŸTrŸVrŸWrYr™WrœYsYs Zr[t`s—[v¡^u›Yp•XsœZtPk‘WrœWr›Tp™Vr—WrœTq™Tr–So›Qk’SoSo™Nk˜s„“"-!+"1I0Eh5Ik1Ef4Hi5F_3Fe1C`5Ge1C`3Eb-=Y,],>^)9W(8S*:P'8U*=[':Y)9V#4O(8T+<[':Y(:W$7V'9X*:Y'7T(:W(9X*:X+;V);[*<[+;X*;Y)9V(7Q'5M+8O%4L+9P)8P,9P,9P,9P*9P0;S-:R+:T,9P+8P2?U1@Z.V.;Q,9O,:R+:R2=P.;Q-;S/Z*9T*:W(9V)8Q(<\+`*<]->]+=Z*=],=[-=Y-=Y+;[-=\*;X+:V+;Y);\*;X+9R+:T&6P+8P,8O,9O,9O*:U+:R,9Q,9O0;R,9R,:R,:S.;Q,:R.>[/>Z,8P+8P,:R/;N)7M'6O)7P,9P*:W.Lk@Le=Kh9Ga@Ld;Kg9G[6F\;I_6Hb2C`7F[3C^.?_,=Z0A]-Z+X+;W)=`+<\,;X0?Y1@[.>X,=[-?],:T,9O,9N,9P,9P,9P,9P,9O,8N.[.Ae,?_.Ke]->].=X1A[/Bc,=[0@]1AZ0@]2A[3AU/?[/?X,>`*<]);[,;U,9P+8O,9P-;R+;V0?Z2Ef+>a+>a-@b@Nh4Da*9V!/F .B+= /F#3L(8P(6N.;Q0>U/>V.:P.;Q+8O+9Q*8P'8T.?]6Ji6Km6Jk3Gj5Ij2Gj6Jl2Fi,:S"2M%1E-?&7):-?+?) " "3*?S0=R.>W.V-;T.;Q):V*;X+;S0?Z,Z.=V.A`/?Z/?X,=[/A^0@[4CZ2C]->Z1B`0?X/?Z.>Y.=W+\-Ae*;W'8S*;Z*=`,?b-Bg1Ei+@f+@f,@f2Eh/Ch-Bf"4Q!/D*= 1I 1K'6N#3L+8N*7N+8O*7N.;P+9Q(9V.Ac/Dh5Jl1Gl3Kt5Kn2Gj4Hk0Ei4Jo6Jj3Fh)<_,=[!1K(9,A#6T3Da$6Q,!0#6"3!1-?ZD\Of‰Pe„Qg‡TfƒRh†Rg‚ReRdOd†UgƒRh‡PaL`„K^O`€J`…QcNe†Lc‡Lc‡K`‚PhŒPfˆNeˆHeE`A_ŒC`ŒEbŒFa‹JfB`ŒJaˆKcIc‹GbIfIfLgKeNgPiPiRjQjQjRjSg‹OiRl‘OhQjOhOiNhMhMhRj]oUlZm[nWmWj†YlŒ[lˆXk[k„_lƒXl[l‡^mˆXi…[i„Se‚Sh‡SeOb„Qa}Pd‡O`}H`„F_„I`„G]F^ƒKb†H]}D]ƒGaƒD^…E^„Da‹D^„B[ƒB[D]„Gb‰@WzB[‚H`†CZA\†B]‰D[ƒA[†G_…A[…BaA_‹D`‹BaCd‘C^Gf‘<`‘Ac‘@c‘BcHg’Jg”Lj–Ih“Hh–Nk–SoSm•QjQjQl“Rm–Sl”Rl’PnœMk—Rn˜To˜Ol—Mj•Rm–QiKi”Nj’MhPjQiKfRj‘jxwEMeBLg@Ld@M_DNb>JaAMc?Kc9D]3C`6Ed7C^9Ga;E\8E^9H^2C_1?X1@Y1>V.=V*9S+:U,Y+=[1AZ0@X2AY0?V,=X/A`2B]2C^.?^1@Z4CZ/>W3AV.>Y/?[+;W.>Y/@^.=W*9T%9Y(<]&:]-?_(<\%;_*Bg+Ae*>b(>e(=d+@e)>e(=d-Cg,Ag,Bh/Fj+Dk/Ei&;[.G!.B#2K):V-=\.?\/@\/@\3E`2Dc0Ce4Hk2Fi4Ik5Ko3Hn4Kr3Im2Jt6Kp4Im7Kl6Lp5Im4Kp1Dg0Df5Hf6Gd5He6Hg2FhK`EOb?Me=K_?J^@K^I_I`=J`5F_1@X/@`1A[/?Y+:U.V0?X2@W0>U1B^1AZ5CX2B\2C\1B]/?\1B^2B^2B[/?X-Y*;Y,:S.=W-:R,;V-=Z)e"g'?f+Ck-Bh+Dl1Jo2Gj2Ec0Dc6Ij5Lr4Im1Hl5Ij/Ek3Ip4Ik5Jm2Gj3Hl3Ip2Iq4Il5Kq5Io7Lq6Jk4Il4Lr8Lo5Jn;Np=SvW>W€@Z…@\‡B^‰?\‰?]‹@_A_‹?`@_@\‰<]Œ9[Œ;Yˆ@\:Z=\A`Œ:Z>\DaŒFdCbIfLg“LfGb‹Gb‹KfJg•Ni’Ge’Ni‘Ig‘Jh‘MiJg‘Ii•Mi‘QjQiQj‘Uj…SjtPdmEQfCNdBOcAJ_?Kh@GX7E_;H\=I[9GbCL\7Gb?I]?J]@L^5AW3AY3BY4D]1@X0@[4Ea6F]5CU3C]1@Z3AW8FY7FX5E[2@W3C]2BY2AZ2C^/?Z2B]0@Y,;S*:U,:R->[.V/=T*:X+<\*;U)9T%9Z&=^*=^&=a&?e%?f&?h(@g)@f(>e&?h*?g$=f'Ai$@l%>f-Dj+Ci(Ah)Cj+Fm,Hp3Jp/Ei1Hl1Fi.Fl1Fj/Dg/Di1Hm1Fi6Jm2Ho6Lv2Gk5Mt9Mr:Hl7Jm6Ik4Hj6Jl7Il=Rx:Os?Ru=Qq>SvCUt=Pr@RrG[yLaMaUe}Rd}WhƒWf€Zg~Sd}Vd}Vc{Oa€Tc~Q^wO`O_{Se€M_€N`P`{P`~K^}M^|K^€H^‚H^F^…F]…Ja@^‡?[†?Z„>Z…A\ˆAZƒD_@\‡AZG`ˆG]‚H`ˆJa‡Ka…Ja‡L`‚Ka‚Pc„Te†OeObƒMcˆPc…Re…L_‚ReˆSfˆKb†NbƒLa„Lc†Qd†NdL`…Qc‚Of‰Uf…Ue…Sb‚Ud‚Qf„Vd‚WhˆUc}Vg„Xh‚Rb]g}Se…VdTcRa}Pb}M^Pb‚O[vM[xJ\{GYyH[zHZxGYxGZ{I\yEZ}GYyBZ€H]|DZ{EZ|BY~CYzEZ}@Vz?VzCYCZ€DZ?WZ†>Y„=[ˆ=Zˆ;Yˆ;\‹\9W‡9W†:X‡9W‡:Xˆ;[‹9Y‰8W‡9V†:Z<[‹D_E`ŒF`‰Jc‹FbŒF`‹IcFb‹IdŒFa‹Hf“GcJgGeHdNhQjRjŒQjPjQj“Nf‹IRcFNdAMiGOfCNf;F[.@_@I^=H\9F`?J^@KbBMgV3BY2B[->\2C^0?X/>W,=W)9T,9P,;S.=V,;V+:U.=W+9T)=Y);Y+e#e*@f(@f&?e%=e'?f(Ah*Ck+Dl+Af+Ag*Bi.Gn*Cj1In0Gl7Km3Hk2Gj0Df4Im4Kr7Mq6Ii5Jn4Jn4Im7Jk8Jl4Hj/Dh3Gi5Il7Jm4Jo6Ms:Mr9Qx>Qq?TzDVsDWvHZ{HZxO\wP_|Ra|Qa|Wf~YhXc€Yd}XdyRc~SazQ^zS]uPb~Qa~S\vP_~Qc‚O^{N_~K]}J`„Kb†K`€B[„E^…E_…C`A_ˆA]‡A\ˆBZ‚@YD\‚AYF^‚I_„Mb„Lc„I^‚K`I`†Lb…L`‚Oa„Sb„Qb„O`Oc„Pd„Qg‡Ma…Ob…Pc…J`†Pf„L`€G_…Oc…SgP`Qd‚Pf‡Q`€QdƒQcRf‡SbQg…Oc‚Tc‚ZfƒTf„\k‰YfƒSc~UdzTeSa{Rb}Pa{M]}K[wL]zK[uHXvHXtHWqI[yEZ{FXx@TtDVvG[~=Rw@VxBX|ATuF\CY}H]€CY|@X€CX{BY~Y…KcW5Gb=J^7G]5E[5F^3D\4BX3?R3C^6CY3CZ7F]4D]/?\6CX1AZ/>W.?Z2AW/e(@g*Bl'>d(?b%=d)Ck#;d)Ck+Bh4Il+Ch)Dk,Fm,Gp5Lq1Gl5Ij6Km/Gn.El3Im3Hk.Ci7Ms0Hn2Jq/Di3Gi2Gj/Eh5Ij3Jp4Ks6Hj8Ko9Os?Os?NrARr@QrGWuFVvFUrHZxL]{P`{P`€N_|T`zR`|Xe~S`{R\xR^vQ^wN`|M[xOa€N\tM^xK[zK\vL]zL]}L`€H\~G\‚C\ƒBY~D[BZ„C]…>V|B]ˆE]„@\‡F]E_†EYyCZ~E\ƒG\OaM_€M`I`†PdƒPazRf†Sc€Oa€Ob„Ne‡MaƒOfˆPa€Qa€Mc†Pb…Pa‰K`ƒJ`‡Kb†Kc‰LcˆQc€Rd„PbƒRbMa„PcƒS`zRc€Ra}Ue„\e€Xe…We‚YhUdƒYc{Sc}O_zPa‚O_}O]yJ\xI[yIZvGYyFWuEVsCTpBUvGXv>Tu?RpFYyAVwCVtBVwCWsD[@UwCX~CYAX@UyCZ€=U}>W€Z‡D^‰>Z‡@]F_ˆA\ˆFbHdEaŒHdHb‹Hb‹Ha‰PhMeOgŒRkQhŒRhPf‡Rg†Oi‹BK`EMaALbEM_EL^:HcBMbCMb?KgCKaBKa@Kh@L`=Jd8Ga:G_6C[1?Y1A^5C\>IY1A]5BV3C[7E\7E[5CX8CZ8DX4C_8E_2?W6DW2AZ4@[*9T,=[-=X/;R+;V*Qq@SsHXrGXuGWqLZsM[xO^zM^{P_xUdzP_|Q_wKZuN\uO\xQ\xJ\wN]vM]zJ\zIYsK]yM`}H]}@V{FZ}E[?V~?X€[†BWxCXyF\}CY}EY|H]~H]}J^|M_{M_~R_{M_€QcMaQcP^yPc„Q`Qb‚M`‚Od†PbOcƒQc„OaL`„Ka…I]€I_ƒH`†Mb„ReƒMb„Ma‚NbScSc~Q]wUd‚[dUe€Yg…Wf‚\g†Ve€Vd„Ye}R`{O]wK^}M\vMZtIZxJZwI]}GXsCUsGXuCToCTqCVvETpBSo?QpFXtDWwCVv@UvDXyBVxAU{F[€@W}>SvAW{?WJdJ]=Jb?J^;F\5@X3AW8E\6C^5D]3BZ0?X.=W4D\0=S.?Z)9U,=X.c.Ad(>d$;_)@f'>e'@f(?a(>d*Ci0Fi3Hj2Hk*Dj(Eo0Gm+Bh)@g-Ch2Gj+Dl4Hj2Hn4Jo3Hj4Ik8Ns;PrAOpLl;Ln;Np;Lo?Mq=Mo>Qt?QtCTu?Oo>QpGSjEUpDTqCUsJZrN]uM]vP]vO_uS\sT_tP\uN]vM]tM\uP\sJZwN_{N]uHYvI\{I^H\}D\‚@V|>SvDY~>U{A[‚BY~?WAY€@X}@W{CZD[GZ{H^}G]€FYzK_M`M`}Q`zOaLc†Pe‚O`Q`zQeƒOb€Qc€PaPb€Pc†RbM`ƒM_Ka…L_‚J_‚NaƒI]K`NbO_Rb‚QdƒTc}Sf„S`|Qdƒ]g‚Yc~Yg€Pb‚Zf€XfUdS`|L[wP`zO^zQbzNbI[{L]zHYuHZxGWrDTpDVuFTpDTqEUs@Sr?SvEWvDWwFXwDVtH[{CXzARsGY{B[ƒ@U{?TwAX}CZ=U}9T€=V;Rz8V†9Wˆ9W‡9W‡9W‡9V†9T9U‚9V…9V…6Py:W‡4Sƒ5Tƒ7S€8U„9W‡9V…8S:T;U€?Z†>Z‡B\‡>Z‡>[‰AZ…B[†E^ˆIbG_‡IaˆJb…LdˆJa†MdJ`…Rh†Pf†Og‹Of‰Mc…AKa>G`>I`>I[BK_;G^>F\@HZ9Hb@KaG\9Hb=I`=Hb8Fa3A[;DZ4@Y:FX:D`AIZ>J_>J`@Jc@K^=J`2Dd8F\1@Y5C_9E^>H_:EX5CY9E\3AV5E]4D]0>S0@U1F`-=U/=U1>U1A[.;S)9S*a)=a/Bd)=a(?f%=e(@d)?c,Ae&=e)Ah(Bj,Bg/Dh+Cj.Hq-Fn-Ch,Dl/Hn3Im0Ej2Kt3Il7Kl8LmMp;LnU|AX=Sw>W~BY}>TzAWzD[DWyDXyBZ€EYyJ_€K\zN`€K`L_|M_}Oa~M_zM^|Pa~O_|PaPc€J[|K_ObQazPcƒU_QcƒPcNaM^}I_„L_€H^‚Nc€Ma€M`}Na}Qb}K`‚Rb|Ub}WdySeWc~Zh‚Xc€XeQb}R`|L\}K_~P`xN^{K\{N^|KZwIZwIZyDUsDUsDUrDTo=MjETsBRp@PqARr>QoEVtASrCUsASsDUvAVx@Uw@UxBX|?W;Qv>UzU~Z‡=X„B[…C^ˆG_‡Ea‰HdMd†LaLb…NdƒPe„OcPa}NfH^?IaFM`CMgBK`=H_;He;G[5A\S/?U6D[.?[0A^2AX1>R/>W.=U,e-Ej+Ch)Ck-Fl/Eh-Ej-Gm1Jq-Ci-Dk3Jq3Im3Kp9No;OoBTrFWrFVrFVrASqBPlW€V=W;U:Rz8V…8U9U‚9W†8Q{9V…9T8R|9W†9V…5P}3Ny8T‚8T€8R{8S~8V„9UW;W„:W†8W‡;X‡=X„@Yƒ@[‡BZƒC[H]€G^‚I`‡J`…J^Me‰Od‡LaƒOd…Nb„K_…=H`?J`?LcBKd?H^?I^=E[;Hc?K`T2AW.=X0?W.;R0>V5CV1?S,;T0Ca.?Z+=\.Cf,>^1B_*;Z0Ec1Eb.Bb->Z.?].Aa0Gi-Df0Df/Eh+En-Fm/Gk-Fl,Dj,Gn6Jk8Mo6Jl1Fj/Ei3Hl7Lr8Km=Qr;Mj>PmHUlDSmDSlARmHWqHVpGSjHXrFVrM[sVdxV`sN[rIYrJVnNZpO[rLZuKXrLXoIWpJXqHVmHUkKXoP^xR^sO\rP^tN[rO\tP^xN]xO`uM_yO]vL\wHYwHZuJ[v?Ss=Sx=Qr?V|=QrH\|AVxH\~CX|DXyK]vFZzFYwSbvP`tM_yK]xJ[vM[uL]xJ[vN_{O_zO^vL]xN]|R`zQ`zQ^xQd‡TaxN[wRb€Pa‚Tb~TcQb€Sa{ObN_|O`zP_xN`|IYxF]€P`{Q`|Pb~WdwZg{Tc~Yaw]g}Yf|Tc€VbyR`yS`wP]wU_sO`zO^wO^xP\rOZoR^uO\tKYqESlCSpCPnFSpCSqRu=X‚9QzI_CI[AKeCM`?H_J\=I_>Jb>I_BLfEMb@McBMdFOfCMgDMcEOcDNc@Lb9Gd9Ie6F`3D^0@[7F\2C_3C_3BZ2AY1@V4C[1>V1@X.>W4CY.=V/=T1?W/A^2C`.?[4Fa2B]2Ef6Ii5F`6Gb/Bb3C^/Cd1Dd/Cc0Db-Cf0Fi,Cj+Dk+Bh4Ij,Ci4Ij7Kl6Lp6Jj7Km7Mq8MnUz?Ux7MqCY~@TwEXxHZzJ[xK[wL]zJ]}MbM]wL_|N`{Q]sP]zSd~RdN`}N_|Rb{P_zP^{Q]xQ`|Rb~R`zTc{Sb~R_{SbSayT]uSdQ^wP`|Na€O\vN`}N_zObL^|M^{Oa}Rc|\f{Ub{Xf„ZcwYd~[e{W`vSc~S_{U^vQ`}S`wP_xR`zM[wQ^sQ_uQ^tN\rMZsPZqKYsHVmARpARpFWsDUrBRpBTpDTrDWuAQrCTqIYtIYwM\uIZwFYx?Rr@Vy=Rv>Tw;RwC\ƒ>Uy=W‚>U|;T{9Rz8Qz7S~4Sƒ8Ou7Pz6Ow8R|5Oz6Oz8R|6Ox1Kv9T;Qs:T:S|8U„8S~8S=W‚=Xƒ=V€AY€AX~EZ~E[}AW|F\~MdK`€LbƒH^Le‰Va]Yijib?K`AKcEM]@KaCMeBL`?J`@KfCMdBNa;E^@LcBLe7D[?I^=Ia;H_:FZ?I\CMgHRdCOeANg@Lc>Ld?Mi@Ka9F\=KcV1AY-=Y/?X2AX0?Y.>X.=U2?V6EY1?W/?Z5E\6F^.A\&9W+>^-?^5Fc/A`0B_7If2Da1Dd4Ge1Fi1Fh/Dg0Eh1Gj1Hm,Fm5Kp2Jo5Jm6Jk6Jj7KmSw>RuFYx?TwFYzHZwIZwKZuM^{J]|O`{R_uQ_{K[vK[uRb|S`{QayN^{R_yNZtP^uMZuNZvP[vS_vUbtS`wWawS]yU`vT^vPazP^tP^yO^{Q^wTb|Q`}P`~N^yP]zO`yJ\|T_vYczWe|Wc}[bzVdyWd|X`{UaxS]uTbzU_xRa|N\vR^xO\zN]uM[sMZuNZtOZrN[sJVqFUmGVoDToEUpHXrETmEWtDWxHXuBTrAQoDUrFWrLZtGUpFWuAUvBUv>Ru@Tv=PqBUsBVt?X„?V}>X‚;Rw6Ms8R|5Ow4Oz2N|/Jv5Oy4Mu6Q|U|?W}BZ~EYz?W|Hb‰G^I\|K^‚PXgiaIa_UIOU=Jb=I^J`=I^;FZ8G`:F_9E^=Jg9C\7E]:I_>I^7DX.?],Qp7Kj;MjNg@QkCRlIXnHXoIXmP_qKWoOZpNXnUasSasNXnN[qM\qNZpMWlKWmFUoGTlGVoLVkPZnN[pIXqLZoKYoIVlMZsKYpKYuHVoAOlDSr@Qq>QqBSt?Qp@RrDWw>Qr:Pt>QqATvCTsEUsGZyJZxIXtM[uM]vKZxK\yMYsM\xM[wP\uN^{O\vN[uO]vN\xN]wL\xN]uIYuN]wTa|QbzT`tO]wQ_zQ]tKZvPZuR]uR_xP_}T_xR_yO^wS]tP^zJ\}Q^xT^wS^z[f}ZaxV`x]f~af|Ua{UbzX_wV^wT`zQ`yR]sP^xP]vM[qMZpKZuO\tKYrJUnOWpMWoHVoHWoGXsHXtETqGVpFWuCQmEUpDSkFUnCTpDUq?QpDUtFVtBUu@RqASs9OtBX~@TvDX{Tz;S|;Rx6Q|5Nx2Ks/Jv4O}3Mw5P|2Mx8LoBOm:Qx,Iw0Ly0Iq3Lt4Nw4Nu8S5P{7Q{7Py;Sy@Uz>V~:S{?V}>VBX|BZP[szlg~jbgaTadTwaU:Hd8DX:G_4D`5?U0>W3BW5DZ6D\;G[9H_[(;V+@X*=[+@\/@Z->Y1A\2AZ2@W2B\.>Y/>V8H_5DY3D_5F`3Ge.Ca-@]0Cb3Fc0B^/B^.?\,Aa4Gb8H`2Fg5Ii9Jd6Ii6Ii4Fc6Hi8Ll8Km8Kj?Rp8Lk=PoQoATt@TxFYzFXwFZ{?Tw@Uw?Tw9Qv6Mu4Lr5Lq4Ls1Ks6Lp;Nq3Ku8Px7Il8Ks,Gr1Lx;Nr9Mp5Nx3Nx6Nx7S€6Ox8Ns9Qx:T~;S{8Qz=U}>TyJdH\3@W/>Y.^0?V.>Z,=X-=W':Y0?V1AX1AW4E`3C\6E[2B\7F[5CW4E_6F_:Lh6Hc5Ij6He7Hb6Ig4Fc6Ga1Da4Gd5Ih5Ga6Ij1Hg5He7Kk:Lj6Jh6F]>NhCRk>Ol?NfAQlNn>NmETn>OlCRmDTpCTq>OkEWtCUrDUsGWtARqCSr@RqATrCSoHYvGWsCUqGVrHWrIZvIZuK[tJYuLXsJYuQ\tFToHXtO]uR]tLZsOYrN^yLZuKYrHVnGVnFTnHWqR\tQ_tP]tN\tT]tQ^vQ]uP[vN[xO\wO\zKYtM]xS^wQ_{Q\vP\vVbsQ_xRbyN[sP[sS^tS_zT[nTZlPZpMYsLXqKWlQWeXbs]csQYoO[qO^vR]uS[qP[rJ[uKXrGYwPZvKVjFToFUpBSq=NlDRlBRnZ0=R1?W(7R/?Z/>T0@V.@],=Z-Ka6Ih:G_9Je5G`7Jg9Ml5Gf1Ca4Fb>Nd8G_6F^6Ie9G\;Jd4Hd5Hf:Li;Ja;Kf;MjBPf;Li9JgAPg=OlBTnCUmHVkDTkDSlETlDUoKYnHVnFSfOZlV`oU`lW^mU^m^fraeo\dkcgo_dn[dqXbqV`qY\kXaqR[kUZlV_oO\oOYkU^jOYmLUhJTiKSjLYpP[lQ[qOWmIUmDRlFTlARnAOlDSmHVnGWpGVlCSoIXpCUrFUrESmGUqGXu>OoBTrCUsDUsFVqDUsCSqBRoARqCSr@RmGXtHWsIWrIXrHUnGXsCUrLZvN[sNZsNZtLYqPWpMXrO]qLXmHTkLVkHTlKYqLYqOZsQZrQ[uKZuP]tKZtLZvIXuJVrFSpKYuQ[uNZuS_vPYrP\sQ\tOYsQZtPZsR\pS]uR[rOWmOXmMYqOYsKWmOXnOYqSYpQ\sYbyVauV\rU`sV`rR\rP[pO\zOYq@Nb=Ok>Po?Po>Nj9JjOn;Lj=PnNl9Ln=On>Rs;Op6Ij3Hi5Ij0Eh3Im1Js1It:Jh5Jo5Lr4Gh6Mq7Mq6Km6Km6Mr3Kr=Ps?Qu=Sx7LmHTp9Lm:Ps8Os=Qq=Qr:Ps8NvWw\ku-W*9R2AX4B[6CW1B]3BY/>X7D[4@Z:EX5CX8F[7CY5@V3B\6C]7CZJNZ2?U;ET1@Y;DU8DU4>T2=R0?X/>Y/@]1@X1AZ.>X1@Y/>U2@V1@Y1B]0?Y4D^1?T.?X4D[9H^5F_9H]AM`6F^;Jd>Ke?Nh=KbLa>Nh8Jh=OlAOiAPj=Le=Ni?Oh;Lf=Mh?Qm@RnJXjFZnJXjGVi?PjJXmHWmMZkJYnP]oVao[dpX`oYbq\erafpaepZaq\dpbfo]cn`ejX`pNWjW_nPYkR^pLYlQ\jQ\mP[lIVlMVlQ[mT[lR[oZcuR^tQ[mLWoN\uQ^sJTmNVkQ_rP[nR]oKXmKWlHUmFRnGTmIYtFTsGUsBQoCSo8Ll>PpCUt>Nl@Rq?QoAPoDTuBSpFUoJYuDQkHWpGWsHXsJYuFTpIVmLYoQZrW]oP\tPYpT\oNWmQXmRXlJVoNXoMWnLXpMVlJUlIWqITlEOgBSp@PoDRoETrHXsJVpRZsV]qMZsJXqLYqOZsQZtN]uNYpR[sN[sOYqRYmMYrNZrPYpLVmOXnU]oU`uU`tR[sS_sWftYasU`qT^oOZpHWrAOf;Mh?Po>On?LcPnBPo8Mp:No:Ln:Lm;Lg7Kj7Km4Kp3Im6Lp6Lq2Ip5Il4Gf1Gl4Jn8Mo:Nm=Np7Jl3Gi2Iq3Kv?OpDLhDNk9Os9Kl9Jk:NoQq>Qp?QqDVunuq/J!2L$4M"3L/I-[-;T.=W2AV2A[.;S/>U/=U/?X/>Y/@Z2AY5F\4D\=HX6DZ@K\:I^9Id7E[@MfDQjCPi?Lb7G`9I`;H]8G_:H]PjCUnGUiLYjM[mCRkCRiIVkHWlLXhIWkPXfW`lYaqR^n\^c[`l_cn`cm[bj\es^fq[^k]eoW`pU^nT_nQZmQYgS[kOUePYfLYkU\lOZnLViPXkRZmT^qS^sN\oU`r[etUbuWarW_qXcrW`pNWlM[rJWlFRjHTmJTnMXqHXsIVr@Rq=On8Ll:Mn:Mk8JhBQoANi>LjCQoHZxFUpESoDSpAQoDSrJWoIVnFRkFToM\sS\pO[pLXoMWmHUjIQeHSkJSiNVjMYlMWlHTkITlALg@OmFOgDOi>Ok:LmDOkFRlETtIXsRYoMVkFUoMYnPYoNXmPYpO[oMYpPZrOZpPYnPXkMZnLYnOYpS]sS[pT^sT\pVbt[atU_uT^uS[qS\lIQ`JUkFVoDRj@Qm>Qp?Pn9Lm>QqANiBOlRsAQn:Li9Ki;Pr6Kl9Km:Lm9Ki5Ii4Hj1Gl/Ej1Ho4Hk2Gj5Ij4Ij3Hk1Gk9Hb>Kf9Jl4Hj3Gi:Kj?Oq=KkCLeBOk;Lm8Hi@Po?Ok5Hf>Pm;Mm;Mn@Sq:Nn>Qq?Rr?Om*I+J)H(F-J"2L)H/J*8O-:T/=T.;Q0?X,:R-W0?V0@Z.;R-:R1@W3@T-;Q2AY5CW2C\.?Z/>U0?U4CY4D]9FY:EW8F[LdDPeANfBQjCOdCOfESkDTjCO^MWdBPfIUiFRbFUkCPcJTdGVnEQfITfPXjW\nS]rU\md^d]Ygtmoc`c`bi_ft`eq^cp[cqX_oW`pS\iRXfQWkQUdRYmX]nVbsWcvU_pKUiLVgQ\pW_qYarVarU^qW`t\dsWbtX_rYboRZkNZoLVmITjHToESnLXoJVlIWoDUqCRl>QoLi;Kh>KfCQnFUnBQnKVnJWpIUpITiMZnMXnRZoS[rOXoJUnJWnMXnRZmN]sR]oOZpS]qT\sWatZ`rS]qS\nV[qNZuMXrIWpCNa:Kg@Pl@Pk>QnBSqDRl>Mk@Pl>Oi:Jg;Lk?Pp>Oo;Mm7Jk9Jk7Ig6Jj?Po9Kk7Kk3Ff,Bg4Ho0Dg4Hi7Jj:Je5Hg3Gj5Ij5Ik6HhET8BR^^jPQ\$3M)7P.:P:@V,8P*8O-:R*8P+:T.=U3BU1>U;CP5@Q=GW;G[8FZ7EZ2AX/?Y6DY4C]5AU4C]3AW2?U6DZ9DT0@]5C\6E\5Ga9H`:FV8Ha6Gc8He8Ga8FcLbJ\8Ha9G\=Kd=Lb;I^KfBLb:I`:Jd:Je?Kg=LjOm:Kj;Ml8Kl9Kk6Hf3Gh9H`5Ge4Il:Hi=Hg1Fh1Ei1Fi2Fg5Gf4E_-Bg5GiAMj6Il8If=Km=Ln;Ll;Jf7Ga8Ih;KhARm;Ml7Jf8Gb:Jg=Lk7Ji:Kj>Pp>Op?NhBQh8Ik6Ik)$ +'?"1E)I$E%F"D.K+6F.8L/U3Q-:R.U,;S+9S.;O/=V,=[+]1@Y3D^5AV6D[1BZ:CV9EY9EW9G\BHY>FX:ET9G[GISNEOeF>TIN=BO@BK?K^QXbdnI[k4[mCU`@DR)ev?`r=DZ(Rh*ft6bg3JK+IE)O\H@RPMdJcwLXiDZlDUdJeEPh@LfDOd?Mg@LbAOd=Jc;Jb@MgHQfGRhFQiIUoIVoJUhGRjJVlFSiIVmJVkP[nNWlGSkIReEOhDQk>Mh@Qn7Gd8Ji6Ij8Kj8Jj7Jk:Lk8Jk:Ef;NnNg@Ol;Ml;LmAPkEOk\,=[-:V3=S1=Z4AX/=T/>Y5?W+:T1>U8AV6@X3?W7CXGET\IMJDOLINOEOFENEDN:;MC:AN6&V8"C3!:4MP,YeQhnAduX"Eb'\w4Sc+G['EX/Pd-_u6^u4^v;@V&7M#Uk2Zg0D]-Vn;Sm:Ja/Tc(DN%5AI@QQCROQa8KY9D+9)8KI/NOCERC[c?[f:JQ4EN#>G3LS]:Kh:Ji7Ij5IiDRl>Nm>KhHPnJSmHPfKXqLXpIWrAQmBPlFVqDSpIZvKXpGTmFUmCQiHUmQYnKSfGOaIQd@IaEL]IP`LO`JQaHQdIPcHOgDNbFNbDMf>Ld9IeBMa?IXBL[>Ja8E[6Gb;GYNjNm@L`9Jh9Jj?Nf6Ff4Gi1Fh4Ee8Hf.Bf4Dc1Ca3Db4Eb0Dh1Ei-Ag2Ed1Eg0Cc.Cf2Db3D_1Dd1Dg6Gg1B`3Ee:Ki6He5Hg:HcOn@Nh@Pm;Ll;Jc2Fg3Gh)4;G6DFQKW@MJ;B69@=U@CV=AW.9S(8U43*D2UA'<4@<]O%[]%^j/eh,Wf+Rd+]n,Rb)[t2Rl+Ld Xm/R]N_'Oe)Hd$Oj)Hg >`#@^%Nc0;KXl4K_(Uj5To7Wm8^x9Mf3Ll7Ph/C\)E^+]y:?X!5HHa'?V">T ER#DR3<3C/<8N@X@SQc-Nh*Vr.He&D['>T'2A=*;>M(;\)=c6Ij4Ff4FhCMfHQiFQkDNhGRlJUlHVpFSnFSmCQmCQlESkGTjGTkBPl?MfESlGSiITfGPcKQhGL`LN^GL]EM[DK_GM`JO]FNfCL^@KdENcJeBLb@KdBKeBPiBNcDLiDMc=JaALgAMdAMd=Lg;I_;H^a.Ab*@f+@g.Ab0Cf1B`.Ad-@b.?^.Bf0@\-?_,Lc7HbLl@Nl9Ki:Jd5Gf5Dc,>`(.-8(1FG6@-9%,    !-0?2;?F'2'5#-AH>J03fe>4<.(3!.8 '-.;?P(=R/@1GJc#BX,6,"/&*6,8%+!+14-:?+0754?59B0HM/7;$@L5N]:>M!=W)7K2?8F*0<144-*.<#0H&2DAJD^lCNf4Ob,FW"EPBP=07* ;95E!9A D5LM&>Ccg8fa7DI!QVDR9EXe.^q0Rg%>R9HM\'Z_/@<AO:O6DG[&D\*Ka0Kk0Gd0E]-Yq/B_)B]/Ee2Yu=Kh3=Z.7J'&9 .*::K/>)4(5 .&3/<0=%1%1!-0>,<2G6JIa<@X27H7N4F4I!UF0S6*(5Q&7W1KaDMeEPgDOgFNdALf;IhFPlCLfDOhCNf>Kg@LhBMf7F_;Jc>Mg8Ec3Eg1Dc1Cb.@].Bf+@f(d3Fe/A_1B`*>_0B`/Cf.Bf->\.>Z/Ba0Cd7F\8H`8F]1C`4Fd7Gd>Jd:Hf=If8F_:IdDPd?Ka;Je9Hc=JaD&4%2" #"/&2##1)6 &"&*:"- -'$1'3/;0</;*403&' 0<.8&3'3.:(*7,$+/3>)2?&:S$CZ(F\)4F:N1=>@.0%(5;8E'.1,19,5 49%+(,&* #-:2:-9%2.93=)/  (2'4%3)(4-@/=IXA0=!&3+9*9+: -%$$ &$#! %&&$&#"%*$1=+%/,:.=,9&4%*%&+4&&0/+0,(:W.=S*:Z3>U@H[IL\DMfSQk8Ij4EeI^@K]AJ[>E\AH\>Ib>IeEL\AKd?J\=Ha?J_DLbDMf?I_>G`0CcCKZ@Kf?KeALca,@e->^)=^*>`(=c(9W+=_.>]+=].?\4E`.@^6CZ.?\3AW.7B.9N2?Y3Bc-=Z9C[:@@SQ#NZ&EX,:N4HLc/K]'CU Wj0Ri)Jd!FZ%O`(GXCO&/;81DEGVDIZ9D[-U;CY5B]9D\HcF]EL]?Ia>Hb;H`>Ha=HdDMcALc>G]CJaAMf>Ic9F`>J_:Fb;Ga9D\8D_@Le>Gd?Fb;IgQS\>H[3D`/Be,>_+@f0Ba1Ej.Bf0B_2Eb0?Z,=Y3Fg3BZ0?[/A`1C`0@\1A[0B`2A[3@S=HZ9F_6Ea;G_;Fb;D[6E[8F`7Fc7F`9G^]2B^;Je      -     -     -  !&   - -      -   -    -   -  -    - - -      -  -      -      - -    - - -  - -    -   -  - -  -     -  -    -   -   #$  $%".$1   %&$%&&2!+$)$%&* +%%  #&($!)/  -#$%%%$"/!-6C(*)%1*!- )$))&(08L4VCDQAAO=EV:E\>EY?EX@IeEM\@I^EM^JNbINa9Gc;D^7E_BKa@I^GP_LZ\CIQERT\hWesQ\`3JJ5IS=`lYkpgGTQHQV6D]0?[5D]4E`.?[7CZ2C`8Ia=J_8G]9G^;G]:F[6E_=DV/=V/>X:E[2A]8D\;G^;G_0A[=I_>Je=Kc9D[>JdAJbCM\3BZ7E^5E]3CZ6Gb5D`2EeS8D[@EWAEZKCK9=K9Gh6D\@HUQ`TReG_rBO`1PX%TW'|…Fgn,Wg#nx6Ob(r€>|€B`s.QZ)BS82BW/<\+:Z3;S2?^1?WU9Ic8E\7BX4C]5CZ5D_:D]:E\:EV7E]:G_AJ]?K`?H];Ia@KdAMc:F]6Gc:Gb4Fc1Cc3D_4E^7F\6G_.=X3C\:K]6?N - -     -      -  -       -    -   - -  - -   -  - - - - - -    -   -    -  - -  -  -       - -  -    -  - - -       - -   -  -  - - - - - - -   -    -  -   - -  -       - -892   -    - # " !$%" %     $& +*!"%!- , +&&%&$$ ##,  "!# !  - &"%)(-1059254& $9:A4:C6<(?U&X9=V9E_I`X0A\,@_,?Z1?O@HY -        -  -            -      - -    -     -  - - - -    - -   - - - - - -           - -              -    - -     -  - - -    -             -   -        -  - !    %      -  -   !   # #"&%""#&!#  "&         '  #$"0&4BNR[#7PDQ C_&Qh"9LRg/LM:A8;0>[;EU7E]BFXEH_KOfZ8DX9G_5CW+;W(9U&9U*:T - - - - - -      -    -  -  -  - -          - -  - -  -   -    - - - - -    -  - - - - - -     -  -       -!    -  - -  - -  - -   - - - -  - -   - -     -  -      -' -  -     - - -   $"       -  - - -  -         -  -    #  &%# #%%%%! -!",% -        - -    -    &'5,:%0"* FLGPBE:HHX#DN7F!9J"Qb/F^)SY+QK+^P2`N63:0ND4>A9EM@>H?J>Sc6Te3al4DM#CMH[&7H"GV1\  -   -  -      -                   -    -  -     -        -    - -    -        -   - -    -    -  -  - -  ! - - -  ( -  - -   ;)(   -             -  -   - -     -  -   - -#   -    %  -  -    -!  ('" !&$#   -  -  - -  -   - - -    - /1.83, -  - !0+*-=;4*1& ! (3.=)72@CO$=J(;BEOIOb=IZ9HAO#8IMZ%C[)Rf3]d+R^*ZTY["La'Se/HZ#Ua*c`*CK:DF6E56:B<-6BR:E]=FaGJ]( -            -  - - - - - - - - -  - - - -  -   -   - -  - -    -    -    -  -       -                    - -   -   - -     -    - -        - - ">*  - -  -  -    -  %  -   -    -     -       -           -    - - --             &!   ) - -    - -  - -    -    - -  %  -H>$92NB29KT*TQ#SW&GMIS'[W)DOP](HPIX#P[)CR-EI$FF;GJ==HB>DF&2E6:A`_:   -         -   -    - - - - - - - - - -  - -   - - -   - -    - - -   -   -   -    -  -  -    -  -    -              -    -       -  -  -        # -  -         -     - -    -        -     -     -       -    -   -    !    -  - - -   $    -  -  -   - -    -  -        -  - - -   - --&);;@I!7I7GFT(]JODOY(HQI\(Tj0@O*KY-Za0V]+JX'8D 6>PJ*lZ7  -  -   -    - -  -  -       - - - - - - - - - -   - - - - - -  - -    - - - -  -  -  - -   -         -  -            * -    -  - -       -   -     -  $"  -  - -     -      -    -  - -   %    -        % $          - -           - - -  - -            - -   -  - #  -     -  -  -     -   -  -  #-,8(0/<FCNG#@>ADLJGMCL HP!Ta0I`'F[$=DB:`W'IM  -  -  -  - -    -  -  -  - -  - - - - - -  -  -  - - -  - - - -  - - - -  - - - -  - - - - - - - -  -     -  -  -   -  - -  -         -  - - -  -  -   - - -  -% "      -     -   - - - -    -   -  -   - -         -    -      - -   -     -  -   #$ -  -  - -        -   -     - - -  -  -   -        -       -      -  -  -    -  -    - -  - -    - -  "&-*1--)(>3@:9@6/.+04?C1<WCA5HH#>M% \ No newline at end of file diff --git a/sdk/media/land4.x b/sdk/media/land4.x deleted file mode 100644 index 3d23e8c..0000000 Binary files a/sdk/media/land4.x and /dev/null differ diff --git a/sdk/media/level.wav b/sdk/media/level.wav deleted file mode 100644 index f2b171c..0000000 Binary files a/sdk/media/level.wav and /dev/null differ diff --git a/sdk/media/miss01.wav b/sdk/media/miss01.wav deleted file mode 100644 index 8300b78..0000000 Binary files a/sdk/media/miss01.wav and /dev/null differ diff --git a/sdk/media/miss02.wav b/sdk/media/miss02.wav deleted file mode 100644 index 8e5e9da..0000000 Binary files a/sdk/media/miss02.wav and /dev/null differ diff --git a/sdk/media/mslogo.x b/sdk/media/mslogo.x deleted file mode 100644 index 191b315..0000000 Binary files a/sdk/media/mslogo.x and /dev/null differ diff --git a/sdk/media/multi.x b/sdk/media/multi.x deleted file mode 100644 index 59d190c..0000000 Binary files a/sdk/media/multi.x and /dev/null differ diff --git a/sdk/media/ncube.x b/sdk/media/ncube.x deleted file mode 100644 index d49bb30..0000000 Binary files a/sdk/media/ncube.x and /dev/null differ diff --git a/sdk/media/nyuk.wav b/sdk/media/nyuk.wav deleted file mode 100644 index 9fdb5ef..0000000 Binary files a/sdk/media/nyuk.wav and /dev/null differ diff --git a/sdk/media/p_bang.wav b/sdk/media/p_bang.wav deleted file mode 100644 index 46fbc71..0000000 Binary files a/sdk/media/p_bang.wav and /dev/null differ diff --git a/sdk/media/piehit2.wav b/sdk/media/piehit2.wav deleted file mode 100644 index cf181b5..0000000 Binary files a/sdk/media/piehit2.wav and /dev/null differ diff --git a/sdk/media/plane.wav b/sdk/media/plane.wav deleted file mode 100644 index 2bb51ee..0000000 Binary files a/sdk/media/plane.wav and /dev/null differ diff --git a/sdk/media/rev.wav b/sdk/media/rev.wav deleted file mode 100644 index 6b81b2a..0000000 Binary files a/sdk/media/rev.wav and /dev/null differ diff --git a/sdk/media/rmlogo.x b/sdk/media/rmlogo.x deleted file mode 100644 index 6d470ad..0000000 Binary files a/sdk/media/rmlogo.x and /dev/null differ diff --git a/sdk/media/run.wav b/sdk/media/run.wav deleted file mode 100644 index d3c9cf6..0000000 Binary files a/sdk/media/run.wav and /dev/null differ diff --git a/sdk/media/s_bang.wav b/sdk/media/s_bang.wav deleted file mode 100644 index ed1efb1..0000000 Binary files a/sdk/media/s_bang.wav and /dev/null differ diff --git a/sdk/media/shield.wav b/sdk/media/shield.wav deleted file mode 100644 index 25eb74f..0000000 Binary files a/sdk/media/shield.wav and /dev/null differ diff --git a/sdk/media/skid.wav b/sdk/media/skid.wav deleted file mode 100644 index de0ea3d..0000000 Binary files a/sdk/media/skid.wav and /dev/null differ diff --git a/sdk/media/sphere0.x b/sdk/media/sphere0.x deleted file mode 100644 index e4ddcb8..0000000 Binary files a/sdk/media/sphere0.x and /dev/null differ diff --git a/sdk/media/sphere1.x b/sdk/media/sphere1.x deleted file mode 100644 index 9c0975f..0000000 Binary files a/sdk/media/sphere1.x and /dev/null differ diff --git a/sdk/media/sphere2.x b/sdk/media/sphere2.x deleted file mode 100644 index c95e694..0000000 Binary files a/sdk/media/sphere2.x and /dev/null differ diff --git a/sdk/media/sphere3.x b/sdk/media/sphere3.x deleted file mode 100644 index a21a007..0000000 Binary files a/sdk/media/sphere3.x and /dev/null differ diff --git a/sdk/media/sphere4.x b/sdk/media/sphere4.x deleted file mode 100644 index d95f455..0000000 Binary files a/sdk/media/sphere4.x and /dev/null differ diff --git a/sdk/media/stop.wav b/sdk/media/stop.wav deleted file mode 100644 index 834b1ee..0000000 Binary files a/sdk/media/stop.wav and /dev/null differ diff --git a/sdk/media/strike01.wav b/sdk/media/strike01.wav deleted file mode 100644 index 0615e4a..0000000 Binary files a/sdk/media/strike01.wav and /dev/null differ diff --git a/sdk/media/strike02.wav b/sdk/media/strike02.wav deleted file mode 100644 index 513c0a8..0000000 Binary files a/sdk/media/strike02.wav and /dev/null differ diff --git a/sdk/media/stunned.wav b/sdk/media/stunned.wav deleted file mode 100644 index 3950a8c..0000000 Binary files a/sdk/media/stunned.wav and /dev/null differ diff --git a/sdk/media/teapot.x b/sdk/media/teapot.x deleted file mode 100644 index 06fccfd..0000000 Binary files a/sdk/media/teapot.x and /dev/null differ diff --git a/sdk/media/tex1.ppm b/sdk/media/tex1.ppm deleted file mode 100644 index 051a39a..0000000 Binary files a/sdk/media/tex1.ppm and /dev/null differ diff --git a/sdk/media/tex2.ppm b/sdk/media/tex2.ppm deleted file mode 100644 index 2bca8db..0000000 Binary files a/sdk/media/tex2.ppm and /dev/null differ diff --git a/sdk/media/tex3.ppm b/sdk/media/tex3.ppm deleted file mode 100644 index 74a60fc..0000000 Binary files a/sdk/media/tex3.ppm and /dev/null differ diff --git a/sdk/media/tex4.ppm b/sdk/media/tex4.ppm deleted file mode 100644 index 588b1e8..0000000 Binary files a/sdk/media/tex4.ppm and /dev/null differ diff --git a/sdk/media/tex5.ppm b/sdk/media/tex5.ppm deleted file mode 100644 index 19d1a0a..0000000 --- a/sdk/media/tex5.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Jasc Media Center -256 256 -255 -!!)!!)!!)!!)!)1!)1!!)!!)!)1!)1!)1!)1))))))!!)!!))))))))!))!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)))1))1111))1))1))1))1))1))1))1))1111111111))1))1)))))))1))1))1))))))1))1))))1))1))1))1!)1!)1))1))1))1119119))1))1))1))1))1!)1))1))1111111111111111111111))))))1))1))))1))1))11111))1))1))1))9119119119119))1))1))1))1111111))1))1))1))1))1))1))1))1111111))1))1))1))1))1))1))1))1))111)19)19111111))1)19)19)19111111111111)19)19111111)19)19))1))1))1))1)19)19119119))1))1))1))1))1))1111111))1))1))))))))1))1))1))1))1))1))1))1))1)19)19)19))1))1))1))1))1))1)19)19)19)19))1))1)19)19!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!)1!)1!)1!)1)))))))))!!))))))))!))!!)!!)!!)))))))))))))))))))!!1))1))1))1))1))1))1))1))1))1))1))1111111111))1))1)))))))1))1))1))))))))))))))1))1))1))1!)1!)1))1))1))1))1))1))1))1))1))1))1!)1))1))1111111111111111111))1))))))1))1))))1))1))11111))1))1))9119119119999119111))1))1))1111111111))1))1))1))1))1))1))1111111119119111))1))1))1))111111111)19)19111111111)19)19119111111111111)19119111111111)19))1))1))1))1)19)19119119119))1))1))1))1))1111111))1))1))))))))1))1))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1)19)19)19)19))1))1)19)19!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1))))))!)1!)1!)1!!))))))))))))))))))))!!)!!)!!)!!1))1)))))))))))1))1))1))1))1))1))1))1))1)))!!)))1))1))1))1))1))1))1))1))))))))))))))))))))))))))))1))1))))))))1))1!!)!!)))1))1))1))1111111))1))1!)1))1111111))1))1))))))))))))))))))1))1))))1))1))11111))1))9119119119199999999119111))1))1111111111111))1))1))1))1))1))1))1119119119119111))1))1))111119119))1))1119119119119119119))1))1))1))1119119119111111111)19)19119119))1)19119119119119)19)19111111))1))1119))1))1))1))1))1))1))1))))))))1))1))1))1))1)19)19)19)19))1))1))1)19)19))1))1)19)19))1)19)19!)9))1))1!)1!)1!)1!)1!)1!)1!)9!)9!)1!)1!)9!)9))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)))))))!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1))))))!)1!)1!!)!!)))))))))))))))1)))))))!!)!!1))1))1))))))))1))1))1))1))1))1))1))1))1))1)))!!)))1))1))1))1))1))1))1)))))))))))))))))))))))))))))))1))1))))))))1))1!!)!!)))1))1))1))1111111))1))1!)1))1))1111))1))1)))))))))))))))))))))))1))1))11111111))1))9119119119199999999199111))1))1111111111111111))1))1))1))1))1))1119119999999111))1))111111119119))1))1119119119119119119)19))1))1))1111119119119111111)19119119119111))1119119119119)19)19111111))1111119119))1))1))1111111))1))))))))1))1))1))1))1))1)19)19)19)19))1))1)19)19))1))1!)9!)9))1))1)19!)9))1))1!)1!)1!)9!)9!)1!)1!)9!)9!)1!)1!)9!)9))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)))))))!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)))))))))1))1))))))1))1))1))))))))1))1))1)))!!)!!1))1))9))9))1))1))1))1))1))1))111111))))))))))))))))))))1))1))))))))1))1))))))))1))1))1)))!)1!)1))1))1))1))1))1))1))1))1))1))1))1))1))1111111111111111111))1))1))1))11111119111111111))1119119199999999199111))1))1111111111111111111))1))1111111111119119999999111))1))111111111111119119111111119119))1))1119119119119111111119119))1))1119119)19)19111111111)19)19)19)19))1))1))1111111119)19))1))1))1111111))1)))))1))1))1))1))1))1))1)19)19)19))1))1))1)19)19))1))1!)9!)9!)9)19!)9!)9!)9!)1!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1))1))1))1))1!)1!)9!)9!)1))1))1!)9!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)))))))))1))1))1)))1))1)))!!)!!1))1))1))1)))!!)!!1))1))9))9))1))1))1))1))1))111111))1))))))))1))1))))))))1))1))1))1111111)))))1))1))1))))))!)1!)1))1))1))1))1))1))1))1))1))1))1))1))1111111111111111111111111))1))11111119119111111111))9119119191191199199111))1))1111111111111111111))1))1111111111111119119111111))1))111111111111119119111111111119))1))1119119119119111111111119)19))1119119)19119111111))1))1)19)19))1))1))1))1111111119)19))1))1))1111111111))1))1))1))1111))1))1))1))1)19)19))1))1))1)19)19))1))1))1!)9!)9!)9!)9!)9!)9!)9!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1))1))1))1))1!)1!)9!)9))1))1))1!)9!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1))))))))))))!!)!!))!))!)))))))))))))1))1))))))!!1))1))1))1))1))1))1))1))1))1))9))9111))1))1))1))111111))1)))))1111))11111))))))))))1))1))1111111))1))1))1))1))))))))1))1))1))1))1))1!)1!)1!)1!)1))1))1))1))11111111111111111111111111111111111119119111111111119119199191111119119119111))111111111111111111111111111111))1))11111111111))1))1))1))111111119119119111111))1)19119119119119119119119119))1))1119119))1)19119119))1))1))1))1))1))1))1))1111111))1119119119))1))1119119119119111))1))1))1111111))1))1))1)19)19)19)19)19)19)19))1))1))1)19!)9!)9!)1!)1!)9!)9!)1!)1!)9!)9!)9!)9!)9!)9!)9!)1))1))1!)1))1))1))1!)1!)1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1))1))))))))))))!!)!!))!))!)))))))))))))1))1))))))!!1))1))1))1))1))1))1))1))1))1))9))9))1))1))1))111111))1))))))1111111111111111)))))))1))1111111111))1))1))1))1))))))))1))1))1))1))1))1!)1!)1!)1!)1))1))1))1))11111111111111111111111111111111111111119111111119199999999111111119119119))1))111111111111111111111111111111))1))11111111))1))1))1))1))111119119119111111111))1))1119119119119119119119119))1)19119119))1))1119119)19))1))1))1))1))1))1111111111)19)19119119111))1119119119119119119)19))1111111111))1))1))1)19119119119)19)19))1))1))1))1)19!)1!)1!)1!)9!)1))1))1!)1!)9)19)19!)9!)9!)9))1))1))1!)9!)9))1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!))))!!)!!)!)1!)1!)1!)1))1)))))))))))))))!)1!)1))))))))))))))1111))))))1))1))1))1))1))1))1))1))1))1))1))1))9))9))9))1))111111))1)))))11111111111))1))111111111111111111111111))1))1))))))))1))1))1))1111111))1))1!)1!)1))1))1))1))1))))))111111))))))111111111111))1))11111111111111119191199999999119119119119))1))1))111111111111111111111))1))1))1))11111111119))9))1))1))1))111119119111111119119119111111111119119119119111111111119)19)19119119111))1119119119119)19)19119119111))1119119)19)19111111119119119919999119119111111111))1))1))1))1119119119119)19))1))1))1)19)19!)1!)1!)1!)1!)1!)1))1))1))1))1)19)19))1))1))1))1))1))1!)9!)9!)9))1))1))1))1!)1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!))!))!))!))!)!)1!)1!)1))1))))))!!)!!)))))))))1!)1))1))))))))1111111))))))1111))1))1))1))1))1))1))1))1))1))1))1))9))1))1))111))1))))))1111111111111))1))111111111111111111111111))1))1))))))))1))1))1))1111111111))1!)1!)1))1))1))1))1))))))111111))))))111111111111))1))11111111111119119991191199119119119119))9))1))1))111111111111111111))1))1))11111111111111119))9))1))1))1))11111111111111111919B119119111111119119119119111111119119)19)19119119))1))1119119119119)19119119119111))1119119)19)1911111111911991999999B99B119119111111))1))1))1119119119119119119))1))1))1)19))1!)1!)1!)9!)9!)1))1))1))1))1))1)19)19))1))1))1))1))1))1)19!)9!)9!)9))1))1!)9!)9!)1!)1))1))1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!)!!)!!)!!)!!)!!))!))!))!))!)!)1!)1))1)))))))))!!)!!)))))))))1))1111))1))1))1111111))))))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)))))))1))11111111111111111))1))111111111111111111119119))1))1))))))))1))1))))))111111111))1))1!)1))1))1))11111111111111111111111111111111111111111111111119119119999991191111111111119))9))9))1))111111111111111111))1))1))11111111111111119))9))1))1))1))11111111111111111919B119119111111119119119119119119119119119119119119))1)1911919B119119119119119119119119))1))111911911911911911999999B9BB9BB119119119111))1))1119119119119119119119119)19)19))1))1))1)19)19)19))1))1))1))1)19)19))1)19)19)19)19))1))1))1)19)19!)9!)9)19)19!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!)!!))!))!))))!!)!)1!)1))))))))))))!!)!!)))))))))1))1111))1))1))1111111))))))1111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))))))))))11111111111111111))1))111111111111111111119119))1))1))))))))1))1))))))111111111))1))1!)1))1))11111111111111111111111111111111111111111111111119119119119111191191111111111119))9))1))1))111111111111111111))1))1))11119119111111119119111111111))1))11111111111111999999B119111111119119119119119119119119119119119119))1)1919B19B119119119119119119119119))1))111911999999911911999B9BB9BB99B119119119119))1))1119119119119119119119119119)19))1))1)19)19)19)19))1))1))1)19)19)19))1)1919B19B119)19))1))1119)19!)9!)9)19)19)19!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!))))))))))!!)!!))!))))))))))))))))))))))1))1))1111111111111))1))))))))1))1))))))))))))))1))1))1))1)))!))!))))))11111111))1))111111111111111111))1))1111111))1))1))))))))1))1))1))1111111))1))1))1))1))11111111111111111111111111111111111111111111111111119119119119111191191111111111111))1))1))1))111111111111)19)19111111))11119119111111119119119119111))1))11111111111191999999B11911111111191991991911911911911911911911911911911919B19B119119119119119119)19)1911111111999999999911911999999B99B99B119119119119111111119119119119111111119119119119))1))1))1)19)19)19))1))1)19)19119119)1911911919B19B119119119119)19!)9!)9)19)19))1))1!)1!)1!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!))!))!)!!)!!))!))!)!!)!!)!!)!!)))))))!!)!!))!))!)))))))))))))))))))1))1111111111111111111))))))))1))111)))))))))1))1))111111))))!))!)))))))1111111))1))111111111111111111)19111111111111))1))1))1))1))1))1))1))1))1))1))1))1))11111111111111111111111111111111111111111111111111111119119119199191191199199111111111111))1))1))111111111111)19)19111111))11119119111111119119119119111))1))11111111111191999911911911111191991991999911911911911911911911911911911919B19B11911919B19B119119)19)1911111111999999999999911999999999B99B119119119999111111119119119119111111119119119119)19))1))1)19)19)19)19))1)19119119119)1911911919B19B19B119119119)19)19)19)19)19))1))1!)1!)1))1))1!)9!)9))1))1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!))!))!)!!)!!))!))!)!!)!!))))))))))))))!))!!)!!)!!1))1))))))))))))))1111111111111111111111))1))1))111111)))))))))1))111111111))1)))))))))111111111111111111111111111111119119119111111111111))1))1111111))1))1))1))1))1))1)))1))1))1))1))1))1))1111111111111111111119119111))1))911911911911999999919919999999911111111111111111111111))1))1))11111111111111111111111))1))9))9))9111111))1))1))1))1))11111911911111111911911999999911911911911111111911911911919B11911911911919B19B19B11911911911111111111111911999999B99B99999999B99B11911999999911911111911911911911911919B19B119)19)19)19)19)19)19)19)19))1111111119119)19)1911919B19B19J19B119)19)19)19)19)19)19)19!)1!)1!)1))1))1))1))1))1))1))1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)))))))))))))))))!))!))))1))1))1))))))))))))))1111111111111111111))1))1))111111111))1))))))1))111111))1))1))1)))11111111111111111111111111111111911919B119111111111111))1111111111))1))1))1))1))1))11))1))1))1))1))1))1))1))1111111111111111119119119))911911B9191199999999999999999BB99999911111111111111111111))1))11111111111111111111111111))1))9))9))9))1))1))1))1))1))1))11111911911111111999B11911911911911911911111111911911911919B19B11911919B19B19B19B11911911911911111111911911919B99B99B19B19B99B99B99B99B99999911911911911911911911911919B19B)19)19)19)19)19)19)19)19)19119111111119119)19)1911919B19J9BJ19B119)19)19)19)19)19)19!)9!)9!)1))1))1))1))1))1))1))1))1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!)!!))))!!)!)1!)1))))))))))))))))))))))))1))1))))))))))))))))))))111111))1))11111))1))1))1))1))111111111))1))))))111111119119))111111111111111111111111111111111111911919B1191111))111111111111111111))1))1))11111111111111111))1))1))1))1))1))9111111111111))1))9))911911B91B91B91B99B999999999999B9BBBBBBB99911111111111911119111))11111191191111111119199199119119))1))1))9))9))1))1))1))1))1))1))11111111911999999911911911911999911911111911911911911911911911911919B19B19B11911911911911911911911911911999B9BB9BB99B99B9BB9BB9BB99B999119119119119119119)19119119119119))1))1119119111111)19)19119119119119119119))1)1911919B9BJ9BJ99B119119))1)19)19)19)19!)9!)9))1))1)19))1))1))1)19)19!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!)!!)!!))))))))))!!)!!))))))))))))))))))))))))))))1))))1)))))))))))))))1))1)))))))))))1))1))1))1))1))111111111))1))))))11111111911911111111911911111111111111111111111111919B1191199111))111111111111111111))1))11111111111111111111111))1))1))1))1119119111111111))1))9))9))B91B91B91B99B99B999999999B9BBBBBBBBBB99B999111119119191191111111119199191111119199199199199111))1))1))9))9))1))1))1))1))1))1))1))11111999999999999911911911991991911911911911911911911999911911919B19B11911911911911911911999B99B99B99B9BB9BB9BB9BB99B9BB9BJ9BJ9BB19B119119119119119)19)19119119119119))1))1119119111111119119119119119119119111))1)1911919B9BJ99B19B119111))1)19)19)19)19!)9!)9))1))1!)9!)9))1))1!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!)!!)!!)!!)!!)!!)!!))!))!)))))))!!)!!)))))))))))))))1))1))1))))))))1111))1))1)))))))!!)!!))))))))))!!)))1))1))1))1))111111))1))))))1111111191191199119111191191111))91111111111111199999B99B9999199119119111111111111111111111111111111111119119111111111))1))1111119119199191111111))9))9))B91B91J99B99B99999B99B99BBBBBBB99B99B99B999999991191191111111119199199119111111191199199191111))1))1))1))1))1))1))1))1))1))1))1))11111991999999999911911999999991911911911911911911999B99B11911919B19B11911911919B19B19B19B99B99B9BB9BB9BB99B99B9BB9BB9BB9BB9BJ9BJ19B119119119119119119119119119119119119119119119119119119119119119119119119))1))1)1919B19B19B19B119119)19)19)19)19)19)19!)9!)9))1))1!)9!)9!)1!)1!)9!)9!)1!)1!)1!)1))1))1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)))))))!!)!!)!!)!!))))!!))))))))))!!)!!)))))))))))))))1))1))))))))))))1111))))))))))))!!)!!)!!)!!)!!)!!)!!1))1))1))1))111))1))))))1111111191191191199119199991191111))91191111111191999999B99B9999999999999119111111111111111111111111111111119119111111111111111111119119199199191111))9))911911B91J99B99B99999B99B99BBBBBBB99B99B99B99B99999119))11111119199199119119119191191199199191111111111))1))1))1))1111))11111111111111191999999999911911911911999999911911911911911999999B99B11911919B19B19B99B19B19B19B19B99B9BB9BJ9BJ9BJ9BB99B99B9BBBBB9BB9BB9BJ99B99B119119119119119119119119119119119119119119119119119119119119119119119119))1)1911911919B19B19B119119)19)19)19)19119)19)19!)9))1))1)19!)9!)1!)1!)9)19!)1!)1!)1!)1))1))1))1!)1!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!))))))))))!!)!!))))))))))!!)))))))!!)!!)))))))))))))))1))))!))!!)!!))))))))))!!))))))))))!!)!!)!!)!!)!!)!!1))1))1))1)))))))))))1111119199199199199119119119999111111))1))9119199199199199999999B99999999199199111111))111111911911111111111911911911911911911911911911911911911911911911911911911B91B91B91B91B99B99B99J99J99J99B99B91999B99999111))11111119199191111119119191191199199119119119119111))1))1))11111191191191191999999B99B9B99B919B19B19B19B99B99B9991191191191199999B99B999911919B99B9BB9BB99B99B9BB9BB9BB9BB9BJ9BJ9BJ9BB99B99B9BB9BB9BB9BB9BB99B99991999B99B99911911911911911911911911911911911911911911911911911911911911911911911911911919B19B19B19B19B)19119119119119)19))1))1))1)19)19!)9!)9)19)19))1))1!)1!)1))1))1))1))1)))))))))))1))1))1!!)!!)!)1!)1!)1!)1!!)!!)!!)!!))))))))!))!)!!)!!)!!))))))))))!!)!!))))))))))))))))))))))))))!))!!)!!)!!)!!)!!1)))))))))))))))!!)!!)!!)!!1))1))9119))1)))))))11111119199199199199119119119119119111))1))1))911999BBB999919999B999B99999999199199111))1))111111911911111111911911911911911911911911911911911911911911911911911911911911B99B91B91B91B99B99JB9J99J99J91B9191199991911111111111191991911111191991911911991191191191191991191111111111999999999999999999999B99B9B99B919B19B19B19B99B99B9991191191199199999B99B999911999B99B9BB9BB9BB99B9BB9BBBBB9BJ9BJ9BJ9BJ9BB99B99B9BB9BB9BJ9BB9BB99991999999B99B99991911911911911911911919B19B11911911911911911999999B19B19B11911911911911919B19B19B19B19B19B19B11911919B19B119))1))1))1)19)19)19)19)19))1))1))1!)1!)1))1))1))1))1))))))))1))1))1))1)))!!)!)1!)1!)1!)1!!)!!)!!)))))))))))!))!)!!)!!)!!)!!)))))))!!)!!))))))))))))))))1))1))))))))))))!!)!!1))1))1))111))))))1))1)))!!)!!)))1))9119111111111119119199199199199119119119119199119111))1))1))1))91199BBBBBBBBBBBBBBBB99B9999999199199119))9))911911911911911911911911911911911911911911911911911919919919911911911911911911B99B99B91B91B99B99BBBJB9J91J91B9191191991991191191191191191191111111999999991191191191191191191191199999B9BB9B99B9BBBBBB99991991999999911999B99B99B99B99B99B11911999999999911999B99B11911999B99B99B99B9BB9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBBB9BB9BB9BJ9BJ9BB9991199999BB99B99991111911911999B99B99B99B99B99B99911911911911999B9BB99B19B19B11911911919B19B19B19B19B19B19B19B11911919B19B)19))1)19)19)19)19)19)19)19))1))1))1!)1!)1))1))1))1))1))1))1!)1!)1))1))1))1))1))1))1!)1!!)!!)!!)))1))1)))))))!))!)!!)!!))!))!)))))))))))))))1))1))))))1))1))1))1))))1)))))))))1))111111))1))))))))11)))!!)!!1))1119119111111111119119199199199199199119119119199199111))1))1))1))911BBB9BJBBBBBBBBBBBBBBB9999119119119119))9))9119999119119))9))911911911911911911911911911911911911919919911911911911911B99B99B99B99B99B99B99B99B99J91B91B91999999919911911911911911911911919119999999911911911911911911911911B99BBBBBB9BB9BBBBBBBB99991991999911911999B99B99B99B99B99B99999999999999911999B99B99B99B99B99B99B99B9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB9BJ9BJ9BB99B11999B9BB9BB99911911911999B9BB9BJ9BJ9BJ9BJ99B99B1191191191199BB9BJ9BJ9BJ19B19B11999B19J19J19B19B19B19B19B19B11911911919B)19)19)19)19)19)19)19)19))1))1))1))1))1!)1))1))1))1))1))1))1!)1!)1))1))1))1))1))1))1!!)!!)!!)))1))1))1)))))))!))))!!)!!))!))!))))))))))))1))1))11)))))))))))111111))))))))))))1))1))))))))1))1)))))))))!!)!!1))1111111111111111111119119199999999199199119199999999111))1))1))9))B99B99BBBBBBBBBB99B99BBB9999119))9119119))9))9119999119111))1))911911911911911911911911911911111111111919911B91B91B91B91B99B91B99B99B99B99B99B99B91B91B919B99B9B99999911911911911911911919919999999911911919919911911911911911B99B9999B99B9BB9BB99991991999999999911999B99B99B99B99B99B9999999999991191199B99BB9BB9BB9BB9BB9BB9BB9BJ9BJ9BJ9BJ9BJBJRBJR9BJ9BJ9BJJJJJJJBBB9BB9BB9BB99B19B11999B9BB9BB99911919B99B9BB9BJ9BJBJRBJR9BJ9BJ19B19B11911999B9BJ9BJ9BJ9BJ19B19B99B9BB9BJ19J19J19B19B19B19B19B119119119119)1919B19B19B19B)19)19)19))1))1)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1!)1!!)!!)!!)))1))1))1))1))))))))))))))))))))))))))))))111111))))))1))1))))))))111111))))))))))))1))1))))))))1))1)))))))))))1))1))1))1))1))1111111111119119999999999191119119199999999119))1))1))911B99BBBBBB9BJBBBB99B99BBBB999119))9119119))9))9119119119111))1))911911911911911911911911911911111111911911B91B91B91B91B99B99B91B91B99BBBBBBB99B91B91B91B999B9B99B99B99911911911B91B919999199199999999999999199999999119))9))91199999999999B99B9B99B99999999B99B911911999B99B99B99B99B99B9999999999999999999999BB9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJBJRBJR9BR9BJ9BJBBBJJJJJJ9BJ9BB9BB9BB9BB99B11999B99B99B99919B9BJ9BJ9BJJJJBJRBJRBJR9BR9BJ19B19B1199999BB9BJ9BR9BR9BJ19B19B9BB9BJ9BJ19J19J19B19B19B19B19B11911911911919B19B19B19B19B19B19B)19)19))1)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1)))!!)!!)!!)))1))1))1))1))1))))))))))))))))))))))))))1111111))))))111111))))))111111))1))))))1))1))1))))))))1))1)))))))))))1))1))1))1))1))1))1111119199999999999991111111119119999119))9))1))9))911B99BBBJJJ9BJBBBBBBBBBB99B999119119))9))9))9))9))9119119119))9))911999919919919911111111911911911911911911B91B91B91911B99B99B99B99JB9BBBBBBB99B91J91J99B99B99B99B99B99911911B99B99B99B999999999199199999999999999999119))1))91199999999B9999999B99B999B99B9BB99B11911999B9BB9BB9BB99B99B1199999999B999B99B99B9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BR9BJ9BJ9BJBJRBJR9BJBBB9BJ9BJ9BB99B99B99B99999999999B9BB9BJBJRBJRBJRBJR9BR9BR9BR19J19B11999999B9BJ9BR9BR9BJ19B11999B9BJ9BJ19J19B19B19B19B19B19B19B)1911911911919B19J19J19B19B119119)19)19)19)19)19))1))1))1119119))1))1))1))1))1))1))1))1))))))!!)!!)))1))1))1))1))1))1111))1))1))1))))))))1))1))1)))))1))1111111))))))111111)))))))))1))1))1))))))))1))1))))))))1))1))1))1))1))1))1))91191191999999B9999991111111119119119119))9))9))911911B99BBBJJJBBBBBBBBBBBBB99B999999119))9))9))9))9))9))911911911911911999999919911911911111911911911911911911B91B99B91999B99B99B99B99B99JB9B99J91J91J91JB9BBBB99B99B99B99911911B99B99B99B99B999999199199999999999999119111111119119199999999999999999B999B99B99B99B11911999B9BB9BB9BB99B99B1199999B99BB9BB99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJRBJR9BR9BJ9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BB9BB99B99999999B9BB9BJJJJBJRBJRBJRBJRBJZBJZ9BR9BJ99B99999999B9BJ9BJ9BJ9BB99B99B9BJ9BJ19J19J19B19B19B19B19B19B19B19B11911919B19B19J19J19B119119119)19)19)19)19)19)19))1))1111119)19))1))1))1))1)19)19))1))1)))!!)!)1))1))1))1))1))1))1111111))1))1)))))1))1))1))))))))1))11111111111111111))))))!!)!!)))1))1))))))!!1))1)))))))))))1))9))9))1))1))1))111911919999999999999911111911911911911911911911B91B91B91B99BBBJB9JB9B99B99B99B99B91B919))9))9))9))9))9))9))911911919B99B99999911911B91911911911911911911911B99B99B99B99B99BBBBBBB99B99B99B99B99J91J91J91JB9BBBB999B9B99B99B91B999B9B99B99B999999999199199199999999119111))11191191191191199999999999999999999999999999999999B99B99B99B9999999999B999B99B99B99B99B99B9BB9BJ9BB9BJJJJJJJ9BJ9BJJJJBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJ9BJ9BB9BB9BB9BB9BB9BJ9BJ9BRBJRBJRBJRBJZBJZBJZBJZ9BR9BJ99B99B99B9BJ9BJ9BB99B9BB9BB9BJ19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19))1))1))1)19)19)19))1))1)19)19119111))1))1!)1!)1))1))1))1))1))))))111111111))1))1))1111111))1))1))1)))111111111111111))))!!)!!)!!)))1))1))1))1))1))111)))))))))1))9))9))1))1))1))111919999999999999999999911911911999999999911B91B91B91B91B91B99J91J91B99B99B99B91B91B919))9))9))9))J91J91J91B91919999B99B91B91B91B91B91B91911911911911911911B99B99B99B99B99BBBBBBB99B999B9B99B91J91J91J91JB9BBB9B9999B99B99B91B999B99B9B99B9999999999991991191191191191111191191191191191191199999999999999999999B99999999B99B9BB9BB99B99BB99B999B999B99B99B99B99B9BB9BB9BB9BBBBBJJJJJJ9BJ9BRJJJBJRBJRBJRBJRBJRBJRBJRJJJJJJBJRBJRBJR9BJ9BJ9BJ9BJ9BB9BB9BB9BB9BB9BJ9BJBJRBJRBJRBJZBJZBJZBJZBJR9BJ9BB99B9BB9BJ9BJ99B99B9BB9BJ9BJ19J19B11919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19))1))1))1)19)19))1))1)19119119119))1))1!)1!)1))1))1))1))1))))))))1111111111))1))1111111))1))1))))))111111111111))1))))!!)!!)!))))1))1))1))111111111))))))1))1))1))1))1))1))111111919999999999999999999999B99B99B99999919919B99B99B99B91B91B91B91B91B99B99B91B91B919119119))9))J91J91J91J91B91B99999B91B91B91B91B91B91B91B91911911911911911999B99B99B99B99B99BBBB999B9999B99J91J91J91J91B99B99B99B91B91B91B91B91B99B999999999B999999991999991191191191991991191191191191191199999999999BBBBBBB9BB99B99999BBBB9BJ9BJ9BJ9BB9BB9B99B999B99B99999999B9BBBBBBBB9BBBBB9BJ9BJ9BR9BRBJRBJRBJRBJRBJZBJZBJZBJRJJJJJJBJRBJRBJRBJRJJJJJJ9BJ9BJ9BB9BBBBBBBB9BB9BJBJRBJRBJRBJRBJZBJZBJRBJR9BJ99B9BB9BB99B99B99B9BJ9BJ9BJ9BJ19J99B11919B19B19B19J19J19B19B19B19B19B11911911919B19B19B19B19B19B19B19B)19119119119119119119119119))1))1119119119111))1!)1!)1!)1))1))1))1))1))1))1))))))111111))1))1)))))1))1))1))))))111111111111)))))))!!)!))))))11))1))111111111111))1)))1))1))1))1))1))1))1))111999B9999999999B99B999B99B99B99BBBBBB919919999B99B99B99B99B91B91B91B99B91B91B919119119119))B91J91JB9J91J91J91B99B99B91B91B91B91B91B91B91B91B91911911911911B99B99B99B99B99B99B99B99B99B99B99J91J91J91J91JB9B99B99B91B91B91B91B91B99B999999999B99B9B99B999999119119199999999999119119119119999B99B9999999BBB9BJ9BJ9BB99999BBBB9BJ9BJ9BJ9BB9BB9BB9B99BB99B99B99B9BB9BBBBBBBB9BB9BB9BJ9BJBJRBJRBJRBJRBJRBJZBJZBJZBJZBJRJJJJJJBJRBJRBJZBJRBJRJJJ9BJ9BJ9BJBBBBBBBBBBBB9BJBJRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJ9BJ9BB99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B19B19B19J19J9BJ19J19B19B19B19B11911919B19B19J9BJ19B19B19B19B19B19B119119119119119119119119119111119119119)19))1))1!)1!)1))1))1))1))1))1))1))))))111111))1))1))))))))1))1))))))1111111111))))))!!)!!)!)))11111))1))))))))1))1))1111111))1))1))1))1))1))1))111999BBB99999B9BB9BB99B999999BBBBBBBBB999919999B99JB9JB9B99B99B99B91B91B91911911B91B91911B91J91J99JB9JB9JB9JB9JB9J99J91B91B91B91B91B91B91B91B91B91B99B99B99B99B99B91B99B99B99B99B99B99B99B99J91J91J91J91JB9BBBB99B91B91B91B91B91B99B999B99B99B99B9B99B99B999119119999B99B9999911B91B999999999B99B9911999BBB9BJ9BB99B9999999BB9BJ9BJ9BB99B99B99B9BB9BB9BJ9BB9BB9BB9BB9BJBBB9BB9BJBJRBJRJJJBJRBJRBJZBJZJJZBJZBJZBJZBJRBJRJJJBJRBJRBJRBJRBJRJJJ9BJ9BJJJJ9BJBBBBBB9BJBJRBJRBJR9BR9BJBJRBJR9BR9BJ9BJ9BJ9BJ9BJ99B9BJ9BJ9BJ9BJ9BJJJJJJJ9BJ9BJ9BJ19J19J19J9BJ9BJ19J19B19B19B19B19B19B19J9BJ9BJ9BJ9BJ9BB99B99B19B11911911911911911911919B11911911911919B)19))1))1))1))1))1))1))1))1))1))1)))1))111111))1)))))))))))))))))11111111111))1))1)))!!)!!)))1))1111))1))))))))1))1))1111111))1))1))1))1))1))1))91191999999999B9BB9BB999999999B99BBBBBB999919B99B99JB9JB9B99B99B99B91B91911911999B91B91B91B91J99J99J99J99JB9JB9JB9JB9J91B91B91B919))9))B91B91B91B91B99B99B99B99B99B91B99B99B99B99B99BBBBBBJB9J91J91J91J91JB9B99B99B91J91J91B91B91B99B999B99B99BBBBBB99B99B999119119999B99B9999999B99B99B99B999B99B9911999BBB9BJ9BB9999999999BB9BB9BB9BB9999999999BB9BJ9BJ9BB9BB9BB9BJ9BJ9BJBBB9BJBJRBJRBJRBJRBJZBJZJJZJRZJRZBJZBJZBJZBJRJJJBJRBJRBJRBJRBJRJJJ9BJJJJBJRJJJ9BJ9BJBJRBJRBJRBJR9BJ9BJBJRBJR9BJ9BJ9BJJJJJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJBJRBJR9BR9BJ9BJ19J9BJ9BR9BJ9BJ19J19B19B19B19B19J9BJ9BJ9BJ9BRBJR9BJ9BB9BB99B19B19B11911911911919B19B19B11911911919B19B)19))1))1))1))1))1))1))1))11111111))111))1))))))))))))))))))1111111111))1))1))1))))))!!)!!1))1111))1))1))1))1111111))1))1))1))))))))1))911911911919919919999BBBBBB999919999B99B99B99911B91B99J99B99B99B91B91B99B919))911999B99B91B91B91J91J91J91J91J91J91J91JB9J91B919))9))9))9))9))B91J91J91J91J99B99B99B99B99JB9J99B99B99B99BBBBBBBBBJB9J99J91B91B91B99B99B99B91J91J91B91B91B91911911999BBBBBBB99B99B99B99999999B99B999B99B99B9B99B99B999B99B999999B9BJ9BJ9BB9999999999B99BB9BB9B99B99B99B99BB9BJ9BJ9BB9B99BB9BJBJRBJRJJJJJJJJJBJRBJRBJRBJZBJZBJZBJZBJZBRcBRcBJZBJRJJJBJRBJRBJRBJRJJJJJJJJJJJJBJRBJR9BJBBB9BJ9BJBJRBJR9BJ9BJBJRBJR9BJ9BB9BJ9BJBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJBJR9BR9BR9BR9BR9BJ9BJ9BR9BR9BJ9BJ9BJ19J19B19B19J9BJ9BJ9BJBJRBJRBJR9BJ9BJ9BJ19J19B19B119119)1919B19B19B11911911919B19B119111))1))1))1))1111111111111111111))))))))11111111111111111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1111111111))1))1))1))1))1))911911919919919911919B99B99919999B99B99B99B99911B91J99J99B91B91B91B99B99B91911911B91B91B91B91J91J91J91J91J91J91J91J91J91J91B919))9))9))9))9))J91J91J91J91J91J99B91B99JB9JB9JB9J99B99B99BBB9BJBBBBBBJB9B99B91911911911911B919))J91B91B91911911911999BBBBBBB99B99B99B99999999B99B999B99BB9B9999B99B999B99B999999BBBBBBB9BB9B99999999B99B99B99B99B99BB9B99BB9BJBBB9BB9B99BB9BJBJRBJZBJRJJJJJJBJRBJRBJZBJZBJZBJZBJZBJZBJZJRZBJZBJRJJJBJRBJRBJRBJRBJRJJRJJJBJRBJRBJRJJJJJJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BJ9BB9BJ9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BRBJRBJR9BR9BJ9BJ9BR9BJ9BJ9BJ9BJ9BJ19B19B9BJ9BJ9BJ9BJBJRBJZBJR9BR9BJ9BJ9BJ19J19B119)19)1911919B19B11911911919B19B119119)19))1))1111111111111111111111))))))1111111111111111111111111))1))9119111111))1))1))1))1))))))))1))1111111111111111))1))1))1))1))911911999999919111911911B99999999B99B99B99B99B99B91B91B91B91B91J99JB9B99B91B91B91B91B91B91B91J91J91J91J91J91J919))9))B91B919))J91J91J91J91J91J91J91J91J91J91J91J99B99JB9JB9JB9B99B99B99BBBBBBRJBRJBBBBB99B919))911911911B919))9))B91B919119119999999BBBBBB99B99B99B999B99999999999B99B9999911911911B99B999999B99BB9BB9B99B99B99B99B99B99B99B99BB9BB9BB9BBBBBBBB9BB9BB9BB9BJ9BRBJZBJRJJRJJRJJRJJZJJZJJZJRZBJZBJZJJZJJZJJRJJRJJJJJJBJRBJZBJRBJRBJZJRZJJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJBJRBJRBJZBJR9BJ9BB9BJBJRBJRJJJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRJJJ9BJ9BJ9BR9BJ99B99B9BJ9BJ19B19B99B9BJ9BJ9BJ9BRBJR9BR9BR9BJ9BJ9BR9BJ19B11911911911919B99B11911911911919B119119))1))1119111111111111111111111))))))1111111111111111111111111))9119199199119))9111111111))))))))1))1111111111111111))1))1))1))1))911911B99BBB9999111))911999999B99B99B99B99B99B99B99B91B91B91B91JB9JB9B99B99B91B91B91B91B91B91J91J91J91J91J91J919))9))B91B91J91J91J91J91J91J91J91J91J91J91J91J91JB9BBBBBBBBBJB9B99B99BBBBBB9BJJJJRJBBBBB99B919))911911911911911B91B91B9191199999999B9B9B99B99B99B99B999B99B999B9999B9999911911911999B99B99B999B99B99B99B99B99B99B99B99BB9B99BB9BB9BJ9BBBBBBBBBBBBBB9BB9BB9BJBJRBJRJJRJJRJRZJRZJRZJJZJJZJJZBJZBJZJJZJJZJJRBJRBJRBJRBJRBJRBJRBJZJRZJRZJJRJJRBJRBJRJJRJJRBJRBJR9BB9BJBJRBJZBJZBJR9BJ9BJ9BJBJRBJRJJJ9BJ9BJJJJJJJ9BJ9BJBJRBJRJJJJJJJJJ9BJ9BJ9BJ9BJ9BJ99B99B9BJ9BJ19B19B19B9BJ9BR9BR9BR9BR9BR9BJ9BJ9BJ9BR9BR19J19B11911911999B99B99B119119119119119119))1))1119119111111119119111111))))))1111111111111111111111119119119199199119119119111111))1))1))1))1))1111111111))1))1))1))1))1))111999BBBBBBB99911911911911B99B99B99B99B99B99B99B99B99B91B91B91B99B99J99J99B99B99B99B99B91B91J91J91J91J91J91J91B91B91B91B91J91J91J91J91J91J919))B91J91J91J91J91JB9RJBRJBRJBJB9B99BBBBBB9BJ9BJ9BJBBBBBBJB9B91911911911911911911B91B91B91911911999B99B99B99BBBJB9B99B999B99BB9BB99B999911911911B91B99999B99B99B999BB99B99999999B9BB9BB9BB9BB9BB9BJ9BJBBBBBBBBBBBB9BJ9BJ9BJ9BJBJRJJRJJRJJRJRZJRcJRZJRZBJZBJZJJZJJZJRZJRZBJRBJRBJRBJRBJRBJRBJRBJZJRcRRcJRZJJRJJZJJRJJRJJRBJRJJJ9BJ9BJBJRBJZBJZBJR9BJ9BJ9BJBJRJJRJJRBJR9BJJJRJJJJJJ9BJBJRBJRBJR9BJ9BJ9BJ9BR9BR9BJ99B99B99B19J19J99B99B19B19J9BRBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ19B11911999999B9BJ9BJ19B119119119119119))1))1119119911911119119111111111111119119111111111111))1))19199199199199119119119111111))1))1))1))1))1111111))1))1))1))1))1))1))911999BBBBBBBBB999911911919B99B99B99B99B99B99B99B99B99B99B91B91B99B99J99J99B99B99B99B99B91B919))J91J91J91J91B91B91B91B91B91J91J91J91J91J91J919))9))J91J91J91J91JB9RJBRJBRJBJB9BBBBBB9BJ9BJ9BJ9BBBBBBBBBBBB99B91B91911911919999999B99B999119999B99B9B99BBBBBBBBBB99B999B99BB9BB9BB999911999B99B99B999B99B9B99B9999B99B99999999B99B9BB9BJ9BJ9BJ9BJ9BJ9BJBBBBBB9BJ9BJ9BJ9BJJJJJJRJJRJJRJJRJRZJRcJRZJRZBJZBJZJJZJJZJRZJRZBJZBJRBJRBJRJJJJJJBJRBJZJRcRRcJRZJJZJRZJJZJJRJJJJJJJJJ9BJ9BJBJRBJZBJZBJR9BJ9BJBJRBJRJJZBJZBJRBJRJJRJJRJJJ9BJBJRBJRBJR9BJ9BJ9BJ9BR9BR9BJ9BJ99B99B19J9BJ99B99B19B19J9BRBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ19B19B99B9BJ9BJ9BJ19B119119119119119))1)19119119911919119119111111111111119119111111111111))1))19199199199191111111111111111111))1))1111111111))1111111))1))1))1))111911999B99BBBBBB999919919919B99BBBBBBBBBBBBBBBBBBBBBB99B99B99B99B99B99B99B99B99911911911B91B91B91B91J99J99B91B91J91J99B91B91J91J91J91J91J91J919))J91J91J91J91J91J91JB9JB9BBBBBBBBBBBB9BJ9BJ9BJ9BBB99BBBBBBJ91B91B919119999999999B99B99B99B99B99B99B99B9BBBBBBBBBB99B999B99BBBBBBBB999999BBBBBBB999B99B99B99999999999999999B9B99BBBBBB9BJ9BJ9BJBBBBBBJJJJJJJJJ9BJBBBBBB9BJBJRJJRJJZBJRBJRJRZJRcJRZJRZBJZBJZBJZJRZJRZJRZBJZBJZJJRBJRBJRBJRBJRJJZJRZJRZBJZBJZJRZJJZBJR9BJ9BJ9BJJJJJJJBJRBJRBJRBJR9BRBJRBJZBJZBJZBJRBJRBJRBJRBJR9BJ9BJJJJBJRBJRBJR9BJ9BJ9BR9BR9BR9BJ19J9BJ9BB9BB99B19J19J9BJ9BRBJZBJRBJR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B1191191191191191191191191191191191191191111111111111111111111111111111111119199199199111111))1))1))1111111))1))1111111))1))1111111111))1))111111999B99B99BBBBBBBBB999919999BBBBBBBBBBBBBBBBBBBBBJB9B99B99B99B99B99B99B99B99911911911B91B91B91B91B91J99J99B91B91J99J99B91B91J91J91J91J91J91J91J91J91J91J91J91J91J91JB9JB9BBBBBBBBBBBB9BJ9BJ9BJ9BBB99BBBJB9J91J91B9199999999B9B99B99B99B99B9B99B99B999B99B9BBBBBBB99B999999B9BBBBBBBBBBBBBBBBBBBBB9BB9BB9BB99B99B9999999B9BBBBBBBBB9BJ9BJ9BJ9BJBBBBBBJJJBJRBJRJJJBBB9BJJJJJJRJJZJJZBJRBJRJJZJRZJRZJRZJRZBJZBJZBJZJRZJRZJRZJRZJJRJJRBJRBJRJJZJRZJRZJRZBJZBJZJRcJRZJJJ9BJ9BJJJJJJJBJRBJRBJZBJZBJR9BRBJRBJZJRZBJRBJRBJRBJRBJRBJR9BJJJJJJJJJJBJR9BJ9BJJJJ9BR9BR9BR9BJ19J9BJ9BB9BB9BJ19J9BJ9BJ9BRBJRBJRBJR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B19B1191191191191191191191191191191191191111111111111111111111111111111111119199199199111111))1))1))1))1111))1))1))1111111111111111111111))1))111911B99B99BBBBBBBBBBBB999999BBBBBBBBBBBBBBBBBBB99B91B99B99BBBBBBJB9B99B99999911911B99B99B91B91B91B91J91J91B91B91B91B99911911J91J91J91J91J91J91J91J91J91J91J91J91J91JB9JB9BBBRJBRJB9BJ9BJ9BJ9BJ9BJBBBJB9J91J91J91B999999999999B99B99B99B9B99B99JB9B99B99B99B99B99B99B99911999B99BBBBBB9BJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9BJ9BJJJJJJJJJJBBBBBBJJJBJRJJJJJJJJJJJJJJRJJZJJZJJZJJRJJRJJZJJZJJZJJZJRZJRZJRcJRcJRZJRZJRZJRZBJZBJZBJRJJRJJRJJZJRZJRZJJZJJZJRZJRZJJRJJJJJJJJRBJRBJRBJRBJZBJZBJZ9BRBJRBJZJRZJJRJJRBJRBJRBJRBJRBJRBJRBJRJJRJJJJJJ9BJ9BJ9BR9BR9BJ9BJ99B99B99B9BJ9BJ9BJ9BJ9BJBJRBJZBJZBJR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J119119119119119119119119119119119119119119119119111111119111111111))1)199199119119111111))1))1))1))1))1))1))1))1))111111111111111111111911911911B99B99BBBBBBBBBBBB99999BBBBBBBBBBBBBBBBB99B99B91B99B99BBBBBBBBBB99B99999999999999B99B91B91B91B91J91J91B91911B91B91911911B91J91J91J91J91J91J91J91J91J91J91J91J99JB9JB9BBBRJBRJBJJJ9BJ9BJ9BJ9BJBBBJB9J91J91B91B999999999999999B99BBBBBB99JB9JB9JB9B99B99B91B91B99B99B99911B91B999BJ9BJB99B99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9BJ9BJ9BJJJJJJJ9BJBBBBBBJJJJJJBJRJJJJJJJJJJJRJJZJJZJJZJJRJJRJJZJJZJJZJRZJRZJRZJRcJRcJRcJRZJRZJRZBRcBJZJJRJJRJJZJRZJRcJRZJJZJJZJRZJRZJRZJJRJJRBJRBJRBJRJJZJRZBJZBJZBJRBJRJJZJRZJRZJJRBJRBJRJJRJJRBJRBJRJJRJJRJJRJJJ9BJ9BJ9BR9BR9BJ99B99B99B9BJ9BJ9BR9BJ9BJ9BJBJRBJZBJZBJZBJRBJR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BJ99B99B99B99B19B19B119119119119119119119119119119119119119119111111))1)191111111111111111111))1)))))1))1))1))))))))111111111111111111111911911999B99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJ99J99B99B99BBBBBBBBBB99B91B91B9999B999999B91B91B91B91J91J919119))9))B91911B99B91B91J91J91J91J91J91J99J99J99B91B91JB9JB9JB9JB9BBBRJBJJJ9BJ9BJBBB9BBB99B99B91B91B91B919999999999999999BBBBBBBBJB9JB9B99B99B99B91B91B99B99B99B99911999BBBBBBB99B999B99BB9BB9BB9B99BBBBBBBBBBB9BBBBB9BJ9BJ9BJ9BJ9BJ9BB9BBJJJJJRJJRJJRJJJJJJJJRJJRBJRBJZJRZJRZBJZBJZJRZJRZRRZRRZJZcJRcBRcBRcBJZBJZJRZJRZJJZJJRJJZJRZJRcJRcJRZJRZJRcJZcJRZJJZBJRBJRBJRBJRJRZRRZJJRBJRJJRJJRJRZJRZJJZJJZJJRJJRJJRJJRJJRJJRJJRJJRJRZBJZBJRBJR9BR9BR9BJ9BB9BJ9BJ9BJ9BJ9BR9BR9BJ9BB9BJBJZBJZBRcBJZBJZBJR9BR9BR9BRBJR9BR9BR9BJ9BB9BJ9BJ9BRBJR9BR9BJ9BJ9BJ9BJ9BJ19J19B11911911911911911911911911919B19B1191111111111111111111111))1))1111111111))))))!!1))))))))))1111111111111111111911919911999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99J99J99B99B99JB9BBBBBBB99B91B91B99BBB999919B91B91B91B91J99B999119))9))B91B99B99B99B99B99J99J91J91JB9JB9JB9BBBB99B99JB9JB9JB9BBBBBBBBB9BJ9BJ9BJBBB9BB999999B91B91B9191191199999999999B9BBBBBBBBB99B99B99B99B99B91B91B99B99B99B99911999BBBBBB9119119B99BB9B99B99B9BBBBBBBBB9BB9BBBBBBBB9BJ9BJ9BJ9BJ9BB9BBJJJJJRJJRJJRBJRJJRJJRJJRBJRBJRBJZJRcJRZJRZJRZJRcRZcRZcJZcJRcBRcBRcBJZBJZJRZJRZJJZJJZJRZJRcJZcJZcJRcJRcJZcJZcJRcJJZBJZBJRBJRBJZJRZRRZJJRJJRJJJJJRJRZJRZJRZJJRJJRJJRJJRJJRJJRJJRJRZJRZJRcJRZBJRBJRBJR9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJR9BJ9BB9BJ9BRBRcBRcBJZBJZBJZ9BR9BRBJRBJRBJR9BR9BJ9BB9BJ9BR9BRBJRBJR9BJ9BJJJJBJR9BJ19J19B11999911911911911911911919B19B19B1191191111111111119111111111))1))1111111111))1)))!!))))))111111111111111111919919919999999BBBBBBBBBBBBBBBBBBBBBBBB99B999B99B99B99B99B91B91B91B91J99J99BBBBBBB99B91B99B99999919B91B91J99JB9B99B91B919))9))B91B99B99B99B99B91B91B91B99JB9BBBJB9B99BBBBBBJB9JB9BBBBBBBBBBBB9BB9BJ9BJ9BJ9BB99B9999119119119119119999BB9BB9BB9BBBBBBBBB99B99B99B99B99B91B91B91B99B99B99B99B99BBB9B9911911BBBBBBB99B99B99BBBBBBBBBBBB9BBBBBBBBBBB9BJ9BJBBBBBBBBB9BJBJRJJRJJRJJRJJRRRZRRZJJRBJRBJZJRcJRcJRcJRcJRcJZcJZcJRcJRcJRcJRcJRZJRZJRZJRZJRZJRZJRcJZcJZkJZkJRcJRcJZcJZcJRcJJZJJZJJZJJZJRZJRZJRZJJRJJJJJJJJRBJZJRZJRZJJRJJRJJRJJJJJRJRZJRcJZcJZcJZcJRZBJZBJRBJRJJJ9BJ9BJ9BB9BJBJRBJRBJRBJRJJJ9BJ9BJ9BRBRcBRcBJZ9BRBJZBJZBJRBJRBJR9BR9BJ9BJ9BJJJJBJR9BRBJR9BR9BJ9BJ9BJ9BJ9BB99B19J19B99B99B19B19B19B19B19B19B19B)1919B119)19))11191199999111))1))1))1))1111111111)))!!)!!1))111111111111111919919999999999999BBBBBBBBB9BJ9BJBBBBBBBBB999999B99B99B99B99B919))9))B91J99BBBBBBBBBBBBB99B99B99B99B99B91B91JB9B99B99911B919))9))B91B99BBBB99B99B99B91B91B99BBBBBBBBBBBBBBBBBBBBBBBBJJJJJJ9BJBBB9BB9BB9BJ9BJ9BJ9BB9999199119119119999B99BB9BB9BJ9BJBBBBBBJB9B99B99B99B99B99B91B91B91911911B99B999B9999911B99BBBBBBBBBB99BBBBBBBBBBBBB999B9BBB9BJBBBBBBBBBBBBBBB9BJJJJJJRJJRJJRJJJJJRRRcRRcJJRJJRBJZJRZRRcRRcJRcJRcJZcJZcJZcJRcJRcJRcJRcJRZJRZJRZJRZJRcJZcJZkJZkJZcJRcJRcJZcJZcJRcJRZJJZJJZJRZJRZJRZJJZJJRJJRJJRJJRBJZJRZJJRJJRJJRJJRJJRJRZJRZJZcJZcJZcJRcJRZBJZBJRJJJJJJBJRBJR9BJ9BJBJRBJRBJRBJRBJRJJJ19J19JBJZBJZBJZBJZBJZBJZBJZBJR9BR9BR9BR9BJJJJJJJ9BR9BR9BR9BJ9BJ9BJ9BJ9BJ99B99B19J9BJ99B19B19B19B19B19B19B19B)1919B19B19B119)191191199999111)))))1))1111))1))1))1)))!!)!!1))111111111111111111919BBBBBB999999BBBBBBBBBBBBBBBBBBBBBBBB999999B99B99BBBB99J919))9))B91BBBRRJBBBBBBJJJBBBB99B99BBBJB9B91B91B99B99999919B91B91B91B91B99BBBB99B99B99B99B91B99BBBBBBBBBBBBBBBBBBBBBJJJJJJJJJJJJ9BJBBBBBB9BJ9BJ9BJ9BB99B9999199199199999999BB9BJ9BJ9BJ9BBBBBBBBBBBBBBJB9JB9B99B99B91B91B91B91B99B99999999B99B99BBBBBBB99B99BBBBBBBBBBBB9B99B9BBB9BJ9BB9B99B9BBB9BJBJRJJRJJRJJRJJRJJJJJRJRZJRcJJZJJRJJZJRZJZcJZcJRcJRcJZcJZcRZcRZcJRcJRcJRcJRcJJZJRZJRcJZcJZkJZkJZcJRcJRcJRcRZcRZcJRcJRcJRZJRZJRZJRZJJRJJRJJRJJRJRZJRZJRZJRZJJRJJRJJRJJZJRZJRZJRZJRcJRcJRcJRcJRZJRZBJR9BJ9BJ9BR9BRBJRBJRBJRBJRBJRBJRBJRBJR19J19J9BRBJZBJZBJZBJZBJRBJZBJZ9BR9BR9BR9BRJJJJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BJ19B19B9BJ9BJ19B19B19J19J19B19B19B19B19B19B19B19B19B1191191199111111)))))1111119111))1)))))))))))111111111111111111911999BBBBBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBB99B999B99B99BBBB99J919))9))911BBBRRJRJBBBBJJJBBBB99B99BBBJB9B99B91B99B99999919B99B91B91B91B99BBBB99B99BBBBBBB99B99BBBBBBBBBBBBBBBBBBJJJJJJJJJBJRBJRJJJBBB9BJBJRBJRBJR9BJ9BB99B91991999999B99B9BB9BJ9BJ9BJBBBBBBBBBBBBBBBJB9JB9B99B99B99B91B91B91B99B99911B91B99BBBBBBBBBBBBBBBBBBBBB9BJBBB9BBBBBJJJ9BJ9BB999999BBBJJJJJRJJRJJRJJRJJRJJJBJRJRZJRZJRZJJZJJZJRZJZcJZcJRZJRZJZcRZcRZcRZcJRcJRcJRcJRZJJZJRZJRcJZcJZkJZcJRcJRcJRcJZcRZkRZkJRcJRcJRZJRZJRZJRZJJRJJRRRJJRZJRZJRcJRcJRZJJRJJRJJZJRZJRcJRcJRZJRZJRZJRZJRZJRZJRZJJRJJJ9BJ9BRBJZBJZBJRBJRBJRBJRBJRBJZ9BR9BR9BJ9BJBJRBRcBRcBJZBJRBJZBJZ9BR9BR9BRBJRBJRBJR9BR9BJ9BJ9BJ9BJ9BR9BR9BR19B19B9BJ9BJ19B19B19B19B19B19B19B19B19B11911911919B19B1191191111111))1))111111911111))1))))))111111111111111111111919999999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99B99B99B99B99J99B919))911JB9RJBJJJJJJBBBBBBB99999B99B99B99B99BBBBBBB99B99B99B91B91B91999999B99BBBBBBJJJBBBBBBBBBBBBBBBBBBBBBBBBJJJJJJBJRBJRBJRJJJRJBJJJJJRBJZBJR9BR9BJ99B999999BBB9BJ9BJ9BB9BJ9BBBBBBBBRJBBBBB99B99B99B99B99B91B99B99B919999B99B9B91B99BBBBBBB99B99BBB9BJBBBBBB9BJ9BJ9BJ9BJJJJBBBBBB999999B99BBBJJJJJRJJRJJRJJRBJRBJRJRZRRZJRZJRZJRZJRZRRZRRZJRZJRZRRcRZcJRcJRcJRcJRcJRcJRZJRZJRZJRcJRcJRcJRcJRcJRcJZcJZkRcsRZkJRcJRZJRZJRZJRZJRZJRZRRZRRZRRZJRcJRcJRcJRZJJRJJRJJZJRZJRcJRcJRZJRZJJZJJZJRZJRZJJRBJRBJR9BR9BRBJRBJZBJZJJZJJR9BJJJJBJRBJZ9BR9BR9BRBJRBJZBJZBJZ9BRBJZBJZ9BR9BRBJRBJRBJR9BR9BR9BR9BJ9BJ9BJJJJBJR9BR9BJ99B9BJ9BJ99B19B19B11911911919B19B119119119119)19)1919B19B1111111111))111111911111))1)))11111111111111111111111199999B99999BBBB9BJBBB9BJBBBBBBBBBBBBBBBBBBBBBBBBB99B99B99B99JB9J99B91911B99BBBJJJJJJBBB999999999999999BBBBBBBBBB99B99B99B99B99B91B9199999BB99BBBBBB9BJ9BJ9BJBBBBBBBBBBBB9BJ9BJJJJJJJBJRBJRJJRJJRJJJJJRJJZJJZBJZBJRJJJBBB99BBBB9BJJJJJJJ9BJBBBBBBBBBBBBJB9JB9B99B99B99B99B99B91B99B999119999B9B99B91B99BBBBBBB99B99BBB9BJBBBBBBJJJJJJ9BJ9BJJJJJJJBBB999999BBBBBBJJJJJJJJRJJRJJRBJZBJZJJRRRZJRZJRZJRZJRZRRZRRZJRZJRcRZcRZcJZcJRcJRcJRcJRZJRZJRZJRZJRcJRcJRcJRcJRcJZcJZcRZkRcsRZkJRcJRZJRZJRZJRcJRcRRZRRZRRZJRZJRcJRcJRZJRZJRZJRZJRZJRZJRZJRZJRZJRZJJZJRZJJZJRZJJRJJRBJRBJRBJRBJZBJZBJZJRZJJR9BJ9BJBJRBJZBJZ9BR9BRBJZBJZBJZBJZ9BRBJZBJZBJZBJRBJRBJR9BR9BRBJZ9BR9BR9BJ9BJJJJBJR9BR9BJ9BJ9BJ99B99B99B11911911911919B119119119119119)19)1919B19B91911111111111111111111111111111111111111111191191191999B9BBBBBBBBBBB9BJJJJJJJ9BJ9BJBBBBBBBBBBBBBBBBBBB99B91B99B99BBBJB9J99B91B99B99JJJJJJBBBB99999999B99B99BBBBBB999911B99B999B99B9B91B99BBBBBBB999B9B99BBB9BJ9BJBBBBBB9BJ9BJ9BJJJJJJJJJJJJJBJRJJRJJRRRJRRZJRZJJZJJRBJRJJRJJJBBBBBB9BJJJJJJRJJJ9BJBBBBBBJB9J91J91B99B99B99B99B99B99B91B91911999B99B99B99B99BBBBBB999999BBBBBBB99BBBJJJJJJBBBBBBJJJJJJ9BJ9BB9BB9BJJJJJJJJJJJJRJRZJRZBJZJRZJJRJJRBJZBJZJRZJJRJRZJRZJRcJZcRZcRZkRZkJZcJRcJRZBJZBJZJRZJRZJRcRRcRZcJZcJZcJZcRZcRZkJZkJZkJRcJRcJRcJRcJZcRZcRRZRRZJRZJRZBJZBJZJRZJRZJRcJRcJRcJRZJRZJRZJRZJRZRRZJRZBJRBJRJJZJJRBJRBJRJJRJRZJRcBJZBJZBJRBJRBJRBJZBJZBJZBJZBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJRBJR9BR9BR9BJ9BJ9BR9BR9BR9BJ19B19B9BB9BB19B11919B11911911911911911919B)19)1911911991991911111111111111111111111111111111111191991991999B9BBBBBBBBBBBBBBBBBJJJJJJ9BJBBBBBBBBBBBBBBB9BJBBBBBBB99B99B99BBBBBBJB9J99B99B99BBBJJJBBBBBB999999B99B99BBBBBB999999B99B999BB9BBB99B99BBBBBB9BB9B99B99BB9BJ9BJ9BJBBB9BJ9BJJJJJJJJJJJJJJJJJJRJJRRRZRZcRZcJRcJRZJRZJJRJJRJJR9BJ9BJ9BJBJRJJRJJR9BJBBBBBBJ99J91B91B99BBBB99B99B99B99B91B91911B91B99B99B99B99BBBBBB911911BBBBBBB99BBBJJJJJJBBB9BBJJJBJRJJJJJJJJJJJJJJJJJJJJRJRZJRZJRcJRcJRZJJRJJRBJZJRZJRZJRZJRZJRcJZcRZkRZkRZkRZkRZkJRcJRZBJZBJZJRZJRcRRcRZcRZcRZcJZcRZkRZkRZkRZkJZkJRcJRcJZcJZcJZcJZcRZcRRZJRcJRcBJZBJZJRZJRcJZkJZkJZkJRcJRZJJRJRZJRZRRZRRZJJZBJZJJZJJZJJRBJRJJRJRZJRcJRcBJZBJRBJRBJZBJZBJZBJZBJZBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJRBJRBJR9BR9BJ9BJ9BR9BR9BR9BJ19B19B9BB9BB19B19B19B19B11911911911911919B)19)1911911999911911911911911911911111111111111911911911999B99B99B99BBBBBBBBBBBBBBBB9BJ9BJBBBBBBBBBBBBBBBBBB9BJ9BJBBBBBBB99B99BBBBBBJB9J99B99B99BBBJJJ9BJ9BB999999B99BBBBBBBBBBBBB99BBBBBBBBBBBBBBBB99B99B99B99BBBBBBBBBJJJJJJJJJ9BJ9BJ9BJJJJJJJJJRJJRJJRJJRRRJRRZRZcRZkRZcRZcRZcJRZJJRJJJ9BJ9BJBJRBJRJJRJJR9BJBBBJB9JB9B91B91B99BBBBBBB99B99B99B99B91B91B91J99J99B919999B99B9911911999BBBBBBJJJJJJJJJ9BJBBBJJJJJRJJRJJRJJRJJJJJJJJJJJZJRZJRZJRcRRcJRZJJZJJZJRcJZcRRcJRZJRZJRcRZkRcsRZkRZkRZkRZkJZcJRcJJZJJZJRcRZcRZcRZcRZkRZkRZkRZkRZkRcsRZkRZkJZcJZcRZcRZcJRcBRcJZcRZcJZcJRcJRcJRcJRcJZkRZkRcsRcsJZkJRcJRZJJZJRZRRZRRcRRcJRcJJZJJZJRZJJZBJRBJZBRcBJZBJRBJRBJZBJZBJRBJRBJRBJR9BR9BRBJZBRcBJZBJZBJZ9BR9BR9BRBJZBJZBJRBJR9BR9BRBJRBJR9BJ9BJ9BR9BR9BR9BJ19B19B9BB9BB9BJ19J19J19B19B)1919B)19119119)19)1911911911911911911911919B11911911111111911911911911919B9BJ9BJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9BJ9BJ9BJ9BJBBBB99B99B99JB9J99B99B99B99BBBJJJJJJ9BJBBB999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99B99B99BBBBBB9BJ9BJJJJJJJJJJ9BJ9BJJJJBJRJJRJJRJJRJJRJRZRRZRRcRZcRZcRZcRZkRZcJRZJJRJJRBJRBJZBJZJJRJJJ9BJBBBJB9JB9B91B91B99B99B99B99B99B99B99B91B91B91J99J99B919999B99B9999999999BBBJJJJJJJJJJJJ9BJJJJJJRJJRJJRJJRJJRJJJJJJJJRJJZJRZJRZJRZRRcRRcJRZJRcJZcRZcRZcRRcJZcJZkRcsZcsRcsRZkRZkRZkRZkJRcJJZJJZJRcRZcJZcJZcRZkRZkRZkRZkRcsRcsZcsRZkJZcJZcRZcRZkJRcBRcJZcJZcJZcJZcJRcJRcJZkJZkRcsRcsRcsRZkJRcJRZJJZJJZJRcRZcRZkRZcJRZJJZJRZBJZBJZBJRBJZBJZBJRBJZJRcJRcBJZBJRBJRBJR9BJ9BRBJZBRcBRcBJZBJZ9BR9BRBJZBJZBJZBJZBJR9BJ9BJBJRBJR9BJ9BJ9BR9BR9BJ19J19B19B99B9BB19J19J19J19J19B19B19B19B11911919B)1911911919B19B19B19B19B19B19B11911911911911911911999B99B99B99BBBBBBBBBB9BBBBBBBBBBBBBB9BJ9BJBBBBBBBBB9BJ9BJBBB9BJBBBB99B91B91B91B91B91J99JB9JJJJJJJJJ9BJBBBB99B99B99B99JB9BBBBBBBBBBBBB99B99BBBJJJBBBBBBB99BBBBBBBBBBBB9BJJJJJJJJJJJJJBJRBJRBJRJJJJJRJJRJRZJRZJRZJRZRRZRZcRZcRZcRZcJRcJRcJRcJRZJJZJJRJJJJJJBBBJB9J99B91B91B91B91B91B91B99B99B99B91B91B91B99JB9B99B999B99B9B99B99BBBBBB9BJJJRJJRJJRJJJBJRJJZJRZJJRJRJJRJJRJJJRJJRJJRJJRJRZRRZRRcRRcRZcRZkRZkRZkRZcRZcRZkRcsZcsZc{RcsRcsRcsRcsRZkJZcJRZJRZJRcJRcJRcJZcJZcJZcRZcRZkRcsZk{ZcsRZkJZcJRcRZkZcsRZkJZkJZkJZcJRcJRcJZcJZkJZkJZkJZkRcsRcsRZkJZcJRZJRZJRZJRcJZkRZkJZcJRZJJZJRZBJZBJZBJZJJRJJRJJZJRZJZcJZcBJZBJZBJR9BJ9BJBJRBJZBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ19J19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B11911911911911911999B99B99B99B99BBBB9BB9BBBBBBBBBBBBBB9BJ9BJ9BJ9BJ9BJJJJBBBBBBBBBBBBB99B91B91B91B91B91B99JB9BBBJJJJJJBBBBBBB99B99B99J99JB9JB9BBBBBBBBBB99B99BBBJJJJJJRJBB99B99BBB9BJBBBBBBJJJJJJJJJBJRBJRBJZBJRJJJJJRJJRJRZJRZJJRJJJJJRRRZRZcRZkRZkRZkRZkJZcJRcJRZJJRJJJJJJRJBBBBJB9B99B91B99B919))B91B99B99B99B91B91B91B99B99B99B99B999B9B99B99BBB9BJJJJJJRJJRJJRJJJBJRJRZJRZJJRJRJJRJJJRJJRJJRJJRJJRRRZRRZRRcRZcRZkRZkRZkRZkRZkRZkRcsZcsZk{Zc{RcsRcsRcsRZkRZkRZcJRcJRcJRcJRcJRcJRcJZcRZkRZkRcsZk{Zk{ZcsRZkJZcJZcZcsZcsRcsRcsRZkJZcJRcJRcJZkRZkJZkJZkJZkRcsRZkRZkJZcJRcJRcJRcJZcRZkJZkJRcJRZJJZBJZBRcBRcJRZJJRJJRJRZJRcJZcJZcJRcBJZBJR9BJ9BJ9BJBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJRBJR9BR9BR9BJ9BJ19B19J19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B11911911911911911911999B99B99B99B99BBBBBBB9BB9BBBBB9BJ9BJ9BJ9BJ9BJJJJJJJ9BJBBBBBBBBBB99B91B91B91B91B91B99B99B99B99BBBBBBBBB999999B99J99J99B99B99BBBBBBBBBBBBBBBRJBRJBBBBB99B999BJJJJ9BB9BBJJJJJJJJJBJRBJZBJZJJRJJJJJJJJRJRZJJZJJJJJJJRJJJRJZcRZkRZkRZkRZkRZcRZcJRZJJRJJJRJBRJBBBBBBBJB9JB9B99B999))J91JB9B99B99B91B99B99B99B99BBBB99B99B999B99BB9BBBBBJJJJJJJJRJJRJJJJJJJJRJRZJJRJJRJJRJJRJJRJJRJRZJRZRRcRZcRZcRZcRZkRZkRcsRcsRZkRZkRcsRcsZk{Zk{ZcsRcsRZkRZkRZcRZcJZcJZcRZcJZcJRcJRcJZkRcsRcsZcsZc{ZcsRcsJZkJRcRZkZcsZcsRcsRcsRZkRZkJZcJZkRZkRZkJZkJZkRcsRcsRZkRZkRZkJZcJZcRZcRZcRZcRZkJRcJRZJRZJRcJRcJRcJRcJRZJRZJRZJRZJRcJRcBRcBRcBJZBJRBJRBJRBJRBJRBJZ9BR9BR9BRBJRBJZBJZBJZBJZ9BR9BRBJRJJJBJRBJR9BR9BJ9BJ19B19B19J19J19J9BJ9BJ9BJ19J19B19B19B)19)1919B19B119119)19)1919B19B19B19B19J19J19B19B11911911911911911911911999B99B99B99BBBBBBBBBB9BB9BJ9BJ9BJ9BJ9BJJJJJJRJJR9BJBBBBBBB99B99B91B91B91B91B99B99B99B91B99BBBBBB99B999B99B99J99J99B99B99BBB9BJ9BJBBBBBBBBBBBBB99B99B99JJJJJJ9BJ9BB9BJJJJJJJBJRBJZBJZJJRJJJJJRJJRJRZJRZJJRJJJJRJJJRJZcJZcRZcRZcRZcRZcRZcRRZJRZJJRJJJRJBBBBBBBB99B99B99J99J91J91J99B99B91999B99B99B99B99999999911B91B99BBBBBB9BJJJJJJJJJRJJRRJBJJJJJRJJRJRZJRZJRZJJRJJRJJRJRZJRcJRcRRcRZcRZcRZkRZkRcsRZkRZkRZkRZkRcsZcsZcsZcsRZkRZkRZcRZcRZcJZcJZcRZcRZcJRcJZcJZkRcsRcsRcsZc{Rc{RZkJZkJZkRZkZcsZcsRcsRcsZcsRZkRZkRZkRZkRZkRcsRcsZcsZcsRZkRZkRZkRZkJZcJZcRZcRZcRZcJZcJRcJRcJRcJZcJRcJRcJRcJRcJRZJRZBJZBJZBRcBRcBRcBJZBJRBJRBJRBJR9BR9BR9BRBJRBJRBJRBJZBJZ9BR9BR9BR9BRJJJJJJ9BJ9BJ9BJ99B19B19B19J9BJ9BJ9BJ9BJ9BJ19J19B19B19B19B)1919B19B119119)19)1919B19B19B19B19B19B19B19B11911911911911911911911999B99B99BBBBBBBBBBBBBBBB9BJJJJ9BJ9BJ9BJJJJJJRJJR9BJBBBJ99J99B99B919))911B99BBBB99B91B91B999BJ9BJ99B999B99JB9J91J91J91B99BBBBBB9BJJJJJJJBBBBBBBBB9999B99BJ9BJ9BJ9BJ9BJJJJBJRBJZBJZBJZJJJJJJBJRJRZJRZRRZRRJRRJRRJRRZRRZRRZJRZJRZRZcRZcRZcRRZJRZJJZJJRJJJBBBB99B99B99B99J99JB9J91J91B91B91999B99B91B91B91B91B919))911B99RJBBBBJJJJJJJJRJJRJJRJJJJJJJJJJJRJJZJJZJJZJJZJJRJJRJRZJRZJRZRRZRRcRZcRZkRZkJZkJZcRZcRZcRZkRcsRZkRZkRZkRZkJZcJZcRZcRZcJZcJZcJZkJZkJZcJZkJZkJZkJZkRcsRc{Rc{RcsRZkJZkRcsRcsZcsRcsRcsZcsRcsRcsRcsRZkRZkRZkRZkRcsRZkRZkRZkZcsRZkJZcJRZJRZJRcRZcRZcJRcJRcJZcJZcJRcJRcJRcJRcJRZJRZBJZBJZJRcJRcJZcJRcBJZBJRBJRBJRBJRBJRBJRBJRBJRBJR9BRBJZ9BR9BR9BR9BR9BR9BJ9BJ99B9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ99B19B19B19J19J19B19B19B19B19B19B)19)1919B19B19B19B19B19B19B19B19B11911911911911911999B99B99BBBBBBBBBBBBBBBBBBB9BJ9BJ9BJ9BJJJJJJJJJRJJR9BJBBBJ99J91B919119))911B99BBBB99B99B99BBB9BJ9BJ99BB99J99J99J91J91J91J99BBB9BJJJJJJJJJJ9BJ9BJBBBBBBBBBBBB9BJ9BJJJJ9BJ9BJBJRBJZBJZJRZJJRJJRJRZJRZRRZRRZRRZRRZRRZRRZRRZRRZJJRJRZRZcRZcRZcRZcJRcJRZJRZJJRBBBB999BBBBBB99JB9JB9JB9J91B91B91911B91B91B91B91B919119))911B99RJBJJJJJJJJRJJRJJRJJRJJJJJJJJJJJRJJRJJZJJZJJRJJRJJRJRZJRZJJRJRZRRZRRcRZkRZkJZcJZcRRZRRZRZkRZkRZcRZcRZcRZkJZcJZcRZcRZcRZcJZkJZkJZkJZkJZkJZkJZkJZkJZkRc{Zk{RcsRZkJZkJZkRZkRZkRcsZcsZcsZcsRcsRcsRZkRZkZcsZcsRZkRZkRZkRZkZcsRZkJRcJJZJJZJRcRZcRZcJRcJRcJZcJZcJZcJRcJRcJRcJRZJRZBJZBJZJRcJZcRZkJZcBRcBJZBJZBJRBJRBJRBJR9BJ9BJBJR9BR9BR9BR9BR9BJ9BJ9BR9BJ99B99B9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ19J19B19B19J19J19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B19B19B11911911911911999B99B99B99B9BB9BB9BB9BB9BB9BB9BJ9BJ9BJJJJ9BJ9BJJJJJJJ9BJBBBB99B91B91911111911B99JB9BBBBBBBBBJJJ9BJBBBB99B91J91J91J99JB9J99J99BBBJJJJJJJJJBBBBBB9BJJJJRJBBBBBBB9BJJJJJJJJJJJJJBJRBJZJRZRZcRZcRZcRRZRRZRRcRRcRRcRRcRRcRRZRRZRRZJRZJRZJRZRZcRZcRZcRRZJRZJRZJJRJJJBBBBBBBBBBBBJB9B99B91B91B91B91B91B91B91B99B99B919119999B99B9BBBRJBJJJJJRJRZJJRJJJJJJJJJJJJJJRJJRJJRJJRJJRJJRJJRJJRRRJJRZJRZRRZRRZRZcRZkRZcRZcJRcJRZJRcJRcRZcRZcRZcRZcRZcRZcJZcJZcRZcRZkRZkRcsRcsRcsRcsRcsJZkRZkRc{Zc{RcsRcsJZkJZkRcsZcsZcsZcsRcsRcsZcsZcsRZkRZkZcsZcsRZkRZcJZcJZkRZkRZkRRZJRZJRZRRcRZcRZcJRcJRcJZcJZcJZcJZcJRcJRcJRZJRZBJZBJZJRcJZcRZkJZkBRcBJZBJZBJZBJZBJR9BJ9BB9BJ9BJBJRBJR9BR9BR9BR9BJ9BR9BJ9BB9BB9BJ9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B11911911911999B99B99B99B9BB9BJ9BJ9BB9BB9BB9BJ9BJ9BJJJJ9BJ9BJ9BJJJJ9BJBBBB99B99911911911B99J99JB9BBB9BJ9BJBBBBBBB99B99B99B91J91JB9BBBJ99J99BBBJJJJJJJJJBBB9BJJJJJJJJJJBBBBBB9BJ9BJJJJJJJJJJBJRBJZJRZRZcRZkRZkRRZRRZRRZRRcRRcRRcRRcRZcRZcRZcJRZJRZJRZRRZRZcRZcRZcRRZJRcJRZJJRJJJJJJJJJJJJBBBB99B91B99B919))9))B91B99B99B99B999999B99B99B9B99BBBJJJJJRJJRJJRJJJJJJJJJJJJJJRJJRJRZJRZJJRJJRJJRRRJRRJJRZJRZRRZRRZJRcJZcRZcRZcJRZJRZJJZJRZRZcRZkRZcRZcRZcRZcJZcJZcJZcRZcRZkRcsRcsRcsRcsRcsRZkRZkZc{Zc{RcsRZkJZkRZkRZkZcsZcsZcsRcsRcsZcsZcsRZkRZkZcsRZkRZcRZcJZcJZkRZkRZcRRZRRZRRcRRcRZcJZcJRcJRcJZcRZcRZcJZcJRcJRcJRcJRZBJZBRcJRcJZcJZkJZkBRcBRcBRcBJZBJZBJR9BJ9BB9BJ9BJBJRBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B99B99911911999B99B99B9BB9BJ9BJ9BJ9BJBBBBBB9BJ9BJBBBBBBBBBBBBBBB9BJBBBBBBBBBB99999B99B99J99JB9BBBBBBBBBBBBB99999999BBBBBBB91B99BBBBBBB99B99JB9BBBJJJJJJ9BJJJJRRJJRJJJJBBBBBB9BJ9BJ9BJ9BJ9BJBJRBJZBJRBJZJRcJZcRRZRRZJRZJRZRRZRZcRZcRZcRZcRZcJRcJRZJRZRRZRZcRZcRZcRZcJRcJRZJRZJJRJJRJJJJJJBBBB99B99B99J99J91J91J99B99B99B99B99B99B99B99B99BBBRJBJJJRJBJJJJJJJJRJJRJJRJJJJJJJRZJRcJRcJRZJJRJJRRRJRRZJRZJRZRRZRRZJRZJRcRRcRZcRRZJRZJJRJRZRZcRZkRZcRZcRZcJZcJZcJZcJRcJRcRZcRZkRZkRcsJZkRcsRZkRcsZk{Rc{RcsRZcRZcRZcRZkZcsRcsRcsRZkRZkRcsRcsRcsRZkRZkRZcRRcRZcRZkRZkRZkRZcRZcRZcRZcRRcJRcJRcRZcRZcRZcRZcRZcRZcJRcJRcJRcJRcJRcJRcJZcJZcJRcBRcBRcBJZBJZBJZBJZBJR9BRBJRJJJJJJBJRBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19B99B99B99919B99B99B99B9BBBBB9BJ9BJ9BJBBBBBB9BJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99B99J99JB9RJBJJJ9BJBBB99B999999BBBBBBBBBB99BBBJJJJJJB99B99J99JB9BBBJJJJJJJJJRRJJJJBBBBBBBBBBBBBBBBBB9BJJJJBJRBJRBJRBJZBJZJZcRRZRRZJJZJRZRRZRZcRZcRZcRZkJZcJRcJRZRRZRZcRZcRZkRZkRZkJZcJRcJRcJRZJJRRRJJJJJJJBBBB99BBBJB9J91J91J99B99B99B99B99B99B99B99B99B99BBBRJBBBBBBBBBBJJJJJRJJRJJJJJJJJRJRZJRZJRZJJRJJRRRZRRZJRZJRZRRZRRZJRZJRZJRcRRcRRZRRZJRZJRZJRcRZcRZcRZcJZcJZcJZcJZcJRcJZcRZkRcsRcsRcsJZkJZkRZkRcsRc{Rc{RcsRZkRZkRZkRZkRZkRcsRcsRZkRZkRcsRcsRcsRZkRZkRZcRRcRZcRZkRZkRZcRZcRZkRZkRZkJRcJRZJRZJRcRZcRRcRRcRZcRZcJZcJRcJRcJRcJRcJZcJZcJZcJRcBRcJRZBJZBRcBJZBJZBJRBJZBJRBJRJJJBJR9BJ9BJ9BJ9BJ9BB9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B11911919B19B19B19J19J19J19B19B19B19B99B99B9BJ9BJ99B99BBBBBBBBBBBBB9BB9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJB9J99JB9JJJJJRJJJ9BJBBB9BBBBBBBBBBBBBBBBBJJJRRJBBBB99B91J99J99J99JB9BBBBBBRJBRJBBBBB99B99B99B91B999BJBJRJJRJJRBJZJRZJRZRZcRZcRZcJRZJRZRZcRZcRZcRZcJZcJZcJRZRRZRZcRZcRZkRZkZcsRcsRZkJZcJZcJRZRRJRJBRRJJJJBBBBBBBBBJB9JB9J91B91B99B99B99B99B99B99BBBB99B99B99BBBBBBBBBBBBBBBJRJJJRJJJRJBJJJJJJJJJJJJJJRJJRRRZRRZJJRJJRRRJRRZRRZJRZJRZJRZJRZJRZJZcJZcJRcJRcRZcRZcJZcJZcJZcJZcJZkRcsRc{Rc{Rc{Rc{RcsJZkRZkRcsRc{Zk{ZcsZcsZcsRZkRZkRZkRcsRcsRcsRcsZcsZcsRZkRZkRZkRZkRZcRZcRZkRZkRZcRZcZcsZcsRZkJRcJRcJRZJRcJRZJRZJRZJZcJZcJZcJRcBJZBRcJZcJZcJRcJRcJZcJZcJRcJRcBRcBJZBJZBJZBJZJJZBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J99B99B19J19J19J19B19B19B19J19J19B19B19B19B11911919B19B19B19J19J19B19B19B19B19B99B99B99B9BJ99B99BBBBBBBBBBBBB9BB9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJB9BBBJJRJJRJJJJJJJJJ9BJBBBBBBBBBBBBJJJJJJRRJRJBB99B91B99J99J91JB9BBBBBBBBBB99B99B99B91B91B91B99BBBBJRJJRJJRJRZJRcRZcRZcRZkRZcJRZJRZJZcRZkRZcRZcJZcRZcRZcRZcRZcRZkRZkZcsZk{Zk{RcsRZkRZkRZcRRJRRJRRJJJR9BJBBBBBBJB9JB9J91B91B99BBBBBBB99B99BBBRJBBBBB99B99B99BBBBBB999B99JJJJRJJJJRJBJJJJJJJJJJJJJJJJJRJRZRRZJJRJJRRRZRRZRRZRRZJRZJRZJRZJRcJZcJZcJRZJRZRZcRZcJZcJZkJZkRZkRZkRcsRc{Zk{Zk{Rc{RcsRcsRcsRcsRc{Zk{Zk{ZcsZcsRcsRZkRZkRcsRcsRcsRcsZcsZcsRZkRZkRZkRZkRZkRZkRZkRZkRRcRRcRZkZcsRZkRRcJRcJRZJRZJRZJJRJRZJZcJZkJZkJZcJRcBJZJZcJRcBRcBRcJRcJZcJRcBRcBRcBRcBJZBJZJJZJJRBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB99B9BJ9BJ9BJ9BJ19J19J19J19J99B99B99B19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19B19B11919B19B99B99BBBBBBB9BJ9BJBBBBBB99B99B999999BBBBBBBBBBBBBBBBBBB99B99BBBBBBJB9BBBJJJJJJJJJJJJJJRJJJBBBB99BBBBBBJJJJJJRRJRJBB99B91B99B99B99B99RJBRJBB99B99B99B91911911B91B99BBB9BJJJRJRZJRcRZkRZkZcsRZkRZcRRZJRZJZcJZcRZkRZkRZcRZcRZkRZkRZkRcsZcsZk{cs„cs„Zk{ZcsZcsZcsRZcRRZRRZRRJJJJBBBBBBJB9J91J91B91B99RJBBBBB99B99BBBRJBBBBBBBBBBBBBBBBB999B9B99BBBRJBJJJJJJJJJJJJJJJJJJJJRJJRJRZJRZJRZRRZRZcRZcRZcRZcJRZJRZJRcRZcRRZRRZRRZRRZRZcRZcJZkJZkRZkRZkRZkRcsZc{Zk{Rc{Rc{Rc{Rc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsRcsRZkRZkRcsRcsZcsZcsRcsRcsRZkRZkRZkRZkJZkRcsRZkRZkRZcRRZRZcRZkRZcRRcRRZJRZJRZJRZJJRJRZRZcRZkJZkJZcJRcJRcJRcJRZBJZBJZBRcJRcJRcBRcBRcBJZBJZBJRJJRJJRBJRBJRBJRBJRBJR9BR9BR9BJ9BB9BB99B99B9BJ9BJ99B99B9BJ9BJ99B99B99911919B19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19B19B11911911999B99BBBBBBB9BJ9BJBBB99B99B99B999B99BBBBBBBBBBBBBBBJB9B99B99B99BBBJB9JB9BBBJJJJJJJJJJJRJJJBBBBBB99BBBB9BJJJJJJJBBBB99B91B99B99B99B99RJBRJBB99B99B91B91911911B91B99B999BJJJRJRZJRcRZkZcsZcsRZkRZcRZcRZcRZcRZkRZkRZkRZcRZcRZkRcsRcsRcsZk{Zk{cs„cs„Zk{Zk{Zk{ZcsRZkRZcRRZRRJJJJBBBBBBB99J91B91B99BBBRJBRJBB99B99BBBRJBRJBBBBBBBBBBB99B999B9B99B99BBBJRJJJRJJJJJJJJJJJJJJJJJRJRZJRZRRZRRZRZcRZkRZkRZcJRcJRcRZcRZcRRZRRZRRZRZcRZcRZcJZkJZkRcsRZkRZkRZkRcsZc{Rc{Rc{Zc{Zc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsZcsZcsRZkRcsRcsZcsZcsRcsRcsRcsRZkRZkRZkJZkRcsRcsRZkRZcRRZRZcRZcRRcRRcRZcRZcJRZJRZJRZJRZRZcRZkJZcJZcJRcJRcJRZBJZBJZBJZBJZBRcBRcBRcBRcBRcBJZBJRBJRJJRBJRBJZBJZBJR9BR9BR9BR9BJ9BJ9BB99B9BB9BJ9BJ99B99B9BJ9BJ99B11911911911919B19B19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99991999999B9BBBBBBBB9BB9BB9BB9BB99B99B99BBBBBBBBBBB99B99B99B99BBBBBBB99B99B91B99JB9BBBJJJJJJJJJ9BJBBB9BB9BJ9BJBBBBBBB99B99B99B99B99B99B99BBBBBBBBBJB9B99B99B91999999B99B99BBBRJBJJJJJRJZcRZkZcsZcsZcsZcsZcsZcsRZkRZkRZkRZkRZcRZcRZkRcsRcsRcsZc{Zk{Zk{Zk{Zk{Zk{Zk{ZcsRcsRZcRRZJJRJJJBBBBBBJB9B99B99BBBBBBRJBRJBB99B99BBBJJJJJJJJJJJJBBBBBB9B99B99B9B99BBBJJJJRJJJJJJJJJJJJJJJJJJRJRZRRZRRJRRJRZcRZkRZkRZkRZcRRcRZcRZcRRcRRZRRZRRcRZcRZcRZkRZkJZkJZcJZkJZkJZkRcsRc{Rc{Zc{Zc{ZcsZcsZcsZcsZcsZk{ZcsZcsZcsZcsRcsRcsZcsZcsZk{Zk{ZcsZcsRZkRZkRcsRcsZcsZcsRZcRZcRZcRZcJRcJRZJZcRZcRRZJRZJRZJRZRZcRZcJZcJRcJRZJRZBRcBRcBRcBJZBJZBJZJRcJRcBRcBRcBJZBJZBJZBJZJJZJJZBJZBJZBJR9BR9BJ9BJ9BJ9BJ9BB9BB9BJ9BR19J19J9BJ99B19B11919B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99B99999999B9BBBBBBBB9BB9BB9BB9BB9BB9BBBBBBBBBBBB99B99B99B99B99BBBBBBB99B91B91B99JB9BBBJJJ9BJ9BJBBB9BB9BJ9BR9BJBBBB99B99B99B99B99B99B99BBBBBBBBBBBBB99B99B99B9999BBBBBBBBBBJB9RJBJRJRRJRZcRZkRZkZcsZcsZcsZcsZcsRZkRZkRZkRZkRZcRZkRZkRcsZcsZcsRcsRc{Zc{Zc{Zk{Zk{Zk{ZcsRcsRZcJRZJJRJJJJJJBBBBBBBBBBBBBBBBBBRJBRJBBBBBBBJJJJJJJJJJJJJJJJJJBBB9B9B99B99B99BBBJJJJJRJJJJJJJJJJJJJRJJJRRRZRRZRRJRRJRRcRZkRZkRZkRZcRRcRZcRZcRRcRRcRRcRZcRZcRZcRZkRZkRZkJZcJZkJZkJZkRcsRc{Zk{Zk{Zc{ZcsZcsZcsZcsZcsZcsZk{ZcsZcsRcsRcsRcsZcsZcsZk{Zk{ZcsZcsRZcRZkRZkZcsZcsZcsRZkRZcRZkRZcJRZJRZJZcRZcRZcRRZJRZJRcRRcRZcJZcJRcJRZJRZBRcBRcBRcBRcBJZBJZJRcJRcBRcBRcBJZBJZBJZBJZJJZJJZBJZBJRBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR19J9BJ9BJ19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B11911919B19B19J19J19B19B19B11911999B99B9BB99B99BBBBBBB9BJ9BJBBBBBBBBB9BJBBBBBB99B999B99B99JB9BBBB99B99B99B91B91JB9BBBBBBBBBBBBBBBBBBBBB9BJ9BRBJRBBBJB9B99B99911999B99BBBBBBBBBBBBBBBB99B99BBBBBB9BJ9BJJJJBBBJB9JB9RRJRRZRZcRZkRZkRZkRZkZcsZcsRZkRZkJZkRZkRZkRZkRZkRZkZcsZcsZcsRcsJZkRc{Rc{Rc{Rc{Zk{ZcsRZkJZcJRZJJRJJJJJJBBBBBBBBBBBBRJBRJBBBBBBBBBBRJBJRJJRJJJRJJRJJRJRJRJBBBBBBBB99B99BBBRRJRRJJRJJRJJRJJJRJRZJRZJRZJRZJRZJRZRRcRZcRZcRZcRZcRZcRZcRZcRRcRRcZZcRZkRZcRZcRZkRZkRZkRZkRZkRZkRcsRc{Zk{Zk{Zk{Zk{Zc{ZcsZcsZcsZcsZcsZk{Zc{RcsRcsRcsRZkZcsZcsZcsZcsZcsRZcRZcRZkZcsZcsZcsZcsZcsRZkRZkRZcRRZRRZRZcRZcRZcRZcJRZJRZRRcRZkRZkJZkJZcJRcJRcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJRBJR9BJ9BJJJJ9BJ9BJ9BJ9BJ9BR9BR9BR9BJ19J9BJ19J19J19J99B19B19B19B19B19B19B19B19B19B19B19B19B19B11911919B19B19J19J19B19B11911911919B9BB9BB99B99B99BBBB9BJ9BJBBBBBB9BJ9BJBBBB99999999B99B99BBBJB9B99B91B91B91B99JB9JB9BBBB99B99B99BBB9BJJJJBJR9BJJJJBBBB99911911999BBBBBBBBB9BJBBBBBBB99B99BBB9BJ9BJ9BJ9BJBBBJ91JB9RRJRZcRZcRZcRRcRZcRZkRZkRZcRZcJZkJZkRZkRZkRZkRZkZcsZcsck{Zk{RcsRc{Rc{Zk{Rc{Zk{Zk{ZcsRZkJRZJJRJJJJJJRJBBBBBBBBBBRJBRJBRJBBBBBBBRJBJJJJRJJRJJJRJJRJRJJRJJJJRJBRJBRJBBBBBBBJJJRRJJRJJRJJRJJJRJRZJRZJRZJJRJRZJRZRRZRZcRZcRZkRZcRZcRZcRZcRRcRZcZZcRZkRZcRZkRZkRcsRcsRcsRZkRZkRcsZk{Zk{Zk{Zk{Zk{Zc{Zk{Zk{ZcsZcsZcsZcsZc{RcsRcsRZkRZkZcsZcsZcsZcsRZkRZcRZcRZkZcsZcsZcsZcsZcsZcsRZkRZcRZcRZcRZcRZcRZkRZcJRcJRZRRcRZkRZkRZkJZkJZcJZcJRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJRBJR9BR9BJJJJJJJ9BJ9BJ9BJ9BJ9BR9BR9BJ19J9BJ9BJ19J19B99B19B19B19B19B19B19B19B19B19B19B19B19B19B11911919B19B19B19B19B19B11911911919B99B99B99999999B99BBBBBBBBBB9BJJJJ9BJB99911B91B99BBBBBBB99B99B99B99B91B91B99B99B99B99B99B99B99BBB9BJBJR9BJ9BJ9BJBBBB99911999999BBBBBB9BB9BJBBBBBBB999999B99BB9BB9BJBBBJB9JB9BBBRRJRRZRZcRZkRRcRZcRZcRZcRZcRZkRZkRZkRZkRZkRZkRcsZcsZk{Zk{Zk{cs„cs„c{Œcs„Zk{Zk{Zk{ZcsRZkJRZJJJRJBBBBRJBRJBBBBRJBJJJJJJRJBRJBRJBJRJJJJJJJJJJJJRJJRJJJJJJJJJJJJJRJJJJRJBRJBJJJJJJJJJJJJJJJJJJRRZRRZJRZJJRJJRJJRRRZRZcRZkRZkRZkRZcRZcRZcRZcRZcRRcRZcRZcRZkRZkRZkRcsRcsRZkRZkZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{ck{ck{ZcsZcsZcsZcsZcsZcsRZkRZkZcsZk{ZcsZcsRZcRZcRZcRZkRZkZcsZcsZcsZcsZcsRZkRZcRZcRRcJZcJZcRZcRZcRRcRRcRZcRZcRZcJZkJZkJZkJZkJRcBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZBRcBJZBJZBJR9BR9BRBJRBJRBJRBJRBJRBJR9BR9BR9BR9BR9BR9BR9BJ9BJ19J19J19B19B19B19B19J19J19J19B19B19B19B19B19B19B19B19B11911919B19B19B19B19B19B11911919B19B19B99B99999999B99B99BBBB99B9BB9BJBBB999911B99BBBBBBBBBB99B99B99B99B91B91B99B99B99B99B99B99BBB9BJBJRBJR9BJ9BJ9BJBBB999911999BBBBBBBBBBBB9BBBBBBBB9999999999B99BBBBBB99B99J99BBBRRJRRZRZcRZcRZcRZcRZcRZkRZkRZkRZkRZkRZkZcsZcsZk{Zk{Zk{Zk{Zk{cs„c{Œc{ŒZk{Zk{ZcsZk{Zc{RZkRRZJJJBBBBBBRJBRJBRJBRJBJJJJJJJJJRJBJJJJRJJJRJJJJJJJJRJJJJJJRJBBBBJJJJJJJRJJJJRJBJJJJJJJJJJJJJJJJJJRRJRRZRRJJJRJJRJJRJJRRRZRZkRZkRZcRZcRZcRZcRZcRZcRRcRZcRZkRZkRZkRcsRcsRcsRcsZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{ck{ck{ZcsZcsZcsZcsZcsZcsZcsZcsZk{Zk{ZcsZcsRZkRZcRZcRZkRZkZcsZcsZcsZcsRZkRZkRZcRZcRZcJZcRZcRZkRZcRZcRZcRZcRZcJZcJZcJZcJZkJZkJRcBJZBJZBJZBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZ9BRBJRBJRBJRBJR9BR9BR9BRBJR9BR9BR9BR9BR9BJ9BJ19J19J19B19B19B19B19J19J19J19J19B19B19B19B19B19B99B19B19B19B19B19B19B19B19B19B11911919B19B19B99BBBBBBB9BB9BB99B99999999999B99BB99B99BBBBBBBBBBBBBBBB99J99J99B91B91B91B99B91B99B99BBBBBB9BJ9BJ9BJBBBBBB9BJ9BJ99B999999B99BBBBBBB99B999B99B9999999999B99BBBB99B91J91J91RJBRRJRRZRRZRZcRZcZcsRZkZcsZcsZcsRcsRZkZcsZcsck{cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zc{RcsRcsZk{Zk{RcsRZcRRJBBBBBBJB9RJBRJBBBBRJBJJJJJJJJJJJJJJJJJRJJRJJRJJJJJJRJBRJBBBBBBBBBBRJBRJBRJBBBB9BJJJJJRJJRJJJRJJRJJRJJRJJRJJRJJRJJRRRZRZcRZcRRcRRcRZcRZcJZcJZkRZkRcsRcsRcsRcsRcsRcsZc{ZcsZcsZcsZk{Zk{Zk{Zk{Zk{ck{Zk{ZcsZcsZcsZcsZcsZcsZcsZcsZk{Zk{Zk{ZcsZcsZcsZcsRZkRZkRZkZcsZcsZcsZcsRcsRZkRZkRZcRZcRZcRZcRZcRZkRZkRZkRZkRZcRZcJZcJRcJRcJRcJZkJZcBJZBJZJRZJRcBRcBRcJRcJRcBRcBRcBRcBRcBRcBJZBJZBJZBJRBJR9BJ9BR9BR9BRBJRBJR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ19J19B19J19B19B19B19B19B19J19B19B19B19B19B99B99B19B19B19B19B19B19B19B19B19B11919B19B99B99B99BBBBBBB9BB999919119919919999BBBBBBBBB9BJBBBBBBBBBBBBJ99J91B91B91B99B99B91B99B99BBB9BJ9BJ9BJBBBBBBBBB9BJBBB99B999B99B99BBBBBBB99B99B999B999B999999B99B99JB9J91J91J91RJBRRJRRZRRZRZcZcsZcsRZkRZkZcsZk{ZcsZcsZcsZcscs„c{Œc{ŒZk{Zc{RcsRc{Rc{Zc{Rc{RcsRcsZk{Zk{Zk{RZcRRJRRJJJJRJBRJBRJBRRJJJRJJRJJRJJJJJJJJRJJRRRZRRJJJJRJBRJBRJBBBBBBBBBBBBBRJBRJBBBBBBBJJJJRJJRJJRJJJRJJRJRJJJJJJJJJRJJRJRZRRZRRZRZcRZcRZcRZcJZkJZkRcsRcsRcsRcsRcsRcsZcsZc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{cs„cs„ck{ZcsZcsZcsck{ZcsZcsZcsZcsZk{Zk{Zk{ZcsZcsZcsZcsZcsRcsRcsZcsZcsZcsZcsRcsRZkRZkRZcRZcRZcRZcRZkRZkRZkRZkRZkRZcRZcJZcJRcJRcJRcJZcJZcJRcBJZJRZJRZBRcBRcJRcJRcBRcBRcBRcBRcBRcBRcBJZBJZBJR9BR9BJ9BJ9BRBJRBJRBJR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ19J19J19J19J19B11919B19B19J19J19B19B19B19B99B99B19B19B19B19B19B19B19B19B19B19B19B19B9BB9BB99B99BBBBBBB999919119119999999BBBBBB9BJ9BJBBBBBBBBBB99B99B91B91B91B99B99B99B99B99BBB9BB9BBBBBBBB9BB9BB9BB9BBB99B99B99B99BBBJB9B99B99B99BBB99B999999B91B99B99J91J91J91JB9RRJRRZRRZRZcZcsZcsJZcJRcRZkZc{ck{ck{RcsRcsZk{cs„cs„Zk{RcsRcsRcsZc{Zk{Zk{Rc{Rc{Zc{Zk{Zk{ZcsRRZRRJJJRJJRRJBRRJZZcZcsRRZRRJRRJJJRJJRJJRRRZRRJJJJBBBRJBRJBJJJBBBBBBBBBRJBRJBRJBRJBJJJJJJJJJJJJJJRJRJJJJJJJJJJBJRJJRRRZRRZRZcRZcRZcRZcRRcRZkRcsRZkRZkRcsRcsZcsZcsRcsZcsZk{Zk{Zk{Zk{cs„cs„cs„cs„cs„cs„ZcsZcsck{ck{ck{ZcsRZkRcsZk{Zk{Zk{Zk{Zk{ZcsRcsRcsZcsZcsRcsRZkZcsZcsZcsZcsZcsZcsZZcZZcRZkRZkRZkRZkRZkRZcRZcJZcRZkRZkJZcJZcJRcBRcBJZBJZBJZBJZBJZBJZBJZBRcBRcBRcBJZBJZBRcBRcBJZBJZ9BR9BRBJR9BJJJJBJRBJR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ19J19J19J19J19B11919B19B19J19J19B19B19B19B99B19B19B19B19B19B19B19B19J19J19B19B19B19B9BB9BB99B99BBBBBBB999919119119999BBBBBBBBB9BJJJJBBBBBBBBBB99B99B91B91B99BBBRJBB99B99BBBBBB9BB9BBBBBBBB9BB9BJ9BJ9BBB99B99JB9BBBJB9JB9B99B99BBB99B99B999999911999B91J91J91J91JB9RJBRRJRZcRZkZcsRZkJRZBJZJZkZcsck{ck{RcsRcsRcsZk{Zk{Zk{RcsRcsRc{Zk{Zk{cs„Zk{Zk{Zk{Zk{Zk{ZcsRZkRZcRZcRRZRRJRRZZcsZcsRZcJRZRRZRRZRRZRZcRZcRRZJJRJJJJJJJJJJJJJJJRJBRJBRJBRJBRJBRJBJJJ9BJ9BJJJJJJJJRJJJJJJJJJJJJJJJRJJRRRZRZcRZcRZcRZcRRcRZkRZkRZkRZkRZkRcsZcsZcsRcsRcsZk{Zk{Zk{cs„cs„cs„cs„cs„cs„Zk{ZcsZcsck{ck{ck{ZcsRcsRcsZcsZk{Zk{Zk{Zk{ZcsZcsRcsZc{Zc{ZcsRZkZcsZcsZcsZcsZcsZcsZcsZcsRZkRZkRZkRZkRZcRZcRZcJZcRZkRZkRZcJZcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBRcBJZBJZBJZBRcBRcBJZBJZBJZ9BRBJRBJRJJJJJJ9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ19J19J19J19B19B19B19B19J19J19B19B19B19B19B19B11911919B19B19B19J9BJ9BJ19B11911919B9BBBBBBBBBBB99B99B999919919999BBBBBBBBBBBB9BJJJJJJJBBBBBBB99B99B91911B99RRJRRJBBB99999B9BB9BJ9BJBBB9BB9BJ9BJ9BJ9BB999B99BBBRJBJB9J99B99999999999999B99999999999B91B91J91J91J91JB9RRJRZkZcsZcsRZcJRZJRcRZkZcsZcsZcsRZkRZkZcsZk{Zk{Zk{Zc{RcsRc{Zk{cs„cs„Zk{Zk{cs„Zk{Zk{Rc{Rc{RcsZcsZcsRZcRZcRZkRZkJRcJRZJJRRRZRZkZcsRZkRZcJRZJJRJJRJJJJJJJJJJJJJJJRJBRJBRJBJJJBBBBBBBBBBBBJJJJJJJJJJJJJJJJJJJJJJJJRRJRRZRZcRZkJZkJZcJRcJZcRZkRZkRZkRZkRZkZcsZcsZc{Zk{Zk{cs„cs„cs„cs„cs„cs„ck{ZcsZcsZk{ck{ck{ck{ZcsZcsZcsZcsZk{Zk{Zk{Zk{ZcsZc{Zc{ZcsZcsZcsZcsRZkRZkZcsZcsZcsZcsZcsZcsRZkRZcRZkRZkRZcRZcRZcRZkRZkJZkJZcJRcJRcJRcBRcBRcBRcBJZBJZBJZBRcBRcBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBJZ9BR9BJ9BJ9BR9BR9BR9BR9BR9BJ9BJ9BJ19J19J9BJ9BJ19J19J19J19B99B99B9BJ19J19B19B19B19B19B19B19B19B19B19B19J19J9BJ99B99B11911999B9BB9BBBBB99B99B999999999919919999BBBBBBBBBBBB9BJ9BJ9BJBBBB99B99B99911BBBJJRJJRBBB99B9BB9BJ9BJ9BJ9BB9BB9BJ9BJ9BJBBBB99JB9JB9JB9J99B99B99999119119999B99999999911911911B91J91J91JB9RRJZcsZcsRZkRZcJZcJZcRZkRZkZcsRcsZcsZcsZc{Zk{Rc{Rc{Zk{Zk{Rc{Rc{cs„cs„Zk{Zk{cs„cs„Rc{Rc{Rc{Zk{Zk{ZcsRZkRZkRZkRZkJRcJRZJJRRRZZcsZk{Zc{RZkJZkJRcJRZJJRJJJJJJJRJJRJJJJJJJJJJJJJBBBBBBBBBBBBBBBRJBJJJJJJJJJJJJJJJJJJRRJRRZRZcJZcRZkJZkJRcJZcRZkRZkRZkRZkRZkRcsZcsZc{Zk{Zk{cs„cs„cs„cs„c{Œcs„ck{ZcsZcsZcsck{ck{ZcsZcsZk{Zk{Zk{ZcsZcsZcsZcsZcsZk{Zc{ZcsZcsZcsZcsRZcRZkZcsZcsZcsRZcZcsRZkRZcRZcRZkRZkRRcRRcRZcRZkJZkJZkJRcJRcJRcJRcJRcBRcBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BJ9BR9BR9BR9BR9BJ9BJ9BJ9BJ19J19J9BJ9BJ19J19J19J19J99B99B19J19B19B19B19B19B19B19B19B19B19B19B19J19J99B99B99B99B99B99B99B99B99B99B99991999911911111191999999B99BBBBBBB9BJ9BJBBBB99B99B91911BBBRRJRRZBBB99B9BJBJR9BJ9BB9BB9BB9BJ9BJ9BJBBBBBBJB9JB9JB9J99B99B99BBB99B999999B99999999911911911B91J91J91JB9RRJRZcRcsRZkRZkRZkRZkRZkRcsRcsRcsZcsZc{Zk{Zk{RcsRcsRc{Rc{Rc{Rc{cs„cs„Zk{Rc{Zk{Rc{Rc{Rc{RcsRcsRc{RcsRcsRcsRcsRcsRZkJRZJJRRRJZcsZk{Zc{ZcsRcsRZkRZcRRZJJRJRJJRJJRJJRJJRJRRJJJRJJJBBBBBBRJBRJBRJBJJJJJJJRJJRJJJJJJRRRJRRZJRcJZcRZcRZcJZcJZcRZcRZkRZkRZkRZkRcsRcsZcsZcsZk{Zk{cs„cs„cs„c{Œc{Œcs„ZcsZcsZcsck{ck{ZcsZcsZk{ck{ck{ZcsZcsZcsZcsZcsZc{Zc{RZkRZkZcsZcsZcsZcsZcsZcsZcsRZkRZcRRcRZcRZcJZkJZkJZcJZcJZcJZkJZkJZkJZkJZcJRcJRcJRcJRZBJZBJZBJZBJZBRcBJZBJZBJZBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BJ9BR9BR9BR9BJ9BJ9BJ19J19B19B9BJ9BJ19J19J19J19B19B19B19B19B19B19B19B19B19J19J19B19B19J99B99B99B99B99B99B99B99B99B99B99B91991911911911111111191999B99BBBBBBBBBB9BJBBBBBBB99B91911JB9RRJRRJBBB99B9BJBJR9BJ9BB9BB9BB9BJ9BJ9BJJJJBBBJB9JB9JB9B99B99BBB99B9BB99B99B99B99B999999999B99B91J91J91JB9RRJRZcZcsRcsZcsZcsZcsZcsRcsRcsRcsZc{Zk{Zk{Zk{ZcsRcsRc{Rc{Rc{Zk{cs„cs„Zk{Rc{Rc{Rc{Rc{RcsRcsRcsRc{Rc{RcsRcsRc{Rc{RcsRZkRRZRRZRZkZcsZc{Zc{RcsRZkRZcRRZJRJJJJJRJJRJJJRJJRRRJRRJJJJJJJJJJJJJJJJJJJJJJJJJJRJJJRJJRJJRRRZRRcJRcJZcRZcRZcJZcJZcJZcRZcRZkRZkRcsRcsRcsRcsZk{Zk{Zk{Zk{cs„cs„c{Œc{Œcs„ck{ZcsZcsck{ck{ZcsZcsZk{ck{Zk{ZcsZcsZcsZcsZcsZc{ZcsRZkRZkZcsZcsZcsZcsZcsZcsZcsRZkRZcRZcRZcRZkJZkJZkJZkJZcJZcJZkRcsRcsJZkJZcJRcJRcJRZBJZBJRBJRBJZJRZBJZBJZBJZBJZBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BJ9BJ9BR9BJ9BJ99B9BJ99B19B19B99B9BJ19J19J19J19J19B19B19B19B19B19B9BJ99B99B99B19B19B99B99B99999999B99B99B19J9BJ9BJ99B99B99991911111111191991191999BBBBBBBBBBBBBBBBBBBBBBB99B91B91B99JJJJJJBBBBBB9BJ9BJBBBBBB99B9BB9BB9BJJJRJJJRJBJB9BBBJB9B999999999BB9BJ9BJ9BB9BBBBBBBBBBBBBBB99JB9J91J91RJBRRJZcsZcsZcsZcsRZkRcsZcsZc{ZcsZcsZk{Zk{Zk{Zk{Zc{ZcsZcsZk{Zk{c{ŒZk{cs„cs„cs„Zk{Zk{Zk{Rc{RcsRcsRc{Rc{Rc{Rc{Rc{Rc{Rc{RcsZcsZcsRcsRcsZc{Zc{RcsRZkRZcRRJJJJRJBJRJJJRJJRJJRJJJJJJRRJRRJRRJRRJJRJJRJJRJJRJJJRJJRJJRJJRJRcRZcJZcRZcRZcRZcJZcJRcJZcRZkRZkRcsRcsRcsRc{Rc{Rc{Rc{Zk{c{Œc{Œcs„cs„cs„cs„cs„ck{ck{ck{ZcsZcsZcsZk{Zk{ZcsZcsck{ck{Zk{ZcsZcsZcsZcsZcsZcsZcsZcsZcsRcsRcsRcsRZkRZcRZcRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkJZcJRcJRZJRZBJZBJZBJRBJRJRZJRcBJZBJZBJZBJZBJZ9BRBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BJ9BJ9BJ9BJ99B99B99B99B99B99B99B9BJ19J19J19J19J19J19B19B19B19B19B9BJ9BJ99B99919B19B99B99911911919B99B19B19J9BJ9BJ99B99B99B999111111119919919999BBBBBBBBBBBBBBBBBBBBBBBBB99B99B99B99BBB9BJ9BJ9BJ9BJ9BJBBB99B99B9BB9BJJJJBJRJJJBBBBBBBBBBBBB999999999BB9BJ9BJ9BJ9BJ9BJ9BJ9BJBBBBBBJB9J91JB9RJBRRZZcsck{ZcsZcsRZkRcsZcsZc{ZcsZcsZk{Zk{Zk{Zk{Zk{Zc{Zc{Zk{c{Œc{ŒZk{Zk{cs„cs„Zk{Zk{Rc{RcsRcsRcsRc{Rc{Rc{Rc{Zk{Zk{Rc{Rc{Zk{Rc{RcsRcsZc{Zc{RZkRZcRRZJJRBBBBBBJJJJJRRRZJJRJJJRJBJRJRRJRRJRRJJRJJRJJRJJJRJJRJJRJJRJRZJRcJZcRZcRZcRZcJRcJRZJRcJZcRZkRZkRcsRcsRcsRc{Zk{Rc{Zk{Zk{c{ŒksŒksŒcs„cs„cs„cs„cs„ck{Zk{ZcsZcsZk{Zk{ZcsZcsZcsck{ck{Zk{ZcsZcsZcsZcsZcsZcsZcsZcsZcsRcsRcsRcsZcsRZkRZcRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkJZcJRcJRZJRcJRcBJZBJZBJZJRcJRcBJZBJZBJZBJZBJZ9BRBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BJ9BJ9BJ9BJ99B99B99B99B99B99B9BJ9BJ9BJ19J19J19J19J19J19B19B19B19B9BJ9BJ99B11919B19B11911919B19B19B19B19B99B99B99BBBBBBB99B999911111119119999BBB99B99B99B99BBBBBBB9BJ9BJBBBB99B99B99BBBJJJJJJ9BJ9BJ9BJBBB9BB9BB9BJ9BJBJRJJJ9BJBBBBBBBBBBBBBBB99999B99B9BB9BJ9BJ9BJ9BJBBB9BBB99JB9JB9B99JB9JJJRRZZcsZk{RZkRZkRZkZcsZcsZcsZcsZc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{c{Œc{Œc{Œc{ŒZk{Zk{Zk{Zk{RcsRcsRcsRc{Rc{Rc{Rc{RcsZcsZk{cs„Zk{Rc{Rc{RcsRcsRcsZc{Zc{RZkRZcJRZJJRBBBBBBJJJJJRRRZRRZJRJJJJJJJJJJJJJJJJRJBJJJJJRJJRJJRJJRJJRJRZJRZJRZRZcRZcJRcJRZJRZRRZRZcRZkRZkRZkRZkZcsZk{Zk{Zk{Zk{c{Œc{ŒksŒksŒcs„cs„cs„cs„cs„ck{ZcsZcsck{ck{ck{ZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsRZkRZcRZcRZkRZkRZkRZkRZkRZkJZkJZkJZkJRcJRcJZcJZkJRcJRcBJZBRcBRcJRcJRZBJZBJZBJRBJRBJRBJR9BR9BR9BRBJZBJZBJZBJZBJZ9BR9BR9BR9BJ9BJ9BJ9BB9BB9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ9BJ19J19J19B19B19B19B9BJ99B19B11919B19B11911919B19B19B19B99B99B99B99BBBBBBB99B99999991111911999BBBB99B99B99B99B99BBBB9BJ9BJBBBBBBB99B99JJJJJJJJJ9BJ9BJ9BJ9BJ9BB9BB9BJBJRBJR9BJBBBBBBBBBBBBBBBBBBBBB99B9BB9BB9BJ9BJJJJ9BJBBB9BBB99BBBBBBB99RJBJJRRZcZcsZcsRZkRZkZcsZcsZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{cs„c{Œc{Œc{Œc{ŒZk{Zk{Rc{Rc{Rc{RcsJZkJZkRcsRc{Rc{RcsRcsRcsZk{Zk{Zk{Rc{RcsRcsRcsZcsZc{ZcsRZkRRcRRZJJJBBBBBBRJBJJRRRZRRZRRJJRJJJJJJJJJJJJJRJBJJJJJRJJRJJRJJRJJRJJRJJRJRZRZcRZcJRcJRZRRZRRZRZcRZkRZkRZkZcsZcsZk{Zk{Zk{c{Œc{Œcs„c{ŒksŒcs„cs„cs„Zk{ck{ck{Zk{Zk{ck{ck{ck{ck{ZcsZcsZcsZcsZcsck{ZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsRZkRZkRZkRZkRZkRZkRZkRZkRZkJZkJZkJZkJZkJZkJZkJZkJZkJZcJRcBRcBRcJRcJRcBJZBJZBJZBJZBJRBJRBJR9BR9BR9BRBJZBJZBJZBJZBJZ9BR9BR9BJ9BR9BJ9BJ9BJ9BJ9BR1BR19J9BJ9BJ9BJ9BJ9BJ9BJ19J19J19B19B19B19B19B19B19B19B11911919B19B19B99B99B99B99B99B99B99B99B99B99991991991991999999B99B99B999BBBBBB9BB9BB9BJ9BJBBBBBBB99RJBRRJJJRJJJ9BJ9BJ9BJ9BJ9BBBBBBBBBJRBJR9BJ9BJBBBBBB9BJ9BJ9BJBBB9BJ9BJ9BJ9BJJJJJJJJJJBBBBBBBBB9BJJJJRJBJJJJJRJRcRZcRZkRZkZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zk{cs„cs„cs„cs„cs„Zk{Zk{Rc{RcsRcsRc{Rc{RcsRcsJZkRZkRcsRcsRcsRcsRcsRc{Rc{Rc{RcsRcsRcsRcsRcsRcsRZkRZcRRZJJJJJJBBBRJBJJJJJRRRZRRJRRJJJJRJBRJBJJJJJJJJRJJRJJRJJRJJRJRJJJRJJRJRcRZkRZkJRZJRZRRcRZcRZcRZkRcsZcsZcsZcsRc{Zk{c{Œc{Œcs„cs„cs„cs„cs„ck{Zk{Zk{ck{ck{ck{Zk{Zk{Zk{ck{ck{ck{ZcsZcsZcsZcsZcsZcsZcsRZkRZkRZkRcsRZkRZkZcsZcsZcsZcsRcsRcsRcsRZkRZkRZkRZkJZkRZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZcJZcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19B19B19B19B11911919B19B19B11919B19B99B99B99B99B99B99B99B99B99B99991991991991991999999B99B999B99BBBBBBBBB9BJ9BJ9BJBBBBBBBBBBBBJJJJJJ9BJ9BBBBBBBB9BB99BBBBBBB9BJBJR9BJBBBBBBBBB9BJJJJ9BJ9BJ9BJ9BJ9BJ9BJJJJJJJRJBBBBBBB9BJJJJJJRRRJRRZJRZJRcJZcRZkZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{RcsZc{Zk{cs„Zk{Zk{Zk{Zk{Zk{Rc{RcsRcsRc{Rc{RcsRZkJZkJZkRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRZkRZcRRZRRJJJJJJJJJJJJJJJRRRJRRJRRJJJJRJBRJBJJJJJRJJRJJRJRJJJRJJRJRJJJRJRZJRcRZkRZkJRcJRcJRcRZcRZcZcsZk{Zk{ZcsZcsRc{Zk{Zk{cs„ck{ck{cs„cs„cs„ck{Zk{Zcsck{ck{ck{ck{Zk{Zk{ck{ck{ZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsRcsRcsRcsZcsZcsZcsZcsZcsRcsRcsZcsRcsRcsRZkRZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZcJZcJRcJRcBRcBJZBJZBRcBRcBJZBJZBJZBJR9BR9BRBJRBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ99B9BJ9BJ9BJ9BJ9BJ19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B99B99B99999999B99B99B99B99B99991991911911991991999B99B99BBBBBBB9BJ9BJ9BJ9BJ9BJBBBBBBBBBBBBBBBBBBBBB99B99B99B99B99B9BB9BB9BJ9BJ9BJBBB9BJ9BJJJJBJRBJRBJR9BJ9BJ9BJ9BJ9BJJJJBBBBBBBBB9BJJJJJJRRRZRZcJRcJRcRZcRZkRZkZcsZc{Zk{Zk{Zk{Zk{Zc{Zc{Rc{RcsRcsZk{cs„Zk{cs„c{Œc{Œcs„Zk{Rc{Rc{Zc{RcsRZkJZkJZkRcsRcsRc{RcsRcsRcsRcsRcsRcsRcsRcsRZkRZkRcsRc{RcsRZcRRZRRJRRJJJRJJRJJJJJRRRJRRJJJRJJJRJBRJBJJJJJRJJRJJRJJRJJRJJRJJRRRZJZcJZcRZcRZcRZcJZcJZcRZcRZkZcsZk{Zk{ZcsZcsZcsZcsZcsZcsck{ck{cs„cs„cs„ck{ck{ck{ck{cs„cs„cs„ck{ck{ck{ZcsZcsZcsZcsZk{Zc{Zc{ZcsZcsZcsZcsZk{ZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsRcsRcsRcsRZkRZkRZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkBRcBRcBRcBRcBRcBJZBJRBJRBJR9BR9BR9BR9BRBJZBJZ9BR9BR9BJ9BR9BR9BR9BJ9BJ9BJ9BJ99B99B9BJ9BJ9BJ9BJ9BJ9BJ19B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99991991999B99B99B99B99999999999911911991999999B99BBBBBBB9BJ9BJ9BJ9BJ9BJ9BJRJBBBBBBBBBBBBBB9999991991999999B9BB9BB9BJ9BJ9BJ9BJ9BJ9BJJJJJJJJJJBJR9BJ9BJBBBBBBBBBBBBBBBB99B99BBB9BJJJJJRZRZcRZcJRZJRZRRZRZcRZkRcsZcsZc{Zk{Zk{Zc{Zc{Zc{Rc{RcsRcsZk{Zk{Zk{Zk{Zk{cs„cs„Zk{Rc{Rc{Zk{Zc{RZkJZkRcsRcsRc{Rc{RcsRcsRcsRcsRcsRcsRcsJZkJZkRZkRcsRc{RZkRZcRZcRZcRRZRRZJJRJJRRRJRRJRRZJJRJJJJJJJJJJJJJJRJRZJRZJRZJJRJJRRRZRZcRZcJZcRZcRZcRZcRZcRZcRZkZcsZcsZk{Zk{ZcsZcsZcsZcsZcsZcsck{cs„cs„cs„cs„cs„ck{ck{cs„cs„cs„cs„cs„ck{ZcsZcsZcsZcsZk{Zk{Zc{ZcsZcsZcsZk{Zk{Zk{Zk{Zk{ZcsZcsZcsZcsZcsZcsZcsZcsRZkRZkRcsRcsRcsRZkRZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJRcBRcBRcBRcBRcBJZBJRBJRBJR9BR9BR9BR9BRBJZBJZ9BR9BR19J19J9BR9BR9BR9BJ9BR9BJ9BB99B9BJ9BJ9BJ9BJ9BJ99B19B19B19B19B19B19B19B19B19B19B19B11911911911911911911999B99B99B99999B99B9BB9BB11911999999999B99BBBBBBB9BJ9BJBBBBBBBBB9BJJJJBBBB99B99BBBBBBB9991991999999B9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJ9BJ9BJ9BJ9BJBBBBBBBBBJB9JB9JB9B91B99BBB9BJJJJJRZRZcRZcJRZJJRJJRJRZRZkRcsRcsRcsRc{Rc{Rc{Rc{Zc{ZcsRcsRcsZc{Zk{Zc{Zc{Zk{Zk{Zk{Rc{Rc{Rc{cs„Zk{RcsRZkRcsRcsRcsRcsRc{Rc{RcsRcsZc{RcsJZkJRcJZkRcsRcsRcsJZkRZkRcsZcsRRZRRJRRZRRZRRZRRZRRZJJRJJRJJJJJJJJRRRZRRZJRZJRZJRZRRZRZcRZcRZcRRcRZcRZcRZcRZkRZkZcsZcsck{ck{ZcsZcsZcsZcsZcsck{ck{ck{ck{cs„cs„cs„cs„cs„ck{cs„cs„cs„cs„Zk{ZcsZcsZcsZcsZc{ck{ck{ZcsZcsZcsZcsZk{Zk{Zk{Zc{ZcsZcsZcsZcsRcsZcsZcsZcsZcsRZkRZkRZkRcsRcsRZkJZcJZcJZcJZkJZkJZkJZcJZkJZkJZkJZkJZkJZkJRcJRcBRcBRcBRcBRcBJZBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B11911911911911911911999999B99B99999999B9BB9BB9BB99B11999999999999B99BBBB9BJ9BJBBBBBBBBB9BJ9BJBBBB99B99JB9BBBBBB99B99B99B9BB9BJ9BJJJJ9BJ9BJ9BJ9BJ9BJBBB9BB9BB9BB9BB99BBBBJB9JB9JB9J91B91B99BBB9BJJJJJJRRRcRRcRRZJJRJJJJJRRZcRcsRcsRc{Rc{Rc{Rc{Zk{Zk{ZcsZcsRcsZc{Zc{Zc{Zc{Zc{Zc{Zk{Rc{Rc{Zk{cs„cs„Zk{RcsRcsRcsJZkJZkRc{Zc{RcsRcsRc{RcsJZkJZcRZkRcsRcsRZkJZkRZkRc{ZcsRZcRRZRRZRZcRZcRRZRRZRRZJJRJJRJJRJRZRRZRZcJRZJRZRRZRRZRZcRZcRRcRRcRZcRZcRZcRZkZcsZcsZcsZcsck{ck{ZcsZcsZcsck{ck{cs„ck{ck{cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{ZcsZcsZc{Zk{ck{ck{ZcsZcsRZkZcsZk{Zk{Zk{Zk{Zk{ZcsZcsZcsRcsRcsZcsZcsZcsRZkRZkRZkRcsRcsJZkJZcJZcJZcJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkJRcJRcBRcBRcBRcBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J9BR9BR9BR9BR1BR19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B11911911911911911991999991999999999B9BB9BB99B99999B19B11911911999999BBBB9BJ9BJBBBBBB9BJBBBBBBB99B99B99B99BBBBBB9BJ9BJ9BJ9BJ9BJ9BJJJJBJR9BJ9BJ99B99B99B9BB9BB9BB9BB9BBB99RJBRJBJB9J99J99J99BBBBBBJJJJJRJRcRZcRZcJRZJJRJJRRZcZc{Zk{Zk{Zk{Zk{cs„cs„Zk{ZcsRcsRc{Rc{Zk{Zk{Zk{Zc{Zc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{RcsJZkJZkJZkRcsRcsRcsRcsRcsRcsRcsRZkRcsRcsRcsRcsJZkJZkRcsRcsRZkRZcRZcRZcJRcJRZRRZRRZRRZRRZRRZRRZRZcRZcRRZRRZRRZRRZRZcRZcJRZJRcRRcRZcRZkRZkZcsZcsRcsZcsck{ck{ZcsZcsZcsZk{cs„cs„ck{ck{cs„cs„cs„cs„ck{cs„cs„c{Œcs„Zk{cs„Zk{Zc{Zc{Zk{Zk{Zk{Zk{Zk{ZcsRZkRZkZcsZk{Zk{cs„ck{ck{Zk{ZcsRcsRcsZcsZcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR19J19J19J9BJ9BJ19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B11911911911911911991991999999B9BB9BBBBB99B99999B99B11911991999999B9BJ9BJ9BJBBBBBB9BJBBBB99B99B99B99BBBBBB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJR9BJ9BB9999999999BB9BB9BB9BB9B9B99JB9JB9J99J91J91JB9JB9BBB9BJJJRRZcRZkRZkRZcJJRJRZRZkZk{cs„c{ŒZk{Zk{cs„Zk{Zk{Zc{Zc{Rc{Rc{Rc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{Rc{Zk{Zk{RcsJZkJZkRcsRZkRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRcsJZkJZkJZkRZkRZkRZkRZkRZcJRZJRZJRZRRZRRZRRZRRZRZcRZcRZcRRZRRZRRZRRZRRZJRZJRZJRZRZcRZkRZkRZkZcsZcsRcsRcsZcsck{Zcsck{ZcsZk{cs„cs„cs„cs„cs„cs„cs„cs„ck{cs„cs„c{ŒZk{Zk{cs„cs„Zk{Zc{Zk{Zk{ZcsZcsZk{Zc{ZcsZcsZcsZk{Zk{Zk{cs„ck{Zk{Zk{ZcsRcsRZkRZkRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkBRcBRcBRcBRcBRcBRcBJZBJZBRcBRcBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B11911919B19B19B19B11911911911911111111999999B99BBBBBBB9BB9BB9BB99B9999199199999BB9BJ9BJ9BJBBBBBB9BJ9BJBBBB99B99BBBBBB9BJBBBBBBBBBBBBBBBBBBBBBBBB9BJ9BJ9BB9BB9B99B99B99BB9B99B9999B99J91J91J91J91J91J91JB9BBBBBBJJRRZkZcsZcsRZcJRZJRZRZkZk{cs„c{Œc{Œcs„Zk{Zk{Zc{Zc{Zk{Zk{Rc{Rc{Zc{Zc{Zk{Zk{Rc{Zk{Zk{Zk{Rc{Rc{Zc{RcsRZkJZkRZkRZkJZkRZkRcsRcsRcsRcsRZkRZkRcsRcsRcsRcsJZkJZkJZkRZkRZkRZkRZcRRZJRZJJRJJRRRJRRZRRZRRZRRZRZcRZcRZcRZcRRcRRcJRZJRZJRZRRZRZcRZkRZkRcsZcsZk{ZcsZcsZcsZcsZcsck{ck{cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{cs„cs„Zk{Zk{ck{ck{Zk{Zk{Zk{Zk{ZcsZcsZk{Zk{Rc{Zk{Zk{Zk{Zk{Zk{ZcsZcsRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJRcBRcBRcBJZBJZBRcBRcBJZ9BR9BR19J19J19J19J9BJ9BR9BR9BR9BR9BJ9BJ19J19J19J19J19J19J19J19J19B19B19J19J19B19B19B19B11911919B19B19B19B11911999911911111111919B19B99BBBBBBB9BB9BJ9BJ99B99991999999B9BB9BJ9BJ9BJBBBBBB9BJ9BJBBBBBBBBBJJJJJJJJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9BJ9BB9BB9B99B99B99B99B9999B99B91J91J91J91J91J91J99BBB9BJJRZRZkZcsZcsRZkJRcJRcRZkZcsZk{c{Œc{Œcs„Zc{RcsRc{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Rc{Rc{Rc{Rc{Rc{Rc{Rc{RcsRcsRZkJZkJZkRZkRZkJZkRZkRZkRcsRcsRZkJZkJZkRcsRcsRcsRcsJZkJZkJZkRZkRZkRZkRZcJJRJJRJJRJJRJRZRRZRRZRRJRRZRRcRRcRZkRZcRRcRRcJRZJRZJRZRRZRZcRZkRZkZcsZk{Zk{ZcsZcsZZcZcsZcsck{ck{cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{cs„Zk{Zk{Zk{ck{ck{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{Rc{Rc{Zc{Zk{ZcsZcsZcsRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkBRcBRcBJZBJZBJZBJZBJZBJZ9BR19J19J19J19J19J9BJ9BR9BRBJR9BR9BJ9BJ19J19J19J19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B11911911911911911999B99B119119BBBBBBBBB9BJ9BJ99B11911999999B9BB9BJ9BJ9BJBBB9BJ9BJ9BJBBBBBBJJJJJRJJRJJJ9BJBBB9BB9BB99B99B9BBBBB9BB9BB9BJ9BJ9BB9BB9999999BB9BB99B999B99B91B91B91B91B91JB9RJBJJJJRZRZkZcsZk{RcsRZkJZcRZkZcsZk{Zk{c{Œcs„Rc{RcsRc{Zk{Zk{Zk{Zk{Zk{cs„Zk{RcsRcsZk{Zk{Rc{Rc{Zk{Zc{RcsJZkJZkJZkRZkRZkRZkRZkRZkRZkRZkRZkJZkJZkRZkRcsRcsRcsJZkJZkJZkRcsRZkRZcRRZJJRJJJJJJJJZJRZJRZJJRJJRRRZRRcRZkRZkRZcJZcJZcRRZJRZJRZJRcRZkRZkZcsZcsZcsZk{ck{ZcsRZkRZkZcsck{ck{cs„cs„c{Œcs„cs„cs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{cs„Zk{Zk{Zk{Zk{Rc{Zc{ZcsZcsRc{RcsRZkRZkRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJRcJRcJRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR19J19J9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B11911911911911999B119119119999BBB9BB9BB9BB99B11911999999B9BB9BJ9BJ9BJJJJJJJJJJ9BJBBBBBBJJJJJRJJRJJJBBBBBB9BB9BB99B99B9BB9BB9BB9BJ9BJ9BJ9BJ99B9999999BB9BB99B999B99B99B99B99999B99BBBRRJJJJJRZRZcZcsZk{Zk{ZcsRcsRZkRcsZcsZk{cs„Zk{RcsRcsRc{Zk{Zk{Zk{Zk{Zk{Zk{Rc{JZkJZkZk{Zk{Zk{Rc{Zk{Rc{JZkJZkJZkJZkRZkRZkRZkRZkRZkRZkRZkRZkJZkJZkRcsRcsRcsRcsJZkJZkRcsRcsRZkJRcJRZJJRJJJJJRJRZJRZJRZJJRJJRJRZRRcRZcRZcRZcJZkJZcRRZRRZJRZJRcRZkZcsck{ck{ZcsZcscs„ck{ZcsZcsZcsck{ck{ck{cs„cs„cs„cs„cs„cs„cs„c{Œc{Œcs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{ZcsZc{Zk{Zk{Zk{Zk{Zk{ck{cs„Zk{Zk{ZcsRc{RcsZcsZcsRc{Rc{RZkRZkRcsRcsRcsRcsRZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJRcJRcBRcBJZBJZBJZBJZBJZBJZBJZBJR9BR9BR9BR9BRBJR9BR9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B11911911911911911911991991999999B9BB9BB99B91991999999B9BB9BJ9BJBJRJJRJJJJJJBBBBBBBBBBBBJJJJJJJJJBBB99BBBB9BJBBB99B9BB9BJ9BJ9BJ9BJ9BJ9BJ99B99999B9BJ9BJBBBBBBBBBBBBBBBBBBBBBBBBJJJJJJJJJRRZRZkZcsRc{Zk{cs„cs„Zk{RcsRc{Rc{Zk{Rc{RcsRcsZc{Zc{Zk{Zk{Zk{Zk{Rc{JZkJZkJZkRcsZc{Rc{Rc{Zk{RcsJZkJZkJRcJZcJZcJZkJZkRZkRZkRcsRcsRZkRZkRZkRcsRc{RcsRZkJZkJZkRcsRcsRZkJZcJRZJJZJJZJRZJRZRRZJRZJJRJJRJRZRRZRRZRRZRZcJZkJZkRRZRRZJRZRZcZcscs„cs„ck{RZkRcsZk{cs„ck{ck{ZcsZcsZcsZcsck{ck{cs„cs„ck{cs„cs„c{Œcs„cs„Zk{Zk{c{Œcs„Zk{Zk{Zk{Zk{ZcsZcsck{cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{ZcsRcsRZkRZkZcsZk{Zc{RcsRZkRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR9BJ19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B11911911911911991999991999999B99B99B99B9999199199999BB9BJBJRBJRJJRJJRJJJBBBBBBBBBB99BBBBBBBBB99B99B9BJ9BJBBBBBB99B9BBBBB9BJ9BJ9BJ9BJ9BB999BBBBBB9BJ9BJ9BJ9BJ9BJ9BJBBBBBB9BJJJRJRZJRZRZcZcsZcsRc{Zk{c{Œc{ŒZk{Zk{Zk{Rc{Rc{RcsRcsRcsZc{Zc{RcsRc{Zk{Zk{RcsJZkJZkRcsRZkRcsRcsRc{Rc{RcsJZkJRcJRcJRZJRcJZcJZcJZkJZkRcsRcsRcsRZkRZkRc{Rc{RcsRZkJZkRZkRZkRZkJZkJZcJRcJRcJRcJRZRRZRRJJJRJJRJJRJJRRRZRRZRRZRZcJZkJZkRZcRZcRZcZcsck{cs„ck{ZcsRZkRZkZk{cs„cs„ck{ZcsZcsRZkZcsZcsck{cs„cs„ck{ck{cs„cs„cs„cs„Zk{Zk{c{Œcs„Zk{Zk{Zk{ZcsZcsZcsck{cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{RcsRZkRZkRcsZcsZk{Zk{RcsRcsRcsRcsRcsZcsZcsRcsRcsJZkJZkJZkJZkJZcJZkJZkJZcJZcJZkJZkJZkJZkJZkJRcJRcBRcBRcBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR9BJ19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19B19B11919B19B19B19B11911911991999999999999B9BJ9BJBBBBBB99B999919999BBB9BJBJRBJRJJRJJRJJJ9BJBBBBBBB99B99BBBBBB9BB9BB9BJ9BJ9BJBBB99B999BBBBBB9BJ9BJ9BJBBBBBBB9999999B9BJ9BJ9BJBBBBBB9BB99B9BJJJRRZcRZcRZkZcsZcsZc{Zk{cs„c{ŒZk{Zk{Zk{Zk{RcsRcsRcsRc{Rc{Rc{RcsRcsZc{Zc{RcsRcsRcsRcsRcsRcsRcsRcsRc{Rc{JZkJRcJJZJRZJRZRZcRZcJZkJZkJZkRZkRZkRZkRcsZk{Zk{RcsRcsRZkRZcRZcRRcRRcRRcRZcJRcRRcRRZRRJRRJJRJJRJJRJJJRRRZRZcRRcRRcRZcRZkRZkZcsZcsZcsck{ck{ZcsZcsRZcRZkRcsZk{cs„ck{ck{ZcsZcsZcsck{ck{cs„cs„ck{ck{cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zc{ZcsZcsRcsRcsZk{Zk{Zk{Zk{Zk{cs„cs„Zk{Zk{RcsZcsZcsZcsZc{Zk{Zk{RcsRZkRZkRZkRcsZcsZcsRcsRcsRcsJZkJZkJZcJRcJRcJRcJRcJZkJZkJZkJRcBRcBRcJRcJRcJRcBRcBRcBJZBJZBRcBJZ9BR9BJ9BR9BR9BR9BRBJZBJZ9BR9BR9BR9BR9BJ19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19J19B19B19J19B19B11919B19B19B19B19B99999999999B9BB99B99B9BJ9BJBBBBBB9BB99B999999BBB9BJ9BJBJRBJRJJRJJJJJJ9BJBBBB99B99BBB9BJ9BJ9BJ9BJ9BJ9BJBBBBBB999BBB9BJBJRBJRJJJ9BJBBBBBB99999BBBBBBBBBBBBB9BB9BB99B9BJJRZRZcRZkRZkRZkZcsZcsZk{Zk{cs„cs„cs„cs„Zk{ZcsRcsRc{Rc{Zk{Rc{RcsRcsRc{Zc{RcsRcsRcsZcsRcsRcsRcsRcsRc{Rc{JZkJRcJJZJJZRRcRZkRZkRZkJZkJZkRZkRZkRZkRcsZk{Zk{ZcsRcsRZkRZkRRcRRZRRZRRcRZcRZkRZcRRZRRZRRJJRJJRJJRJJJRJRZRRZRRcRZcRZkRZkZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZcsZk{cs„ck{ck{ck{Zk{Zk{ck{ck{cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„ck{Zc{ZcsZk{ZcsRcsRcsZk{Zk{Zk{Zk{cs„cs„ck{Zk{Zc{RcsZcsZcsZcsZc{Zk{ZcsRcsRcsRZkRZkRcsRcsRcsRcsRcsRZkJZkJZcJRcJRcJRcJRcJZkJZkJZkJZkBRcBRcBRcBRcJRcJRcBRcBRcBJZBJZBRcBJZ9BR9BJ9BR9BR9BR9BRBJZBJZ9BR9BR9BR9BR9BJ19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19J19B19B19B19B11911919B19B19B99B99B99B99999B9BJ9BJ9BB99B99B99B9BB9BB9BB99B99B99BBBBBBB9BJ9BJBJRBJRJJRJJJ9BJBBBB99B999BJBJR9BJ9BJBBBBBB99B99BBBBBBBBBB9BJJJZJJZJJJ9BJ9BJ9BJ9BB9BB9BB9BB99B99B9B99BB9BB9BJJJZRZcRZcRZcRZcRZkZcsZk{Zk{Zk{cs„cs„cs„Zk{Rc{RcsZc{Zc{Zc{Rc{Rc{Rc{Rc{Rc{RcsRcsZcsZc{Rc{Rc{Rc{Rc{Zc{RcsRZkJRcJJZJJZRZkRcsRcsRcsRcsRZkRZkRZkJZkRcsZc{Zc{RcsRcsRcsRZkRZcRRJJJRRRZRZkRZkRZcRRZRRZRRZJJRJJRJJRJJRJJRJJRJRZRZkRcsZk{Zk{ZcsRZcRZcRZcRZcZcsZcsZk{Zk{Zcsck{cs„cs„ck{ck{ck{ck{ck{ck{cs„c{Œcs„cs„cs„cs„cs„Zk{ck{cs„cs„cs„ZcsZcsck{ck{ZcsZcsZc{Zk{Zk{ck{cs„cs„Zk{Zk{ZcsZcsRZkZcsZcsZcsRcsRcsRcsRcsRcsRcsRcsJZkRZkRZkRZkJZkJZkJZkJRcJRcJRcJZkJZkJZkJZkJZkBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR9BR19J19J19J19J19J19J19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B11911919B19B99B99B99B99B99B9BB9BJ9BJ99B99999B9BB9BB9BB99B99B99B9BBBBBBBBBBB9BJ9BJBJRJJRJJJ9BJBBBB99BBB9BJBJR9BJBBBBBBB9999999999BBBB9BJJJJJJRBJR9BJBBBBBB9BJ9BJ9BB9B9999999999999B99BBB9BJBJRJRcRZcRZkRZcRZkZcsZk{Rc{Rc{Zk{cs„c{Œcs„Zk{Rc{Zc{Zc{Zc{Zk{Zk{Zk{Rc{Rc{RcsRcsZc{Zk{Rc{Rc{Rc{Zk{Zk{Zc{RZkJRcJRZJRcRZkRcsRcsRcsRcsRZkRZkRZkJZcRZkRcsRc{RcsRcsRcsRZkRZcRRZJJRRRZRZkRcsRZcRRcRRZRRZRRZJJRJJRJJRJJRJRZRRcRZkZk{Zk{Zk{ZcsRZcJRZJRZRZcZcsck{cs„ck{ck{ck{cs„cs„ck{ck{ck{cs„ck{cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{ck{cs„cs„ZcsZcsck{ck{ZcsZcsZcsZc{Zk{cs„cs„cs„Zk{ZcsZcsZcsRZkRZkZcsZcsZcsRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZcJZkJRcJRcJRcJZkJZkJZkJZkJZkBRcBRcJRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BJ19J9BR9BR9BJ19J19J19J19J19J9BJ19J19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B99B99B9BJ19B19B9BJ9BJBBBBBB99999999B9BB9BJBBB99B9999BBBBBBBBBBB9BJ9BJ9BJ9BJJJJJJJBBB999B99BBBJJJ9BJ9BJ9BBBBB999B9999999999B9BJJJJ9BJ9BJBBB99B9BB9BBBBBBBB999999999999999BBBBBBJJJJJJJRZRZkZcsRZkZcsZcsZcsRcsRcsZk{cs„c{Œcs„Zk{Rc{Rc{Zk{Zk{Zk{Zk{Zk{RcsJZkJZkRcsZc{Zk{Rc{Rc{RcsRcsRc{Rc{RZkRZcJRcJRcRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkRcsRcsRcsRcsRcsRZkRZcRZcRRcRZcZcsZcsRZkRRcRRZRRZRRJJJRJJRJJRJJZJRcRZkZcsZcsZcsZcsZcsRZcRZcRZcZcsZk{cs„cs„ck{ck{ck{ck{ck{ZcsZcsck{ck{ck{ck{ck{ck{ck{cs„cs„Zk{Zk{Zk{Zk{Zk{cs„ck{Zk{Zk{ck{ck{ZcsZcsZcsZc{Zk{Zk{cs„cs„Zk{ZcsZcsRZkRZkRZkRZkZcsZcsZcsRcsRZkRcsRcsRcsJZkJZkJZcJRcJRcJRcJRcBRcBRcJZkJZkJZkJZkBRcBRcJZkJZkJZkJRcBRcBJZBJZBJZBRcBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J9BJ9BJ19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99B9BJ9BJ19B19B19J9BJBBBB9999999999B9BJ9BJ9BJBBBBBBBBBBBBBBBBBB9BJ9BJ9BJ9BJ9BJBBBBBBB99BBBBBBJJJBBB9BB9999999999999991199999BB9BJ9BB99B999999999BBBBBBBBBBBB99B999999999BBBBBBJJJJJJJRZRZcZcsZcsZk{Zk{Zk{ZcsZcsZk{cs„c{Œcs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{RcsJZkJZkRcsRc{Zc{RcsRcsRcsRcsRc{Rc{RcsRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkRZkRcsRcsRcsRcsRcsRZkRZkRZcRZcRZkZcsZcsRZkRZcRRZRRJRRJJJRJJRJJRJJZJRcRZkZcsZcsZcsZcsZcsRZkRZcRZcZcsZcsck{cs„ck{ck{ck{ck{ck{ZcsZk{ck{cs„cs„cs„ck{ck{ck{ck{Zk{Zk{Zk{Zk{Zk{Zk{Zk{ck{Zk{Zk{ck{ck{ZcsZcsZc{Zk{Zk{Zk{Zk{Zk{ZcsRZkRZkRZkRZkRZkRZkRZkZcsZcsRZkRZkRcsRcsRcsRZkJZkJZcJRcJRcJRcJRcBRcBRcJRcJZkJZkJRcBRcBRcBRkJZkJZkJRcBRcBRcBJZBJZBRcBRcBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BRBJR9BR9BJ19J19J19J19J19J19J19J9BJ9BJ19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B99B9BJ9BJ9BJ19B19B19J9BJ9BJ9BB99999B99B9BJ9BJ9BJ9BJBBBBBBBBBBBBBBB9BJ9BJ9BJ9BJBBBBBBBBBBBBBBBBBB9BJ9BB11911191991911111111199999999B9BB99B919919BBBBBBBBBBBB9BJBBB9BB9B9999B99BBBJJJJJRJRZJRcRZkZk{Zk{cs„Zk{Zk{Zk{cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{Zk{Rc{Rc{Rc{JZkJZkRc{Rc{RZkRZkRcsZk{Rc{Rc{RcsRcsRZkRZkRcsRcsRcsRZkRZkRZkJZcJZkRZkRcsRcsRcsRcsRcsRcsRZkJZkJRcRRcRZcRZkZcsRZkRZcRRZRRJJJRJJRJJRJJRJJRJRZRRcRZcRZcRZkRcsRcsZcsZcsZZcZZcZZcZcsck{cs„cs„cs„ck{ck{ck{ck{cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{ZcsZcsZk{Zk{Zk{Zk{ck{ck{Zk{Zc{Zk{Zk{Zc{Zc{Zk{Zc{ZcsRZkRcsRcsRcsRcsRZkRZkRcsRcsRZkRZkRZkRcsRcsRZkRZkJZkJZcJZcJZcJZkJZkJZkBRcBRcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZ9BR9BR9BR9BRBJR9BR9BJ19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J9BJ9BJ9BJ19B19B9BJ9BJ9BB9BB99B99B9BJ9BJ9BJ9BJ9BJ9BJBBBBBBBBBBBBBBB9BJ9BJ9BJBBBBBBBBBBBBBBB99B99B99911111111111111111111191191999999B999999999BBB9BJ9BB9BB9BJ9BJ9BB9B99B9B99BBBJJJJRZJRcRRcRZkZk{c{Œc{Œcs„Zk{Zk{cs„Zk{Rc{Rc{Zk{Zk{Zk{Zk{Rc{RcsRc{Rc{Zk{Rc{RcsRcsRc{RcsRZkRZkRcsRc{Rc{Rc{RcsRcsRcsZcsZcsRcsRcsRZkRZkRZcJZcJZcJZkRcsRcsRcsRcsRcsRcsJZkJRcJRcJRcRRcRZcRZkRZkRZkRRZRRZJRZJRZJRZJJRJJRJJRRRZRZcRZcRZkRcsZcsZcsZcsZcsZZcZZcZcscs„ksŒksŒcs„cs„ck{ck{cs„cs„c{Œcs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{ZcsZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zc{Zk{Zk{Zc{Zc{Zc{ZcsRcsRcsRcsRcsRcsRcsRZkRcsRcsRcsRZkRZkRZkRZkZcsRZkRZkJZkJZcJZcJZkJZkJZkJRcBRcBRcJRcJRcJZkJZkBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B11911919B19B19J19J19J19J9BJ9BJ9BJ9BJ99B99B99B9BJ9BJ9BJ9BJ9BJ9BB9BB9BJBBBBBBBBBBBBBBBBBB9BJ9BJBBBBBBB999999199999999999111111111111111119119199999999999999B99BB9BJ9BB9BB9BJ9BB99B999999BBBJJJBJRJJZJRcRZcZcsZk{cs„cs„Zk{Zk{Zk{Zk{Rc{Rc{Rc{Rc{Zk{Zk{Zk{RcsRcsRc{Zk{Zk{Zc{Rc{RcsRcsRcsRcsRcsRZkRcsRc{RcsJZkRZkRcsZc{ZcsRcsRZkJZkRZcRZcJZcJZcJZkJZkRZkRZkRZkRZkRZkJZkJRcJRZJRZJRZJRZRZcRZkZcsRRZRRZRRZRRZRRZRRZRRJRRJRZcZcsZcsZcsRcsZcsZcsck{ck{ZcsZcsck{cs„ksŒksŒksŒcs„ck{cs„cs„c{Œc{Œcs„cs„cs„cs„cs„cs„Zk{Zk{Zk{ZcsZcsRZkZcsZcsZcsZk{Zk{Zk{Zc{Zc{Rc{Rc{Rc{Rc{RcsRcsZcsZc{Zc{ZcsRZkRZkRcsRcsRcsRcsRcsRcsRcsRcsRZkRZkRZkJZkJZkJZkJZkJZkJRcBRcBRcBRcJRcJRcJZkJZkBRcBRcBRcBRcBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BJ19J19J19J19B19B19B19B19B19B19J19J19J19B19B19B19B19B19B19B19B19B19B19B11911911919B19B19J19J19J9BJ9BJ9BJ9BJ99B99B9BJ9BJ9BJJJJ9BJ9BJ9BB9BB9BJ9BJBBBBBBBBBBBB9BJJJJJJJJJJBBB99B99991991191999B99B1191111111119119119199199199999B99BB9BB9BB9BB9BB9BB9BBBBBB999B9BBBJJJJJRJRZJZcRZcZcsZk{Zk{Zk{Zk{Zc{RcsRc{Rc{Zk{Zk{Rc{Rc{Rc{Rc{RcsRcsRcsRc{Zc{Zc{Rc{Rc{RcsRcsRc{Rc{JZkJZkRc{RcsRZkRZkRcsZc{RcsRZkJZkJZkRZkRZcJZcJZkJZkJZkRZkRZkRZkRZkJZkJRcJRZJJZJRZJRZJJZJRZRZkZcsRRZRRZRRZRRZRRZRRZJJRJJRRZcZcsZcsZcsZcsZcsck{ck{ck{ck{ck{cs„ksŒksŒksŒksŒcs„cs„cs„ksŒc{Œc{Œcs„cs„cs„cs„cs„cs„Zk{Zk{Zk{ZcsZcsRZkZcsZcsZk{Zk{Zk{Zk{Zk{Zc{Rc{Rc{Rc{Rc{RcsRcsZc{Zc{Zk{ZcsRZkJZkRcsRcsRcsRZkRZkRcsRcsRcsRZkRZkRZkJZkJZkJZkJZkJRcBRcBRcBRcBRcJRcJRcJRcJZkBRcBRcBRcBRcBJZBJZBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR19J19J19J19B19B19B19B19B19B19J19J19J19B19B19B19B19B19B19B19B19B19B19B11911911911919B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBBB9BB9BB9BB9BJBJRBJRBJRJJRJJJJJJBBBBBB99991191999B9BJ99B999911911999B9991191199999B9BB9BB99B99B9BB9BB9BBB99BBBBBBB99B99BBBJJRJRZRZkRZcRZkZc{Zk{Zk{Zk{RcsRcsRc{Zk{Zk{Zk{Zc{Rc{Rc{Rc{Rc{RcsRcsJZkRcsRcsJZkRcsRcsRc{Rc{Rc{RcsRcsZc{ZcsRZkRZcRZkRZkRZkJZkRcsRcsRZkRZkJZkJZkJZkRZkRZkRZkRZkRZkRZkJRcJJRJJJJRZRRZJJRRRZRZcRZkRRZRRJRRJRRJRRJJJRJJJJJJRRZRZkZcsZcsZcsck{ZcsZcsck{ck{cs„ksŒksŒksŒksŒcs„cs„cs„cs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{ZcsRZkRZkZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{Zc{Zc{Zc{Zc{Zc{Zc{Rc{RcsJZkJZkRZkRZkRZcJZcJZcJZkJZkRZkRZkJZkJZkJZkJZkJZkJRcBRcBRcBRcJRcJRcJRcBRcBRcJZkJZkBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BJ19J19J19B19B19B19B19B19J19J19B19B19B19B19B19J19J19B19B19B19B11911911911911919B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB9BJBJRBJRBJRBJRBJRJJJJJJ9BJ9BJBBB99999B9BJ9BR9BJB99999911B99B9991191199999B9BB9BB9999999BB9BB9BBB99B99JB9JB9BBBBBBJJRJRZRZkRZkRZkZcsZk{Zk{Zk{ZcsRcsRc{Rc{Zk{Zk{Zk{Zc{Rc{Rc{Rc{Rc{JZkJZkJZkJZkJZkJZkRcsRc{Rc{RcsRcsRcsZc{Zc{RcsRZkRZkRZkJZkJZkRcsRcsRcsRZkRZkJZkRZkRZkRZkRZkRcsRcsJZkJRZJJJJJJRRJRRJRRJJJRRRZRZcRZcRRZJJRRRJRRJJJJJJJJJJJJRRZcZcsZk{ck{ck{ck{Zcsck{ck{ksŒk{”k{”ksŒksŒcs„ksŒksŒcs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zc{ZcsRZkRcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zk{Zk{Zk{Zc{Zc{Zc{Zc{RcsJZkJZkJZcRZcRZcJRcJRcJRcJZkJZkJZkJZkJZkJZkJZkJZcJZcJRcBRcJRcJRcJRcJRcBRcBRcJZkJZkBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BJ19J19J19J19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B11911911911919B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJR9BJ9BJ9BJ9BJBJRBJR9BJJJJJJJJJJ9BJ9BJJJJ9BJ99B9BJ9BRBJR9BJB9991191199999991991911999B9BBBBB9999999B99BBBBBBBBB99B91B99BBBJJJBJRJRZJRcRZkRcsZcsZk{Zk{Zk{Zc{Zc{Rc{Rc{RcsRcsZk{Zk{Rc{Rc{Rc{RcsRZkJZkJZkJZkJZkJZkRcsRcsRcsRcsRcsRcsRc{Rc{RcsJZkJZkJZkRcsRcsRcsRcsRcsRZkRZkRZkJZkJZkRZcRZkRc{RcsJZkJRZJJRRRJRRJJJRJJJJJJJJRRRZZZcRZcJJRRJBJJJJJJJJJJJRBJRJZcZcscs„cs„cs„ck{ck{cs„cs„cs„ksŒksŒksŒksŒksŒksŒksŒcs„cs„cs„cs„c{Œc{Œcs„ck{Zk{Zk{Zk{Zk{RcsRcsZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{ZcsZcsZk{Zk{Zk{Zc{Zc{Zc{Zc{ZcsRZkJRcJRZRZcRZcJRcJRcJRcJRcJZcJZkJZkJZkJZkJZkJZkJZkJZkJRcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBRcBRcBJZBJZBJR9BR9BR9BRBJZ9BR9BR9BR9BR19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B11911911911919B19B19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BJ9BJ9BJ9BJ9BJBJRBJR9BR9BJ9BJ9BJBJRBJR9BJBBB9BJ9BJ9BJJJJJJRJJR9BJ9BJBJR9BJ9BJB999119119999999199199999BBBBBBBB99B9999999BB9BJBBB999911B99BBBJJJBJRJRZJRcRZkZcsZk{Zk{Zk{Zk{Zk{Zc{Zk{Rc{JZkRcsZk{cs„Zk{Rc{Zk{RcsRZkJZkJZkJZkRcsRcsRcsRcsRZkRcsJZkRcsRc{Rc{RcsJZkJZkJZkRcsRcsRcsRcsRZkRZkRZkRZkRZkRZkRZkRZkRc{RcsJZkJRZJJRJJRRRJJJRJJJJJJJRJRRZRZkZZcJJRRJBJJJJJJJJRJRZJJZRZcZcscs„cs„c{Œcs„cs„cs„c{Œcs„cs„ksŒksŒksŒksŒksŒksŒcs„cs„cs„cs„c{Œcs„cs„ck{Zk{Zk{ZcsZcsRcsRcsZcsZcsZk{Zk{Zk{Zk{ZcsZcsZk{ZcsZcsZcsZcsZcsZk{Zk{Zk{Zc{Rc{ZcsZcsRZkJRcJRZRZcRZcJZcJRcJRcJRcJZcJZcJZkJZkJZkJZkJZkJZkJZkJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBRcBRcBJZBJR9BR9BJ9BJ9BR9BR9BR9BR9BR19J19J19J19J19J19J19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B19B119119)19)1919B19B19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ99B99B9BJ9BJ9BJ9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJJJJJJRJRZJJZBJR9BR9BJ9BJ9BJBBB999911B91999919999BBBJJJ9BJBBB9BB99999999B9BB9BBB99B91999BBB9BJJJRJRZJZcRZcRZkZk{Zk{Zk{Zk{Zc{Zc{Rc{Rc{RcsZc{Zk{cs„Zk{Zk{Zk{RcsJZkJZkJZkRcsRcsRcsRcsJZkJZkJZkRcsRcsRcsRcsRcsRcsJZkJZkRZkRZkRcsRcsJZcJZcJZcRZkRZkRcsRcsRcsRcsRcsRZcJRZJJZJJRJJRRRJRRJRRJRRJRRZRZkZZcRRZJJJJJJJJRJRZJRZJRcRZkZcsck{cs„c{Œcs„cs„cs„cs„cs„cs„ksŒksŒksŒksŒksŒksŒcs„cs„cs„cs„cs„cs„cs„cs„Zk{ZcsZcsZcsZcsZcsZk{Zk{Zk{Zk{Zk{Zc{RcsRcsZcsZcsZcsZcsRZkRcsZk{Zk{Zk{Rc{RcsRcsRcsRZkJZcJRcRZcRZcJZcJZcJZcJZcJZcJZcJZkJZkJRcJRcJZkJZkJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BRBJZBJZBJZ9BR9BR9BR9BJ19J19J9BR9BR9BR9BR19J19J19J19J19J19J19B19B19B19J19B)19)1919B19B19B19B19B19B19B19B119119)1919B19B19B19B19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ99B99B9BJ9BJ9BJ9BJBJRBJR9BJ9BJ9BJ9BR9BJJJJJJJJJJJJRJJRJJZBJZBJR9BJ9BJBBBBBBBBB999B91B91B9191199BJJJJJRJJJBBB9BB99999999B99B9BBB99B999B99BBJJJJJRJZcJZkRZcRZkZk{Zk{Zk{Zk{Zc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{RcsRcsRcsRcsRcsRcsRcsRcsJZkJZkRZkRcsRcsRcsRZkRZkRcsRcsRcsRZkRZkRcsJZkJRcJRcJRcRZkZcsZcsRcsRcsRcsRZkRZcJRcJRcJJZJJRRRJRRZRRZRRZRRZRZkRZkRRZJRZJRZRRZRZcRZkRZcRZkZcsZk{cs„cs„cs„cs„cs„cs„cs„c{Œc{ŒksŒksŒksŒcs„cs„cs„cs„cs„cs„ck{ck{cs„Zk{Zk{Zk{ZcsZcsZcsZk{Zk{Zk{ZcsZcsZc{Zc{RcsRcsZcsZcsZcsZcsRZkRZkZcsZk{Rc{Rc{RcsRcsRcsRcsRZkJZcRZcRZcJZkJZkJZkJZkJZcJZcJZkJRcJRcJRcJRcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BR9BRBJZBJZ9BR9BR9BR9BR9BR19J19J9BR9BR9BR1BR19J19J9BJ9BJ19J19J19B19B19B19J19B119)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J9BJ9BJ19J9BJ9BR9BR9BJ9BJ9BB9BJ9BJBJRBJRBJRBJRBJR9BJ9BJ9BRBJRBJRJJRBJRBJRBJRBJRBJRBJRBJR9BJBBBBBB999999B99B99B99B9999999BJJJJJRJJJBBB9BB99999999999B9BBBBBBBBBBB9BJJJJJJRJRcJZkRZkRcsZc{Zk{Rc{Rc{Zk{Zk{Zk{cs„cs„Zk{Zk{Rc{Zk{Rc{RcsJZkRc{Rc{RcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRZkRZkRZkRZkRcsRcsRZkRZkRZkJZkJRcJRcJZcRZkRZkZcsRcsRcsRcsRZkJZkJZcJZcRRZJJRJJRRRZRRZJJRJRZZZcRZkRZcRRcRRcRZcRZkZcsRZkZcsZcsZcsck{cs„cs„ksŒc{Œc{ŒksŒksŒc{Œc{ŒksŒcs„ck{ck{cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{cs„cs„Zk{Zk{Zk{Zk{ZcsZcsZcsZc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsZcsZcsZcsZcsRc{Rc{Rc{Rc{Rc{RcsRZkRZcJZcJZkJZkJZkJZkJZkJZcJZcJZcJZcJRcJRcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR19J19J19J9BJ9BJ9BR9BJ19B19B11911919B19B19B19B19B19B19J19J19B19B19B19J19B19B19B19B19B19B19B19B19J19J9BJ9BJ19J19J9BR9BR9BJ9BJ9BJJJJBJRBJRBJRBJRBJRBJR9BJ9BJBJRBJRJJRJJRBJRBJRBJR9BJ9BJ9BJ9BJ9BJBBBBBB999919B99B99B99B99999BBB9BJJJJ9BJBBB9BB9B999B99B9BB9BJ9BJ9BJ9BJBJRJJRJRZJZcRZkRZkZcsZcsZc{Zk{Zk{Zk{Zk{Zk{c{Œc{Œcs„Rc{Rc{Rc{Rc{RcsRcsRc{Rc{RcsRcsRcsRcsRcsRcsRcsRcsRcsRcsRZkRZkJZkRZkRcsZcsRc{RcsJZkJZcJZcJZcJZcJZkRZkRcsRcsRcsRcsRcsJZkJZkRZkRZcRRJJJRRRZRRZJJRJJRRZcRZkRZkRZcRZcRZkZcsZcsZcsZcsZcsck{ck{cs„cs„cs„cs„cs„c{ŒksŒc{Œc{ŒksŒcs„ZcsZcscs„cs„ck{ck{cs„cs„Zk{Zk{cs„c{Œc{Œcs„Zk{Zk{Zk{ZcsRcsRcsZcsZc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsZcsZcsZcsRc{Rc{Rc{Rc{Rc{RcsRZkRZkJZkJZkJZkJZkJZkJZkJZcJZcJZcJZcJZcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J19J9BJ9BJ9BR9BR19J19B11911919B19B19B19B19B19B19J19J19B19B19J19J19B19B19B19B19B19J19J19J19J19J9BJ9BJ19J1BR9BR9BJ9BJ9BJ9BJJJJBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRJJRJJJ9BJBBBBBB9BJ9BJ9BJBBB99B999B99B99B99B99BBBBBBBBB9BJ9BB9BBBBBBBBBBBBBB9BJJJJJJJBJRBJRBJRJRZRZcRZkRcsRZkZcsZcsZcscs„Zk{Zk{Zk{Zk{Zk{cs„Zk{Zk{Rc{Rc{Rc{Rc{RcsRcsRcsRcsRcsRZkJZkJZkRZkRcsZcsRc{Rc{RcsRZkRZkRZkRZkZcsZk{Zk{RZkJZkRZkRZkJZcJZcRZkRcsRcsRcsRcsRcsRZkRZkRZkRZcJJRRRJRRZRRJJJRJJRRRZRZcRZkRZkJZcRZkRZkZcsZcsck{ck{cs„cs„cs„cs„ck{Zk{Zk{cs„c{ŒksŒksŒc{Œcs„Zk{Zcsck{ck{ck{ck{cs„cs„Zk{Zk{c{Œc{Œc{ŒZk{Zk{Zk{Zk{ZcsRcsRZkZcsZcsZcsZcsZc{Zc{Rc{Rc{Zc{ZcsRcsRcsRc{Rc{RcsRcsRcsRcsRcsRcsRcsRZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BJ19J19J9BR9BR9BR19J19J19J9BJ9BR9BR9BJ19J19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BJ19J9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRBJRBJRBJR9BJBJRBJRJJRJJJJJJBBBBBBBBBBBB9BJ9BJ9BJ9BB99BB99B99999999BBBBBB9BB9BB9BB9BJ9BJJJJJJJJJJBJRJJRJJRJJRBJRBJZJRcRZkRZkRcsRZkRZkZcsZk{cs„Zk{Zk{Zc{Rc{Rc{Zk{Zk{Zk{Rc{Rc{Rc{Rc{Rc{JZkJZkRcsRcsJZkJZkJZkRZkRZkRcsRc{Rc{RcsRcsRcsRcsRcsZcsZk{Zk{RcsJZkRZkRZkJZcJZcRZkRcsRcsRcsRcsRcsRZkRZkRZkRZcJRZJRZRRZJRZJJRJJRJRZRZcRZkRcsRZkZcsZcsZcsck{ck{ck{cs„ksŒksŒcs„cs„ck{ck{cs„cs„ksŒcs„cs„Zk{Zk{ZcsZk{ck{ck{ck{cs„c{ŒZk{cs„c{Œcs„Zk{Zk{Zk{Zk{Zc{ZcsRcsRZkZcsZcsRcsRcsZc{Zc{Rc{Zk{Zk{Zc{ZcsRcsRc{Rc{RcsJZkRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BR9BJ9BR9BR9BR9BJ19J19B19J9BJ9BR9BR9BJ19J19J9BJ9BR9BR9BR19J19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19J19J19J19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJJJJJJJ9BJ9BJBBB9BB9BBBBB9BJ9BJ9BJ9BBBBBBBBB999B999999999B99B9BJ9BJ9BJ9BJJJJJJRJJRJRZJRZJRZJRZJJRJJRJRcRZkRZkRZkRZkRZkZcsZk{Zk{Zk{Zc{Zc{Rc{Rc{Zk{Zk{Zk{Rc{RcsRcsRc{Rc{JZkJZkRcsRcsRcsRZkRZkRZkRcsRcsRcsRcsRcsRcsRc{Rc{RcsRcsZcsRcsRcsJZkJRcJRcJRcRZkRcsRcsRcsRcsRcsRcsRcsRZkJZkJRcRRcRRZJRZJRZJRZRRZJRZRZcZcsck{ck{ck{ck{ck{ck{ck{Zk{ck{c{Œc{Œc{Œcs„cs„cs„cs„cs„cs„cs„Zk{ZcsZc{Zk{Zk{Zk{ZcsZk{cs„c{Œcs„cs„cs„Zk{Zk{Zk{Zk{Zc{ZcsZcsRcsRcsZcsZc{ZcsZc{Zc{Zc{Zc{Zk{Zc{Zc{Zc{Zc{Rc{Rc{Rc{RcsRcsRcsRcsRcsRcsRcsJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkJZkJZkBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BJ9BR9BR9BR19J99B99B9BJ9BJ19J9BJ9BJ9BJ9BJ9BR9BR9BR9BR19J19B19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B19B19J19J19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJJJJ9BJ9BJBBBBBB9BB9BJJJJ9BJ9BR9BJBBBBBBBBBBBB9BB9B999999999B9BB9BJ9BJJJJJJRJJRJRZJRZJRZJRcJRZJJRJJRJRZJZcRZcRZcRZkRZkRcsZc{Rc{Rc{Zk{Zk{Zk{Rc{Rc{RcsRc{RcsRcsRcsRc{Rc{RcsRcsRcsRcsRcsRZkRZkRZkRZkRcsRZkRZkRZkRcsRc{Rc{RcsRcsRcsRcsRcsJZkJRcJRcJZkRZkRcsRcsRcsRcsRcsRcsZcsRcsRcsJZkRZkRRcJRZJRZRRcRRcRRcRZkck{cs„cs„cs„ck{ck{ck{Zk{ZcsZcscs„c{Œc{Œc{ŒksŒksŒcs„ck{ck{ZcsZcsZcsZcsZc{Zk{Zk{ZcsZk{cs„c{Œc{Œcs„Zk{Zk{Zk{Zk{Zc{Zc{ZcsZcsRcsRcsZc{Zc{Zk{Zc{Zc{Zc{Zc{Zc{Rc{Rc{Zc{Zc{Rc{Rc{Zc{RcsJZkJZkRcsRcsRcsJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkJZkJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZ9BR9BR9BRBJZ9BR9BR9BJ9BR9BR9BJ19J99B9BB9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BR9BR9BJ19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B11919B19B19B19J19J19B19B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRBJR9BJBBBBBB9BB9BJJJRBJR9BR9BJBBBBBBBBB9BB9BB99B9999999B99BB9BB9BJJJJJJRBJRBJZJJRRRZRZcJRcJJRJJJJJRJJRRRZRZcJZkJZkRcsZcsZc{Zk{Zk{cs„Zk{Rc{RcsJZkJZkRcsRc{Rc{Rc{Rc{RcsRc{Rc{Rc{RZkJZcJZkJZkJZkJZkJZkJZkRZkRZkRcsRcsJZkRcsRc{Rc{RcsJZkRZkRZkJZkJZkRcsRcsJZkRcsRcsZcsZc{Zc{Rc{RcsRZkJZcJRZJRZJRcRRcRRcZcsck{c{Œcs„cs„cs„ck{ZcsZcsZcsZcsZcsck{cs„ksŒksŒcs„ck{ck{ck{ck{ZcsZk{ZcsZcsZk{ck{ck{ck{cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{ZcsZcsRcsRc{Zk{Zk{Zk{Rc{Zc{Zc{ZcsRcsRcsRcsRcsRcsRcsRcsRcsRcsJZkJZkRcsRcsRcsJZkJZkJRcJRcJRcJZkJZkJRcJRcJRcJRcBRcBRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J9BJ9BJ19J19J19B19B19J19J19B19B19B19J19J19B19B19B19B19J11911919B19B19B19B19B19B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJR9BJ9BJ9BJBJRBJRBJRBJRBJRBJRBJR9BJBBB9BJBJRJJZBJZ9BJ99BBBBBBB9BB9BB9BB99B99B9999999B99BB9BJJJRJJRBJRBJRJJRJRZRZcRZcJRZJJRJJRJJRRRZRZcJZkRcsRcsRcsZcsZk{Zk{cs„Zk{Rc{RcsJZkJZkRcsRc{Rc{Rc{Rc{Rc{Rc{Rc{Rc{RZkJZcJZkJZkJZcJZcJZcJZcJZcJZkRZkRcsJZkRcsRc{RcsJZkJZkRcsRcsRZkJZkRcsRcsJZkJZkRZkRcsZcsZk{Zk{Rc{RcsJZcJRcJRZRRcRZcRZkZcscs„c{Œc{Œcs„cs„ck{ZcsRZkRZcZZcZcsck{cs„ksŒksŒcs„ck{ZcsZcsZcsZcsZk{ZcsZcsZk{ck{ck{ck{cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{ZcsZcsRcsZc{Zk{Zk{Rc{Rc{Zk{Zc{ZcsRcsJZkJZkRcsRcsRcsZcsZcsRcsRcsJZkRcsRcsRcsJZkJZkJZkJRcJRcJZkJZkJRcJRcJRcJRcBRcBRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR9BR9BJ9BJ9BJ9BJ19J19J19J19J19J19J19B19B19B19J19J19B19B19J19J19J19B19B19B19J19J19B19B19B19B19B19B19B19B19J9BJ19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRBJR9BJJJJJJRJJZBJZBJR9BJ9BBBBBBBB99B9BB9B99BB99B99B99999999B9BJJRZJRZBJR9BJBJRJRZRZkRZkJRZJJZJRZRRZJRZRZcRZkRcsRZkRZkZcsZk{Zk{Zk{Zc{Rc{Rc{RcsJZkJZkJZkRcsRc{Rc{Rc{Rc{Rc{Rc{RcsJZkJZkJZkRZcRZcJZcJRcBJZJRcJZkRcsRcsRcsRcsJZkJZkJZkRcsRcsRcsRcsRcsRcsRcsRcsRZkRZkZcsZcsZk{Rc{RcsJZkJZcJZcRZcRZcZcsZc{cs„c{Œc{Œcs„Zk{ZcsZcsZcsRZcRZcZcsZk{cs„c{ŒksŒcs„ck{ZcsZcsZcsZcsZcsZk{Zk{ZcsZcsck{ck{ck{ck{cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{ZcsZcsZcsRc{Rc{Zc{Zc{Zk{Zk{ZcsRcsRcsRcsRZkRcsZcsZc{Zc{RcsRcsJZkRcsJZkJZkJZkRZkRZkJZkJZkJZkJZkJRcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J9BJ9BR9BR9BR9BR9BR9BJ9BJ19J19J19J19J19J19B19B19B19J19J19J19J19J19J19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BJ9BJBJRBJRBJRBJRBJR9BJ9BJJJJJJRBJRBJR9BJ9BB99BB9999B99B99B9B999999999999999999BBJRJRcJRcJJJBBB9BJJRZRZkRZkJZcJRcRZcRZcJZcRZkRcsRcsRZkRZkZcsZk{Zc{Zc{Zc{Zk{Zk{Rc{RcsJZkJZkRcsRc{Rc{Rc{Rc{Rc{RcsRcsRcsJZkJRcRZcRZcJRcJRcBJZBRcJZkRcsRcsRZkJZkJZkJZkJZkRZkRcsRcsRcsRcsRcsRcsRcsJZkRZkRZkZcsZc{Zc{RcsRcsRZkRZkRZcZcsZk{Zk{cs„cs„cs„cs„Zk{Zcsck{ZcsRRZRRZZcsck{cs„c{ŒksŒcs„ck{ZcsZcsZcsZcsZcsZk{Zk{ZcsZcsck{cs„ck{cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{RcsZcsZcsZcsRc{Zc{Zk{Zk{Zk{ZcsZcsRcsRcsRZkZcsZc{Zc{Zc{RcsRcsJZkJZkJZkJZkRZkRZkRZkJZkJZkJZkJRcJRcJRcJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR1BR19J9BJ9BJ9BR9BRBJR9BR9BJ9BJ19J19J19J19J19J19J19B19B19B19J19J19J19J19B19B19B19B19B19B19J19B19B19B19B19B19B19J19J19B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJR9BJ9BJ9BJBJRJJJ9BJ9BJ99B119119919919999999999919111111999BBB9BBBJRJRcJRcJJJBBB9BJJRZRZkZcsRZkRZcRZcRZcRZkRcsZc{ZcsRZkRZkZcsZk{Rc{Zk{Zk{Zk{Zk{Rc{JZkJZkRc{Rc{RcsZcsZk{Zk{RcsRcsRcsRZkJZkJRcJRcJRcJRcJRcBRcJRcRZkRZkRZkJZkJZkJZkJZkJZkJZkJZkJZkRZkRZkRZkRcsRcsRcsRcsRcsZcsZc{Zc{Zc{RcsRcsRZkZcsZk{Zk{cs„cs„ck{cs„ck{Zk{Zcsck{ZcsRRZZZcck{cs„cs„ksŒksŒcs„ck{ck{ZcsZcsZcsZcsZk{ZcsZcsZcsck{cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{ZcsRcsRcsZc{Zc{ZcsZcsZk{Zk{ck{ck{ZcsRZkRZkRZkRZkZcsZc{Zc{RcsRcsJZkJZkJZkJZkRcsRZkRZkJZkBRcBRcJZcJZcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BJ9BR9BR9BR1BR19J9BR9BR9BR9BRBJZ9BR9BJ19J19J19J19J19J9BJ9BJ9BJ19J19B19B19B19B19B19B)1919B19J19J19B19B19B19B19B19B11919B19B19J19B19B19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJR9BJ9BB9BB9BJBJRJJJ9BJ9BJ9BB119119119999999999919111111111999BBBBBBBJRJZcJZkBJR9BJJJJRRZRZcZcsRZkRZkRZkRZkZcsZc{Zc{ZcsRZkRZcRcsZc{Rc{Zk{Zk{Zk{Zk{Rc{RcsRcsRc{Rc{RcsRcsZk{Zk{RcsRcsRZkRZkRZcJZcJZcJRcJRcJRcBJZBRcRZcRZkJZkJZkJZkJZkJZkJZkJZcJZcJZcJZcJZcJZkRcsRcsRcsRcsRcsRcsRcsZc{Zc{Zc{ZcsZcsZk{cs„cs„cs„cs„ck{ck{ck{Zk{ZcsZcsZZcZZcZZcck{cs„cs„ksŒksŒcs„ck{ck{ZcsZcsZcsZk{ZcsZcsZcsZcsck{cs„c{Œcs„Zk{Zk{Zk{Zk{Zk{Zk{ZcsZcsZcsRcsZc{Zc{ZcsZcsZcsZk{ck{ck{ZcsRZkRZkRZkRZkRcsZc{Zc{RcsJZkJZkJZkJZkJZkRcsRZkJZkJRcJRcJRcJZcJZcJRcBRcBRcBRcBRcBRcBRcBRcBRcJRcJRcBRcBJZBJZ9BR9BRBJZBJZBJZBJZBJZ9BR9BJ9BR9BR9BR9BR9BJ9BR9BR9BR9BRBJZ9BR9BJ19J19J19J19J19J9BJ9BJ9BJ19B19B19B19B19B19B19B)1919B19J19J19B19B19B19B)19)1911911919B19B19B19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJJJJBJRJJJJJJ9BB99B11999B99B999919919911911911999999BBBJJJRZcRZkJRZBJRJJRJRZRZcZcsRZkRcsZcsZc{Zc{Zc{Zc{RcsRZcJRcRZkRcsRc{Zk{Zk{cs„Zk{Zk{Zc{RcsRc{Rc{RcsRcsRc{Zk{ZcsZcsRZkRZkJZcJZcJZkJRcJRcJRZBJRBJZJZcRZkRcsJZkJRcJRcJZkJZkJRcJRcJRcJRcJRcJZcRcsRcsRZkRZkRZkRcsRcsRcsZc{Zc{Zc{Zk{Zk{c{Œc{Œcs„Zk{Zk{Zk{Zk{Zk{ZcsZcsZZcZZcZcsck{cs„cs„c{Œc{Œc{ŒZk{Zcsck{ck{Zc{Zc{ZcsZcsZcsZk{ck{cs„c{Œc{ŒZk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{ZcsRcsRcsZcsZcsZcsZk{Zk{Zk{ZcsZcsRZkRZkJZkRcsZc{Zc{RcsJZkRZkRZkJZkJZkJZkJZkJZkJZkJZcJZcJZcJZcJZcJRcBRcBRcBRcBRcBRcJRcJRcJZkJZkJRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BR9BR9BR9BR9BR9BR9BJ19B19B19J19J9BJ19J19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B)19)1911911911919B19B19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJBBB9BJJJRJJRJJJ9BJ9BB9BB9BJ9BB99991999999999999999999BBBBBJRJZcRZkJZcJRZJRZRRZRZkRcsRZkRcsZcsZc{Zc{Zc{Zc{ZcsRZkJZkRcsRcsRc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Rc{RcsRcsRc{Zc{ZcsRZkRZkRZkJZcJZkJZkJZkJRcBJZBJRBJZJZcRZkRcsRcsJZcJRcJZkJZkJRcJRcJRcJRcJRcJZcRZkRcsRZkRZkRZkRZkRZkRcsRcsZcsZc{Zk{Zk{c{Œc{Œc{Œcs„Zk{cs„cs„ck{ck{ZcsZcsZcsck{ck{cs„cs„cs„cs„cs„Zk{ck{ck{ZcsZc{Zc{Zk{Zk{Zk{Zk{Zk{cs„c{Œc{ŒZk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{Zc{RcsRcsZcsZcsZk{Zk{Zk{ZcsZcsRZkRZkRZkJZkRcsRcsRcsRcsJZkRZkRZkRZkJZkJZkJZkJZkJZkJZcJZcJZcJZcJZcJZcJRcBRcBRcBRcBRcJRcJZkRZkRZkJZkBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR19J19J9BR9BR9BJ9BJ9BR9BJ19B19B19J19J19J19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BR9BJ9BJ9BJ9BR9BJ9BJ9BJ9BB9BJJJRJJR9BJ9BJ9BJ9BJ9BJ99B99999999B9BB99B99999B9BB9BJBJRJRZJZcJZcRZcRZcRZcZcsZcsRZkRZkRZkZcsZc{Zc{Zk{Zc{Rc{Rc{Rc{Zc{Zc{Zk{Zk{Rc{Rc{Zk{Zk{Zk{Zk{Rc{Zc{Zc{Zc{Zc{RcsRcsRcsRZkJZkJZkRZkRZcJRcBJZBJRBJZJRcRZkRcsRcsJZkJZkRZkJZkJZkJRcJRcJZcJZcRZkRZkRZkJZcJZcRZkRZkRZkRZkRZkRZkZcsZk{Zk{cs„c{Œc{Œc{Œcs„c{Œc{Œc{Œcs„ZcsZcsZcsck{ck{cs„cs„cs„Zk{Zcsck{ck{ck{ZcsZcsZcsZk{ck{cs„cs„c{Œc{Œc{Œcs„Zk{Zk{cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Rc{RcsZcsZk{Zk{Zk{ZcsZcsZcsRcsRZkRZkJZcRZkRcsRcsRZkRZkRZkRZkRZkRZkJZkJZkRcsRZkJZcJRcJRcJRcJZkJZkJRcBRcBRcBRcBRcJRcJZkRZkRZkJZkBRcBJZBJZ9BRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR19J19J9BR9BRBJZ9BR9BJ9BR19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19B19B19B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJBBB9BB9BJJJJBJR9BJ9BJ9BJ9BJ9BJ9BJ99B999BBB9BB9BB9BB9BB9BJBJRBJZJRZJZcRZcRZkRZcRZkZc{Zc{ZcsRZkRZkRcsZcsZc{ZcsRc{Rc{Zk{Zk{Zc{Zc{Zc{Rc{Rc{Rc{Zk{Zk{Zk{Rc{RcsRcsZcsZc{RcsRcsJZkRcsRcsJZkJZkRZkRZkJZkBRcBJZBRcJZkRZkRcsRZkRZkJZkRcsRcsJZkJZkJZkRZkRZkRZkRZkRZcJZcJZcJZcRZcRZcJZcJZcJZkRcsZk{Zk{cs„c{Œc{Œc{Œc{Œc{Œc{ŒksŒcs„ck{ck{ck{ck{ck{cs„c{Œcs„ZcsZcsck{cs„ck{ZcsZcsZcsck{cs„cs„c{Œc{Œc{Œcs„cs„Zk{cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Rc{Rc{Zk{Zk{Zk{Zk{ZcsZcsRcsRcsRZkRZkJZcRZkRZkRcsRZkRZkRZkRZkRZkRZcJZkRZkRcsRZkJRcJRZBRcBRcJZkJRcBRcBJZBRcBRcBRcJRcJZkJZkJZkJRcBJZBJR9BR9BRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR19J19J9BR9BRBJZBJR9BR19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB9BJ9BJJJJ9BJ9BJ9BJ9BB9BJ9BR9BJ99B999BBBBBBBBBBBB9BJJJJJJRJRZJRcJZcRZkRZkRZcRZkZcsZk{Zk{ZcsRcsRcsRcsRcsRZkRZkZcsZk{Zc{Zc{Zc{Zk{Rc{Rc{cs„Zk{Zk{Rc{RcsJZkRZkRZkRcsRcsRc{Rc{RcsRZkJZkJZkJZkJZkJZkJZkJRcJZcJZkJZkRZkRZkJZkJZkRcsRcsJZkJZkRcsRcsRcsRZkJZkJZcRZcRZcJRcJRcJRcJZcJZkRcsZc{Zk{Zk{cs„c{Œc{Œc{Œk{”k{”k{”c{Œcs„cs„ck{cs„cs„cs„cs„c{Œcs„ck{ck{cs„cs„cs„cs„Zk{ck{ck{cs„c{Œc{Œcs„cs„cs„cs„c{Œc{Œc{Œc{Œcs„Zk{Zk{Zk{Zc{Zc{Rc{Rc{Zk{Zk{Zk{Zc{ZcsRcsRcsRcsRZkRZkJZkJZkRcsRcsRcsRcsRcsJZkJZcJRcJZcJZkRZkJZcJRcJRZBRcBRcJRcBRcBJZBJZBRcBRcBRcJRcJZkJZkJZkJZkBJZBJR9BR9BRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR19J19J9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJR9BJ9BJBJRBJRBBB999BBBBBBBBB9BJJJJJJRJJRJRZJZcRZkRZkRZkRZkRZkRcsZc{Zc{ZcsRcsRcsRcsJZkJZkRZkRZkZcsZcsZc{Zc{Zc{Rc{Zk{cs„Zk{Rc{Rc{RcsJZkJZkJZkJZkRcsRc{Rc{RcsRcsRZkJZkJZkJZkJZkRcsRZkRZkJZkJZkJZkJZkRZkRZkRcsRcsJZkJZkRcsRcsRcsRcsJZkJZcRZcRZcBRcBRcJRcJZkJZkRcsRcsZk{Zk{cs„c{Œc{Œc{Œk{”k{”k{”c{Œcs„cs„ck{cs„ksŒksŒksŒc{Œc{Œcs„cs„cs„cs„c{Œcs„cs„cs„ck{cs„cs„c{Œcs„cs„cs„cs„c{Œc{Œc{Œc{Œcs„ck{Zk{Zk{Zc{Zc{Rc{Rc{Zk{Zk{Zc{Zc{RcsRcsRcsRcsRcsRZkRZkJZkRcsRcsZcsRcsRcsJZkJZkJRcJZcJZcJZcJRcJRZJRZBRcBRcBRcBJZBJZBJZBJZBRcBRcBRcJRcJZkJZkBRcBJZ9BR9BR9BRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR19J19J9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRJJZBJRBBB99999B9BB9BB9BJJJJJJJJJJJJRJRcRZkRcsRcsRcsRcsRcsRcsRcsRZkRcsRZkRZkJZkRZcRZkRcsRcsRcsRcsRcsRcsRc{Zk{Zk{Rc{Rc{Rc{Zc{RcsRcsJZkRc{Rc{RcsRcsRc{Rc{RZkJZkJZkJZkJZkRZkRcsRcsJZkJZkJZkRcsRcsRcsRcsJZkJZkJZkJZkJZkRcsRcsJZkJZcJZcJZcJRcJRcJZkRcsJZkJZkRcsRcsZk{cs„c{Œc{Œc{Œc{Œc{Œc{Œc{Œcs„Zk{Zk{cs„c{ŒksŒksŒc{Œc{Œcs„ck{ck{cs„cs„cs„cs„cs„ck{ck{cs„cs„cs„cs„cs„cs„cs„c{Œc{Œc{Œcs„ck{Zk{Zk{Zk{Rc{Rc{Rc{Zk{Zc{Zc{Rc{Rc{RcsRcsRcsRcsRZkRZkRZkJZkRcsZc{Zc{RcsJZkJZkRZkJZkJZcJZcJRcJRcBRcBRcBRcJRcJRcBRcBJZBJZBJZBRcBRcBRcJRcJRcBRcBJZBJZ9BR9BRBJZBJZBJZ9BR9BR9BR9BR9BR9BJ9BJ9BJ19J19J19J9BJ9BR9BR9BR9BJ19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJBJRBJRBJRBJZBJZJJZBJRBBB9999BB9BB9BB9BJ9BJJJJJJJBJRJRZJZkRZkRcsRcsRcsRcsJZkJRcJZcRZkRZkRZcJZcRRZRZcRZkRcsRcsRcsRZkRcsZc{Zc{Rc{Rc{Rc{Zk{Zc{RcsJZkJZkRcsRcsRcsRcsRc{Rc{RcsRZkRZkJZkJZkJZkRcsRcsRZkJZkJZkRcsRc{Rc{RcsJZkJZkJZkJZkRZkRcsRcsRZkJZkJZcJZcJRcJZcRZkRcsRcsJZkRZkRcsZk{cs„c{Œc{Œc{Œc{Œc{Œc{Œc{Œcs„Zk{Zk{Zk{c{ŒksŒksŒc{Œcs„cs„ck{ck{ck{cs„cs„cs„cs„ck{ck{ck{cs„cs„cs„cs„cs„cs„c{Œc{Œc{Œcs„ck{Zk{Zk{Rc{Rc{Rc{Zk{Zc{Zc{Rc{Rc{Rc{RcsRcsRcsRcsRcsRZkRZkJZkRcsRc{Rc{RcsJZkRcsRZkJZkJZcJRcBRcBRcBRcBRcBRcJRcJRcBRcBRcBJZBJZBRcBRcBRcBRcBRcBJZBJZBJZ9BR9BRBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ19J19J9BJ9BJ9BJ9BR9BR9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BRBJRBJRBJRBJRBJRBJRBJRJJJ9BJBBBBBB9BJBJRBJZBJZBJZBJR9BJ9BB9B99B9BBB9BJ9BJJJJJJJBJRJRZJRcRZkRcsRcsRcsRZkJZcJRZJRZJZcRZkRZcRRZJJRJRZRZcRZkRcsRcsRZkRcsZc{Zk{Rc{Rc{Zk{Zc{RZkJZkJZkJZkJZkRcsRcsRc{RcsRcsRcsRcsRcsJZkJZkJZkRcsRcsRcsRZkJZkJZkRcsRcsRcsRcsJZkJZkRcsRcsRcsRcsRcsRZkJZcJRcJZcJZcJZkRZkRcsRcsRcsRcsZk{cs„c{Œc{Œc{Œk{”k{”k{”c{Œcs„Zk{Zk{cs„c{ŒksŒksŒc{Œcs„cs„ck{ck{cs„cs„cs„cs„ck{ck{ck{Zk{Zk{Zk{cs„c{Œc{Œc{Œc{Œc{Œc{Œcs„cs„Zk{Zc{Rc{Rc{Zk{Zk{ZcsRcsRcsRcsZcsZcsRcsRcsRcsRcsRcsJZkJZkJZkRcsRcsRcsRcsRZkJZkJZcJZcBRcBRcJRcJRcBRcBRcBRcBRcBRcBRcBJZBJZBRcBRcBRcBRcBJZBJZBJZBJZ9BR9BR9BRBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR19J19J9BJ9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BRBJRBJRBJRBJRBJRBJRBJR9BJBBBBBBBBBBBBBJRBJZBJZBJZBJRBJRJJJ9BB9B9BBB9BJ9BJ9BJJJJJJRJRZJRcRZcRZkRcsJZkJZcJRZJJRJJZJRcRZcRRZJJRJJJJJRRRZRZkRcsRcsRZkRcsRcsRc{Rc{Zk{Zc{RcsJZcJRcJZkJZkJZkRZkZc{Zc{RcsRZkRcsRcsRcsJZkJZkJZkJZkRcsRcsRcsRZkJZkJZkJZkRcsRcsRcsRcsRcsRcsRcsRcsRcsRZkJRcJRcJZcJZkJZcJZkRcsRcsRcsZcsZk{Zk{c{Œc{Œk{”k{”k{”k{”c{Œcs„Zk{Zk{cs„c{Œc{ŒksŒcs„cs„ck{ck{ck{cs„cs„cs„ck{ck{ck{ck{Zk{Zk{cs„c{Œc{Œc{Œc{Œcs„cs„cs„cs„Zk{Zc{Zc{Rc{Zk{Zk{Zk{RcsRcsRcsZcsZcsZcsZcsRcsRcsRcsRcsJZkJZkJZkJZkJZkRcsRZkJZcJZcJZcJRcBRcBRcJRcJRcBRcBRcBRcBRcBRcBJZBJZBJZBRcBRcBRcBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR19J19J19J9BJ9BJ9BJ19J19J19J19J19J19J19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRBJRBJR9BJ9BJBBBB99BBB9BJBJRJJZJJZBJRBJRJJRJJJBBB9BB9BJ9BJ9BJ9BJJJJJJRJRZJZcRZkRZkJZkJZkJRZJJRJJRJJRRRZRRZJJRJJJJJJJJRRZcRZkJZkRcsRcsRcsRcsRcsZc{Zc{RcsJZkJZcJZcRZkJZkJZkJZkRc{Rc{RcsRZkRZkJZkJZcJZkJZkJZkJZkRcsRcsRcsRcsJZkJZkJZkJZkRcsRcsRcsRZkRZkRZkRZkRZkRZkJZkJRcJZkJZkJZcJZkRZkRcsRcsRcsRc{Zk{cs„c{Œc{Œc{Œc{Œc{Œcs„Zk{ck{ck{cs„cs„c{Œcs„cs„ck{ck{ck{ck{ck{ck{ck{ZcsZcsck{ck{ck{Zk{cs„c{Œc{Œc{ŒZk{ZcsZcsZcsZc{Zk{Zk{Zk{Zk{Zk{Zk{Rc{RcsRcsZcsZcsZcsZcsZc{Zc{RcsRcsRcsJZkJZkJZcJZkRZkRZkJZkJZcJZcJZkJZkBRcBRcJRcJRcBRcBRcBRcBRcBJZBJZBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR19J9BJ9BJ9BJ9BR9BR9BR9BR19J19J19J19J9BJ9BR9BR9BJ19J19J19J19J19J19B19B19B19B19J19J19B19B19B19B19B)19)19)1919B19B19B19B19B19B19J19J19B19B19B19B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJRBJRBJRBJR9BJBBBBBBBBB9BJBJRBJZJJZJJZBJRBJRJJRJJJ9BJ9BJ9BJ9BJ9BJJJJBJRJRZJZcRZkRZkRZkRZkJZcJJRJJJJJJJJRRRZRRZJJRJJRJJRJRZRZcRZkJZkJZkJZkRcsJZkRcsRcsZcsRcsJZkJZkJZkRZkRcsRcsRcsRc{Rc{RcsRcsRZkJZkJZcJZkJZkJZkJZkJZkRcsRcsRcsRZkJZkJZkJZkJZkRcsRcsJZkJZkRZkRZkRZkRZkJZkJZkJZkRZkRZkRZkRcsRcsRZkRcsRcsZk{cs„c{Œc{Œc{Œc{Œc{ŒZk{Zk{ck{ck{ck{cs„cs„cs„cs„ck{Zk{Zk{Zk{ck{ck{ck{Zk{Zk{ck{cs„ck{cs„cs„cs„c{ŒZk{Zk{ZcsZcsZcsZcsZc{Zk{Zk{Zk{Zk{Rc{Rc{RcsRcsZc{Zc{RcsRcsZc{Zc{RcsRcsRcsJZkJRcJRcRZcRZkJZkJZkJZcJZcJZkBRkBRcBRcJRcJRcBRcBRcBRcBJZBJZBJZBJZBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR19J19J9BJ9BJ9BJ9BJ9BR9BR19J19J19J19J19J9BJ9BR9BR9BJ19J19J19J19J19B19B19B19B19B19J19J19B19B19B19B)19)19)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJR9BJ9BJ99B99BBBB9BJBJRBJZBJZBJZBJZBJRJJJJJJ9BJ9BJ9BJ9BJJJJJJRBJRBJZJRcRZkRZkRcsRcsRZcBJRBBBJJJRRJRRZRRZJRZBJZBJZJRZRZkRZkRZkJZkJZkJZkRZkRcsRcsRcsRcsRcsRcsJZkJZkJZkRc{Rc{Zc{Zc{Rc{Rc{RcsRZkRcsJZkJZkJZkJZcJZkRcsRcsRZkJZcJZcJZkJZkJZkJZkRcsRZkRZkRZkRcsRcsRcsRcsRcsRZkRcsRcsRcsRcsRZkRZkRZkRcsRc{cs„c{Œc{Œc{Œc{Œc{Œc{ŒZk{ZcsZcsck{cs„cs„cs„cs„cs„Zk{Zk{Zcsck{ck{cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{ZcsZcsZcsZk{Zk{Zc{Zc{Zc{Zc{Rc{Rc{Rc{Rc{Zk{Zk{RcsRcsZcsZcsRcsRcsRZkJZkJRcJRcRZkRZkJZkJZcJZcJZcJRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBRcBRcBJZBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BJ9BJ9BJ9BJ9BR9BR9BR19J19J19J19J19J9BJ9BJ9BJ9BJ19J19J19J19J19B19B19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJRBJR9BJ99B99B9BB9BJBJRBJRBJZBJZBJZBJZBJR9BJ9BJ9BJ9BJ9BJJJJJJRJJRBJRBJZJRcRZkRcsRcsRcsJZcBJR9BJJJJJJRRRZRZcJZcJZkJZkJZkRZkRZkRZkJZkJZkRZkRZkRZkRZkRZkRcsRcsRcsRcsRZkRcsRc{Zk{Zc{Zc{Zk{Rc{RcsRcsJZkJZkJZkJRcJZcJZkRZkRZkJZkJZcJZkJZkJZkJZkJZkJZkRZkRZkRcsRcsRcsRcsRcsRcsRcsZcsZk{Zk{ZcsRcsRZkRcsRc{Zk{Zk{c{Œc{Œc{Œc{Œc{Œc{ŒZk{ZcsZcsck{cs„cs„cs„c{Œc{Œcs„Zk{Zk{ZcsZk{cs„c{Œc{Œcs„Zk{cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{Rc{Rc{Rc{Zk{RcsRcsRcsZcsZcsRcsRcsRZkJZcJRcJZcRZkRZkRZkRZkJZkJRcJRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZ9BRBJZBRcBRcJRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BJ9BJ9BJ9BR9BR19J19J19J19J19J19J9BJ9BJ19J19J19J19J19J19J19B19B19B19B19B19B19B19B)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BR9BR9BR9BRBJRBJR9BR9BJ99BBBB9BJBJRBJZJJZBJRBJRBJRBJR9BJ9BJ9BJ9BJJJJJJJJJRJJRJJRJJRJRcRZkRZkRZkJZkJRcBJZBJRJJRJRZJRZJZcRZkRcsRcsRc{RcsRcsJZkJZkRcsRZkRZkRZkRZkRZkRcsRcsRcsRcsRcsZc{Rc{Rc{RcsZcsZk{Zc{RcsJZkJZkJZcJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkRZkRcsRcsRcsRZkRZkRcsRcsRcsZk{Zk{Zk{Zk{RcsRcsRc{Zk{cs„Zk{Zk{cs„cs„cs„cs„c{ŒZk{ZcsZcsck{cs„cs„cs„c{Œc{Œc{Œcs„ck{ck{Zk{Zk{cs„c{Œcs„cs„ck{ck{cs„Zk{Zk{Zk{ZcsZk{Zk{Rc{Zc{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{Zc{RcsRZkRcsRcsZcsZcsZcsRcsRZkJZkJZkJZcRZkRZkZcsRcsJZkJRcJRcJRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZJRcJZcJZkJZkBRcBRcBJZBJZBJR9BRBJZBJZ9BR9BR9BR9BR9BJ9BJ9BR9BR9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19B19B9BJ9BJ9BJ19J9BJ9BJ9BJ9BR9BR9BR9BR9BRBJR9BR9BJ9BJBBBBBBBJRBJZJRZJRZBJZBJRBJRBJR9BJ9BJBBB9BJJJJJJJJJRJJRJJRJJRJRcRZkRZkRZkJZkJZkJRcJRcJRcJRcJRcJZkRZkRcsRc{Zk{ZcsRcsRcsRcsRcsZcsRZkRZkRZkRZkRcsRcsRcsRcsZc{Zk{Rc{RcsRcsRcsZcsRcsRcsJZkRZkRZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZcJZcJZcRZkRcsRcsRcsZcsZcsRZkJZkJZkZc{Zk{cs„cs„Zk{Zk{Zk{Zk{cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{cs„cs„ZcsZcsZcscs„cs„c{Œc{Œc{Œc{Œc{Œcs„ck{Zk{Zk{Zk{cs„cs„cs„cs„ck{cs„Zk{Zk{ZcsZcsZk{Zk{Rc{Zc{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{RcsRZkRZkRcsRcsZcsZcsRcsRZkJZkJRcJZkRZkRZkRZkZcsRcsJZkJRcJRcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZJRcJZcJZkJZkJZkJRcBRcBJZBJZBJR9BRBJZBJZ9BR9BR9BR9BR19J19J9BR9BR9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19J19J19B19B)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19B)1919B19B99B99B99B9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BBB99BBBBJRJRZJRZJRcBRcBJZBJRBJR9BJBBB9BBBBBJJJJJJJJRJJRJJRJRZRZcRZkRcsRcsJZkJZkJZcJZcJZcRZkRZkRZkRZkRcsRc{Zk{Zk{ZcsRcsRcsZcsZcsZcsZc{Zc{ZcsZcsRcsRcsRcsRc{Rc{RcsRcsRcsRcsRcsRcsRcsRcsRZkRZkRcsJZkJZkJZkRcsRcsJZkJZkJZkJZkJZcJZcJZcRZkRcsZc{Zc{Zc{Zc{RcsJZkJZkZc{cs„c{Œc{Œc{Œcs„cs„cs„cs„Zk{cs„cs„ck{ck{ck{Zk{cs„Zk{ZcsZcsZcsck{c{ŒksŒc{Œc{Œc{Œc{Œcs„ck{Zk{Zk{Zk{cs„cs„cs„cs„cs„Zk{Zk{Zk{Zk{Zk{ZcsZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Rc{Rc{RcsRcsRcsRcsRcsRcsZcsZcsRcsRZkJRcJRcRZkRZkJZkJZkRZkRZkRZkJZkJZcJRcBJZBJZBJZBJZBJZBJZBJZBJZJRcJRcBJZJRcJZcJZkJZkJZkJRcJRZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BJ19J19J9BR9BR9BJ19J19J19J9BJ9BJ19J19J19J19J19J19J19J19J19B19B19J19J19J19J19B19B19B19B)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B)19)1919B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ99B9BBBBBBBB9BJBJRJRZJRZJRcJRcBRcBJZBJR9BJBBB9B99B99BJBJRJJRJJRJJZJRZJZcRZkRZkJZkJZkJZkJZkRZkRZkRZkRZkRZkRcsRcsRc{Zk{Zk{ZcsRcsRcsZcsZcsZc{Zc{Zc{Zc{RcsRcsRZkRcsRc{Rc{RcsRcsRcsRcsJZkJZkRcsZcsZcsRcsRcsJZkJZkJZkRcsRZkJZkJZkRZkRZkJZcJZcJZcRZkRcsZc{Zc{Zc{Zk{Zc{RZkRZkZk{cs„cs„c{Œc{Œc{Œcs„cs„cs„Zk{cs„ck{ZcsZcsZcsZcsZk{Zk{ZcsZcsZcsck{ksŒksŒc{Œcs„c{Œcs„cs„ck{Zk{Zk{ck{cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{ZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Rc{Rc{RcsRcsRcsRcsRcsRcsZcsZcsRcsJZkJRcJRcRZcRZkJZkJZkRZkRZkRZkRZkJZcJRcBJZBJZBJZBJZBJZBJZBJZBJZJRcJRcBJZJRcJZkJZkJZkJZkJRcBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BJ19J9BJ9BR9BR9BR9BJ19J19J9BJ9BJ9BJ19J19J19J19J19J19J19J19B19B19B19B19J19J19J19B19B19B19B)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J9BJ9BJ9BJ19J9BJ9BR9BR9BR9BJ9BR9BR9BR9BJ9BJ9BJ9BJ9BJBBB9BJBJRBJZJJZJRZJRcBJZBJZBJRJJJBBB99999B9BJBJRJJRJJRBJZBRcJRcJZcJRcJZcJZkRZkRZkRZkRZcJZcJZkRZkRZkRcsZcsZcsRcsRcsZcsZcsRcsRcsRcsRcsRcsRcsRcsJZkJZkRZkRc{Zc{RcsRZkRZkJZkJZkRZkRZkZcsRcsRcsRZkJZkJZkJZkJZkJZkJZkRZkRZkRZkJZkJZkJZcJZkRcsRc{Zc{Zk{Zk{Zk{Zc{RcsRc{Rc{Rc{Zk{cs„c{Œcs„cs„cs„cs„cs„Zk{RZkJZcJZcRZkZcsZk{ZcsZcsZcscs„c{Œc{Œc{Œcs„cs„cs„cs„cs„ck{ck{Zk{cs„cs„cs„Zk{Zk{cs„cs„Zk{Zk{ck{Zk{Zk{Zk{ZcsZk{Zk{Zc{Zc{Zc{Zc{Zc{Zc{ZcsRcsRcsRcsRcsRcsRcsRZkRZkRZcRZcJZkJZkRcsRcsRZkRZkRZkJZkJRcJRcBRcBRcBRcBRcBRcBRcBJZBRcJZcJZcJRcJRcJZkJZkJZkJZkBRcBRcBJZBJZBJZBJZ9BR9BR9BR9BR9BJ19J9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ19J19J19J19J19J19J19J19B19B19B19B19B19B19J19J19B19B19B19B)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J9BJ9BJ19J9BJ9BR9BR9BJ9BJ9BR9BR9BR9BJ9BJ9BJ9BJJJJ9BJJJJBJRBJZJJZJJZBJZBJZBJZBJRBJR9BJBBB99BBJRBJRJJRJJRJRZBRcJRcJRcJRcJRcJRcJZcRZkRZkJZcJZcJZkJZkRcsZcsZcsZcsRcsJZkRc{Zc{RcsJZkJZkJZkRcsRcsRcsJZkJZkRZkZcsZc{ZcsRZkRZkJZkRZkRZkRZkRZkZcsRcsRZkJZkJZkJZkJZkJZkJZkRZkRZkRZkJZkJZkJZcJZcJZkJZkRc{Zk{Zk{Zk{Zk{Zk{Zk{Rc{Rc{Rc{cs„cs„Zk{Zk{cs„cs„c{ŒZk{RZkJZcJZcRZkZcsZcsZcsZcsck{cs„cs„cs„cs„Zk{ck{ck{ck{cs„cs„ck{Zk{Zk{cs„cs„Zk{Zk{cs„cs„cs„cs„ck{Zk{Zk{Zk{ZcsZcsZcsZc{Zc{Zc{Zc{Zc{Zc{ZcsRcsRcsRcsRcsRcsRcsRZkRZkRZkRZkJZkJZkRcsRcsRZkRZkJZkJZkJRcJRcBRcBRcBRcBRcBRcBRcBJZJRcJZcJZcJRcJRcJZkJZkJZkBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR19J19J9BR9BR19J19J9BR9BR9BJ9BJ19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19J19B19B19B19B)19)19)19)19)19)19119119)1919B11911919B19B19B19B19J19J19B19B19B19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BRBJR9BJ9BJ9BJ9BJ9BJ9BJBJRBJRJJZJJZJJZBJZBJZBJRBJRBJRBJR9BJ9BJJJJJJRJJRJJZJRZJRcJRcJZkJZcJRcJRcJRcJZkRZkJZkJZkJZkRcsRc{Zk{ck{ZcsRcsJZkRc{Zk{RcsRZkJZkJZkRcsRcsRcsJZkJZkRZkZcsZcsZcsRcsRcsRZkRZkRZcRZcRZkZcsZc{RcsJZkJZkJZkJZkJZkRcsRZkJZkJZkJZcJZcJZkJZkJRcJZkRc{Zk{Zk{Zk{Zc{Zk{Zk{Zk{Zk{Zk{Zk{cs„cs„Zk{Rc{cs„k{”c{ŒZk{RcsRcsZcsZcsZcsZcsZcsck{ck{ck{Zk{Zk{Zk{ZcsZcsZcsZk{Zk{Zk{Zk{Zk{ck{cs„Zk{Zk{Zk{Zk{cs„ck{Zk{Zc{Zk{ZcsZcsZcsZcsZcsZk{Zk{Zc{Zc{ZcsRcsRcsRcsRcsRcsRcsRcsRcsRZkJZkJZkJZkJZkJZkRZkRZkJZkJZkJZkJZkJRcBRcBRcBRcBRcBJZBJZJRcJRcJZcJRcJRcJRcJZkJZkJZkBRcBJZBJZBJZBJZ9BRBJZBJZBJZ9BR9BR19J19J9BJ9BJ19J9BJ9BR9BR9BJ19J19J19J19J19J19J19J19B19B19B19B11911919B19B19B19B19B19B19B19B19B19B)19)19)19)19119119)1919B11911919B19B19B19B19J19J19B19B19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BRBJRBJR9BJ9BJ9BJ9BJBJRBJRJJZJRZJJZBJZBJZBJZBJZBJZBJZBJR9BJJJJJJRJJRJJRJJZJRZJRcJZkRZkJZkJZcJRcJRcJZkJZkJZkJZkJZkRcsRc{Zc{ZcsZcsRcsRcsRc{Rc{RcsRZkRcsRcsRcsRcsRcsRZkJZcJZcRZkZcsRcsRcsZcsRcsRZkRZcRZcRZkZcsRc{RcsJZkJZkJZkJZkRcsRcsRZkJZkJZkJZcJZcJZkJRcJRcJZcRcsZk{Zk{Zk{Zc{Zc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{Zk{c{Œc{ŒZk{Zc{Zk{Zk{Zk{ZcsZcsZk{ck{ck{ZcsZcsZk{Zk{Zk{Zk{ZcsZk{Zk{Zk{ZcsZcsck{cs„Zk{Zk{Zk{Zk{ck{Zk{Zk{Zc{Zk{ZcsZcsZcsZcsZcsZk{Zk{Zk{Zc{RcsRcsRcsRcsRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJZkJRcBRcBRcBRcBRcBJZBJZJRcJRcJRcJRcBRcBRcBRcJRcBRcBJZBJZBJZBJZBJZ9BR9BRBJZBJZ9BR9BR1BR19J9BJ9BJ19J9BJ9BR9BR9BR19J19J19J19J19J19J19J19B19B19B19B11911919B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJBJRBJR9BJ9BJ9BJ9BJBJRBJZJJZJRZJRZBJZJJZJJZJJZJJZJJZBJR9BJ9BJJJRJRZJJRJJRBJZJRcJZkRZkJZkJZkJZcJZcJZkJZkJZkRZkRcsRcsRcsRcsRcsRcsJZkRcsRc{Rc{RcsRcsRcsRcsRcsRcsRZkRZkJRcJZcRZkZcsRcsRc{Zc{ZcsRZkRZkRZkRZkRcsRcsRcsJZkJZcJZcRcsRcsRZkJZkRcsRZkJZkJZkJZkJZcJZcRZkRcsZc{Rc{Rc{RcsRcsRcsRc{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zk{Zk{Zk{Zk{Rc{Rc{Zk{Zk{ck{Zk{ZcsZcsZcsck{ck{ck{ck{cs„cs„ck{ck{cs„ck{ZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{ck{Zk{ZcsRZkRZkZcsZcsZk{Zk{Zk{Rc{RcsRcsRcsRcsRcsRcsRZkRZkJZkJZkRcsJZkJZkJZkJZkJZkJRcJRcJZkJZkJZcJRcBRcBRcJRcJRcBRcBRcBRcJRZBJZBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BRBJZ9BR9BR19J19J19J19J19J19J9BR9BR9BR9BJ19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BRBJRBJR9BJ9BJ9BJ9BJBJRBJZBJZJJZBJZBJZJJZJJZJJZJJZJJZBJRJJJJJJBJRJJZJJRJJRBJZBRcJRcJZkJZkJZkJZcJZkJZkJZkJZkRZkRcsRcsRcsJZkJZkJZkJZkRcsRcsRcsJZkJZkRcsRcsRcsRZkRZkRZkJZcJZcRZkRcsRc{Rc{Zk{Zc{ZcsZcsRZkRZkRcsRcsRcsJZkJRcJRcJZkRZkRZkRZkRcsRcsJZkJZkJZcJZcJZcJZcRZkRcsRc{Rc{RcsRZkRZkRcsRcsZk{Zk{Zk{Zc{ZcsZcsZc{Zc{Rc{Rc{Rc{Rc{Zk{ck{ck{Zk{Zk{Zk{ck{ck{cs„cs„cs„cs„cs„cs„cs„cs„Zk{ZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{ck{ck{ZcsZcsRZkZcsZcsZcsZc{Rc{Rc{RcsRcsRcsRcsRcsRcsRZkRZkJZkJZkRcsRcsJZkJZkJZkBRcBRcBRcJRcJZkJZcJRcBRcJRcJRcJRcBRcBRcBJZBJZBJZBJZBRcBJZBJZBJRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BRBJZ9BR9BR19J19J19J19J19J19J19J9BR9BR9BJ19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)1919B19B19B19B19B19B19J19J19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BRBJR9BJ9BJ9BJ9BJBJRBJZBJRBJZJJZJJZBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJZBRcBRcJRcJZcJZcJZcJZkJZkJZkJZkJZkRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkJZkRcsRcsRZkRcsRZkRZkRZkRZkRcsRc{Rc{Zk{Zc{ZcsZcsRZkRZkRcsRcsRZkJZkJRcJRcJZcRZkRZkRZkRcsJZkJZkJZkJZcJZcJRcJZcJZkRcsZc{Zc{RcsJZkJZkJZkJZkRcsRc{Zk{RcsRcsRcsRcsRc{Rc{Rc{Rc{Rc{Zk{ck{ck{cs„cs„cs„ck{ck{cs„cs„cs„Zk{Zk{cs„cs„Zk{Zk{ZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{cs„cs„ck{ZcsRZkZcsRZkRcsRcsRc{Rc{ZcsRZkRZkJZkRcsRcsRZkJZkJZkJZkJZkJZkJZkJZkJRcBRcBRcBRcJRcJRcJZkJZkJRcJRcJRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J9BJ9BJ19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19J19J19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BRBJRBJRBJRBJRJJZJJZBJZBJR9BJ9BJBJRBJRBJRBJRBJRBJRBJRBJZBJZBJZBJZJRcJZcJZkJZkJZkJZkJZkJZkJZkRcsRcsRcsRcsRcsRcsJZkJZkJZkJZkJZcJZkJZkRcsRZkRZkRcsRcsRcsRcsRcsRcsRc{Rc{Zc{Zc{Zk{ZcsRZkRZkRcsRcsRZkRZkJZcJRcJZcJZcRZkRZkJZkJZkJZkJZkJZkJZcJRcJRcJZkRcsZc{ZcsRZkJZcJZkRZkJZkRcsRc{Rc{RcsRcsRcsRcsRc{Zk{Zk{Zk{Zk{ck{ck{cs„cs„cs„cs„cs„cs„cs„cs„Zk{Zk{Zk{cs„cs„Zk{ZcsZcsZcsZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{cs„ck{ZcsZcsRZkRZkRcsRcsRc{Rc{Zk{ZcsRZkJZkRcsRZkJZkJZkJZkJZkJZkJZkJZkJRcBRcBRcBRcJRcJRcJRcJZkJZkJRcJRcBRcBJZBJZBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)1919B19B11911919B19B19B19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BJ9BJ9BB9BJ9BRBJRBJRBJRBJZBJZJRcJJZBJR9BJ9BJBJRBJRBJRBJRJJZJJZBJRBJRBJRBJZBJZJRcJZcJZkJZkJZkJZkJZkJZkJZkJZkRcsRcsRcsJZkJZkJZkRcsRcsRZkJRcJRcJZkRZkRcsRcsRcsRcsJZkRcsZc{Zc{RcsRcsRcsZcsZk{Zc{RcsRcsRcsRcsRcsJZkJZcJZcJZcJZkJZkRcsJZkJZkJZkJZkJZkJZcJZcJZcJZkRcsRc{RcsJZkJZkRZkRZkRcsRc{Rc{Rc{Zc{ZcsRc{Rc{Rc{Zk{cs„cs„cs„cs„cs„cs„Zk{Zk{cs„cs„cs„cs„Zk{Zk{Zk{cs„c{Œcs„Zk{ZcsZcsZcsZc{Rc{Zc{Zk{Zk{Rc{Zk{Zk{Zk{Zk{Zk{Zc{Zc{ZcsRcsRcsZcsZk{Rc{Rc{Zk{ZcsRcsRZkRZkJZkJZkJZkJZkJZkJZkJZcJRcJRcBRcBRcJZkJZkJRcJRcBRcBRcBRcBRcBJZBJZ9BRBJRBJZBJZBJZ9BRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZ9BRBJR9BR9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J9BJ19J19B19B19B19B19B19B19B19B)1919B19B19B19B19B119119)19)19)19)19)19)1919B11911911919B19B19B19B19B19B19B19B19B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BJ9BJ9BB9BJ9BR9BJBJRBJRBJZBJZBRcJRZJJRJJJ9BJBJRBJRBJRBJZJJZJJZBJRBJRBJRBJZJRZJRcJZkJZkJZkJZkJZkJZkJZcJZkJZkJZkRcsRZkRZkJZkJZkJZkRcsRZkJRZJRZJRcRZkRZkRcsRcsRcsJZkRcsRc{Zc{RcsRZkRZkRcsRcsZcsRcsRcsRcsRcsJZkJZkJZcJZcJZcJZkJZkJZkJZcJZcJZkJZkRZkRZkRZkJZkJZkJZkRc{RcsJZkRZkRZkZcsZc{Zk{Zk{Zk{Zc{Zc{Zk{Rc{Rc{Zk{c{ŒksŒksŒc{Œc{Œcs„Zk{Zk{cs„cs„cs„cs„Zk{Zk{Zk{Zk{cs„Zk{Zk{Zc{Zk{Zk{Zc{Rc{Zc{Zc{Zk{Rc{Zk{Zk{Zk{Zk{Zc{ZcsZc{Zc{RcsRcsRcsZc{Rc{Rc{Zc{Zc{RcsJZkJZkJZcJZcJZcJZkJZkJZcJZcJRcJRcBRcBRcJZkJZkJRcBRcBRcBRcBRcBJZBJZBJZ9BR9BRBJZBJZ9BR9BRBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZ9BR9BRBJZBJZ9BR9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B)1919B19B19B19B119119)19)19)19)19)19)1911911911919B19B19B19B19B11911919B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BB9BJ9BJ9BJ9BJBJRBJZBJZBJZBJZBJZBJRBJRBJRBJRBJZBJZBJZBJRBJRBJRBJZBJZJRcJRcJZkJZkJZkJZkJZkJZkJZcJZkJZkJZkJZkRZkRZkRZkRcsJZkJZkJZcJRcJRcJZcJZkJZkJZkJZkJZkRcsRcsRcsRcsRcsRcsRZkRZkRZkRZkRZkRZkRZkJZkJZkJZkJRcJRcJZcJZkJZkJZkBRcJRcJZcRZkRZkRZkRZkRZkJZkJZkRcsRcsRZkRZkRZkRcsZcsZk{Zk{Zk{Zc{Zc{Zk{Zk{Zk{cs„c{Œc{Œc{Œc{Œc{Œc{Œcs„ck{ck{cs„cs„Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{ZcsZk{Zk{Zc{Zc{ZcsRcsRcsRcsRcsRZkRZkRcsRcsRcsZcsZcsRcsRcsJZkJZkJZcJRcJZcJZcJZcJZcJRcJRcJRcJZkJZkBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBJZBRcBRcBRcBRcBJZBJZBJZ9BR9BRBJZBJZ9BR19J19J19J19J19J19J19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19119119)19)1919B19B19B19B11911919B19B99B99B9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BB9BJ9BJ9BJ9BJBJRBJZBJZBJZBJZBJZBJZBJRBJRBJZBJZBJZBJRBJRBJRBJZBJZJRZJRcJRcJZcJZkJZkJZkJZkJZkJZcJZkJZkJZkJZkJZkRZkRZkRcsJZkJZkJZkJRcJRcJZcJZcJZkJZkJZkJZkRZkRZkRZkRcsRcsRcsRZkJZcRZkRZkRZkRZkJZkJZkJZkJZcJRcJZcJZcJZcJZkJRcBRcJRcJZkRZkRZkRZkRZkRZcJZkJZkRcsRcsRZkRZkRZkZcsZk{Zk{Zk{Zk{Zk{Zk{Zk{cs„cs„cs„cs„Zk{Zk{cs„cs„cs„cs„ck{ck{ck{ck{ck{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{ZcsZcsZc{ZcsRcsRZkRcsRcsRcsRcsRZkRZkRZkRZkRcsRcsRcsRcsJZkJZkJZkJZcJRcJRcJZcJZcJRcJRcJRcJRcJZkJZkBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBJZBRcBRcBRcBRcBRcBJZ9BR9BR9BRBJZBJZ1BR19J9BJ9BJ19J19J19J19J19J19J19J19J19B19B19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)1911911919B19B11911919B19B99B99B9BJ9BJ9BJ9BJ9BR9BR9BJ9BR9BR9BR9BR9BR9BR9BR9BJ9BB9BJ9BJ9BB9BJBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJZJJZJRZJRcJRcJRcJZcJZcJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkRcsRcsRcsRZkRZcJRcJRcJZkRZkRcsRcsRZkJZcJRcJZkRZkRcsRcsRZkJZcRZkRZkRZkJZkJZkJZcJRcJRcJZcJZcJZcJZcJZkJZkJRcJZcJZkRZkRcsRZkRZcRZcJZcRZkRcsRc{RcsRcsRcsZk{Zk{Zk{cs„cs„Zk{Rc{Rc{Zk{cs„cs„Zk{Zc{Zk{Zk{cs„cs„Zk{Zk{Zk{Zk{ck{Zk{Zk{Zk{Zc{Zc{Zk{Zk{Zk{Zk{Zk{Zc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsRcsRZkRZkRcsRcsRcsRcsRcsJZkRZkRZkRcsRcsRcsJZkJZkJZkJZkJZkJRcJRcJRcJRcJRcJZkJZkJRcJRcJRcJRcJRcBRcBRcBRcBRcBRcBJZBJZBJZ9BRBJZBJZBJZ9BR9BRBJZBJZBJZBJZBRcBRcBRcBRcBJZ9BR9BR9BRBJZBJZ1BR19J9BR9BR9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)19119119)19)19)19)19)19)19)19)1911911919B19B19B11919B19B19B99B9BJ9BJ9BJ9BJ9BR9BR9BJ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BB9BJBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJRBJRJJRJJZBJZBRcBJZJRZJZcJZcJZkJZcJZcJZcJZcJZkJZkJZkJZkJZkRZkRcsRcsRcsRZkRZkJZkJZkRcsRcsRcsRZkJRcJRcJZkRZkRcsRcsRZkJZcRZcRZkJZkJZkJZkJZkJRcJRcJZcJZcJZkJZkJZkJZkJZcJZcJRcJZkRZkRZkRZcRRZJZcRZkZc{Zc{RcsRcsRc{Zk{Zk{cs„cs„cs„Rc{Rc{Rc{Zk{cs„Zk{Zk{Zc{Zc{Zc{ck{ck{Zk{Zk{Zk{ZcsZcsZcsZk{Zk{Zc{Zc{Zk{Zk{Zk{Zk{Zc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsRcsRZkRZkRZkRZkRcsRcsRcsRcsJZkRZkRZkRZkRcsJZkJZkJZkJZkJZkJZkJRcJRcBRcBRcJZkJZkJZkJZkJRcJRcJZkJZkBRcBRcBRcBRcBRcBRcBJZBJZ9BRBJRBJZBJZ9BR9BRBJZBJZBJZBJZBRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B)19)1919B119)19)19119119)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19J9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ99B9BBBJRBJZBJZBJZBJZBJZBJZBJR9BRBJZBJZBJZBJR9BJ9BJJJJBJRBJZBJZBJZBJZBJZJRcJRcJRcJRcBRcJRcJZkJZkJZkJZkJZkJZkJZkRZkRcsRcsRcsRcsJZkJZkJZkJZkJZkJZkRZcRZcJZkJZkRcsRcsJZkJZcJZcJZkRZkRcsRcsRZkJZcJRcJRcJZcJZkJZkJZkJRcJRcJRcBRcJRcRZcRZcRZcRZcJZcRZkZc{Zc{ZcsRcsRc{Zk{Zk{Zk{cs„Zk{Rc{Rc{Zk{Zk{cs„Zk{Zk{Zc{Zc{Zk{Zk{cs„ck{ck{ZcsZcsZcsZcsZc{Zc{Zc{Zc{Zc{Zc{ZcsZcsZc{Zc{ZcsZcsZcsRcsRcsRcsRcsRZkRZkRZcRZkRZkRZkRcsRcsRcsRZkRZkRZkRZkRZkJZkJZkJZkJZkJZkJRcJRZBRcBRcJRcJZcJZkJZkJZkJZkJZkJZkBRcBRcBRcBRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBJZBRcBRcBRcBJZBJZBJR9BR9BJ9BJ9BR9BRBJZ9BR9BR19J19J19J19J19J19J19J1BR19J19B19B19J19J19J19J19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ99B99B9BJBJRBJZBJZBJZBJZBJRBJR9BR9BRBJZBJR9BJ9BJ9BJ9BJBJRBJRBJZBJZBJRBJZJRcJZcJRcJRcBRcJRcJZkJZkJZkJZkJZkJZkJZkJZkJZkRcsRcsRcsJZkJZkJZkJZkJZkJZcRZcRZkJZkJZkRcsRZkJZkJZcJZcRZkRZkRcsRcsRZkJZkJZcJRcJZcJZkJZkJZkJZkJRcJRcBRcJRcJRcRZcRZkRZkJZcRZkRcsZc{ZcsZcsRc{Zk{Zk{Zk{cs„Zk{Zk{Zk{Zk{cs„Zk{Zk{Zc{RcsRcsZc{Zk{ck{ck{ZcsZcsZcsZcsZcsZcsZc{Zc{Zc{Zc{ZcsZcsZcsZc{ZcsRZkRZkRZkRcsRZkRcsRcsRZkRZkRZcRZcRZkRZkRcsRcsRZkRZkRZkRZcRZcRZkJZkJZkJZkJZkJRcJRcJRZBRcBRcJZcJZcJZcJZcJZkJZkJZkBRcBRcBJZBRcBRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBJZBRcBRcBJZBJZBJR9BR9BJ19J19J9BJ9BRBJZ9BR1BR19J19J19J19J19J19J19J19J19J19B19B19B19J19J19J19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)1919B11911919B19B19B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBBB99B99B9BJBJRBJZBJZBJZBJRBJZBJZ9BR9BRBJZBJZ9BR9BJ9BJBJRBJRBJRBJRBJZBJZBJZJZcJZkJZkJZcJZcJZcJZkJZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZkJZkJZkJZkJZcJRcJZcJZkJZkJZkJZcJZcJZkRZkRcsRZkJZkJZkJZkJZkJZkJZcRZkJZkJZkJZkJZkJZkJRcJRcJRcRZcRZkRZkRZkRZcRZkRcsZcsZcsZk{Zk{Zk{Zk{cs„cs„cs„Zk{Zk{Zk{Zk{Zk{Zc{RcsRcsRcsRcsZk{Zk{ZcsZcsRZkRZkZcsZcsZcsZcsZk{Zk{Zk{ZcsZc{ZcsZcsRZkJRcJRcRZkRcsRZkRZkRcsRcsRZkRZcRZcRZkJZkRcsRZkRZkRZkRZkRZkRZkJZcJZcJZkJZkJZcJRcJRcJRcBRcJRcJZcJZcJRcBRcJRcJRcBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBRcBJZ9BR9BRBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BJ19J19J9BR9BR9BR9BR9BR19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19))1)19)19)19)19)19)19)19)1911911919B19B19B19B99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB9BBBJRBJZBJZBJRBJRBJZBJZ9BR9BRBJZBJZBJR9BRBJRBJRBJRBJRBJRBJZBJZBRcJRcJZcJZkJZkJZcJRcJRcJZkJZkJZkJZkJZkJZkJRcJRcJRcJZcJZkJZkJZkJZkJZkJZkJZkJZcJZcJZkJZkJZkJZcJZcJZkRZkRZkJZkJZkJZkJZkJZkJZkRZkRZkRZkJZkJZkJZkJZkJZkJZcJRcJRcRZcRZkRZkRZcRZkRZkRcsZc{Zk{Zk{Zk{Zk{Zk{cs„Zk{Zk{Zk{Zk{Zk{Zk{ZcsRcsRcsRcsRcsZcsck{ZcsRZkRZcRZcZcsZcsZcsZcsZk{Zk{Zk{ZcsZc{ZcsZcsRZcJRZJRcRZkRcsRZkRZkRcsRcsRZkRZcRZkRZkJZkJZkRZkRZcJZcJRcJZkJZkJZcJZcJZkJZkJRcJRcJRcJRcBRcJRcJZcJZcJRcBRcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBRcBJZ9BR9BR9BRBJZBJZBJZBJZBJZBJZ9BR9BR19J19J19J9BR9BR9BR9BR9BJ19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19))1))1))1)19)19)19)19)19)19)19)1911919B19B19B11919B19B9BJ99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BJ9BJ9BJ9BJ9BB9BB9BJBJRBJRBJZBJRBJRBJRBJR9BR9BRBJZBJZBJRBJR9BR9BRBJRBJRBJZBJZBJZBJZBJZJRcJZcJZcBRcBRcJRcJRcJZkJZkJZkJZcJRcBRcJRcJRcJZcJZkJZkJZkJZkJZkRZkRcsRcsJZkJZkJZkRZkRZkRZcJZcJZcJZkJZkJZkRcsRZkJZkJZkRcsRcsRZkJZcJRcJZcJZkRZkJZkJZcJRcJRcRZcRZcRZcRZkRZkRcsZc{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Zk{Rc{Rc{Zc{ZcsZcsZcsRcsZcsck{ck{ZcsZZcRZkRZkRZkZcsRZkRcsZk{Zk{Zk{Zc{ZcsZcsRZkRZkJZcRZkRcsRcsRcsRcsRcsRcsRZkRZkRcsRcsRcsRcsRZkRZcJRZJRZJRcJZkJZcJZcJZkJZkJRcJRcJRcBRcBRcBRcJRcJZcJRcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BRBJZBJZBJZBJZ9BR9BR9BRBJZBJZBJZBJZBJZBJZBJZ9BR19J19J19J9BJ9BR9BR9BR9BJ19J19J19J19J19J19J19J19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19))1))1))1))1)19)19)19)19)19)19)19)1919B19B19B19B11919B19B19J99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BJ9BJ9BB9BJ9BJ9BRBJRBJR9BR9BRBJRBJRBJRBJZBJZBJZBJRBJR9BR9BRBJRBJRBJRBJZBJZBJZBJZJRZJZcJRcBRcBRcJRcJRcJRcJZkJZcJRcBRcBRcBRcJRcJZcJZkJZkJZkJZkJZkRZkRcsRcsRZkJZkJZkRZkRZkJZcJRcJRcJRcJZkJZkRcsRZkJZkJZkRcsRZkJZkJRcJRcJRcRZcRZkJZcJRcJRZJRZRRZRRZRZcRZkRZkRcsRcsZcsZcsZcsZcsZcsZcsZcsZk{Zk{Rc{Rc{Zc{Zc{ZcsZcsZcsZcsck{ZcsZZcZZcRZkRZkRZkRZkRcsRcsZcsZk{Zc{ZcsZcsRZkRZkRZkRZkRZkRZkRcsRcsRcsRcsRZkRZkRZkRcsRcsRcsRZkRZkJZcJJZJJZJRcJZcJZcJZcJZkJZkJRcJRcBRcBRcBRcBRcJRcJRcJRcJRcBRcBRcBJZBJZBJZBJZBRcBJZBJZBJZ9BR9BRBJZBJZBJZBJZ9BR9BR9BR9BR9BRBJZBJZBJZBJZ9BR9BJ19J19J9BJ9BJ9BJ9BR9BR9BJ19J19J19J19J19J19J19J19B19B19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B119)19)19)19))1))1))1))1))1)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BJ9BJ9BJ9BB9BB9BJ9BJ9BRBJRBJR9BR9BR9BR9BRBJZBJZBJZBJZ9BRBJRBJRBJRBJRBJRBJRBJRBJZBRcBJZBJZJRcBRcBRcBRcJRcJRcJRcBRcJRcBRcBJZBJZBRcJRcJZkJZkJZkJZkJZkJZkJZkRZkRZkJZkJZkJZkJZcJRcBRcBRcBRcJRcJZkJZkJZkJZkJZkJZkJZkJZkJZcJRcBJZJRcJZcRZcJRcJRZJRZJRZRZcZZcZZcRZkRZkRcsRcsRZkRZkRZkRZkRZkZcsZcsRcsRcsZc{Zc{Zc{Zc{Zc{Zc{Zc{Zc{ZcsZcsRZcZZcRZkRZkRZkRcsZcsZc{RcsRcsZcsZcsRZkRZkRZkRZkRZkRZcRZkRZkRZkRZkRZkRZkRZkRZkRZkJZkJZkJZkJZcJRcJRZJRZRRZRZcJZcJZcJZkJZkJRcJRcBRcBRcBJZBJZBRcBRcBRcBRcBRcBRcBJZBJZJRZJRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJZBJZ9BR9BJ9BJ9BJ9BJ9BJ19J9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19))1))1))1!)1)19)19)19)19)19)19)19)19)19)1919B19B19B19B19B19B11919B19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB9BJ9BJ9BRBJRBJRBJR9BR9BRBJRBJRBJZBJZBJZ9BR9BRBJRBJR9BJ9BJ9BJBJRBJZBRcBJZBJZBRcBRcBRcBRcJRcJRcBRcBRcBRcBRcBJZBJZBRcJRcJZcJZkJZkJZkJZkJZkJZkJZcJZcJZcJZkJZkJRcBRcBRcBRcBRcBRcJRcJZkJZkJZkJZkJZkRZkJZkJRcJRcJRZJRcRZcRZcJRcJRZJJRRRZZZcZcsRZkRZkRZkRZkRZkRZcRZcRZcRZcRZcRZkZcsRcsRcsZcsZc{Zc{Zc{Zc{Zc{Zc{ZcsZcsZcsRZkRZkRZkRZkZcsRcsZcsZcsZcsRZkZcsRZkRZkRZkRZkRZkRZcRZcRZcRZcRZcRZkRZkRZkRZcJZcJZkJZkJZkJRcJRcJRcJRZJRZRRZJRZJRcJRcJZkJZkJRcJRcBRcBJZBJZBJZBRcBRcBRcBRcBRcBJZBJZBJZJRZJRcBRcBRcBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19))1))1!)1!)1!)1!)9))1)19)19)19)19)19)19)1911911919B19B19B11911919B19B9BJ9BJ9BJ9BJ19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BRBJRBJRBJRJJJJJJBJR9BRBJZBJZ9BRBJRJJJ9BJ9BB9BB9BJBJZBJZBRcBJZBJZBJZBJZBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBRcJRcJZcJZkJZkJZkJZkJZkJRcJZcJZcJZkJZkJZkBRcBRcBRcBRcBJZBRcJRcJZcJZkJZkJZkRZkRZkRZkJZcJRcRZcZZcRZkRZcRZcJRZRRJRRZZZcZcsZcsRZkRZcRRcRRcRRcRZcRZcRZkRZkRZcZcsZcsZc{ZcsZcsZc{Zc{RcsRcsRcsRcsZcsZcsRZkRZkRZkZcsZcsZcsZcsZcsZcsZcsRZkRZkRZkRZcRZkRZcRZcRZcRRZRZcJZcJZkRZkRZkJRcJRcRZkRZkJRcJRcRZcRRcJRZJRZJRZJRcBRcJRcJZcJZcJRcBRcBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBRcBRcBJZBJZ9BR9BR9BR9BRBJZBJZ9BR9BR9BR9BR9BJ19J9BR9BR19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J9BJ19J19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19))1))1!)9!)9!)1!)1))1))1)19)19)19)19)19)1911911919B19B11911911919B19J19J9BJ9BJ19J19J19J99B9BJ9BJ9BJ9BJ9BB9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRJJJJJJ9BR9BRBJRBJR9BR9BJ9BJ9BB99B9BB9BRBJZBJZBJZBJZBRcJRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBJZBJZBRcBRcJRcJZcJZkJZkJZkJRcJRcJRcJZkJZkJZkJRcBRcJRcJRcJRcBJZBJZJRZJRcJZkJZkJZkJZkRZkRZkJZcJRcRZcZZcZZcZZcRRZRRZRRZRRZRZcZZcZZcRZcRRcRRcRRcRRcRRZRRcRZkRZkRZcRZkZcsZc{RcsRcsZcsZcsRcsRcsRcsRcsZcsZcsZcsRZkRZkRZkZcsZcsRZkRZkZcsZcsRZkRZkRZcRZcRZcRZcRZcRZcRZcRZcRZkRZkRZkJZcJRZJRZJZcRZcJRZJRZRZcRZcJRZJJZJRcJRcBRcJRcJZcJRcJRcBRcBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBRcBJZBJZ9BR9BR9BRBJZBJZBJZ9BR9BR9BR9BR9BR19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19))1))1!)9!)9!)1!)1))1))1)19)19)19)19)19)1919B19B19B19B19B19B19B19B19J19J19B19B19B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJBBBJJJJJJ9BJ9BJ9BRBJR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BRBJZBJZBJZBRcJRcJZcJZcBRcBRcBRcBRcJRcBRcBRcBRcJRcJRcBRcBRcJRcJZkJZkJZcJRcBRcBJZJRcJZkJZkJRcBRcJRcJRZJRZJRZBJZBJZBJZJZcJZkJZkJZcJZcJZkJZkJZcJRcRRZRRZRRZRRZRRZRRZJRZJRZRRZRRZRRZRRZRZcRZcRZkRZcRRZRRZRZcRZcRZcRZkZcsZcsRcsRcsRcsRcsRcsRcsRcsRcsRZkZcsZcsZcsRZkRZkRZkRZkRZkRZkRZkRZkRZkRZcRRcRRcRZcRZcRZkRZkRZcRZcRZkRZkRZkJZcJRZJRZJRcJRcJRZJRZJRcJRcBJZBJZJRcJZcJZcJRcJRcBRcJRcBRcBJZBJZBJZBJZBJZBJZBRcBRcBJZBJZBJR9BRBJZBJZBJZBJZBJZBJZ9BR9BR9BRBJZBJZBJZ9BR9BR9BR9BR9BR9BR19J19J19J19J9BJ9BJ19J19J19J19J9BJ9BJ19J19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B11911919B19B19B19B)19)19)19)19)19)19))1))1!)1!)1))1))1))1)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99B9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ9BJJJJBJR9BJ9BJ9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BRBJRBJR9BR9BRBJZBJZBRcJRcJZcJRcBRcBRcBRcBRcJRcJRcBRcBRcBRcJRcBRcJRcJZkRZkRZkJRcJRcBJZBJZJRcJZcJZcBJZBJZJRZJRZJRZJRZBJZBJZJRZJZcJZcJRcJRcJRcJRcJRcJRcJRZJRZRRJJJRRRJRRZRRZJRcJRZJRZJJRJJRJJRRZcRZcRZcRZcRRZRRZRZcRZcRZcRZkZcsZcsRcsRcsRZkRZkRZkRcsRcsRZkRZkRcsZcsZcsRZkRZkRZkRZcRZcRZcRZkRZkRZcRZcRRcRRZRRZRRZRZkRZkRZcRZkRZkRZkRZkJRcJRcJRZJRZJRZJRZJRcJRcJRcBRcBJZJRcJRcJZcJZcJRcBRcJRcJRcBJZBJZBJZBJZBJZBRcBRcBRcBJZBJR9BR9BRBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BRBJZBJZ9BR9BR9BR9BRBJZ9BR9BR19J19J19J9BJ9BJ19J19J19J19J9BJ9BJ9BJ19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B11911919B19B19B19B)19)19)19)19)19)19))1))1!)1!)1))1))1)19)19)19)19)19)19)19)1919B19B19B19B19B19B19B19B19B19B19J99B99B99B99B19J19J9BJ9BJ9BJ9BJ9BB99B99B9BJ9BJJJJJJJ9BJBJRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJRBJZBJZBJZBRcBRcBRcBRcBRcBRcBRcJRcJRcJZkJZkBRcBRcJRcJZkZcsZcsRZkJRcJRcJRZJRcJRcJZcJRcBJZBJZJJZJRZJRcJRcBJZBJZJRZRRZJRcJRcJRZJRZJRcJRcJRcJRZJJRJJJJJJJJJRRZRZcJZcJRcJJRJJRJJRJRZRRZRRZJRZJRZJZcRZcRZcRZcRZkRZkRZkZcsRcsRZkRZkRZkRZkRZkRZkRZkRcsRcsZcsZcsRcsRZkRZcRRcRZcRZcRZcRZcRRZRRZJRZJRZRRZRRZRZcRZkJZcRZcRZkRZkJZkJZkJZcJZcRRZJRZJRcJRcJZcJZcJRcJRcBRcBRcJRcJRcJRcJRcJRcJRcBRcBRcBJZBJZBRcBRcBRcBRcBJZBJR9BR9BRBJRBJZBJZBJZBJZ9BR9BR9BR9BR9BRBJZ9BR9BR9BJ9BR9BRBJZBJZ9BR19J19J19J19J19J19J19J19J19J19J9BJ9BR19J19B19B19J19J)19)1919J19J19B19B19B19B19B19B19B19B119)1919B19B19B19B)19)19)19)19)19!)9!)1!)1!)1!)1!)1!)9)19)19!)9!)9)19119)19)1919B19B19B19B19B19B19B19B19B19B9BJ9BJ99B99B19J19J19J19J9BJ9BJ9BJ9BB99B99B9BJ9BJJJJBJRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJZBJZBJZBJZBJZBRcBRcBRcBRcBRcBRcJRcJZkBRkBRcBRcJZkRcsZk{ZcsRZkJRcJRZJRZJRcJRcJRcJRcBJZBJZJJZJJZJRZJRcBRcJRZRRZRRZJRZJRZJRZJRZJRZJRZJRZJRZJRZJJRJJJJJRRRZRZkRZkJZcJJRJJRJJRRRZRRZRRZRRZJRZJRcJZcRZcRZcRZkRZkRZkRZkRZkRZkRZkRZcRZcRZcRZcRZkRZkRcsRcsRcsRZkRZkRRcRRcRZcRZkRZkRZcRRZRRZJRZJRZRRZRZcRZkRZkJZcJZcRZkRZkJZkJZkJZcJZcRRZJRZJRcJZcJZcJZcJZcJRcBRcBRcJRcJRcJRcJRcJRcJRcBRcBRcBJZBJZBRcBRcBRcBJZBJZBJZ9BRBJRBJRBJRBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR19J19J9BR9BRBJZ9BR9BR19J9BJ9BJ19J19J19J19J19J19J19J19J9BJ19J19B19B19B19J19B19B19J19B19B19B19B19B19B19B19B19B)19)19)1919B19B19B)19)19)19)19)19!)9!)1!)1!)1!)1!)9!)9)19)19!)9!)9)19)19)19)1919B19B19B19B19B19B19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B19B19B19B99B9BB9BJ9BJ99B99B9BJ9BJ9BRBJRBJRBJR9BR9BR9BR9BRBJZBJR9BR9BJ9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZBRcBRcBRcBRcBRcBRcBJZBJZJZkZcsck{Zk{RZkJRcJRcJRZJRZBRcBRcBRcBRcBJZJJRJJRJJZJRZJRZJRZRRZRRZJRZJRZJRZJRZRRZRRZJZcJZcJZcJRcJRZJRZRZcRZkRZkJZcJJRJJJJJRRRJRRZRZcRZcJRcJRZJRZRRcRZcRZkRZkRZkZcsZcsRZkRZcRZcRZcRZcRZcRZcRZkRZkRZkRZkRZkRZcJZcRZcRZkZcsRZkRZkRZcRRZRRcRRcRZcRZkRZkJZkJZcJZcRZcRZkJZkJZkJRcJRZJRZJRZJRZJZcJZkJZkJRcJRcBRcBRcJRcJRcJRcJRcJRcJRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BJ19J9BJ9BJ19J19J9BRBJR9BR9BR19J19J9BR9BR9BJ19J19J19J19J19J19J19J19B19B19J19B19B19B19J19J19B19B19B19B19B)1919B19B19B19B)19)1919B19B19B19B)19)19)19)19)19!)9!)1!)1!)9!)9!)1!)1)19)19!)9)19)19)19)19)1919B19B19B19B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ19B19B19B19B19B99B99B9BJ9BJ99B99B9BJ9BJ9BJ9BRBJRBJR9BR9BR9BR9BRBJZBJR9BR9BJ9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBRcBRcBRcBRcBJZBJRBJZJZcZcsck{ck{RZkJRZJRZJRZBJZBJZBRcBRcBJZJRZJJRJJRJJRJJZJRZJRZRRZRRZJRZJRZJRZJRZRRZRRZJZcJZcJZkJZcJRcJRcRZcRZcJZcJRcJJRJJRJJRRRJRRZRZcRZkRZcJRZJJZRRcRZcRZkRZkRZcRZcRZkRZkRZcRRZRZcJRcJRcRZcRZcRZcJZkJZkRZcRZcJZcRZkZcsZcsZcsRZkRZcRRcRRcRZcRZkRZkRZkJZkJZcJZcRZcRZcJZkJZcJRcJRZJJZJJZJRcJZcJZkJZkJRcJRcBRcBRcJRcJRcJRcJRcJZcJRcBJZBJRBJRBJRBJRBJRBJRBJRBJZBJZBJZBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR19J9BJ9BJ9BJ9BR9BR9BR9BR9BR19J19J9BR9BR9BJ19J19J19J19J19J19J19B19B19B19J19J19B19B19J19J19B19B19B19B19B)1919B19B19B19B)19)1919B19B19B19B119)19)19)19)19!)9!)1!)1!)9!)9!)1!)1)19)19))1))1)19)19)19)19)19)1919B19B11911919B19B19J9BJ19B19B19B19B19B19B19B19B99B99B9BJ9BJ19B19B19J9BJ9BJ9BJBJRBJRBJRBJR9BR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR9BJ9BR9BRBJRBJRBJRBJZBJZBJZ9BRBJZBJZBJZBJZBJZBJZBRcBJZBJZBJRBJRJJRJRZRZkck{ck{RZkJJZJJRJJRJRZJRcJRcJRcJRZJJZJJRJJRJJRJJRJRZJRZJRZJRZJRZJRZJRZJRZJRZJRZJRcJZcJRcJRcJRcJRcRRZRRZJZcJRcJJRJJRJJRJRZRRcRZcRZcRZcJRZJRZJZcRZkRZkRZcRZcRZcRZkRZcRZcRZcJRcJRZJRZJRcRZcRZcJZcJZcRRZRZcRZcRZkRZkZcsZcsZcsRZcRRcJRcJZcRZkRZkRZkRZkJZcRZcRZcRZcJZkJZcRZcJRZJRZJRZJZcJZcJZcJZcJRcBJZJRZJRZJRZBJZBJZJRcJZcJZcBJZBJRBJRBJRBJR9BRBJRBJRBJZBJZBJZBJZ9BR9BRBJZBJZ9BR9BR9BR9BR9BR9BR19J9BJ9BR9BR9BR9BR9BR9BR9BJ19J9BJ19J19J19J19J19J19J19J19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B19B19B19B119)19)19!)9!)9))1))1!)1!)1!)1!)1)19)19))1))1)19)19)19)19)19)1919B19B11911919B19B19B19B19B19B19B19B19B19B19B19B19B99B99B19B19B19B9BJ9BJBBB9BJ9BJ9BRBJRBJRBJR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR19J19J9BRBJZBJRBJRBJZBJZ9BR9BRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRJJJJJRJJRJRcZcsZcsJZcBJRJJRJJRJRZJRcJRcJRcJRZJJRJJRJJRJJRJJRJRZJRZJJZJJRJJRJJRJRZJRZJRZJRZJRcJRcJRcJRcJRcJRcRRZRRZJRZJRZJJRJJRJRZJRcRRcRZcRZcJZcJRcJRcRZkRZkRZcRZcRZcJZcRZcRZcRZkRZcJRcJRZJRZJRZRZcRZcRZcJZcRZcRZcRZcRZkRZkRZkZcsZcsRZcRRcJZcJZkRZkRZkRZkRZkJZcJZcJZcRZcJZcJZcRRZJRZJRZJRcJRcJZcJZcJZcBJZBJZJRZJRZBJZBJZBJZJRcJZcJRcBJZBJRBJRJJJBJR9BRBJRBJRBJZBJZBJZBJZ9BR9BRBJZBJZ9BR9BR9BR9BRBJR9BR1BR19J9BR9BR19J19J9BR9BR9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B19B19B19B119)19)19!)9!)9))1))1))1!)1!)1!)1!)9!)9!)9)19)19)19)19)19)1919B11911919B19B19B19B19B19B19B19B19B19B19B19B11911919B19B19B19B19B19B9BB9BB9BB9BB9BJ9BRBJRBJRBJR9BR9BJ9BJ9BR9BR9BR9BR9BR19J19J1BR9BRBJZBJRBJRBJZBJZBJRBJRBJZBJZBRcBRcBJZBJZBJZBJZBJZ9BR9BJJJJJJJJRZJRcJZcJRcBJZJJRJJRJRZBJZBRcJRZJRZJJRJJRJJRBJZBJZJJZJJZJJRJJRJJRJJRJJZJRZJRZJRZJRZJRcJZcJZcJRcJRcRRcRRZJRZJJRJJRJJRJRZRRcRRcRRcJZcJZcRZcRZcRZcRZkRZkRZkRZcRZcRRcRRcRZkRZcRZcRRZRRZRZcJZcJZcRZcRZcRZkRZcJZcJZkRZkRZkRZkRZkRZcRZcRZkRZkJZkRZkRZkRZkJZcJRcJRcJZcJZkJZcJRZJJRJRZJRcBJZJRcJZkJZkBJZBJZBJZBJZBJZBJZBJZJRcJRcBRcBJZBJZBJRBJR9BR9BR9BR9BRBJRBJZBJZ9BR9BR9BRBJZBJZ9BR9BR9BR9BRBJR9BR19J19J9BJ9BJ19J19J9BR9BR9BJ19J9BJ9BJ19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)1))1))1))1))1))1!)9!)9!)9)19)19)19)19)19)1919B11911919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B9BB9BB99B99B9BJ9BRBJRBJR9BR9BR9BJ9BJ9BR9BR9BR9BJ19J19J19J9BR9BR9BRBJRBJRBJZBJZBJRBJRBJZBRcBRcBRcBJZBJZBJZBJZBJZ9BR9BJ9BJJJJJJRBJZBJZBJZBJZJJRJJRBJZBJZBJZBJZBJZJJRJJRJJRBJZBJZJJZJJRJJRJJRJJRJJRJJZJJZJRZJRZJRZJRZJZcJZcJRcJRcRRcJRZJJRJJJJJRJRZRRZRRcRRcRRcJZcJZcRZcRZcRZcJRcJRcJRcRZcRZcRRcRRcRRcRZcRRZRRZRRZRZcJZcJZcJZcRZcRZkRZkJZcJZcRZkRZkRZcRRcRZcRZkRZkRZkJZkRZkRZkRZkJRcJRcJRcJRcJZcJRcJJRJJRJRZJRcBJZJRcJZkJZcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJR9BR9BR9BR9BR9BRBJRBJRBJR9BR9BR9BR9BRBJZBJZ9BR9BR9BR9BR9BR9BR9BR19J19J19J19J9BJ9BR9BR9BJ19J9BJ9BJ19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19!)9!)1!)1!)1))1))1))1))1!)9!)9))1))1)19)19)19)1919B19B11911919B19B19B19B19B19B19B19B19B19B19B19B99B99B19B19B19B99B99B9BJ9BJ9BJ99B9BJ9BJ9BR9BR9BJ9BR9BR9BR9BR9BR9BR9BJ19J19J19J9BJ9BJ9BJ9BR9BR9BR9BR9BR9BRBJZBJZBJZBRcBRcBJZBJZBJZBJZ9BR9BRBJRBJRBJRBJRBJZBJZBJZBJZBJZJRZJRcBRcBJZBJRBJRBJZBJZBJZBJZBJZJRZJJRJJRJJRJJRJJRJJZBJZBJZBJZJJZJRZJRcJRcJRcJRZJRcJRZBJRBJRBJRJRZRRZRRcRRcRRcRRcRZcJZcJZcJRcJRZJJRJRZRZcRZkJRcJRZJRZRRZJRZJRZJRZJRcJZcJZcJRcJRcRZcRZkRZkRZkRZkRZcRRZRRZRZcRZkJZcJZkRZkRZkRZkJZkJRcJRcJRZJRcBRcJRZJJRJJRJRZBRcJRcJRcJZcJRcBRcBJZBJRBJRBJRBJRBJZBJZBJZ9BR9BR9BR9BR9BJ9BJ9BJBJRBJRJJJBJRBJZBJZ9BR9BRBJRBJRBJR9BR9BR9BJ9BR9BR9BR9BR19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B119)1919B19B)19)1911919B)19)1919B19B)19)19)19!)9!)1!)1!)1!)1!)1!)1!)1!)1!)9)19))1111)19)19)19)1919B19B11911911919B19B19B19B19B19B19B19B19B19B19B19J9BJ19B19B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BR9BR9BR9BR9BR9BJ19J19J19J9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BRBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJRBJZBJZBJZBJZBRcBRcBJZBJZBJRBJRBJZBJZBJZBRcJRZJJRJJRJJRJJRJJRJJRJJZBJZBJZBJZBJZJJZJRcJRcJRZJRZJRZJRZBJZBJZJJZJRZRRcRZcRRZRRZRRcRRcRZcJZcJRcJRZJJRJJRJRcRZcJRZJRZJJRJJRJRZJRZJRZJRZJZcJZcJRZJRZRRcRZkRZkRZkRZkRZcRRZRRZRZcRZcJZcJZcRZcRZcJZcJRcJRcJRcJRZJRZBJZBJRJJRBJRBJZBJZJRcJRcJRcJRcBRcBJZBJRBJRBJRBJR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJBJRBJRJJJBJRBJRBJZBJZ9BRBJRBJRBJR9BR19J19J9BR9BR9BR9BR19J19J9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19B19B19B19B19B19B19J19J19B19B19B19B19B19B)19)1919B19B)1911919B19B)19)1911919B)19)19!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)9)19)19)19)19)19)19)19)1919B19B11911911919B19B19B19B19B19B11911919B19B19B19B9BJ9BJ19B19B9BJ9BJ19B19B19J9BJ9BR9BR9BJ9BJ9BR9BR9BR9BJ9BJ19J19J19J9BJ9BJ19J9BR9BRBJR9BR9BR9BR9BR9BR9BR9BRBJZBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBJZBJR9BR9BR9BRBJZBJZBJZBJZBJZJJZJJZBJRBJRBJZBJZBJZJRZJJRJJRBJRBJRBJRBJRJJZJJZBJZBJZBJZBJZJRZJRcJRcJRZJJZJRZJRZJRcJRZJRcRZcRZcJRZJJRJRZJRcRRcRZcJZcJRcJRZJRZJRcJRZJRZJJRBJRBJRJRZRRZRRZRRZRRcRRcRRZRRZRZcRZkRZkRZkRZkJZcJRZJRZJRcJZcRZcRRcJRcJRZJRcJRcJRcJRcBRcJRZJJRJJRJJJJJJBJRBJZBJZBJZBRcBJZBJZBJZBJRBJRBJR9BR9BR9BRBJRBJR9BR9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BRBJZBJZ9BR9BR9BRBJR9BR9BJ19J19J9BJ9BJ19J19J19J9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B)19)1919B19B19B19B19B)19)19)19)19)19)19)19)19)19!)1!)1!)1!)1!)1!)1!)1!)1!)9)19)19)19)19)19)19)19)19)1919B19B11911911919B19B19B19B19B11911919B19B19B19B9BJ9BJ19B19B9BJ9BJ19B19B19J9BR9BR9BR9BJ9BJ9BR9BR9BJ9BJ19J19J19J9BJ9BJ9BJ19J9BR9BRBJR9BR9BR9BR9BR9BR9BR9BR9BRBJZBJZBJZBJZBRcBRcBJZBJZJRcBJZBJZBJZBJZ9BR9BR9BRBJZBJZBJRBJRJJZJJZBJRBJRBJZBJZBJZBJZJJRBJRBJRBJRBJRBJZJJZJJZBJZBJZBJZBJZJRZJRZJRZJRZJJZJRZRRcRRcJRZJRZRRcJRcJJRJJRJRZJRZJRZRRcRZcJZcJRcJRZJRZJRZJRZJRZBJZBJZJRZRRZRRZRRZRRcRRZRRZRRZRZcRZkRZkRZkJZcJRcJRZJRZJRcJRcRRcRRcJRZJRZJRZJRZJRcJRcBRcBJZJJRJJJBBB9BJBJRBJZBJZBJZBJZBJZBJZBJZBJRBJR9BR9BR9BRBJRBJRBJR9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19J19J9BJ9BJ9BJ9BJ19J19J19J19J19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B)1919B19B19B19B19B)19)19)19)19)19)19)19)19)19)19!)1!)1!)1!)1!)1!)1!)1!)1!)1))1)19)19)19)19)19)19)19)1919B19B19B11911911919B19B19B19B11911919B19B19B19B19B19B19B19B9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ99B99B9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRBJZBJZBJZ9BRBJZBJZBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJRBJRBJRBJZBJZBJZBJZBJZBJRBJRBJRBJRBJZJJZJJZJJZBJZBJZBJZBJZJJZJJZJJRJJRJRZJRcJRcJRZJRZJRZJRZJRZJRZJRZJRZJRZJJZJRZRZcRZkJRcJRZJJRJJRJRZJRcJRZJRcJZcJZcJZcJZcJRcJRZJJRJJRJZcRZkRZkRZcJRcJRcRRZRRZJRcJRcJRcJRZJRZJRZBJZBJZJRZJRZBJZBJZBJZ9BJ9BB9BB9BRBJZBJZBJZBJZBJZBJZBJZJJJ9BJ9BR9BRBJRJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BRBJRBJR9BJ9BJ9BR9BRBJRBJR9BR9BR9BJ9BJ19J19J19J19J9BR9BR9BJ19J9BJ9BJ9BJ19J19J19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B19B19B119)19)19)19)19)19)19)19)19)19)19)19!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1)19!)9!)9)19)19)19)19)1919B19B19B11911919B19B19B19B11911919B19B19B19B19B19B19B19B9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BJ9BJBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B9BB9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BRBJRBJZBJZBJZ9BRBJZBJZBJZBJZBRcBRcBJZBJZBRcBRcBJZBJZBJZBJZBJRBJRBJRBJRBJRBJZBJZBJZBJZBJZBJZBJRBJRBJZJJZJJZJJZJJZJRZBJZBJZBJZJJZJJRJJRJJRJRZJRZJRZJRZJJRJJRJJZJJZJRZJRcJRcJRZJJZJJZJRcRZcJZcJRZJJRJJRJRZJRcRRcRZcRZcJZcJZcJRcJRcJRZJJRJJRJRZJZcRZcJRcJRcJRcRRZRRZJRcJRcJRZJRZJRZJRZBJZBJZJRZJRZBJZBJZBJZ9BR9BB9BJBJRBJZBJZBJZBJRBJRBJZBJZJJJ9BJ9BJBJRJJJJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BRBJRJJJJJJ9BR9BRBJRBJR9BR9BR9BR9BJ9BJ19J19J9BJ9BR9BR9BJ19J9BJ9BJ19J19J19J19J19J19J19J19J)1919B19J19J19B19B19B19B19B19B19B19B19B19B19B119)19)1911919B19B119)19)19)19)19)19)19)19)19)19)19)19)19!)1!)1!)1!)1!)1!)1!)1!)1!)9!)1))1))1)19)19)19)19)19)19)19)1919B19B11911919B19B19B11919B19B19B19B19B19B19B19B19B19B9BJ9BJ9BJ19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BRBJZBJZ9BR9BRBJZBJZ9BR9BRBJZBJZBJZBJZBJZBRcBJZBJZBJZBJZBJRBJRBJZBJZ9BR9BRBJZBJZBJZBJZBJZBJZBJZJRZJJZJJZBJRBJRJJZJJZBJZBJZJJRRRJRRJJRZJRZJJZJJZJJZJRZJRZBJZBJZJRZJZcRZkRZcJRZJJZJRZJRcJZcJZcJRcJRZJRZJRZRRcRRcRRcRRcRRcJRcJRcJRZJJRJJRJRZJRcJRZJRcJZcJZcJRZJRZJRcJRcJRZJRZJRcJRcJRcJRZJRZBJZBJZBJZBJZBJR9BRBJRBJZBJZBJZBJRBJRBJRBJRBJRBJR9BJJJJJJJ9BJ9BJ19J9BJ9BJ9BB9BJ19J9BJ9BJ9BJ9BRBJRBJRBJR9BR9BJ9BJ9BR9BR9BR9BR9BR9BR19J19J9BJ9BJ19J19J19J19J19J19J19B19B19J19J9BJ19J19B19B19J19J19J19B19B19B19B19B19B19B19B19B119)19)19)19)19)19119)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)1!)1))1)19)19)19)19)19)19)1919B19B11911911919B11911919B19B19B19B19B19B19B19B19B19B19B9BJ19J19J19J99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J99B9BJ9BJ19J19J19J9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BRBJZ9BR9BRBJZ9BR9BR9BRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJZBJZBJZ9BR9BRBJZBJZBJZBJZBJZBJZBJZBJZJRZBJZBJRBJRJJRJJZBJZBJZJJRJJRRRZRRZJRZJJZJJZJRZJRZJRcBRcBRcBRcJZcRZkRZkJRcJRZJRZJRcJZcJZcJZcJRcJJZJJZRRcRZcRRcRRcRRcRRcJRcJRZJJRJJRJRZJRZJRZJRcRZcRZcJRZJRZJRZJRcJRcJRcJRcJRcJRZJRZBJZBJZBJZBJZBJZBJRBJZBJZJRZBJZBJZBJRBJRBJRBJRBJRBJRBJRBJRJJJ9BJ19J19J9BJ9BB9BB99B19J9BJ9BJ9BJ9BRBJZBJZ9BR9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BJ19J9BJ9BJ19J19J19J19J19J19J19B19B19B19J19J19B19B19B19J19J19J19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)1!)1))1))1!)9)19)19)19)19)19)19)19)1911911911919B19B19B19B19B19B19B11911911919B19B19B19B9BJ9BJ19B19B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B99B19B19B9BJ9BJ9BJ9BJ9BR9BR9BR9BRBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJZBJZBJZBJRBJRBJZBJZBJRBJRBJRBJZBJRBJZBJZBJZBJRBJRBJRBJZBJZBJZBJRBJRRRZRRZJJZJJZRRZRRcJRcJRcJZcJRcBRcJRcJZkRZkJZcJRcJRcJRcJRcJRcJRcJRZJRZJRZRZcRZcRZcJZcRZcJZcJRcJRZJJRJJRJJZJRZJRcJZcRZcRRcJZcJRcJRZJRZJRcJZcJZcJRcBJZBJZBJZBJZBJZBJZBJZBJRBJZJJZJRZJRZJRZBJZBJRBJRBJZBJZBJRBJRBJR9BJ9BB99B9BJ9BJ9BJ9BB19B19J9BR9BR9BJ9BJ9BRBJR9BR9BJ19J9BJ9BJ9BJ9BJ1BR1BR9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ19J19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1!)1!)1!)1)19)19!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)1))1))1))1!)9)19)19)19)19)19)19)19)19)1911911919B19B19B19B19B19B11911911911919B19B19B19B19B99B19B19B99999B9BJ9BJ9BJ99B99B9BJ9BJ9BJ99B19B19B19B19B9BJ9BJ9BJ9BR9BJ19J19J9BRBJZ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJZBJZBJZBJZBJZBJZBJZBJZBJRBJZBJZBJZBJRBJRBJZBJZBJZBJRBJRBJRBJRBJRBJZBJZBJZBJR9BRBJZBJZBJZBJZBJRJRZRRZJJZJJZRRZRRcJRcJRcJZcJZcJRcBRcJRcJZkJZkJZcJZcJRcJRcJRcJRZJRZJRZJRcRRcRZcJZcJRcJZcJRcJRZJRZJRZJRZJRZJRcJZcJZcRRcRRcJZcJZcJRcJRcJZcJZcJRcJRZBJRBJRBJZJRZBJZBJZBJRBJRBJRJJZJRZJRZJRcJRZBJZBJZBJZBJZBJRBJR9BR9BJ99B99B99B99B99B99B19J19J9BJ9BR9BJ9BR9BR9BR9BJ9BJ19J19J9BJ9BJ19J19J19J19J9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1!)1!)1!)1!)1)19))1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9))1))1!)1!)9)19)19)19)19)19)19)19)19)19)19)19)1919B19B19B19B11911911911911919B19B19B19B19B19B19B19B99B99999B9BJ9BJ99B99B19B19B9BJ9BJ9BJ19J19J19B19B19B9BJ9BJ9BJ9BJ19J9BJ9BR9BR9BR19J19J9BR9BRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJRBJRBJR9BR9BRBJRBJZBJZBJZBJRJJRJJRJJRBJZBJZBJZBJZBJZBJZBJZBJZBJZJJZJRZJRZJJZJJZJJZJRZBRcBRcJRcJRcJRcJRcBRcJRcJZkJZkJRcJRcJZcJRcJRcJRZJRcJRcJRcJRcJRZJJZJJZJRZJRZJRcJRcJZcJZcJRcJRcJRZJRcJRcJZcJZcJZcJRcJRcJRcJRcJRZBJRBJRJJZJRZBJZBJZBJRJJJBJRBJZBJZJRcJRcBJZBJZBJZBJZBJZBJRBJR9BJ9BJ99B99B99919B19B19B19J9BJ9BJ9BJ9BJ9BR9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J9BJ9BJ9BJ19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19))1))1))1!)1!)1!)1!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9))1))1!)9!)9)19119)19)19)19)19)19)19)19)19)19)1919B19B19B19B19B119)19)1911919B19B19B19B19B19B19B99B99B99B99B9BJ9BJ99B19B19B19B9BJ9BJ19J19J19J19B19B19B99B9BJ9BJ9BJ19J9BJ9BJ9BR9BR19J19J19J9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJRBJR9BR9BRBJRBJZBRcBJZJJRJJJJJRJJRBJZBJZBJZBJZBJZBJZBJZJRZJRZJRZJRZJRZJJZJJZJJZJJZBRcBRcJRcJZcJZcJRcBJZBRcJRcJZkJZcJZcJZcJZcJRcJRZJRcJRcJRZJJZJJZJJZJJZJJZJJZJRZJZcJZkRZcJZcJRcJRZJRcJRcJZcJZcJZkJZcBRcBRcJRZBJZBJRBJRJJZJRZBJZBJZBJRBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJR9BJ9BJ99B99B99B11911911919B19J9BJ9BB9BB9BJ9BR19J19J9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J9BJ9BJ19B19B19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19))1))1))1!)1!)1!)9!)9!)1!!)!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)1!)1!)9)19)19)19)19)19)19)19)19)19)19)1919B19B11911919B19B19B119)19)1911911911911919B19B19B99B99B9BJ9BJ9BJ9BJ9BJ19J19B19J9BJ9BJ19J19B19B19B19B19B19B9BJ9BJ9BJ19J19J19J19J9BR9BR9BR19J19J19J9BR9BR9BR9BR9BRBJRBJRBJRBJRBJRBJR9BR9BR9BR9BR9BRBJRBJZBJZBJRBJRBJRBJZBJZBJZJJJJJJBJRBJRBJRBJZBJZBJZBJZBJZJJZJRZBJZBJZJRZJRZJJZJJZJRZJRZBRcJRcJZcRZcJZcJRcBRcBRcJRcJZcJZkJZkJZcJRcJRZJRZJRZJRZJJZJJZJRZRRcRRcJRZJJZJRZJRcJZcRRcRRcJZcJRcBRcBJZJRcJZcJZcJZcJRcBJZBRcBJZBJRBJRBJZJRZJRcBJZBJZBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJR9BJ9BJ9BB9BB99B19B11911919B19J9BJ9BB9BB9BJ1BR19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19J9BJ19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)1!)1))1)19)19)19!)1!!)!)1!)1!)1!)1!)1!)1!)1!)1!)9!)1!)1!)1!)9)19)19)19)19)19)19)19)19)19)19)1919B19B11911919B19B19B19B119)1911911911911919B19B99B99B99B9BJ9BJ9BJ9BJ9BJ19J9BJ9BJ9BJ19J19B19B19B19B19B19B19B9BJ9BJ19J19J19J19J19J9BR9BR9BR9BR19J19J19J9BR9BR9BR9BRBJRBJRBJRBJRBJRBJR9BR9BR9BR9BR9BR9BRBJZBJRBJRBJRBJRBJZBJZBJRJJJJJJBJRBJRBJRBJRBJZBJZBJRBJRJJRJJZJRZBJZJRZJRZJJZJJZJRZJRZBRcJRcJZcRZcJRcBRcBRcBRcJRcJRcJZkJZkJRcJRcJRcJRZJRZJRZJJZJJZRRcRZcRZcRRcJRZJJZJRZJRcRRcRZcRZcJZcBRcBJZBJZJRcJZcJZcJRcBJZBJZBJZBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BJ9BJ9BB9BB99B19B19B11919B19J9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1!)1!)1)19)19)19))1!)1!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)9!)9))1))1)19)19)19)19)19)19)19)19)1911919B19B19B19B19B19B11911911911911919B11911999B99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B19B99B99B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BRBJR9BR9BR19J19J9BJ9BR9BR9BRBJRBJRBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BRBJRBJRBJRBJRBJR9BRBJRJJJJJJBJRBJR9BR9BRBJZBJRBJRJJJJJRJJRJJZJRZBJZBJZJJZJJZJJZJRZJRZJRcJRcJRcJRcBRcBRcBRcBRcBRcJRcJRcJZkJZkJRcJRZBJZBJZBJZJRZRRcRZkRZcRZcJRZJRZJRZJRcRZcRZcJZcJRcBRcBRcBJZJRcJZkJZkBRcBJZJRZJJZJJRBJRBJRBJZBJZBJZBJZBJZBJZ9BRBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BJ9BJ19B19B19B19B11919B19J9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J9BJ19J19B19B19B19B19J19J19B19B19J19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19!)9)19)19)19)19)19)19)19)19!)1!)1))1))1)19)19))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)9!)9))1))1)19)19)19)19)19)19)19)19)19)19)19)1919B19B19B11911911911911919B19B11911999B99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B19B19B9BJ9BJ19B19B19B19B19B19J19J19J19J9BJ9BJ9BJ9BR9BR9BR9BR19J19J9BJ9BJ9BR9BRBJRBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BRBJRBJRBJRBJR9BR9BRJJJBJRBJRBJR9BR9BRBJRBJRJJJJJJJJJJJRJJRBJZBJZBJZJRZJJZJJZJJZJRZJRZJRcJRcBRcBRcBRcBRcBRcBRcBRcBRcJZkJZkJRcJRZBJZBJZBJZJRZJRcRZcRZcJRcJRcJRZJRZJRcJZcRZcJZcJRcBRcBRcBJZBRcJRcBRkBRcBJZJJZJJRJJRBJRBJRBJRBJZBJZBJZBJZBJZ9BRBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR19J19B19B19B19B19B19B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19B19B19B19B19B19J19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19!)9)19)19)19)19)19)19)19)19!)1!)1))1))1)19))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)1919B19B119119)19)1919B19B11911999999B99B99B19J9BJ9BJ9BB99B9BJ19J19B19B19B9BJ9BJ19J19B19B19B19B19B19B19J19J99B99B9BJ9BJ9BJ9BR9BR9BR9BJ19J9BJ9BJ9BJ9BRBJZBJZBJZBJZBJZBJZ9BR9BRBJR9BR9BR9BJ9BRBJRBJRBJRJJJJJJBJR9BRBJRBJRBJRBJZ9BR9BRBJRJJJJJRJJRJJRJJRBJZBJZBJZBJZJRZJJZBJRBJRJRZJRZJRZJRcBRcBRcJZkJRcBRcBRcBRcBRcJRcJRcJRcBJZJJZJJZBJZJRZJRcJRcJRcJRcJRZJRZBJZBRcJRcJZcJZcJRcBRcBRcBJZBJZBRcBRcBRcBJZBJZBJRBJZBJRBJRBJRBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BRBJZ9BR9BR19J19J19J9BB9BB19B19J9BB9BJ9BJ19J19J9BJ9BR9BR9BJ19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1))1)19))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19119119119)19)19)1919B11911911919B99B19B19J19J9BJ9BJ99B99B19J19J19B19B99B9BJ19J19B19B19B19B19B19B19B19B19B99B99B99B9BJ19J19J9BR9BR9BJ19J9BJ9BJ9BJ9BR9BRBJZ9BR9BRBJZ9BR9BR9BR9BR9BR19J9BJ9BRBJRBJRBJRJJJJJJBJR9BRBJRBJR9BR9BR9BRBJRJJJJJJJJRJJRJJRJJRBJZBJZBJZBJZJRZJRZBJRBJRJRZJRZJRZJRZBJZBRcJZkJZkJRcBRcBRcBRcBJZJRZBJZBJZJJZJJZBJZBJZBJZBJZBJZJRZJRZJRZBJZBJZJRcJRcJRcJRcBRcBRcBJZBRcBRcBRcBRcBJZBJRBJRBJZBJZBJZBJRBJZBJZBRcBRcBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR19J19J19J9BJ9BJ9BB9BJ9BJ9BB9BB19J19J19J9BJ9BR9BR9BJ19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1)19)19))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)9)19)19)19)19!)9))1))1)19)19)19)19)19)19)19)19119119111119)1919B19B19B11911919B19B19B19B19B19B99B99B99B99B9BJ9BJ19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J9BJ9BR9BR19J19J9BR9BR9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BR19J9BR9BR9BR9BR9BR9BRBJR9BR9BR9BR9BR9BR9BR9BR9BRBJRJJJBJRBJRBJRJJRJJRJJZJJZJRZJRZBJZJRZJJZJJZJRZJRcJRZBJZBJZBRcJZkJZkJRcJRcBRcBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZJJZJJZJJZJRZJRZBJZBJZBJZBJZBRcBRcBRcBRcBRcBRcBJZBJZBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR1BR19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19J9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B)19)19)19)19)19)1919B119)19)19)19)19)19)19)19!)9!)1))1)19)19))1))1!)9!)9))1))1)19)19))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)9)19)19)19)19!)1!)1))1)19)19)19)19)19)19)19)19119119))1)19)1919B19B)1911911911919B19B19B19B19B99B99B99B99B9BJ9BJ19J19B19B11919B19B19B19B19B19B19B19B19B19B19J19J19J19J19J9BJ9BR9BR19J9BJ9BR9BR9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRJJJJJJBJRBJRBJRJJRJJRJJZJRZJRcBJZBJZJJZJJZBJZBJZBJZBJZBJRBJZJRcJZkJRcJRcBRcBJZBJRBJRBJZBJZBJZBJZBJRBJRBJZBJZBJZBJZJJZJJZJJZJJZBJZBJZBJZBJZBJZBJZBRcBRcBRcBRcBRcBJZBJZBJRBJRBJRBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BR9BR9BR9BR9BR19J19J19J19J9BJ9BJ19J19J9BJ9BJ19J19J19J19J19J19J9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B)1919B19B19B)19)19)19)19)19)1919B119)19)19)19)19)19)19)19!)9!)1!)1))1))1))1))1!)1!)1))1))1)19)19))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)9)19))1))1!)1!)9)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)1911911911911911911999999999919B19B99B9BB19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BRBJR9BJJJJBJRBJRBJRBJRBJRBJZJRZJRcBJZBJZBRcBRcBJZBJZBJZBJZBJRBJRBRcBRcBJZBJZBRcBRcBJZBJRJJZJRZBJZBJZBJRBJRBJZBJZBJZBJZJRZJRZJRcBJZBJZBJZBJZBRcBJZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJZBJZBJZBJZBJZBJZBJR9BR9BR9BR9BR9BR9BR9BR9BRBJR9BR9BJ19J19J19J19J19J9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B)1919B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)1!)1))1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)9!)1))1))1!)9)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)1911911911911911911999999919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BR9BR9BJ9BJBJRBJRBJRBJRBJRBJRBJZBJZBJZBJZBRcBRcBJZBJZBJZBJRBJRBJRBJZBRcBJZBJZBJZBJZBJZBJRJJZJJZBJZBJZBJRBJRBJZBJZBJZBJZJRZJRZBRcBJZBJZBJZBJZJRZBJZBJZBJZBJZBJZBJZBJZBJZBJRBJRBJRBJRBJRBJZBJZBJZBJRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BJ9BJ19J19J19J19J9BJ9BJ9BJ9BJ19J19J19J9BJ9BJ9BJ9BJ19J19J1BR19J19J19J19J19J19J19B19B19B19J19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)1))1))1))1!)1!)1))1))1))1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9))1))1!)1!)9)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1))1)19)1911911911911911911919B19B11911919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B9BJ9BJ9BJ19J19J19J19J19J9BJ9BJ9BR9BR19J9BJ9BR9BR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BR9BR9BR9BR19J19J9BJ9BJ9BJ9BRBJRBJRBJZBJZBJRBJRBJRBJRBJZBJZBJZBJZBJRBJRBJZBJZBJRBJRBJZBJZBJZBJZJJZJJZBJZBJRJJZJJZJRZBJZBJRBJRBJRBJZBJZBJZBJZBJZJRZJJZBJRBJRJJRJJRJRZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BRBJRBJRBJRBJRBJRBJR9BR9BR9BR9BR9BR9BR9BRBJR9BR9BR19J19J19J19J19J9BJ9BJ9BJ9BJ19B19B9BJ9BJ9BJ19J19J19J19J1BR1BR19J19J19J9BJ19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B11911919B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1!)1!)1!)1!)1!)1))1))1))1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9))1))1!)9!)9)19119)19)19!)9!)9)19)19)19)19)19)19)19)19)19))1))1))1))1))1119119)19)1911911919B19B11999919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B9BJ9BJ19J19J19J19J19J19J9BJ9BJ9BR9BR19J19J9BR9BR19J19J9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BR9BR9BR9BR9BJ9BJ9BR9BR9BRBJRBJRBJZBJZBJRBJR9BR9BRBJRBJZBJZBJZBJRBJRBJZBJZBJRBJRBJRBJRBJRBJRJJZJJZBJRBJRJJZJJZJJZBJRBJRBJRBJRBJRBJRBJRBJRBJRBJZJJZBJZBJRBJRJJRBJZBJZBJZBJZBJZBJZBJZBJZ9BR9BR9BR9BRBJRBJRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR19J19J19J19J19J19J9BJ9BJ9BJ19B19B19B9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B119)19)19119119)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19))1))1!)9!)9!)1!)1!)1!)1))1))1))1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9)19))1))1)19)19!)9!)9))1))1)19!)9)19)19)19)19111))1))1))1))1))1)19)19)19))111911911919B99B99B99B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BR9BR19J19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BRBJRBJRBJRBJRBJZBJRBJR9BR9BJ9BJ9BRBJZBJZBJZBJZBJZBJZ9BRBJRBJRBJRBJRBJRBJZJJZJJZBJRBJRJJZJJZBJRBJRBJRBJRJJRJJRJJRJJRBJRBJRBJRBJZBJZBJZBJRBJRBJRBJZBJZBJZBJZ9BRBJRBJR9BR9BR9BR9BRBJRBJRBJRBJZBJZBJZ9BR9BR9BR9BR9BR19J9BJ19J19J19J19J19J19J19J19B19B19B19B19B19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19119)19))1!)1)19)19)19)19)19)19!)1))1)19)19!)1!)1!)1!)1!)1))1))1))1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!)1!)1!)1!)1!)1!)1!)9!)9!)9))1))1))1)19!)9!)9)19))1))1)19!)9)19)19)19)19))1))1))1))1))1))1)19)19)19))111911911911999B99B99B99B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BR9BR9BJ19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BRBJRBJRBJRBJRBJRBJR9BR9BR9BJ9BJ9BR9BRBJZBJZBJZBJZBJZBJZBJRBJRBJRBJRBJRBJZBJZBJRBJRBJRJJZBJZBJRBJRBJRBJRBJRJJRJJRBJRBJRBJRBJRBJRBJZBJZBJZBJRBJRBJRBJZBJZ9BRBJRBJRBJR9BR9BR9BR9BRBJRBJRBJR9BRBJZBJZ9BR9BR9BR9BR19J19J19J19J19J19J19J19J19J19B19B19B19B19B19J19J19J19J19J19J19J19J19J19J19J19J19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B119)19)19)19)19)19)19)19)19)19)19)19)19)19!)1!)1)19)19)19)19)19))1!)1!)1))1))1!)1!)1!)1!)1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)9!)9!)1))1))1))1)19!)9)19))1111))1)19)19)19)19111))1)19)19))1))1!)1!)9)19)19)19)1911911911911911999B99B99B19B19B11911919B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BB9BB9BJ9BJ9BR9BR9BRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJZBJZBJZBJZBRcBRcBJZBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BR9BJ9BJ9BRBJRBJRJJJBJRBJRBJZBJZBJRBJRBJR9BR9BRBJRBJRBJR9BR9BR9BR9BR9BR9BJ9BJ9BJ9BR9BRBJZ9BR9BR9BR9BR9BJ19J19J19J19J19J19B19B19B19B19B19B19B19B19J19J19B19B19J19J19J19J19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B)19)19)19)1919B19B19B19B119)19)19)19)19)19)19)19)19)19)19)19!)9)19)19)19)19)19)19))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)9!)1!)1))1))1)19!)9!)9))1))1))1)19)19)19)19)19))1))1!)9!)9)19))1)19)19)19)19)1911911911911911911911999B99B19B19B11911919B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19J19J19J9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BB9BB9BJ9BJ9BR9BRBJRBJRBJR9BR9BRBJRBJR9BR9BR9BR9BR9BR9BRBJZBJZBJZBJZBRcBRcBJZBJZBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BR19J19J9BJBJRBJRJJJBJRBJRBJRBJRBJRBJRBJR9BR9BRBJRBJR9BR9BR9BR9BR9BRBJR9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BR9BJ19J19J19J19J19J19B19B19B19B19B19B19B19B19J19B19B19B19J19J19J19J19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)1919B19B19B119)19)19)19)19)19)19)19)19)19)19!)9!)9)19)19)19)19)19))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1))1))1))1))1))1!)9!)9!)9))1))1))1)19))1))1)19!)9!)9)19))1))1)19)19)19))1)19)1911911911911919B19B91999999999B99B99B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J9BJ19J19B19B9BJ9BJ9BJ9BJ9BJ9BJ19J9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BR9BRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJZ9BR9BR9BR9BR9BRBJZBJZBJZBJZBJZBJZ9BRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJ9BJBJRBJRBJRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BR9BRBJRBJR9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ19J19B19B19B19B19B19B19J19J19B19B19B19B19J19J19J19J9BJ19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B)19)19)1919B19B)19)19)19)19)19)19)19)19119)19)19)19)19)19)19)19!)9!)9!)1!)1!)1!)1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1))1))1))1))1!)9!)9!)9!)1))1))1!)9!)9)19))1)19!)9!)9!)9))1))1)19)19))1))1)19)1911911911911919B19B91991911911999B99B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19J19J19J19B19B19B9BJ9BJ19J19J9BJ9BJ9BJ19J9BJ9BJ19J19J19J19J9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BJ19J9BJ9BJ9BJ9BR9BR9BRBJRBJRBJRBJRBJRBJRJJJJJJBJRBJR9BR9BR9BR9BR9BR9BRBJZBJZBJZ9BR9BR9BRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJRBJR9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJR9BR9BR9BR9BR9BR9BR9BR9BRBJR9BR9BR9BR9BRBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B11919B19B19B19B19J19J19B19B19B19B19B19J19J19J19J19B19B19B19J19B19B19B19B19B19B19B19B19B19B19B)19)19)1919B19B19B)19)19)19)19)19)19)19)19)19)19)19!)9)19)19)19)19!)9!)9!)1!)1!)1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1))1))1))1!)9!)9!)9!)1!)1))1))1!)9!)9)19)19))1)19!)9!)9))1))1)19)19)19)19)19)19)19)19)19)1911911911911911911911919B19B19B19B19B19B19B11911919B19B19B99B99B9BJ9BJ19J19B19B19B19B9BJ9BJ19J19J9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J9BJ9BJ19J19J9BJ9BJ9BJ9BJ9BJ19J19J9BJ9BJ9BR9BR9BR9BR9BRBJRBJRBJR9BJ9BJ9BJ9BR9BR9BRBJRBJR9BR9BRBJRBJR9BR9BRBJRBJRBJRBJRBJRJJRJJRBJRJJJ9BJBJRBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJRBJRBJR9BR9BR9BJJJJBJRBJR9BR9BRBJRJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19B19B19J19J11911919B19B19B19B19B19B19B19B19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19!)9)19)19)19)19!)9!)9!)1))1))1)19)19!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!)1!)1))1))1!)9!)9!)9!)9!)1!)1))1))1!)9!)9)19)19))1))1)19!)1))1))1)19)19)19)19)19)19)19)19)1911911911911911911911911911919B19B19B19B19B11911911919B19B99B99B9BJ9BJ19J19B19B)1919B19B9BJ9BJ19J19J19J9BJ9BJ9BJ9BJ19J19J19J19J19J19J19J19J19J19J19J9BJ9BJ9BJ9BJ19J19J9BJ9BR9BR9BR9BR9BR9BR9BRBJR9BR9BJ9BJ19J9BJ9BJ9BRBJRBJRBJRBJRBJR9BJ9BJ9BRBJRBJRBJRBJRBJRJJRJJRJJJJJJ9BJ9BJBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BR9BR9BJ9BJ9BJBJRBJR9BRBJRJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19J19J19B19B19B19J19B11911919B19B19B19B)19)1919B19B19J19J19B19B19J19J19B19B19J19J19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B19B)19)19)19)19)19)19)19)19!)9!)9!)9)19)19)19)19!)9)19)19)19!)9!)9!)9))1))1)19)19!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)9!)9!)9!)9!)9!)1!)1!)1!)9!)9)19))1))1)19)19))1))1))1))1)19)19)19)19)19)19)19)1911911911911911911911911911911919B11911911911911911911919B99B99B99B9BJ19J19B19B19B19B19B19B19J9BJ9BJ19J19B19B19J9BJ99B99B19J19J19J19J19B19B19B19B19B19B19J9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BR9BJ9BJ9BJ9BJ9BR9BJ9BJ19J19J9BJ9BRBJRBJRBJZBJR9BJ9BJ9BJ9BJBJRBJRBJRBJRBJRBJRJJJ9BJ9BJ9BJ9BJ9BJBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BRBJRBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BJ9BJ99B9BB9BJ9BR1BR19J19B19B19B19B99B99B19B19B19B19B19B19B11911919B19B19B19B19B19B19J19J19J19B19B19B19B19B19B19B)19)1919B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9)19)19)19)19)19)19!)9!)9!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!)1!)1!)9!)9!)9!)9!)9!)1!)1!)1!)9!)9!)9))1))1)19!)9!)9))1))1))1))1)19)19)19)19)19)19)1911911911911911911911911911911911911911911911911911911911919B99B99B19B19B19B19B19B19B19B19B19B19B19J19J19B19B19B19B19B99B99B19J19J19J19B19B11919B19B)19)1919B19J19J19J19J9BJ9BJ9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B19B9BJ9BRBJRBJZBJZBJR9BJ9BJ9BJ9BRBJRBJRBJRBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BJ99B99B99B9BJ9BR1BR19J19B19B19B19B99B19B19B19B19B19B19B19B11911919B19B19B19B19B19B19B19J19J19B19B19B19B19B19B19B)19)1919B19B)19)19)19)19)19)19)19)19)19)19!)9!)9)19)19!)9!)9!)9!)9!)9)19)19)19119)19)19!)9!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)))1))1!)9!)9!)9!)9))1))1))1))1!)9!)9!)1!)1))1)19!)9!)9))1))1))1))1)19)19)19)19)19)19119119119)19)1919B119119119119119119119119)19)1919B19B11911919B19B19B19B11911919B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99B9BJ19J19B19B11911919B)19)19)1919B19B19B19B19B19B19J9BJ9BJ9BJ9BJ9BJ9BB9BB9BJ9BJ9BJ19J19B19B9BJ9BRBJRBJZBJZBJR9BJ9BJ9BRBJR9BR9BR9BJ9BJJJJJJJ9BJ9BJBJRBJR9BJ9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19J19B19B19B19B19J1BR9BR9BJ9BJ9BJ9BB9BB19B19B19B19B11911919B)1919B19B19B)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19!)9)19)19!)9!)9!)9!)9)19)19)19)19)19)19)19!)9!)9!)9!)1!)1!)9!)1!)1!)1!)1!)1!)1!)1))1))1!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)))1))1!)9!)9!)9))1))1))1))1))1!)9!)9!)1!)1!)9!)9!)9!)9))1))1))1))1)19)19)19)19)19)19119119)19)19)19)19119119119119119119119119)19)1919B19B11911911919B19B11911911919B19B19B19B19B19B19B19B19B19B19B19B19B19B99B99B19J19B19B119119119)19)19)1919B19B19B19B19B19B19B19B19J99B99B9BJ99B9BB9BB9BJ9BJ19J19B11919B9BJ9BRBJRBJRBJRBJR9BJ9BJBJRBJRBJR9BJ9BJ9BJJJJJJJ9BJ9BJBJRBJR9BJ9BJBJRBJR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B99B99B9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BB9BB9BJ19B19B19B19B19B19J19J9BJ9BJ9BJ9BJ9BB9BB19B19B19B19B11911919B)1919B19B)19)1919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)9)19)19)19)19)19)19)19)19!)9!)9!)9!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1))1))1!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)))1))1!)9!)9))1))1!)1!)1!)1!)9!)1!)1!)1!)9!)9!)9!)9!)9!)9))1))1))1)19!)9!)9)19)19)19)19)19)19)19)19)1911911919B)1911911911911911919B11911911911911911911911911911919B19B19B19B19B19B19B19B19B19B19B19B19J19J99B99B19B19B19B11911911919B19B19B19B19B19B19B19B)19)1919B19B99B99B19B19B9BB9BJ9BJ9BJ19B19B11919B19J9BR9BJ9BJBJRBJR9BJ9BJBJRBJR9BJ9BJ9BJ9BJJJJJJJBJR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B99B99B9BB9BJ9BJ9BJ9BJ9BB9BJ9BJ9BJ9BB9BB9BB99B19B19B19B19B99B19J9BJ9BJ9BJ19B19B19B19B11911919B19B11911911919B19B19B19B19B19B19B)19)1919B19B19J19J19B19B19B19B19J19J19B19B)19)19)19)19)19)19)19)19)19)19119)19)19!)9!)9!)9!)9!)9)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)1!)1)19)19))1))1!)1!)1!)9!)9!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!!)!!)!!)!)1))1))1!)9!)9))1))1))1!)1!)9!)9!)1!)1!)1!)9!)9!)9!)9!)9!)9!)9))1))1)19!)9!)9)19)19)19)19)19)19)19)19)19119119)19)1911911911911919B19B11911911911911911911911911911919B19B19B19B19B19B19B19B19B19B19B19B19J9BJ99B99B19B19B19B19B11911911919B19B19B19B19B19B19B)19)1919B19B99B19B19B19B99B9BB9BJ9BJ19B19B19B19B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ99B99B99B19B19J9BJ9BJ9BB9BB9BJ9BJ9BJ9BB9BB9BB99B19B19B19B99B99B19B19J9BJ19B19B19B19B11911911919B19B11911919B19B19B19B19B19B19B19B)19)1919B19B19J19J19B19B19B19B19J19J19B19B)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9)19)19)19)19)19)19)19)19!)9!)9!)9!)1!)1!)1))1))1))1))1!)1!)1!)9!)9!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)9!)1))1))1))1!)9!)9!)1!)1!)1!)1!)9!)9))1))1!)9!)9))1))1))1)19))1))1))1)19)19)19)19)19)19)19)19)1919B19B119119119119119119119119119119119)19)19)19)19)1919B19B99B19B19B19B19B19B)19)1919B19B19B19B99B99B19B19B19B)1919B11911919B19B19B)19)1919B19B19B19B19J19J19B19B19B19B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJJJJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BR9BR9BJ9BJ9BJ9BB99B9BJ9BJ9BJ9BJ9BJ9BB9BB9BB99B99B99B9BJ99B99B19J9BJ9BB9BB9BJ19J19J9BJ9BJ9BB9BJ19J19B19B11911919B19B19B19B19B11919B11911911919B19B11911919B19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)1919B)19)19)19)19119)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9)19))1))1)19!)9!)9!)9!)1!)1!)9!)9!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)9!)1))1))1)19)19!)9!)1!)1!)1!)1!)1!)9))1))1!)1)19))1))1))1))1))1))1))1))1)19)19)19)19)19)19)1911911919B119119119999119119119119119119)19)19)19)19)1911911919B99B99B19B19B19B19B)19)1919B19B19B19B19B19B19B19B)19)1919B19B11999919B19B)19)1919B19B19B19B19J19J19B19B19B19B99B99B99B9BJ9BJ9BJ9BJ9BJ9BB9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BR9BR9BJ9BJ9BJBBB99B99B99B9BJ9BJ9BJ9BB9BB9BB9BB99B99B9BJ9BJ99B99B19B9BJ9BJ9BJ9BJ19J19J19J9BJ9BB19J19J19B19B11911911919B19B19B11911911911911911911919B11919B19J19J19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9))1))1!)9!)9!)9!)9!)1!)1!)9!)9!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!)1!)1!)1!!)!!)!)1!)1!)1!)1))1))1))1))1))1))1))1))1)19)19!)1!!)))1))1))1))1!)9!)9))1))1))1))1))1))1))1))1))1))1))1)19)19)19))1))1119119119119119119919999119119999119119)19)19)19)19)1919B19B11911999B99B9BJ19J19B19B)19)1919B19B19B19B19B19B19B19B)19)19)1919B19B99B99B19B19B19B19B19B19B19B19B19B19B11911911999B99B9BB9BJ9BJ9BJ99B99B99B99B9BB9BJ9BBBBB9BJ9BJ9BJ9BJ9BJ9BBBBB9BB9BJ9BJ9BJ9BJ9BR9BJ9BJ9BB9BJ9BJ9BB99B99B99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ19B19B19B99B9BJ9BJ9BB99B19J19J9BB99B19B19B19B19B11911911919B19J19B11911911911911911911911919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)1919B)19)19)19)19)19!)9)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9)19)19!)9!)9!)9!)9!)1!)1!)1!)1))1)19))1))1!)1!)1!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!!)!!)!!)!)1!)1!!)!!)!)1!)1!)1!)1))1))1))1))1))1119))1)19)19)19!)1!!)))1))1))1))1!)9)19)19111))1))1))1))1))1))1))1))1))1))1)19)19)19))111911911911911911991991911919B119119)19)19)19)19)19)1919B19B11911911999B99B99B19B)19)19)1919B19B19B19B19B19B19B19B)19)19)1919B99B99B99B99B19B19B19B19B19B19B19B11911911911919B99B99B9BB9BB9BJ99B99B99B99B99B9BB9BB9BB9BB9BJ9BJ9BJ99B9BB9BB9BB9BB9BJ9BJ9BJ9BJ9BJ9BJ9BBBBB9BJ9BJ9BB99B99B99B99B99B99B9BJ9BJ9BJ9BJ9BJ9BJ99B19B19B99999B9BJ19J99B99B9BJ19J99B19B19B19B19B19B19B11911919B19B19B119111111111111119111119)1919B11919B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B19B)19)19)19)19!)9!)9)19)19)19!19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)1!)1!)1!)1!)1)19)19))1))1!)1!)1!!)!!)!)1!)1!)1!)1!!)!!)!!)!)1!)1!)1!)1!)1!)1!!)!!)!!)!)1!!)!!)!!)!)1!)1!)1!)1))1))1))1))1))1)19)19)19!)9!)9))1)))!)1!)1))1))1))1)19)19)19))1))1)19)19)19))1))1))1))1))1)19)19)19)19)19)19)19)19)1911911911919B19B119)19)19)1919B19B)19)19)19)19)1919B11999B99B19B119)19)19)1919B19B19B19B19B19B19B19B)19)1911911999BB9999999919B19B19B19B19B19B11911911911911919B99B9BB9BB99B19B19B19B99B9BB9BB99B99B9BB9BB9BJ9BB99B99B99B9BB9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BJ9BBBBB9BJ9BJ99B99B19B19B19B19B19B19B99B99B99B99B99B99B11911999B9BB9BB99B11999999B99B19B19B19B9BJ19J19B19B11911911919B119119))1))1))1111111111)19119119119119)19)1919B19B11911919B19B11911919B19B)1919B19B19B19B19B)19)19)19!)9!)9)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)1!)1!)1!)1!)1!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1))1))1))1))1))1)19)19)19)19)19!)9))1))1!)1!)1))1))1))1))1)19)19))1))1)19)19)19)19))1))1))1)19)19)19)19)19)19)19)19)19)19)1911911919B19B)19)19)19)1919B19B)19)19)19)19)1919B119119119119)19))1)19)1919B19B19B19B19B19B19B119)19)19))111999999991911911919B19B19B19B11911911911911919B19B99B99B99B19B19B19B19B99B9BB9BB99B99B9BB9BB9BB9BB99B99B99B99B9BJ9BJ9BB9BB99B19J9BJ99B9BB9BB9BJ99B99B99B19B19B19B19B19B19B99B99B99B99B99B99B11911999B99B99B19B11911999B19B19B19B9BJ9BJ9BJ99B19B119119119119119119))1))))))111111))1))1119119119119)19)1919B19B11919B19B19B19B11919B19B)19)1919B19B19B)19)19)19)19!)9!)9)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)1!)1!)1!)1!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!)1!)1))1))1))1))1))1)19)19)19)19)19)19)19!)9!)1))1))1!)1)19))1))1))1))1))1))1))1))1)19)19))1))1)19)19)19)19))1))1119119)19)19119119)19)19)19)19)19)19)19)19)19)19119119)19)19)19119119119119))1))1))1))1)1919B19B19B19B99B99B19B119)19)19))1111119119119)19)19)1919B19B11911919B19B)19)191191199999191191191191199199999BB9BB99B99B99B9BB9BB99B99B99B11919B9BJ9BJ9BB99B19B19B99B99B19B19B99B99B99B99B19B19B19B19B11911999B99B19B19B99B99B19B19B11911919B19B19B19B19B19B19B19B9BJ9BJ9BJ99B119119119999999119119))1))1))1111119))1))1119119119)1919B19B19B19B19B19B19B19B19B19B119)19)19)19)1919B19B)19)19)19)19)19!)9!)9)19)19)19)19)19)19)19!)9)19)19!)9!)9!)9!)9!)9!)9!)9!)9))1))1!)9!)9!)1!)1!)1!)9!)9!)9!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1))1))1))1))1)19)19)19)19)19)19119)19)19!)9))1))1!)1!)9))1))1))1))1))1))1))1))1)19)19))1))1)19)19)19))1))1))1119119)19)19119119)19)19)19)19)19)19)19)19)19))1119119)19)19)19)19119119))1))1))1))1)19)19)1919B11911999999B999119)19)19))1))1119119)19)19)1911919B11911911919B19B)19)191199999191191191191191199199999BB9BB99B99B99B99B99B99B99B99B11919B99B99B99B11919B19B99B99B19B19B19B99B99B99B19B19B19B19B11911999B19B19B19B19B99B19B19B11911919B19B19B19B19B19B19B19B9BJ9BJ9BJ99B119119119119119119119)19))1))1119119))1))1119119)19)1919B19B19B19B19B19B19B19B19B119)19)19)19)19)19)19)19)19)19)19119)19)19)19)19)19!)9!)9)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9)19))1))1))1!)9!)9!)1!)1!)1!)9!)9!)1!)1!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!)1!)1))1))1!)9)19)19))1)19)19)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1119119111111))1))1))1)19)19)19)19111119119)19)19)19)19)19)19))1))1))1)19)19!)9!)9)19)19)19)19!)9)19)19)19)19)19119119119119119119119)19)19)19)19)19)19)19)1919B19B119)19)19)19)19)19)191191191191191191191191191191199999BB9BB9BB99B19B11991999999B99B11911999B99B99B11911911999B99B19B19B19B19B19B11919B19B19B19B11911911919B19B19B11911919B99B99B99B11919B99B9BB99B99B11919B99B9BB9BJ19J19B119)19119119119119119))1))1111111))1))1119119)19)1911919B19B19B11911919B19B119119)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9))1))1))1!)9)19)19))1))1))1))1!)1!)1!)1!!)!!)!)1!)1!)1))1))1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1))1))1!)1!)9))1))1)19)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1119111111))1))1))1))1))1)19)19))1))1119119)19)19)19)19)19))1))1))1))1))1!)9!)9!)9)19)19)19!)9!)9)19)19)19)19)19)19119119119119)19)19)19)19)19)19)19)19)19)1919B19B)19)19)19)19)19)19)1911911911911911911911911911911911999B99B99B99B11911991999999999B11911999999B11911911911999B99B11911919B19B11911919B19B19B19B11911911911919B11911911999999B99B99B11999B9BB9BB9BB99B11911911919B19J19J19B119)19)19)19119119119)19))1111111))1))1119119)1911911911919B11911911919B119119119)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9)19)19)19!)9!)9!)9)19)19!)9)19))1))1!)9!)9)19))1))1))1))1))1!)1!)1!!)!!)!!)!!)!)1!)1))1))1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1)19!)9))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1119119)19)19)19)19))1))1))1))1))1))1!)9!)9)19)19)19!)9))1))1))1))1!)1!)1)19)19)19)19)19)19)19)19)19)19)19)19))1))1)19)19)19)19)19)19)19)19)19)19)19)1911911919B19B11911911911911911999999999911911911911911911911911911911911919B19B19B19B99B99B11911911911911911911911911911919B19B11911911911911911911919B19B19B19B19B9BB9BB19B19B11911919B19B19B19B119119)19)19))1119119119119)19119119119119119119119119119119119119)19119119119119)19)19)19)19)19)19)19119)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9)19)19)19)19)19)19!)9!)9)19)19))1))1!)1!)9!)9!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!)1!)1!)1))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1!)9!)1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1119119)19)19)19))1))1))1))1))1))1))1!)9)19))1))1)19!)9))1))1))1))1!)1))1)19)19)19)19)19)19!)9!)9)19)19)19))1))1))1)19)19)19))1)19)19)19)19)19)19)19)1911911919B19B11911911911911911991991911911911911911911911911911911911911919B19B19B19B19B99B19B11999911911911911911911919B19B19B11911911911919B11911911919B19B19B19B9BB9BB19B19B11911919B19B19B)19119119)19)19))1119119119119)19119119119119119119119119119119119119)19)19119119)19)19)19)19)19)19)19)19)19)19!)9!)9)19)19!)9!)9)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9)19)19)19)19)19!)9!)9!)9)19))1))1))1!)1!)9!)9!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1))1))1))1))1)19))1))1))1))1))1)19)19)19)19)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1111))1))1))1111))1))1))1))1))1))1)19)19)19))1))1))1)19))1))1)19)19!)1!)1))1))1))1))1))1))1!)9!)9))1))1)19)19119119)19)19!)1!)1))1))1))1))1!)1!)9)19)19111111119119)19)19)19)19)19)1911911911911911911911911911911911999911911911911911911911911911911919B19B19B19B19B19B19B19B19B99B99991919B19B19B19B19B19B19B11911911919B19B99B99B99911919B19B19B19B99B99B19B19B11911919B19B119119119119))1))1119119119119)19)1911911911911919B119119119119)19)19)19)19)19)19)19)19)19)19)19)19)19119)19)19!)9!)9)19)19)19)19!)9)19)19!)9!)9!)9)19)19)19)19!)9!)9)19)19)19)19!)9))1))1!)9!)9))1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!!)!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1))1)19)19)19))1))1))1))1)19)19)19)19)19)19!)9!)1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1111111))1))1111111))1))1))1))1))1))1)19)19))1))1))1)19))1))1)19)19!)1!)1))1))1))1))1))1))1!)9!)9))1))1)19119119119119))1!)1!)1))1))1))1))1!)9!)9!)9))1111111119)19)19)19)19)19)19)1911911911911911911911911911911911911911911911911911911911911911911919B19B19B19B19B19B19B19B99B99B99911911919B19B19B19B19B11999999911919B19B19B99B11911919B19B19B19B19B119)19)1911919B19B19B119111119119))1))1119119119119)19)19)191199BB9BJ9BB19B119119)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9)19)19)19)19!)9!)9!)9!)9!)9!)9)19)19)19)19!)9!)9)19)19)19)19!)1))1))1!)9!)1))1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1)19)19)19)19))1))1))1))1))1))1)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1111))1))1))1111111))1))1))1))1))1))1)19)19))1))1))1))1))1))1))1))1)19)19))1))1)19)19)19!)1))1))1!)1)19))1119919919119))1!)1!)1))1))1))1))1!)9!)9!)1))1))1)19)19)19)19)19)19)19)19)19)1911911911911911911111111911911111111911911911911911911911911911919B19B19B19B19B19B11911999999999911911911911911911911991991999911911911911911919B19B19B19B19B19B119119)19)1911919B19B119)19))1)19)19)19)19))1111119119119)19))11199BJBJR9BJ9BB119119))1))1)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)1))1))1))1)19!)9!)1!)1))1))1))1))1))1))1!)1!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1)19)19)19)19))1))1))1))1))1))1)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19))1))1))1111111))1))1))1))1))1)19)19)19))1))1))1))1))1))1))1))1)19)19))1))1)19)19!)9!)9))1))1!)9!)9))1111919919111))1))1))1)19)19))1))1!)9!)1!)1))1)19)19)19)19)19)19)19)19)19)19)19)1911911911911911111111911911111111111911911911911911911911911911919B19B19B19B11911911999999999B11911911911911111111991999999911911911911911919B19B19B19B19B119119119)19)1919B19B19B119119))1)19)19)19)19))1))1119119119119))11199BRBJRBJRBBB119))1))1))1)19)19))1))1)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9)19)19)19)19!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)9!)1!)1!)1))1))1!)9!)9!)1))1))1))1!)1!)1))1))1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1)19)19)19)19))1))1))1))1))1)19)19)19)19))1))1)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1111111))1))1111))1))1))1)19)19)19)19))1))1))1)19)19)19)19))1))1))1)19)19)19))1!)9!)9!)9!)9!)9)19))1111119119))1))1))1))1119119))1))1!)1!)1!)1))1))1))1111111)19)19)19!)9!)9)19)19111111111119119119119119)19)19111111111119119111111119119119)19)1911919B19B)19))111111199999999B11911911911111111111111911911911911911999B99B19B19B19B19B19B119119119)19)1919B19B19B19B119111)19)19)19))1))1))1119119119119))11199BJBJRJJJ9BB119))1)19)19)19)19)19)19)19)19)19)19)19)19))1))1!)9!)9)19)19)19)19)19)19))1))1!)9!)9!)1!)1!)1!)1))1))1!)1!)1!)1!)1))1))1!)9!)9!)1!)1))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!)1!)1!!)!!)!)1!)1!)1!)1!)9!)9!)1!)1!)1!)1))1))1)19)19))1))1))1))1))1)19)19)19)19)19))1))1)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19))1111111111))1111111111))1))1)19)19)19)19))1))1)19)19)19)19)19)19))1))1))1)19))1))1)19!)9!)9!)9!)9))1))1))1119))1))1))1))1119119111))1))1!)1!)1!)1))1))1111111111119)19!)9!)9!)9)19))1))1))1111119119119119)19)19)19)19))1111119119111111119119111))1))1)1919B119))1))111111191999911911911911111111111111111911911911911911999B99B11911919B19B19B119119119)19)1919B19B19B19B119119)19)19))1))1))11111111191191191191199BBBBB9BB99B119))1)19)19)19)19)19)19)19)19)19)19)19)19))1))1)19)19)19)19)19)19)19)19))1)19)19!)9!)1!)1!)1!)1))1))1!)1!)1!)1!)1))1))1!)9!)9!)1!)1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!!)!)1!)1!)1!)1!)9!)9!)1!)1!)1!)1))1))1))1))1!)9!)9))1))1)19)19)19)19)19)19))1))1))1))1!)1))1))1))1))1)))))1))1))1))1))))))))1))1)19)19111111111))1111111111111))1))1))1)19))1))1))1))1)19)19)19))1))1))1))1))1))1))1))1))1))1)19!)9!)9!)1!)1))1))1))1))1))1))1))1111111111))1))1!)1!)1!)1))1))1111111111119)19!)9!)9!)9)19))1))1))1))1119119119119)19)19)19)19))1))1))1))1111111119119111111)19)19)19)19111111111111119119119119111111))1)19))111911911911911911911911911911911911919B19B119119119)19)19)1911911919B19B)19)19)19))1))1111111111111119119))111911999B119119119119)19)19)19)19)19)19)19)19)19)19)19)19))1))1)19)19)19)19)19)19))1))1)19)19)19)19))1))1!)1!)9!)9!)1!)1!)1!)1!)1!)1))1))1))1!)1!)1!)1!)1!)9)19))1))1))1))1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1))1))1!)9!)9))1))1))1)19))1))1))1)19)19))1))1!)1!)1))1))1))1))1)))))1))1))1))1))))))))1))1)19)19111))1))1))1111111111))1))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1))1))1))1))1111))1)19!)9!)1!)1))1))1))1))1))1))1))1111111))1))1))1!)1!)1!)1))1))1))1111111119)19)19)19)19))1))1))1))1))1))1119119)19)19)19)19)19))1))1))1))1111111111111111111)19)19)19111111111111111119119119119111111119)19)19119119119119119119119119119119119119119)19)19119119)19)19)19)1911919B)19)19)19))1))1))1))1111111111119119))1)19119119119119119119)19)19)19)19)19)19)19)19)19)19)19)19))1))1)19)19)19)19)19)19))1))1)19)19)19)19))1))1))1!)9!)9!)1!)1!)1!)1!)1!)1!)1))1))1!)1!)1!)1!)1!)9!)9))1))1))1))1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)1!)1))1))1))1))1))1))1))1))1))1))1)19!)9!)1!)1))))))))1))1))1))1111111))1))1))1))1))1))1)19))1))1)))))11111111))))1))1))1))1111111))1))1))1))1)19)19))1))1))1))1))1))1))1))1))1))1119)19))1!)1!)9!)1))1))1)19!)9!)1))1))1))1))1))1)19)19!)1!)1!)1!)1))1))1111111119)19)19))1))1111111))1))1))1))1))1)19)19)19)19)19)19))1))1119119111111111111111111)19)1911111111111111111111911911911911911911911911911911911991991911911911911911911919B19B119119)19)19)19)19)19)1919B19B)19)19)19))1))1))1))))))1))111119)19)19)19119119)19)19119119)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9)19))1))1)19)19))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!!)!!)))1))1!)1!)1))1))1))1))1))1))1))1))1))1))1!)9!)9!)1!)1))))))))1))1))1))1111111))1))1))1))1))1))1))1))1))1)))))1))11))1))))1))1))1))1111111))1))1))1))1)19)19))1))1))1))1))1))1))1))1))1))1)19)19))1!)1!)1!)9))1))1!)9!)9!)1!)1))1))1))1))1)19)19!)1!)1!)1!)1!)1))1))1111)19)19))1111111111111))1))1))1))1))1)19)19)19)19)19)19))1))1119119111111111111111111)19))111111111111111111111911911911911911911911911911911911991999911911911911911911919B19B119119)19)19)19)19)19)19)19)19)19))1))1))1))1))1))))))111111))1)19)19)19119119)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19)19!)9!)9!)9!)9!)9!)1))1))1))1)19))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!!)!!)!!)))1))1))1))1))1))1))1))1))1!)1!)1))))))))1))1))1)))))1))1))1))1))1))1))1))1111111111))1))1))11))1)))))))1))1111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1!)1!)1!)9!)9!)1!)1!)9!)1))1))1))1))1))1))1!)1!)1))1))1!)1!)1))1))1))1))1))1111111111))1))1))1111))1)19)19)19))1))1)19)19))1))1111111111111111111111111111111))1111111111))1)19)19)19119119119119119)19)1911911911911911911911919B19B119119)19)19)19)19)19)19119119119119)19)19119119))1))1))1))1))1111111))1))1)19)19)19119111111))1)19)19)19119)19)19)19!)9!)9)19))1))1)19!)9!)9)19)19)19))1))1)19)19))1))1))1))1))1))1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)))1))1))1))1))1))1))1))1!)1!)1))))))))1))1))))))))1))1))1))1))1))1))1)))))1111111111))))))1))1))))))))111111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1))1!)1!)9!)9!)1!)1!)9!)9!)1!)1))1))1))1))1!)1!)1))1))1))1!)1))1))1))1))1111111111111))1))1111111)19)19)19))1))1))1)19)19))1))1111111111111111111111111111111))1))1111111119)19)19)19119119119119)19)19)19)1911911911911911911919B19B119119119)19)19)19))1111119119119119))1))1119119))1))1))1))1111111))1))1))1))1)19)19))1))1))1))1)19)19)19)19)19)19)19!)9!)9)19))1))1!)9!)9!)9!)9)19))1))1))1))1)19))1))1))1))1))1))1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)))1))1!)1!)1))1))1!)1!)1))1))1))))))))))))))))))))))))111111))1))1111))1))))))1111))))))))1))1))1))1))1))111111111111111111111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19)19!)9!)9!)1!)1!)1!)1!)1!)9!)9)19))1))1))1!)1))1))1))1111111111111111111111111111))1)19))1))1))1))1)19)19))1))1))1111919919111111111111111111111111))1111119119119119119119119)19)19)19)19)19119119119119119119119119)19)19119119)19)19119119119119111))1)19)19119119))1))1))1))1111))1))1))1))1))1))1))1)19!)9!)9)19)19)19)19)19)19)19)19)19)19)19)19!)1!)1!)1!)9!)9!)1!)1))1))1))1))1)19!)9!)1!)1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)1!)1!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1))1))1!)1))1))1))1))1!)1))1))1)))))))))))))))))))))))1111111))1))1111))1))))))1))1)))!!1))1))1))1))1))1))1))111111111111111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19)19)19)19!)1!)1!)1!)1!)1!)1!)9!)9)19))1))1))1))1))1))1111111111111111111111111111111))1))1))1))1))1))1)19))1))1))1))1111919919111111111111111111111111))1)19119119119119119119)19)19)19)19)19)19119119119119119119119119)19)19119119119)19119119119119))1))1)19)19119))1))1))1))1))1))1))1))1))1))1))1))1!)1!)9!)9!)9)19)19)19!)9!)9)19)19)19)19)19)19!)9!)9!)1!)1!)9!)9!)1!)1))1))1))1))1!)9!)9!)1!)1!)1!)1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)9!)1!)1!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1))1))1))1))1))1)))))))))))))))))))))))))))))1))1))1111119))1))1))))))1))1111)))!!1))1))1))1))1))1))1)))))))1111111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1111111111111919919111111))1))1111111))1))1))1))1))1))1))1111111111111111111111111111111111111111))1)19119119111111119)19)19))1)19)19)19)19119119119119119))1))1))1)19)19)19119119119119))1))1))1))1))1))1)19))1))1))1))1))1))1))1))1))1))1))1))1!)1!)1!)9!)9)19)19)19)19))1))1!)9)19)19))1))1))1!)9!)9))1))1!)9!)9))1))1!)9!)9!)1))1))1))1))1))1!)1!)1))1))1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1))1))1))1))1))1))1))))))))))))))))))))))))))))))))1))1))1))1))1))1))1)))1))1))1))1)))))1))1))1))1))1))1))1))))))))111111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1111111111111111111111919919111))1))1111111111111))1))1))1))1))1111111111111111111111111111111111111111111)19)19119111111111)19)19))1))1)19)19)19119119119119119))1))1))1))1)19)19)19)19119119))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1!)1!)9)19))1))1!)9!)9))1))1!)1)19)19))1))1))1!)9!)9))1))1!)9!)9))1))1!)9!)9!)1!)1))1))1))1))1!)1!)1))1))1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!!)!)1!)1!)1))1))1!)1!)1))1))1))1!)1!)1!)1!!))))))))!))!)))))))))))!))))))1))1))1))1))1)))))11111111))1))1))1))1)))))))))))1))1))1))1))1))1))111111111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19))1))1))1))1))1)19)19))1))1))1))1))1!)1!)1!)1))11119119119))1))111111111111))1))11111111))1))1111111111111111111111111))1))111111111111111111111111111111)19)19111111111))1)19)19))1))1119119119119111111111))1))1))1)19)19)19)19)19)19)19)19))1))1))1))1)19)19111111)19)19))1))1!)1!)1))1))1))1))1))1))1))1))1!)9!)9))1))1!)9!)9))1))1))1)19)19)19))1))1!)9!)9)19)19!)9!)9))1))1!)1!)1!)1!)1!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!)9!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1))1))1!)1!)1))1))1!)1!)1!)1!)1!!)!!))!))!))!))!))))))))!))!)))1))1))1))1))))))1111111111))1))1))1))111)))))))))1))1))1))1))1))1))1))111))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1)19)19))1))1))1))1!)1!)1!)1!)1))1111B91B919))1))111111111111))1))11111111))9))111111111111111111111111111111111111111111111111111111111111))1111111111))1))1)19)19))1))1119119119111111111))1))1))1))1)19)19)19)19)19)19)19)19))1))1))1))1)19)19111111119)19))1))1!)1!)1))1))1))1))1))1))1))1)19)19!)1))1))1!)1!)9))1111111))1!)9!)9))1))1!)9!)9)19)19)19!)1))1))1))1!)1!)1!)1!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!)1!)1!)9!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!)1!)1))1))1!!)!!)!)1))1))1))1))1))1)))))))!))!))!))!))!))!))!))!)111111))1)))))))))1))1111111)))!!)!!1))1))1))1))1))1))1))1))1))1))1))111))))))))1))1))1))1111111))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1))1))1))1))1!)1!)1!)1!)1))1))1))1))1))1111911B919))1))9111111111111111111111119))9))9119111111111111111111119119111111111))1))111111111111111111111111111))1))1))1119119))1))1111111111111111))1)19)19))1))1))1))1)19)19111111))1)19))1))1))1))1))1))1))1111119119))1))1!)1!)1!)1!)1!)9!)9))1))1)19!)9!)1!)1!)1!)1!)1))1))1111111))1!)9!)9))1))1!)9!)9)19))1))1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!)1!)1!)1))1))1)))!!)!)1!)1))1))1))1))1)))))))!))!))!))!))!))!))!))))111111)))))))))))))))1))1))1)))!!)!!1))1))1))1))1))1))1111))1))1))1))1))))))))))1))1))1111111111))1))1))1))1))1))1))1))1)19)19))1))1))1))1))1))1))1))1))1))1!)1!)1!)1))1))1))1))1))11111119119111111119119111111111111111111))9))9))9111111111111111111111119119111111111))1))111111111111111111111111))1))1))1))1119119))1))1111111111111))1)19)19)19))1))1))1)19)19)19111111))1))1))1))1))1))1))1))1))1)19119119))1))1!)1!)1!)1!)1!)9!)9))1))1!)9!)9!)1!)1!)9!)9!)1))1))1))1))1)19!)9)19))1)19!)9!)9)19))1))1))1))1))1))1))1!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!)1!)1!)1!)1!)1))1))))))!)1!)1))1))1))1!!)!!)))))!))!))!))!))!))!)))))))))1))1))))))))1))))))1))1))1)))!!)!!1))111111111))))))1111))1))1))1))1))))1))1))1)))111111))1))1))1))1))1))1!)1!)1))1))1))1))1))1))1))1))1))1))1))1))1))1))1)))))))))))1))1))1))1))1111111111111111111911911111111))1))11111))9))9))1111111111119119111111111111111111111111111111111))1))111111111))1))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19))1))1))1)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1)19119))1))1))1!)1!)1))1))1))1))1))1))1))1))1!)1!)9!)9!)9!)9!)1))1))1)19!)9))1))1)19)19!)9!)9!)9)19!)9))1))1))1))1!)1!)1!)1!)9!)9!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1))))))!)1!)1))1))1!!)!!)!!)!!))!))!))!))!))!))!)))))))))))))))))))))))))))))))1))1)))!!)!!1))111111))1))))))1))1))1))1))1))))))))))1))))))111111))1))1))1))1))1))1!)1!)1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))))))))))))))1))1))1))1))1111111111111111911911111111))11111))9))9))9))1111111111119119111111111111111111111111111111111))1))111))1))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19)19))1))1))1))1)19)19)19)19))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1))1!)1!)1))1))1))1))1))1))1))1))1!)1!)9!)9!)9!)9!)1))1))1!)9)19))1))1!)9!)9!)9!)9!)9!)9!)9!)1))1))1!)1!)1!)1!)1!)9!)9!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!!!!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!))!))!))!))!))!)))))))))))))))))!!)))))))))))))!!)!!)))1))1)))))))))))1)))))1))1))1))1))))))))))1))))))111111111))1))1))1))1!!)!!)!)1))1))1))1))1))1))1))1))1!)1!)1))1))1))1))1111111))))))!)1))1))1111)))))1))11111111))1))1111111111111111))9))9))9))1111111111111111111))1))111111111111111111))1)))1))1)))))))1))1))1))1))1))1))1))1))1))1))1)19)19)19)19111111))1))1111111))1))1))1))1))1))1))1))1))1))1))1))1)))))1))1))1))1)))!!)!!))!))!))))!)1!)1))1))1))1))1!)1!)1!)1!)1!)1))1))1!)1))1))1))1))1))1!)9!)9!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!!!!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!))!))!))!))!))!))!))!!)!!)!!)!!)!!)!!)!!))))))))))!!)!!)!!)))1))1))))))))1))1)))!!)!!1))1)))!!)))))))))))))))111111111111))1))1!!)!!)!!)!!)))1))1))1))1))1))1))1))1!)1!)1))1))1))1))1111111))))))!)1))1111111))))))))11111))1))1))1))1111111111111))9))9))9))1111111111111111111))1))111111111111111111))))))1))1))))))))))1))1))1))1))1))1))1))1))1))1)19)19)19)19111111))1))1111111))1))1))1))1))1))1))1))1))1))1))1))1))))))))1))1))))))!!)!!))!))!)!!)!!)!)1!)1))1))1!)1!)1!)1!)1!)1!)1))1))1!)1))1))1))1))1))1!)9!)9!)1!)1!)1!)1!)1!)1!!)!!)!)1!)1!)1!)1!)1!)1!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!)1!)1!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!!!!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!)!!) \ No newline at end of file diff --git a/sdk/media/tex6.ppm b/sdk/media/tex6.ppm deleted file mode 100644 index 525a5ac..0000000 Binary files a/sdk/media/tex6.ppm and /dev/null differ diff --git a/sdk/media/tex7.ppm b/sdk/media/tex7.ppm deleted file mode 100644 index 599b6a7..0000000 Binary files a/sdk/media/tex7.ppm and /dev/null differ diff --git a/sdk/media/throw.wav b/sdk/media/throw.wav deleted file mode 100644 index 87cd36d..0000000 Binary files a/sdk/media/throw.wav and /dev/null differ diff --git a/sdk/media/torus.x b/sdk/media/torus.x deleted file mode 100644 index 29b725f..0000000 Binary files a/sdk/media/torus.x and /dev/null differ diff --git a/sdk/media/tpot0.x b/sdk/media/tpot0.x deleted file mode 100644 index d559ce5..0000000 Binary files a/sdk/media/tpot0.x and /dev/null differ diff --git a/sdk/media/tpot1.x b/sdk/media/tpot1.x deleted file mode 100644 index 00cb304..0000000 Binary files a/sdk/media/tpot1.x and /dev/null differ diff --git a/sdk/media/tpot2.x b/sdk/media/tpot2.x deleted file mode 100644 index c656588..0000000 Binary files a/sdk/media/tpot2.x and /dev/null differ diff --git a/sdk/media/tpot3.x b/sdk/media/tpot3.x deleted file mode 100644 index 2527a99..0000000 Binary files a/sdk/media/tpot3.x and /dev/null differ diff --git a/sdk/media/tree.x b/sdk/media/tree.x deleted file mode 100644 index ee2a57f..0000000 Binary files a/sdk/media/tree.x and /dev/null differ diff --git a/sdk/media/walk.wav b/sdk/media/walk.wav deleted file mode 100644 index 468fbfc..0000000 Binary files a/sdk/media/walk.wav and /dev/null differ diff --git a/sdk/media/win95.ppm b/sdk/media/win95.ppm deleted file mode 100644 index 5d39845..0000000 --- a/sdk/media/win95.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -256 256 -255 -Œ­ÖŒ­Ö„½̃{­Ö„½̃Œ½ÖŒµ̃{µ̃”½çŒµÖ{µ̃”½ç„µ̃Œ½ç{µ̃Œ½ÖŒ­ÖŒ½̃„µ̃„½̃œ½̃„½̃”½ç”½̃œÆç¥Îç¥Îç¥Îç¥Îç«Đëµ̉âµ̉â¥Îç¥Î眽̃˜ÁÖ”½çŒ½Ö{µ̃Œ­ÖŒ½̃s­Ös¥Ös¥Ö„µ̃s¥Ö{­̃{µ̃{µ̃{µ̃{µ̃„­̃”½çœÆ眽̃¥Îç¥Îç˜ÁÖœ½̃œÆçœÆ甽ç˜ÁÖŒ½̃”½̃Œ½Ö„½̃„µ̃Œ½̃„µ̃Œµ̃Œ½Ö{µ̃s­ÖŒµ̃„½̃Œ½̃{­̃Œ½̃”½̃Œ½̃Œ½̃„µ̃„½̃ŒµÖ{µ̃{­̃{­Ö{­ÎŒµÖŒ½ÖœÆ甽̃¥Îç¥Îçµ̉â¥Îç¥Îçµ̉âµ̉â«Đëµ̉â«Đëµ̉âµ̉âµ̉âÎ̃ïÎ̃ïÎ̃ẩặ̃âç̃ç÷âï÷ï÷÷âï÷̃ç÷âï÷̃âçâï÷âï÷̃ç÷̃ç÷̉ặÎ̃âÎÖïÎ̃ïÁÛ́µÖëÁÛ́µÖëµ̉â¥Îç¥Îç¥Îç¥ÎçœÆçœÆçœÆ̃”½ç”½̃Œ½̃„µ̃„½̃{µ̃Œ½ÖŒµ̃Œ½̃Œ½̃„½̃Œ½̃„½̃{µ̃”½çŒµÖ{­̃{­̃{µ̃{­̃„½̃{µ̃s¥Ö{­̃{µ̃s¥Ö{µ̃s¥Ö„­̃s¥ÖŒ­Ö{­̃s¥Ö„½̃„µ̃{µ̃„­̃Œ½̃Œ½Ö˜ÁÖ˜ÁÖœÆç¥ÎçœÆç¥Îç­Î̃¥Îç¥Îçµ̉â«Đëµ̉âµ̉âµÖëµÖëÎÖïÁÛ́Î̃ïÎ̃ïÎ̃ï̃ç÷̉ặ̃ç÷Úàáâï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ï÷÷ïï÷ï÷÷ÿÿÿï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ÿÿÿ́éñï÷÷ï÷÷äéçâï÷ï÷÷ïï÷ïï÷Î̃ïâï÷̃âç̉ặÎ̃ï½ĐáÁÛ́ÁÛ́«Đë¥Æ̃œÆç¥Î甽̃”½çŒ½̃„½̃{µ̃{­Ös­Ös¥Ö{­Îs­Ös­Ös­Ö{­Ös­Ös­Ö{­Î{µ̃{µ̃{­̃ŒµÖŒ½̃„½̃„µ̃Œµ̃{­̃{­̃Œ½̃{µ̃„½̃„µ̃„µ̃Œ½̃Œ½̃”½çŒ½̃{­̃„½̃„µ̃”½̃˜ÁÖœÆ̃¥Îç¥Îç¥Îç¥Îç«Đëµ̉â­Î̃µ̉â¥ÎçœÆ̃˜ÁÖ”½ç”½çŒµ̃Œ½̃ŒµÖ{­̃{µ̃s¥Ö„­̃{µ̃„­̃s¥Ös­ç{µ̃{µ̃{­̃Œ½̃”½çœÆç¥Îç­Î̃¥Îç¥ÎçœÆçœÆç¥Î甽甽̃”½çŒ½̃{µ̃„­̃„½̃„½̃Œ½̃„µ̃{µ̃{µ̃Œ½̃Œ½çŒ½ÖŒ½̃„½̃„µ̃”½ç”½ç{­̃{µ̃„µ̃s¥Ö„­̃{µ̃s­çŒµÖŒ½̃Œ½̃˜ÁÖœÆçœÆçœÆç¥Îç¥Îç¥Îç«Đë¥Îç ̀âµ̉â¥ÎçÁÛ́­Î̃ÁÛ́ÁÛ́Î̃ï̃âç̃âç̃ç÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷̃ç÷âï÷̃âç̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ï½Đáµ̉âµ̉âµ̉â¥Îç­Î̃¥Îç¥Îç¥ÎçœÆ̃œÆ̃œ½̃”½̃Œ½̃Œ½̃Œµ̃Œ½̃Œ½̃„½̃Œ½̃Œ½Ö”½ç„½̃„µ̃{µ̃Œ½̃„­Î{µÖ„µ̃{µ̃{µ̃„­̃„­Îs¥Ö{µ̃{­̃{­̃{µ̃{­̃{µ̃„­ÎŒµÖ„½ÖŒ½çs­çs¥Ö{µ̃„µ̃”½ç”½̃˜ÁÖœÆçœÆ̃¥Îç¥Îç¥Îç¥Îç¥Îç­Î̃¥Îçµ̉â«Đë«ĐëµÖë½Đá½ĐáÎ̃ïÎ̃ï̉ặ̉ặ̉ặäéçäéç̃ç÷ïï÷ï÷÷ï÷÷÷ÿÿó÷ûï÷÷÷ÿÿïï÷ÿÿÿÿÿÿ÷ÿÿï÷÷ó÷ûï÷÷ï÷÷÷ÿÿï÷÷ó÷ûï÷÷ï÷÷ï÷÷ïï÷ïï÷ïï÷âï÷âï÷äéçâï÷̃âç̉ặÇÔâµÖëµ̉â¥Îç¥ÎçœÆçœÆ甽甽猽̃”½ç{­̃{µ̃s­Ö{­Ö{¥Îs­Ös­Ös¥Ös­Ös¥Ös­Ös­Ö{­Ö{­̃{µ̃Œ½̃Œ½̃„µ̃Œ½ÖŒ½çŒ½ç„½̃”½çŒ½ç{µ̃Œ½̃„½̃Œµ̃„½̃„µ̃„½̃{­̃{­̃Œ½̃„µ̃”½çŒµ̃˜ÁÖ˜ÁÖœÆ̃¥Îç¥Îç¥Îç¥ÎçœÆç¥Îç¥Îç˜ÁÖœÆ̃”½̃„µ̃Œ½̃Œµ̃Œµ̃”½ç{µ̃„½̃{µ̃{µ̃{­̃„½̃{­̃{­̃s¥Ö„µ̃Œ½̃œÆç¥Îç¥Îç¥Îç¥Îç¥Îç«Đë¥ÎçœÆ̃œÆçœÆ猽̃Œ½̃”½̃Œ½̃Œ½ÖŒ½̃„µ̃„½̃Œ½̃Œµ̃Œ½çŒµ̃Œ½̃Œ½̃„µ̃”½̃„½̃ŒµÖ”½çŒ½ç„µ̃{µ̃„µ̃{µ̃„µ̃„½̃ŒµÖŒ½̃”µâ¥Îç¥Îç¥Îç¥Îç¥Îç¥Æ̃¥Îç«Đë¥Îçµ̉â«Đëµ̉âµ̉âÁÛ́ÇÔâÎ̃ïÎ̃ï̉ặâï÷ïï÷ï÷÷ïï÷ïï÷âï÷âï÷âï÷âï÷âï÷âï÷̃âç̉ặ̉ặÎ̃ïÎ̃ïÁÛ́µÖëÁÛ́µ̉â¥Îç¥Îç¥ÎçœÆçœÆç¥ÎçœÆç¥Îç˜ÁÖ”½çŒµ̃Œ½̃„µ̃„½̃”½ç„µ̃Œ½̃Œ½̃”½̃Œ½ÖŒ½̃Œ½ç{­̃„µ̃„µ̃{µ̃s­ç{­̃{µ̃„½̃{­̃{­̃s­Ö{µ̃„µ̃{µ̃{µ̃{µ̃{­̃„­Î„½̃{µ̃{µ̃„µ̃„µ̃„µ̃{µ̃”½çœÆç¥Îç¥ÎçœÆç«Đë¥Îç¥ÎçœÆçµ̉âµ̉â«Đë«ĐëµÖë½Đáµ̉âÁÛ́̃âçÎ̃ï̃ç÷̃âçâï÷âï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷÷ÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ïï÷ï÷÷âï÷âï÷âï÷âï÷̃ç÷äéç̃âç̉ặµÖëµ̉â«Đë¥ÎçœÆ甽焵̃Œ½çŒµ̃Œ½̃”½ç{µ̃{­Ös¥Ö{µÖ{¥Î{¥Îs¥Ö{¥Î{­̃s¥Ös¥Ös¥Ös¥ÖsœÎ„µ̃Œ½ç„µ̃„½̃{­̃Œ½̃„½̃Œ½̃Œµ̃Œµ̃„½̃Œ½̃Œ½̃Œµ̃„µ̃„½̃”½ç„µ̃Œ½̃Œµ̃„½̃”½ç”½̃˜ÁÖ˜ÁÖ˜ÁÖ¥Îç¥ÎçœÆçœÆçœÆ甽̃”½̃œÆ甽甽̃Œ½̃„µ̃„­̃„µ̃„µ̃„µ̃{µ̃{µ̃„­Î„µ̃{µ̃{µ̃„­̃s­ÖŒ½̃Œ½̃˜ÁÖœÆç¥Îç¥Îç¥Îç¥Îç¥Îç«Đë¥ÎçœÆçœÆ甽̃”½çŒ½̃Œ½̃„½̃Œ½̃Œ½̃Œ½̃Œµ̃„½̃„µ̃„µ̃Œ½̃„µ̃Œµ̃Œ½̃„½̃„µ̃”½ç„µ̃{µ̃„½̃{­̃{µ̃{µ̃„½̃„µ̃„½̃”½̃œÆ̃¥Îç«Đë«Đë«Đë¥Îç«Đë«Đë«Đëµ̉â«Đë½Đá½Đá½ĐáÁÛ́Î̃ï̉ặ̉ặ̃ç÷âï÷âï÷ï÷÷́éñïï÷âï÷âï÷äéçäéçâï÷̃ç÷Î̃ï̉ặÎ̃ïÁÛ́Î̃ïÎ̃ïÁÛ́¥Îç¥Îç¥Îç«ĐëœÆ̃œÆçœÆç¥ÎçœÆçœÆç˜ÁÖ”½̃„½̃„µ̃Œ½̃„µ̃Œ½̃Œ½çŒ½̃Œ½̃Œµ̃Œµ̃Œ½̃ŒµÖ{µ̃{­̃{µ̃{µ̃{­̃„µ̃{µ̃{µ̃{µ̃s­Ö{µ̃{­̃„µ̃ŒµÖ„µ̃s¥Ö{­̃„µ̃{µ̃„­̃„µ̃{µ̃Œ½Ö”½çŒ½̃”½çœ½̃¥Îç¥Îç¥Îç«Đë«Đë«Đë¥Îç¥Îç«Đë«Đë½ĐáÎ̃ïÁÛ́̉ặÎÖïÎ̃ẫâç̃âçâï÷äéḉéñï÷÷ï÷÷ï÷÷ó÷û÷ÿÿï÷÷ÿÿÿï÷÷ï÷÷ó÷û÷ÿÿï÷÷ï÷÷ó÷ûïï÷ïï÷ó÷ûï÷÷÷ÿÿ÷ÿÿï÷÷ïï÷ïï÷âï÷ï÷÷̃ç÷äéç̃âç̃ç÷ÎÖïµÖë«Đë¥Îç¥ÎçœÆ̃”½̃”½çŒµ̃Œ½̃„µ̃{­̃s¥Ö{­Ös¥Ös­Ös¥Ös­Ös­Ö{µ̃s¥Î{­Ös­Ö{¥Îs¥Ö{­Ö„µ̃Œ½̃„½̃„µ̃„µ̃„µ̃„½̃„½̃”½çŒ½çŒ½̃{­̃„µ̃Œ½̃„½̃„½̃Œ½̃Œ½çŒµÖŒ½̃Œ½çŒ½̃”½ç”½̃œÆçœÆ̃œÆç˜ÁÖœÆçœÆ̃”½̃˜ÁÖ”½ç”½̃”½̃Œ½̃„µ̃Œ½ç„µ̃„µ̃{µ̃„µ̃„µ̃{µ̃{­̃{­̃„µ̃{µ̃s¥Ö{µÖŒ½̃”½çœÆç ̀â ̀â¥Îç¥Îç¥Îç«Đë«Đë¥Îç¥ÎçœÆ甽̃œ½̃”½̃”½çŒ½̃Œµ̃”½̃„µ̃Œ½ç„½̃Œ½̃”½çŒ½̃Œ½̃„½̃„µ̃„µ̃{µ̃Œ½̃„µ̃„µ̃{­̃{­̃„µ̃{µ̃{µ̃{­Ö„½̃”½̃œÆç¥Îç¥Îç¥Îç¥Îç¥Îçµ̉âµ̉âµ̉â½Đáµ̉âµÖëÁÛ́ÁÛ́ÁÛ́Î̃ï̉ặ̃ç÷âï÷âï÷âï÷âï÷ïï÷âï÷âï÷âï÷âï÷âï÷âï÷̃ç÷̉ặ̉ặÎ̃ïÎ̃âÁÛ́½Đá½Đá«Đë¥Îç«Đë¥Îç¥Îç¥Îç«Đë«Đë¥Îç¥ÎçœÆ甽̃Œ½̃„µ̃„µ̃”½̃Œ½̃„µ̃Œ½̃Œ½̃Œ½̃Œ½̃„µ̃„µ̃{­̃{µ̃{µ̃{µ̃{µ̃{­̃{­̃{µ̃{µ̃s¥Ö{µ̃{­Ö{­̃{­̃{­̃{µ̃„­̃{­̃„µ̃{­̃s¥Ö„µ̃ŒµÖ”½çŒ½̃”½çœÆç¥Îç¥Îç ̀â¥Îç¥Îç¥Îç¥Îç¥Îç«ĐëµÖëµÖëÁÛ́Î̃ïÎÖï̉ặ̃âç̉ặ̃ç÷âï÷ï÷÷ïï÷ï÷÷ï÷÷ó÷ûó÷ûï÷÷ÿÿÿ÷ÿÿó÷ûï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷ïï÷÷÷ÿÿïï÷÷ÿÿï÷÷ï÷÷ï÷÷́éñïï÷äéçâï÷̃ç÷̃ç÷̃âç̉ặ̉ặÎÖï¥Îç¥Îç¥Îç­Î̃œÆ猵̃„µ̃{µ̃{­̃„µ̃s­Ö{µ̃{­̃{­̃{¥Îs­Ö{µÖ{µÖ{­Ös­Ö{­̃s¥Ös­Ös¥Ö„µ̃Œ½̃„µ̃Œµ̃„½̃„½̃„µ̃„½̃Œ½çŒ½̃Œ½̃{µ̃„µ̃Œ½ç„½̃Œ½̃Œ½ÖŒ½̃„µ̃ŒµÖŒ½̃Œ½ç”µâ”½̃”½ç”½̃”½çœÆ甽̃Œ½̃”½çœÆ甽̃”½̃”½̃„µ̃Œ½̃„µ̃„µ̃Œ½çŒµÖ{­̃{µ̃{µ̃„­̃{µ̃Œµ̃{µ̃„µ̃{­̃Œ½Ö”½̃˜ÁÖœ½̃œÆç«Đë«Đë«Đë¥Îç«Đë¥Îç¥ÎçœÆ̃œÆ̃Œ½Ö”½çŒ½̃Œ½̃”½çŒ½̃Œ½̃Œ½ÖŒ½̃„½̃„½̃„µ̃Œ½̃Œ½̃Œ½̃ŒµÖŒ½̃Œ½̃„µ̃„µ̃{µÖ{µ̃„µ̃s­Ö„µ̃„µ̃ŒµÖ˜ÁÖœÆç«Đë«Đë¥Îç«Đë«Đëµ̉âµÖëµÖëµÖë½ĐáµÖëÇÔâÇÔâÎ̃ï̉ặÎÖï̃ç÷âï÷âï÷̃ç÷ï÷÷ïï÷âï÷âï÷âï÷äéçâï÷̃âç̃ç÷̃ç÷Î̃ïÎ̃ïÁÛ́Î̃â½ĐáÁÛ́«Đë¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆ̃˜ÁÖŒ½çŒ½̃Œ½̃„µ̃„µ̃„½̃„µ̃Œ½ç„µ̃„½̃„½̃Œ½̃ŒµÖ{µ̃„µ̃{µ̃{µ̃„­̃{µ̃„µ̃{µ̃{µ̃s­Ö{­̃{µ̃s¥Ö{µ̃{­̃{­̃s­Ö{µ̃{µ̃{µ̃„µ̃{­̃Œµ̃„½̃”½çœÆçœÆ̃¥Æ̃ ̀â¥Îç¥Îç¥Æ̃¥ÎçœÆ̃«Đë¥Îçµ̉âÇÔâÁÛ́Î̃ï̉ặ̉ặ̃ç÷̉ặ̃ç÷äéçï÷÷ï÷÷ï÷÷ïï÷ó÷ûÿÿÿï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷äéçâï÷âï÷̃ç÷̃âçÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́¥Îç¥Îç ̀✽̃„µ̃{µ̃„­Î{µ̃{­̃{­̃s¥Ö{­Ös­Ös­Ös­Ös¥Ö{­Ös¥Ö{­Ö{­Ö{­Ö{µÖ{­Î„½̃Œµ̃{µ̃Œ½̃„µ̃Œ½ç„µ̃Œ½ç„½̃„½̃Œ½çŒ½̃„½̃„µ̃„µ̃„½̃”½çŒµ̃Œµ̃Œ½̃Œ½̃Œ½̃”½̃”½̃œµ̃”½çŒ½̃”½çŒ½̃”½çŒ½̃Œ½̃ŒµÖ”½̃„µ̃„µ̃„µ̃{­̃„­̃ŒµÖ„µ̃„­Î{­̃{­Ö{µ̃„µ̃{­̃{­̃„­Î„­̃Œ½̃Œµ̃œÆ̃œÆç¥Æ̃œÆç¥Îç«Đë«Đë¥Îç¥ÎçœÆ甽̃Œ½ç„µ̃„µ̃Œµ̃”½̃”½̃Œµ̃Œ½ç„­̃Œ½̃Œµ̃Œ½ç„½̃{­̃Œ½̃Œµ̃{­̃{µ̃{µ̃„­Î{­Ö„µ̃„µ̃s¥Ö{­̃s¥Ö„µ̃„½̃œÆ̃ ̀â¥Îç«Đë¥Îçµ̉âÇÔâµ̉âµÖëÁÛ́Î̃ïÎ̃ïÁÛ́ÎÖïÎ̃ïÎ̃ïÎ̃ï̉ặ̃ç÷̃ç÷âï÷ïï÷ïï÷ï÷÷âï÷ï÷÷âï÷âï÷äéçâï÷̃ç÷̃ç÷̃ç÷Î̃ïÁÛ́µ̉âµÖëµ̉â¥Îç¥Îç¥Îç¥Îç¥Îç«ĐëœÆçœÆç˜ÁÖ”½ç”µâ”½̃Œ½̃{µ̃Œ½̃Œ½̃„µ̃„µ̃„µ̃„µ̃Œ½̃„½̃Œ½çŒµÖ{­̃{µ̃{µ̃{µ̃s­Ö„µ̃„µ̃„­̃{­̃{µ̃{­̃s¥Ös­Ö„µ̃s­Ö{­̃{µ̃{µ̃{µ̃{­̃„µ̃{­̃{­̃{µ̃Œµ̃”½̃œÆ̃œÆçœÆçœÆçœÆ̃¥Îç˜ÁÖœÆç¥Îç«ĐëµÖëÁÛ́ÁÛ́̉ặÎ̃ïÎ̃ï̃âç̃âç̉ặâï÷ï÷÷ï÷÷ï÷÷ÿÿÿï÷÷ó÷ûó÷ûÿÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ïï÷âï÷âï÷̃âç̃ç÷̉ặÎ̃ïÎ̃âÎÖïÁÛ́½Đá¥Îç«ĐëœÆçœÆ̃„µ̃{­̃{¥Î{­̃{­Ös­Ös­Ö{µÖs­Ö{­Ös­Ös¥Ös­Ös­Ös­Ös­Ö{­Ös­Ö{­ÖŒ½Ö{­̃„µ̃„µ̃„µ̃”½̃Œ½̃”½çŒ½̃Œ½̃{­̃Œ½̃{­̃„½̃Œ½ç”½ç”½çŒ½̃Œ½̃Œ½̃Œ½çœ½̃œ½̃Œ½̃”½̃Œ½̃”½çŒ½ÖŒ½̃{­̃Œ½̃Œµ̃”½̃ŒµÖŒ½ç„µ̃ŒµÖ{µ̃„­̃„½̃{­̃{­̃s¥Ö{µ̃{µÖ„µ̃Œ½ç{­̃{­̃Œ­ÖŒµÖŒ½̃”½ç˜ÁÖ¥ÎçœÆçµ̉â¥Îç¥Îç¥ÎçœÆç˜ÁÖ”½̃Œ­ÖŒ­ÖŒ½̃Œ½̃”½çœÆ̃”½çŒ½̃Œ½̃ŒµÖ„µ̃ŒµÖ„½̃Œ½Ö„µ̃Œ½̃Œ½̃Œ½̃”½ç{­̃Œ½ç„µ̃„µ̃{µ̃„­Î{­̃{µ̃„µ̃”½̃¥Æ̃«Đë«Đëµ̉â­Î̃µ̉âÁÛ́ÁÛ́Î̃ï̃ç÷̃âç̉ặ̃ç÷̉ặ̉ặ̉ặ̃âçâï÷̉ặïï÷ï÷÷äéçâï÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷̃ç÷̉ặÎ̃ïÁÛ́«Đëµ̉â¥Îç«Đë¥Îç¥Îç¥Îç­Î̃”½ç˜ÁÖ¥Îç–·Ö„µ̃”½çŒ½̃Œ½̃Œ½̃Œ½̃Œ½̃{µ̃„­̃„µ̃{­̃Œ½̃{µ̃Œ­Ö{µ̃{­̃{µ̃„½̃{­̃Œ­Ö{µ̃{µ̃{µ̃{­̃{­̃s­Ö{­Ö{µ̃s­Ö{­Ö{­̃{­̃s­Ö{µ̃{µ̃Œ½çŒµÖ”½çŒµÖ”½̃”½̃”½̃”½̃œÆç˜ÁÖ˜ÁÖœÆç¥Îç¥Îç«Đëµ̉âÁÛ́ÁÛ́Î̃ï̃ç÷Î̃ï̃ç÷̉ặ̃ç÷âï÷âï÷ï÷÷ï÷÷ÿÿÿï÷÷÷ÿÿï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ÿÿÿïï÷äéçïï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷âï÷âï÷̃ç÷̃ç÷̃ç÷̉ặÎ̃ï̉ặÎÖïÁÛ́ÁÛ́µ̉â¥ÎçœÆç¥Î甽̃„µ̃{¥Î{µ̃Œ­Ö{µ̃{­̃{­Ös¥Ö{­Î{­̃s­Ös­Ös­Ö{¥Îs­Ös­Ös­Ö{­̃s¥ÖŒ½̃{­̃„½̃Œ½̃„µ̃„½̃„½̃”½çŒµÖ{­̃{µ̃”½̃{­̃„µ̃Œ½ç”½̃”½̃”½̃”½çŒ½̃˜ÁÖ”½̃”½çŒµ̃{µ̃Œ½̃{µ̃„½̃„½̃Œ½̃„½̃”½ç{­̃Œ½̃Œ­Ö„­̃Œ½̃„µ̃Œµ̃ŒµÖs­ÖŒ½̃{­̃„½̃„­̃„µ̃{­̃{­̃{­̃{­Î„µ̃„µ̃”½̃Œ½̃œÆç­Î̃¥Îç¥ÎçœÆçœÆç˜ÁÖ”½ç„½̃Œ½̃Œ½ÖŒµ̃Œ½ç”½̃œÆ猽̃”½çŒ½̃Œ½̃{­̃„½̃„½̃Œ½̃Œ½Ö{µÖ{­̃{­̃”½ç{­̃„½̃{­̃„µ̃{­̃{µ̃Œ½̃{­̃”½̃”½̃œÆ̃«Đëµ̉âµ̉âµ̉â¥ÎçÁÛ́Î̃ï̃ç÷âï÷äéç̃ç÷ÔÛ̃̃ç÷âï÷̉ặäéç̃âçâï÷âï÷âï÷ïï÷ïï÷âï÷âï÷̃ç÷ï÷÷ïï÷âï÷âï÷âï÷̃âç̃ç÷ÁÛ́µÖë½Đáµ̉â¥Îç¥Îç¥Îç¥ÎçœÆ眽̃œÆ甽̃”½̃Œµ̃Œ½̃”½ç„µ̃”½ç{­̃{­̃Œ­ÖŒ½Ö{µ̃„µ̃„µ̃{µ̃”½ç{­̃{µ̃s¥Ö{µ̃s­ç„½̃s¥Ö{µ̃{­̃{­̃s­Ös­Ö„µ̃s­Ö{µ̃{­̃{µ̃s¥Ö{­̃{µ̃{µ̃{­̃{µ̃s¥Ö{µ̃˜ÁÖŒ½ÖœÆ̃œÆ甽̃”½ç¥Îç˜ÁÖ¥Îç¥Îç«Đëµ̉âµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̃âç̃âç̃âçïï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ÿÿÿÿÿÿÿÿÿ÷ÿÿï÷÷ï÷÷ï÷÷ïï÷ïï÷ïï÷ÿÿÿï÷÷ï÷÷ÿÿÿäéçâï÷âï÷̃ç÷âï÷̃ç÷Î̃ïÎ̃ï̉ặÎ̃âÁÛ́µ̉â­Î̃µ̉â˜ÁÖœÆ焽̃{µÖ{µ̃{­̃Œ­Ö{­̃{­̃{­̃s¥Ös­Ös¥Ö{­̃s¥Ös¥Î{­Ös­Ös¥Ös¥Ös¥Ös­Ö”½ç{µ̃Œµ̃„½̃Œ½ç„µ̃ŒµÖ„½̃Œµ̃{µ̃”½çŒµ̃„µ̃Œ½̃”½çŒµÖ”½̃˜ÁÖ˜ÁÖ”½̃”½̃”½ç”½̃Œ½̃”½ç{­̃„µ̃Œ½̃”½çŒµÖŒµ̃ŒµÖŒ­ÖŒµÖ„µ̃{µ̃„µ̃„½̃„µ̃ŒµÖ{µ̃ŒµÖ{µ̃„½̃Œ½Ö{µ̃{µ̃{µ̃{µ̃s­ç{µ̃„µ̃{­Ö{­̃Œ½̃”½ç”½̃œÆçœÆ甽猽̃Œµ̃Œ½̃s­ÖŒµÖ{µ̃„µ̃„µ̃Œ½ÖŒ½çŒ½̃Œ½Ö”½çŒ½̃ŒµÖ„µ̃„µ̃„µ̃Œ½̃{µ̃Œ½̃„µ̃{µ̃„µ̃Œµ̃„µ̃„µ̃s­Ö”½ç”½ç”½çœÆç¥Îç«Đë«Đëµ̉âµÖëµ̉âÎÖï̉ặ̃âç̃âçâï÷̃âç̃ç÷̃âçâï÷̃âçâï÷äéç̃ç÷âï÷âï÷̃ç÷âï÷âï÷âï÷âï÷âï÷ï÷÷äéçïï÷âï÷âï÷âï÷Î̃ïÎ̃âµÖëµ̉âµ̉â¥ÎçœÆçœÆçœÆ̃œÆ̃œÆ̃œÆ̃Œ½̃Œ½çŒ½̃Œ½Ö„µ̃{µ̃{µ̃{µ̃{­Î„­̃„­Î„­̃„µ̃{µ̃{­̃{µ̃{µ̃{­̃s­çs­Ö{­̃{µ̃s­Ö{µ̃{µ̃„µ̃{µ̃{µ̃„µ̃{µ̃{­Îs­Ö{­̃{­Ös¥Ö{­̃s­ÖŒµ̃ŒµÖŒ½Ö”½̃Œ½̃Œ½Ö”½̃”½çœÆç¥Îç˜ÁÖœÆç«Đë«Đëµ̉âµ̉âÁÛ́ÁÛ́ÇÔâÁÛ́Î̃ï̃ç÷̉ặâï÷âï÷ïï÷ï÷÷ï÷÷÷ÿÿó÷ûï÷÷ï÷÷ÿÿÿï÷÷ï÷÷ï÷÷ó÷ûï÷÷ï÷÷âï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷äéçâï÷ï÷÷̃âç̃ç÷Î̃âÁÛ́ÁÛ́̉ặÁÛ́½ĐáÁÛ́µ̉â¥Îç¥Îç˜ÁÖ{µ̃s­Ö{µ̃s­Ös­Ös¥Ös¥Ös­Ös­Ö{­Ös­Ö{­Îs­Ös­Ös¥Ös­Ös­Ö{µÖs­Ö{­ÎŒ½ç„µ̃Œ½̃„½̃„½̃Œ½ÖŒ½̃„½̃Œ½çŒ½ÖŒµ̃ŒµÖŒµÖ”½̃”½̃Œ½̃„µ̃”½̃œÆ̃”½̃Œ½ç”½çŒ½ÖŒµ̃Œ½̃Œ½̃Œ½çŒµ̃Œµ̃„µ̃{µ̃ŒµÖ„½̃ŒµÖ„µ̃„½̃„µ̃„½̃Œ½̃„½Ö{­Ö„µ̃Œ½ç”µâ„½̃„µ̃s­ç{µ̃{­̃{­̃{­̃s¥Ö„µ̃{µ̃Œµ̃{­̃Œµ̃”½̃Œ½̃”½ç„½̃„µ̃Œµ̃„µ̃{µ̃{µ̃ŒµÖŒ½ç„µ̃„µ̃{µ̃„µ̃„­̃„­̃„½̃„µ̃„½̃„½̃Œµ̃„½̃{µ̃Œ½̃„µ̃{­Ö„µ̃„µ̃{­̃Œ½̃Œµ̃Œ½̃˜ÁÖœÆç¥ÎçÁÛ́µÖë½ĐáÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷̉ặâï÷ïï÷âï÷ïï÷âï÷ï÷÷äéçâï÷ï÷÷âï÷âï÷âï÷âï÷âï÷âï÷̃ç÷âï÷ï÷÷ïï÷ïï÷âï÷äéçäéçÎ̃ïÎ̃ïµÖëµ̉â¥Îç«Đë¥ÎçœÆç˜ÁÖ”½̃œ½̃˜ÁÖŒµ̃Œµ̃Œ½̃„µ̃Œ½̃„½̃„µ̃{­̃ŒµÖ{­Ö{­ÖŒµ̃„µ̃{µ̃{­̃„­Î{µ̃„µ̃{µ̃„µ̃{µ̃s¥Ö{µ̃{­̃ŒµÖ{µ̃Œµ̃{­̃{µ̃{µ̃{­Ö„½̃s­Ös¥Ö{µ̃{µ̃{µ̃„­Î{µ̃{­̃„µ̃Œ½̃Œµ̃”µâ”½̃”½ç”½çœÆç«Đë¥Îç¥Îç«Đëµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặ̃âçäéçâï÷âï÷âï÷ï÷÷ï÷÷÷ÿÿ÷ÿÿ÷ÿÿÿÿÿï÷÷ï÷÷ÿÿÿï÷÷ó÷ûïï÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ïï÷ï÷÷âï÷âï÷âï÷̉ặ̉ặ̉ặÎ̃ï̉ặÎ̃ïÁÛ́µ̉âµ̉âµ̉â¥Îç­Î̃œÆ猽̃{µÖ{­̃s­Ö{­Ös­Ös¥Îs­Ö{µÖ{­̃{¥Î{­Ös­Ö{­̃{­Ö{¥Îs¥Î{­Ö{µÖ{­̃ŒµÖ„µ̃„µ̃Œ½̃Œ½̃„½̃„½̃Œ½çŒµÖ„µ̃Œµ̃”½ç”½̃Œ½̃”½̃”½çœÆ猵̃”½̃”½̃Œ½̃”½ç”½̃Œ½̃„½̃Œ½̃{µ̃„µ̃„µ̃„µ̃„µ̃„µ̃ŒµÖ„½̃„µ̃„½̃„½̃Œµ̃„½̃{µ̃”½̃Œµ̃œÆ̃”½ç„½̃„µ̃{µ̃{µ̃{­Ö{µ̃{­̃„µ̃{­̃„µ̃„µ̃„µ̃„µ̃„µ̃{µ̃{µ̃{µ̃{µ̃{­̃Œ½ç{­̃s¥Ö{µ̃„µ̃{µ̃Œ½ç„½̃Œ½̃„½̃{­ÖŒµ̃Œ½ÖŒ½̃„µ̃„µ̃„½̃Œ½̃Œ½ç„µ̃„µ̃Œµ̃Œ½̃„½̃„½̃ŒµÖ”½ç”½ç¥Îç¥Îç½ĐáÁÛ́Î̃ïÎ̃ïÎ̃ï̉ặ̃âç̃âçäéçïï÷âï÷âï÷äéçïï÷âï÷ï÷÷ïï÷âï÷âï÷âï÷äéçäéçäéçâï÷âï÷âï÷̃ç÷ï÷÷âï÷âï÷̃ç÷̃ç÷̉ặÎ̃ï½Đá«Đë«Đë¥Îç¥ÎçœÆçœÆ̃œÆ̃”½̃”½̃Œ½̃„µ̃„½̃Œ½̃Œ½̃„µ̃„µ̃{­̃„µ̃„­̃„­Î„µ̃„µ̃{µÖŒµ̃{µ̃„µ̃{­̃{µ̃{­Ö{µ̃s­ç{µ̃Œµ̃{­̃„µ̃{­̃{­̃„µ̃„­̃{µ̃{µ̃{­̃{µÖ„µ̃{­̃{­̃{­̃{­̃{­̃„µ̃ŒµÖ„µ̃Œ½̃”½̃”½ç”½çœÆçœÆç¥Îç­Î̃«ĐëÁÛ́½ĐáÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ï̃âç̃âç̃ç÷âï÷ïï÷ï÷÷÷ÿÿ÷ÿÿ÷ÿÿ÷ÿÿ÷ÿÿï÷÷ï÷÷ÿÿÿï÷÷ó÷ûï÷÷ïï÷ï÷÷âï÷ï÷÷ïï÷́éñäéçâï÷äéç̃âç̉ặÎ̃ïÎ̃ï̃ç÷̉ặÁÛ́ÁÛ́µ̉â«Đëµ̉â¥Îç¥Î甽焵̃{­̃{­̃{­Ös¥Ö{µ̃{­Îs­Ö{­Ö{¥Îs­Ö{µÖ{­Ö{­Ös­Ös­Ö{­Ös­Ös¥Ös­Ö”½çŒ½̃”½ç”½̃”½̃„µ̃„½̃„½̃Œ½̃{­̃Œ½ç”½̃Œµ̃”½çœÆ甽̃Œ½̃”½̃”½̃”½̃”½ç”½̃Œ½Ö„½̃Œ½̃{­̃Œ½̃{µ̃„½̃„µ̃Œµ̃„µ̃{­̃Œ½̃„½̃Œµ̃„½̃Œ½̃Œ½ç”½ç˜ÁÖ¥ÎçœÆ甽̃„½̃ŒµÖ„µ̃„µ̃{µ̃„µ̃„­Î{­Ö{µ̃{­̃{µ̃{­Ös­Ös¥Ö„µ̃{­̃s¥Ö{­̃s­ç„µ̃„½̃{­̃„µ̃„µ̃{­̃Œµ̃„µ̃Œ½̃{µ̃„½̃Œ½̃„µ̃„½̃„½̃„½̃Œ½̃”½ç„µ̃„µ̃„µ̃{µ̃„µ̃Œ­Ö{­Ö„µ̃Œ½̃œÆ̃¥Îç«Đë½ĐáÎ̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặâï÷äéçïï÷âï÷âï÷ïï÷ï÷÷ïï÷ïï÷âï÷âï÷äéç̃ç÷âï÷̃ç÷âï÷̃ç÷äéçäéçâï÷̉ặâï÷̃ç÷̃âç̃âçÎ̃ïÇÔâ½Đá«Đë«Đë«Đë¥Î眽̃œÆ̃œÆ甽甽̃Œµ̃”½̃„µ̃Œ½ç„µ̃Œµ̃„µ̃„µ̃„µ̃„µ̃„µ̃„µ̃Œ½̃{­̃{µ̃{­Ö{µ̃„µ̃{µ̃„µ̃{­̃„µ̃„½̃„­̃{­̃{µ̃„½̃{­̃„­Î{µÖ{µ̃{­̃s¥Ö{µ̃{µ̃{­̃{µ̃„µ̃„µ̃{µ̃„½̃Œ½̃„½̃„µ̃”½̃”½ç”½ç ̀â¥Îç«Đë«Đë«Đë½ĐáµÖë½ĐáÁÛ́Î̃ïÎ̃ï̉ặ̉ặ̃âç̃ç÷âï÷âï÷âï÷ïï÷ó÷ûó÷ûÿÿÿ÷ÿÿó÷ûï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ó÷ûï÷÷âï÷âï÷̃ç÷̃âç̉ặ̉ặäéç̃âç̉ặÎ̃ï½Đá½Đáµ̉â«Đëµ̉â«Đ댵̃s¥Ö{­Ös¥Ö{­Ös­Ös¥Ö{­Ös­Ös­Ö{­Ö{­Ös­Ös¥Îs¥Îs¥Ö{­Ös¥Ö{­Ö{­Ös­ÖŒ½̃”½̃Œ½̃Œ½̃„µ̃”½çŒ½̃ŒµÖŒ½̃Œ½̃Œ½̃Œ½̃”½çŒ½̃”½çœÆ̃Œ½Ö”½̃Œ½̃”½̃Œ½̃”½̃„½̃Œµ̃„½̃Œµ̃Œµ̃ŒµÖ{µ̃{­̃„µ̃„½̃„µ̃„µ̃„­̃„µ̃„µ̃„µ̃Œ½çœÆç¥Îçµ̉â ̀â˜ÁÖ„½̃{­Ö„µ̃„µ̃{­̃{µÖ{µ̃s¥Ös­Ö{­̃s¥Ös¥Ö{­̃{µ̃{µ̃{µ̃„µ̃„µ̃s­ç{µ̃„­̃„µ̃{­̃„µ̃{µ̃{µ̃„µ̃„µ̃ŒµÖŒµÖ„µ̃„½̃„½̃„½̃„µ̃„µ̃”½çŒµ̃„½̃„­̃Œ­Ö{µ̃{­̃„µ̃Œ½ÖŒµ̃”½̃¥Îçµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ï̃ç÷Øëó̃âçäéçäéçïï÷âï÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷äéç̃ç÷äéç̉ặ̃âç̃âçâï÷̃ç÷âï÷̃âç̃ç÷Î̃ẩặ̉ặÎ̃ïÎ̃ïµÖëµ̉â¥Îç¥Îç¥ÎçœÆç˜ÁÖœÆçœÆ̃”½ç„µ̃Œ½ÖŒ½Ö”½̃Œ½̃„µ̃ŒµÖ„µ̃„µ̃{µ̃„µ̃Œµ̃„µ̃{µ̃„µ̃„µ̃„µ̃{µ̃ŒµÖ„µ̃{µ̃„µ̃{µ̃s­ç„µ̃{µ̃{µ̃{µ̃„µ̃{­Ö„µ̃„µ̃„µ̃„½̃{µ̃„µ̃„µ̃{­Ö{­̃„­Î„µ̃„µ̃„½̃„½̃Œµ̃Œ½̃˜ÁÖœÆ̃¥Îç¥Îç¥Îç¥Îçµ̉âµÖëµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ẩặÎ̃ï̉ặ̃âçäéçâï÷ïï÷ï÷÷ó÷ûï÷÷ó÷û÷ÿÿó÷ûÿÿÿÿÿÿï÷÷ÿÿÿï÷÷ï÷÷ïï÷äéçâï÷âï÷ïï÷âï÷äéçâï÷̉ặÎ̃ï̃ç÷̃ç÷̃ç÷̉ặÎ̃ïÁÛ́µÖë¥Îç«Đëµ̉â¥Î焵̃s¥Ös­Ö{­Ös¥Ös­Ö{­Ö{­Ö{µÖs¥Ös­Ös­Ös¥Ös¥Ö{­Î{­Ö{­Ös­Ö{­̃{­Ö{­Ö˜ÁÖ”½çœÆ猽猽̃”½̃”½ç”½ç”½̃Œµ̃”½ç„½̃Œ½̃”½çŒ½̃”½̃Œ½Ö”½̃Œ½̃”½̃”½ç”½ç”½çŒµÖ{µ̃{­̃„µ̃{µ̃„µ̃„µ̃„½̃{µ̃{­̃{­̃Œµ̃{µ̃Œ½̃”½̃¥Îç¥Îçµ̉âµ̉âœÆ甽焽̃Œ½Ö{­̃{µ̃{­̃{µ̃„½̃s¥Ö{­̃{µ̃{µ̃s­Ö{­Ö{­̃{­̃{µ̃„µ̃{µ̃Œµ̃{­̃{­̃{­Ö„µ̃{­̃{µÖ„½̃„µ̃ŒµÖŒ½̃{µ̃„µ̃Œ½̃„½̃„µ̃{­̃„½̃{µ̃„µ̃Œµ̃„µ̃„µ̃Œ½̃{µ̃”½çŒ½̃œÆç¥Îç¥ÎçµÖë½ĐáÁÛ́Î̃ïÎ̃ï̃ç÷̃ç÷̃ç÷̃ç÷äéçï÷÷âï÷äéçïï÷ïï÷âï÷ïï÷âï÷âï÷̃âç̃ç÷Î̃ẫâçÎ̃ï̃ç÷̃ç÷̃âç̃ç÷̃ç÷ÁÛ́Î̃ïÎ̃ïÁÛ́ÇÔâµ̉âµ̉â¥ÎçœÆç¥Îç¥ÎçœÆ甽̃Œ½̃Œ½̃Œ½̃”½ç”½çŒ½Öœ½̃”½̃„µ̃„µ̃{­̃Œ½̃Œ½̃ŒµÖ„µ̃Œµ̃{µ̃{µ̃s¥ÖŒ½ç{­̃Œ½̃{­̃{µ̃{­̃{µ̃{­̃{­̃„µ̃s¥Ö{­̃{µ̃{µ̃{µ̃{­̃„­̃{µ̃{µ̃{­̃{µÖ{µ̃„µ̃Œ½ç”½çŒ½̃Œ½Ö”½̃œÆ眽̃«Đë¥Îçµ̉âµ̉â«Đëµ̉âÁÛ́½ĐáµÖëÁÛ́ÎÖïÎ̃ïÎ̃ï̉ặ̉ặ̃ç÷̃ç÷ï÷÷ïï÷ïï÷ï÷÷ó÷ûï÷÷ï÷÷ÿÿÿó÷ûó÷û÷ÿÿï÷÷ó÷ûâï÷ï÷÷âï÷âï÷ï÷÷âï÷́éñâï÷̉ặÎ̃ïÎÖïâï÷̃ç÷̃ç÷̉ặÎ̃ïÁÛ́µ̉â¥Îçµ̉â«Đë¥Æ̃Œ½̃s­Ös­Ös¥Ös­Ös¥Îs­Ös­Ös­Ös­Ös¥Ös¥Ös¥Ö{­ÖsœÎ{­Î{­Îs­Ö{­Ös­Ö{­Ö”½̃Œ½Ö”½ç”½ç”½̃”½ç„µ̃„µ̃Œ½Ö{µ̃Œ½̃Œ½çŒ½̃”½̃”½̃œÆç–·ÖŒ½ç„µ̃”½̃„µ̃Œ½̃Œ½ÖŒ­ÖŒ½̃Œ½Ö„µ̃„½̃„µ̃Œ½̃{­̃Œ­Ö{­̃{µ̃„µ̃„µ̃œÆ̃¥Îçµ̉âµ̉â¥Îç¥Îç«Đë ̀⌽̃Œµ̃{­̃„½̃s­Ö{­̃{µ̃{­̃{µ̃{­̃s¥Ö{­̃{µ̃s­Ös­Ö„µ̃{­̃{µÖ{µ̃{­̃s­Ös¥ÖŒµ̃{­̃{­̃„µ̃{­̃{µ̃Œ­ÖŒ­Ö„µ̃{­̃Œ½̃Œµ̃Œµ̃{­̃{­̃{µ̃Œ½̃Œµ̃ŒµÖ{µ̃{­̃ŒµÖ”½ç¥Îç¥Îçµ̉âÁÛ́ÁÛ́Î̃ï̃ç÷Î̃ïÎ̃ïØëóâï÷̉ặâï÷âï÷ïï÷ïï÷âï÷ïï÷ï÷÷âï÷ïï÷̃ç÷âï÷̃ç÷̉ặÎ̃ï̃ç÷̃âç̃ç÷̃ç÷Î̃ïÎ̃ïÎ̃âÁÛ́ÁÛ́ÁÛ́µ̉â«Đë¥Îç¥Îç¥Îç˜ÁÖœÆ甽̃Œ½Ö”½ç”½̃”½̃”½çŒµÖœÆ̃”½̃”½̃”½çŒ½̃Œ½̃”½çŒµÖ{­̃„µ̃„­̃„½̃ŒµÖ{­ÖŒ½Ö{­̃{­̃„­̃{­̃{­Ö{µ̃{­̃{µ̃{­̃„µ̃{­̃{µ̃Œ½ç„½̃Œ½Ö„½̃{­̃„µ̃„µ̃{µ̃Œµ̃Œ½̃”½ç{­̃„½̃”½çœÆ̃œÆ̃˜ÁÖ«Đë­Î̃µ̉âÁÛ́µ̉â«Đëµ̉âÇÔâµÖëÁÛ́Î̃ïÎ̃ïÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷̃ç÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ÿÿÿï÷÷ï÷÷ï÷÷ó÷ûï÷÷ï÷÷ïï÷ï÷÷äéçâï÷âï÷äéçâï÷̉ặ̉ặÎ̃ïÎ̃ẫâç̉ặ̃ç÷ÁÛ́Î̃ïµÖë¥Îç˜ÁÖ­Î̃¥ÎçœÆ焵̃{­̃{­Î{µ̃s¥Ös­ÖsœÎs­Ö„­Îs¥Ö{­Ö{­̃s­Ös¥Ös­Ös¥Îs­Ös­Ö{­Î{­̃{µ̃ŒµÖŒ½̃”µâ”½çŒ½̃Œ½̃”½̃Œ½̃{­̃Œµ̃Œ½ç”½çœÆ̃Œ½̃”½çœÆ甽甽甽猽֔½̃”½ç„½̃”½ç”½çŒ½̃{­̃„­̃„½̃{µ̃{µ̃Œ½Ö{µ̃Œ½Ö„½̃”µâ«Đëµ̉âµ̉âµ̉â¥ÎçœÆ甽çœÆ甽̃„µ̃{­̃{­̃{­̃{­̃{­̃s¥Ös¥Ös­Ös­Ös¥Ö{­̃{µ̃„µ̃{µ̃{­̃„µ̃s¥Ö{­̃{µ̃{µ̃{­̃„­̃{µ̃{­̃„½̃{­ÖŒµÖŒ­Ö„½̃{­̃”½̃„½̃{µ̃{­̃{µ̃Œ­Ö„­̃„µ̃{­ÖŒµÖŒ­ÖŒ½̃”½̃¥Îç¥ÎçÁÛ́½ĐáÁÛ́Î̃ïÁÛ́ÁÛ́ÁÛ́̃ç÷̃âçâï÷âï÷̃âç̃ç÷ïï÷âï÷âï÷ï÷÷âï÷âï÷äéçÎ̃ïÎ̃ï̉ặ̉ặÎ̃ï̉ặâï÷̉ặÎ̃ïÎÖïÎ̃âµÖëµÖëµ̉â«Đë¥ÎçœÆç˜ÁÖ”½̃œÆçœÆ̃œÆç˜ÁÖœÆç˜ÁÖŒµÖ˜ÁÖœÆ̃”½̃œÆ̃”½̃”½çŒ½Ö”½̃”½ç{­̃{­̃{µ̃{­Ö„½̃s­Ö{­̃s­Ö{­̃„µ̃{µ̃„µ̃{­̃{µ̃Œ½̃{­̃{­̃„µ̃„µ̃„µ̃Œ½̃”½̃{µ̃{µ̃”½ç„µ̃{­̃{µ̃{µ̃ŒµÖŒ½̃{­̃œÆ甽ç˜ÁÖœÆç«Đëµ̉âµ̉âµ̉â«Đëµ̉âµ̉âÇÔâÇÔâÎÖïÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ẩặ̉ặ̉ặâï÷̃ç÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ÿÿÿïï÷ÿÿÿï÷÷ï÷÷ïï÷ïï÷̃ç÷ïï÷ïï÷âï÷ïï÷Î̃ïÁÛ́Î̃ïÎ̃ïÎÖï̃ç÷Î̃ïÁÛ́ÁÛ́µ̉┽ç¥Îç¥Îç¥Î甽̃{µ̃{­Ö{­̃s¥Ös­Ö{­Î{­Î{µ̃s­Ös¥Ö{µ̃s¥Ö{­Îs­Ös­Ös¥Ös­Ös­Ös¥Ö{¥Îs­Ö¥ÎçœÆçœÆ̃”½ç”½̃Œµ̃”½ç”½ç”½̃{µ̃œµ̃”½ç”½̃Œ½̃Œµ̃Œ½̃œÆ̃œÆ猽̃Œ½̃Œ½̃{­ÖŒ½̃Œ½̃Œ½Ö{­̃„µ̃„µ̃„µ̃„½̃Œ½çŒ­Ö{­̃{µ̃„µ̃¥Æ̃µ̉âµ̉âµ̉â«Đë¥Îç˜ÁÖ˜ÁÖ„µ̃„½̃„µ̃{­Ö{­̃{µ̃{­̃„µ̃{µ̃s¥Ös­Ö{­̃{­Ö{­Ös­Ö{­Ös­Ös­Ö„­Î{­̃{µ̃s¥ÖŒ½ç{­̃ŒµÖ{­̃ŒµÖ„­̃Œ­ÖŒ­Ö{­̃„µ̃„µ̃Œ½̃Œ½çŒ½ÖŒ­Ö{­̃Œ½ÖŒµ̃Œµ̃„µ̃„µ̃„µ̃”½̃”½çœÆ̃¥Îç½ĐáµÖëÇÔâÎ̃ïÁÛ́ÁÛ́Î̃ẫç÷̃âç̉ặâï÷äéçâï÷ï÷÷âï÷ïï÷âï÷̃âçâï÷̃ç÷̃ç÷̃ç÷Î̃ï̃âç̉ặ̉ặÎ̃ï̃ç÷̃ç÷Î̃ïÁÛ́ÁÛ́µÖëµ̉â«Đë¥Îç¥ÎçœÆç¥Îç˜ÁÖœÆ̃”½̃Œ½̃”½̃˜ÁÖ–·Ö”½ç˜ÁÖ”½çœÆçœÆ猽̃Œ½̃Œ½̃Œ½Ö{­̃{µ̃ŒµÖ{µ̃{­Ös­ÖŒµÖs­ÖŒ­Ö{­̃{µ̃{­̃„½̃s­çŒ½Ö„½Ö„µ̃„½̃„µ̃„µ̃Œ½̃Œ½̃Œ½̃”½ç„½̃Œ½̃{­̃Œµ̃„µ̃Œ½Ö”½çœÆç¥Îç ̀â¥Îç¥Îç¥Îç«Đë¥Îç«Đëµ̉â«Đëµ̉â½ĐáÎ̃ïÎ̃ïÎ̃âÎ̃ïÎ̃ïÎ̃ï̃âç̉ặ̃ç÷âï÷âï÷äéçâï÷ïï÷âï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ÿÿÿï÷÷ïï÷ï÷÷âï÷äéçâï÷âï÷ïï÷âï÷̉ặÎ̃ïÁÛ́Î̃ïÎ̃ï̃âçÎÖïÇÔâµ̉â¥ÎçœÆ̃œ½̃¥Îç˜ÁÖ{µ̃s¥Ös­Ös¥Ö„­Î{µ̃{µ̃{­Ö{­Îs­Ös¥Îs­Ös­Ö{¥Î{­̃{­Ös­Ös­Ö{­Ö{­̃{µ̃s¥ÖœÆ̃œÆ甽̃”½̃”½ç”½ç”½̃Œ½Ö{­̃Œ½̃Œ½̃”½̃Œ½̃Œ½̃”½ç”½̃”½̃ŒµÖ„µ̃”½̃Œ½çŒ½̃{µ̃Œµ̃Œ½ÖŒ½̃„½̃„µ̃Œ½̃„µ̃„µ̃„½̃”½çŒ½̃Œ½̃œ½̃µ̉âÁÛ́ÁÛ́µ̉â¥Î甽̃Œµ̃Œ½ÖŒ½̃„µ̃{µ̃{­̃{µ̃{­̃{µ̃s­Ö{µ̃s¥Ö{µ̃s¥Ös¥Ös¥Ö{­̃{µ̃{­Ö{­̃„½̃{µ̃s¥Ö{µ̃{µ̃s¥Ös­Ö{­Ö{µ̃„µ̃ŒµÖ{µ̃{­̃„µ̃{µ̃Œ½̃{µ̃Œ½̃{­̃{µ̃„µ̃{µ̃„µ̃Œµ̃Œ½̃˜ÁÖ¥Îç«ĐëµÖëµ̉âµÖëµÖëÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ï̃âçäéçäéç̃ç÷ï÷÷ï÷÷äéçäéç̃ç÷äéç̃âç̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷Î̃ïÎ̃ï̃ç÷Î̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â¥Îç«ĐëœÆçœÆçœÆ甽甽甽甽猽̃Œ½̃”½ç”½̃œÆ̃˜ÁÖ”½̃œÆ猽̃Œ½̃{µ̃{­̃{µ̃„µ̃{µÖ{µ̃{­̃{µ̃{µÖ{µ̃„­̃s¥Ö{­̃{­̃{µ̃„½̃{­̃Œµ̃Œµ̃„µ̃Œ½̃œ½̃”½ç„µ̃Œ½çŒ½̃„½̃Œ½̃„µ̃”½çŒµ̃”½çœÆçœÆçœÆçœÆç¥ÎçœÆç¥Îç«ĐëµÖëµ̉âµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́Î̃ïÎ̃ï̉ặäéç̃ç÷ïï÷âï÷âï÷âï÷ïï÷ï÷÷ïï÷ï÷÷ÿÿÿïï÷ó÷ûï÷÷ï÷÷ï÷÷ï÷÷ï÷÷âï÷âï÷̃ç÷âï÷âï÷̉ặÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïµÖë«Đë«Đë¥Îç¥Î甽电â{µ̃{­̃s¥Ös­Ös¥Îs­Ös¥Ö{­̃{­̃„­Îs¥Ö{­Ö{¥Î{µ̃s­Ö{µ̃s¥Ös¥Ö{µ̃s¥Ö{­̃s¥Ös¥ÖœÆ̃œÆ̃”½ç”½̃”½̃”½̃˜ÁÖ”½ç”½ç”½çŒ½̃Œ½̃”½çŒ½̃Œµ̃Œ½̃”½çŒµ̃”½çŒ½̃Œµ̃Œ½̃Œµ̃„µ̃Œ½ÖŒ½̃Œ½̃„½̃„½̃{­̃„µ̃„½̃Œµ̃Œ½̃”½̃¥ÎçÁÛ́µÖëµ̉âœÆçœÆ猽猽̃Œ½̃„µ̃{µ̃{µ̃{­Ö{­̃{µ̃{µ̃{µ̃{­Ö{­̃s¥Ö{µ̃s¥Ö{µ̃s¥Ö{­̃{­Ö{µÖ{­̃„­̃{µ̃{µ̃{µ̃„µ̃„µ̃{µ̃{µ̃„µ̃„µ̃ŒµÖŒ½̃Œµ̃„µ̃„µ̃Œµ̃„µ̃{­̃{µ̃{µ̃„µ̃ŒµÖŒ½̃Œ½̃œ½̃¥Îç¥Æ̃µ̉âµÖëÇÔâÎ̃ïµÖëÇÔâÎ̃ïÎ̃ï̃ç÷̃âçâï÷âï÷âï÷âï÷ïï÷âï÷âï÷̃âç̃ç÷̃âç̉ặ̉ặ̃ç÷ÁÛ́̉ặÎ̃ï̉ặ̃ç÷̉ặ̉ặÎ̃âÎ̃ïÎ̃ïÎ̃âÁÛ́ÁÛ́µ̉â«Đë«ĐëœÆç˜ÁÖ”½̃”½ç”½ç”½̃”½çŒµ̃”½çŒ½ç”½̃œÆ甽̃”½çœÆ猽̃„½̃Œ½̃„µ̃{­̃„µ̃{µ̃„­Î{­̃{µ̃„µ̃„µ̃{­̃„µ̃{­̃„µ̃{­̃Œ½̃Œµ̃Œ½̃Œ½̃”½̃”½ç„µ̃Œ½ç„µ̃Œ½̃Œµ̃Œ½̃Œµ̃„­̃ŒµÖŒ½̃œÆ̃œÆç¥Î眽̃œÆ̃¥Îç¥Îç«Đëµ̉âÁÛ́½ĐáÁÛ́ÇÔâÎ̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ï̃âç̃âç̃âçâï÷ïï÷âï÷ï÷÷̃âçï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ó÷ûïï÷ï÷÷ïï÷âï÷âï÷̃ç÷̃ç÷̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́µÖë«Đë¥Îç¥ÎçœÆ̃¥Î甽猽ç{­̃s¥Ö{­Ös¥Ös¥Ös­Ös­Ös¥Ö{­̃s­Ös­Ös¥Ös¥Ös­Ös­Ös­Ö{­Ö{­̃s­Ös­Ö{­Ös­Ö{­̃¥ÎçœÆ甽̃œÆ̃˜ÁÖ”½ç”½̃Œ½̃œÆ̃”½̃”½̃”½̃”½ç”½̃”½ç”½̃„½̃”½̃„½̃Œ½̃Œ½̃”½̃Œ½çŒµÖ”½̃„½̃Œ½Ö„µ̃„µ̃Œ½̃„µ̃„µ̃Œ½̃Œ½̃˜ÁÖ¥Îçµ̉âµ̉â«Đë«Đ딽̃”½̃Œ½̃„µ̃„µ̃„µ̃{µ̃„µ̃s¥Ö„­̃{µ̃{­Ös­Ö{­̃„µ̃s¥Ös¥Ös¥Ö{µ̃s¥Ö{­̃{­̃{µÖ{µ̃„µ̃{µ̃„µ̃{µ̃{µ̃{­̃{­̃{­̃„µ̃„µ̃{­̃Œ½̃„µ̃„µ̃„µ̃„­̃ŒµÖ{µ̃{­̃Œ½ÖŒµ̃”½̃œÆç¥Îç«Đëµ̉âµÖëµ̉âÁÛ́ÇÔâ½Đáµ̉âµÖëÎ̃ïÎ̃ï̃âç̃ç÷äéçï÷÷̃ç÷âï÷âï÷̃ç÷̃ç÷̃ç÷Î̃ï̉ặÎ̃ï̉ặ̃âç̉ặ̉ặ̃ç÷̉ặ̃âç̃ç÷Î̃ïÎ̃ï̉ặÁÛ́Î̃ïÁÛ́µÖëµ̉â¥Îç ̀✽̃œÆçœÆ甽猽猽̃”½̃Œ½ç”½çŒ½̃Œµ̃”½̃œÆ̃”½̃˜ÁÖ”½çŒ½ÖŒ½Ö„µ̃„½̃„µ̃{­Ö{µ̃{­̃{µ̃„µ̃„µ̃„µ̃{µ̃„µ̃”½̃„½̃Œ½̃Œ½̃”½̃Œ½̃„µ̃„µ̃”½ç„µ̃„µ̃Œµ̃Œ½̃„½̃Œµ̃”½̃”½çœÆçœÆç¥Îç¥Îç¥Îç¥Îç¥Îç«Đë½Đá½ĐáµÖëÎ̃ïÎ̃ïÁÛ́Î̃ï̃âçÁÛ́Î̃ï̉ặ̃âç̃ç÷äéçâï÷äéçäéçâï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûïï÷ï÷÷âï÷̃ç÷Î̃ïÎ̃âÎ̃ïÎ̃ï̉ặÁÛ́µ̉â«Đë¥Îç¥Îç¥Îç¥Îç¥Î甽甽̃{­̃{­̃{­Ös­Ös­Ös¥Ös¥Ös­Ös¥Ö{­̃{­Ös¥Ös¥Ös­Ö{µ̃s­Ö{­Îs­Ö{­Ös¥Ös­Ö{­Ös­Ö«Đë¥Îç¥ÎçœÆçœÆ̃˜ÁÖœ½̃”½ç”½̃”½ç”½̃”½̃Œ½̃”½çŒ½çŒµÖ”½çŒ½̃ŒµÖŒ½̃”½̃Œ½̃Œ½ÖŒ½̃”½̃Œ½̃„µ̃Œ½̃„½̃„µ̃Œµ̃”µâ”½̃Œ½̃˜ÁÖ¥Îç«Đëµ̉â­Î̃¥Î电┽̃ŒµÖ„µ̃Œµ̃„½̃„­Î{µ̃{µ̃s¥Ö{­Ö{­̃s¥Ös¥Ös¥Ö{µ̃{­̃{µ̃s¥Ös¥Ös¥Ös­Ö{µ̃s¥Ö{µ̃{­̃„µ̃{µ̃{­Ö{­̃„½̃ŒµÖ{­ÖŒ½̃Œ½̃„µ̃Œ½̃{­̃Œµ̃„µ̃„µ̃„µ̃{µ̃„µ̃”½̃œÆçœÆç¥Îçµ̉â«Đë«Đë«ĐëÁÛ́ÁÛ́ÁÛ́½Đá½ĐáÎ̃ï̃âç̃âç̃ç÷âï÷âï÷̃ç÷̃ç÷âï÷̃ç÷̃ç÷̉ặÎ̃ï̉ặÎ̃ï̃ç÷̉ặ̉ặ̃ç÷äéçâï÷̃ç÷̃âç̃âç̉ặ̃ç÷Î̃ïÎ̃ïÁÛ́µÖëµ̉â¥Îç¥ÎçœÆ̃”½̃”½̃”½̃œÆ猽̃”½çŒ­Ö”½̃Œ½̃Œ½̃„µ̃”½̃œÆ甽甽̃Œ½̃Œ½çŒµ̃Œ½̃„µ̃„µ̃{µ̃{­Ö„µ̃„µ̃„µ̃ŒµÖŒ½ç{µ̃„½̃„½̃Œµ̃Œ½̃{­̃Œ½̃Œ½ç„µ̃Œ½çŒ½̃Œ½̃Œ½̃”½̃”½çŒ½̃Œ½̃ ̀â˜ÁÖ¥Îç¥Îç¥Îç¥Îç¥Îç¥Îçµ̉âÎ̃ïÁÛ́ÁÛ́ÎÖïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́̉ặ̉ặ̃ç÷âï÷̃âç̃ç÷äéçïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûïï÷ó÷ûïï÷ï÷÷ï÷÷ïï÷âï÷äéç̃âçÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â¥ÎçœÆçœÆç«Đë¥ÎçœÆçœÆ甽̃„½̃„µ̃s¥Ös­Ös­Ö{µÖs¥Ö{µ̃s¥Ö{µ̃{µ̃{µ̃s­Ö{­Ö{­Ös¥Îs¥Îs¥Ös­Ö{­̃s­Ös­Ö{µ̃¥Îç¥ÎçœÆçœÆ̃œÆçœÆ̃œ½̃œµ̃œÆ̃˜ÁÖ”½ç”½ç”½̃Œ½̃”½çŒ½̃Œ½çŒµÖ„µ̃„½̃”½̃Œ½ÖŒ½̃”½ç”½̃Œ½̃Œ½̃„µ̃Œµ̃Œ½̃Œ½̃˜ÁÖœÆç¥Æ̃¥Îç¥Îçµ̉âµ̉âµ̉âœÆçœÆ猽̃„µ̃Œ½̃Œµ̃„µ̃„µ̃{­̃{­̃{­̃„µ̃„½̃s­Ös­Ös¥Ö{µ̃{­̃s­Ö{µ̃s­Ö{µ̃„­̃„µ̃s­Ö{µ̃{µ̃{µ̃{µ̃„µ̃{­̃{µ̃{­Ö„µ̃{­̃Œ½Ö„­̃{µ̃„µ̃„­̃{µ̃s­Ö„­̃{µ̃{­̃Œ½ÖœÆç¥Îç«Đë¥Îç¥Îçµ̉âµ̉âÁÛ́½ĐáÁÛ́µ̉âÁÛ́Î̃ï̃âç̉ặ̃âçäéçâï÷âï÷̃ç÷̉ặ̃ç÷̃âç̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ï̉ặ̃ç÷̃ç÷̃ç÷âï÷äéç̃ç÷̃ç÷âï÷̃ç÷̉ặÎ̃ïÎ̃ïÁÛ́µ̉â«Đë¥Î眽̃œÆ̃”½̃”½̃”½̃Œ½̃Œ­Ö˜ÁÖ”½̃Œ½çŒ½̃„½̃Œµ̃”½̃”½ç„½Ö„µ̃Œ½̃„µ̃Œµ̃„µ̃„µ̃{­̃„µ̃Œµ̃„µ̃„µ̃„µ̃„µ̃Œ½ç{µ̃Œ½̃„µ̃”½̃Œ½̃Œ½ç„µ̃Œµ̃Œ½̃Œ½̃Œ½ç”½ç„½̃”½ç”½ç”½çœÆç¥ÎçœÆç¥ÎçœÆçœÆç¥Îç«Đëµ̉â½ĐáÎ̃ïÎ̃ïÁÛ́̃ç÷ÎÖïÎ̃ï̉ặ̉ặ̉ặ̃âç̉ặ̉ặ̃ç÷̃ç÷̃ç÷̃ç÷âï÷́éñï÷÷ï÷÷ó÷ûïï÷ï÷÷ó÷ûï÷÷ï÷÷ï÷÷ï÷÷âï÷âï÷ïï÷̃âçÎ̃ïÁÛ́Î̃ï½Đáµ̉âµ̉âµ̉â¥Î甽ç¥Îçµ̉â«Đë¥Î甽̃”½̃„½̃{µ̃s¥Ös¥Ö{­Î{­Ö{µ̃s¥Ö„½̃„µ̃{µ̃{µ̃{µ̃s¥Ös­Ö{µ̃{­Ö{µ̃„­Îs¥Ö{­Ö{­Î{µ̃¥Îç¥ÎçœÆçœÆçœÆçœÆ̃œÆ̃œÆç–·ÖŒ½̃”½̃”½̃”½̃ŒµÖ”½̃ŒµÖŒ½Ö{µ̃Œ½̃”½̃ŒµÖ”½çŒ½̃Œ½̃”½̃ŒµÖ”½ç˜ÁÖ”½ç˜ÁÖ”½̃¥Îç¥Îç«Đë¥Îçµ̉âµ̉âµ̉â¥ÎçœÆ甽眽̃Œµ̃Œ½̃„µ̃„µ̃{µ̃{µ̃Œ½̃{µ̃s­Ö{­̃s­Ös¥Ö{µ̃{­̃s­Ö{µ̃{µ̃s¥Ös¥Ös¥Ös­Ös­Ö{­̃{µ̃{µ̃{­̃„µ̃{µ̃{µ̃{µ̃{µ̃ŒµÖ„­̃ŒµÖ{µ̃ŒµÖ{µ̃s­ÖŒ½Ö{­̃{µ̃ŒµÖŒ½̃”½ç¥Îçµ̉âµ̉âµ̉âµ̉âµ̉âµ̉âÁÛ́½Đá½Đáµ̉âÁÛ́Î̃ẫç÷̃âç̃âçäéçâï÷̃ç÷̃ç÷̃ç÷ØëóÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎÖï̃ç÷̃ç÷̃âçâï÷äéçâï÷̃ç÷âï÷̃âç̃ç÷̉ặÎ̃ïÁÛ́ÁÛ́ÁÛ́«Đë ̀âœÆçœÆ甽̃”½̃”½̃”½ç”½ç”½çŒ½ÖŒ½̃Œ½çŒ½̃„µ̃Œ½̃Œ½̃ŒµÖ„µ̃Œµ̃Œµ̃„µ̃{­̃{­̃{µ̃Œ½̃„µ̃{µ̃„½̃{µ̃{­̃„­̃{­̃{µ̃Œ½̃”½ç„½̃”½ç„µ̃”½çŒ½̃”½çŒ½̃”½çŒ½çŒ½̃„µ̃Œ½̃œÆç˜ÁÖ¥Îç˜ÁÖœÆçœÆç¥Îç¥Îçµ̉âµ̉âÁÛ́Î̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ï̃âç̉ặ̉ặ̃ç÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷äéçâï÷̃ç÷̉ặÎ̃ïÎ̃âÁÛ́µ̉â¥Îç¥Îç¥ÎçœÆ̃œÆ̃«ĐëµÖëœÆçœÆ̃”½çŒ½ÖŒµ̃s¥Ös­Ö{­Î{­Îs¥Ö{µ̃{­̃Œ½̃{­̃Œµ̃„µ̃{µ̃{­̃s­Ös­Ö{­̃s¥Ö{­Ö„­̃s­Ös­Ö{­̃µ̉â¥Îç¥Îç«Đë«Đë¥Îç¥Îç¥Î甽̃{­̃Œ½̃Œ½̃”½̃”½̃ŒµÖŒµÖ”½̃{­̃Œ½̃Œ½̃”½̃Œ½̃Œ½ç”½̃”½̃”½̃œÆ甽̃œÆç¥Æ̃µ̉âµ̉âµ̉âµ̉âµÖëµ̉â«Đë«Đë¥ÎçœÆ̃˜ÁÖŒ½Ö–·ÖŒ½̃{µ̃{­Ö„½̃{µ̃{µ̃s­Ö„­̃„½̃{­̃{µ̃{­̃{­̃{µ̃s­Ö{µ̃{µ̃s­Ö{µ̃{­̃s­Ös¥ÖŒ­Ö{­̃s¥Ös­Ö{­̃{­ÖŒµ̃Œ½̃{µ̃s¥ÖŒ­ÖŒµ̃„­̃{­̃{­Ös­Ö{µ̃{µ̃{µ̃ŒµÖœÆç­Î̃µ̉âµ̉â¥Îç«Đë«ĐëÁÛ́µ̉âÁÛ́µÖëµ̉âµÖëÁÛ́̃ç÷̉ặ̉ặâï÷̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎÖïÎÖï̃ç÷âï÷̃ç÷äéçïï÷âï÷̃ç÷ïï÷âï÷̃ç÷̃ç÷Î̃ïÎ̃ï½ĐáÎÖïµ̉âµÖë¥Îç¥Îç«Đë¥ÎçœÆ̃˜ÁÖ{­̃Œ½̃˜ÁÖŒ½̃”µâ„µ̃{µ̃Œ½̃{­̃{­̃”½ç„µ̃„µ̃Œ½̃{­̃{­̃”½çŒ½Ös¥Ö„½̃„µ̃{µ̃{­̃Œ½Ö”½ç{­̃„µ̃„µ̃„½̃„­̃„µ̃{­̃{µ̃Œµ̃Œ½̃Œ½ÖœÆ̃”µâœ½̃Œ­ÖœÆçœÆ̃˜ÁÖœÆç ̀âœÆç¥Îçµ̉âµ̉âÁÛ́µ̉âÁÛ́ÁÛ́Î̃ïÎÖïÎ̃ïÎÖïÎ̃ï̃ç÷Î̃ï̉ặ̃âçÎ̃ï̃ç÷âï÷ï÷÷âï÷ï÷÷ï÷÷âï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ÿÿÿïï÷äéçïï÷âï÷âï÷ØëóÎ̃ïÎ̃ïÇÔâµ̉â¥Îç¥Îç¥ÎçœÆç¥Îç«Đë«Đë«Đë˜ÁÖ¥Îç–·ÖŒ½̃s¥Ö{µÖ{­Îs­Ö{­Ö{­̃{µ̃s¥ÖŒµ̃Œ½̃”½̃„­̃{µ̃ŒµÖ{­Î{­Î{­Ös­Ös­Ö{­Ös­Ö{­̃¥Îç«Đë¥Îç¥Îç¥Îç¥Îç¥ÎçœÆçœÆç˜ÁÖœÆ̃”½ç”½̃”½̃Œ½Ö”½çŒµ̃Œ½̃”½ç”½̃Œ½̃Œ½Ö”½ç˜ÁÖ”½ç¢¿ÔŒ½̃¥Îç¥Îç¥Îçµ̉âµ̉âµ̉âµ̉âµÖëµÖëµÖë¥ÎçœÆçœÆçœÆ̃”½ç„½̃ŒµÖ„µ̃{­̃{­̃{µ̃{µ̃s­Ö{­̃„µ̃„µ̃{µ̃s­Ö{­ÖŒ­Ö{µ̃s¥Ö„­Îs­Ö{­̃s¥Ö{­̃Œ­Ö{­̃{µ̃{µ̃{­Ö{µ̃{­ÖŒ­Ö{µ̃{­̃{­̃„­̃Œµ̃„µ̃{­̃{­̃{µ̃{­̃s­Ö„½̃„½̃œÆ̃¥Îç¥Îç½Đáµ̉â½ĐáÁÛ́ÁÛ́µ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ï̃ç÷̉ặ̉ặÎ̃ï̉ặÁÛ́̃ç÷Î̃âÎ̃âÁÛ́ÁÛ́ÎÖïÎ̃ï̃ç÷̃ç÷̃ç÷âï÷âï÷ïï÷ïï÷ï÷÷âï÷âï÷äéç̉ặ̃âç̉ặÁÛ́ÎÖïµÖëÎÖïµ̉âµÖë«Đë¥Îç¥Îç¥Îç˜ÁÖŒ½̃Œµ̃Œ½̃„µ̃„½̃Œ½̃{µ̃ŒµÖ„­Î{­̃Œ½Ö{­̃„µ̃ŒµÖŒ­Ö{­̃s­Ö{µ̃„µ̃„­̃{­̃{­Ö{­̃{­̃Œ½Ö”½ç„µ̃„µ̃„µ̃„µ̃”½çŒ½̃{­̃Œµ̃Œ½̃Œ½̃”½ç”½ç”½çŒ½̃ŒµÖ”½ç˜ÁÖœÆç¥ÎçµÖë½ĐáÁÛ́µ̉âÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ï̃ç÷̃ç÷̉ặ̃ç÷Î̃ïÎ̃ï̃ç÷̃âçâï÷̃ç÷̃ç÷̃ç÷âï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷äéçïï÷âï÷̃ç÷Î̃ïµ̉âµÖëµ̉â«Đë¥ÎçœÆç˜ÁÖ¥Îç¥Îçµ̉â«Đë¥ÎçœÆ甽̃Œ½̃”½ç{µ̃s­Ös¥Ös­Ö{­̃{­̃Œ½̃Œ½ÖŒ½Ö”½ç”½çŒµÖŒµÖ{µ̃{­̃s­Ös­Ö{­Îs¥Î{µ̃{­Ös¥Öµ̉âµ̉âµ̉â«Đë¥Îç¥Îç¥ÎçœÆçœÆ眽̃œÆ甽çœÆçœÆ甽̃”½̃Œ½̃”½ç”½çŒ½̃”½ç”½çœÆçœÆ眽̃˜ÁÖœÆ̃¥Îç¥Îç«Đë«Đë¥Îç«Đëµ̉âµ̉âµ̉âµÖë«Đë¥ÎçœÆçœÆ猽֔½ç„µ̃ŒµÖ„½̃{µ̃{µ̃„µ̃{µ̃{µ̃„µ̃{µ̃{­̃{­̃{­̃{µ̃{­̃{µ̃s¥Ös¥Ö{­Ö{µ̃s¥Ö{­̃{­Ö{µ̃{­̃{µ̃{­̃{µ̃{­̃s¥Ö{µÖŒµÖ„µ̃{µÖ{µ̃ŒµÖŒ½̃{µ̃{µ̃„µ̃„µ̃„µ̃”½̃¥ÎçœÆçµ̉âµ̉â«Đëµ̉âµ̉âµ̉âÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃âÎ̃ï̉ặÎ̃ï̉ặÎÖïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÎ̃ẩặ̃âçâï÷̃ç÷ïï÷âï÷äéçïï÷ï÷÷ïï÷ïï÷âï÷âï÷̃âç̃ç÷̉ặ̃ç÷Î̃ïÁÛ́ÁÛ́ÁÛ́µÖëµ̉âœÆçœÆç˜ÁÖ˜ÁÖ”½çŒ½̃”½̃Œ½̃Œ½̃Œ½̃”½çŒ½̃Œ½̃„µ̃„µ̃{µ̃Œµ̃Œ½̃Œ½̃„µ̃{µ̃„µ̃„µ̃„µ̃„­Î„µ̃{­Ö{­̃„µ̃{­̃{­̃„µ̃Œ½Ö”½çŒ½ç”½ç˜ÁÖ„µ̃”½ç”½̃„µ̃Œµ̃”½çŒµ̃”½̃œÆ̃œÆç ̀â«Đëµ̉âµ̉âÁÛ́ÁÛ́Î̃ï̉ặÎ̃ïÎ̃ï̃ç÷̃ç÷̃ç÷̃ç÷̉ặ̉ặ̃ç÷̃âç̃ç÷ïï÷̃ç÷âï÷ïï÷ï÷÷ïï÷ó÷ûï÷÷ï÷÷ï÷÷ïï÷ï÷÷âï÷ïï÷âï÷Øëó̃ç÷ÁÛ́ÁÛ́µÖëµ̉â¥Îç¥Îç¥Îç¥Îçµ̉âµ̉â«Đë¥ÎçœÆ甽̃”½̃Œ½̃Œ½̃{­̃s­Ö{­Ös¥Ös­Ö{µ̃{­̃{µ̃Œ½̃”½̃”½çŒ½̃„­̃{­̃{­̃s¥Ö{­Îs­Ös­Ö{­Ö{­Î{¥Îµ̉âµ̉âµ̉â«Đë¥Îç«Đë¥ÎçœÆ眽̃œÆ̃”½̃˜ÁÖ˜ÁÖœÆç˜ÁÖŒµÖŒ½̃”½̃œÆ甽̃œ½̃”½̃”½̃œÆ甽̃œÆç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç«Đëµ̉âµ̉âµÖëµÖëµ̉â¥Î甽̃œÆ猽̃Œµ̃Œ½̃„µ̃„­̃{­̃„µ̃s­ç„µ̃„µ̃{­̃{­̃{­̃{­Ö{­̃s­Ö{µ̃{­̃{­̃{­̃{µ̃{µ̃{µ̃s¥Ös¥Ö{­Ö{µ̃{­Ö{µÖ„µ̃„µ̃„µ̃Œ½Ö{­̃„µ̃„­̃„½̃{µ̃„µ̃{µ̃„­̃{µ̃Œ½̃”½̃œÆç¥Îç«Đëµ̉âµÖëµÖëµ̉âµ̉âÁÛ́Î̃ïÎ̃ïÎ̃ï̉ặÎ̃ï̉ặ̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃âÎ̃ïÎÖïÁÛ́Î̃ïÎ̃ïÎ̃ï̃ç÷̃âçäéçâï÷ïï÷ï÷÷ïï÷ï÷÷ï÷ïï÷÷ï÷÷âï÷âï÷̃ç÷âï÷̉ặÎ̃ï̉ặÎ̃ïÁÛ́ÁÛ́µ̉â¥Îç¥Îç ̀┽̃”½çŒ½̃”½̃„µ̃„½̃„½̃„µ̃Œ½̃Œ­Ö{µ̃Œ½̃{­Ö{µ̃Œ½̃Œ½̃Œ­Ö{­Ö„µ̃„µ̃{­̃{­̃„µ̃{µ̃{µ̃{­̃Œµ̃„½̃„µ̃Œ½ç„µ̃”½ç”½̃”½ç”½ç”½çœ½̃”½̃Œµ̃Œ½Ö”½çŒµ̃œÆ̃œÆç¥Îç«Đëµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́̉ặÎ̃ïÎ̃ïâï÷̃ç÷̃ç÷Î̃ï̉ặ̉ặ̉ặ̃ç÷̃âç̃âçäéçïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷âï÷âï÷âï÷âï÷̃ç÷Î̃ïÁÛ́µ̉âµ̉â¥Æ̃¥Î甽̃œÆç¥ÎçµÖëÁÛ́¥ÎçœÆç¥Îç˜ÁÖ”½̃”½ç”½̃{µ̃s­Ö{­̃s­Ös­Ös¥Ö„µ̃„µ̃Œ½̃”½ç”½̃„µ̃„µ̃„µ̃Œµ̃{­̃s­Ös¥Ös­Ö{­Ö{­Ö{¥ÎµÖëÁÛ́µ̉âµÖë«Đë¥Îç¥Îç¥ÎçœÆçœÆ̃œÆ甽̃”½̃”½ç˜ÁÖ”½̃œÆ甽甽甽̃œÆçœÆ̃”½̃œÆ̃¥Îç¥Îç¥Îç¥Îç«Đëµ̉â¥ÎçœÆç˜ÁÖœÆç«Đëµ̉âµÖëÁÛ́µ̉â«ĐëœÆçœÆçœÆ̃”½̃”½çŒ½̃{­̃„­Îs¥Ö„µ̃{µ̃{­̃{µ̃{µ̃s­Ös­ç{µ̃s¥Ö{­̃s¥Ö{­̃s¥Ö„µ̃{µ̃{µ̃{­̃{µ̃{µ̃„­̃{­Ö„µ̃„µ̃„µ̃{µ̃„µ̃{µ̃{­̃s¥Ö„µ̃{µ̃„µ̃{µ̃„µ̃„µ̃„µ̃Œ½Ö”½̃œÆç¥Îçµ̉â¥Îçµ̉âµ̉â½Đá½ĐáÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặ̉ặÎÖïÎ̃ïÎ̃âÎ̃ïÎ̃ï̃âçÁÛ́Î̃ï̉ặÎ̃ï̃ç÷âï÷äéçïï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷âï÷âï÷äéç̉ặ̉ặÎ̃ïÎ̃ïµÖë½Đáµ̉â¥ÎçœÆ甽̃”½ç”½̃”½çŒ½̃Œ½̃”½ç„½̃„­̃Œµ̃„µ̃{­̃„µ̃„µ̃Œµ̃„µ̃„½̃Œ½̃„µ̃„µ̃„µ̃„­̃„½̃{µ̃{µ̃{µ̃{µ̃{µ̃„µ̃Œ½̃”½ç˜ÁÖŒ½Ö”½ç”½çœÆçœÆ̃”½ç”µâ”½̃”½çœÆ眽̃œÆç¥Îç«Đëµ̉âµ̉âÇÔâÁÛ́ÁÛ́Î̃ï̉ặ̉ặ̉ặ̃âç̉ặ̉ặ̉ặ̃ç÷̃ç÷âï÷̃ç÷̃ç÷̃ç÷äéçï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷äéçïï÷̃ç÷̃âç̃âç̉ặÁÛ́µÖëµ̉â¥Îç ̀â¥Îç«Đëµ̉â«Đë¥ÎçœÆ甽̃Œ½̃”½̃”½çœÆ̃„µ̃{µ̃s­Ö{­̃s­Ö„µ̃s­ç{µ̃„µ̃Œ½Ö”½ç„µ̃„µ̃„µ̃„µ̃{­̃s¥Ös­Ös­Ös­Ö{µ̃s¥Ös­ÖÇÔâÁÛ́µ̉âµÖëµ̉â«Đë¥Îç­Î̃«Đë ̀âœÆ甽̃œÆ甽甽̃”½çŒµ̃”½̃Œ½̃˜ÁÖœÆ眽̃œ½̃œÆçœÆç¥Îç¥Îç«Đë«Đë«Đë¥Îç¥Îç¥ÎçœÆçµ̉â½Đá½ĐáÁÛ́ÇÔâµ̉â¥Æ̃œ½̃”½ç¥Î甽̃Œµ̃Œµ̃Œ½̃„µ̃„µ̃{­̃{­̃„µ̃{µÖs­Ös¥Ö{µ̃s¥Ös¥Ö{­̃{­̃{­̃{µ̃{­̃{­̃{µ̃{­̃„­̃{­̃{µ̃{µ̃„µ̃Œµ̃„­̃„µ̃„µ̃{µÖs­Ö„µ̃{­Ö{µ̃„µ̃{µ̃{µ̃„µ̃„µ̃”½çœÆ̃¥ÎçœÆç«ĐëµÖëµÖëµÖë½ĐáÁÛ́Î̃ïÁÛ́Î̃ïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÇÔâÎ̃ïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ï̉ặâï÷̃ç÷âï÷ïï÷ï÷÷ó÷ûï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷âï÷âï÷̃âçÎ̃ẩặÎ̃ïÇÔâµ̉â¥ÎçœÆçœÆ甽̃”½̃Œ½̃Œ½ç„µ̃„½̃„½̃{­̃{µ̃{µ̃„µ̃„µ̃„µ̃„µ̃Œ½̃„µ̃„µ̃„µ̃„µ̃„µ̃„µ̃„µ̃„µ̃ŒµÖ{­̃{µ̃{µ̃„µ̃„µ̃”½ç”½çŒµ̃œÆ甽̃”½ç”½ç”½çœÆç˜ÁÖ”½̃”½̃˜ÁÖœÆçœÆç¥Îçµ̉â­Î̃ÁÛ́µÖëÁÛ́Î̃ïÁÛ́Î̃ïÎ̃ï̉ặ̉ặ̉ặ̉ặ̃ç÷̃ç÷̃âç̉ặâï÷äéçâï÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷âï÷äéçâï÷̃ç÷̃ç÷̉ặÎ̃ïµÖëµ̉â«Đë«Đë«Đë«Đëµ̉âµ̉â¥Îç¥Æ̃œÆ̃œÆ̃Œµ̃”½̃”½ç”½̃Œ½Ö{­̃{­Ös­Ö{­Ö{­̃„µ̃„­̃„µ̃”½̃Œ½̃Œ½̃„½̃„­̃„­̃{­̃„µ̃{­Ö{­̃{µ̃{­Ö{­̃s­ÖÁÛ́ÁÛ́µÖëµ̉âµÖëµ̉â«Đë¥Îç¥ÎçœÆ̃”½̃œÆ̃˜ÁÖ”½çœÆ甽甽̃Œµ̃”½ç˜ÁÖœ½̃œÆç¥ÎçœÆ̃¥ÎçœÆç­Î̃œÆç¥Îç¥Î眽̃œÆ甽̃”½ç«ĐëµÖëÁÛ́ÁÛ́µ̉â¥ÎçœÆçœÆ甽çœÆ甽̃”½çŒ½̃{µ̃{µ̃{µ̃{­̃s­ç„­̃s¥Ö{µ̃„­Î{µ̃s­Ös­Ö{­Ö„­Î„­̃{­̃{­̃{­̃{µ̃{­̃s­Ö{µ̃{­Ö„½̃{­̃Œ­Ö{µ̃„½̃{­Ö{­Ö{­Ö„µ̃{µ̃„­Î{­̃„­̃„µ̃„µ̃„µ̃Œ½̃œÆç˜ÁÖ¥Îç¥Îçµ̉âµÖëÁÛ́ÇÔâÎ̃âÎ̃ïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷âï÷âï÷äéçï÷÷ïï÷ó÷ûï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷äéç̃ç÷âï÷âï÷̉ặ̃âçÎÖïÎ̃ïÁÛ́«Đë ̀âœÆç˜ÁÖœ½̃Œ½̃„µ̃Œ½̃”½̃„µ̃„½̃Œ½ÖŒ½̃ŒµÖŒµ̃„½̃„µ̃Œµ̃{µ̃Œ½̃Œµ̃„½̃{­̃{µ̃„½̃{µ̃Œ½̃{µ̃„µ̃{­̃„µ̃„­̃„µ̃„µ̃Œ½̃”½̃Œ½̃œÆçœÆçœÆçœÆ̃œÆç˜ÁÖ”½ç”½çœÆ眽̃˜ÁÖ¥Æ̃¥Îç¥Îçµ̉â¥Îç«ĐëÁÛ́ÁÛ́̉ặ̃âç̃âçâï÷̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷̃âçäéçâï÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷âï÷̃âçâï÷âï÷âï÷̃âç̃ç÷ÎÖïÁÛ́µÖë¥Îç¥Îç¥Îç¥Îçµ̉â¥Îçµ̉â¥Îç¥ÎçœÆ甽̃Œ½̃Œ½̃Œ½̃Œ½̃{­̃{µ̃{µ̃{µ̃s¥Ö{µ̃„½Ö”½̃Œ½̃Œ½ç„µ̃„½̃{µ̃„µ̃{­̃{µ̃{­̃s¥Ös­Ös¥Ö{­̃{­̃s¥ÖÁÛ́½Đáµ̉âµ̉âµ̉â«Đë«Đë¥Îç¥ÎçœÆçœÆ眽̃˜ÁÖ˜ÁÖ–·Ö”½̃”½ç˜ÁÖ˜ÁÖœÆ眽̃œÆçœÆçœÆç˜ÁÖ¥ÎçœÆ眽̃˜ÁÖ¥Î眽̃œÆç˜ÁÖœÆ̃µ̉âµ̉âµÖëÁÛ́«Đëµ̉â¥Îç¥Îç¥ÎçœÆç¥Îç˜ÁÖŒ½̃ŒµÖ{µ̃{µ̃s¥Ö{­̃„µ̃{µ̃{­Ö{µ̃{µ̃„½Ö{­Ös­Ö{µÖs¥Ö{­Ös­Ö{­̃{µ̃{­Ö{µ̃„µ̃{­ÖŒ­Ö{­Ö{­̃Œ½ÖŒ½Ö{­̃„­Î„µ̃{­Ö{­Ö{­̃Œµ̃„µ̃{­̃„µ̃Œ½̃”½̃œÆç˜ÁÖ«Đë­Î̃µ̉âÁÛ́ÁÛ́ÁÛ́Î̃âÁÛ́ÇÔâÁÛ́Î̃ïÎ̃ïÁÛ́Î̃âÁÛ́µÖëÎÖïÇÔâÎ̃ïÁÛ́ÁÛ́Î̃ï̃ç÷̃ç÷âï÷âï÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ïï÷ï÷÷ïï÷ï÷÷™“”%)5²³¶̃âç̃ç÷Î̃ïÁÛ́µÖë«Đë¥ÎçœÆç¥ÎçœÆ甽̃Œ½ç„µ̃Œ½çŒ½̃”½ç”½̃Œ½̃Œµ̃”½çŒ½̃Œ½̃Œ­Ö{µ̃{µ̃Œ½Ö„­̃{µ̃„­̃{µ̃{µ̃Œ­ÖŒ­ÖŒµ̃{µ̃{µ̃{­̃{­̃{µ̃”½çŒ½̃”½çŒ½çœÆ̃œÆ̃œÆç¥Î猽֔½̃”½ç”½çœÆç¥ÎçœÆçœÆ̃¥Îç¥Îç¥Îçµ̉âµÖëÎ̃ïÎ̃ï̉ặÎÖï̉ặ̉ặ̃âç̉ặ̃ç÷äéçØëóâï÷âï÷âï÷ï÷ïïï÷ï÷÷ïï÷ïï÷âï÷ïï÷âï÷̃âç̉ặØëóÎ̃âÎ̃ïµ̉âµ̉â­Î̃¥ÎçœÆç«Đë¥Îç¥Îç¥ÎçœÆç˜ÁÖ”½ç”½çŒ½ç”½ç{­Ös­Ö{µ̃{µ̃{­Ö{­̃{­̃„µ̃ŒµÖŒ½̃„½̃Œ½ç„µ̃„µ̃Œ½̃„µ̃{µ̃{­̃{­Ö{µ̃s¥Ö{­̃{µ̃{­̃{µ̃ÁÛ́ÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â¥Îç­Î̃œÆ̃˜ÁÖ˜ÁÖ¢¿Ô˜ÁÖœÆ̃”½çœÆ̃œÆ̃”½̃œÆç¥ÎçœÆçœÆ甽̃œÆ甽ç¥ÎçœÆ甽çœÆ̃œÆ̃œÆç¥Îç¥Îçµ̉âµ̉âÁÛ́µ̉âÁÛ́µÖëµ̉âµ̉â¥ÎçœÆçœÆçœÆ̃”½ç„­̃Œ½ÖŒµÖ{­̃„½̃{µ̃„µ̃„µ̃s¥Ö{µ̃s¥ÎŒ­Ös­Ö{µ̃s¥Ö{µ̃{­̃{­Ö{µ̃{­̃{­Ö{­Ö{µÖ{­Ö{­̃{µ̃{­̃Œ­Ö„½̃„½̃{µ̃ŒµÖ{µ̃{µ̃{­̃Œ½Ö{µ̃„µ̃„µ̃Œ½ç”½ç˜ÁÖ”½̃¥Îç¥Îçµ̉âÇÔâÎ̃ïÎ̃ïÁÛ́µ̉âµ̉âÎ̃ïÎ̃ïÎ̃âÁÛ́µ̉âÁÛ́µ̉âÇÔâµ̉âÁÛ́Î̃ïÁÛ́ÁÛ́Î̃ï̃ç÷̃ç÷âï÷́éñï÷÷́éñïï÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ïï÷ïï÷ §¬k‡•Î̃ï̃âçµÖëµ̉âµ̉â¥Îç˜ÁÖ”½̃”½ç”½̃Œ½̃Œ½ÖŒ½̃{­̃Œ­Ö”½̃œ½̃”½̃Œ½ÖœÆ猵Ö{­̃{µ̃{­̃ŒµÖ„µ̃„½̃„µ̃{­̃{µ̃{­Ö„µ̃„µ̃„­̃{­̃Œ½̃{­̃”½̃Œ½̃”½ç”½ç˜ÁÖœÆ眽̃˜ÁÖœÆçœÆ甽甽ç˜ÁÖœÆ̃œÆç¥Îç¥Îç¥Îçµ̉âµ̉â½ĐáÇÔẫç÷̃ç÷̃ç÷̉ặ̃ç÷Úàá̉ặäéçâï÷äéçïï÷ïï÷âï÷âï÷ï÷÷äéçâï÷̃ç÷ÿÿÿâï÷âï÷̃ç÷̃âçÎ̃ïÎ̃ïµÖëµ̉â¥Îç¥ÎçœÆçœÆ̃”½çœÆ̃˜ÁÖ˜ÁÖ˜ÁÖ”½̃Œ½̃Œ½̃„½̃{µ̃{µ̃Œ­Ö{µ̃{­̃„µ̃{µ̃„½̃{µ̃Œ½ÖŒ½ÖŒ½̃„½̃„µ̃”½̃Œ½̃Œ½Ö”½ç{µ̃{­̃{­Ö„µ̃{­̃{µ̃s¥Ös­ÖÎ̃ïÁÛ́½ĐáÁÛ́µ̉â«Đëµ̉â¥Îç¥Îç¥ÎçœÆç˜ÁÖœÆ̃œÆ̃˜ÁÖ˜ÁÖ˜ÁÖ˜ÁÖœÆç ̀âœÆç¥ÎçœÆç¥Îç¥Îç¥ÎçœÆ眽̃˜ÁÖœÆç¥Îçµ̉âÁÛ́½Đáµ̉âÁÛ́Î̃ï½ĐáÁÛ́µ̉âµ̉â¥ÎçœÆ̃˜ÁÖ”½̃œÆ̃„½̃„½ÖŒµÖs­Ö{­̃s­Ö„­̃{µ̃{­̃{µ̃{­̃{­̃Œ½̃ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÖë„­̃ŒµÖŒ½̃{µ̃„µ̃{­̃„µ̃„µ̃s­ÖŒ½̃{µ̃„µ̃{­̃{µ̃Œ½̃ŒµÖ”½ç¥ÎçœÆçµ̉âÁÛ́½ĐáÎ̃ïÎ̃ïµ̉âÎÖïÁÛ́Î̃âÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́ÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́Î̃ï̉ặ̉ặ̃ç÷ïï÷âï÷äéçï÷÷ï÷÷äéçäéç̉ặäéçäéḉéñï÷÷ï÷÷ §¬ÇÔâÇÔâµÖëµ̉â«Đë¥ÎçœÆç˜ÁÖ”½çŒ½̃„µ̃Œ½ç{­̃{µ̃”½̃Œ½̃Œ½̃”½çœÆç˜ÁÖ”½̃{µ̃„½̃{µ̃„µ̃„½̃„µ̃{­̃„µ̃s­ÖŒµÖŒ­Ö„µ̃„µ̃ŒµÖ„µ̃{­̃”½çœÆ猽̃œÆçœÆ̃œÆç¥ÎçœÆ̃­Î̃”½ç”½çœÆç˜ÁÖ˜ÁÖœÆç¥Îç¥Îçµ̉âµ̉âµÖëÇÔâÎ̃ï̃ç÷Î̃ï̃ç÷Î̃ẫç÷̃ç÷̉ặ̃ç÷âï÷ïï÷âï÷ïï÷ïï÷ï÷÷ïï÷ïï÷ïï÷âï÷̃âçâï÷̃âç̃ç÷Î̃ïÁÛ́ÇÔâÁÛ́µ̉â­Î̃”½̃œÆ甽̃œÆ甽甽甽̃Œµ̃Œ½ç„½̃Œ½̃„µ̃ŒµÖ{­̃Œ½̃{µ̃ŒµÖ„µ̃Œ½̃„µ̃{µ̃ŒµÖŒµÖŒµÖŒµÖ”½̃Œ½çŒ½̃”½̃Œ½̃ŒµÖŒ½̃„µ̃„µ̃{µ̃„µ̃{­̃{µ̃Î̃ïÎ̃ïÁÛ́ÇÔâµ̉âµ̉âµ̉â¥ÎçœÆçœÆçœÆ̃œÆç˜ÁÖœÆçœÆ̃˜ÁÖœÆçœÆç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆç¥Îç«Đëµ̉âÁÛ́ÁÛ́ÇÔâÁÛ́ÁÛ́½ĐáÇÔâµ̉âµ̉â¥Îç˜ÁÖœÆ甽甽̃Œ½̃ŒµÖ„­̃{µ̃„µ̃{µ̃„µ̃„µ̃{­Ös¥Ö{­̃s¥Ö{µ̃œÆçœÆçœÆ甽甽甽çœÆ甽ç«Đëó÷ûÿÿÿµÖës­Ö{­̃„µ̃{µ̃{µ̃„µ̃{­̃{µ̃„­̃{µ̃{µ̃Œµ̃{­Ö„µ̃Œ½Ö”½̃œÆçœÆ̃¥Îçµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́µ̉âµÖëÁÛ́½Đá½Đá½ĐáÁÛ́µ̉âÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ẩặ̃ç÷âï÷ïï÷ïï÷ïï÷̃âçäéçäéçÚàáÚàáÚàá̃âçäéçïï÷ §¬Î̃ïÇÔâÁÛ́µÖë«ĐëœÆç¥ÎçœÆ甽̃Œ½̃Œµ̃„½̃Œ½̃Œ½ÖŒµÖ„µ̃„µ̃ŒµÖ”½ç”½̃Œ½̃Œ½ç{µ̃„µ̃„µ̃„½̃„­̃Œµ̃„½̃„½̃{­̃„µ̃{­̃„­̃{µ̃„½̃{µÖ„½̃”½çŒ½ç”½ç”½ç”½̃œÆ̃œÆç˜ÁÖœ½̃œÆçœÆ̃˜ÁÖœ½̃¥Îç¥Îç¥Îç­Î̃ÁÛ́µ̉âÁÛ́Î̃ïÎ̃ï̃âçâï÷âï÷̉ặ̉ặäéçâï÷äéçâï÷ïï÷ï÷÷ç÷ïïï÷ïï÷âï÷âï÷ïï÷âï÷âï÷äéç̉ặÎ̃ïÇÔâÁÛ́ÁÛ́«Đë«ĐëœÆ甽̃”½̃”½̃„µ̃”½çŒ½̃Œ½̃”½çŒ½̃„µ̃{µ̃{­Ö„½̃Œ½̃Œ½̃Œ½ç„­̃„½Ö„µ̃„µ̃Œ½̃{µ̃Œ½çŒµ̃”½ç˜ÁÖ”½̃Œµ̃Œ½Öœ½̃”½̃„½̃Œ½̃{­Ö{µ̃„µ̃s¥Ö̉ặÎ̃ïµÖëÇÔâÁÛ́ÁÛ́µ̉â«Đë¥ÎçœÆçœÆ̃œÆçœÆçœÆ̃œÆç˜ÁÖœÆ̃œ½̃¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç«Đë¥Îç¥Î眽̃ ̀âµ̉âµ̉âµÖëÇÔâµÖëÁÛ́ÁÛ́ÁÛ́½Đáµ̉â¥Îç˜ÁÖ”½̃”½̃œÆ甽̃Œ½̃„­̃„µ̃„µ̃s­Ö{µ̃s¥Ö{­̃s¥Ös¥Ö{µ̃{µ̃s¥Ö{­Ö{­̃{µ̃{­̃„µ̃{­̃µ̉ââï÷ÿÿÿÿÿÿÁÛ́”½̃„µ̃{µÖŒ½̃Œµ̃„µ̃Œ½̃{µ̃Œ½Ö„µ̃„½̃„­̃{­̃„µ̃Œµ̃„½̃”½çœÆç¥Æ̃¥Îç«ĐëµÖë½ĐáµÖëÁÛ́ÁÛ́µÖëÁÛ́ÁÛ́½ĐáÁÛ́µÖëµÖëµ̉âµ̉âÇÔâÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặâï÷âï÷âï÷ïï÷äéçïï÷̃âçÚàáÚàáÚàáÎĐÑÚàá̃âç̃âḉéñ §¬½ĐáÎ̃ïÁÛ́µÖë«Đë¥Îç¥ÎçœÆ甽甽̃”½ç”½̃„µ̃{­̃Œ½̃”½̃„½̃„µ̃„µ̃Œ½̃”½ç„µ̃Œµ̃Œµ̃Œµ̃„µ̃{­Ö„µ̃Œµ̃„½̃{­̃Œµ̃{­̃„½̃{µ̃„½̃„µ̃Œ½̃„µ̃Œ½̃”½̃”½çœÆçœÆç«Đë¥Æ̃œÆçœÆçœÆ眽̃œÆ̃¥ÎçœÆç¥Îç«Đëµ̉âÁÛ́ÁÛ́Î̃ï̉ặ̉ặØëóäéç̃ç÷̃ç÷äéçâï÷ï÷÷âï÷ïï÷âï÷ï÷÷äéçâï÷âï÷âï÷âï÷âï÷âï÷Î̃ïÎ̃ïµÖëÁÛ́µÖëµÖë¥Îç«Đ딽̃”½̃Œ½̃„½̃„µ̃Œ½̃Œ½ÖœÆ甽猽̃„µ̃{­̃{µ̃{­̃{µ̃Œ½̃„½̃{­Ö„½̃{µ̃{µ̃Œµ̃Œ½̃Œ½̃”½̃”½̃”½̃”½̃”½̃”½̃œÆ̃˜ÁÖ”½çŒ½̃Œµ̃„µ̃„­̃{­̃̉ặÎ̃ïÎ̃ïÁÛ́µÖëµÖëµÖëµ̉â¥Îç¥ÎçœÆç¥ÎçœÆçœÆ̃œÆçœÆçœÆçœÆ̃œÆç¥Îç¥Îç«Đë¥Îç¥Îç¥Îç¥Îç«Đëµ̉â«Đë«Đë¥Îç«Đë«Đë«ĐëµÖëÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëµ̉â«ĐëœÆ̃œÆ甽̃Œ½̃Œ½̃„µ̃{­Ö„µ̃„­̃{­̃„­̃s¥Ö{¥Ö{µ̃s­Ö{µ̃{µ̃{­̃{­̃s¥Ö”½çÁÛ́÷ÿÿÿÿÿâï÷µ̉ℽ̃{­̃{µÖ{­̃„½̃{­Ö„µ̃„µ̃„µ̃„µ̃„µ̃{µÖŒ½̃Œµ̃„­̃{­ÖŒ½çŒµ̃”½ç«Đë¥Îç¥Îç¥Îçµ̉â½ĐáµÖëÁÛ́ÇÔâ½ĐáµÖëÁÛ́½Đáµ̉â½Đáµ̉âÁÛ́µÖëÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̃ç÷âï÷âï÷ï÷÷́éñïï÷äéçäéçÚàáÈÉÉÈÉÉÈÉÉÔÛ̃ÔÛ̃ÚàáÚàá §¬ÁÊÔÎ̃ïÁÛ́µ̉â«Đë«Đë¥ÎçœÆ̃œÆ̃˜ÁÖ”½̃”½çŒ½̃”½ç„½̃„µ̃„½̃Œ½̃Œ½̃Œ½̃{­̃Œ½̃{­̃„µ̃„µ̃„µ̃„µ̃Œµ̃Œ½̃Œ½Ö„µ̃„µ̃{­̃{­̃{­̃„­Î{­ÖŒ½̃Œ½̃Œ½̃Œ½̃”½̃”½̃œÆç¥Îç¥Îç­ÅÓ¥Îç¥Î眽̃¥Îç¥Îç¥Îç«Đë½Đá½ĐáÁÛ́Î̃ï̉ặ̃âç̃âçâï÷̉ặäéçâï÷âï÷âï÷âï÷âï÷̃ç÷ïï÷ïï÷âï÷âï÷âï÷âï÷̃ç÷âï÷Î̃ï̉ặÁÛ́ÁÛ́µÖëµÖëµ̉âµ̉â¥ÎçœÆ̃Œ½̃Œ½̃Œµ̃„µ̃”½̃”½ç”½ç„µ̃„µ̃{­̃{­̃„µ̃Œ½̃”µâ„½̃Œµ̃„µ̃{­̃{µ̃„­̃Œ½Ö„µ̃„µ̃”½ç˜ÁÖœÆçœÆ猽֔½çœÆ̃œÆçœÆ甽̃Œ½ç„µ̃{µ̃„µ̃̉ặ̉ặÎ̃ïÁÛ́ÇÔâµ̉âµ̉âµ̉â«Đë¥Îç¥ÎçœÆç¥ÎçœÆ̃œÆç¥ÎçœÆ̃œÆçœÆç¥Îç¥Îç«Đë¥Îç¥Îç¥Îç«ĐëµÖëµ̉â¥Îç¥Îç«Đë¥Îç«Đëµ̉âµÖëÁÛ́Î̃ïÁÛ́µÖëµÖëµ̉â«ĐëœÆç˜ÁÖœÆ猽̃„µ̃„µ̃{­̃„­Îs¥Ö{µ̃{µ̃{­̃s¥Ö{µ̃{­Ö{µ̃{­̃{µÖ ̀ââï÷ÿÿÿ÷ÿÿ̉ặ”½ç{­Ö{­̃{µÖ{­Ö{µ̃„µ̃„½̃{µ̃„µ̃„½̃„µ̃„µ̃„µ̃„­̃{­̃„µ̃{µ̃{­ÖŒ½̃ŒµÖ”½çœÆç¥Î眽̃«ĐëÁÛ́½ĐáÁÛ́½Đáµ̉âÁÛ́ÁÛ́µÖëµ̉â«ĐëµÖëµ̉âµ̉âÁÛ́ÁÛ́½ĐáÇÔâÎ̃ïÎ̃ï̃ç÷̃ç÷äéçïï÷ïï÷ïï÷äéç̃âçÚàáÈÉÉÁÊÔÈÉÉÈÉÉÈÉÉÚàáÎ̃ẫâç §¬JSUÁÊÔÎ̃ïµ̉âµ̉â«Đë«Đë«Đë¥Îç¥Æ̃¥ÎçkœËs¥Î”½̃„½̃Œ½̃Œ½̃Œ½ç„µ̃„½̃Œ½̃Œµ̃Œµ̃{µ̃„µ̃„µ̃{µ̃„µ̃{­̃„µ̃{­̃{­̃{µ̃„µ̃{µ̃„µ̃{µ̃„­Î{µ̃„µ̃Œ½̃Œ½̃”½ç”½̃”½çœÆç¥Îç¥Îç¥Îç¥Î眽̃«Đë­Î̃«Đëµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̃ç÷Î̃ïäéçäéç̉ặâï÷âï÷̃ç÷âï÷̃ç÷ïï÷ïï÷ïï÷âï÷âï÷âï÷̉ặ̃ç÷̃ç÷Î̃ïÎ̃ïÁÛ́Î̃ïÎ̃ïµ̉âµ̉â­Î̃¥ÎçœÆ猵̃”½̃”½ç”½ç„µ̃”½ç„½̃{­̃{µ̃{­̃{µ̃{­̃Œ½̃„½̃{µ̃„µ̃„µ̃„µ̃„µ̃„µ̃„½̃Œ½̃”½çœÆçœÆçœÆ̃”½çŒ½̃œÆ甽ç˜ÁÖœÆ̃”½̃Œ½̃Œ½̃{µ̃{­̃̃ç÷Î̃ïÎÖïÎ̃âÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â«ĐëœÆç¥ÎçœÆçœÆç¥Îç¥Îç¥Æ̃œÆçœÆçœÆç¥ÎçœÆç«Đë¥Îç¥Îçµ̉âµ̉â¥Îç¥Îç¥Îç¥Îç¥Îç¥Îçµ̉âÇÔâÎ̃ïÁÛ́µÖë«Đëµ̉âµ̉â¥ÎçœÆ甽甽̃Œ½ç„½̃s¥Ö{µ̃{­̃„µ̃{µ̃„µ̃{µ̃{µ̃{µ̃{­Ö{­̃Œ½çÿÿÿÿÿÿïï÷µÖës­ç{­̃{­̃{µÖ{µ̃{­̃„­̃s¥Ö„µ̃{µ̃ŒµÖ„µ̃{­̃„µ̃„µ̃„µ̃Œ½̃„­̃Œ½ç{­̃{­̃„µ̃Œ½̃”½ç”½çœÆç«Đë¥Îçµ̉âµ̉âÁÛ́µÖë«Đëµ̉âµ̉âµ̉âµ̉âµ̉â«Đëµ̉âµÖëµ̉âµ̉âÁÛ́ÁÛ́Î̃ẩặâï÷âï÷âï÷ï÷÷ïï÷äéç̃âç̃âçÎĐÑÎĐÑÈÉÉÈÉÉÈÉÉÈÉÉÔÛ̃̃âçÎ̃ï̃ç÷ïï÷Î̃âajn½ĐáÎÖïµ̉â½Đáµ̉â¥Îç¥Îç«Đë¥Îç«ĐëZ†±%lµ/o§\•¿„µ̃”½ç„µ̃Œ½̃„µ̃Œµ̃Œ½̃{µ̃ŒµÖ„µ̃„­̃{µÖ{µ̃„µ̃„½̃Œ½ç„µ̃„µ̃„µ̃„µ̃{­̃{­̃{­̃{­̃{µ̃Œµ̃Œ½̃Œ½̃”½ç”½çœÆ̃œÆç¥Îç«Đë¥Îç«Đëµ̉âµ̉âµÖëÇÔâÁÛ́ÁÛ́Î̃ïÎ̃ï̃âç̃âç̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷âï÷âï÷âï÷âï÷ï÷÷ï÷÷ïï÷âï÷äéçäéç̃âç̉ặ̃ç÷Î̃ïÎ̃ïÁÛ́ÁÛ́ÇÔâÁÛ́µ̉â«Đë¥Î甽猽̃Œ½̃”½̃”½çŒ½̃„½̃{­̃{µ̃„µ̃{­Ö{­̃Œµ̃„­̃Œ½ç{­̃„µ̃{µ̃„µ̃„µ̃Œµ̃Œ½ÖŒ½̃Œ½̃œÆ̃œÆ甽̃˜ÁÖ”½̃˜ÁÖ¥Îç¥ÎçœÆ̃”½̃Œ½̃„­̃„µ̃Œ½̃̃ç÷̉ặÎ̃ïÎ̃ïÎ̃ï½ĐáÁÛ́µ̉âµ̉â¥Îç¥ÎçœÆçœÆçœÆçœÆ̃œÆ̃˜ÁÖœÆçœÆçœÆç­Î̃¥Îç«Đë¥Îç¥Îç¥Îç«Đë¥Îç¥Îç¥Îç˜ÁÖ˜ÁÖ¥Îçµ̉â½ĐáÁÛ́ÁÛ́ÇÔâµ̉âµ̉âµ̉âµ̉âœÆ甽甽̃Œ½Ö{µ̃{­Ö{µ̃{µ̃s¥Ö„­̃{µ̃{µ̃{­Ö{­Ös¥Ö{µ̃Œ½̃ó÷ûÿÿÿ̃ç÷Œµ̃{­̃s¥Ö{µ̃{­Ö{­̃{µÖ{µ̃{­ÖŒ­Ö{µ̃{­Ö„½̃{µ̃{µ̃ŒµÖ{µ̃Œ½ç{­̃{­̃ŒµÖŒ½̃„½̃Œ½̃Œ½̃œÆ甽̃¥Îç¥Îç«Đëµ̉âµ̉âµ̉âµ̉âµ̉â«Đë«Đë«Đë«Đëµ̉â½Đáµ̉â­Î̃ÇÔâµÖëÁÛ́Î̃ï̉ặ̃ç÷̃âçäéçâï÷âï÷̃âçäéçÎ̃ïÔÛ̃ÎĐÑÈÉÉÈÉÉÈÉÉÎĐÑÔÛ̃Úàá̃âç̃ç÷ØëóÎ̃ïÎ̃ïÎ̃ïÇÔâ­Î̃­ÅÓ­ÅÓµ̉â­Î̃­ÅÓ«Đëµ̉âM€²/o§/o§f¦Z†±˜ÁÖŒ½̃”½̃Œ½̃Œµ̃{­ÖŒ­Ö{­̃Œµ̃{­̃Œµ̃ŒµÖ„­̃Œ­Ö{µ̃Œ½Ö{µ̃„­̃„µ̃{­̃„­̃{­Ö{µ̃Œµ̃„µ̃Œ½ÖŒ½Ö”½ç”½̃œÆç¥Îç¥Îç¥Îç«Đë«Đëµ̉âµ̉âµÖëÎ̃ïÎ̃âÎ̃ï̉ặ̉ặ̉ặ̃ç÷̃ç÷̃ç÷âï÷ï÷÷ï÷÷âï÷âï÷âï÷ï÷÷ï÷÷âï÷ïï÷âï÷ï÷÷äéç̃ç÷̃âç̉ặÎ̃ïÎ̃ïÇÔâ½ĐáµÖëµ̉âµ̉âœÆ̃œÆ甽甽̃Œ½Ö˜ÁÖ”½̃{­̃{¥ÎŒµÖ„­̃„µ̃{µ̃Œµ̃„½̃Œ½̃Œ½̃s­Ö{­̃„µ̃{­Ö„­̃{µ̃Œ½̃{µ̃”½̃˜ÁÖ˜ÁÖ˜ÁÖœÆ̃œÆ̃œÆç­Î̃œÆç˜ÁÖ˜ÁÖŒ½̃„½̃„½̃{­̃âï÷̉ặÎ̃ï̉ặÎ̃ïµÖëÁÛ́µ̉â­Î̃¥Îçµ̉â¥Îç¥ÎçœÆçœÆçœÆ̃¥Îç¥Îç¥Îç¥Îç ̀â¥Îç«Đë¥Îç¥Îç¥Îç¥Îç«Đë¥Î眽̃”µâ¥Îç¥Îçµ̉âÁÛ́Î̃âÁÛ́µ̉âµ̉âÁÛ́­Î̃œÆçœÆ甽̃”½̃Œ½Ö{µ̃{µ̃s­ÖŒ½̃{­Ö{µ̃{­̃s­Ö{­̃s­Ö{­Îs¥Ö{­Ö{µ̃Œ½̃ïï÷ÿÿÿÿÿÿµ̉âs­Ö{­̃„µ̃{µ̃„µ̃{­̃{µ̃{­̃{­̃{­̃ŒµÖ„µ̃„­Î{µ̃ŒµÖŒµÖŒµÖŒ½̃Œ½̃”½̃„½̃”½ç˜ÁÖ”½ç¥Îç«Đë¥Îç«Đë«Đë¥Îç¥ÎçœÆçœÆ̃œÆç¥Îç«Đëµ̉âÁÛ́µ̉âÁÛ́µ̉âÎ̃âÁÛ́ÎÖïÎ̃ï̃ç÷Î̃ẫç÷âï÷âï÷̃ç÷̃â矲·Î̃âÔÛ̃½ĐáÈÉÉÎĐÑÎĐÑÔÛ̃̃âçÔÛ̃̃âç̃ç÷Î̃ïÎ̃ïÇÔâµ̉â¥ÆÖ¥ÆÖ¥ÆÖ½Đá¥ÆÖ¶Ä̉½Đá½ĐáZ†±%lµ%lµf¦Z†±Œµ̃”½̃„½̃”½̃{µ̃”½ç{µ̃{µ̃Œ½Ö{­̃„µ̃Œ½̃„½̃{µ̃Œ­Ö{­̃{­̃„µ̃Œ½̃{µ̃Œ½̃{µ̃s­ÖŒ½̃”½çŒ½̃œÆçœÆ̃”µâœÆç¥Îç˜ÁÖµ̉â«ĐëµÖëµ̉âÁÛ́µÖëÎÖïÎÖïÎ̃ï̃ç÷̃âçØëóïï÷âï÷Úàá̃ç÷Øëóï÷÷̃ç÷ïï÷̃ç÷âï÷̃ç÷âï÷âï÷ïï÷âï÷âï÷̃ç÷̃ç÷̃ç÷̃ç÷Î̃ïÁÛ́ÁÛ́ÁÛ́µ̉â¥Îç­Î̃˜ÁÖœÆ̃œÆç˜ÁÖ¥Î甽̃{­̃s¥Ö{µ̃„µ̃{­Ö”½̃„½̃„µ̃ŒµÖŒ½̃{­̃{µ̃„µ̃Œµ̃„½̃Œ½çŒ½̃”½ç{­̃œÆçœÆçœÆç¥Îç¥Îç¥ÎçœÆçœÆ甽猽̃„½̃„µ̃Œ½̃{­̃âï÷̉ặ̉ặÎ̃ïÁÛ́ÁÛ́ÇÔâµ̉â½Đá¥Îç¥Îç¥Îç¥ÎçœÆç¥ÎçœÆçœÆ甽̃œÆçœÆç ̀â¥Îç¥ÎçœÆç¥Îç¥ÎçœÆç¥ÎçœÆçœÆçœÆçœÆç¥Îçµ̉âÁÛ́ÇÔâÁÛ́ÁÛ́µÖëµ̉âœÆçœÆ̃˜ÁÖŒ½ÖŒ½ÖŒµ̃ŒµÖ{µ̃{­̃{µ̃s¥Ös¥Ö{­Ö{µ̃s¥Ös­Ös¥Ös­Ös¥Ö{µ̃{µ̃{µ̃Œ½̃µÖëÿÿÿÿÿÿâï÷Œ½çs¥Ös­Ö{µ̃{µ̃{µ̃{µ̃{­̃„µ̃{­̃ŒµÖ„µ̃Œ­ÖŒ½̃Œ½̃Œ½çŒ½̃„µ̃Œ½̃–·ÖŒ½̃˜ÁÖ˜ÁÖœÆç¥Îç¥Îç¥Îç¥ÎçœÆçœÆçœÆç¥Îç¥Îç«Đëµ̉âµ̉âµ̉âÁÛ́½ĐáÁÛ́Î̃ïÎ̃âÁÛ́Î̃ẩặ̉ặâï÷âï÷̃âçäéçajn%)5 §¬ÎÖïÔÛ̃Î̃âÎ̃âÎ̃ï̃âç̃ç÷Î̃ïÎÖïÎ̃ï«Đë­ÅÓ­ÅÓ¢¿Ô¥¹Ê¥ÆÖ¶Ä̉­ÅÓ½Đáµ̉âh™»%lµf¦%lµB{µŒµ̃Œµ̃„½̃„µ̃Œµ̃Œ½̃Œ­Ö„½̃„µ̃„µ̃„µ̃{µ̃Œ½̃Œ½̃{µ̃{µ̃Œ½ç„µ̃{µ̃„µ̃Œ½̃{­̃{µ̃Œ½ç”½ç”½ç”½̃”½̃œÆç˜ÁÖœÆç¥Îçµ̉âµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́ÎÖï̃ç÷âï÷̃ç÷âï÷ïï÷âï÷̃ç÷̃ç÷ïï÷âï÷ó÷ûâï÷ïï÷ïï÷ïï÷ïï÷âï÷ï÷÷äéçäéç̃ç÷âï÷âï÷Î̃âÎ̃ïÎ̃âÁÛ́µ̉â«Đëµ̉âœÆ̃œÆ̃œÆçœÆç¥ÎçœÆ甽甽猵Ö{µ̃{µ̃{­̃„½̃„½̃„½̃Œ½̃{µ̃Œ­Ö{­̃Œµ̃{­̃Œ½̃„½̃„µ̃Œ½ç”½ç–·Ö˜ÁÖœÆ̃¥Îç¥Îç«Đë¥ÎçœÆ甽̃”½çŒ½̃Œ½ÖŒµ̃ŒµÖ{­̃âï÷̃âç̃ç÷Î̃ïÎ̃ïÁÛ́ÇÔâµ̉âµ̉â«Đë«Đë¥Îç¥Îç¥Îç¥Îç¥Îç˜ÁÖ¥Î甽çœÆç¥ÎçœÆç¥Îç«Đë¥Îç¥Æ̃¥Îç¥ÎçœÆç¥Î眽̃œÆç¥ÎçµÖëÁÛ́ÎÖïÁÛ́ÁÛ́µ̉âœÆ̃œ½̃”½̃”½çŒµÖŒ½̃{µ̃„½̃{µ̃„µ̃{µ̃{µ̃{­̃s¥Ö{­̃{­̃{­̃s¥Ös¥Ös­Ö{µ̃s¥Ös­Ö{­Ö{­Ös­ç¥Æ̃âï÷ÿÿÿïï÷µÖë{µ̃„µ̃„­Îs­Ö„µ̃„µ̃„µ̃„µ̃„½̃„½̃„½̃{µ̃Œ½Ö„½̃„½̃Œ½Ö”½̃”½çœÆçœÆçœÆçœÆçœÆç¥ÎçœÆ̃œÆ甽ç¥Æ̃œÆç¥Îç«Đëµ̉â½Đáµ̉âÇÔâµ̉âµÖëÇÔâÇÔâ½ĐáÔÛ̃Î̃ẫâçÎ̃ẫâç̃âç̃âçajn!y‡’Î̃âÎ̃ïÎ̃ẩặÎ̃âÁÛ́Î̃â½Đá­Î̃œÆ̃­ÅÓ˜ÁÖ¥¹Ê¶Ä̉¢¿Ô­ÅÓ­ÅÓµ̉⌵Ö/o§f¦%lµB{µŒ½̃ŒµÖŒ½̃Œ½ç„­̃Œ½ç„½̃„µ̃{µ̃„µ̃„½̃„µ̃„µ̃„½̃{­̃{­̃{µ̃„µ̃„µ̃„µ̃Œ½̃„½̃Œµ̃„µ̃œÆç˜ÁÖœÆ̃œÆ̃”½ç¥Îç­Î̃¥Îç¥Îçµ̉âµ̉âÁÛ́Î̃ï̃ç÷̃âç̃ç÷äéçâï÷âï÷ïï÷äéçâï÷âï÷̃ç÷ï÷÷âï÷ïï÷ï÷÷ïï÷âï÷ï÷÷âï÷âï÷âï÷äéç̃ç÷̃ç÷̉ặÎ̃ï̉ặÎ̃ïµÖëµÖëµ̉â«ĐëœÆçœÆçœÆç¥ÎçœÆ̃œÆ̃”½̃”½ç{µ̃{­̃„½̃Œµ̃„µ̃„µ̃Œµ̃„µ̃Œµ̃{µ̃{­̃Œ½çŒ½̃Œ½̃Œ½̃Œ½̃Œ½̃˜ÁÖœÆ甽çœÆç¥Îç«ĐëœÆçœÆ甽̃Œ½̃Œ½̃Œµ̃”½ç”½ç”½̃Œ½Öâï÷âï÷̉ặÎ̃ïÎ̃âÎ̃ïµÖëµ̉â«Đë¥Îç«Đë¥Îç«Đë¥Îç¥Îç¥ÎçœÆçœÆçœÆ̃œÆ̃œÆç ̀âœÆçœÆç¥Îç¥Îç ̀â¥Îç¥Îç¥Îç¥Îç¥Îç«Đë«ĐëÁÛ́Î̃ïÁÛ́µÖëµ̉â¥ÎçœÆçœÆ̃„µ̃Œµ̃„½̃„µ̃{µ̃{­Ö{­̃{µ̃{­̃{µ̃{µ̃s¥Ös¥Ös¥Ös¥Ös¥Ö{­ÖµÖëµÖëµÖëµÖëµÖëµÖëµÖëµÖë̉ặ÷ÿÿÿÿÿµ̉â{µ̃„­̃„µ̃{µ̃„µ̃„½̃Œµ̃{µ̃„­̃Œ½ç„­̃„½̃Œ½Ö„µ̃Œµ̃Œ½̃”½ç”½̃”½̃œÆ̃œÆ̃”½̃œÆ̃œÆ甽̃ ̀â¥ÎçœÆç¥Îçµ̉âµÖëµÖëµ̉âµÖë½ĐáÁÛ́½Đá½Đá½ĐáÇÔâ½ĐáÇÔâÇÔâÎ̃âÎ̃ï̃âçajnajn̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́½Đá«Đë˜ÁÖ˜ÁÖ¢¿Ô²³¶¥¹Ê¶Ä̉­ÅÓ­Î̃µ̉âµ̉âœÆçs¥ÎJ{­J{­„½̃„µ̃{­Ö„µ̃„µ̃„µ̃{­Ö„µ̃„­̃„µ̃\•¿kœË„½̃{µ̃ŒµÖ{­̃„µ̃„µ̃„µ̃Œ½̃Œ½̃œ½̃˜ÁÖœÆ̃œÆçœÆçœÆçœÆçœÆ̃œÆç¥Îçµ̉â«Đë«ĐëÁÛ́Î̃ï̉ặ̃âç̃ç÷̃ç÷âï÷ïï÷ïï÷äéçâï÷ïï÷âï÷âï÷âï÷ïï÷äéçâï÷ïï÷âï÷ïï÷ïï÷ï÷÷̃ç÷âï÷̃ç÷̃ç÷Î̃ï̃ç÷ÁÛ́ÁÛ́½ĐáµÖëµ̉â«Đë¥Îç¥Îç¥ÎçœÆçœÆç¥Æ̃œÆ̃”½̃Œ½̃”½çŒ½ÖŒ½̃„½̃{­Ö„µ̃Œµ̃{µ̃{µÖŒµÖŒ½̃{µ̃„µ̃„½̃Œµ̃Œ½̃œÆ̃œ½̃œÆç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆ̃”½çŒ½ç”½çœÆçœÆ甽̃ŒµÖâï÷̃ç÷̃âç̉ặÎ̃ïÁÛ́ÁÛ́ÁÛ́«Đë¥Îç¥Îç«Đë¥ÎçœÆç¥ÎçœÆç¥ÎçœÆ̃œÆç˜ÁÖ˜ÁÖœÆ̃œÆ̃¥Îç¥Æ̃¥Îç¥Îç¥Îç¥Îç¥Îç«Đë¥Îç¥Îçµ̉âÁÛ́Î̃ïÁÛ́½ĐáÁÛ́¥ÎçœÆ猽̃„µ̃„µ̃„µ̃{µ̃„µ̃„µ̃„­Î{­̃s­Ö{­̃s¥Ö{µ̃{µ̃s¥Ö{µ̃{µ̃{­Îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«Đ댵Ös­ÖŒµ̃{µ̃„µ̃„µ̃Œµ̃Œ½̃„½̃{µ̃Œµ̃Œ½çŒµ̃{µ̃Œ½ÖŒ½̃”½̃”½̃˜ÁÖ”½̃”½̃”½ç”½ç”½̃Œ½Ö”½ç”½çœÆç¥Îç¥ÎçµÖëµÖëµ̉â½ĐáÁÛ́µÖë½Đá½ĐáÁÊÔÁÊÔÁÊÔÁÊÔÈÉÉÁÊÔÇÔâÇÔâajnfv|̉ặÎ̃ïÁÛ́ÇÔâÁÛ́ÇÔâ½Đáµ̉✽̃œÆ̃¥ÆÖ¥¹Ê¥¹Ê¶Ä̉¥¹Ê­ÅÓ­Î̃½Đá«Đë¥Î甽çœÆ猵̃”½̃Œµ̃„µ̃{­Ö{µÖ{µ̃Œ½ÖŒµ̃„µ̃„µ̃J{­%lµ1sµ\•¿s¥Ös¥Ö„µ̃Œµ̃”½çœÆç ̀â¥Îç«Đë¥Îç ̀â¥Îç¥Îç¥Îç¥Îç¥Îç«Đë«Đë«Đë½ĐáÁÛ́Î̃ï̉ặâï÷âï÷ïï÷âï÷ï÷÷ïï÷ïï÷âï÷ï÷÷ïï÷ïï÷ï÷÷âï÷âï÷ïï÷ç÷ïï÷÷ïï÷ï÷÷âï÷âï÷äéçâï÷̃ç÷̃âçÎ̃ïÎ̃ïÁÛ́ÇÔâ½Đá«Đëµ̉â«Đë ̀âœÆçœÆçœÆ̃¥Îç˜ÁÖ”½çŒ½̃„½̃„½̃„µ̃Œ½Ö{µ̃Œµ̃„½̃„­̃„­̃Œ½̃Œ½̃„µ̃„µ̃Œ½̃„µ̃”½̃œÆ̃¥Îç¥Îç«Đë¥Îç¥Îç¥ÎçœÆ̃œÆ̃”½̃”½̃”½çœÆ甽̃”½̃Œ½Öäéç̃âç̉ặÎ̃ïÁÛ́Î̃ï½ĐáÇÔâµ̉â«Đë¥Îç¥Îç¥ÎçœÆç¥Îç¥Îç¥ÎçœÆ̃œÆç¥ÎçœÆ眽̃œÆç¥ÎçœÆç¥Îç¥Îç«Đëµ̉âµ̉âµ̉âµ̉â½ĐáÇÔâÁÛ́Î̃ïÁÛ́ÁÛ́µÖëµ̉âœÆ̃”½̃Œ½̃„µ̃Œµ̃{µÖ{­Ö„­̃{µ̃„µ̃{µ̃s¥Ö{­̃s­Ös­ÖsœÎX}’*?PŒ½̃Œ½̃Œ½̃Œ½çŒµ̃Œ½̃Œ½ç”½̃Œ½ç”½çŒ½çŒ½̃„µ̃{­ÖŒµÖ{µ̃„µ̃„µ̃„µ̃„µ̃Œ½çŒ½̃ŒµÖŒ½̃„µ̃Œ½̃„µ̃„µ̃”½ç”½çŒ½̃”½çŒ½ç”½ç”½̃”½̃”½̃Œ½̃”½̃œÆ̃œÆç¥Îç«ĐëµÖëÇÔâµÖëµ̉âµ̉âµ̉âÁÊÔÁÊÔ²³¶¥¹Ê²³¶¥¹ÊÈÉÉÁÊÔÎÖïajnajn̉ặÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́«Đë¥Îç¥ÆÖœ½̃˜ÁÖ¢¿Ô­ÅÓ¶Ä̉­ÅÓ­Î̃­Î̃œÆçœÆç˜ÁÖ”½çŒ½̃Œ½̃{­Ö{­Ö{­Î{¥Î{µÖ{­Î„­̃{­Ö{µ̃B{µ%lµ/o§1sµgŒÁ„½̃„­̃Œµ̃œÆç¥Îçµ̉â«Đëµ̉â«Đë«Đë«Đë¥Îç¥Îç¥Îç¥Îç«Đë½Đáµ̉âÁÛ́Î̃ïÎ̃ï̃ç÷âï÷̃âçâï÷äéçï÷÷ïï÷ïï÷âï÷âï÷ïï÷äéçâï÷âï÷âï÷ïï÷ï÷÷ïï÷ïï÷âï÷âï÷äéç̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷Î̃ïÎ̃ï½Đáµ̉â½Đá«Đëµ̉â«Đë¥Æ̃œÆçœÆ眽̃œÆ猽̃”½ç”½ç„µ̃„½̃Œ½̃Œ½çŒ½çŒ½̃Œ½Ö„µ̃{­̃„½̃„µ̃Œ½̃Œ½̃”½̃˜ÁÖ ̀â¥Îç¥Îç«Đë¥Î眽̃œÆçœÆ̃œÆ̃”½̃”½̃œÆç¥Æ̃œÆ甽̃„½̃âï÷̃ç÷̉ặ̉ặÎ̃ïÎ̃ïµÖëµ̉âµ̉âµ̉âµ̉â¥Îç«Đë¥Îç¥Îç¥Îç¥ÎçœÆç˜ÁÖ ̀â¥ÎçœÆçœÆç¥ÎçœÆç¥Îçµ̉âµ̉âµ̉âµÖë«Đë­Î̃µÖëÁÛ́ÁÛ́ÁÛ́Î̃ïµÖëÁÛ́«Đë«ĐëœÆ焵̃Œ½̃„µ̃{µ̃{µ̃{µ̃{­̃s­Ös¥Ös­ÖgŒÁNsƒ!!1s¥Ö{­̃s­Ös¥Ös¥Ö{­Ö{µ̃s¥Ö{­Ö{µ̃{­Ö{µ̃{­̃Œ­Ö„µ̃„µ̃„­̃„½̃„­̃„µ̃Œ½̃”½çŒµ̃Œ½çŒ½̃„µ̃„µ̃Œ½çŒµ̃Œ½Ö„½̃Œ½̃Œ½̃Œµ̃Œ½çŒµ̃Œ½̃Œ½ÖœÆç˜ÁÖœÆç«Đë«Đëµ̉â½Đá½Đá½Đá½Đáµ̉â¶Ä̉¶Ä̉¥¹Ê¥¹ÊŸ²·¥¹Ê¥¹ÊÁÊÔÇÔâajnajn̉ặÎ̃ïµÖëÁÛ́µ̉âµ̉âµ̉â ̀â ̀✽̃˜ÁÖ˜ÁÖ¥¹Ê¥ÆÖ¥ÆÖœ½̃œ½̃œÆç¥Îç˜ÁÖ”½̃œÆ甽̃Œ½ÖŒ­Æ{­Î{¥Î{¥Î{œ½„­Îs¥Î{­Î{­̃J{­%lµ%lµ%lµgŒÁŒ½çŒ½ç”½̃¥Îçµ̉âµ̉âµ̉âµ̉âµ̉â«Đë¥Îç¥Îç¥Îç¥Îçµ̉âµ̉âµÖëÇÔâÁÛ́̉ặ̉ặäéçâï÷âï÷ï÷÷ï÷÷äéçï÷÷ï÷÷âï÷âï÷âï÷âï÷âï÷äéçâï÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷âï÷ï÷÷̃ç÷̃ç÷̃ç÷̉ặÎ̃âÎ̃ïÎ̃ïÇÔâÁÛ́µ̉â­ÅÓ¥Îç¥Îç«ĐëœÆçœÆçœÆ甽̃˜ÁÖŒ½̃Œ½̃”½çŒ½ç„µ̃Œ­ÖŒ½ç”½̃Œ½̃Œ½ÖŒµ̃{µ̃ŒµÖ„½̃”½ç”½ç˜ÁÖœÆç¥Æ̃¥Îç¥Îç¥ÎçœÆçœÆç ̀âœÆç˜ÁÖœÆç¥Îç ̀â ̀ℵ̃Œ½̃ï÷÷̃ç÷̉ặÎ̃ïÎ̃âÁÛ́ÁÛ́ÁÛ́­Î̃µ̉âµ̉â«Đë¥Îç«ĐëœÆç¥Îç¥ÎçœÆç¥Îç¥ÎçœÆ̃«Đë¥Îç¥Îç¥Îç¥Îçµ̉âµÖëµÖëµÖëÁÛ́ÇÔâ½Đáµ̉âÎ̃ï̃âçÎ̃ïÇÔâµ̉âµ̉â˜ÁÖŒ½ÖŒµÖ{µ̃„µ̃„µ̃s­Ö{­̃s¥ÎgŒÁ*?P̉ặÁÛ́ÁÛ́ÁÛ́̉ặ̉ặÁÛ́̉ặŒ½̃Œ½ç̉ặ”½̃s¥ÖŒµÖ{­ÖŒµÖ„½̃{µÖ„½̃„µ̃{µ̃{µ̃{µ̃Œ½̃„µ̃{µ̃„µ̃{µ̃Œ½̃{µ̃Œ½̃„µ̃Œ½Ö„µ̃Œ½̃„µ̃{µÖŒ½̃Œ½̃œÆ̃¥Æ̃¥Îç«ĐëÁÛ́ÁÛ́ÁÛ́ÇÔâµ̉â­ÅÓ­ÅÓ¢¿Ô¢¿ÔŸ²·Ÿ²·Ÿ²·²³¶ÁÊÔ½ĐáQduQduÎ̃ïÎÖïµÖë½Đáµ̉â¥Îç¥Îç¥Îç¥Îç{ ÁŒ­Ö˜ÁÖ˜ÁÖœÆ̃˜ÁÖ˜ÁÖœÆ̃¥Îç¥Îç˜ÁÖœÆç¥ÎçœÆ猭ք­Îs¥Î{­Î{œµsœÎ{¥Îs¥Îs¥Ö„­̃J{­%lµ/o§1sµgŒÁŒ½̃Œ­Ö”½̃«Đë«ĐëÁÛ́µ̉â¥Îçµ̉âµ̉â¥Îç¥Îçµ̉âµ̉âµ̉âµÖëµÖëÁÛ́̉ặ̉ặ̃âçâï÷âï÷âï÷äéçïï÷́éñï÷÷ï÷÷âï÷ïï÷ïï÷âï÷âï÷ïï÷âï÷âï÷ïï÷ï÷÷ïï÷âï÷âï÷âï÷âï÷̃ç÷̃ç÷̉ặ̃ç÷Î̃âÁÛ́ÁÛ́µ̉â«Đëµ̉â¥ÎçœÆ̃¥Îç¥Îç¥ÎçœÆ甽̃”½çŒ½̃”½ç”½çŒ½̃Œµ̃Œ½̃”½ç„µ̃”½ç”½̃Œ½̃”½çŒ½̃˜ÁÖ”½̃”½̃˜ÁÖœÆçœÆçœÆ̃¥ÎçœÆçœÆ̃˜ÁÖœÆç˜ÁÖœÆ̃¥Îç¥ÎçœÆçœÆ̃”½̃„µ̃̃ç÷̃ç÷̃ç÷̉ặÎ̃ïÎ̃ïÎ̃âÁÛ́ÁÛ́µÖëµ̉âµ̉â¥Îç«Đë¥Îç­Î̃œÆ̃¥ÎçœÆçœÆç¥ÎçœÆç¥Îç¥Îç¥Îç¥Îç«ĐëµÖëÁÛ́ÇÔâ½ĐáµÖëµ̉âÁÛ́ÁÛ́ÁÛ́Î̃âÁÛ́µ̉â­Î̃¥Îç˜ÁÖŒµÖ„µ̃{µ̃{­ÖH_tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ̀⌽̃ÿÿÿ­Î̃Œ­ÖŒµÖŒ½̃„­̃{µ̃„½̃{µ̃{­̃{µ̃{µ̃{­̃{µ̃{­̃„½̃{­̃„µ̃Œ­ÖŒ½ÖŒ½̃Œ½Ö{µ̃Œ½̃”½ç{­̃{­̃ŒµÖœÆçœÆç˜ÁÖ¥Îç«Đë«Đëµ̉â½ĐáÁÛ́µ̉âÁÊÔ¥ÆÖ´Å´ÅŸ²·„œ­ §¬¥¹Ê¥¹ÊÁÊÔz’œQduÎ̃ïÁÛ́½Đá½Đá¥Îç¥Îç­Î̃œÆç«ĐëJ{­B{½J{­h™»œÆ̃¥ÆÖ¥Îç ̀â¥ÎçœÆç¥Îç¥Îç–·ÖŒµ̃ŒµÖ„­Î{­Î{¥Æ{œµ{œµ{œµ{¥Îs¥Î„­Î\•¿/o§f¦1sµgŒÁ{­ÖŒ½ÖœÆç«Đëµ̉âÁÛ́½Đáµ̉âµ̉âÁÛ́ÁÛ́µ̉â«Đëµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ï̃ç÷̃âçïï÷ï÷÷âï÷ï÷÷âï÷âï÷âï÷ï÷÷ï÷÷ïï÷âï÷âï÷÷ÿÿï÷÷ïï÷âï÷ïï÷ïï÷Úàáïï÷ïï÷̃âçâï÷̃ç÷âï÷Î̃ïÎ̃ïÁÛ́ÎÖïÁÛ́µ̉â«Đë­Î̃¥ÎçœÆ̃µ̉âœÆ眽̃œÆ猽֌½ç”½ç”½̃Œ½̃Œ½Ö„½̃Œ½̃Œµ̃”½̃Œ½ÖŒ½̃”½̃”½çœÆçœÆ̃˜ÁÖ¥ÎçœÆç¥Îç˜ÁÖ˜ÁÖœÆç ̀âœÆ甽̃œÆç¥Îç¥Îç¥Îç¥Î眽̃Œ½̃Œ½çŒ½̃̃âç̃ç÷̉ặÎ̃ï̉ặÎ̃ïÁÛ́ÁÛ́½Đáµ̉âÁÛ́µ̉â«Đë«Đë¥Îç¥Îç¥ÎçœÆçœÆçœÆç¥Îç«Đë¥Îçµ̉âµ̉âµ̉âµ̉â½ĐáµÖëÁÛ́ÁÛ́µÖëµ̉â½ĐáÁÛ́ÁÛ́ÎÖïÁÛ́µ̉â¥Îç¥Îç˜ÁÖcˆ %)5{­̃„µ̃„µ̃{­̃{­̃{­̃„µ̃{­̃{µ̃{µÖ„­̃{µ̃Œ½Ö{µ̃{­̃„­ÎŒ½ÖŒ½ÖŒ½̃{µÖŒ½̃”½̃Œ½̃”½çŒ½̃Œ½ç„½̃{µ̃Œ½ÖŒµÖ{µ̃„µ̃„½̃”½ç„µ̃Œµ̃Œ½ÖŒ­Öœµ̃˜ÁÖœ½̃œÆ̃¥Îçµ̉â½Đáµ̉âÁÛ́½Đá«Đë”­½­ÅÓ¥¹Ê”­½ §¬”­½´Å¥¹ÊÁÊÔ½ĐáÇÔ⥹Ê*?PajnÎ̃â½Đá½ĐáÁÊÔ­ÅÓ¥ÎçœÆ̃œÆç¥ÎçJ{­B{½B{½B{½/o§¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç˜ÁÖ„µ̃{µ̃{­Î{¥Æs–µ{œ½s–µgŒÁ{œ½s¥Î{­Î{­Ö{­ÎkœËB{µJ{­{µ̃{µ̃”½̃«Đëµ̉âµ̉âµ̉âÁÛ́µ̉â­ÅÓJSU¥¹ÊÁÛ́½ĐáÁÛ́ÁÛ́Î̃ïÎ̃ï̃ç÷̃âçïï÷̃ç÷ï÷÷ï÷÷âï÷âï÷âï÷ïï÷̃ç÷ïï÷âï÷âï÷âï÷âï÷ï÷÷ï÷÷äéçâï÷âï÷âï÷âï÷âï÷̃âç̉ặ̉ặ̉ặÎ̃ïÁÛ́ÁÛ́µ̉âµ̉â­Î̃µ̉â¥ÎçœÆ̃œÆçœÆçœÆçœÆ甽甽甽甽猽̃Œµ̃„½̃„µ̃Œ½̃Œ½̃˜ÁÖ”½çœÆ甽甽̃œÆç˜ÁÖœÆç«Đë¥Î甽̃˜ÁÖ˜ÁÖ˜ÁÖŒ½̃˜ÁÖ¥Îç¥Îç¥Îç¥Æ̃”½ç”½ç„­̃s­ç{­Öâï÷̃ç÷Î̃ïÎ̃ïÁÛ́Î̃ïÁÛ́ÁÛ́½Đáµ̉âµ̉âµÖëµ̉â¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç ̀â¥Îç¥Îç«Đëµ̉âÁÛ́µ̉âµ̉â½ĐáÁÛ́µÖëÁÛ́µ̉âµ̉âµ̉âÁÛ́Î̃ïÎ̃ïÁÛ́¥¹ÊH_t!!1s­Ös¥Ö{­̃”½çŒ½̃{µ̃{µ̃s¥Ö{­̃{­̃{­̃{­̃{µ̃„­̃„­̃{­̃„µ̃{­ÖŒ½̃{µ̃Œµ̃{µ̃Œµ̃„½̃„½̃Œ½Ö„µ̃„µ̃ŒµÖ{µ̃Œ½ç„½̃„½̃„½̃„µ̃Œµ̃Œ½̃œÆç˜ÁÖ”½̃œ½̃œÆ̃ ̀â­Î̃­Î̃µ̉âµ̉â½Đá½ĐáJSUJSU’¢¯¥¹ÊŸ²·²³¶ÁÊÔ½Đá½ĐáÇÔẩặ̃ç÷¶Ä̉’¢¯½Đá½Đá­ÅÓ­ÅÓ˜ÁÖ¢¿ÔœÆ̃œ½̃¥ÎçM€²B{½B{½B{½B{½œÆç¥Îç«ĐëœÆç«Đë¥Îç˜ÁÖ”½̃”½̃Œ½Ö„­Î{ Ás¥Îh™»g³{œ½s¥Îs¥Îs­Ö„­̃{µ̃ŒµÖŒµÖ{µ̃{µ̃„­ÎŒ½Öœ½̃­Î̃½Đá½Đá½Đá½Đá­Î̃%)5­Î̃ÁÛ́ÎÖïÁÛ́̉ặ̃âçâï÷äéçâï÷ïï÷âï÷âï÷âï÷âï÷âï÷ïï÷ïï÷̃ç÷âï÷âï÷ïï÷ï÷÷âï÷âï÷äéçâï÷âï÷âï÷âï÷äéç̃âç̃ç÷̉ặ̃ç÷Î̃âÁÛ́µ̉âµ̉â¥Îç¥Îç¥Îç¥Îç¥ÎçœÆçœÆçœÆ甽çœÆçœÆ̃œÆ猽̃Œµ̃Œ½̃{­̃Œ½çŒµ̃Œ½̃”½̃”½̃”½ç¥Îç¥ÎçœÆç«Đë¥ÎçœÆçœÆ̃œÆçœÆ̃œ½̃œÆçœÆç¥Îç¥Îç¥ÎçœÆ̃˜ÁÖ”½̃{­̃{­̃{­Î̃âç̃ç÷̉ặÎ̃ïÇÔâÁÛ́ÇÔâÁÛ́½ĐáµÖëµ̉âµÖëµ̉â«Đë«Đë«Đë¥ÎçœÆç¥Îç¥Îç¥Îç¥Îç¥Îç«Đëµ̉âµ̉âµ̉âÇÔâ½ĐáÁÛ́µ̉âµ̉âÁÛ́ÁÛ́µÆ̃y‡’JSU!{µ̃̉ặ÷ÿÿÿÿÿÿÿÿÿÿÿ̉ặ„µ̃{­̃{µ̃s¥Ös­Ö{­Ö{µ̃„µ̃„­̃{µ̃„µ̃„µ̃„µ̃„µ̃ŒµÖ„µ̃{µ̃Œ½̃„µ̃{­Ö„µ̃{µ̃Œ½̃„½̃Œµ̃„½̃Œ½̃„µ̃Œ½ç”½̃”½̃˜ÁÖ˜ÁÖ˜ÁÖœÆ̃˜ÁÖ¥Æ̃­Î̃¶Ä̉½Đá­Î̃½Đá*?P(:-iw²³¶ÁÊÔ½ĐáÎ̃âÁÛ́Î̃âÁÛ́Î̃ï½Đá½Đá­ÅÓ¥¹Ê¥¹Ê¥¹Ê”±Ê˜ÁÖ­ÅÓ¥ÎçM€²B{µB{½B{½1sµœÆ̃«Đëµ̉â«Đë¥ÎçœÆçœÆç˜ÁÖ”½̃Œ½̃ŒµÖ{­ÎsœÁ{œµgŒÁg³s¥Î{ Á„µ̃{µÖ{­Ö„µ̃{µÖ„µ̃„­̃Œ­Æ–·Ö˜ÁÖ­ÅÓ­Î̃½Đá«Đëµ̉â­ÅÓ´ÅÎÖïÇÔâÎ̃ï̉ặ̃âçâï÷äéçäéç̃ç÷âï÷äéçâï÷äéçâï÷ïï÷äéçâï÷âï÷ïï÷ïï÷âï÷ï÷÷ï÷÷âï÷âï÷âï÷́éñâï÷âï÷̃âç̉ặ̃ç÷ÁÛ́Î̃ïÁÛ́µ̉âµ̉â«ĐëœÆç¥ÎçœÆ眽̃œÆçœÆçœÆç¥Îç¥ÎçœÆçœÆ猽̃Œµ̃Œµ̃Œ½̃Œ½̃Œµ̃”½ç”½çœÆçœÆç¥Îç«Đë«Đëµ̉âµÖë«ĐëœÆçœÆ̃œÆ̃œÆçœÆç¥Îç¥Îç«ĐëœÆçœÆ̃Œ½̃Œ½̃{µ̃s¥Ö{­Î̉ặ̉ặ̉ặÎ̃ï̉ặÎ̃ïÇÔâµÖëµÖë½ĐáµÖëµÖëµÖë«ĐëÁÛ́µ̉âµÖë«Đë«Đë¥Îç«Đë«Đëµ̉âµ̉â«Đëµ̉âµ̉â½ĐáÇÔâÁÛ́ÁÛ́Î̃ïµ̉âµ̉âH_tâï÷ÿÿÿ̉ặÁÛ́µÖë̉ặÿÿÿ̃ç÷{µ̃{­Ö{­̃{­Ö{­Ö„µ̃{µ̃{­Ö{µ̃„µ̃Œµ̃„½̃„½̃„½̃Œ½̃„µ̃„µ̃{­̃„µ̃„µ̃„µ̃„µ̃Œ½ç„µ̃Œ½̃„½̃„µ̃Œµ̃˜ÁÖ”½̃˜ÁÖœÆ̃Œ½Ö”½̃˜ÁÖ˜ÁÖ¥¹Ê­ÅÓ­ÅÓ¥Æ̃½Đá*?PQdu½Đá½ĐáÇÔâÁÛ́Î̃ïÎ̃âÇÔâ½Đá½Đá­ÅÓ¥¹Ê´Å”­½²³¶¥¹Ê¢¿Ô«ĐëB{µB{½B{½B{µ%lµ˜ÁÖ¥Îçµ̉âµ̉âœÆçœÆçœÆ̃”½̃”½̃Œ½̃„µ̃{­Ö{¥Îs¥Î{¥Æ{¥Æs­Ös­Ö„­Î{µ̃{­ÖŒ½Ö„µ̃„µ̃„­ÎŒµÖ”±Ê´Å¥¹Ê¥¹Ê¥¹Ê¶Ä̉µ̉â­ÅÓ”­½Î̃ï̉ặ̉ặ̉ặ̃ç÷̃ç÷âï÷âï÷âï÷̃ç÷̃ç÷âï÷âï÷ï÷÷äéçâï÷äéçâï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷âï÷âï÷ïï÷äéçâï÷̃ç÷̃âç̃âç̉ặÁÛ́Î̃ïÁÛ́µÖëµ̉âµ̉â«Đë ̀â«ĐëœÆ̃¥Îç¥Îç ̀â¥Îç«Đë¥ÎçœÆ猽̃Œ½̃„µ̃„µ̃Œ½ÖŒµ̃”½̃”½̃«Đë«Đë«Đëµ̉âÁÛ́½Đáµ̉â¥ÎçœÆçœÆçœÆ̃ ̀âœÆç¥Îç¥Îç¥Îç¥Îç˜ÁÖŒ½̃{µ̃{­̃{­Î{µÖ̃ç÷Î̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́Î̃ïµÖë½ĐáÁÛ́µ̉âÁÛ́µÖë«Đëµ̉â½Đáµ̉â«Đëµ̉âµÖëµ̉â«Đëµ̉âµ̉âµ̉âµÖë½Đá½Đá½ĐáÇÔâÎ̃ïÇÔâµÖëµ̉âH_t%18Xq]s’ÿÿÿœÆçs­Ös¥Ös¥Ös­Ö”½çÿÿÿœÆçs­ç{µ̃{­̃{µ̃{­Ös¥Ö„µ̃„­Î„µ̃„µ̃Œµ̃Œ½̃Œ½̃„µ̃„µ̃Œµ̃„µ̃„µ̃Œ½̃{µ̃„µ̃„µ̃„½̃„½̃{µ̃Œµ̃”½ç”½̃œÆ̃”½̃˜ÁÖŒ½Ö”±Ê”±Ê´Å´Å˜ÁÖœ½̃­ÅÓ¶Ä̉*?PJSUµÖëÇÔâÁÛ́ÇÔâÇÔâÇÔâÇÔâ½Đá­ÅÓ¶Ä̉¥¹ÊŒ­ÆŸ²· §¬Ÿ²·˜ÁÖ¢¿ÔZ†±B{½7v¹7v¹1sµœÆç¥Îç¥Îç¥Îç¥ÎçœÆ̃œÆçœÆç˜ÁÖŒ½Ö\•¿h™»{¥Î{µÖs­Ö{¥Îs¥Ös­Ö„µ̃„µ̃{­̃„µ̃{­Ö„µ̃{­Ö„­ÎŒ­Æ”±Ê´Å´Å¢¿Ô­Î̃¶Ä̉­Î̃z’œÎ̃ïÎ̃ïÎ̃ï̉ặäéç̃âçäéçâï÷âï÷âï÷äéçâï÷âï÷äéḉéñâï÷âï÷ï÷÷ïï÷ïï÷äéçâï÷ï÷÷âï÷ïï÷ïï÷äéçâï÷äéçâï÷̃ç÷̃ç÷Î̃âÎ̃ïÎ̃ïÁÛ́ÁÛ́µ̉âµÖë«Đë­Î̃«Đë«Đë¥Îç¥Îç«Đë ̀â¥ÎçœÆçœÆ猽̃”½̃”µâŒ½̃”½̃”½çœÆç ̀â«Đëµ̉â½ĐáÁÛ́ÁÛ́µÖë¥Îç ̀âœÆ眽̃”½̃œÆçœÆ̃¥ÎçœÆ̃„½̃Œ½çŒµ̃{µ̃s­Ö{­Ö{­̃̉ặÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́½ĐáµÖëÁÛ́µ̉â½Đáµ̉âµ̉âµÖëµ̉âµ̉âµ̉â«Đëµ̉â«ĐëÁÛ́½ĐáÁÛ́µÖëÁÛ́ÁÛ́µÖëµ̉âJSU)*?PX}’{­̃{­̃s¥ÖÁÛ́âï÷s­Ö{µ̃s­Ös¥Ö{­̃{µ̃âï÷µÖë{µ̃{µ̃{­̃{µ̃{µ̃{µ̃{µ̃„µ̃„µ̃„µ̃„µ̃{µ̃Œµ̃{µ̃”½ç„½̃{µ̃Œ½ç„µ̃„µ̃{µ̃„µ̃Œ½çŒ½̃„½̃Œ½̃”½ç”½̃Œ½̃”½̃ŒµÖ”±ÊŒµÎ„¥Æ­¹”­½”­½”­½­ÅÓÁÊÔ*?PJSUÇÔâÎ̃ïÎ̃ïÁÛ́Î̃ïÎÖïÎÖïÁÛ́­Î̃¶Ä̉¥¹Ê”­½ §¬”­½Ÿ²·¥¹Ê¥Æ̃˜ÁÖgŒÁB{½B{µ1sµ”½̃¥ÎçœÆ眽̃œÆ̃œ½̃œÆ̃”½̃˜ÁÖ”½̃f¦f¦/o§Z†±„­Îs¥Ö„­ÎŒ­Ö{µ̃{µÖŒµ̃{µ̃„­̃ŒµÖ{­ÖŒ­Æ”­½¥»”­½”­½¥¹Ê¶Ä̉­Î̃«Đë!z’œÁÛ́Î̃ïÎ̃ïÎ̃ï̃âçâï÷âï÷̃âçâï÷̃ç÷âï÷äéçâï÷ï÷÷ï÷÷âï÷âï÷âï÷ïï÷äéçï÷÷ïï÷ïï÷âï÷âï÷âï÷ï÷÷âï÷ï÷÷âï÷̃ç÷̃ç÷̃ç÷ÁÛ́µÖëÇÔâµ̉âÁÛ́µÖëµÖëµ̉âµ̉â«Đë«Đëµ̉â¥Îç­ÅÓ¥Îç¥Î眽̃œÆ̃œÆ̃œÆ甽çœÆç«Đë¥Îç«Đëµ̉âµ̉âµ̉âÁÛ́µÖëµ̉âœÆçœÆçœÆ̃”½̃”µâœÆ甽甽ç˜ÁÖŒ½̃Œµ̃{µ̃{­Ö„­Îs­Ö{­ÖÎ̃âÁÛ́Î̃ïÎ̃âÁÛ́Î̃ïÁÛ́ÁÛ́ÁÛ́½ĐáµÖëÁÛ́ÁÛ́µ̉âÁÛ́½Đáµ̉âÁÛ́«ĐëµÖëµ̉âµ̉â¥Îçµ̉âµÖëµ̉â«ĐëµÖëµ̉âµÖëÁÛ́ÁÛ́µÖëÁÛ́JSU*?PZ†±s¥Ö{µ̃s­Ös¥Ös­Ö{­̃{­̃ÁÛ́ïï÷s¥Ös¥Ö{­Ös¥Ö{­̃{µ̃̃ç÷ÁÛ́{µ̃„­Îs­Ö{µ̃s­Ö{µ̃„­̃{­Î„µ̃„­ÎŒ½ÖŒ­Ö{­̃ŒµÖ„½̃„µ̃„½̃„µ̃{­̃{µ̃{µ̃„µ̃ŒµÖ{­̃„µ̃„½̃Œ½̃”½ç”½̃˜ÁÖ´Å”±Ê”­Æ„ µ’¢¯„œ­„œ­ §¬´Å¶Ä̉%)5QduÇÔâÎ̃ïÎ̃âÁÛ́½ĐáÁÛ́ÁÛ́­Î̃ÁÊÔ¥¹Ê¥¹Ê”­½ §¬¥¹Ê¥¹Ê¥ÆÖ­Î̃¥Æ̃µ̉â«Đë{­ÎB{µ”µâ˜ÁÖ”½̃”½̃”½̃–·Ö¥ÆÖ˜ÁÖ”½̃„µ̃f¦f¦f¦f¦f¦{­Î{µ̃{­̃ŒµÖ„µ̃Œ½̃Œ½̃ŒµÖŒµÖ„¥½”­½„¥½”­½”­½”­½¥¹Ê¶Ä̉¶Ä̉­Î̃­Î̃fv|y‡’ÎÖïÁÛ́Î̃ïÎ̃ẩặ̃âçÎ̃ẫç÷âï÷̃ç÷и­Úàáïï÷âï÷âï÷âï÷âï÷ïï÷ïï÷ï÷÷âï÷äéçâï÷âï÷ïï÷âï÷̃âçâï÷âï÷̃ç÷̃ç÷̃ç÷̉ặ̃ç÷Î̃ïÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â­Î̃µ̉âµ̉â«Đëµ̉âµ̉â«Đë¥Îç¥ÎçœÆ̃œÆç¥Îç¥ÎçœÆç¥Îç¥Îç­Î̃«Đëµ̉âÁÛ́½ĐáÁÛ́µ̉âµ̉â¥ÎçœÆç˜ÁÖ˜ÁÖŒ½Ö˜ÁÖ”½ç”½çŒ½̃{­̃{­̃s¥Ö{­Ös¥Ös¥Ös¥ÖÎ̃ïÁÛ́ÁÛ́̃âçÎÖïÎÖïÁÛ́ÁÛ́ÁÛ́½ĐáÎÖïµ̉âÁÛ́½ĐáÁÛ́µ̉âµ̉â¥ÎçÁÛ́µ̉â½Đá«Đëµ̉âµ̉âµ̉âµ̉â½Đá½ĐáµÖëÁÛ́ÁÛ́ÁÛ́½Đá¥ÎçJSU*?Ps–µ{­̃s¥Ö{µ̃s­Ö{µ̃s¥Ö{­̃{­Ös¥Ö{­̃s­Ö„½̃ÿÿÿµÖë{­̃{­̃{­̃{­̃«Đëÿÿÿ¥Îçs­Ö{­̃{­̃s­Ös­ÖŒ­Ö{­Ö{­̃ŒµÖ{­Ö{µ̃ŒµÖŒ½̃{µ̃„½̃Œ½̃Œ½̃Œ½ç”½çŒ½̃{µ̃”½̃Œ½ç„½̃Œ½ÖŒ½Ö{­̃ŒµÖ–·Ö˜ÁÖ˜ÁÖŒµÖ¥»{œµ{Œ­§„œ­ §¬”­½¥¹Ê*?PajnÇÔâ½ĐáÎÖïÎÖïÁÛ́½Đáµ̉â«Đë­ÅÓ¥ÆÖ¶Ä̉¶Ä̉¥¹Ê §¬¶Ä̉¶Ä̉­Î̃µ̉â½Đáµ̉â­Î̃¥ÎçœÆ猽֌½ÖŒ­ÆŒµÖ–·ÖŒµÖŒ­Ö”½̃Œ½Ö/o§f¦f¦f¦f¦s¥ÖŒ½̃{µ̃„½̃Œ½̃„µ̃”½̃Œ½̃ŒµÖŒµÖ„­ÎŒ­ÆŒ­Æ”­½´Å¶Ä̉¶Ä̉½Đá­Î̃µ̉â«Đëµ̉â˜ÁÖ’¢¯ÁÛ́½ĐáÎ̃âÔÛ̃Î̃ẫç÷̃ç÷âï÷âï÷Î̃ïÖc%ÎZ!Đ|JÇÔââï÷ïï÷ï÷÷âï÷ïï÷äéçïï÷ï÷÷ï÷÷âï÷ïï÷âï÷âï÷âï÷ïï÷ï÷÷Øëóâï÷ÎÖï̉ặÁÛ́ÁÛ́ÁÛ́½Đáµ̉âµ̉âµ̉âµÖëµ̉âµ̉âµ̉âµ̉âµ̉âµ̉â¥Îç¥Îçµ̉â«Đë¥Îç«Đë¥Îç¥Îç¥Îçµ̉âÁÛ́ÁÛ́ÁÛ́µ̉âµ̉âµ̉â¥ÎçœÆçœÆ̃Œ½ÖŒµ̃„µ̃„½̃Œ½Ös­Ö{­̃s¥Ös¥Ös­Ös¥Ö„­̃s­ÖÁÛ́Î̃ïÁÛ́ÇÔâÎ̃ïÇÔâÇÔâÇÔâÁÛ́ÁÛ́ÇÔâÁÛ́Î̃âµ̉âÁÛ́ÁÛ́µ̉âµÖëµ̉âÁÛ́ÁÛ́µÖë«Đëµ̉âµ̉âµ̉âÁÛ́ÁÛ́ÁÛ́½Đá½Đáµ̉âµ̉âµÖëJSU!8Xq{ Á{­̃{­̃{µÖ{­̃{µ̃{µ̃s¥Ö{­̃{µ̃ÁÛ́ÿÿÿ̃ç÷{­̃{µ̃ï÷÷ÿÿÿ̃ç÷{­̃„µ̃s­ç{­̃{­̃Œ­Ös­ÖŒ­Ö{­Ö„µ̃s¥Ös­ÖŒ½Ö{µ̃Œ½̃„µ̃Œ½ÖŒ½̃„µ̃Œµ̃Œ½̃ŒµÖ„½̃{µ̃„½̃Œ½Ö„½̃”½çŒ½Ö˜ÁÖ¥ÆÖŒµÖ–·Ö”­½{œµ„œ­{Œ­§„œ­ §¬¥¹Ê*?PajnÇÔâÇÔâ½ĐáÇÔâµ̉âÁÛ́½Đáµ̉âh™»B{µ\•¿”±Ê¥¹ÊŒ½Ö¶Ä̉­Î̃µ̉âµÖëµ̉âµ̉â¥Îç­Î̃œÆ̃Œµ̃Œ­Æ„¥ÆŒ­ÆŒ­ÆŒ­ÆŒ­ÆŒ­Æ¥¹Ê/o§f¦f¦f¦f¦s­ÖŒ½̃Œ½ç„µ̃„­̃Œ½̃”½̃˜ÁÖŒ­Ö{µÖ„­Î–·Ö”±Ê §¬¥¹Ê¥¹Ê¥ÆÖ­Î̃­Î̃µ̉âÁÛ́µ̉âµÖëµ̉âÁÛ́µ̉âÁÊÔÁÊÔÇÔâÎ̃ẫç÷Î̃âÔÛ̃̉ặÆ^)Đ^%Đ^%¼d0âï÷ï÷÷ïï÷äéçïï÷ï÷÷ïï÷ïï÷ï÷÷âï÷âï÷äéçïï÷ïï÷ïï÷̃âçâï÷̃ç÷âï÷̉ặÎ̃ïÁÛ́½ĐáÇÔâµ̉âÁÛ́µ̉âµ̉âÁÛ́½ĐáÁÛ́µÖëµ̉âµ̉â­Î̃µ̉â¥Îç«Đëµ̉âµ̉âÁÛ́µ̉âµÖëµ̉âµ̉âÇÔâ½ĐáµÖë½Đáµ̉â¥ÎçœÆ电ℵ̃„½̃„µ̃{­̃{­̃s­Ö{¥Î{­Ö{µ̃{­Îs­Ö{­̃s­Ö̃ç÷Î̃ïÁÛ́ÁÛ́ÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÇÔâÇÔâÁÛ́µ̉âÁÛ́ÁÛ́µÖëµÖëÁÛ́½Đá½ĐáÁÛ́µ̉âµÖëµÖë½Đá½ĐáÇÔâÁÛ́ÁÛ́µÖëÁÛ́JSU)*?PZ†±s¥Ös­Ös­ç{­̃{µ̃s¥ÖŒ½ç ̀â{µ̃{­̃¥Æ̃„µ̃s¥Ös¥Ö{­Ö{µ̃{­̃s¥Ö{µ̃{­Ö{­̃{µ̃„­̃{µ̃{­̃Œµ̃Œµ̃Œ½̃{­̃„µ̃„µ̃Œ½çŒ½çŒ½Ö„­̃Œ½̃„µ̃„µ̃Œµ̃Œ½̃Œ­ÖŒµ̃Œ½Ö–·ÖŒµÎ”­½„œ­{Œ­z’œ§„œ­¥»´Å(:-ajn½Đá½Đá½Đá­Î̃½Đá½Đá½Đáµ̉âgŒÁB{µB{½B{µZ†±¥»¥ÆÖ­ÅÓ­Î̃ÇÔâµÖëµ̉âµ̉âµ̉â­ÅÓŒµÖ”­½„ µ{œµ„ µ„ µŒ­Æ–·ÖŒµÎ/o§f¦f¦f¦f¦{­̃{µ̃„µ̃„½̃„­ÎŒ½̃œÆ̃”½̃Œµ̃ŒµÖNsƒ´ÅŒ½Ö´Å´Å¥¹Ê¥ÆÖ­ÅÓµ̉âµ̉â½Đáµ̉âµ̉âµ̉âµ̉âÁÊÔ­ÅÓÁÊÔÁÊÔ½ĐáÎ̃âÎ̃ï̃ç÷̃ç÷Æ^)Đ^%Đ^%Æ^)âï÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷âï÷ï÷÷ïï÷ÿÿÿâï÷âï÷âï÷ï÷÷âï÷âï÷̃ç÷âï÷̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃âÁÛ́ÁÛ́½ĐáµÖë½ĐáÁÛ́ÁÛ́µÖëÁÛ́µ̉âµ̉â«ĐëÁÛ́µ̉âµÖëÁÛ́ÁÛ́½Đá½ĐáÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëµ̉â¥ÎçœÆ̃Œ½̃{µ̃{µ̃{­̃s¥Ö{­Ö{­Ö{µ̃{­Ö{­̃s­Ös­Ös¥Ö{­ÖÎ̃ïÁÛ́Î̃âÁÛ́Î̃ïÎÖïÁÛ́ÇÔâ½ĐáÁÛ́½ĐáÁÛ́ÇÔâÁÛ́ÁÛ́½ĐáÁÛ́µ̉â½Đá½ĐáÇÔâ½Đáµ̉â½ĐáÁÛ́µ̉âµÖëÁÛ́µ̉âÁÛ́ÁÛ́ÁÛ́µ̉âµÖë”­½JSU!!1*?PX}’s¥Ös¥Ös¥Ö{µ̃s¥Ö{µ̃{­̃s­Ö{µ̃{­̃{µ̃{µ̃s¥Ö{µ̃{­Ö{µ̃{­Ö{­̃{µ̃{µ̃„­̃„­̃„­Î„½̃Œ½̃„½Ö„µ̃Œ½ç„µ̃Œ½ç„½̃Œ½̃{µ̃„µ̃„µ̃„½̃Œ½̃ŒµÖŒ½Ö–·ÖŒµÖŒ­Æ„¥½¥»§§™“”’¢¯”­½¥¹Ê%)5ajn½ĐáÁÊÔ­Î̃­ÅÓÁÊÔÁÊÔµ̉âµ̉âh™»B{½B{½B{½B{½B{½­ÅÓ½Đá½Đáµ̉âµÖëµ̉â«Đë«Đ딽̃”±Ê„¥Æ„ µ{œµ{œµ{œµŒ­ÆŒ½Ö”­Æf¦f¦f¦f¦f¦{­ÖŒµ̃Œ½̃{­Ö„­ÎŒµ̃Œ½̃„µ̃Œ­ÖŒµÎ*?P„œ­­Î̃­Î̃ÁÊÔ½Đá«Đë«Đëµ̉âµÖëµ̉âµ̉â«Đë­Î̃¶Ä̉¶Ä̉­ÅÓÁÊÔÎĐÑÎ̃âÚàá̉ặÆ^)Đ^%Đ^%Æ^)̃âçïï÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷âï÷âï÷âï÷âï÷âï÷ïï÷ïï÷âï÷äéçâï÷̃âçÎ̃ï̉ặÎ̃ïÇÔâÎ̃ïÎ̃ïÁÛ́Î̃ï½ĐáÁÛ́ÇÔâÇÔâÁÛ́ÁÛ́ÁÛ́µÖëµ̉âÁÛ́ÁÛ́µÖëÁÛ́µ̉âÁÛ́ÁÛ́½Đá½ĐáÁÛ́µ̉âµ̉â«Đ뜽̃„µ̃s¥Ö{µ̃{­Ös¥Ös­Ös­Ö{µ̃s­Ös­Ö{­Ö{­̃{µ̃s­ÖÎÖïÎ̃ï̉ặÎ̃ïÎ̃ïÁÛ́Î̃âÁÛ́ÁÛ́ÁÛ́ÁÛ́ÇÔâÁÛ́ÁÛ́µÖëÁÛ́½ĐáÁÛ́ÁÛ́½ĐáÁÛ́½Đá½ĐáÁÛ́µ̉âµÖëµÖëµ̉âµ̉âµÖëµÖëµ̉âµ̉âµ̉âÇÔâÎ̃ïÎ̃ï”­½iwJSU)̃ç÷̃ç÷̃ç÷̃ç÷âï÷âï÷âï÷̃ç÷”½çs¥Ö„µ̃{µ̃{­̃{µ̃{­̃„µ̃{­̃{µ̃{­Ö„µ̃Œµ̃{µ̃„µ̃„µ̃Œ½ç„µ̃Œ½çŒµ̃Œ½̃„µ̃„µ̃„µ̃Œµ̃„µ̃Œ½̃Œµ̃ŒµÖŒ½Ö˜ÁÖŒ½Ö”±Ê¥»{Œ­’¢¯„œ­„œ­„œ­ §¬²³¶„œ­JSUajn­Î̃­ÅÓ¥¹Ê¥¹Ê­ÅÓ­Î̃ÁÊÔ½ĐágŒÁB{½B{½B{½B{µB{µ­ÅÓµ̉âµ̉âµ̉âµ̉âµ̉âµ̉â¥Î由ʔ±ÊŒ­Æ„ µ{œµ{œµ{œµ„ µŒµÎŒµÎs¥ÎB{µf¦f¦f¦Œ­ÖŒ½̃{­ÖŒµÖ{­Ö{­ÖŒµÎ„µ̃{­Ö„­̃(:-œ½̃­Î̃µ̉âµ̉âµ̉âµÖëµÖë½Đá«Đë­Î̃¶Ä̉ÁÊÔ­ÅÓÈÉÉÁÊÔÁÊÔÎ̃âäéç̃ç÷Çœ~Æ^)Đ^%Æ^)Úàáï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷âï÷ïï÷ï÷÷ï÷÷âï÷ï÷÷ïï÷ïï÷ïï÷âï÷̃ç÷äéç̃ç÷̃ç÷̉ặ̉ặÎ̃ï̃âçÎ̃ïÎ̃âÎ̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÁÛ́ÁÛ́µÖëÁÛ́Î̃ïÁÛ́ÁÛ́ÇÔâ½ĐáÁÛ́µÖëÁÛ́ÁÛ́µ̉â­Î̃¥Î甽̃{µ̃{­Ö{­Ö{­Ös­Ö{µ̃s¥Îs­Ös­Ös­Ös­Ö{­Ös­Ö{µ̃̉ặÎ̃ï̉ặ̉ặÎ̃ïÎ̃ïÁÛ́½ĐáÁÛ́Î̃ïÁÛ́ÁÛ́½ĐáÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëµÖë½Đá½ĐáÁÛ́ÁÛ́Î̃ïµ̉âµÖëÁÛ́½ĐáÁÛ́½Đáµ̉â½ĐáµÖëÁÛ́ÇÔâÎ̃ïÁÛ́ÇÔâµ̉âœÆç„­ÎNsƒ*?P)âï÷âï÷âï÷âï÷ïï÷ÿÿÿÿÿÿ̃ç÷”½ç{­̃s¥Ö{µ̃„­̃{­Ö„µ̃{µ̃{­̃{µÖ{µ̃s¥ÖŒµ̃{­ÖŒ½Ö„µ̃„µ̃„µ̃„½̃„µ̃„½̃Œ½Ö„µ̃ŒµÖŒ½̃{­ÖŒµÖ„µ̃–·ÖŒ½ÖŒµÖŒµÖŒµÎy‡’*?Py‡’„œ­ §¬Ÿ²·¥¹Ê­ÅÓ½Đá­ÅÓy‡’%)5Qdu­Î̃²³¶´Å´Å¥¹Ê¥¹Ê¶Ä̉½ĐágŒÁB{½B{µB{µB{µB{µ¥Îçµ̉âµ̉âµÖëµ̉âµ̉â­Î̃œ½̃œÆ̃´ÅŒ­ÆŒ­Æ{œµ{œµ„ µ{ Á„­ÎŒµÖŒµÖ”½̃{­Ö\•¿B{µ„µ̃„­Î„¥½{ Á{­Î{¥Æ{¥Î{­Î{­Îs¥Öœ½̃½Đá½Đáµ̉âµ̉â«ĐëµÖëµ̉â½Đá«Đë­ÅÓ­Î̃ÁÊÔÁÊÔÈÉÉÁÊÔÇÔâÎ̃âÚàáâï÷äéçи­Đ|JÎ̃âï÷÷ïï÷äéçï÷÷âï÷ïï÷äéçï÷÷âï÷ÈÉÉи­Úàáï÷÷ï÷÷ïï÷âï÷ïï÷äéçâï÷âï÷̃âç̉ặ̃ç÷̃âç̃ç÷̃âç̉ặ̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃âÎ̃âÁÛ́ÁÛ́ÎÖïÎ̃ïÁÛ́Î̃ïÎ̃ïÁÛ́µÖëµ̉âµ̉â«Đë«Đë˜ÁÖŒ½̃{­Ös¥Ös¥Ös­Ös­Ös­Ös­Ös¥Ös¥Ös¥Ö{­Ös¥Ös­Ös¥ÎÁÛ́Î̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́½ĐáÁÛ́µÖëÁÛ́µÖëµ̉âµ̉âµ̉âÁÛ́µ̉âµÖë½ĐáÇÔâµ̉âµÖëÁÛ́ÁÛ́ÁÛ́ÁÛ́ÎÖïµÖëµÖëÁÛ́µ̉âµ̉âœÆ̃„µ̃{µ̃{µ̃{­̃s¥ÖNsƒs­Ös­Ös­Ö{­Ös­Ös¥Öâï÷ïï÷„µ̃{µ̃s­Ö{­̃{­̃„µ̃s­Ö„­̃„µ̃{­Ös¥Ö„­̃„­̃{µ̃Œ½̃„µ̃„µ̃Œµ̃„½̃Œ½̃„µ̃„µ̃„½̃Œ½̃ŒµÖŒµÖ{­Ö„µ̃Œ­ÆŒ­ÆŒµÎŒ­Ö´Å|•±!k‡• §¬¥¹Ê­ÅÓÁÊÔµ̉â½ĐáÁÛ́¥¥iw¥¹Ê´Å §¬”­½ §¬Ÿ²·¥¹Ê½Đá\•¿B{µB{½B{½B{½B{µ­Î̃µ̉âµ̉âµ̉â«Đë«Đë¥Æ̃˜ÁÖ˜ÁÖ{¥ÎŒ­Æ„¥Æ„ µ„ µ{œµ{­ÎŒ­ÆŒ­ÆŒ½̃Œ½̃Œ½̃{µ̃Œ½̃Œ­Æ„¥½{œ½{œ½{œ½{œ½sœÁ{ Á{­ÎŒ­Ö¥Æ̃µ̉âÁÛ́«Đëµ̉âµ̉âµÖë½Đá½Đá­Î̃½Đá­ÅÓÁÊÔÈÉÉÈÉÉÁÊÔÔÛ̃Úàá̃ç÷ïï÷ïï÷ïï÷ïï÷ï÷÷ïï÷ïï÷äéçâï÷âï÷âï÷äéçâï÷ó÷ûи­Đ^%Æ^)Çœ~Úàáâï÷ïï÷ïï÷âï÷âï÷ïï÷̃ç÷âï÷âï÷̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷Î̃ï̉ặ̃âç̉ặÎ̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃âÁÛ́µÖëµ̉â­Î̃¥Îç¥Î猵̃„½̃{µ̃{¥Î{­Ös¥Ö{­Îs¥Ös­Ös¥Ö{­Ö{­Ös­Ö{µ̃s­Ö{­̃ÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎÖïÁÛ́ÁÛ́ÎÖïÁÛ́ÁÛ́Î̃ïÎ̃âÁÛ́Î̃ïÎÖïÇÔâÎÖïµ̉âµÖëÁÛ́µ̉â½Đáµ̉âµ̉â«ĐëÇÔâµ̉âµ̉âµ̉âµ̉âÁÛ́µÖëµ̉âÇÔâ«Đë«Đë«Đëµ̉â¥Î甽̃Œ­Ö{­ÖsœÎcŒ¥*?Ps¥Ö{µ̃s­Ö{­̃{µ̃s­Ös¥Öÿÿÿ½Đá{µÖ{µÖ{µ̃{­̃{­̃{µ̃{­̃{­̃{­Ö{­Ö{­̃{­̃{­ÖŒ½̃{µ̃„½̃Œµ̃„½̃„µ̃”½çŒ­Ö„½̃ŒµÖ„µ̃„­Î„­Î{­ÎŒ­ÆŒ­Æ„¥½Œ­Æ”­Æ§JSU’¢¯­ÅÓ½Đáµ̉âµ̉âµ̉â­Î̃¥¹Ê´Å’¢¯ §¬„œ­Ÿ²·¥¹Ê¶Ä̉Z†±B{½B{µB{½B{½1sµ¥Æ̃½Đá½Đá­Î̃«Đ뜽̃œÆ̃œÆ猵Îf¦/o§Z†±„ µŒ­ÆŒ­ÆŒ­ÆŒ­ÖŒµÖŒµÖŒ½ÖŒ½̃Œ­ÖŒµÖ{­ÎŒ­ÆgŒÁh™»s–µkŒ¥h™»s¥Î{­ÎŒ­Æµ̉âµ̉âµ̉âµ̉âµ̉â«Đëµ̉âµ̉âµ̉â­Î̃½Đá½ĐáÁÊÔÁÊÔÁÊÔÇÔâÔÛ̃Úàáâï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷äéçâï÷̃âçÚàáäéç̃âçâï÷âï÷ï÷÷и­Đ^%Öc%Öc%Đ|Jï÷÷ïï÷ïï÷âï÷âï÷ïï÷âï÷̃ç÷äéç̃âç̃âçÎ̃ẫâç̃ç÷̉ặÎ̃ââï÷̃âçÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ẫç÷ÎÖïµ̉â«ĐëœÆçœÆ甽ç{µ̃s­Ö{µ̃s¥Ö{µÖs­Ös¥Ös¥Ös¥Ö{µ̃s­Ö{­Îs¥Ös­Ös¥Ös­ÖÁÛ́ÁÛ́Î̃ï̉ặ̉ặÁÛ́̃ç÷Î̃âÁÛ́ÎÖïÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëµ̉âµÖëÇÔâ«Đëµ̉â«ĐëÇÔâµ̉â½Đá½Đáµ̉âÇÔâÁÛ́µ̉âÁÛ́µ̉âÁÛ́½ĐáµÖë¥Îç¥Îçµ̉âµ̉â¥Îç{œµ*?Ps¥Ös­Ös­Ös¥Ö{­̃Œ½̃Œ­Öïï÷ÁÛ́{µ̃{µ̃{­̃s­Ö{­̃{µ̃„­Î{µ̃„µ̃ŒµÖ„½̃{µ̃{­̃{µ̃Œ½̃„½̃”½ç„½̃Œ½̃{­̃Œ­ÖŒ½̃{µ̃„­Î{­Ö„­Î„¥½{œµ„œ­Œ­Æ{œµŒ­Æ{Œ­¥¹Ê½Đáµ̉âµ̉âÁÊÔ¥Æ̃¥¹Ê”­½’¢¯ §¬„œ­ §¬Ÿ²·­Î̃VˆÀB{µB{µB{½B{½1sµ­Î̃­Î̃¥ÆÖ­ÅÓ­Î̃¥ÆÖœÆ̃˜ÁÖŒ½Ö/o§%lµf¦f¦/o§{­ÎŒµÖŒ­Æ{­Ö„½̃„µ̃Œ½̃Œ½̃ŒµÖ{­Îs¥Îh™»h™»{Œ­Z†±g³sœÎ{œµŒ­Æ­Î̃µ̉âµÖëÁÛ́«Đëµ̉âµ̉âµ̉âµÖë½Đá½ĐáÎ̃âÔÛ̃ÇÔâÎĐÑÎ̃âÎ̃ẫç÷̃ç÷äéçâï÷ïï÷äéçïï÷äéçÚàáÚàáÎ̃âÚàáÚàáÚàá̉ặâï÷ÈÉÉÖc%Öc%Üg%Đ|Jÿÿÿïï÷ï÷÷ï÷÷ïï÷ï÷÷âï÷ïï÷âï÷̃âç̃ç÷ÔÛ̃ïï÷̃ç÷̃âç̉ặ̃âç̃ç÷̃ç÷Î̃ï̉ặÎ̃ï̉ặÁÛ́ÁÛ́ÁÛ́ÁÛ́ÎÖïÎ̃ïÎ̃ï½Đáµ̉â¥ÎçœÆ猽̃ŒµÖŒ½Ö{­̃{­̃{­Îs­Ö{¥Îs­Ös­Ös¥Ös¥Ö{­Ös¥Ö{­̃{­̃sœÎÎ̃ïÎ̃âÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ïÇÔâµÖëÁÛ́½ĐáÁÛ́µÖëÁÛ́µ̉âµ̉âµ̉âÁÛ́ÁÛ́ÇÔâÁÛ́½ĐáÇÔâÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́½Đá«Đë«Đëz’œ*?P{­Ö„µ̃Î̃ïïï÷ïï÷̉ặ{µ̃„µ̃{µ̃{­̃s¥Ö{µÖ{µ̃{µ̃{­̃{­̃{µ̃{­Ö{µ̃„­̃„½̃ŒµÖ{µÖ{µ̃„µ̃„½̃„½̃{­̃Œ½̃”½çŒ½ÖŒ­Ö{­Ö{­Î„ µ{œµ{œµ{œµ{œµ{œµ{œµz’œ¥¹ÊÁÛ́Î̃â½Đá½Đá­ÅÓ”­Æ´Å’¢¯§„œ­ §¬ §¬ÁÊÔZ†±B{µB{½1sµB{½1sµ­Î̃­Î̃ÁÊÔ­ÅÓ¥¹Ê˜ÁÖ”½̃˜ÁÖŒ­Æf¦%lµ%lµf¦f¦h™»–·ÖŒµÖŒµÖŒµÖŒµÖ„µ̃Œ½̃{­Î{­Î{­ÎcŒ¥kŒ¥kŒ¥kŒ¥{œµ|•±{¥Î„¥Î­Î̃¥Îç­Î̃µ̉âµ̉âÁÊÔ«Đë½ĐáÁÛ́ÈÉÉÇœ~ÔÛ̃̃âçÎ̃âÚàá̃âç̃âçâï÷âï÷ïï÷ïï÷ïï÷ï÷÷ïï÷̃âçÔÛ̃ÔÛ̃ÔÛ̃ÎĐÑÔÛ̃ÔÛ̃̃âçâï÷ÎĐÑĐ^%Öc%Öc%Đ|Jÿÿÿï÷÷âï÷ï÷÷ï÷÷äéçï÷÷äéçïï÷âï÷äéç̃ç÷̃ç÷Øëóâï÷̃âçâï÷̃âçÎ̃ẫç÷̃ç÷̉ặ̉ặÎ̃ïÎÖïÎ̃ïÁÛ́ÇÔâÁÛ́ÁÛ́½Đáµ̉âµ̉â¥Îç˜ÁÖŒ½̃{µ̃{­Ös­Ös¥Ö{µ̃s¥Ö{­Îs­Ös¥Ös­Ös¥Îs­Ös­Ö{µ̃{­ÎÁÛ́̉ặÎ̃ï̉ặÎ̃ï̉ặ̉ặÎÖïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÇÔâµÖëÁÛ́½ĐáÁÛ́µ̉âµ̉âÇÔâ½ĐáÁÛ́ÁÛ́ÁÛ́ÇÔâÎ̃ïÇÔâÁÛ́µÖë½ĐáÆäôÎ̃ïµÖëµÖëQdu«Đëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«Đë{µ̃s¥Ö{­̃{µ̃{­̃„µ̃{µ̃{µ̃{­Ö„µ̃{µ̃{µ̃{­̃{µ̃ŒµÖ{µ̃Œ½̃Œµ̃{µ̃Œ½̃{­̃Œ½̃ŒµÖ„µ̃Œ­Ö„¥Æ{œµ{œµ{Œ­kŒ¥{Œ­s–µ{œµk‡•¥¹ÊµÖëÁÛ́µ̉â­Î̃­ÅÓ¥¹Ê´Å §¬„œ­„œ­ §¬¥¹Ê¥¹Ê­Î̃”±Êg³B{µB{µ/o§¥ÆÖ­ÅÓ¥¹Ê”±ÊŸ²·–·Ö–·Ö˜ÁÖ{­Ö/o§%lµ%lµf¦f¦s¥ÎŒµÖŒµ̃„µ̃”½̃Œ½̃Œµ̃ŒµÖŒµÖ{­Îh™»|•±g³kŒ¥kŒ¥„œ­{œµ´Å¢¿Ôajn­ÅÓµ̉âµ̉â¥Æ̃­ÅÓ­Î̃½ĐáÁÛ́Î̃ïÈÉÉÖc%Öc%Đ|Jи­̃âçäéçÚàáâï÷ï÷÷ïï÷ïï÷ï÷÷äéçïï÷́éñÚàáÇÔâÎĐÑÈÉÉÎĐÑÚàáäéçäéçïï÷Çœ~Đ^%Öc%Đ|J÷ÿÿâï÷ï÷÷ïï÷ïï÷ïï÷ï÷÷äéçïï÷Î̃â¶Á¿ï÷÷ïï÷äéç̃ç÷äéçâï÷âï÷̃ç÷̃ç÷̉ặÎ̃ïÎ̃ïÁÛ́ÁÛ́µÖëÁÛ́ÁÛ́µÖë½Đá½ĐáµÖë«Đë¥ÎçœÆçœÆ甽ç{µ̃s­Ös¥Ös­Ös­Ös¥Ös­Ö{­Ös­Ö{­Îs¥Ös­Ös¥Ös¥ÖÎÖïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ï̉ặ̃ç÷Î̃ï̉ặÎ̃ï̉ặÎ̃ïÁÛ́½Đáµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́ÇÔâÎ̃âÁÛ́½ĐáµÖëÁÛ́Î̃ïÁÛ́µ̉âJSU8XqX}’g³÷ÿÿ̃ç÷”½ç{µ̃{µ̃”½ç̉ặÿÿÿ”½çs¥Ö{µ̃{µ̃{­Ö{­̃„µ̃{­Ö{µÖ„­̃„µ̃{­̃„µ̃„µ̃{­̃„µ̃{­Ö„µ̃„µ̃„µ̃Œ½ÖŒµÖ„µ̃Œ½̃„­Î„¥Æ{œµsŒ­{Œ­z’œkŒ¥kŒ¥sŒ­k‡•¥¹Êµ̉âµ̉âµ̉âµ̉â­Î̃¥¹Ê²³¶ §¬¥» §¬ §¬¥¹Ê¥ÆÖ¶Ä̉½ĐáÁÛ́­ÅÓsœÁB{µ–·Ö¥¹ÊŸ²·”­½”­½”­½”±Ê–·Ö„­Î%lµf¦f¦f¦f¦h™»Œ½ÖŒµ̃Œ½̃ŒµÖŒ½̃Œµ̃ŒµÖŒµ̃H_tcˆ { ÁsŒ­{Œ­{Œ­{œµ”­½¥¹Ê­Î̃µ̉â¶Ä̉iw!!1œ½̃­Î̃œ½̃¥ÆÖ­ÅÓ­ÅÓ½ĐáÇÔâÎ̃ïÈÉÉÖc%Öc%Öc%Đ^%Đ|J̃ç÷ïï÷âï÷âï÷äéçï÷÷ï÷÷ï÷÷ï÷÷äéçÚàáÚàáÎĐÑÈÉÉÎĐÑÔÛ̃Úàáäéçïï÷ï÷÷Úàáи­Đ|Jï÷÷ï÷÷́éñäéçäéçâï÷äéçäéçï÷÷ÁÊÔ(:-™“”̃âçïï÷̉ặ̃ç÷̃âçäéç̃âç̃âç̃ç÷Î̃ï̉ặÁÛ́µ̉âµÖë«Đë«Đëµ̉âµ̉â«Đë¥Æ̃œÆçœÆ甽̃Œ½̃{µ̃{­Îs¥Ö{­Ö{µ̃{­̃s¥Ös­Ö{­Îs­Ö{­Ös¥Ös¥Ö{­ÎÁÛ́Î̃ẩặ̉ặ̉ặ̉ặ̉ặÎ̃ï̉ặÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï½Đáµ̉â½ĐáµÖë½ĐáÁÛ́ÇÔâÁÛ́µÖëÁÛ́Î̃ï½ĐáÁÛ́½ĐáÁÛ́ÁÛ́Î̃ï½Đáµ̉âJSU*?PHp”s–µs­Ö„­Îs­ÖµÖëó÷û{µ̃{­Ös¥Ö{µ̃{­̃{­̃ïï÷µÖë{­̃{­Ö„µ̃„µ̃{µÖ„½̃„­Î{µ̃{µ̃{µ̃„µ̃{­Ö{µ̃{µ̃{µ̃„µ̃„½̃Œ½̃„µ̃{µ̃Œ½̃Œ½Ö„­̃„­Î{ Ás–µ{Œ­kŒ¥k‡•kŒ¥kŒ¥kŒ¥fv|¥¹Êµ̉âµ̉â½Đá½Đá­Î̃¥¹ÊGt¢cŒ¥­¹Ÿ²·´Å¥¹Ê¶Ä̉½ĐáÇÔâ½ĐáÁÛ́½Đá½Đ᥹ʥ¹Ê”­½¥»¥»¥»”­½”­½{ Á%lµ%lµf¦f¦f¦kœË–·Ö„½̃Œ½ÖŒµÖ–·Ö–·ÖŒ½̃„µ̃!JSUz’œ„ µ’¢¯´Å¥¹Ê­Î̃­Î̃½ĐáµÖëµ̉⥻­Î̃¥ÆÖ­ÅÓ¢¿Ô­ÅÓ­ÅÓÁÊÔ½ĐáÎ̃âÈÉÉĐ^%Öc%Öc%Đ^%Đ|Jâï÷äéçï÷÷ï÷÷ï÷÷ó÷ûï÷÷́éñï÷÷äéçÎ̃âÔÛ̃ÎĐÑÎĐÑÔÛ̃ÔÛ̃äéçäéçïï÷÷ÿÿï÷÷ó÷ûï÷÷ï÷÷äéçÎ̃âäéç̃âçäéç̃âçâï÷äéçÈÉÉÁÊÔâï÷âï÷âï÷âï÷̃âç̉ặ̉ặ̉ặÎ̃ïÁÛ́µÖëµ̉âµ̉â«Đë«Đë¥Îç¥Îç¥ÎçœÆçœÆçœÆ甽̃s¥Ö{­̃s­Ös­Ö{­̃s¥Ös­Ös­Ös­Ös¥Ö{­̃s­Ö{­Ös¥ÖÎ̃ï̉ặÎ̃ïÎ̃ï̉ặÎ̃ï̉ặ̃âçÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́ÇÔâµÖëÁÛ́Î̃âÁÛ́ÁÛ́Î̃ïÁÛ́ÁÛ́ÁÛ́µÖëµ̉âJSU%)5H_t{œ½{­̃{­Ös­Ös¥Ö{­̃{­̃s¥ÖÁÛ́Øëó{­Ös­Ö{­Ö{­̃„µ̃{µ̃̃ç÷ÁÛ́{µ̃s­ç{µ̃{­̃„µ̃{µ̃{­Ö„µ̃„µ̃Œ½̃{­Ö{­̃„µ̃{µ̃{µÖ„µ̃{µ̃ŒµÖ„½̃Œ½̃„µ̃„µ̃Œ½̃{­Î„ µsŒ­{Œ­kŒ¥d•iwk‡•z’œNsƒ¥¹Ê­Î̃µ̉â½Đá­Î̃­Î̃­ÅÓ%lµ%lµ/o§g³„¥Æ¥¹Ê­Î̃½ĐáÇÔâÎÖïÁÛ́µ̉â½Đ᥹ʴŭ¹„œ­„œ­„œ­¥»Œ­Æh™»%lµ%lµf¦f¦f¦h™»Œ­ÆŒ­ÆŒµÎ„­Î„­ÎŒµÖ{­ÖŒ½Ö*?P¥»¥¹Ê¶Ä̉­Î̃­Î̃µ̉âµÖëµ̉âµ̉✽̃¶Ä̉¢¿Ô¥¹Ê¥¹Ê¶Ä̉¶Ä̉½ĐáÇÔâÈÉÉÖc%Üg%Đ^%Đ^%Đ|Jïï÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷äéçïï÷äéçÚàá̃âçÔÛ̃ÔÛ̃̃âçäéçäéçï÷÷ï÷÷ï÷÷ó÷ûï÷÷́éñäéçÚàáÚàáÚàáÔÛ̃äéçäéçäéçÎĐѶÁ¿âï÷âï÷äéçâï÷̃âç̃âç̉ặ̉ặ̉ặÁÛ́µÖëµ̉âµ̉âµ̉â¥Îç¥ÎçœÆçœÆçœÆ̃˜ÁÖ”½ç„µ̃„µ̃s­Ö{­Ös¥Ös¥Ö{­Î{­Îs­Ö{¥Îs­Ö{­Ö{­Ös­Ö„µ̃ÁÛ́Î̃ï̉ặÎ̃ï̉ặÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ï½ĐáÎ̃âÎ̃ïÎ̃ïÎ̃ïÁÛ́ÇÔâÁÛ́ÁÛ́Î̃ïÎ̃ïÁÛ́Î̃ïÎ̃ïÁÛ́µÖëÎ̃ïµÖëµ̉â«ĐëH_t%1Z†±{­̃{­̃{­̃{­̃{­̃{µ̃s¥Ö{µ̃s­Ö{µ̃s¥ÖµÖëó÷û{­̃s¥Ö{­Ö{µ̃{­̃{­̃âï÷µÖ넵̃{µ̃{­Ös¥Ö{­Ö{­̃{­Ö{­̃„µ̃{µ̃{­Ö„­ÎŒµ̃Œ­Ö„µ̃„µ̃„µ̃„µ̃„½̃Œ½ç{µ̃{µ̃{­ÖŒ­Æ{ Á{Œ­kŒ¥iwd•d•d•kŒ¥fv|”­½­ÅÓ¶Ä̉ÁÊÔ­Î̃¥¹Ê­ÅÓ/o§%lµ1sµ1sµ1sµB{µ¥»½ĐáÁÛ́ÁÛ́½ĐáÁÛ́­Î̃¥¹Ê”­½{œµ§{Œ­„œ­„ µ{œµkŒ¥%lµ%lµ%lµf¦f¦h™»ŒµÖŒ­ÆŒ­Æ„¥½„¥½Œ­ÆŒµÎŒ½Öd•­ÅÓ½Đá½Đá½ĐáÁÛ́½Đáµ̉â¥Æ̃¥ÆÖ–·Ö´ÅŸ²·¥¹Ê´Å¶Ä̉ÁÊÔÔÛ̃и­Đ^%Đ^%Öc%Đ^%Đ|Jâï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ó÷ûï÷÷ï÷÷ï÷÷âï÷äéç̃âç̃âçäéçâï÷ï÷÷äéçï÷÷ï÷÷ïï÷ïï÷äéçÚàáÚàáÎĐÑÎĐѽĐáÚàáÎ̃ẫâçÎĐѶÁ¿ïï÷äéçâï÷̃ç÷äéçâï÷̃ç÷̃ç÷̉ặ̉ặÁÛ́ÁÛ́µ̉â¥Îç¥ÎçœÆçœÆç¥Î眽̃œÆ猵քµ̃{µ̃{­̃s¥Ös­Ös­Ö{­Ö{­̃s¥Î{µ̃s¥Ös¥Ös­Ös­Ös­ÖÎ̃ẩặÎ̃ïÎ̃ï̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÎ̃ïÎÖïÎ̃ïÁÛ́Î̃âÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ïÇÔâµÖëÁÛ́µ̉â¥ÎçJSU*?PgŒÁs¥Îs¥Ö{µ̃{­̃s­Ö{­Ös­Ös¥ÖŒ½çÿÿÿ̉ặŒµ̃„µ̃s­ç{µçÎÖïÿÿÿ”½çs¥Ö{µ̃{­̃{­̃{µ̃{µ̃{­Ö{µ̃„µ̃„­Î{µÖ{­̃{µ̃Œ­ÖŒ­Ö„µ̃Œµ̃ŒµÖŒ½̃{µ̃{µ̃ŒµÖ„µ̃„­Î{œµsŒ­kŒ¥cˆ d•d•iwkŒ¥Qdu”­½¥¹Ê–·Ö¥¹ÊÁÊÔ­ÅÓ¥¹Ê/o§1sµ1sµ1sµJ{­J{­B{½Z†±ÇÔâÎ̃âµ̉â½Đá¥ÆÖ”­Æ”­½„ µ„œ­{Œ­{Œ­{œµŒ­Æ{œ½1sµ%lµ%lµf¦f¦gŒÁŒ­Æ{œµ{¥Î„ µ„ µ„ µŒ­ÆŒµÖd•­ÅÓ­Î̃µ̉â½ĐáµÖëµÖë«ĐëœÆ̃­ÅÓ”­½”­½”­½ §¬”­½²³¶­ÅÓÁÊÔ²³¶Đ^%Öc%Đ^%Đ^%Đ|Jïï÷äéçïï÷ïï÷ïï÷äéçï÷÷ïï÷ï÷÷и­ÈÉÉ́éñäéçäéçäéçäéçï÷÷ï÷÷ïï÷ï÷÷ó÷ûó÷ûïï÷ÚàáÚàáÎĐÑÁÊÔÁÊÔÁÊÔÔÛ̃Î̃ẫâçÈÉɲ³¶âï÷ïï÷ïï÷̃ç÷ï÷÷âï÷Øëó̃ç÷̉ặ̃ç÷Î̃âÁÛ́µ̉âµ̉âµ̉â¥Îç¥ÎçœÆ̃¥Î甽ç˜ÁÖŒ½̃„µ̃„­Îs¥Ö{­̃{­Ös¥Ös­Ös¥Ö{­Îs­Ös­Ö{µ̃{­̃{­ÎÁÛ́ÎÖï̃ç÷Î̃ïÎ̃âÎÖï̉ặÎ̃ïÁÛ́̉ặÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃âÎ̃ïÁÛ́ÎÖïÁÛ́Î̃ï½ĐáÎ̃âÎ̃ïÎ̃ïÇÔâÁÛ́µ̉âµ̉âJSU*?Ps–µ{­̃s­Ö{µ̃{­̃{­̃ÁÛ́ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÛ́{µ̃{µ̃{­Ö{µ̃{µ̃Œ­ÖŒµÖ{µ̃{­̃„µ̃„­̃ŒµÖŒ½̃{­̃{­Î{­Ö„½̃„­ÎŒ½̃Œ­ÖŒµÖŒµÖŒ­Æ{¥ÎŒ­Æ{ ÁsŒ­sŒ­kŒ¥d•d•d•kŒ¥fv| §¬Œ­ÆŸ²·Œ­ÆŒ­Æ¥¹Ê¢¿Ô1sµ1sµ1sµ1sµJ{­J{­1sµZ†±½ĐáÎ̃âÁÛ́ÁÊÔÁÊÔŒ­Æ”­½{œµ{Œ­{Œ­{Œ­{œµ„œ­ŒµÖ–·ÖsœÁ1sµf¦f¦h™»{­Î{œµ{Œ­{Œ­{Œ­„ µ{œ½”±Êy‡’¶Ä̉µ̉â­Î̃µ̉â½Đáµ̉â«Đ뜽̃˜ÁÖŒ­Æ¥¹Ê”­½Ÿ²·”­½Ÿ²·¶Ä̉½Đá½Đáи­Đ|JÎZ!Đ^%Đ|Jïï÷âï÷âï÷ïï÷äéçäéçï÷÷ï÷÷÷ÿÿÇœ~ÎZ!Æ^)Çœ~Úàáï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ÿÿÿï÷÷ïï÷ÚàáÚàáÈÉÉÈÉÉÈÉÉÈÉÉÁÊÔÚàáÚàáÎ̃â%)5Ÿ²·âï÷ïï÷̃âç̃ç÷Úàáïï÷̃ç÷âï÷̃âç̃ç÷̃ç÷ÎÖïÁÛ́ÁÛ́µ̉â¥Îç¥ÎçœÆçœÆ猽̃Œ½ÖŒ½Ö{µ̃{­̃s­Ö{µÖs¥Ös­ÖsœÎ{­̃s¥Ös­Ö{µÖs¥Ö{­̃s¥ÎÎ̃ï̃ç÷Î̃ï̉ặ̃ç÷Î̃ï̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷ÎÖïÎ̃ïÎÖïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃âÁÛ́Î̃ïÇÔâÎ̃âÁÛ́ÁÛ́µÖëµ̉â¥ÎçkŒ¥8Xqs¥Îs¥Ö{µ̃”½ç̉ặÿÿÿÿÿÿâï÷Œ½ç{­̃{µ̃{µ̃{µ̃„­̃{­̃{µ̃{­̃{­̃„µ̃„­̃Œ½̃„­Î{µ̃{µ̃Œ­Ö{µ̃„µ̃„­̃{µ̃{­ÖŒµ̃Œ­Ö{µ̃{­Ö„­Î„ µsŒ­kŒ¥d•iwd•cˆ z’œfv|¥¥’¢¯„œ­§ §¬”­½”­½7v¹B{µB{½B{½B{½1sµ1sµZ†±µ̉âµ̉âµ̉â­Î̃¥ÆÖ¥¹Ê„ µ{œµsŒ­{Œ­„œ­{œµ”­½ŒµÖ–·ÖŒ½Ö˜ÁÖŒµÖZ†±gŒÁ{œµ{Œ­z’œ{Œ­kŒ¥{œµ{œµ„¥½k‡•¥Îç½Đá½Đá«Đëµ̉â¥Îç˜ÁÖœ½̃˜ÁÖŒ­Æ–·Ö”­½Ÿ²·Ÿ²·¥¹Ê¥¹ÊÁÊÔ½ĐáÎ̃âÎÖïÎ̃âи­Çœ~ïï÷ïï÷̃âçÚàáÎ̃ïÚàáäéçäéçïï÷Çœ~Đ^%Đ^%Đ^%Đ^%Çœ~÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿïï÷ÚàáÚàáÎĐÑÈÉÉÈÉÉÎĐÑÁÊÔÔÛ̃Úàá̃ç÷âï÷Úàáy‡’ §¬ï÷÷ï÷÷ï÷÷âï÷âï÷âï÷̃ç÷âï÷âï÷̃ç÷Î̃ïÎÖïÁÛ́µ̉â«Đë¥Æ̃œÆ̃”½̃œÆ碿Ԗ·Ö”½̃„­̃{µ̃{­Ös¥Ös¥Ös­Ös¥Ö{­̃s¥Î{­Î{µÖs¥Ös­Ö{­̃̉ặ̉ặ̉ặ̃ç÷̃ç÷âï÷̃âç̃ç÷̃ç÷̃âçÎ̃ïÎ̃ï̉ặ̉ặÎ̃ïÎ̃ïÁÛ́Î̃ïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́Î̃ïÁÛ́Î̃ïÁÛ́ÁÛ́µÖë¥Îç¥Îç¥Îç„¥½d•*?Ps¥Ö{µ̃„µ̃{µ̃{µ̃{­̃{­̃{­̃{µ̃{­̃{µ̃„µ̃Œ½̃{­̃{µ̃{­̃{µÖ{µ̃{­Ö„½̃Œ½̃{­̃„µ̃„µ̃„­̃{µ̃ŒµÖ{­Ö„µ̃„µ̃{­Î„­Î{¥Î„ µQdu*?PiwcŒ¥kŒ¥z’œ„œ­§ajn§„œ­z’œ{Œ­„œ­¥»”­½B{µB{µB{µB{½1sµB{½B{µZ†±½Đá­Î̃µ̉â­Î̃œ½̃˜ÁÖB{µM€²Z†±{œµ„ µ„ µ–·ÖŒ­ÆŒµÎ˜ÁÖ”½̃Œ½ÖŒµÖ„ µ{œµsŒ­kŒ¥kŒ¥kŒ¥{Œ­{œµ{ Ák‡•µ̉âµ̉âµ̉âµÖëµ̉â¥Îç ̀â¥Î癓”²³¶ÁÊÔ¥¹Ê¥¹Ê¶Á¿¥¹ÊÁÊÔ­Î̃½ĐáÇÔâÁÛ́Î̃ïäéçÎ̃ï̃âçÚàáÎ̃âÔÛ̃ÔÛ̃Úàá̃âçâï÷́éñÇœ~Đ^%ÎZ!Đ^%Đ^%Çœ~ÿÿÿï÷÷ÿÿÿïï÷ÿÿÿó÷ûï÷÷ïï÷âï÷ÚàáÎĐÑÈÉÉÈÉÉÁÊÔÈÉÉÔÛ̃Úàáäéçâï÷ïï÷ó÷û̃âç̃âçäéçï÷÷ïï÷âï÷âï÷âï÷âï÷̃ç÷̃ç÷̃âç̃ç÷Î̃ïÁÛ́ÁÛ́½Đá¥Îç˜ÁÖ”½̃”½̃”½̃”½̃Œ½̃Œµ̃s­Ö{µ̃{­Ös­Ö{­Îs­Ös­Ös­Ö{­Î{­Ös­Ö{­̃{­ÖÎ̃ï̉ặ̉ặ̃âç̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷̉ặ̃ç÷̉ặÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́ÎÖïÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́µ̉â¥ÎçœÆ甽̃Œ½̃„µ̃„µ̃{­ÖcŒ¥Nsƒ%1œÆçó÷û”½ç{µ̃”½ç̃ç÷̃ç÷œÆç{µ̃{­̃„µ̃{µ̃{µ̃{­̃s¥Ö{­̃„µ̃„µ̃„µ̃Œµ̃„µ̃{µ̃{­̃{µÖ„µ̃{µ̃{­Ö{­Ös¥Ö„­Î{­Ö{­Î{¥Î{ ÁQdu)H_tkŒ¥{œµ’¢¯¥¹Ê˜ÁÖ¥»JSUz’œ§{Œ­z’œ{Œ­„œ­’¢¯7v¹B{½B{½1sµB{µ1sµ1sµZ†±¥Æ̃˜ÁÖœÆ̃˜ÁÖ¢¿Ô”½̃Gt¢7v¹1sµB{µZ†±s–µ”±Ê–·Ö˜ÁÖ”½̃”½̃ŒµÖŒ­Æ{œ½{œµ{Œ­d•iwkŒ¥kŒ¥{œµ„¥½k‡•¥Îç­Î̃µ̉â«Đë¥Æ̃œ½̃¥Î眽̃Đ|JĐ^%Đ|J™“”²³¶­ÅÓ­ÅÓ½Đá½ĐáÁÛ́ÁÛ́ÁÛ́Î̃ï̃ç÷̃âçÚàáÎ̃âÔÛ̃ÈÉÉÎĐÑÇÔâÎĐÑäéçïï÷Çœ~Đ^%Đ^%Đ^%Đ^%и­ÿÿÿÿÿÿ÷ÿÿï÷÷ï÷÷÷ÿÿï÷÷ïï÷ïï÷äéçÚàáÎĐÑÎĐÑÁÊÔÔÛ̃ÔÛ̃äéçäéçäéçäéçï÷÷ïï÷ïï÷ï÷÷ïï÷äéçïï÷âï÷äéçâï÷âï÷âï÷̃ç÷̃ç÷̉ặÎ̃ïÇÔâÁÛ́«Đ딽猵̃”½ç”½̃”½̃Œ½çŒµ̃{µ̃{­̃{­Ös¥Ös­Ös­Ös­Ös­Ö{­̃s­Ö{¥Îs¥Ö{­Ö̉ặÎ̃ï̃ç÷̃âçâï÷̃âç̃ç÷âï÷̃ç÷̃ç÷äéç̃âç̉ặ̉ặÎÖï̉ặÎ̃ïÎ̃ï̉ặ̉ặÎ̃ï̉ặÎÖï̉ặÎ̃ïÁÛ́ÁÛ́ÁÛ́Î̃ïÇÔâÁÛ́µ̉â«ĐëœÆ̃˜ÁÖ”½̃”½̃„µ̃Œ½̃„­̃„µ̃{­̃„­̃sœÁR{Œ*?P÷ÿÿâï÷„µ̃„µ̃ÿÿÿÿÿÿïï÷ÿÿÿ„½̃{­̃{­̃{µ̃{µ̃„µ̃{­̃„­̃{µ̃{µ̃{­ÖŒµ̃ŒµÖŒ½̃ŒµÖ„µ̃„­̃{­Ö{­Ö{­Î„­Î{ Á{ Á{œµ{ Á{œµH_t8Xq„œ­´Å¥ÆÖœ½̃¥Î猵ÎQdu(kŒ¥{Œ­z’œcŒ¥k‡•„œ­¥»B{µB{µB{µ7v¹7v¹1sµ7v¹J{­–·ÖŒµÖŒµÖ´Å”­½–·ÖJ{­B{µ7v¹B{µB{µ7v¹J{­{ Á”½̃”½̃”½̃”½̃ŒµÎ„­Î{œµsŒ­kŒ¥kŒ¥k‡•kŒ¥{Œ­„¥½k‡•œÆç¥ÆÖ¶Ä̉œ½̃¢¿Ôœ½̃¥Æ̃¥Æ̃Đ|JĐ^%Öc%Öc%Æ^)Çœ~½Đá½ĐáÇÔẫâçÎ̃ïÁÛ́Î̃ï̃âçÎ̃âÔÛ̃ÔÛ̃ÁÊÔÈÉÉÈÉÉÈÉÉÎĐÑÚàáäéçÇœ~Đ^%Đ^%Đ^%Đ^%и­ÿÿÿï÷÷ó÷ûïï÷ï÷÷ïï÷ó÷ûï÷÷ïï÷y‡’²³¶ÚàáÚàáÚàáÚàáÚàáâï÷äéçäéçâï÷ïï÷ïï÷ïï÷ïï÷ïï÷ï÷÷ïï÷äéçâï÷âï÷âï÷âï÷̃âç̃ç÷Î̃âÎ̃ïÇÔâÎ̃ï«ĐëœÆ甽̃”½̃”½̃”½̃Œ½̃Œ½̃Œ½ç{µ̃{¥Î{­Ö{­Îs­Ös­Ö{­Îs­Ös¥Ö{­Ös­Ös­Ö̃ç÷̉ặäéç̃ç÷äéçäéçäéçâï÷âï÷âï÷âï÷̃âç̃ç÷̃ç÷̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃âÎ̃ïÎ̃âÎ̃ïÎ̃ïÁÛ́ÁÛ́µÖëµ̉â«ĐëœÆçœÆ̃”½̃Œµ̃{µ̃„µ̃{µ̃{µ̃s¥Ö„µ̃{­̃{µ̃{µ̃{­̃Z†±8Xq!!1ÿÿÿ„µ̃{µ̃œ½ëÿÿÿ„½̃{µ̃ïï÷µÖë{­̃{µ̃{µ̃{µ̃„µ̃{­̃„µ̃{µ̃„µ̃{µ̃{µ̃Œµ̃Œ½̃ŒµÖ{­̃{­Ö{­Ö{­Î{ Á{œµ{œµ{œµs–µs–µ{œµ8Xq*?Pd•¢¿Ô”½̃Œ½Ö˜ÁÖ¥»„œ­z’œz’œy‡’z’œ{Œ­„œ­B{µB{µB{µ7v¹B{µ1sµ1sµJ{­{œ½¥»{ Á„ µ„­ÎŒµÎGt¢B{µB{µB{µB{½1sµ1sµ/o§Œ½̃˜ÁÖ”½̃ŒµÖŒµÖ„ µ„ µ{Œ­kŒ¥kŒ¥kŒ¥kŒ¥kŒ¥{ Á!d•Œ½Ö˜ÁÖ–·ÖŒµÖŒ½Ö˜ÁÖ­ÅÓ«ĐëĐ|JÖc%Öc%Öc%Öc%¼d0ÇÔâÎ̃ïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃âÔÛ̃ÈÉɶÁ¿¶Á¿ÈÉÉÁÊÔÔÛ̃äéçÇœ~Đ^%Đ^%Đ^%Đ^%и­ó÷ûï÷÷ïï÷ï÷÷ï÷÷ï÷ïï÷÷ï÷÷ó÷û*?P(:-fv|ÈÉÉäéçäéçâï÷äéçïï÷âï÷âï÷ïï÷ïï÷ïï÷ï÷÷âï÷ï÷÷âï÷ïï÷âï÷âï÷̃ç÷̃ç÷̃ç÷̉ặÎ̃ïÎ̃âÎ̃ïµ̉â¥Îç˜ÁÖŒ½ç”½çŒ½̃Œ½ç„µ̃„­̃{­̃{­Ös­Ös­ÖsœÎ{­̃s­Ös¥Ös­Ös­Ös­Ö{­Î̉ặ̉ặ̃âç̃ç÷âï÷äéçäéçâï÷̃ç÷̃âçâï÷äéç̉ặ̃âç̃ç÷̉ặ̃ç÷ÁÛ́Î̃ï̉ặÎ̃ï̃âçÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÇÔâ½ĐáÁÛ́ÁÛ́µ̉âœÆç¥Î由ʄ¥Î{ Á{œµkœËkœËs–µs–µh™»kœËs–µh™»{œ½h™»kœËh™»h™»8Xq)̉ặ„µ̃{­̃ÁÛ́÷ÿÿ{µ̃s­Ö̃ç÷ÁÛ́{­̃{­̃{­̃{µ̃{­̃s¥Ö{­Ö„­̃„µ̃{µ̃{µ̃{­̃„µ̃{­Ö{µ̃„µ̃{­Î{ Áh™»{œµg³g³|•±kŒ¥{œµ8XqsŒ­˜ÁÖ¢¿Ô”±Ê¥»„œ­{Œ­cˆ kŒ¥kŒ¥kŒ¥{œµ7v¹B{µ1sµB{½1sµ1sµ1sµJ{­{œµs–µ{œµ{œ½s–µŒ­ÖJ{­7v¹B{µ7v¹B{½B{½1sµ/o§Œ½Ö”½̃”½̃ŒµÖŒµÖ„¥½d•fv|z’œkŒ¥kŒ¥z’œ{œµ{œµ”­½fv|%1d•ŒµÖ˜ÁÖŒ­ÆŒ­Æ”±Ê”±Ê¥ÆÖ½ĐáĐ|JĐ^%Đ^%Öc%Öc%Đ|JÁÛ́ÇÔâÎ̃ï̃ç÷Î̃ïÎ̃ï̃ç÷Î̃ï̉ặÔÛ̃ÎĐÑÈÉɶÄ̉¶Á¿ÈÉÉÈÉÉÔÛ̃Î̃âïï÷и­Đ|JĐ^%Đ^%и­ó÷ûäéçâï÷Úàá́éñÚàáäéçï÷÷ï÷÷(:-™“”ó÷ûïï÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷âï÷ïï÷âï÷âï÷âï÷ï÷÷ï÷÷̃ç÷̃ç÷̉ặ̃ç÷̃âçÎ̃âÁÛ́ÁÛ́ÁÛ́«ĐëœÆ̃”½ç”½̃Œ½ÖŒµÖ„½̃{µ̃{µ̃{­̃s¥Ö{­Ö{­̃{­Ös­Ö{µ̃s­Ö{­Ö{­̃s¥ÖÎ̃ẫç÷̉ặ̃âç̃ç÷âï÷ïï÷äéçâï÷̃âç̃âç̃âçâï÷̃âçäéç̃ç÷ÎÖï̃ç÷Î̃ïÎ̃ï̉ặ̉ặ̃âçÎ̃ïÎ̃ïÆäổặÇÔâ½ĐáÇÔâµ̉â¥Îç¥Îç¥ÎçH_t„µ̃)̃ç÷{µÖ{µ̃ïï÷ïï÷s­Ö{­̃âï÷µÖ댵Ö{µ̃s­çŒ½̃{­̃„½̃{­Ö{µ̃„µ̃{­ÖŒµÖŒ½ÖŒµÖ{µ̃{µ̃„­Îs¥Î{ Ág³g³cŒ¥kŒ¥cŒ¥cŒ¥kŒ¥JSU{Œ­œÆ̃´ÅŒµÎ„ µ{œµ§cŒ¥kŒ¥y‡’sŒ­{œµZ†±J{­1sµB{µ1sµB{µ/o§J{­|•±cŒ¥{Œ­gŒÁ{Œ­„¥Æ1sµB{µB{µ7v¹B{½1sµB{½/o§–·ÖŒµÖ–·ÖŒµÖŒ½ÖŒ­ÆiwJSUkŒ¥|•±{œµŒ­ÆŒµÖŒ½Ö ̀â„¥Æ*?P]s’Œ­Æ„œ­{œµ{œµ„ µ”­½¥¹Ê­Î̃Đ|JĐ^%Öc%Öc%Öc%¼d0ÁÛ́ÁÛ́ÎÖïÎ̃ï̃ç÷Î̃ï̃âç̃âçÎ̃ïÎ̃ïÎĐÑÁÊÔÈÉÉи­ÁÊÔÎĐÑÎ̃ẫâçäéçïï÷ÿÿÿ́éñĐ|Jи­ï÷ïâï÷ÚàáÚàáÚàáÚàáÚàáäéçï÷÷(:-™“”äéçï÷÷ï÷÷âï÷ïï÷äéçïï÷́éñïï÷âï÷âï÷ï÷÷ïï÷ïï÷äéçâï÷̃âç̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïµÖë¥Îç¥Îç˜ÁÖŒµ̃Œ­Ö{­̃ŒµÖ„µ̃s­Ö{­Ö{¥Î{­̃{­Î„­Î{¥Î{­Ö{µÖs­Ö{­̃{­̃̃ç÷̃âçâï÷äéçï÷÷âï÷ï÷÷âï÷ï÷÷âï÷äéçâï÷âï÷̃âçâï÷̃ç÷̃ç÷̃ç÷̃ç÷̉ặ̃ç÷̃âç̉ặÎ̃ïÎ̃ï̉ặÇÔâµÖëÁÛ́½Đá½Đáµ̉â¥Îç¥ÎçJSU{µ̃)ÿÿÿœ½̃”½çÿÿÿµÖë{µ̃ÁÛ́ÿÿÿ ̀âs¥Ö„½̃{­̃{­̃{µ̃Œ½Ö{­̃„µ̃„µ̃{µ̃{µ̃Œ­Ö{­̃{µ̃„½̃{µÖ{­Îh™»s–µcŒ¥d•]s’iwk‡•kŒ¥JSUŒ­Æœ½̃˜ÁÖ”±ÊŒ­Æ{œµz’œkŒ¥kŒ¥cŒ¥sŒ­{œµ{œµŒµÎ„¥ÆcŒ¥/o§/o§/o§Z†±cŒ¥d•cˆ cŒ¥cŒ¥{œµW€¡7v¹B{µB{½B{½B{½1sµ/o§„­Î–·ÖŒµÎ–·ÖŒ­ÆŒ­ÆkŒ¥!!1iwŒ­ÆŒ½Ö¥ÆÖ˜ÁÖœÆ̃œÆ̃Œ½ÖŒ­ÆŒ­ÆŒ­Æ{œµ{Œ­„ µ”­½¥¹ÊÁÊÔĐ|JĐ^%Öc%Đ^%Đ^%¼d0µ̉âÁÛ́ÎÖïÎÖïÁÛ́̃âç̉ặÚàáÎ̃âÇœ~ÈÉÉÁÊÔÎĐÑÈÉÉÁÊÔÈÉÉ̃âçÚàáïï÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ÚàáÚàáÔÛ̃ÔÛ̃ÔÛ̃ÎĐÑÚàáÚàáï÷ï%)5™“”ïï÷ï÷÷ïï÷äéçïï÷äéçïï÷äéçäéçï÷÷âï÷ïï÷̃ç÷äéçâï÷Úàáâï÷̃ç÷âï÷Î̃âÎ̃ïÁÛ́Î̃âÁÛ́µ̉â¥Î眽̃˜ÁÖ˜ÁÖ”½ç{µ̃„µ̃{­Ös­Ö{­Î{­Îs­Ös¥Ö{­̃s­Ös¥Ö{­̃{µ̃{µ̃äéçâï÷ïï÷âï÷ï÷÷̃ç÷ï÷÷÷ÿÿâï÷ï÷÷âï÷âï÷âï÷̃ç÷̃ç÷̃ç÷̃ç÷̃âç̃ç÷̃âç̃ç÷̉ặ̃ç÷ÁÛ́ÇÔâÎ̃ïÇÔâµÖëÇÔâÁÛ́ÁÛ́µ̉âµ̉âµ̉âJSUs¥Ö)̃ç÷ÿÿÿÿÿÿ÷ÿÿ{µ̃{µ̃ó÷ûÁÛ́„µ̃„µ̃{­̃{­̃s­Ö{µ̃Œ­Ö{­̃{µ̃{µ̃{µ̃{µ̃{µ̃{­̃{­̃„µ̃{­Ö{­ÎsœÁcŒ¥cŒ¥X}’d•d•d•cˆ JSU„œ­˜ÁÖ˜ÁÖŒµÖ{ ÁW€¡sŒ­z’œcŒ¥cŒ¥z’œ{œµ{œµ„­ÎŒ­ÆŒµÖ„­ÎcŒ¥/o§M€²cˆ kŒ¥k‡•d•cŒ¥{œµJ{­B{µ7v¹B{½B{½1sµB{½1sµ{¥ÆŒ­Æ”­½„­ÎŒ­ÆŒ­ÆcŒ¥fv|–·Ö¢¿Ô¢¿Ô˜ÁÖŒµÖ”­½{œµ{œµ{Œ­z’œ„ µ’¢¯¥¹Ê¥ÆÖĐ|JĐ^%Öc%Đ^%Đ^%¼d0«Đë«Đë½Đá½ĐáÁÛ́Î̃âÎÖï̃âçÔÛ̃ÎZ!Đ^%¼d0Çœ~Î̃âÎĐÑÚàáäéçÚàáï÷÷ï÷÷ï÷÷ï÷÷ïï÷äéç̃âçÚàáÎĐÑÈÉÉÁÊÔÈÉÉÎĐÑÚàáÚàá(:-™“”ó÷ûï÷÷ïï÷ïï÷ïï÷ïï÷ïï÷ï÷÷ïï÷âï÷ï÷÷ï÷÷äéçâï÷âï÷âï÷̃âçâï÷̃ç÷̃ç÷Î̃ïÁÛ́Î̃ïÁÛ́µ̉âœÆçœÆ甽̃œÆ焵̃{µ̃{µÖs­Ös¥Ös¥Ös­Ö{­̃{­Îs­Ös­Ö{­Ös¥Ös­Ö{­Îâï÷äéçâï÷âï÷ï÷÷ï÷÷âï÷âï÷ï÷÷ïï÷âï÷ïï÷äéçâï÷̃ç÷ó÷û̃ç÷âï÷̃ç÷̃âç̃ç÷̉ặ̉ặÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́µÖëµÖë½ĐáÁÛ́µ̉â­ÅÓJSU{­̃){­̃µÖë«Đ댵̃{­̃„­̃Œ½ç{­̃„µ̃{­̃{µ̃{µ̃{­Ö{­̃s¥Ö{µ̃{µ̃{­̃„µ̃Œµ̃Œ½ÖŒµÖ{µ̃{­Ö{­Ö{¥Îh™»sŒ­cŒ¥d•R{ŒR{Œ]s’d•*?P¥»Œ½ÖŒµÖŒµÖ„¥ÎB{µB{½B{µZ†±sŒ­{œµ{œµ{œ½„­ÎŒµÖŒ­ÆŒ­Æ„­Îs–µcŒ¥d•d•d•]s’kŒ¥sŒ­J{­B{½1sµB{½7v¹B{½B{½1sµ„ µ¥»{œµ„¥½„ µ„¥½kŒ¥”½̃˜ÁÖœÆ̃˜ÁÖ´ÅŒ­ÖŒ­Æ{œµ„œ­z’œ„œ­¥»”­½¶Á¿Æ^)Đ^%Đ^%Đ^%Đ^%¼d0œÆ眽̃¥Æ̃­ÅÓµ̉âÇÔâÇÔẫâçÔÛ̃ÎZ!Đ^%Öc%Đ^%¼d0Çœ~äéç̃âḉéñï÷÷ï÷÷ï÷÷ï÷÷äéçäéçÎ̃ïÚàáÎĐÑÈÉÉÈÉÉи­ÈÉÉÔÛ̃̃âç(™“”÷ÿÿï÷÷ïï÷äéçï÷÷âï÷ïï÷ïï÷ïï÷âï÷ï÷÷ïï÷âï÷̃ç÷̃ç÷̃âç̃ç÷̃âç̃âçÎ̃ïÎ̃ïÁÛ́ÁÛ́µ̉âµÖë¥Îç˜ÁÖŒµ̃”½çŒ½̃Œµ̃{­̃{µ̃{­Î{­Ö{­̃s­Ös­Ö{­Ö{­Ös¥Ös¥Ös¥Ö{­Ö̉ặâï÷âï÷äéçïï÷ïï÷ï÷÷ïï÷ïï÷ï÷÷ïï÷âï÷âï÷̃ç÷äéçâï÷äéçäéç̃ç÷̃ç÷̃âç̉ặ̃ç÷Î̃ïÎ̃ï½ĐáÁÛ́ÁÛ́µÖëÁÛ́ÁÛ́ÁÛ́µ̉â«ĐëJSU{µ̃){µ̃{­̃”½̃«ĐëµÖëœÆçs­ÖŒ­Ö{­̃{­Ö„µ̃s¥ÖŒµÖ„µ̃{µ̃„µ̃{µ̃„­̃Œµ̃„­Î„µ̃„µ̃Œ½̃{­Ö„­Î{¥Î{ ÁkŒ¥W€¡R{ŒR{Œ]s’]s’iw*?P„ µŒµÎŒµÎŒ­Æ„¥ÆB{µB{½B{µB{½1sµZ†±|•±Œ­ÆŒ­Æ„­Î„µ̃ŒµÎ{ Á{œµcŒ¥d•d•]s’d•cˆ {Œ­B{µB{µB{½B{½B{½B{µB{½J{­s–µ„œ­{œµ{œµ{œµ„ µd•œÆ̃”½̃œÆ甽̃”½̃ŒµÖ”­½¥»„œ­z’œ„œ­’¢¯”­½¥¹Ê—¢|Æ^)Đ^%Đ^%Đ^%¼d0”½̃˜ÁÖ¥¹Ê”±Ê¥¹Ê­ÅÓ½ĐáÎ̃âÔÛ̃Đ^%Öc%Đ^%Đ^%Đ^%Çœ~ïï÷äéçäéçï÷÷÷ÿÿ÷ÿÿï÷÷́éñ̃ç÷ÚàáÔÛ̃ÁÊÔ²³¶²³¶¶Á¿ÈÉÉÚàáÚàá!›¬–ÿÿÿï÷÷ï÷÷âï÷ïï÷ïï÷ïï÷ïï÷âï÷ïï÷ïï÷âï÷ïï÷âï÷̃ç÷̃ç÷äéç̉ặÎ̃ïÎ̃ïÇÔâÁÛ́µÖëµÖë­Î̃¥Æ̃œÆ̃”½̃”½çŒ½̃{µ̃{­Ö{­̃{­Ös­Ö{µ̃s¥Ös­Ö{­Ö{­Ö{­Ös¥Ö{­Ö{­̃̃âçâï÷ïï÷ïï÷ï÷÷ï÷÷âï÷âï÷ïï÷ï÷÷ïï÷ï÷÷âï÷âï÷âï÷̃âçäéç̃ç÷âï÷âï÷äéçâï÷Î̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́½ĐáµÖëµÖëÁÛ́«Đë«ĐëJSU{µ̃)”½̃̃ç÷ÿÿÿÿÿÿÿÿÿÿÿÿâï÷Œ½̃{­̃{­̃{µ̃{µ̃{µ̃s­Ö{µ̃{µ̃{­Ö{­̃{­Ö{­Ö„µ̃Œ½̃Œ½̃{­Ö{­Ös¥Î{œµkŒ¥W€¡W€¡]s’]s’]s’]s’*?P{Œ­„­ÎŒ­Æ„­Î{œ½B{µB{½B{½B{½7v¹B{µ7v¹B{µgŒÁ„­ÎŒµÖŒµÖ{ Á{œµkŒ¥d•d•]s’W€¡d•kŒ¥Gt¢7v¹B{½B{½B{µB{½B{½J{­s–µ{Œ­{Œ­kŒ¥{Œ­{œµ]s’”½̃˜ÁÖœÆ̃˜ÁÖ˜ÁÖ˜ÁÖ¥¹Ê §¬„œ­„œ­„œ­¥»Œ­Æ˜ÁÖœÆ̃˜ÁÖ™“”§wVĐ^%¼d0”½̃”±ÊŒ­Æ’¢¯Œ­Æ´Å¥¹Ê­Î̃ÁÊÔĐ^%Đ^%Đ^%Đ^%Đ^%Çœ~âï÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷äéçÚàáÎĐÑÈÉɶÁ¿¶Á¿²³¶ÈÉÉÎĐÑÔÛ̃™“”JSU›¬–÷ÿÿï÷÷âï÷ïï÷ï÷÷ï÷÷âï÷ïï÷ï÷÷ïï÷ïï÷ïï÷̃ç÷̃âçäéçâï÷̉ặÎ̃ï̉ặÎ̃ïÁÛ́µÖëµÖëµÖë«Đë¥ÎçœÆçœÆ̃„µ̃„µ̃„­̃{­̃s­Ös¥Ö{­Ös¥Îs­Ös¥Ös¥Î{­Ös¥Ös­Ös¥Î{µÖ̃ç÷̃âç̃ç÷ïï÷äéçâï÷äéçïï÷ï÷÷ïï÷ï÷÷ïï÷̃ç÷âï÷âï÷âï÷äéçäéçâï÷̃ç÷âï÷äéç̃ç÷Î̃ïÁÛ́Î̃ïÁÛ́ÁÛ́µÖë½Đáµ̉âÁÛ́µ̉âµ̉âJSU{µ̃)âï÷ó÷ûÎ̃ï«Đë«Đë̉ặ÷ÿÿó÷ûŒµ̃{µ̃„µ̃{­Ö{­̃{­Ö{µ̃{µ̃{µ̃{µ̃„µ̃„µ̃Œ½ÖŒ½̃„µ̃„µ̃{­Ö{­Î{œ½cŒ¥cˆ d•]s’R{ŒNsƒ]s’(:-sŒ­{œµ{œµ{œµsœÁ1sµB{½B{½B{µB{µB{µ1sµ1sµ/o§{­ÎŒµÖŒµÖ{ Á{œµsŒ­cŒ¥d•d•d•d•cŒ¥s–µg³M€²B{½VˆÀB{½VˆÀB{µsŒ­{Œ­kŒ¥kŒ¥z’œ{Œ­NsƒŒµ̃„½̃˜ÁÖ”½̃¢¿Ô¥ÆÖ²³¶’¢¯Œ­Æ¥»„œ­¥»Œ­Æ´Å¥ÆÖ¥Îç«ĐëœÆç”­½™“”–·Ö„¥½{ Á{œµ{œµ{œµ”­Æ¢¿Ô²³¶Đ^%Öc%Æ^)Đ^%Đ^%Çœ~ïï÷ïï÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷́éñ §¬y‡’ÈÉÉÈÉÉи­¶Á¿Đ¸­ÁÊÔÔÛ̃̃âçäéçï÷÷ÎĐÑJSU §¬÷ÿÿï÷÷ï÷÷âï÷ï÷÷ïï÷ïï÷âï÷ïï÷ïï÷âï÷ïï÷âï÷̃ç÷̃ç÷̉ặ̃ç÷Î̃ïÎ̃ïÁÛ́½Đáµ̉âµ̉âµ̉â¥Îç«Đë¥ÎçœÆ̃Œ½ÖŒµÖ{µ̃{µ̃s­Ös­Ö{­Ös¥Ös¥Ös­Ö{µ̃s­Ös­Ös¥Ös­Ös­Ö̃âç̃ç÷̃ç÷äéçäéçâï÷ï÷÷ï÷÷ï÷÷ïï÷äéçïï÷âï÷ïï÷ï÷÷âï÷âï÷ïï÷äéç̃ç÷âï÷âï÷̉ặÁÛ́ÁÛ́Î̃ïÁÛ́Î̃ïÁÛ́µ̉â«Đë«Đëµ̉âµ̉â{œµR{ŒR{ŒQduR{ŒQduHp”NsƒHp”R{ŒNsƒNsƒHp”NsƒR{ŒNsƒNsƒNsƒHp”{­̃X}’R{ŒNsƒR{Œ*?PÿÿÿœÆç„­̃{µ̃{µ̃{­̃„½̃÷ÿÿ«Đës¥Ö{µ̃{­Ös­Ö„­̃„­Î„µ̃{µ̃„½̃„µ̃{­̃Œ½ç{µ̃ŒµÖŒµÖ„­Î{¥Îs–µcŒ¥d•]s’]s’R{Œ]s’]s’(:-cˆ kŒ¥s–µ{œµ{œµ1sµB{µB{½B{µB{µ1sµ1sµ1sµ/o§{­ÎŒ­Ö„­Î{­Î{ Ás–µcŒ¥cŒ¥d•cŒ¥cŒ¥kŒ¥sœÁ{ ÁŒ­Æ{œµZ†±J{­B{½J{­sŒ­z’œiwkŒ¥cˆ kŒ¥]s’Œ½ÖŒµÎŒ½ÖŒ½Ö˜ÁÖ¥ÆÖ¥¹ÊÎZ!§wV™“”¥»{œ½”±Ê”½̃¥Îç­Î̃µ̉âµ̉âœÆ̃–·ÖŒµÎ„ µ{Œ­s–µ{Œ­„œ­¥»”±Ê²³¶Đ^%Öc%Đ^%Đ^%Đ^%Çœ~äéçïï÷äéçïï÷ï÷÷ïï÷ïï÷ïï÷syJSU™“”¶Á¿ÈÉÉÁÊÔÚàá̃âçäéçï÷÷ïï÷ÿÿÿäéç̃âçï÷÷ï÷÷ïï÷âï÷ïï÷äéçï÷÷ïï÷ïï÷ï÷÷âï÷âï÷âï÷̉ặ̉ặ̃ç÷̉ặÎ̃ïÇÔâÎ̃âÁÛ́µ̉âµ̉âµ̉â¥Îç¥ÎçœÆç¥ÆÖœ½̃Œ½̃„µ̃{µ̃s¥Ös­Ös¥Îs¥Î{µ̃s¥Îs­Ös¥Ö{­̃„­̃{­Î{­̃ÔÛ̃̃ç÷̃ç÷̃âç̃âç̃âçâï÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷âï÷̃ç÷âï÷äéçâï÷âï÷̃âç̃ç÷Î̃ïÁÛ́ÎÖïÎ̃ïÁÛ́ÁÛ́½Đá½Đáµ̉âµ̉â¥Î猽Ö{ ÁsœÁ{ Á{œ½kœËkœËh™»h™»gŒÁgŒÁgŒÁs–µgŒÁkœËgŒÁkœËh™»sœÁ{µ̃s­Ös­Ö{­̃{µ̃Î̃ï̃ç÷{­̃„µ̃{­̃„­Îs­Ö{­̃̃ç÷ÁÛ́{­̃{­̃{µ̃{µ̃{µ̃{­̃{­Ö„µ̃{­̃ŒµÖŒ½̃„½ÖŒ½̃{­̃„­Î„­Îs¥Î{œµsŒ­cŒ¥d•]s’]s’d•d•*?Pd•d•sŒ­kŒ¥cŒ¥J{­B{½1sµ1sµ1sµ1sµ/o§/o§%lµ{­Î{­ÖŒ­ÆsœÎ{­Î/o§/o§cˆ cŒ¥kŒ¥cŒ¥gŒÁ{œµ{ ÁŒ­ÆŒµÎŒ½ÖŒµÖg³J{­sŒ­kŒ¥iwd•kŒ¥cŒ¥R{Œ–·ÖŒ½ÖŒµÎ–·Ö–·Ö–·Ö”±ÊÎZ!ÎZ!ÎZ!¼d0™“”Œ­Æ˜ÁÖµ̉âÁÛ́ÁÛ́­Î̃¥Æ̃”±ÊŒ­Æ{œµ{Œ­{Œ­kŒ¥„œ­’¢¯”­½ §¬Öc%Đ^%Đ^%Æ^)Đ^%Çœ~ïï÷̃âçäéçïï÷Úàáïï÷́éñï÷÷fv|z’œÚàáÚàáÎ̃âïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷ïïï÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷âï÷âï÷âï÷âï÷âï÷âï÷Øëó̃ç÷Î̃ïÎ̃ïÎ̃âÁÛ́ÁÛ́µ̉âµ̉â«Đë¥ÎçœÆç˜ÁÖ”½̃Œ½ÖŒµÖ„µ̃{µ̃{µ̃{­Ös¥Îs¥Ös¥Ös­Ös­Ös­Ös­Ös­Ö{­Ö{­Îµ̉âÁÛ́ÎÖïÎ̃ï̃ç÷̃ç÷âï÷ïï÷ïï÷âï÷ï÷÷ïï÷ïï÷ïï÷âï÷ïï÷âï÷ïï÷âï÷̃âç̃âç̃âç̃ç÷Î̃ïÎ̃ïÁÛ́ÎÖïÎ̃ïÇÔâÁÛ́µ̉â¥Îç¥Îç¥Îç8Xq{µ̃s­çs­çs­ÖŒ½ÖÁÛ́âï÷{­Ö{­Ö{­̃{­ÖŒµÖ{µ̃âï÷ÁÛ́s¥Ö„µ̃{­̃{µ̃s­Ö{µ̃ŒµÖ„­̃„½̃„µ̃{­̃Œ½̃Œ½̃{µ̃ŒµÖ{­Î{ ÁgŒÁs–µcŒ¥d•]s’iwiwiw*?P]s’d•cŒ¥cŒ¥kŒ¥1sµ1sµ1sµ1sµ/o§/o§1sµ%lµ/o§h™»Œ½Ö{¥Î{¥Î„­Î/o§1sµ1sµ/o§J{­{Œ­{œµ{œ½„­ÎŒµÎŒµÖŒµÖŒ­Æ{œµ{œµ{Œ­kŒ¥W€¡d•d•kŒ¥Qdu„ µŒ­ÆŒµÖŒ­ÆŒ­ÆŒ½Ö¥»ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!§wV¥ÆÖÁÛ́ÇÔâµ̉âœÆ̃ŒµÖ”­½{œµ{Œ­cŒ¥§{Œ­{œµŒ­Æ §¬Öc%Æ^)Đ^%Æ^)Đ^%Đ|Jïï÷ÚàáÔÛ̃ÎĐÑÎĐÑÚàáÚàá́éñfv|JSUÚàáÎ̃âäéçäéçï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷âï÷ï÷÷âï÷ïï÷ï÷÷ïï÷âï÷ï÷÷âï÷̃âçÎ̃ïÎ̃ââï÷̃âçÎ̃ï̉ặÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â«Đë¥Î甽ç˜ÁÖ˜ÁÖ”½ç”½çŒµÖ{µ̃{­̃s­Ö{¥Îs¥Ös­Ö{¥Î„­̃s¥Ös¥Ö{­̃s­Ös¥ÖÇÔâÇÔâÁÛ́Î̃ïÎ̃ï̃âç̃ç÷âï÷ï÷÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷äéçâï÷äéçâï÷̃âç̃ç÷̉ặ̃âçÎ̃ïÎ̃ïÎ̃ï̉ặÁÛ́½ĐáµÖëµ̉âµ̉âœÆ甽çJSU!{µ̃s¥Ö{µ̃{µ̃{µ̃”½çÿÿÿ¥Îç{µ̃s­ÖŒ­Ö{­̃Œ½̃ÿÿÿ¥Î焵̃{­̃{­Ö{­̃{µ̃{µ̃{­̃„µ̃„µ̃Œ½çŒµÖŒµ̃Œ­ÆŒµÖ{­Ö{¥ÎsœÁ{œµg³d•]s’*?P]s’k‡•y‡’k‡•fv|%1R{Œd•d•d•cˆ 1sµ/o§/o§/o§/o§/o§/o§%lµ/o§h™»{­Î{œµ{œµ{­Î/o§1sµ1sµ1sµ1sµ1sµJ{­{¥Æ„­ÎŒ­ÆŒµÖŒµÖŒ­ÆŒ­Æ{œµ{Œ­iwd•]s’d•kŒ¥Qdu„¥Æ{œµ{œµŒ­Æ„­Î{¥Î¥»ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!Đ^%Đ^%™“”ÁÛ́ÇÔâµ̉â˜ÁÖŒµÖ„­Î„ µ{Œ­cŒ¥z’œsŒ­{œµ„ µ”­½§wVĐ^%Đ^%Đ^%Đ^%Çœ~ÚàáÇÔâÎĐÑÈÉÉÎĐÑÎĐÑÚàá̃âçfv|*?PäéçÚàáïï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷äéçâï÷ï÷÷ïï÷ïï÷âï÷ï÷÷âï÷âï÷âï÷̉ặ̉ặ̃ç÷̃âçÎ̃ïÎ̃ïÎÖïÁÛ́µ̉âµ̉â«Đë¥Îç¥ÎçœÆ甽̃œÆ甽̃œÆ猽ք½̃„µ̃{µ̃s­Ös¥Ö{­Îs­Ö{­Îs­Ös­Ö{­Ös¥Î{­̃µ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ï̉ặ̃ç÷äéçïï÷ïï÷ïï÷ï÷÷ïï÷̃ç÷âï÷âï÷̃ç÷âï÷̃ç÷̃ç÷âï÷̃ç÷âï÷̃âç̃ç÷Î̃ïÁÛ́µÖë«Đë ̀âœÆ猽̃„µ̃8Xqs¥Ö{­̃{­̃s¥Ö{­̃„­̃̃ç÷ÿÿÿâï÷ÁÛ́Î̃ïâï÷ÿÿÿ̃ç÷{µÖ{­̃{µ̃{µ̃{µ̃„µ̃{µ̃{µ̃„µ̃„µ̃„µ̃Œ½̃„­̃Œ½Ö–·Ö{­Î„­ÎsœÁ{œµ{œµcŒ¥cˆ !ajnkŒ¥{Œ­{œµsŒ­8XqNsƒR{ŒR{Œd•W€¡%lµf¦%lµf¦f¦f¦%lµf¦/o§s–µs¥ÎsœÁsœÎ{¥Î1sµ1sµ1sµ1sµ1sµB{µB{½B{½Z†±{­ÎŒ½ÖŒµÖ„­Î{œ½{Œ­kŒ¥d•iwd•d•d•H_t„ µkŒ¥{œµ{œµ|•±{œµ{ ÁÎZ!ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!Đ^%—¢|ÁÛ́½Đá­Î̃”½̃–·Ö„¥½„¥Æ{œµ{Œ­sŒ­{œµ{œµ”­½œµ̃¥ÎçÎĐÑÇœ~Đ|JĐ^%Đ|JÔÛ̃ÎĐÑÁÊÔÈÉÉÈÉÉÈÉÉÈÉÉÚàáfv|JSUäéçïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷äéçï÷÷ï÷÷ïï÷äéçïï÷äéçï÷÷ïï÷ï÷÷ïï÷̃ç÷âï÷̃âçØëó̃âçÎ̃ïÁÛ́Î̃ïÇÔâÁÛ́µ̉â«Đë¥Î眽̃œÆç˜ÁÖœÆçœÆ猽̃„µ̃Œ½̃{µ̃s¥Ö{­Ö{¥Îs¥Ö{­Ös­Ö{µ̃{­Ös­Ö„­Îs­Ö½Đá«Đë¥Îç«Đëµ̉âµ̉âÎ̃âÎ̃ï̉ặâï÷âï÷ïï÷âï÷ïï÷̃ç÷̃âç̉ặ̃ç÷âï÷âï÷̃âç̃âç̃ç÷̃ç÷̃ç÷Î̃ïÎ̃ï½ĐáÁÛ́¥ÎçœÆ甽̃Œ½̃„µ̃*?P{µ̃{­̃{­̃„µ̃{µ̃{µ̃{µ̃̉ặÿÿÿÿÿÿÿÿÿÿÿÿ̉ặŒ½ç{­Ös­Ö„­Î{­Ö„µ̃{­̃{µ̃Œ½̃{­Ö„µ̃{­Ö{µ̃ŒµÖ{­ÖŒ­ÆŒ­Æ{ Ás–µ|•±kŒ¥cŒ¥k‡•*?PkŒ¥„ µŒ­Æ{œµQdu(:-]s’R{Œ]s’]s’W€¡f¦f¦f¦%lµf¦%lµf¦/o§f¦kŒ¥kŒ¥h™»{œµs¥Î1sµ1sµ1sµ1sµB{µB{½B{µB{½B{µ\•¿ŒµÖ„­ÎŒ­ÆŒ­ÆQdufv|kŒ¥kŒ¥d•d•k‡•k‡•%)5{Œ­kŒ¥cŒ¥kŒ¥kŒ¥|•±{œ½ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!Đ^%—¢|ÁÛ́½Đá¥Æ̃˜ÁÖ–·ÖŒ­Æ„œ­§„ µ{œµ„ µ’¢¯´Å˜ÁÖ½ĐáµÖëâï÷́éñи­Đ¸­ÇÔâÈÉɶÁ¿²³¶²³¶¶Á¿ÈÉÉÎĐÑfv|*?Pï÷÷ï÷÷́éñï÷÷ï÷÷ó÷ûï÷÷ïï÷äéçó÷ûäéçó÷ûïï÷ïï÷âï÷ï÷÷âï÷âï÷âï÷âï÷̃âçâï÷̃ç÷Î̃ïÎ̃ïÎÖïÎ̃âÁÛ́ÁÛ́½Đáµ̉â«Đë¥Îç¥Î甽̃œÆ甽甽甽̃Œ½̃{µ̃{­̃s­Ö{­Ös¥Ös¥Ös­Ös¥Ös­Ö{­̃s­Ös¥Ö{­̃¥ÎçœÆçœÆçœÆç ̀â¥ÎçµÖëÁÛ́Î̃ï̉ặ̃âçï÷÷âï÷ïï÷̃âçâï÷̃âç̉ặ̃âç̃âç̃ç÷âï÷̃ç÷Î̃âÎ̃ï½ĐáÁÛ́µ̉â¥Îç¥Î甽̃Œ½̃ŒµÖ„µ̃*?Ps¥Ö{µ̃s­ç„µ̃„µ̃{µ̃{µ̃{­Ö„µ̃¥ÎçœÆ焽̃„µ̃Œ½̃{­Ö{µ̃{µ̃{­̃{­̃„µ̃{­̃„µ̃{­Ö„µ̃„µ̃„µ̃„µ̃{­Î{ Á„¥Æ{œµsŒ­sŒ­cŒ¥kŒ¥kŒ¥(:-d•„¥Î{œ½|•±R{Œ*?PNsƒR{Œ]s’]s’R{Œf¦f¦f¦f¦f¦f¦f¦f¦f¦cˆ cŒ¥kŒ¥cŒ¥g³1sµ1sµ1sµ1sµ1sµ7v¹B{µB{½M€²s–µŒµÖ{­ÖŒ­Æ„­Î*?P)JSUd•d•kŒ¥{œµ„œ½sŒ­JSU{Œ­{Œ­d•d•cˆ sŒ­sŒ­ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!Đ^%—¢|½Đá«Đë˜ÁÖŒ½Ö”½̃ŒµÖ—¢|Öc%§wV™“”Œ­Æ”­½¥¹Ê­ÅÓ½ĐáÎ̃ïÚàáï÷÷âï÷äéçÎĐÑÈÉɲ³¶ §¬²³¶²³¶ÈÉÉÎĐÑajn*?Pï÷÷ï÷÷ïï÷ï÷÷ï÷÷âï÷ï÷÷ï÷÷äéçïï÷âï÷ï÷÷äéçäéçïï÷ïï÷ïï÷âï÷âï÷âï÷äéç̃âç̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́µ̉âÇÔâµ̉â¥Îç ̀✽̃œÆ甽̃œÆ̃„½̃Œ½Ö„µ̃s¥Ö{­Ös­Ös­Ö{­Ös¥Ös­Ö{­Ös¥Ö{­̃s­Ö{­Ös­ÖœÆ甽̃”½çŒ½Ö”½̃¥Îçµ̉âµÖëµ̉âÁÛ́̉ặ̃ç÷̃ç÷̃ç÷̃ç÷̉ặÎ̃ï̉ặÎ̃ïâï÷äéçäéç̃ç÷Î̃ïÎ̃ïÁÛ́µ̉â«Đë¥Î甽̃„½̃Œ½̃ŒµÖ„­̃*?P{µ̃{­̃{­̃s¥Ö{µ̃„µ̃s¥Ö„µ̃{­̃„µ̃s­Ö{µÖ{­̃âï÷ ̀ℵ̃{µ̃„­̃{µ̃Œ½̃ŒµÖ„µ̃{­Ö„µ̃„µ̃„­̃Œ½̃Œ­Æ„ µ{œµsŒ­|•±g³kŒ¥cŒ¥cŒ¥)Qducˆ sŒ­cˆ ]s’R{Œ]s’d•Hp”f¦f¦f¦f¦%lµf¦f¦f¦f¦d•cˆ cŒ¥cŒ¥kŒ¥/o§1sµ1sµ1sµ1sµB{½B{µVˆÀM€²Z†±ŒµÎ{ Á„­Î„ µ*?P*?PQdu„œ­{œµ„ µŒ½ÖŒ­ÆQdu!!1z’œkŒ¥d•W€¡d•kŒ¥{Œ­ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!Đ^%—¢|½Đá¥ÆÖŒ½ÖŒ½ÖŒ½ÖŒµÖ—¢|Öc%Öc%Öc%¼d0™“”¥¹Ê½ĐáÇÔẫâçï÷÷ï÷÷äéç̃âçÎĐÑÈÉɲ³¶²³¶ §¬Ÿ²·¶Á¿ÎĐÑajn*?Pó÷ûï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ïï÷âï÷äéçäéçâï÷äéçâï÷âï÷âï÷âï÷̃âçÎ̃ï̉ặ̉ặÇÔâÁÛ́µÖëµ̉â½Đá½Đá«Đë¥ÎçœÆçœÆ̃”½̃”½̃„½̃Œµ̃„µ̃{µ̃s¥Ös¥Ö{µÖs­Ö{­Îs­Ö{­Ö{­Ös­Ös­Ö{­Ös­Ös­Ö¥Î甽ç{µ̃Œ½Ö„µ̃Œ½̃œÆçœÆç¥ÎçÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷̃âç̉ặ̃ç÷Î̃ïÎ̃âµÖë«Đë˜ÁÖ˜ÁÖŒµ̃Œ½ç{­Ö{µ̃„­̃8Xq*?P8Xq{­̃s¥Ö„­̃{­̃{µ̃{µ̃¥ÎçœÆç¥ÆïœÆç ̀âœÆçœÆçïï÷µÖ딽̃„½̃{µ̃{­̃Œ½çŒ½̃{­Ö„µ̃„½̃Œ­Ö„µ̃Œ­Æ{ Á{œµ{Œ­kŒ¥kŒ¥kŒ¥kŒ¥kŒ¥{Œ­H_td•fv|]s’]s’]s’d•Gt¢Gt¢/o§f¦f¦f¦f¦f¦f¦X}’W€¡X}’]s’cŒ¥/o§1sµ1sµ1sµ1sµ1sµB{½B{½B{µcŒ¥{ Á„¥Æ{ Á{œ½*?P)ajn{¥ÆŒµÖŒ½ÖŒ½̃ŒµÖkŒ¥*?Pz’œd•d•d•kŒ¥kŒ¥’¢¯ÎZ!ÎZ!ÎZ!ÎZ!ÎZ!Đ^%Đ^%—¢|­Î̃–·Ö”µâ”±Ê”µâ–·Ö—¢|Üg%Öc%Üg%Üg%Öc%Đ^%§wVÎ̃ẫç÷ïï÷ï÷÷âï÷ÚàáÎĐÑÈÉɲ³¶Ÿ²·Đ¸­²³¶²³¶ÎĐÑajnJSUó÷û÷ÿÿï÷÷ï÷÷ï÷÷ïï÷äéçï÷÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ïï÷âï÷âï÷âï÷̃âçØëó̉ặäéç̃ç÷̉ặÎÖïÎ̃ïÁÛ́ÇÔâµÖëµ̉âÁÛ́µ̉â«Đë¥Îç¥Î甽猵̃„µ̃{µ̃„­Î{­Ös­Ös­Ös¥Ö{­Ö{­Ö{­Ö{­̃s­Ös­Ö{­Ös­Ö{­Ö{­̃œÆ猵̃Œ½̃„µ̃Œ½̃{­̃”½̃œÆç˜ÁÖ¥Îçµ̉âÎ̃âÎ̃âÎ̃ïÁÛ́ÁÛ́ÎÖïÁÛ́Î̃ï̉ặÎÖï̉ặÎ̃ïÎ̃ïÁÛ́µ̉â¥Î甽猽̃„µ̃„­̃Œ½Ös¥Ö{µ̃{µ̃{­̃„­̃{µ̃{­̃s¥Ö{­̃„­Î{µ̃s­Ö„µ̃{­̃s¥ÖNsƒ)s­Ös¥Ös­Ö{µ̃{µ̃s­ÖœÆçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïï÷Œ½̃{µ̃Œ½Ö{µ̃„½̃„µ̃{µ̃„µ̃Œ½ÖŒ­ÆŒ­Æ{œµ{œµkŒ¥cŒ¥k‡•kŒ¥kŒ¥kŒ¥JSUcˆ *?PR{Œ]s’cˆ cŒ¥|•±|•±J{­/o§f¦f¦f¦f¦R{ŒR{ŒR{ŒX}’W€¡/o§1sµ1sµ1sµB{½B{½B{½B{½VˆÀZ†±h™»h™»{œµ{œµ%)5JSU„­Î–·Ö–·Ö{œµŒ­Æz’œkŒ¥iwk‡•kŒ¥kŒ¥¥»ÎZ!ÎZ!ÎZ!ÎZ!Đ^%Đ^%Đ^%§wV–·Ö”­½”­½Œ­ÆŒ­Æ–·Ö—¢|Üg%Üg%Üg%Üg%Öc%Üg%Đ^%ÈÉÉâï÷ïï÷ïï÷́éñÚàáÎĐÑÈÉɲ³¶ §¬Ÿ²·Đ¸­¶Á¿ÈÉÉfv|JSUïï÷ï÷÷ï÷÷ï÷÷âï÷âï÷ïï÷ï÷÷ïï÷äéçïï÷âï÷âï÷ïï÷âï÷âï÷âï÷̃âç̃ç÷̃ç÷̉ặÁÛ́̉ặÁÛ́ÇÔâÇÔâÁÛ́µÖëµ̉âµ̉âµ̉â¥Îç¥ÎçœÆ甽猵̃{µ̃”½çs­ç{µ̃„­Î{µ̃s¥Î{­Ö{­̃s¥Î{¥Î{¥Îs¥Ö{­Ös¥Ös­Ös­Ö­Î̃Œ½̃Œ½ç„µ̃{­̃Œ½çŒ½̃Œ½̃”½̃¥Îç¥ÎçÇÔâÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëÁÛ́ÁÛ́ÁÛ́µ̉â­Î̃œÆ猽̃”½̃„½̃{­̃{µ̃{µ̃{µ̃s­ç{­Ös¥Ös¥Ö{µ̃{­̃{­̃{­̃{­̃{­̃{µ̃{µ̃{µ̃s­Ö*?Ps­Ö{­̃s¥Ö{­̃{µ̃„­̃{­Ö{µ̃{µ̃„½̃{µ̃Œ½Ö{­Îâï÷¥Æ̃”½çÿÿÿ¥Î猽֌­ÖŒ½Ö„½̃Œ½Ö{µ̃ŒµÎŒµÖŒ­ÆŒ­Æ{œµ{Œ­kŒ¥cŒ¥d•iwiwkŒ¥8Xqz’œ8XqkŒ¥kŒ¥gŒÁ{­Î{­ÎsœÁ/o§f¦f¦R{Œ]s’R{Œ]s’d•/o§1sµ1sµ1sµ1sµ1sµB{½Z†±VˆÀZ†±kŒ¥sŒ­{œµ{œµ*?PsŒ­Œ½ÖŒ­Ö{¥Î{œµ{Œ­iwkŒ¥d•iw{Œ­{œ½Đ^%ÎZ!ÎZ!ÎZ!Đ^%Đ^%Đ^%§wV¥¹Ê §¬¥»{œµŒ­ÆŒµÎ—¢|Öc%Üg%Üg%Üg%Üg%Üg%Öc%ÎĐÑïï÷ïï÷ïï÷äéçÚàáÈÉÉajn¶Á¿Đ¸­Đ¸­²³¶ÈÉÉÈÉÉÚàáäéçz’œJSUÿÿÿï÷÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷âï÷ïï÷âï÷ïï÷̃ç÷ïï÷âï÷âï÷̃ç÷̃âç̃ç÷̃ç÷Î̃ï̃ç÷ÎÖïÎ̃ïÁÛ́½Đáµ̉âÁÛ́µ̉âµ̉âµ̉âµ̉âœÆç ̀┽̃”½̃{µ̃{µ̃s¥Ö{­̃{­̃s¥Ös¥Ös¥ÖsœÎ{­Îs­Ös¥Ös­Ös­Ös­Ös¥Ös¥Î˜ÁÖ”½̃Œµ̃„µ̃„­̃Œ½̃„µ̃{­̃”½̃”½ç¥Îç«Đë«ĐëµÖë½Đáµ̉âÁÛ́ÁÛ́µ̉âµÖë«ĐëÇÔâµÖëµ̉â¥ÎçœÆ甽̃”½̃„µ̃„µ̃{µ̃Œ½Ö{­̃s¥Ö{­̃s¥Ös¥Ös­Ös­Ös­Ös­Ös­Ö{­̃{µ̃{µ̃s¥Ö{­̃s­Ös­Ö{µ̃{­Ös¥Ö{µ̃{­Ö{µ̃{­Ö{µ̃{­̃{­Ö{µ̃{µ̃âï÷œÆç{µÖ̃ç÷Î̃ï{µ̃Œ­Ö„­̃Œ½Ö„µ̃„µ̃Œµ̃ŒµÖŒ½Ö{œµ{œµ{Œ­d•iwd•d•iwiwJSUkŒ¥*?Ph™»{­Î{¥Î{œµ|•±cŒ¥Hp”]s’NsƒR{ŒR{Œ]s’/o§%lµ1sµ1sµ1sµJ{­B{½B{½VˆÀGt¢kŒ¥cŒ¥d•kŒ¥*?P|•±ŒµÎŒ­ÆŒ­Æ{œµ{Œ­z’œd•kŒ¥cˆ {Œ­’¢¯¥»§wVÎZ!Đ^%Đ^%Đ^%Đ^%§wV §¬z’œ„œ­{œµ{œµŒ­Æ—¢|Üg%Đ^%Üg%Üg%Üg%Üg%Öc%ÈÉÉäéçäéçäéçâï÷ÚàáÈÉÉ(:-™“”ÈÉÉÈÉÉÎĐÑÚàáäéçäéçï÷÷¶Á¿%)5(:-ï÷÷ï÷÷ïï÷ï÷÷âï÷ïï÷äéçâï÷ïï÷äéçïï÷âï÷âï÷âï÷âï÷̃âçâï÷̉ặ̃ç÷̃ç÷Î̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́½Đáµ̉âµ̉â«Đëµ̉â¥ÎçœÆçœÆçœÆ电⌵ք½̃s­Ös¥Ö{­Ös¥Îs­Ös¥Ös­Ös¥Ö{­Îs¥Îs¥Ös¥Ös¥Ö{­Î{­Ö{¥Î¥ÎçœÆ猽̃{µ̃ŒµÖ„µ̃„µ̃Œ½̃Œ½Ö„µ̃”½̃¥Îç ̀â¥Îçµ̉âÁÛ́ÁÛ́µ̉âµ̉âµ̉âµÖëÇÔâµ̉â½Đá¥ÎçœÆç˜ÁÖŒ½̃Œ½̃Œ½̃{µ̃s­Ö{­̃{µ̃kœËZ†±Z†±g³Z†±Z†±kŒ¥Z†±Z†±Z†±cŒ¥Z†±X}’%1d•{µ̃{­̃s­ç{µ̃{­̃{µ̃„µ̃{­̃{µ̃s­Ö{µ̃s¥Öâï÷ ̀â{µ̃âï÷µÖ넵̃{µ̃„­̃„µ̃Œµ̃Œµ̃Œ½̃Œ½ÖŒ­ÆŒ­Æ{œµ{Œ­kŒ¥iwiwNsƒ]s’d•JSUz’œ%1H_t{œ½|•±g³cˆ ]s’R{ŒR{ŒR{ŒR{Œ/o§1sµ1sµ1sµ1sµ1sµB{½B{½VˆÀGt¢d•d•d•iw)9sŒ­Œ½ÖŒµÎ„­Î„œ­{œµ{Œ­kŒ¥z’œ{Œ­„œ­ §¬”­½–·Ö˜ÁÖ™“”§wVĐ^%Đ^%§wV{Œ­z’œkŒ¥kŒ¥sŒ­{œµ—¢|Üg%Üg%Öc%Öc%Üg%Üg%Öc%ÈÉÉÚàáÚàáäéç̃âçÚàáÎĐÑ!ajn²³¶äéçïï÷äéçïï÷ï÷÷ï÷÷̃âçï÷÷ï÷÷ï÷ïâï÷ïï÷ï÷÷ï÷÷ïï÷ïï÷âï÷âï÷âï÷âï÷̃âçâï÷̃ç÷̃âç̃âç̃âç̉ặÎ̃ïÎ̃ïÁÛ́ÇÔâ½Đáµ̉âµ̉âµ̉âµ̉â¥Îç¥Îç¥ÎçœÆ̃”½̃Œ½̃Œµ̃{µ̃„­Î{­̃{¥Îs­Ös­Ös­Ös­Ös¥Ös­Ös­Ös­Ös­Ö{­Ö{­Ö{µ̃{­Ö¥Îç¥Î焵̃ŒµÖ„µ̃Œ½̃„µ̃Œ½̃Œ½ÖŒ½ç”½̃œÆ̃œÆçœÆç¥Îçµ̉â«Đëµ̉âµ̉âµÖëµÖëµ̉â«ĐëÁÛ́¥Î甽猽̃„½̃„µ̃{µÖ{µ̃{­̃{­̃{µ̃*?P8Xq{µ̃{­̃{µ̃{µ̃{­̃{­̃œÆç«Đë ̀â¥Îç«Đë«Đëïï÷ÁÛ́«Đ딽̃„µ̃„µ̃{µ̃„µ̃„µ̃„µ̃Œ½̃ŒµÖŒ½ÖŒµÎŒ­Æ{œµkŒ¥kŒ¥iwd•fv|]s’iw*?PkŒ¥*?PR{Œd•]s’R{ŒR{ŒNsƒ]s’/o§1sµ1sµ1sµ7v¹B{µB{½B{½VˆÀGt¢R{Œ]s’R{Œd•%1s–µ–·ÖŒ½ÖŒ­Æ{ Á§wV§wVy‡’{Œ­„œ­„œ­„ µ„­ÎŒµÎ–·ÖœÆ眽̃´Å§wV§wV{Œ­kŒ¥kŒ¥sŒ­z’œ{œµ—¢|Üg%Üg%Üg%Üg%Üg%Üg%Öc%²³¶ÇÔâÚàáÎ̃âÚàáÔÛ̃ÎĐÑ*?PÎĐÑï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷âï÷âï÷âï÷ïï÷âï÷âï÷âï÷äéç̃âç̃ç÷âï÷äéçäéç̉ặ̃ç÷̉ặÎÖïÎ̃ïÎ̃ïÁÛ́ÁÛ́µ̉âµÖëµ̉âµ̉âµ̉âœÆçœÆç¥ÎçœÆ̃”½̃„µ̃„µ̃{µ̃s¥Ös­Ös­Ös­Ös­Ös¥Ö{­̃s¥Îs­Ö{­Ös¥Î{­Îs¥Ö{­Ö{­Ös¥Ö­ÅÓ¥Î甽̃„µ̃„µ̃„½̃Œ½̃Œ½̃”µâ”½̃”½̃”½çœÆ̃˜ÁÖ¥Îçµ̉âµ̉âµ̉âµ̉âµ̉âµ̉âµ̉âµ̉âµ̉â ̀â˜ÁÖŒ½çŒ½̃{­Ö„µ̃„µ̃{­̃„µ̃{µ̃*?P8Xq{µ̃s­ç{µ̃{­̃{­̃ïï÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÖ댵Ö{­̃{µ̃Œµ̃„½̃Œµ̃Œ½̃”½̃ŒµÖŒ­ÆŒ­Æ{œµ{Œ­kŒ¥d•]s’]s’]s’iw*?PkŒ¥R{ŒNsƒ8XqR{ŒR{Œ]s’W€¡Z†±J{­/o§1sµ7v¹B{µB{½M€²X}’]s’NsƒNsƒ]s’%)5s–µŒµÖŒ½Ö„­ÎŒ­Æ¼d0Đ^%Æ^)§wVy‡’„ µ{œµŒ­Æ”±ÊŒ½ÖŒ½Ö¢¿Ô–·ÖŒ­Æ{œµkŒ¥z’œk‡•k‡•kŒ¥{œµ§wVÜg%̃p.Üg%Üg%Üg%Üg%̃p.²³¶ÈÉÉÈÉÉÎĐÑÎĐÑÎĐÑÈÉÉÈÉÉï÷÷äéçï÷÷÷ÿÿï÷÷ïï÷ïï÷ç÷ïâï÷ïï÷ïï÷ïï÷âï÷äéçäéç̃ç÷âï÷âï÷̃ç÷̃âç̃ç÷̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́½ĐáÁÛ́µ̉â«Đë«Đë¥Îç¥ÎçœÆ甽甽̃„µ̃{µ̃{µ̃s¥Ö{­Ös¥Ö{­Ös­Ös­Ös­Ös­Ö„µ̃s­Ös­Ös¥Ös­Ö{­Ö{­Ö„­Î¥ÎçœÆçœÆ焵̃{µ̃„µ̃„µ̃Œ½̃Œ½̃Œ½̃”½̃œÆçœÆçœÆç¥Îç¥Îçµ̉â«Đë«Đëµ̉âµ̉â½Đáµ̉â¥Îç¥Î甽猽̃„µ̃{­̃{µ̃{µ̃{µ̃{µ̃s¥Ö*?PX}’s¥Ö{­̃{µ̃{µ̃µ̉âÿÿÿµÖë«Đë«Đë«Đë«Đë¥Îçïï÷ÇÔâ«Đ댽̃„µ̃Œµ̃„½̃„µ̃„µ̃„µ̃Œ½̃”½̃Œ½Ö–·ÖŒ­Æs–µ{Œ­cˆ d•d•]s’]s’]s’*?Pd•Qdu*?P!8XqNsƒcˆ kŒ¥s–µ{¥ÆZ†±J{­B{µB{½VˆÀGt¢R{Œ]s’Nsƒ]s’!!1{Œ­ŒµÎ”±ÊŒ­ÆŒµÎ¼d0Đ^%Đ^%Đ^%Đ^%¼d0™“”Œ­Æ–·ÖŒ½ÖŒ½Ö”½̃Œ­Ö¥»{œµ|•±cŒ¥iwd•z’œ„œ­§wṼp.Üg%Üg%ç{1̃p.Üg%̃p.и­²³¶¶Á¿¶Á¿¶Á¿ÁÊÔÈÉÉÎĐÑäéçïï÷ï÷÷ï÷÷âï÷ï÷÷äéçâï÷âï÷âï÷âï÷̃âçäéçâï÷̃ç÷̃ç÷̃ç÷̉ặ̃âç̉ặ̃âç̉ặ̉ặÎ̃ïÎ̃ïÇÔâµÖëÇÔâµÖëµÖë½ĐáµÖë«Đë¥Î眽̃˜ÁÖ”½ç”½̃Œ½̃Œ½Ö„µ̃{µ̃{µ̃s¥Ös­Ös­Ös¥Ös­Ö{­Ös¥Ö{­̃s¥Ös­Ös­Ö{µÖ{­Ö{­̃s­ÖœÆ甽̃”½çŒ½̃„½̃„µ̃Œ½ÖŒ½̃Œ½̃”½ç”½̃œÆçœÆ̃œ½̃¥Îç¥ÎçœÆç¥Îç¥Îçµ̉âµ̉âµ̉â«Đë¥ÎçœÆ猽猽քµ̃{­̃{µ̃{­̃{­Ö{­Îs¥Ö*?PsœÁ{µ̃„­Îs¥Ös­çÁÛ́̃ç÷{µ̃„­Î„µ̃s¥Ö{µ̃„­̃âï÷¥Æ̃{­̃„µ̃{µ̃„­̃Œ½̃Œ½̃Œ½̃Œµ̃Œ½̃„µ̃”½̃ŒµÖ{œµ{œµ{Œ­kŒ¥d•]s’d•R{Œd•*?Pcˆ Qdu*?P*?Pcˆ {œµ{¥Î„­Î{­ÎkŒ¥J{­B{µGt¢R{ŒNsƒR{ŒR{Œ%1sŒ­¥»„­ÎŒµÖ”½̃¼d0Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%ÎZ!—¢|”­ÆœÆ̃œÆ由ʌ­Æ{œµcŒ¥cˆ d•y‡’kŒ¥’¢¯—¢|Üg%̃p.̃p.̃p.ç{1ç{1äC²³¶´Å²³¶²³¶²³¶¶Á¿ÈÉÉÈÉÉï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷âï÷âï÷âï÷âï÷âï÷̃ç÷̃ç÷̃ç÷̃ç÷äéç̉ặ̃âç̃âçÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́µ̉âµ̉âµ̉â¥Îç«Đë¥ÎçœÆ甽̃”½̃”½̃„µ̃„µ̃„­̃{­Ö{¥Î{­̃s¥Î{µ̃s­Ös­Ö{µ̃s¥Îs¥Î{­Ös¥Ös­Ö{­Ös¥Ö{­̃¥Îç«ĐëœÆ猵ք½̃ŒµÖŒµ̃Œ½̃˜ÁÖ”½̃œÆ̃œÆ̃œÆçœÆ̃œÆçœÆç¥Îç¥Îçµ̉âµ̉âµ̉âµÖë¥ÎçœÆ̃œÆ甽焵̃{µ̃„µ̃s­Ö{­Ö{­̃s­Ö{­Ö*?P%)5„µ̃{µ̃s­ç{µ̃{µ̃µÖë̉ặ{­̃{­̃{­Ö{­̃Œ½Ö{­̃«Đ댽̃{µ̃{­Ö„µ̃Œ½̃Œ½̃”½çŒµ̃„½̃”½çœÆç–·Ö´ÅŒ­Æ{œµ{Œ­z’œk‡•d•d•R{Œiw*?PR{Œ8Xq*?P*?P{œ½Œ­Æ{œµkŒ¥cŒ¥X}’R{ŒR{ŒNsƒNsƒNsƒ!z’œ{œµ{ Á §¬Œ½Ö¼d0Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Öc%—¢|œ½̃­Î̃¥ÆÖ §¬„¥Æ{Œ­y‡’kŒ¥k‡•sŒ­„œ­Ÿ²· §¬Đ|J̃p.ç{1äCäCäC §¬ §¬Đ¸­²³¶ §¬¶Á¿²³¶ÈÉÉï÷÷ïï÷÷ÿÿïï÷ïï÷ïï÷âï÷âï÷ï÷÷̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷̃âç̃ç÷̃ç÷̃ç÷Î̃ï̃ç÷̉ặÎ̃ï̉ặÁÛ́Î̃âÁÛ́½ĐáÎÖïµ̉âµ̉âµ̉âµÖë¥ÎçœÆç¥Îç˜ÁÖœÆ̃”½̃Œµ̃Œ½̃Œ½̃{µ̃s¥Ös¥Ös­Ö{­Ös­Ös¥Îs­Ös¥Ö{­Î{­Î{µ̃s­Ös­Ös¥Ö{­Îs¥Ö¥ÎçœÆçœÆ̃”½̃˜ÁÖŒ½̃Œ½çŒ½̃Œ½ÖœÆçœÆçœÆçœÆ̃œÆçœÆç¥Îç¥Îç¥ÎçÁÛ́½Đáµ̉âµ̉â«ĐëœÆ̃Œ½̃”½ç„½̃Œ½̃{­̃{­̃s¥ÖŒ­Ös¥ÖsœÎ*?PkœË{µ̃s¥Ös¥Ös­Ö{µ̃s¥Ös¥Ö{­̃„µ̃{µ̃{µ̃Œ­Ö{µ̃{µ̃{µ̃„½̃{µ̃„½̃Œ­Ö{­Î{µ̃{­̃Œ½̃”½çŒµÖ–·ÖŒµÖ{œµ{œµ{Œ­{Œ­kŒ¥iwiwd•iw)%)5R{Œd•*?P{œµ{œµkŒ¥d•R{ŒR{ŒNsƒNsƒ]s’!cˆ kŒ¥{œµ{Œ­{­Î¼d0Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Öc%—¢|«Đë½ĐáœÆ̃¥¹ÊŒ­Æ{œµ™“”z’œkŒ¥z’œ’¢¯”­½¶Ä̉ÁÊÔÎÖïи­̃p.äCäC™“”²³¶ §¬™“”Ÿ²· §¬²³¶ÎĐÑï÷÷ïï÷ïï÷âï÷äéçïï÷ï÷÷âï÷âï÷̃ç÷âï÷̃ç÷̉ặÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃âÎ̃ï̃ç÷̃ç÷ÁÛ́Î̃ïÎ̃âÁÛ́½ĐáÎÖïÁÛ́µ̉âµ̉âµ̉â¥Îç¥Îç¥Îç˜ÁÖœÆç¥Î甽猽֌µ̃{µ̃Œ­Ö{µ̃s¥Ö{µ̃{¥Ös¥Ös­Ös­Ö{µ̃s­Ös­Ös¥Îs¥Ö{µÖ{µÖs¥Ös­Öµ̉â«Đë˜ÁÖ”½ç˜ÁÖ”½̃Œ½̃Œµ̃˜ÁÖ”½̃˜ÁÖ¥Îç¥Îç«Đë«Đëµ̉âµ̉â¥Îçµ̉âµ̉âµ̉â¥ÎçœÆç¥Î甽猵֌µ̃„µ̃s¥Ös¥Ös¥Ös­Ö{­̃{­̃8Xq8Xqs¥Î{­̃{­̃s¥Ö{µ̃{­̃{µ̃{µ̃{µ̃{µ̃{µ̃s¥Ö{µ̃{µ̃ ̀ââï÷µ̉⌽̃„µ̃{­Ö{µ̃{µ̃Œ½̃{­̃”½̃Œ½̃”½̃”½̃Œ­ÆŒ­Æ{­Î{Œ­kŒ¥k‡•d•d•d•iwd•Qdu*?P%)5NsƒH_tJSU8Xqd•d•]s’R{ŒNsƒ]s’)d•z’œcŒ¥kŒ¥{œµ¼d0Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Æ^)Öc%™“”¥Îç­ÅÓ¥ÆÖ–·Ö§wV¼d0§wV{Œ­„œ­¥»”­½¥¹Ê­ÅÓ½ĐáÔÛ̃Î̃ïÇÔâи­§wV §¬²³¶²³¶™“”™“”’¢¯ §¬ÈÉÉï÷÷ï÷÷ï÷÷ïï÷ïï÷âï÷ïï÷äéçâï÷âï÷âï÷̃ç÷̃ç÷Î̃ïÎ̃ïÎ̃ïÁÛ́Î̃âÁÛ́Î̃ïÎ̃ïÁÛ́Î̃ïÎ̃ïÁÛ́ÁÛ́½Đáµ̉âµ̉âµ̉â¥Îç¥Æ̃¥Îç¥Îç˜ÁÖœÆ̃˜ÁÖ”½̃”½̃„½̃Œ½̃{­̃s­Ös¥Ös­Ös¥Ös¥Ös¥Ös¥Ö{­Î{­̃{­Î{­Îs­Ös¥Ö{­Î{­̃{¥ÎÁÛ́µ̉â¥ÎçœÆçœÆ̃”µâœÆ甽̃˜ÁÖ˜ÁÖœÆç¥Îç«Đë¥Îçµ̉âµÖëµ̉âµ̉â¥Îç¥Îç«Đë¥Îç¥Î猽̃˜ÁÖ„½̃{µ̃{µ̃s­Ö{­̃{µ̃s¥Îs­çs­ÖsœÁh™»h™»gŒÁh™»8Xq)9Z†±{­Ö{­̃{­Ö{µ̃{­̃{µ̃s­çs¥Ös¥Ö{­̃{­̃{µ̃{µ̃{µ̃{µ̃{­Ö̃ç÷„µ̃µ̉â{­̃{µÖŒµÖ„µ̃{µ̃Œ½ÖŒ½çŒ½̃„µ̃”½çŒ½̃–·ÖŒ­ÆŒ­Æ’¢¯{Œ­y‡’cˆ k‡•kŒ¥d•*?Pd•iwd•8Xq!!!1NsƒH_tQdu*?Pd•]s’]s’NsƒR{ŒQdu!!1iwcŒ¥iwkŒ¥{Œ­¼d0Đ^%Đ^%Đ^%Đ^%Đ^%Öc%Öc%Öc%™“”œ½̃˜ÁÖ˜ÁÖŒ½Ö§wVÜg%Üg%Æ^)Đ|J¥¥Ÿ²·¥¹Ê½ĐáÁÛ́Î̃âÎ̃âÎ̃âÎĐÑÈÉɲ³¶ §¬ §¬™“”™“” §¬ §¬ÈÉÉï÷÷÷ÿÿïï÷ïï÷äéçïï÷ïï÷ïï÷̃ç÷âï÷̉ặ̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÎÖïÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́ÁÛ́ÇÔâ«Đë«Đë«Đë¥Îç¥Îç¥ÎçœÆçœÆ̃”½̃”½̃Œ½çŒµ̃„µ̃s­Ös¥Ö{­̃s­Ö{­̃s¥Îs¥Ö{­Ö{­Ös­Ö{¥Îs­Ö{­Ö{­Îs­Ös­Ös­Ö«Đë«Đë¥Îç¥ÎçœÆç˜ÁÖœÆçœÆçœÆçœÆçœÆç¥Îç¥Îç¥Îç«Đë¥Îç«Đë¥Îç¥Îç¥Îç¥Îç«ĐëœÆçœÆ̃„½̃Œµ̃{µ̃{µÖ{­̃{­Ös­Ö{µ̃s­Ös­Ö{­̃{­Ös­ÖH_t)cˆ s­Ö{µ̃{­̃s¥Ö{­̃{­̃{µ̃{­̃{­̃{µ̃{µ̃{­̃„µ̃„µ̃½ĐáÁÛ́ÁÛ́„µ̃ŒµÖ„µ̃Œ½̃„µ̃„µ̃„½̃Œ½̃Œ½̃Œ½̃ŒµÖŒ½ÖŒ­ÆŒ­Æ{œµ{Œ­{Œ­z’œk‡•z’œiw(:-Qducˆ kŒ¥Nsƒ*?P(:-R{ŒNsƒQdu*?PkŒ¥JSU!!18Xq]s’]s’d•d•JSU!d•d•kŒ¥iwcŒ¥¼d0Đ^%Đ^%Đ^%Öc%Đ^%Đ^%Öc%Öc%™“”ŒµÎ”±ÊŒ½Ö˜ÁÖ§wVÜg%Üg%ç{1Üg%̃p.Đ|JÇœ~½ĐáÔÛ̃Î̃ẫâç̃âçÎĐÑÈÉɲ³¶ §¬™“” §¬ §¬ §¬ §¬ÈÉÉï÷÷ïï÷ï÷÷äéçïï÷ï÷÷äéçâï÷âï÷âï÷̃ç÷̃âçÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÇÔâÎ̃ïÁÛ́ÁÛ́½ĐáµÖë½Đáµ̉âÇÔâµÖëÁÛ́«Đë«Đë¥Îç¥Îç¥Îç«ĐëœÆçœÆç˜ÁÖ”½çŒ½̃„µ̃{µ̃s¥Ös­Ö{­Î{­̃s­Ös­Ös­Ö{­Ös­Ö„­Î{­̃{­Ös¥Ös¥Ös¥Ö{­̃s¥Ö¥Îç¥Îç¥Îç«ĐëœÆ̃”½̃œÆçœÆ̃œÆçœÆç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îçµ̉â¥Îç«Đë¥Îç¥ÎçœÆçœÆ甽̃„µ̃{µ̃ŒµÖs­Ös¥Ös¥Ös¥Ö{­̃{­Ös­çs¥Ös¥Ö*?PHp”s¥Ö{µÖs­ç{µ̃{µ̃„µ̃{µ̃{­̃{µ̃{­̃„µ̃{­̃{µ̃{­̃œÆ焵̃{µ̃„µ̃Œ½̃„µ̃„µ̃„µ̃„µ̃Œµ̃„µ̃Œ½̃Œ½ÖŒµÎ{¥ÎŒ­Æ„ µsŒ­{Œ­kŒ¥kŒ¥z’œ]s’!H_tcˆ cŒ¥X}’JSU)*?PHp”H_tH_t*?PkŒ¥*?P*?P]s’sŒ­{œµ„ µcˆ *?Piwd•iwk‡•cŒ¥¼d0Öc%Đ^%Đ^%Đ^%Öc%Öc%Öc%Öc%§wV„¥Æ”­½ŒµÎ”±Ê§wVç{1ç{1ç{1ç{1̃p.ç{1ç{1ç{1Çœ~̃âçÎ̃ẫâçÇÔâÈÉɲ³¶ §¬™“”™“” §¬ §¬ §¬ÎĐÑâï÷âï÷âï÷ï÷÷âï÷äéçâï÷âï÷äéç̉ặÎ̃ï̉ặ̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́ÁÛ́µÖë½Đá½ĐáµÖëµ̉âµÖëµÖëµ̉âµ̉â¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Æ̃¥Î甽̃”µâŒ½̃„µ̃{­̃s¥Ös¥Ös¥Ö{­Ö{­Ös¥Ö{­̃{­Îs­Ös­Ö{µ̃{­̃{­Ös­Ös¥Ö{­Ös¥Î«Đë«Đë«Đë¥Îç¥ÎçœÆçœÆçœÆ甽ç¥Îç ̀âœÆç ̀â¥Îç¥Îç¥Îç«Đë¥Îç¥Îç­Î̃¥ÎçœÆ甽̃Œ½̃Œµ̃„½̃„µ̃{­̃{µ̃s­Ö{­̃{µ̃{­̃s¥Ös¥Ö*?PW€¡{µ̃{­Ö{­̃{µ̃s­Ö{µ̃{µ̃{­̃{µ̃{µ̃s¥Ö{µ̃{­Ö{µ̃{µ̃Œµ̃{µ̃{µ̃Œµ̃Œ½̃„½̃„½̃{µ̃Œ½̃„µ̃Œ­ÖŒµÎŒµÖ„­Î{œµ|•±{Œ­cŒ¥kŒ¥z’œ]s’*?PNsƒW€¡d•8Xq!!1JSUR{ŒH_t8Xq*?PcŒ¥JSU%)5Nsƒ¥»ŒµÖ¢¿Ô{œµJSU]s’k‡•k‡•]s’kŒ¥¼d0Đ^%Öc%Đ^%Öc%Öc%Öc%Öc%Öc%sy|•±„œ­{ ÁŒ­Æ§wṼp.̃p.ç{1ç{1ç{1̃p.ç{1ç{1§wṼç÷̉ặÚàáÔÛ̃™“”fv| §¬’¢¯ §¬ §¬ §¬²³¶JSUÎĐÑï÷÷ïï÷ïï÷äéç̃ç÷ïï÷äéçâï÷âï÷̃ç÷̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÁÛ́ÁÛ́Î̃âÁÛ́ÁÛ́µÖë«Đëµ̉â«Đë«Đë¥Îç¥ÎçœÆçœÆçœÆçœÆç¥Îç¥Î眽̃”½çŒµ̃Œ½̃{µ̃{µ̃s¥Ös¥Ö{­̃s¥Ö{­Ö{­Ö{­Î{µÖ{­Ö{µ̃s­Ös­Ö{­Îs¥Ö{­Ös­Ös¥Ö¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆçœÆ眽̃œÆç¥Îç ̀â¥Î眽̃¥ÎçœÆç¥Îç«Đë«Đë¥Î甽̃Œ½Ö„µ̃„µ̃{­̃„µ̃{­̃s¥Ö{­̃s¥Ös­Ös­Ö„­̃s–µ)s¥Ö{­̃s¥Ös¥Ö{­̃{µ̃{µ̃„­̃„µ̃{­Ö„­Îs­Ö„­̃{­Ö{µ̃Œµ̃{µ̃{µ̃„­Î„­̃Œ­ÖŒ­Ö„µ̃{µ̃„µ̃{­ÖŒµÖ¥»{œ½„ µ{œµkŒ¥{Œ­kŒ¥kŒ¥Qdu!8XqNsƒ]s’R{Œfv|)8Xq8Xq*?PkŒ¥8Xq8Xq„œ½Œ­ÆŒ­Æ{œµQdud•d•d•iwcŒ¥¼d0Đ^%Đ^%Öc%Öc%Öc%Öc%Öc%Üg%§wV{Œ­kŒ¥{Œ­{œµ§wVç{1Üg%äCäCç{1ç{1äCäCĐ|J̃ç÷ÚàáÚàáÚàáy‡’(:-fv| §¬Ÿ²·²³¶ÈÉÉÇÔ⛬–(:-ÎĐÑïï÷ïï÷ïï÷ï÷÷ï÷÷ïï÷âï÷̃ç÷âï÷̃âç̉ặÎ̃ïÎ̃ïÁÛ́Î̃ïÇÔâÁÛ́½Đáµ̉âÁÛ́ÇÔâÁÛ́ÇÔâµ̉âµ̉â«Đëµ̉â¥ÎçœÆç˜ÁÖ˜ÁÖœÆç¥Îç¥ÎçœÆçœÆ甽̃”½çŒ½̃{­Ö„µ̃{­̃s­Ö{­Îs¥Ö{­Ös­Ös­Ö{­̃s¥Ö{µ̃s­Ö{µ̃s­Ös­Ös­Ös­Ös¥ÎŒ­ÖŒ½ÖœÆ̃œÆçœÆç¥Îç«Đë¥ÎçœÆ̃”½̃œÆçœÆçœÆç¥Îç¥Îç¥ÎçœÆçµ̉â¥Îç¥ÎçœÆ̃”½̃„½̃{­̃ŒµÖ{­̃{µ̃{µ̃s¥Ö{­̃s¥Ös­Ö{­̃s¥Ö*?PgŒÁ{µ̃{­̃s­Ös­Ö{µ̃{µ̃s¥Ö{­̃{µ̃{­Ö{µ̃{µ̃{µ̃{µ̃{µÖ{µ̃{µ̃s­ÖŒµÖ{­̃„­̃ŒµÖ„½̃{µ̃ŒµÖŒ­ÆŒµÖ{œµ{œµ„œ­cŒ¥z’œkŒ¥kŒ¥8Xq*?PH_t]s’k‡•H_t!!18XqH_t%1kŒ¥JSU%)5iw{œµz’œcˆ k‡•iwd•cŒ¥¼d0Öc%Öc%Öc%Öc%Öc%Öc%Đ^%Üg%§wVcˆ cŒ¥kŒ¥kŒ¥Đ|JÜg%äCäCç{1äCäCäCäCĐ|JÎÖïÔÛ̃ÔÛ̃ÔÛ̃y‡’fv|²³¶ÈÉÉÚàáÚàáï÷÷ÚàáajnÈÉÉï÷÷âï÷ïï÷âï÷ïï÷äéçâï÷̃âç̃ç÷̃ç÷Î̃ïÎÖïÇÔâÁÛ́ÇÔâÇÔâµ̉âµ̉âµ̉âµ̉â½Đá½ĐáÇÔâÇÔâµÖëµ̉â¥Îç¥ÎçœÆçœÆç¥Îç˜ÁÖœÆç¥ÎçœÆ猵̃Œ½̃”½̃”½̃ŒµÖ{µ̃{­̃{­̃s­Ös­Ös­Ö{µ̃s¥Ö{­Î{­Î{µ̃{µ̃{­̃s­Ös¥Îs­Ö{­Ö{­Ö”½çŒµÖ”½ç”½çœÆçœÆçœÆç¥ÎçœÆç˜ÁÖ¥ÎçœÆç¥ÎçœÆçœÆç˜ÁÖ¥ÎçœÆç¥ÎçœÆ̃”½̃”½çŒ½̃{­̃ŒµÖs¥Ö{­̃{µ̃s­Ös­Ös¥Ös­Ös¥Ö{­̃)H_ts¥Ös­ÖŒ½̃s¥Ö{­Ö{µ̃{µ̃„µ̃{µ̃{­̃{­Î{­̃{­Ö{­Ö„µ̃„µ̃„­̃ŒµÖ{­̃Œ½Ö{­̃Œµ̃„µ̃„µ̃{­ÖŒ­Æ{¥Î{œµ{Œ­z’œkŒ¥k‡•kŒ¥kŒ¥*?P*?P/o§Gt¢]s’d•kŒ¥JSUH_t8Xq)cŒ¥JSUkŒ¥]s’Qdud•iwd•iw{œµ™“”§wVÖc%Öc%Öc%Üg%Üg%Üg%syW€¡d•iwkŒ¥Đ|JäCäCäCäCäCäCäCäCĐ|JÎĐÑÈÉÉÁÊÔÎĐÑy‡’JSUŸ²·äéçïï÷âï÷ï÷÷÷ÿÿ §¬ÔÛ̃âï÷ï÷÷ï÷÷âï÷âï÷âï÷̃ç÷̃ç÷Î̃ï̃ç÷Î̃ïÁÛ́Î̃ïÁÛ́ÁÛ́µ̉âÁÛ́ÁÛ́µ̉âÁÛ́µ̉âµÖë½ĐáÇÔâÁÛ́¥Îç¥Îçµ̉â¥ÎçœÆç«Đë¥Æ̃œ½̃¥Î甽̃Œ½ÖŒ½ÖŒ½̃”½ç„µ̃„­Î{­Îs¥Î{­̃{­ÖsœÎ{µÖs­Ös­Ös¥Ös­ÖsœÎ{­Ös­Ös­Ö{­Ö{­̃s¥ÖŒ½̃”½çŒ½̃”½çœ½̃œÆç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆç˜ÁÖ¥Îç¥Îç¥Îç¥ÎçœÆçœÆ甽̃Œ½Ö„µ̃{­Ö”½ç{µ̃„µ̃{µ̃s­Ös­Ös¥Ö{­̃s¥Îs¥Ö{­Ö)8Xq{­̃{­Ö{µ̃s¥Ö{­Ö{µ̃{µ̃{µÖ{µ̃{µ̃s­Ö{µ̃{­̃{µ̃„µ̃{­̃{µÖ{µ̃ŒµÖ{­̃„­Î„µ̃ŒµÖ{­Ö„µ̃„¥½{œµ{Œ­{Œ­kŒ¥d•d•d•iw)8Xq1sµ1sµ1sµ/o§X}’d•kŒ¥Nsƒ%)5H_t8Xqd•8XqkŒ¥fv|!fv|{Œ­„œ­ §¬¥¹Ê¥¹Ê™“”Æ^)Öc%Đ^%Üg%§wVW€¡]s’d•k‡•§wVäCç{1äCäCäCäCäCç{1Đ|JÈÉÉÈÉÉÈÉÉÈÉÉsy!Úàáïï÷âï÷ïï÷ï÷÷ï÷÷ï÷÷äéçïï÷ïï÷ïï÷̃ç÷̃ç÷̃ç÷̃ç÷Î̃ïÎÖïÎ̃ïÎÖïÎ̃ïµÖëµÖë«Đëµ̉âµ̉âµ̉âµ̉â«Đëµ̉â«Đëµ̉â¥Îç¥Îç¥Îç«Đë­Î̃¥ÎçœÆçœÆ̃˜ÁÖŒµÖŒ½̃„½̃Œ½̃{­Ö{­Ö{­̃s¥Î{µ̃s­Ö{­̃s­Ös­Ö{¥Î„­Îs­Ös­Ös¥Ös­Ö{­Îs¥Î{­̃{­Ös­Ö”½ç”½ç”½ç˜ÁÖœÆç¥Æ̃œÆç«Đë¥Îç¥Îç¥ÎçœÆçœÆçœÆç¥ÎçœÆç¥Îç˜ÁÖ”½ç„µ̃„µ̃„­̃Œ½çs­ç{µ̃„­Î{­Ö{­̃{­̃s­Ös­Ö{¥Î{­Ös­Ö)W€¡kœËs¥Ö{­̃s¥Ös­ÖgŒÁ8XqH_t{µ̃{µ̃{­̃„µ̃s¥Ö{µ̃{­̃{­̃{µ̃{­̃{µ̃s­Ö{µ̃{­Ö{­̃„½̃„µ̃„µ̃„½̃{µ̃„µ̃„µ̃„µ̃Œ½ÖŒµÖ„­Î{œ½„œ­sŒ­cˆ d•]s’]s’d•Hp”1sµ1sµ1sµ1sµ1sµB{µJ{­cŒ¥cŒ¥]s’*?PH_t8Xq)d•JSUkŒ¥d•!ajn”­½´Å¥¹ÊŒµÎ„¥Æ™“”¼d0Üg%§wVd•d•iwd•Đ|JäC̃p.äCäCäCäCäCäCĐ|J¥¹Ê¶Á¿²³¶ÈÉÉfv|ÁÊÔï÷÷ïï÷âï÷ïï÷ïï÷âï÷ïï÷âï÷ïï÷âï÷ï÷÷äéç̃ç÷̃ç÷Î̃ïÎ̃ïÇÔâÎÖïµÖëÁÛ́«ĐëµÖëµ̉âµ̉â«Đë¥Îç¥Îç«Đë¥Îç¥ÎçœÆçœÆç¥ÎçœÆç¥ÎçœÆç˜ÁÖ”½̃Œ½̃„­̃„µ̃{µ̃{­Ös­Ös­Ös¥Ös¥Ö{­Îs­Ös­Ös­Ös­Ö{­̃{­̃s­Ös¥Î„­Î{¥Îs¥Ös­Ös­Ös­Ö{­̃”½çŒ½̃”µâ”½̃œÆçœÆçœÆç¥Îç«Đë«Đë¥ÎçœÆçœÆçœÆçœÆç˜ÁÖŒ½ÖŒ½̃Œ½Ö„µ̃{­̃{µ̃{µ̃{µÖs¥Ö{µ̃{µÖs¥Ö{­Ös­Ös¥Ö{¥Îs­Ö{­Ö%)5R{Œ{µ̃{µ̃s¥Ös¥Ös¥Ö{µ̃{­̃s­ÖH_tR{Œs­Ö{­̃{µ̃{­̃{­̃{µ̃{­̃{µ̃{­̃„­̃s¥Ö{­Ös¥Ö{­̃{µ̃{­Ö{µ̃„µ̃{­̃„µ̃„µ̃„µ̃Œ½̃{µ̃{­Î„¥½{œµ„œ­kŒ¥kŒ¥]s’]s’]s’]s’/o§7v¹1sµ1sµ1sµB{µB{µB{½B{½J{­Gt¢W€¡R{Œ8Xq!H_tH_t)d•JSUkŒ¥d•JSU¥»ŒµÖŒµÎ´Å{œµz’œy‡’k‡•iwd•d•Đ|JäCäCäCäCäCäCäCç{1Đ|J §¬²³¶Ÿ²·²³¶fv|ÁÊỐéñïï÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷âï÷ïï÷äéçâï÷̃âçâï÷̃ç÷ÁÛ́̃âçÁÛ́Î̃ïÁÛ́ÁÛ́µ̉âµ̉â­Î̃«Đë«Đë¥ÎçœÆç¥Îç¥ÎçœÆç¥ÎçœÆç¥Æ̃œÆç ̀â˜ÁÖœÆ̃”½̃„µ̃{µ̃„½̃{µ̃{µ̃s­Ös­Ö{µÖ{­Îs¥Ös¥Ös­Ös­Ö{­Ös¥Ös¥Ö{µ̃{­̃{­Îs­Ös­Ö{­Ös¥Ös¥Ös­Ö”½̃œÆç˜ÁÖŒ½̃”½çœÆç¥Îç¥Îç¥Îç«Đë¥Îç¥ÎçœÆçœÆçœÆ̃œÆ̃”½̃Œ½̃{µ̃„­̃{­̃{µ̃{­Ös¥Ö{µ̃{µÖs¥Ö{­̃s­Ös­Ös¥Ös­Ö{µ̃{­ÖR{Œ{µ̃s¥Îs­Ös¥Ös­Ö{­Ö{µ̃s­Ös¥Ö{­Ö{¥Î{­̃s­Ö{µ̃{­Ö„­̃s¥Ö„µ̃{­̃{­̃„µ̃„µ̃{µÖ„½̃„µ̃„µ̃{µ̃{µ̃ŒµÖ{­̃{µ̃„µ̃„µ̃„µ̃„µ̃Œ­Ö„­Î{ Á{Œ­kŒ¥d•]s’R{Œ]s’R{Œ/o§1sµ7v¹7v¹B{µ7v¹B{½B{½B{½B{½B{½Z†±Gt¢R{ŒR{ŒNsƒH_t!!1]s’JSUcˆ d•*?Py‡’”±Ê’¢¯§kŒ¥iwd•]s’d•Đ|JäCç{1äCç{1äCç{1ç{1äCĐ|J’¢¯ §¬ §¬ §¬ajnÈÉÉï÷÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷âï÷ïï÷ïï÷äéçäéçâï÷̉ặ̃ç÷Î̃ïÁÛ́ÁÛ́Î̃ï½ĐáµÖëµ̉â«Đë¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆç¥ÎçœÆçœÆçœÆ̃”½̃Œ½̃Œµ̃{µÖ„½̃„µ̃{­̃s¥Ö{­Ös­Ös­Ö„­Îs¥Ös­Ö{­Ös¥Ö{­Ös­Ös¥Ös­Ös­Ös­Ös­Ö{­Ös¥Ö{­Ö{­Î”½çŒ½̃”½̃˜ÁÖ˜ÁÖœÆ̃œÆç«Đë¥Îç«Đë¥Îç¥ÎçœÆçœÆ̃”½ç˜ÁÖ”½̃Œ½̃{µ̃„µ̃„µ̃{­̃{­̃s¥Ö{­̃{µ̃s­Ö{­Ös­Ös¥Ös­Ö{­̃s­Ö{­Îs­Ö*?P8Xqs­Ös¥Ös¥Ös­Ö{µ̃s¥Ö{µ̃{µ̃H_tH_ts¥Ö{­̃{­Ö„½̃{­̃{µ̃{­̃s¥Ö{­̃{­̃{­̃{µ̃{­Î{­̃{µÖ{µ̃„­Î{µ̃„µ̃„µ̃„µ̃„µ̃ŒµÖ„µ̃{­Ö{¥Î„­Î{œµkŒ¥z’œd•d•]s’NsƒNsƒ1sµB{½7v¹B{µB{½B{µB{½B{½B{½B{½VˆÀVˆÀVˆÀVˆÀJ{­Hp”NsƒR{ŒH_t)9]s’JSUd•d•JSUcˆ iwk‡•iwd•k‡•§wVĐ|Jç{1ç{1ç{1ç{1ç{1äCäCĐ|J™“”¥¥ §¬ §¬ajnÈÉÉ́éñïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷äéçâï÷äéçäéç̃ç÷̉ặ̉ặÎ̃ïÁÛ́ÁÛ́µÖëµÖë«Đë¥Îç¥Îç¥ÎçœÆç¥Îç¥Îç¥Îç«Đëµ̉â«ĐëœÆç¥Æ̃œÆçœÆ甽̃”½̃Œ½̃„­̃{µ̃{µ̃s¥Ö{­̃s­Ö{­Ö{­Ös¥Ös¥Ö{­̃s­Ö{­Ö{­̃s­Ö{­Ö{µÖ{­̃s¥Ös­Ös­Ö{­Ö{­Îs¥Îs¥Ö”½ç”½̃”½̃”½̃œÆç ̀â¥ÎçœÆç¥Îç«Đë¥Îç¥ÎçœÆçœÆçœÆ猽̃”½çŒ½̃„½̃Œµ̃ŒµÖ{µ̃{­̃s­ç{­̃{­̃{µ̃{­Ös­Ös­Ö{­Ös­Ö{­̃{­ÖkœËgŒÁ%1)H_tH_tH_tH_t8Xq8Xq*?PH_tQdu8Xq8Xq8Xq8XqQdugŒÁ{µ̃„µ̃{­̃{­̃{­Ö{µÖ{µ̃{µ̃{­Ö{µ̃„µ̃„µ̃{­̃{µ̃„µ̃„½Ö„µ̃„­̃{­ÖŒ­Æ„œ­sŒ­kŒ¥d•]s’]s’Nsƒ8Xq7v¹B{µ1sµ1sµB{½B{½B{½B{½B{½B{½B{µM€²VˆÀ\•¿VˆÀgŒÁVˆÀW€¡W€¡X}’]s’*?P]s’JSUd•d•! kŒ¥%)5Qdud•k‡•z’œ{Œ­’¢¯Çœ~Đ|J̃p.ç{1ç{1äCäCĐ|J§™“”™“”™“”ajnÁÊÔï÷÷äéçï÷÷ï÷÷âï÷âï÷ïï÷ïï÷ïï÷âï÷̃ç÷̉ặ̃âç̉ặÎÖïÁÛ́ÁÛ́ÁÛ́µ̉âµÖë¥Îç¥ÎçœÆç¥ÎçœÆçœÆç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆçœÆç˜ÁÖ”½çŒ½ÖŒ½̃„½̃{­̃{µ̃{­Ö{­Ös­Ö{­Ö{­Ös¥Ös­Ö{­̃s¥Ö{­̃s­Ö{¥Îs­Ös­Ö{µ̃{­Ös¥Ö{­̃s­Ös¥Ös­Ös­Ö{­Ö”½ç”½ç˜ÁÖœÆçœÆç˜ÁÖœÆç¥Îç¥Îç«Đë¥Îç«Đë ̀â˜ÁÖŒ½̃”½çŒ½̃”½̃Œ½Ö{­̃„µ̃„½̃{­Ö{µ̃s­Ös­Ö{­̃s­Ös­Ös­Ö{­Î{­Î{­Î{µ̃*?PR{Œ„µ̃{µ̃{µ̃{­Ö{µ̃{µ̃{­Ös¥Ö{µ̃„µ̃{­̃{­̃Œ­ÖŒµÖ{µ̃Œ½ç{­ÖŒ­Ö{­Ö’¢¯{œµkŒ¥d•]s’]s’NsƒR{Œ8XqB{½B{½J{­1sµB{½B{½B{½B{½B{½B{½B{½B{µ\•¿gŒÁgŒÁgŒÁgŒÁgŒÁgŒÁcŒ¥iwd•cŒ¥Hp”)d•8XqNsƒW€¡8'd•! JSUy‡’§ §¬¶Ä̉½ĐáÈÉÉÇœ~äCäCäCĐ|J™“”™“”™“”™“”ajn¶Ä̉ïï÷̃ç÷ïï÷âï÷âï÷âï÷âï÷ïï÷âï÷âï÷̃ç÷̉ặ̉ặÎÖïÎ̃ïµ̉âÁÛ́µÖëÁÛ́µ̉â¥ÎçœÆ̃œÆç¥ÎçœÆ̃¥ÎçœÆ̃œÆ̃œÆç˜ÁÖ¥Îç˜ÁÖŒ½̃Œ½̃„µ̃Œµ̃Œ½çŒ½̃„½̃s­Ö{­Ö{­̃s¥Ös¥Ös­Ö{­̃{­̃s­Ö{­Ös¥Ös­Ös¥Ös­Ös¥Îs­Ös­Ö{­Ös¥Ös¥Ös­Ös¥Ö{­Îs¥Ö”½̃˜ÁÖ”½̃”½̃œÆ̃œ½̃¥Îçµ̉â¥Îç¥Îç¥Îç¥Îç¥Î甽甽̃”½̃”½ç”½̃Œ½̃„µ̃Œ½̃„µ̃{µ̃{­̃s¥Ö{­Ö{µ̃{­̃s­Ö{­Ö{­Ös­Ös¥Ös­Ö*?PNsƒ„µ̃„µ̃Œµ̃{­̃{µ̃s­Ös¥Ö{µ̃{µ̃{µ̃„½Ö{­̃{­Î{µ̃Œ½̃Œ½̃„­ÎŒµÖŒµÖ{¥Î{Œ­kŒ¥W€¡]s’]s’NsƒR{Œ*?P)B{½B{½B{½B{½B{½B{½B{½M€²B{½\•¿B{½gŒÁgŒÁkœËgŒÁs¥ÎgŒÁsœÎsœÎsœÎgŒÁh™»g³kŒ¥kŒ¥d•%)5iwJSUNsƒfv|! cˆ %)5(:-§ÁÊÔÔÛ̃ÔÛ̃ÇÔâ¶Ä̉и­Đ|JĐ|J§™“”™“”™“”ajnÁÊÔâï÷ïï÷́éñâï÷âï÷âï÷äéçâï÷âï÷äéçâï÷Î̃ïÎ̃ï̃ç÷ÔÛ̃µ̉âÁÛ́ÁÛ́µ̉â«Đë¥ÎçœÆ̃˜ÁÖ–·ÖœÆ眽̃Œ½̃”½̃Œµ̃œÆ甽甽̃Œ½ÖŒ½ç„­̃ŒµÖ„µ̃{µ̃Œ­Ö{­̃s¥Î{­Ö{­̃s¥Ö{µ̃{­̃{­Ös­ÖŒ­Ö{­Ös­Ös­Ös­Ös¥Ö{­Î{­Îs­Ös­Ö{­Î{µ̃{­Ös¥ÖsœÎœÆ甽̃œ½̃˜ÁÖœÆ̃˜ÁÖœÆçœÆç¥Îç¥Îç«Đë¥ÎçœÆ̃œÆ̃œÆ̃”½̃{­̃Œµ̃”½çŒ½̃„µ̃„µ̃„½Ö{µ̃{­Î{µ̃{­̃s­Ös­Ös­Ö{­Î{­Ö{µ̃{­̃*?PNsƒ{­̃{µ̃{­̃{­̃Œ­Ö{µ̃{µ̃{­̃„µ̃{­Ö„µ̃{µ̃Œ½̃Œ½ÖŒ½̃ŒµÖ„µ̃–·ÖŒµÖ„¥½„œ­cŒ¥d•NsƒR{ŒNsƒ]s’)!9B{½B{½B{µB{½B{½B{½B{µVˆÀZ†±Z†±gŒÁgŒÁgŒÁsœÎh™»h™»sœÎsœÎ{¥ÎsœÎkœËh™»gŒÁgŒÁg³iwkŒ¥fv|Qdu)iw8XqQdu]s’! z’œ%)5™“”ÎĐÑÎ̃âÈÉɶÁ¿²³¶¥¥™“”™“”™“”™“”JSUÎĐÑâï÷âï÷âï÷̃âçâï÷âï÷âï÷äéç̃ç÷̃ç÷̃ç÷Î̃ïÎ̃ïÁÛ́ÁÛ́ÇÔâÇÔâµ̉âµ̉â¥Îç¥Î甽ç˜ÁÖ˜ÁÖœÆ̃”½çŒ½̃{µ̃„µ̃„½̃Œµ̃”½çŒ½̃„½̃{­̃„µ̃„­Î„µ̃{­̃s¥Ös¥Ö{­Îs¥Ös¥Ö{­̃s­Ö{µ̃{­Î{­̃{¥Îs­Ö{­Î{­Ö{­Ös­Ö{­Îs¥Ös¥Ös­Ös¥Ös¥Ös¥Ös¥ÖœÆ甽̃œÆçœÆçœÆ̃œÆçœÆç¥Îçµ̉â¥Îç«Đë¥ÎçœÆçœÆ甽猽̃Œµ̃Œ½̃”½çŒ½̃ŒµÖŒµÖ{­̃{µ̃{µ̃{¥Îs­Ö{µÖ{­Îs¥Ös­Ös¥Ö{­Ö„­Î*?PHp”„µ̃{µ̃„­̃{µ̃s¥Ö{­Ö{­̃{­̃{µÖ{µ̃Œµ̃„½̃”½ç„½̃Œµ̃Œµ̃˜ÁÖŒµÖŒ­Æ„ µ{œµcŒ¥W€¡]s’R{ŒR{ŒNsƒ*?PB{½B{½B{½B{½B{½B{½M€²M€²B{µgŒÁgŒÁkœËsœÎ{¥Î{¥Î{¥Î{¥Î{¥Î{¥Îh™»sœÎgŒÁgŒÁgŒÁ\•¿B{½J{­d•iwiwy‡’QduQdu]s’! z’œ%)5JSUy‡’¶Á¿²³¶ §¬™“”™“”™“”™“”ajn½Đáâï÷âï÷̃ç÷äéç̃âç̃ç÷̃ç÷̃âç̃ç÷̃âç̃âçÎ̃ïÎ̃ïÎ̃âÇÔâÇÔâµ̉âÁÛ́«Đë¥Îç¥ÎçœÆ̃œÆ甽̃”½̃Œ½̃{­̃{­̃„µ̃{µ̃Œ½Ö{­̃{µ̃{µ̃{µ̃„­Î„µ̃{­̃s­Ö„­Î{­̃s­Ös­Ös­Ö„­̃s­Ös¥Ös¥Ö{­̃s­Ös¥Ö{­Ös­Ös­Ös­Ös¥Ös¥Ös­Ö{­Ö{­Ös­Ös­Ös¥ÖœÆ̃œÆ̃œÆ̃œÆ̃œÆçœÆç¥Îç¥Îçµ̉â«Đë¥Îç¥Îç¥ÎçœÆ̃Œµ̃Œ½çŒ½̃”½̃”½ç”½̃Œ½̃„µ̃„µ̃„µ̃{µÖs¥Ös¥Ö{­Ös­Ö{­Ös¥Ös­Ö{­Ös¥Ö*?PHp”{µ̃„µ̃{µ̃{µ̃{µ̃{­̃{­Ö{µ̃{­̃{µ̃„µ̃„­̃Œ½̃Œ½̃”½̃”½̃Œ½Ö˜ÁÖŒµÖ„ µ|•±k‡•]s’R{ŒR{ŒR{ŒQdu8XqVˆÀB{µB{½B{µB{½B{µM€²VˆÀ\•¿h™»sœÎ{¥Î{¥Î{¥Î„­Î{¥Î{¥Î{¥Î{¥ÎsœÎkœËgŒÁgŒÁ\•¿\•¿gŒÁVˆÀM€²J{­cˆ iwy‡’R{ŒJSUajnfv|d•%)58'²³¶ §¬™“”™“”™“”™“”ajn½Đá̃âç̃âç̃âç̃âç̉ặâï÷̃ç÷̃ç÷̃âç̉ặ̉ặÎ̃ïÎ̃âÁÛ́ÇÔâÁÛ́µÖëµ̉â«Đë¥Î眽̃”½ç”½̃”½ç”½ç„µ̃{µ̃{µ̃„­̃s¥Ö{­̃s¥Ö{µ̃„µ̃{µ̃{­̃s¥Ö{­̃s­Ö{¥Îs¥Ös­Ös­Ö„­Îs¥Ö{­Ös¥Ös¥Ös­Ös¥Ö{­Ö{­Ös­Ö{­Ös­Ös­Ö{µÖs¥Ös­Ös¥Ö{­̃{­Ös­Ö”½̃œÆçœÆ̃”½̃œÆç¥Îç¥Îçµ̉âµ̉â«ĐëœÆçœÆç ̀âœÆ̃”½çŒ½̃{µ̃Œ½̃Œ½̃”½̃Œ½̃Œ½̃{µ̃{µ̃Œ½Ö{µ̃{­̃{­Ös¥Ös­Ös¥Ö{µÖs­Ös¥Ö*?PNsƒ{µ̃„µ̃{µ̃s­Ö„­̃Œ­Ö{­Ö{­̃{µ̃„½̃{­̃Œ½çœ½̃”½ç”½̃œ½̃”½̃˜ÁÖŒµÎ{œµ{œµiwd•NsƒNsƒNsƒH_t8XqM€²B{½B{½B{½M€²B{µVˆÀZ†±Z†±h™»kœË{¥Î{¥Î„­Î„­ÎŒ­Ö{¥Î{¥ÎsœÎh™»s¥ÎgŒÁgŒÁZ†±VˆÀVˆÀVˆÀZ†±M€²B{½7v¹M€²d•y‡’z’œQdu(:-ajn]s’d•%)5 §¬y‡’ajn™“”™“”™“”™“”ajn%)5Î̃âÎ̃ï̉ặ̃ç÷̃âç̃ç÷̉ặ̃ç÷Î̃âÎ̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â«Đë«Đë¥Îç¥ÎçœÆçœÆçœÆ̃”½̃Œ½̃Œµ̃{­̃{­̃„µ̃{µ̃s¥ÖŒ½̃{µ̃s¥Ö{µ̃s­Ös¥Ö{­Ös­Ös­Ö{­̃s­Ö{­Ö{­Ö{­Ös­Ös¥Ös¥Ö{µ̃s¥Ö{­Ös¥Ös­Ös­Ös­Ös­Ös­Ö{­Ö{­̃s­Ö{­Ös­Ös­ÖœÆ甽̃œÆçœÆçœÆç¥Îç«Đë¥Îçµ̉âµ̉âµ̉â¥Î甽̃œÆ̃”½̃„½̃„½̃Œ½̃Œµ̃Œ½̃„½̃„µ̃„µ̃„½̃s¥Ö{­̃{µ̃{­̃s¥Ös¥Ös­Ö{­Ö{­Ö{µ̃8XqR{Œ{µ̃{µ̃{µ̃„­̃{µ̃{­̃{­̃{µ̃{­Ö„µ̃Œµ̃Œ½̃”½̃–·ÖŒ½Ö˜ÁÖ”½̃Œ½Ö”­½{œµkŒ¥cŒ¥]s’NsƒNsƒR{Œ8XqGt¢VˆÀM€²M€²VˆÀVˆÀM€²Z†±\•¿kœËh™»{¥Î{¥Î{¥Î„­Î„­Î„­Î{¥Î{¥ÎsœÁgŒÁgŒÁgŒÁgŒÁZ†±Z†±M€²M€²M€²B{½B{µB{µB{½*?P!!1iw’¢¯’¢¯¥¥JSUajn]s’d•%)5Ÿ²·fv| JSUy‡’™“”’¢¯Ÿ²·™“”JSUÁÛ́̉ặÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ïÁÛ́ÁÛ́½ĐáÁÛ́µÖëµ̉â¥Îç¥Îç¥Îç¥ÎçœÆç˜ÁÖœÆ甽̃”½ç„µ̃„µ̃Œ½Ö„µ̃{­̃s¥Ö{­̃{­̃s¥Ös­Ös¥Ö{µ̃{­Ös­Ö{­Ös­Ö{­Ös¥Ö{­Ö{­Ö{­̃s­Ö{­̃{­Ös¥Ös¥Ö{­Ös­Ös­Ös¥Î{¥Îs­Ös¥Î{­̃{­Ös­Ö{­Ö{­Î˜ÁÖœ½̃œ½̃¥Îç¥Îç¥Îç¥Îç«Đëµ̉âµ̉â¥Î眽̃œÆ̃œÆ焵̃„µ̃{µ̃Œ½̃„µ̃„µ̃„½̃Œµ̃ŒµÖ{­Ö{­̃„­̃{­̃„µ̃s­Ö{­Ös¥Ös­Ö{­Î{­̃{µ̃s¥Ös­Ö{µ̃s¥ÖR{Œ!!1H_tkœËs­Ö{µ̃{­̃{µ̃{­̃{µ̃{­̃{µ̃s­ç{­̃„µ̃„µ̃{­̃{µ̃{­Ö{µ̃s­Ö{­Ö{µ̃{µ̃„µ̃„½̃„­̃Œµ̃œÆç˜ÁÖ˜ÁÖŒ½ÖŒ½ÖŒ­Æ{œµ{œµd•]s’]s’NsƒNsƒ%)5Z†±VˆÀM€²B{µM€²VˆÀM€²gŒÁgŒÁkœË{¥Î{¥Î{¥Î{¥Î„­ÎŒ­Ö{¥Î{¥Î{¥ÎsœÎgŒÁkœËgŒÁgŒÁVˆÀM€²M€²B{µB{½J{­B{µB{µ7v¹8Xq!ajny‡’„œ­’¢¯iw%)5fv|iwNsƒ%)5²³¶sy%)5iw §¬²³¶ÁÊÔÁÊÔajn!­Î̃ÎÖïÁÛ́ÎÖïÎ̃ïÎ̃ïÎ̃ï̉ặÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëµÖëµ̉âÁÛ́µ̉â¥Îç«ĐëœÆçœÆç˜ÁÖ”½̃”µâŒ½Ö”½̃Œµ̃Œ½̃„µ̃„µ̃{­̃{µ̃{­Ö{µ̃{­̃s¥Ö{­̃s­Ös¥Ö{¥Îs¥Ös­Ö{­Ös­Ö{­̃{­Ös­Ös­Ö{¥Î{­Ö{­̃{­̃{­Ös­Ö{­̃s­Ö{¥Î{µ̃s­Ös­Ös¥Ö{µ̃{­Ö{­̃¥Î甽̃¥Æ̃¥Îç¥Îç«Đë¥Îçµ̉âµ̉â¥Îç¥ÎçœÆçœÆ猽̃„½̃ŒµÖ{µ̃{µ̃Œ½ç„­̃„µ̃Œ½̃{µ̃{µ̃{­̃{­̃{µ̃{­̃{­̃s­Ös­Ö{¥Î{­̃{­̃{¥Îs­Ös­ÖgŒÁHp”{­Î{­̃{­̃{µ̃{­̃{µ̃{µ̃{­̃s¥Ö{­̃{µ̃{µ̃{µ̃s­Ö{µ̃{µ̃ŒµÖ{µ̃{­̃Œ½̃„µ̃Œ½̃”½̃Œ½ç”½̃”½̃˜ÁÖŒ­ÆŒ­Æ{œµcŒ¥cˆ R{ŒR{ŒR{ŒNsƒ)gŒÁ\•¿\•¿B{½B{µM€²gŒÁgŒÁgŒÁsœÎ{¥Î{¥Î{¥Î{¥Î„­Î„­Î{¥Î{¥Î{¥ÎsœÎs¥ÎkœËgŒÁgŒÁVˆÀZ†±Z†±\•¿B{µB{µB{µ7v¹7v¹8Xq! ajn™“”™“”§JSUfv|d•]s’%)5²³¶y‡’8Xq¥¹ÊÁÊÔÎ̃ï̉ặ²³¶*?Pµ̉âµÖëÁÛ́ÁÛ́µÖëÁÛ́ÁÛ́µÖëÁÛ́µ̉âµÖë«ĐëµÖëµÖë«Đë«Đë¥ÎçœÆ̃˜ÁÖ”½̃”½̃”½̃”½̃œÆ̃”½ç”½ç”½̃Œ½̃ŒµÖ{­̃{µ̃s­Ö{­̃{µ̃s¥Ös­Ös¥Ös­Ös­Ös¥Ö{­Îs¥Ö{­Îs¥Îs­Ös­Ö{¥Î{µ̃s­Ös¥Ö{­Ös­Ös­Ö{­Ös¥Ö{­Îs¥Ö{­̃{¥Îs¥Ös­Ö{¥Î{µ̃{­ÎœÆç¥ÎçœÆç«Đë¥Îç«Đë«Đë¥Îç¥Îç¥Îç¥Îç ̀âœÆ̃Œ½ç”½çŒ­Ö{µ̃{µ̃{µ̃„µ̃„µ̃{­̃„µ̃Œµ̃ŒµÖ{­̃{µ̃{µ̃{­Ö{­̃s¥Ös­Ö{­Îs¥Îs¥Ös­ÖZ†±8Xq{µ̃{µ̃{­̃{­̃Œµ̃s­Ös­Ö„µ̃{µÖs¥Ö{µ̃{­̃ŒµÖŒ­Ö{µ̃s¥Ös¥Ö„µ̃„µ̃„½̃Œ½ÖŒ½̃”½ç”½çŒµÖŒ­Æ„ µ{ Á{Œ­cŒ¥d•R{ŒNsƒfv|Nsƒ*?PgŒÁB{µgŒÁB{½B{½B{µM€²gŒÁh™»{¥Î{¥Î{¥Î{¥Î{¥Î„­Î{¥Î{¥Î{¥ÎsœÎgŒÁgŒÁkœËgŒÁgŒÁgŒÁZ†±B{½B{½J{­B{½B{µB{µ1sµ8XqPN)™“” §¬z’œk‡•!fv|%)5²³¶iw!²³¶̉ặÎ̃ïÎ̃ïÁÛ́µ̉âÇÔâµ̉âµ̉âµÖëÁÛ́ÁÛ́ÁÛ́ÁÛ́µ̉âµ̉â«Đëµ̉âµ̉âµ̉â¥Îç˜ÁÖ¥Îç¥Î甽çœÆ̃„µ̃Œ½̃”½̃–·ÖœÆ猽̃”½çŒ½̃{­̃s¥Ös­Ö{­̃s¥Ös¥Ö{­Îs¥Ös¥Î„­Î{µ̃{­̃s¥Ös­Ös¥Ös¥Ö{­Ö{­̃s­Ös¥Îs­Ös­Ö{µ̃s¥Ö{­Ös¥Î{­Ö{­Î{µ̃s­Ös­Ö{­̃{­Ös¥Ös¥Ö¥Îç«Đë¥Îç«Đë«Đë¥Îç¥Îç¥Îç¥ÎçœÆçœÆçœÆ甽̃Œ½ç„µ̃{µ̃s­Ö{­̃{­̃{­̃s¥Ö{µ̃s¥Ö{­̃{­̃{µ̃{­̃s¥Ö{­Ös­Ö{­̃{¥Îs­Ö{­Î{­̃{ ÁHp”{µ̃{­Ö{µ̃{­̃{µ̃{µ̃{­̃{­̃{µ̃„­Î{­̃s­Ö{­̃{µ̃{µ̃„­Î{µ̃„µ̃„½̃„½̃Œ½̃Œ½̃ŒµÖŒ½̃„­Î„­Î„ µ{Œ­d•d•R{ŒR{ŒNsƒH_t*?PgŒÁ\•¿\•¿gŒÁ\•¿\•¿\•¿gŒÁh™»{¥Î{¥Î{¥Î{¥Î„­Î{¥Î{¥Î{¥Î{¥ÎsœÎgŒÁgŒÁgŒÁgŒÁVˆÀ\•¿M€²B{½B{½B{½B{½7v¹J{­1sµ8Xq™O&§wV™“”iw!!1fv|%)5²³¶iwJSUÇÔâµÖëµÖë«Đë«Đëµ̉âµ̉âµ̉âµ̉âµ̉âµ̉â¥Îç¥Îç¥Îç«Đë¥Îç«ĐëœÆç˜ÁÖœÆ̃”½ç”½̃„µ̃Œ½̃Œ½̃”½çœÆ̃˜ÁÖŒ½̃„½̃Œ½Ö{­̃{µ̃{­̃s¥Ö{­̃{µ̃s­Ö{µ̃s¥Ös¥Ös­Ö{µ̃s­Ö{¥Î{­Ö{µ̃{¥Îs­Ös¥Ö{­̃{­̃{¥Î{­Ös¥Ös­Ö„­Î{µ̃s­Ös¥Ö{­Îs­Ös­Ös­Ö{­Î{¥Î¥Îç¥Îç¥Îç¥Îç¥Îç«ĐëœÆç¥ÎçœÆçœÆçœÆ̃œÆç˜ÁÖ„µ̃{µ̃{­Ö{­̃{µ̃{µ̃{­̃s­Ös­Ös­Ö{µ̃{­̃s¥Ö{­̃{­Ö{­Ös¥Ö{­Ö{µ̃s¥Ö„­Îs­Ö*?P{¥Æ{­̃{µ̃s­Ö{µ̃{µ̃{µ̃{µ̃„µ̃{µ̃„­̃„µ̃„½̃{­̃{µ̃{­Ö{µ̃{µ̃„½̃„µ̃„½̃„µ̃{­Ö{­ÖŒ­Ö{ Á{œµkŒ¥d•d•]s’]s’Nsƒ*?P8XqVˆÀVˆÀZ†±Z†±Z†±gŒÁgŒÁgŒÁsœÎ{¥Î{¥Î{¥Î{¥Î{¥Î{¥Î{¥Î{¥ÎsœÎkœËs¥ÖgŒÁgŒÁ\•¿VˆÀZ†±M€²B{½B{½B{½B{µB{µ7v¹7v¹8Xq™O&Đ^%Æ^)§wV™“”y‡’ajnfv|%)5’¢¯™“”z’œ½Đáµ̉âµ̉âµ̉â¥Îç«Đë«Đë«Đë«Đë«Đë«ĐëœÆç«ĐëœÆç¥ÎçœÆ甽眽̃”½çŒµÖ„½̃Œ½̃„½̃Œ½̃Œ½̃œµ̃”½̃Œ½ÖŒµ̃{­Ö{µ̃s¥Ös­Ö{­Ö{­Ö{­Ös¥Ö{­Ös¥Ö{­Ö{­Îs¥Ös¥Ös¥Ö{­Ös­Ös­Ö{­̃{­Ös¥Ös­Ös¥Î{­̃s¥Ös¥Ö{­̃s­Ö{­Ö{­Ös­Ö{¥Î{µ̃s¥Ö{­Ös­Ö¥Îç¥Îç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆç¥ÎçœÆ̃˜ÁÖŒ½̃Œ½̃Œ½̃„µ̃ŒµÖ„µ̃„­Î{µ̃s¥Ö{­Ös¥Ös¥Ö{µ̃{­̃{­̃{­Ös­Ös­Ö{­Îs¥Ö{­̃s­Ös­ÖkœË8Xq{µÖ{­̃{µ̃{­̃{µ̃{µ̃„µ̃Œµ̃{­̃{­̃{µ̃{µ̃„­̃{µ̃{­̃„µ̃„µ̃„­̃{­̃{µ̃Œ½̃„½̃ŒµÖŒ­Æ„ µ{œµkŒ¥d•d•NsƒNsƒfv|%)5Hp”M€²VˆÀVˆÀVˆÀVˆÀgŒÁgŒÁkœËsœÎs¥ÎsœÎ{¥Î{¥Î{¥Î{¥Îs¥ÎsœÎsœÎkœËkœËh™»gŒÁVˆÀVˆÀVˆÀVˆÀB{µB{½7v¹B{µB{µ1sµ7v¹8Xq™O&Đ^%Đ^%Đ^%Đ^%¼d0§wV §¬fv|(:-fv|%)5™“”y‡’Qduµ̉â«Đë¥Îç¥Îç«Đë«Đë«Đë¥Îç¥Îç«Đë¥Îç¥ÎçœÆç˜ÁÖœÆ̃œÆçœÆ̃„½̃Œ½̃„µ̃{µ̃{µ̃Œ½̃”½̃˜ÁÖ˜ÁÖ„µ̃„½̃„µ̃„µ̃{­̃{µ̃s¥Ö{µ̃{¥Îs­Ö{­Ös­Ö{­̃s­Ös­Ö{­Ö{­̃{­Ös­Ös­Ös­Ös­Ö{­Ös­Ös­Ö{­Î{­Ös¥Ös­Ös¥Î{­Î{­̃s¥Îs­Ö{­̃s¥Ös¥Ös¥Ös¥Ö ̀â«Đë¥Îç¥Îç¥Îç¥Îç¥ÎçœÆç¥Î甽̃œÆ甽̃”½̃”½̃Œ½̃„µ̃”½̃{­̃{µ̃{µ̃{­̃s­Ös­Ös¥Ö{µ̃s­Ö{­̃{­̃s¥Ö{­Ö{­Ö{­Ös¥Ös¥Ö8Xq){­̃{µ̃{µ̃{µ̃{­̃{­̃{µ̃{­̃{µ̃{µ̃{­Ö{µ̃{µ̃{µ̃{µ̃{µ̃„µ̃{­̃„µ̃„µ̃ŒµÖŒ½̃{­Ö„­Î„¥Æ{œµkŒ¥d•]s’R{ŒNsƒNsƒM€²B{µVˆÀB{½gŒÁgŒÁgŒÁh™»sœÎ{¥Î{¥Î{¥Îs¥Î{¥ÎsœÎs¥ÎsœÎsœÎh™»s¥ÎkœËgŒÁgŒÁZ†±VˆÀM€²B{µB{µ7v¹J{­7v¹7v¹1sµ1sµ8Xq™O&Đ^%Đ^%Đ^%Öc%Öc%Öc%̃p.§wV §¬™“”JSU! fv|(:-™“”iwJSUµÖë«Đë¥Îç¥Îç¥Îç¥Îç¥ÎçœÆç¥ÎçœÆç¥ÎçœÆçœÆ̃˜ÁÖ”½̃”½ç”½̃„µ̃{­̃{µ̃{­̃„½̃{­̃Œ½çŒ½̃„½̃Œ½̃„½̃Œµ̃{µ̃{µ̃{­̃s­Ös¥Ös­Ös¥Ös­Ö{­̃s­Ös¥Ös¥Ös¥Ös­Ö{­̃{­Ös­Ö{­̃s­Ös¥Ös¥Ö{µÖs­Ös­Ös­Ö{­Ös­Ös­Ö„­Îs­Ös­Ös­Ös­Ö{­̃{µ̃{­Ö¥Îç¥Îç ̀â¥Æ̃¥Îç¥Îç¥ÎçœÆ̃œÆçœÆ̃”½̃˜ÁÖ˜ÁÖ”½̃”½çŒ½̃„½̃Œ½̃{µ̃{­̃{­̃{µ̃s¥Ös­Ö{µ̃{µ̃s­Ös­Ös­Ös¥Ös­Ös­Ös¥Ö{µ̃)*?P8Xq8Xq8Xq*?P!!1s¥Î{µ̃s­ç„µ̃„µ̃s¥Ö{µ̃„µ̃{µ̃{µ̃{­̃„­Î„µ̃„µ̃{µ̃{­Ö{µ̃„­̃„µ̃„µ̃„µ̃{­Ö{­Î{¥Î{œµg³d•]s’]s’R{ŒNsƒH_t)VˆÀZ†±gŒÁgŒÁgŒÁh™»sœÎkœË{¥Î{¥Î{¥ÎsœÁh™»sœÁs¥Îh™»sœÎh™»kœËs¥Îh™»gŒÁZ†±VˆÀVˆÀB{½B{½B{µB{½1sµB{µ1sµ1sµ7v¹8Xq™O&Đ^%Đ^%Đ^%Öc%Üg%Öc%Æ^)Öc%Üg%Đ|J™“”™“”JSU%)5fv|*?Pajnfv|(:-«ĐëœÆçœÆçœÆçœÆçœÆçœÆ眽̃œÆçœÆçœÆç¥ÎçœÆ̃œÆ̃”½̃”½̃Œ½̃{µ̃Œ½̃{µ̃{µ̃{­Ö{µ̃„­̃„µ̃„µ̃„µ̃„µ̃„½̃{µ̃„µ̃{µ̃{µ̃s­Ö{­Ö{­Ös­Ös­Ös­Ö{­Ös­Ö{­Î{­̃s¥Ös­Ös¥Ö{­Ös­Ös¥Ös­Ös¥Ös­Ö{­Ö{¥Îs¥Ö{­̃{­Ö{¥Îs­Ö{­Ö{­Î{­Ö{­Ös¥Ös­ÖœÆçœÆç¥Îç¥ÎçœÆçœÆç¥ÎçœÆçœÆç˜ÁÖœÆ̃”½̃”½ç”½̃”½̃Œ½̃Œ½̃„µ̃Œµ̃{­̃{­̃{µ̃{­̃{µ̃s¥Ö{µ̃{­̃s­Ös­Ös¥Ö{µ̃{­Ö{¥Î{­̃8Xqs¥Ö{­Ö{­̃s¥Ö{µ̃s­Ö{­̃g³W€¡„½̃{­̃{µ̃ŒµÖ{µ̃{µ̃„µ̃{µ̃{­̃„µ̃s¥Ö{­Ö{µ̃{µ̃„­Î{µ̃„µ̃{µ̃Œ­ÖŒµ̃{­Ö„­Î{ Áh™»sŒ­d•]s’NsƒR{ŒNsƒ*?P*?PVˆÀgŒÁgŒÁsœÎs¥Îh™»{¥ÎsœÎ{¥Î{¥ÎsœÎsœÎ{¥ÎsœÎsœÎsœÎh™»sœÎgŒÁgŒÁgŒÁgŒÁgŒÁB{µZ†±B{½B{µB{½X}’1sµ1sµ1sµ1sµ1sµ8Xq¼d0Đ^%Đ^%Đ^%Üg%Üg%Üg%Üg%Üg%̃p.ç{1ç{1ç{1Çœ~™“”™“”™“”PN)ajniw!!1¥ÎçœÆçœÆçœÆçœÆ̃”½̃¥ÎçœÆç¥Æ̃œ½̃¥Îç¥Îç¥ÎçœÆ̃œÆ̃”½̃”½ç„µ̃{µ̃{µ̃{µÖ{µ̃{µ̃„µ̃{­̃{µ̃„½̃{µ̃„µ̃„µ̃„µ̃„µ̃s­Ö{­Ö{­Ö{­̃s¥Ö{­Ö{­Ö{­̃s­Ö{µ̃{­̃s¥Î{­Ös­Ös­Ös­Ös¥Ös­Ö{µ̃s­Ös¥Î{µ̃s¥Ös­Ös­Ös¥Ös­Ös­Ös­Ös­Ö{­Ö{µ̃{­̃œÆ̃¥Îç¥ÎçœÆçœÆç˜ÁÖ˜ÁÖœÆ̃¥ÎçœÆ甽ç¥ÎçœÆ̃œÆ甽̃Œ½̃”½ç”½çŒµÖ{µ̃„µ̃s­Ö{­̃{­̃s¥Ös¥Î{­Îs­Ö{­Ös­Ö{­̃{­Îs¥Ö{­̃s­Ö{­̃s­Ös¥Ös­Ö{­̃{­̃{µ̃{µ̃8XqR{Œ{µ̃{µ̃{µ̃{­̃s¥Ö{µ̃Œµ̃{­̃{­̃{µ̃{µ̃{µ̃s¥Ös­Ö„µ̃{µ̃„­̃{µ̃{­̃{µ̃{­̃{­Î{¥Æ{Œ­cŒ¥R{Œd•]s’Nsƒ]s’)H_th™»kœË{¥Î{¥Î{¥Î{¥Î{¥Î{¥Î{¥Î{¥ÎsœÎsœÎgŒÁsœÎh™»h™»h™»kœËs¥ÎgŒÁgŒÁ\•¿M€²\•¿B{µB{µ1sµJ{­1sµ1sµ1sµ7v¹1sµ7v¹8Xq¼d0Đ^%Đ^%Öc%Üg%Üg%Üg%ç{1ç{1ç{1ç{1ç{1äCäCäCĐ|J—¢|™“”y‡’!!1ajnfv|ÁÛ́œÆç˜ÁÖœÆ眽̃œÆ̃œÆç¥ÎçœÆ̃”½̃¥Îç¥Îç¥ÎçœÆç˜ÁÖœÆ̃”½çŒ½̃{µ̃„µ̃{­̃s¥Ö{­̃{­̃s­Ö{­̃Œ­ÖŒµÖ„µ̃{­Ö{µ̃{µ̃s¥Ö{­̃{µ̃s­Ös¥Ös¥Îs¥Ö{¥Î{­Îs­Ös¥Îs­Ö{­̃s­Ö{­Ös¥Ös­Ös¥Ö{­Îs­Ös¥Ös¥Ö{­̃{­Ös­Ös¥Ös­Ö{­̃{­Îs­Ös¥Ös¥Ös­ÖœÆ̃¥Î眽̃œÆ̃ ̀âœÆçœÆçœÆç˜ÁÖœÆç¥Î甽çœÆçœÆ̃œÆç˜ÁÖŒ½̃Œ½Ö{µ̃{µ̃s¥Ö„µ̃{­̃s­ÖŒµÖs­Ös¥Ös­Ö{µ̃{­Îs¥Î{µ̃{­ÎŒ­Ö!!1s­Ös­Ös¥Ös¥Ö{µ̃{­̃{­̃{µ̃{µ̃cŒ¥R{Œ{µ̃Œ½ç{µ̃{­̃{­Ö{­̃„µ̃„­̃{µ̃{µ̃{­̃{µ̃s¥Ö„­̃{µ̃{µÖ„­̃{­Ös­Ö{µ̃„­Î{ ÁsœÁg³cŒ¥d•d•NsƒR{ŒNsƒg³h™»{¥Î{¥Î{¥Î–·Ö{¥Î{¥Î–·Ö{¥Î{¥ÎsœÎgŒÁsœÎs¥ÎgŒÁh™»sœÎkœËgŒÁgŒÁgŒÁ\•¿B{µM€²B{µB{µB{½1sµJ{­B{µ1sµ1sµ1sµ7v¹8Xq¼d0Öc%Đ^%Öc%Üg%Öc%Üg%ç{1ç{1ç{1ç{1äCäCäCäCäCïƒCäCÇœ~™“”’¢¯iwajnfv|¥Îç˜ÁÖ¥Î猽֔½çœÆ̃œÆçœÆçœÆ̃œÆ̃¥Îç¥Îç¥Îç ̀â¥Îç˜ÁÖ¥Îç˜ÁÖŒ½ÖŒµ̃„µ̃{µ̃s¥Î{­Î{­̃Œ­ÖŒµÖ{­̃{µÖ„­̃s­Ö„½̃s­Ös­Ös¥Îs­Ö{µ̃{µ̃s­Ö{­Îs¥Ös­Ö{¥Îs¥Îs­Ös¥Îs¥Î{­Ös¥Ös­Ö{µ̃{­Îs­Ös­Ö{­Ös­Ös­Ös­Ös¥Ö{¥Î{µ̃{­Ö{­̃s¥Ö{¥ÎœÆçœÆ̃œÆ眽̃¥Æ̃¥ÎçœÆ̃˜ÁÖ˜ÁÖœÆç˜ÁÖœÆçœÆ̃˜ÁÖ”½̃”½̃{µ̃{­̃Œµ̃{µ̃{µ̃s¥Ö{­̃{­̃s­Ös¥Ö{­Ös¥Ös­Ös­Ös¥Ös­ÖsœÎ{µ̃s¥Ö{­̃s­Ö{­̃{µ̃s­ç{­̃{µ̃{µ̃Gt¢{­̃s­Ö{­̃{­̃{µ̃„­̃{­̃{µ̃{­̃{­̃{µ̃{µ̃{­Ö{µ̃{µ̃s­Ö{µ̃{­̃{µ̃{µ̃{­Ö{ ÁsœÁ{Œ­d•X}’]s’R{ŒNsƒ*?PR{Œ{¥ÎŒ­ÖŒ­ÖŒ­ÖŒ­Ö„­Î„­ÎŒ­Ö{¥ÎsœÎsœÎgŒÁs¥ÎkœËkœËs¥ÎgŒÁgŒÁgŒÁgŒÁB{µ\•¿B{µB{µB{µ1sµB{½1sµ1sµ1sµ1sµ1sµ7v¹*?P¼d0Đ^%Öc%Öc%Öc%Üg%̃p.ç{1ç{1ç{1äCäCäCäCäCäCäCäCäCäCĐ|JÇœ~Ÿ²·¥¥(:-ajnfv|œÆçœÆçœÆ̃œÆ甽ç˜ÁÖœÆç¥Îç¥Îç¥ÎçœÆç«Đë¥ÎçœÆç¥ÎçœÆç¥Îç˜ÁÖ”½̃Œ½Ö{­̃{­̃s­Ös¥Ös­Ö{µ̃{µ̃{­̃{µ̃{­̃{­̃s¥Ö{­Îs­Ös¥Ö{µ̃s­Ö{­Ö{µ̃{­Ö{­Îs¥Ö{­̃{­Ö{­Ös¥Ö{­̃{­Ö{­̃{­Ös­Ös­Ö{­̃s¥Ö{­Ö{­̃s­ÖsœÎ{­̃{­Ö{­̃{­Ös­Ös¥Ö{­̃˜ÁÖœÆçœÆçœÆ̃œÆçœÆ甽̃œÆçœÆçœÆç˜ÁÖ˜ÁÖœ½̃Œ½ÖŒ½ÖŒ½̃Œ½Ö{µ̃{­Ö{­̃{µ̃s¥Ös­Ös¥Ö{­Ös¥Ö{­Ös¥Ös­Ös¥Ös­Ös­Ös­Ö{µ̃)Nsƒs­Ö{­Ö{­̃{­̃{­̃kŒ¥!!1g³{µ̃{µ̃s¥Ö{µ̃{µ̃{µ̃„µ̃„­̃„µ̃{­̃{­̃{µ̃„µ̃{­Ö{µ̃{µ̃„­̃„­Î{µÖ{µ̃{­Îh™»{œµkŒ¥cŒ¥]s’]s’R{ŒR{Œ!JSU„œ½˜ÁÖŒ­Ö–·ÖŒ­Ö„­Î{¥ÎsœÎgŒÁgŒÁkœËkœËgŒÁgŒÁgŒÁgŒÁM€²B{µM€²B{µB{µB{µ7v¹B{½B{µ1sµ1sµ1sµ1sµB{µB{½%)5ÎZ!Öc%Üg%Öc%̃p.̃p.ç{1ç{1ç{1äCäCäCäCäCäCäCäCäCäCäCäCäCäCÇœ~¥¥z’œJSUajniwŒµÎŒ½ÖŒ½̃Œ½̃˜ÁÖœÆ̃˜ÁÖœÆçœÆçœÆç¥ÎçœÆçœÆçœÆ̃œÆ̃œÆçœÆ̃–·Ö”½̃Œµ̃{µ̃{µ̃s­Ö{­̃s­ç{­̃„­̃{µ̃{­̃{­Ö{­̃s¥Ös¥Ös¥Ö{­Ö{µ̃s­Ö{µ̃s­Ös¥Ös¥Ös­Ö{­Ö{µ̃s¥Ös­Ö{­Ös¥Ös­Ö{­Ö{­Î{­Î{¥Îs­Ö{­Ö{­̃{­Î{¥Îs¥Ös¥Ös¥Ö{­̃s­Ös¥Ös­Öœ½̃ ̀âœÆçœÆ̃”½̃”½̃”½̃œÆ̃˜ÁÖ˜ÁÖœÆ甽̃”½̃Œ½̃Œ½̃ŒµÖ„µ̃{­̃{µ̃s¥Ös­Ös¥Ös­Ö{­̃{µ̃s¥Ös­Ö{­Ö{­Ös¥Ös¥Ös­Ös­çs¥Ö%)5)){µ̃{µ̃{µ̃{­̃„µ̃„µ̃{­̃{­̃{µ̃{µ̃{­̃{­̃„­̃{µ̃„µ̃{µÖ„­̃„­̃s­Ö„­Î{­Îs¥Î{œµs–µd•d•]s’R{ŒNsƒNsƒ%)5iw–·ÖŒµÖ„¥Î{¥ÎsœÎsœÎgŒÁgŒÁgŒÁgŒÁgŒÁgŒÁgŒÁVˆÀM€²M€²Z†±B{½B{µB{½B{µ7v¹B{µ1sµ7v¹7v¹B{µB{½)Æ^)Öc%Öc%̃p.̃p.ç{1ç{1ç{1äCäCäCäCäCäCäCäCäCäCäCäCäCäCäC̃p.äCĐ|J™“”™“”ajn*?Pfv|fv|{œ½Œ½̃”½̃Œ½̃Œ½̃”½ç”½̃”½̃œÆçœÆçœÆçœÆ̃œÆçœÆ̃”½çœÆ甽̃Œµ̃„½̃„½̃{µ̃s­Ös­Ös¥Ö{­̃{µ̃„µ̃„µ̃s­Ö{­̃s­Ös¥Ös¥Ö{µ̃s­Ö{­Ös­Ös­Ös­Ö{­Ö{­Îs­Ö{µ̃{­Ös­Ö{­Ö{­Ös­Ö{µ̃s­Ö{­Ös­Ös­Ös¥Ös­Ös¥Ö{µ̃{­̃{­̃{­Ö„µ̃{­̃{µ̃s­Ös¥ÖœÆç˜ÁÖœÆ̃˜ÁÖ”½ç”½̃”½çœÆçœÆ̃”½̃˜ÁÖ”½̃Œ½ç„µ̃Œ½ç„½̃{µ̃{­Ö{­̃s¥Ös¥Ö{­Ö{µ̃s­Ös¥Ös­Ös­Ös­Ös­Ö{­̃{­Ö{­Ö{­Ö{µ̃R{Œ*?P{­̃{µ̃{µ̃„µ̃„µ̃{µ̃„µ̃{µ̃{µ̃„µ̃{­̃ŒµÖ{µ̃{­̃„­Î{­̃{µ̃„µ̃s¥Ö{µÖs¥Îs¥ÎgŒÁcŒ¥cˆ d•R{Œ]s’Nsƒ8XqH_tsŒ­{¥ÎsœÎh™»kœËgŒÁgŒÁgŒÁgŒÁgŒÁVˆÀgŒÁVˆÀVˆÀM€²B{µB{½B{µB{µ1sµ1sµ1sµ1sµB{µB{½B{µÖc%Üg%Öc%Üg%ç{1ç{1äCäCäCäCäCäCïƒCäCïƒCäCäCäCäCäCäCäCäCäC̃p.̃p.Üg%Đ|J§wV™“”y‡’y‡’ajn%)5g³„­̃Œµ̃„½̃Œ½ÖœÆ̃”½çœ½̃œÆ̃œÆ甽̃”½ç”½̃”½̃”½ç”½çŒ½̃Œ½̃„µ̃„½̃{­̃s¥Ös­Ö{µÖs­Ö„­Î{µ̃s­Ös¥Ös­Ös­Ö{µ̃s¥Ös­Ös¥Ö{­Ös­Ö{­̃s­Ös­Ös­Ö{µÖs¥Ö{­Ös¥Ös­Ö{­Ö{­Ös­Ös¥Ös­Ös¥Ö{­Ös­Ös­Ös¥Ös¥Ö{­̃„­̃{µ̃„­Î„µ̃{µ̃s¥ÖŒµ̃˜ÁÖœÆ̃œÆ̃œÆ̃œ½̃”½̃”½̃˜ÁÖŒµÖ”½çŒ½̃Œµ̃Œ½̃{µ̃„µ̃{­Ös¥Ö{­̃s¥Ö{­̃s­Ös­Ös­Ö{­̃s­çs­Ö{­̃s­Ö{­Ö{­̃s­Ö{­Îs¥Ös¥Ö{µ̃X}’{­Ö{µ̃{­̃{­̃{µ̃„µ̃{µ̃„µ̃{µ̃„­Î„µ̃{µÖ{µ̃{µ̃{µ̃{­̃{­Ö{­̃„­Î„­Î{ ÁsœÁg³cˆ X}’R{Œ]s’R{Œ]s’!%)5R{ŒkœËs¥ÖgŒÁgŒÁgŒÁgŒÁgŒÁ\•¿M€²VˆÀZ†±VˆÀB{½B{µB{½B{µ1sµ7v¹B{µB{µB{µB{½B{µÆ^)Öc%ç{1̃p.ç{1ç{1äCäCäCäCïƒCïƒCäCïƒCäCäCäCäCäCäCäCäCäCäCäCÜg%Öc%Üg%Üg%Öc%§wV™“”y‡’z’œiwJSU!cŒ¥{µ̃„½̃Œ½̃Œ½̃„½̃Œ½̃ŒµÖŒ½̃Œµ̃Œ½̃Œ½̃„µ̃Œ½̃„µ̃Œµ̃„µ̃„µ̃Œ½̃{­Ö{µ̃{­̃s­Ö{­Ös¥Ös¥Ö{µ̃s­Ö{­Ös­Ö{µ̃s¥Ö{­Îs¥Ö{­̃s¥Ös­Ö{­̃s­Ös­Ö{­̃{µÖs¥Ö{µ̃„µ̃{­̃{­̃s¥Ös­Ö{­̃{­̃„­̃s¥Ö{­Ös­Ös­Ö„µ̃{µ̃”½çŒ½̃„½̃Œµ̃„½̃ŒµÖ„µ̃œÆçœÆçœÆ̃„µ̃”½̃Œ½̃Œµ̃”½ç”½çŒ½ÖŒµ̃„µ̃„­̃„­̃s¥Ö{µ̃{µ̃s­Ös­Ös­Ö{µÖ{µ̃s­Ös¥Ös¥Ö{­Îs­Ös­Ös¥Ö{­̃s­Ö{µ̃s¥Ös­Ö{µ̃Nsƒ%1s¥Ö„µ̃s¥Ö{µ̃{¥Î{­Ö{­̃{­̃„­̃„µ̃{­Ö{µ̃„­̃{µ̃{­Ö{µ̃„µ̃„µ̃{­̃„­Î{­̃s­Öh™»g³cŒ¥X}’R{ŒR{ŒQdufv|8XqgŒÁgŒÁgŒÁgŒÁ\•¿VˆÀB{½B{½Z†±B{½B{µB{µ7v¹B{µ1sµB{µ1sµB{µB{½M€²J{­Üg%̃p.̃p.̃p.äCäCäCäCïƒCïƒCïƒCäCïƒCäCäCäCäCäCäCäCäCäCäCç{1̃p.̃p.Öc%Üg%Üg%Üg%Öc%Üg%&#JSUd•z’œ{Œ­Qdu!!1W€¡s­Ö„½̃{µ̃ŒµÖ„½̃„µ̃{µ̃„µ̃{­Ö{µ̃{µ̃{µ̃„½̃„µ̃„­̃{µ̃{­̃s¥Ö{µ̃{µ̃s¥Ös­Ös­Ös¥Ös¥Ö{­̃s­Ö{­̃s­Ös­Ö{­Ös¥Ös¥Î{­Ös­Ö{­Ös­Ö{­Ös­Ös­Ö{­̃{­Ö„µ̃{µ̃„­Î{µ̃s¥Ös¥Ö{­Ö{¥Î{­Îs­Ö{­Ös­Ös¥Ö{­̃Œ½Ö„­̃Œ½̃Œµ̃Œ½̃Œ½̃„½̃ŒµÖœÆç˜ÁÖŒ½Ö”½çŒµÖŒ½̃Œµ̃{µ̃Œ½̃{­̃{­̃„µ̃„½̃{µ̃s­Ö{µ̃{­Ös¥Ös­Ös¥Ös¥Ö{­̃s­Ös¥Ö{µ̃{µ̃s¥Ös­Ös¥Ös­Ös­Ös¥Ös­Ös­Ö{­̃s¥Ö*?PgŒÁ„µ̃{µ̃{µ̃s­ç{­̃„½̃{µ̃Œµ̃{µ̃{µ̃{­̃{µ̃{­Ö{­̃{­Ö{µÖ{­Ö„µ̃{µ̃s¥Ös¥ÖsœÎh™»kŒ¥cˆ Gt¢R{ŒR{ŒR{Œ*?P!!1X}’gŒÁgŒÁM€²B{µgŒÁB{½B{½B{½B{µB{µB{µ1sµ1sµB{½B{½B{½VˆÀGt¢&#Üg%̃p.äCäCäCäCäCäCïƒCïƒCïƒCäCïƒCïƒCäCäCäCäCäCäCäCäCç{1Üg%Üg%Üg%Öc%Öc%Öc%Üg%Öc%Üg%%)5fv|{Œ­{œµ{œµJSUX}’s­ç„­Î{µ̃{­̃{µ̃s¥Ös­Ö{µ̃{µ̃{µ̃{­̃s¥Ö„µ̃s¥Ös¥Ö{­̃{µ̃{­̃s­Ös­Ös­Ö{­̃s­Ö{­Îs­ÖsœÎ{­̃s­Ö{­̃s­Ö{­̃{­Î{­Îs­Ös¥Ös­Ö{­Ös­Ös¥Ö{­̃Œ­Ö„­Î{­Ö{­̃s¥Ö{µ̃Œµ̃{µ̃s­Ö{¥Î{­̃s¥Ös¥Ö{­Ös­Ö{­̃Œ­Ö”½ç”½̃Œ½̃”½ç”½̃Œ½̃”½ç˜ÁÖœÆ甽̃”½ç„µ̃„µ̃„µ̃ŒµÖ{µ̃s­ç{µ̃{­Ö{µ̃„­̃sœÎs­Ös­Ö{­̃s¥Ö{­̃{µ̃{¥Ö{­̃{­̃{­̃{µ̃{­̃{µ̃{µ̃{­̃s¥Ö{­̃{­̃s­Ö{­̃{µ̃{µ̃*?P{ Á8Xq„µ̃{­̃s­ç{­̃{­̃{µ̃„­̃„­̃s¥Ö„­̃ŒµÖ{µ̃ŒµÖ{¥Î{­̃{­̃„­̃{µ̃s­Ös¥Ö{œµcŒ¥cŒ¥W€¡R{ŒR{ŒR{ŒR{Œ*?PgŒÁ\•¿B{½B{½B{½B{µ7v¹B{µB{½B{½B{½B{½B{½B{½VˆÀHp”PN)ç{1̃p.äCäCäCäCïƒCïƒCê¤[ïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCäCç{1ç{1Üg%Üg%Üg%Üg%Öc%Üg%Öc%Æ^)Üg%QduŒ­ÆŒ½ÖœÆç{œµ)d•s¥Ö{­Ö{µ̃{µ̃s­Ö{­̃s¥Ös¥Ös¥Ö{­̃s­Ös¥Ö{µ̃{­̃{µ̃{­̃{¥Îs­Ös¥Î{­Ös­Ö{­̃{­̃s­Ös­Ö{µ̃{µ̃{­̃{µÖ{­̃{­Î{µ̃s¥Ös­Ös­Ös­Ös­Ö{­̃{­̃{µ̃{µ̃Œ­Ö{­̃„µ̃„µ̃„µ̃{µ̃{­Îs­Ös­Ös¥Ös­Ö{­Î{­Îs¥Ö{µ̃Œ½̃”½çœ½̃Œ½̃œÆ̃”½ç˜ÁÖ”½çŒ½̃”½̃Œ½̃Œ½̃Œ½̃ŒµÖ{µ̃{µ̃{­̃s¥Ös¥Ö{­̃s­Ös¥Ö„­Î{­̃s­Ös­Ö{­Ös¥Ös­Ö{­̃s¥Ö{­̃{­̃{­̃s­Ö{µ̃{µÖ{­̃{­Ö{­̃{­̃s­Ös­çs­Ös­Ö{µ̃X}’{­̃{µ̃{­̃{µ̃„µ̃{­̃„­̃{­̃„µ̃„µ̃{­̃{µ̃{µ̃{­̃{µÖ{­̃„µ̃{­̃s¥Ö{¥Îs¥ÎgŒÁcŒ¥R{ŒHp”R{ŒNsƒ8Xq!!1Hp”Z†±B{½B{µB{µB{µB{µB{½B{½B{½B{½B{½gŒÁ8Xq™O&äCç{1äCäCäCäCäCê¤[ê¤[ïƒCïƒCïƒCäCäCäCäCäCäCäCäCäCç{1Üg%ç{1Üg%Üg%Üg%Üg%Üg%Üg%Üg%Öc%*?P„ µœÆ甽ç{¥Î8Xq8Xqs­Ö{­̃{­Ös¥Ös­Ös¥Ö{­̃s¥Ö{­̃{µ̃s­Ös¥Ö{­Ös¥Ös­Ö{µ̃s¥Ö„­Îs­Ö{­Îs­Ö{­Î{­̃{µ̃{­Îs¥Î{­Ös­Ös¥Ös¥Ös­Ö{­Î{­̃{­Î{­Ö{­Îs¥Ö{­̃{­̃{­̃Œ½̃„­Î{µ̃„µ̃{µÖ„µ̃„µ̃„½Ö{µ̃{µ̃s­Ös­Ös¥Ö{­̃s¥Ö{­̃{­̃Œ½Ö˜ÁÖœÆ̃œÆçœÆçœÆçœÆ̃ŒµÖŒµÖ„½̃Œ½̃{µ̃„µ̃{µ̃{­̃s¥Ös­Ös¥Ö{­̃s¥Ös­Ö„­Î{­̃{µ̃s­Ös¥Ös­Ös­Ös­Ös­Ös¥Ö{­̃s¥Ös¥Ö{­̃s¥Ös¥Ö{­Ö{µ̃s­Ös­Ös­Ös­Ös­Ös¥Ös­Ös­ÖZ†±8Xq*?P){µ̃s­ç{µ̃{­̃{­̃{­̃„½̃„µ̃„µ̃{µ̃„µ̃Œ­Ö{µ̃{µ̃{µ̃„µ̃„­Îs­Ös¥ÖgŒÁh™»cŒ¥W€¡X}’R{ŒNsƒNsƒ)*?PJ{­B{½B{½B{µB{½B{½VˆÀM€²Z†±VˆÀ*?PĐ|JäCäCäCäCäCïƒCê¤[ê¤[ïƒCïƒCïƒCäCäCäCäCäCäCäCäCç{1ç{1ç{1̃p.̃p.Üg%Öc%Üg%Öc%Üg%Üg%Öc%Üg%!Nsƒ{­Ö{­̃{­̃s¥Ö{µ̃{­Ös­Ös­Ö{­̃{­̃{­Ö{­Ös­Ös­Ö{µ̃s¥Ös­Ös¥Ö{µ̃{µ̃s­Ö{­Ö{­̃s¥Ö{­Îs­Ö{­̃{µ̃s­Ö{­̃s¥Ös­Ö{­Ös¥Ö{­Ö{­Î{­Îs­Ös¥Ös¥Ö{­̃{µ̃s¥Ö{­̃„½̃{­̃„µ̃Œ½̃Œµ̃Œ½̃„µ̃{µ̃„­̃{µ̃{µ̃{µ̃s¥Ö{µ̃„µ̃Œ­Ö”½̃ ̀âœÆç«Đë¥Îç¥Îç¥Î甽焵̃{µ̃{µ̃{µ̃s¥Ö„µ̃s­Ö{µÖ{µ̃{­̃s­Ö{­̃s¥Ös¥Ö{­̃{­̃s¥Ös¥Ö{­̃s¥Ö{­̃{­̃{­Ö{µ̃{­̃s¥Ös¥Ö{­̃{­̃s¥Ös­Ös¥Ö{µ̃s¥Ös¥Ös­Ös¥Ös¥Ö{µ̃{µ̃\•¿8Xq)s¥Ös¥Ös­ç„µ̃„µ̃Œµ̃{µ̃{­̃„µ̃„µ̃{­̃s¥Ö{­̃„µ̃{­̃„µ̃{­̃{µ̃sœÎs¥ÎcŒ¥Z†±R{ŒHp”R{ŒHp”H_t! §wV)9Hp”VˆÀVˆÀVˆÀVˆÀ\•¿gŒÁgŒÁ!!1Đ|JäCäCäCäCïƒCïƒCïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCäCäCç{1̃p.̃p.̃p.Öc%Öc%Üg%Üg%Üg%Öc%Öc%Öc%Üg%*?PkœËs¥Ö{­Ös¥Ös­Ös­Ös­Ös­Ös¥Îs­Ö{­Ös¥Ö{­Îs¥Ö{­Ös­Ös­Ös­Ös­Ö{­Îs­Ös­Ös¥Î{­Ös¥Ös­Ö{­Î{­̃{­Ös­Ös­Ös¥Ö{µ̃s­Ös­Ö{­Ös­Ös¥Ö{µ̃{µ̃{µ̃{­̃{µ̃„µ̃„µ̃ŒµÖ”½̃Œ½ÖŒ½ÖŒ½ÖŒµÖŒµ̃{µ̃{­Ö{µ̃{­̃”½̃”½çœÆçœÆç«Đë«Đëµ̉âµ̉â«Đë{­̃{µ̃{µ̃{­Ös¥Ö{­Ö{­Ös­Ö{­̃{µ̃s­Ös¥Ös¥Ös­Ö{µÖs¥Ös­Ös­Ös­Ös¥Ös¥Ös¥Ös¥Ös­Ös­Ös­Ö{­̃s­Ös­Ö{­̃{µ̃s¥Ö{­̃{µ̃s¥Ö{µ̃s¥Ö{­̃cˆ 8Xq!!1{µ̃{­̃{µ̃{µÖ„­̃{µ̃„µ̃{­̃„µ̃„µ̃„µ̃{­ÖŒµÖ{­̃„µ̃{­̃s­Ös¥ÖsœÁgŒÁg³W€¡R{ŒR{ŒHp”Nsƒ%)5§wVüÜlüÜl§wVPN)8XqW€¡gŒÁgŒÁgŒÁgŒÁ ïƒCäCäCäCäCïƒCïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCäCäCç{1ç{1̃p.ç{1Üg%Öc%Öc%Üg%Üg%Öc%Öc%Öc%Öc%Öc%Hp”s­Ö{­Îs­Ös¥Ös¥Î{­Ö{­Ö{µÖ{µ̃s¥Ös¥Ös¥Ös¥Ö{­Ö{­Ö{µÖs¥Ö{­Ös­Ö{­Ös­Ö{­Ös­Ös­Ös¥Ös¥Ös¥Ö{­Ö{­̃{­Ös¥Ös¥Ös­Ös­Ös­Ös­Ö{­̃s­Ös¥Ö{­̃{­̃„½̃Œµ̃„µ̃”½̃”½̃”½̃”½ç”½̃”½ç„½̃„½̃„µ̃Œ½çŒ½̃”½ç”½̃¥Îç«Đëµ̉â½ĐáµÖëÁÛ́ÁÛ́Œ½̃„½̃{µ̃{µÖs¥Ö{­̃s¥Ö{­̃{­̃s¥Ö„­̃s­Ö{­̃{µ̃{­̃s¥Ö{­̃{­̃{­̃{­̃s¥Ös­Ö{µ̃s¥Ö{­̃{­̃s¥Ö{­̃s¥Ö{µ̃s­ç{­̃{µ̃{µ̃{­̃Z†±8Xq{µ̃s¥Ö„µ̃„µ̃{µ̃{µ̃„µ̃„­̃{µ̃„µ̃„­̃„½̃{µ̃{µ̃{µ̃{µ̃s­Ös¥Î{¥ÆgŒÁcŒ¥W€¡Hp”Hp”NsƒH_tüÜlüÜlüÜlüÜlüÜlê¤[PN)*?PR{ŒgŒÁW€¡&#äCïƒCäCïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCäCäCäCäCäC̃p.ç{1ç{1ç{1ç{1̃p.Üg%Üg%Üg%Öc%Üg%Öc%Üg%Öc%Đ^%Đ^%Öc%R{Œ{µ̃s¥Ös­Ö{µ̃{­Ös­Ö{­Îs¥Ö{­Îs­Ös­Ö{­Ö{­Ö{­Ö{µ̃{­̃s­Ös¥Ös­Ös­Ös­Ös­Ös­Ö{­Î{­̃{­̃s¥Ö{­̃s­Ö{­̃s­Ös¥Ös¥Ös­Ö{­Ö{­̃{­̃s­Ö{­̃s¥Ö{­̃{µ̃„µ̃”½ç”½̃”½̃”½ç”½̃”½ç”½̃Œµ̃”½̃Œ½̃ŒµÖ”½̃”½çœÆçœÆç«ĐëµÖëÁÛ́ÁÛ́ÁÛ́µÖ딽猽̃Œ½̃{µ̃{­̃{­Ö{­̃s­Ö{­̃s¥Ös­Ös¥Ös¥Ös¥Ö{µ̃s¥Ös­ç{­̃{µ̃{­̃s¥Ö{­Ö{­̃s¥Îs¥Ös­Ö{µ̃{­̃{­̃s­Ö{­Ös­Ös­Ö{µ̃Nsƒs¥Ös¥Ös¥Ö{­̃{­̃„µ̃{­̃„½̃„µ̃{µ̃„µ̃{­̃Œ­Ö{µ̃„µ̃{­̃s¥ÎkœËkœËcŒ¥cˆ X}’NsƒNsƒNsƒ%)5PN)üÜlüÜlüÜlüÜlüÜlÿØLÿØLÿØL¦t8')!PN)ïƒCäCïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCäCïƒCäCäCäCç{1ç{1̃p.ç{1̃p.ç{1ç{1Üg%Üg%Öc%Üg%Üg%Öc%Öc%Öc%Đ^%Đ^%Öc%X}’{­Îs­Ös­Ös¥Ö{­Ös¥Ö{­̃s¥Î{­̃s­Ös­Ös­Ös¥Ö{­̃s¥Ös¥Ö{­Ös­Ös­Ös­Ös¥Ös­Ös­Ö{­̃s¥Ös¥Ös­Ös¥Ös¥Ös­Ö{µ̃s¥Ös¥Ö{­̃{­̃s­Ö{­Ö{µÖs¥Ös¥Ös¥Ö{­Ö„½̃ŒµÖ”½ç„µ̃Œµ̃”½̃”½çŒ½̃”½̃”½ç”½ç”½ç˜ÁÖœÆ̃˜ÁÖ¥Îç«Đë½ĐáµÖëÁÛ́ÁÛ́ÁÛ́œÆ̃˜ÁÖ˜ÁÖ„µ̃„½̃s­Ös¥Ö{­̃s­Ös­Ös­Ö{­Ö{­̃s¥Ö{­̃s¥Ös­Ö{­̃s¥Î{­Ös¥Ö{­̃{µ̃s­Ö{µ̃{­̃s¥Ös¥Ö{µ̃s¥Ös¥Ö{­̃s­Ös¥ÖNsƒ*?P{­̃s¥Ö{µ̃{µ̃{­̃{­̃„µ̃{µÖ{­̃{µ̃„µ̃Œ­Ö{µ̃„µ̃{µ̃s­Ö{­Îh™»gŒÁcŒ¥X}’R{ŒR{ŒHp”H_tÇœ~üÜlüÜlüÜlüÜlüÜlüÜlÿØLÿØLÿØLÿ̃B÷Ô;PN) §wVäCïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCç{1̃p.Üg%ç{1̃p.Üg%Üg%Đ^%Üg%Öc%Öc%Đ^%Đ^%Đ^%Đ^%¼d0X}’{­Ös­Ös¥Î{­̃s­Ö{µ̃s¥Ö{­Ö{¥Î{­Î{µ̃{­Ös¥Ös¥Ö{µ̃{­̃s¥Ös­Ös­Ö{­Îs¥Ö{µ̃s­Ö{­Ös¥Ö{­Ös­Ö{­Ö{µÖs¥Ös¥Ö{­̃s­Ös¥Ös¥Ös¥Ös¥Ös¥Ös­Ös­Ö{­̃s­Ö„­̃Œ½çŒ½̃„½̃”½̃Œ½̃Œ½̃–·Ö˜ÁÖ˜ÁÖœÆ̃˜ÁÖœÆ̃˜ÁÖ˜ÁÖ¥Îçµ̉âÁÛ́Î̃ïÇÔâÁÛ́ÁÛ́”½̃¥Î甽̃”½ç„½̃{­̃s­ç{­Ös­Ö{­̃{­̃{­̃s¥Ö{­̃s¥Ö{­̃s­Ös­Ös­Ös¥Ö{­Ös­Ös­Ös¥Ö{­Îs­Ös¥Ö{­̃{­̃s­Ös¥Ös­Ös¥Ös­ÖNsƒ*?Ps¥Î{µÖ{µ̃{­̃„½̃s­Ö{µ̃s­Ö„­̃{­̃„µ̃„µ̃{µ̃Œ­Ö{­̃{µ̃{µ̃s­Ös­ÖgŒÁs–µcŒ¥cŒ¥]s’]s’NsƒR{Œ%18'üÜlüÜlüÜlüÜlüÜlüÜlüÜlÿØLÿØLÿ̃BÿØLÿ̃Bÿ̃Bÿ̃BÛ²'8'Đ|JïƒCïƒCïƒCïƒCïƒCê¤[ïƒCäCïƒCäCäCäCäCäCäCäCäCç{1̃p.Üg%Üg%Üg%̃p.Üg%Üg%Öc%Öc%Öc%Đ^%Đ^%Æ^)Đ^%¼d0X}’{­Îs¥Ös­Ö{­Îs¥Ös¥Ös¥Ös¥Ös¥Ös¥Ö{­Î{­Î{­Îs­Ös­Ös­Ös­Ö{µ̃s¥Ös­Ös­Ös­Ö{­Îs­Ös¥Ös¥Ö{­Ö{­Ös­Ös­Ös¥Ös¥Ö{­Î{­̃{­̃s¥Ö{µ̃s­Ö{­̃s­ÖsœÎ{­Ö{µ̃Œ½ç„µ̃„µ̃”½̃Œ­Ö”½̃ŒµÖ”½̃”½çœÆ̃˜ÁÖ”½̃˜ÁÖ¥Îç¥Îç¥ÎçÁÛ́Î̃âÁÛ́̉ặÎ̃ïœÆçœÆ̃”½ç”½ç„µ̃s­Ös­Ö{­̃s­Ö{­Ös¥Ös¥Ö{µ̃s¥Ö{­̃{­̃{¥Î{­̃{µ̃s­Ös¥Ös­Ös¥Ö{µ̃s­Ö{­̃{­Ös¥Ö{µ̃„­Î{­̃s­Ö{­̃{­̃Nsƒ!NsƒsœÎŒµÖ{­̃{µ̃{µ̃s¥Ö{µ̃{µ̃{µ̃{µ̃{­̃s¥Ö„µ̃„µ̃„µ̃{µ̃{µ̃s­Ös¥Ö{µÖs­Ös­Ös–µgŒÁcŒ¥d•R{ŒR{ŒNsƒ8XqÇœ~üÜlüÜlüÜlüÜlüÜlüÜlüÜlÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;÷Ô;û̉-Û²'PN)! ïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCç{1̃p.̃p.Üg%̃p.Üg%Üg%Üg%Đ^%Öc%Öc%Öc%Đ^%Öc%Đ^%Đ^%¼d0gŒÁ{¥Îs­Ö{­̃{­Ö{­̃s­Ö{­ÖsœÎs¥Ös­Ös¥Î{­Ö{­Ös­Ös­Ö{¥Î{µ̃s¥Ös¥Îs­Ö{µÖs¥Ös¥Î„­Î{­̃{­Ös­Ös­Ös¥Ö{­Î{µ̃s­Ö{­Îs­Ö„½̃{µ̃{µ̃„µ̃{µ̃s­Ö{­̃{µ̃{µ̃„µ̃Œ½̃Œµ̃Œ½̃”½̃Œµ̃œÆç˜ÁÖœÆçœÆçœÆ甽甽̃¥Îç¥Îçµ̉âµÖëÎ̃ïÎ̃ïÎ̃ï̉ặ˜ÁÖ”½̃”½̃”½ç„µ̃„µ̃{­̃s¥Ö{­̃{­Ös­Ö{­̃s­Ös­Ö{µ̃{­̃s¥Ö{­̃s­Ö{µ̃s¥Ö{­̃{­Ö{µ̃s¥Ö{µ̃s¥Ö{µ̃s¥Ö{­̃{­Ö{­̃{­̃{µ̃Hp”*?PW€¡„­̃{µ̃{­̃{µ̃{µ̃{­̃s¥Ös­çs­Ö{µ̃{­̃{­̃„­̃„µ̃{µ̃s¥Ö{µ̃s­ç{­̃s¥Ös­Ö{¥Îh™»gŒÁGt¢X}’R{ŒR{ŒR{Œ)8'üÜlüÜlüÜlüÜlüÜlÿØLüÜlüÜlüÜlÿØLÿØLÿØLÿØLÿØL÷Ô;û̉-û̉-ÿ̉ÿ̉ûȦt8'&#Đ|JïƒCïƒCïƒCïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCç{1äC̃p.ç{1̃p.Üg%Üg%̃p.Öc%Üg%Öc%Üg%Öc%Đ^%Öc%Đ^%Đ^%Đ^%™O&gŒÁ{µ̃{µ̃{­̃{­Ös¥Ö{µÖ{µ̃{­̃{­Ös­Ös¥Îs¥Ö{­Ös¥Î{­Ö{­ÖsœÎs¥Ös¥Ös­Ös¥Ös­Ös­Ös¥Ös¥Ö{­Ös¥Îs­Ö{­Ös­Ös¥Ö{­Ö{­̃{­̃{µ̃ŒµÖ{µ̃„µ̃„µ̃{µ̃s­Ö{­Ö{­̃Œ½̃„µ̃Œ½Ö”½çŒµ̃œÆçœÆçœÆçœÆç ̀â¥Îç¥Îç¥Îç¥Îçµ̉â½ĐáµÖëÎ̃ïÎ̃ï̃ç÷̃ç÷”µâœÆ甽猵̃Œ½ç„µ̃{µ̃{­̃s¥Ös­Ös¥Ös¥Ös¥Ös­Ös­Ö{µ̃{­̃s¥Ö{­̃s¥Ö{­Ös¥Ös¥Ö{µ̃s¥Ös¥Ö{­̃s¥Ö{­̃{­̃s­Ö{µ̃s¥Ö{­Öcˆ %18XqW€¡{µ̃{­̃s¥Ö{µ̃{­̃{µ̃{­̃{­̃„µ̃{µ̃{µ̃{µ̃s­ç{µ̃{µ̃s¥Ös¥Îh™»g³cŒ¥d•R{ŒR{ŒNsƒ*?P§wVÿØLüÜlüÜlÿØLÿØLüÜlüÜlüÜlÿØLÿØLÿØLÿØLÿØLÿ̃Bÿ̃Bû̉-ÿ̉ÿ̉ûÈÿ̉ÿ̉ûÈÛ²'™O& 8'™O&ê¤[ïƒCïƒCïƒCïƒCäCäCäCäCäCäCäCç{1ç{1̃p.̃p.ç{1ç{1̃p.Üg%Üg%Üg%Öc%Đ^%Đ^%Öc%Đ^%Đ^%Đ^%Đ^%PN)sœÎ{­̃{­Î{µ̃s­Ö{­Ös­Ö{­Îs­Ö{µ̃{­̃{µ̃s­Ös¥Ös­Ös­Ös¥Ös­Ö{­Ö{­Îs¥Ö{­Ö{­Îs­Ö{­Ös¥Ö{­Ö{­Ös­Ös¥Ös­Ös¥Ö{­Ös¥ÖŒµ̃{µ̃„µ̃„½̃„µ̃{µ̃ŒµÖ{µ̃{µ̃Œ½̃„µ̃Œ½̃”½̃œÆ̃œÆ眽̃œÆç ̀â¥Îç«Đëµ̉âµ̉âµ̉â«ĐëÁÛ́½ĐáÁÛ́Î̃ï̉ặ̃ç÷̃âçœÆ̃œÆ甽甽̃Œ½çŒ½̃{­̃{­̃{µÖs­Ö{­Ös¥Ös¥Ös¥Ös¥Ös¥Ö{µÖs¥Ös­Ö{­̃{­̃s­Ös¥Ös¥Ö{µ̃s­Ös¥Ös¥Ö{­Ö{­̃s¥Ös­Ös­Ös­Ös¥Ös­ÖkœËNsƒ*?P*?P{µ̃„½̃s­ç{µ̃{µ̃{­̃{µ̃{µ̃{µ̃{µ̃{­̃{µ̃{­Ös¥ÖsœÁh™»cŒ¥cˆ W€¡X}’R{ŒNsƒ&#ÿØLÿØLÿØLÿØLÿØLÿØLüÜlÿØLüÜlüÜlÿØLÿØLÿØLÿØLÿØLÿ̃Bû̉-ûÈûÈÿ̉ÿ̉ÿ̉ÿ̉ûÈûÁæ·¦t8'PN)Đ|Jê¤[ïƒCäCäCäCäCäCäCäCç{1äCäCç{1ç{1Üg%Üg%Öc%Üg%Öc%Đ^%Öc%Öc%Đ^%Đ^%Đ^%Đ^%Đ^%8'{­Ös¥Îs­Ös­Ös­Ö{­Ö{­Ös­Ös­Ös­Ös­Ös­Ö{­Ö{­Ös­Ö{­Ös¥Ös­Ös­Ö„­Îs¥Ös­Ös­Ös¥Ös­Ös­Ö{­Î{­̃s­Ös­Ös­Ö{­̃s­ÖŒµÖ{­̃{µÖ{µ̃„µ̃{µ̃ŒµÖ„µ̃„µ̃„µ̃ŒµÖ”½̃”½çœÆç¥Îç¥Îç¥ÎçœÆç¥Îç«Đëµ̉â½ĐáÁÛ́ÇÔâÇÔâµ̉âÎ̃ïÎ̃ïÎ̃ẩặ̃ç÷̉ặ”½ç˜ÁÖ”½̃”½çŒµ̃„µ̃Œ½̃„­̃s­Ö{µ̃s¥Ö{­Ös­Ö{­Ös¥Ös­Ö„­̃{­Ö{­Ös­Ö{­̃{­Ö{­̃s¥Ös­Ös­Ös¥Ös­Ös¥Ö{µ̃{­̃s¥Ö{µ̃{­̃{µ̃{­̃{­̃s­Ö{­̃{­ÖcŒ¥8Xq%1{µ̃{µ̃{µ̃{­̃{µ̃{µ̃{­̃{µ̃{µ̃s­Ö„­̃s¥Ös­Ös¥Î{œ½g³cŒ¥W€¡R{ŒNsƒHp”%)5§wVÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bû̉-ÿ̉ûÈÿ̉ÿ̉ûÈÿ̉ûÈûÁûÁûÁûÁæ·PN)8'§wVäCäCäCäCäCäCç{1ç{1ç{1̃p.ç{1Üg%Üg%Üg%Üg%Üg%Öc%Đ^%Öc%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%8'{µ̃s¥Ös­Ö{­Î{µÖs¥Î{­Ös¥Ös­Ö„­̃s¥Ö{­Ö{­̃{¥Î{¥Î{¥Îs¥Îs¥Î{­Ös­Ö{­Ös­Ös­Ös¥Ö{µ̃{­Ö{­Îs­Ös­Ös­Ös¥Ö„µ̃{µ̃{­̃{µ̃{µ̃{µ̃„µ̃{µ̃„µ̃Œ½̃Œµ̃Œµ̃”½̃œÆçœÆç¥Îç«Đëµ̉âµ̉âµ̉âÁÛ́½ĐáÁÛ́ÇÔâÎ̃ï̉ặÎ̃ï̉ặ̉ặÎ̃ïØëó̃âç̃ç÷̃ç÷œµ̃”½ç”½̃Œ½̃„½̃„­̃„µ̃s¥Ö„½̃s¥Îs¥Îs­Ös¥Ö{­̃s¥Ös­Ös¥Ö{µ̃{­̃{­̃{­̃{µ̃s­Ö{­̃s¥Î{­Ös­Ö{µ̃{­̃{­Ö{­̃s¥Ös­Ö{­̃s¥Ö{­̃{µÖ{µ̃{­̃{­̃{µ̃s¥Îg³H_ts­ç{µ̃s­ç{µ̃{µ̃s­ç{µ̃{µ̃{­Ö{µ̃{µ̃{­ÎsœÎ{œ½h™»cŒ¥W€¡R{ŒR{ŒR{ŒH_t! ÷Ô;÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;û̉-ÿ̉ÿ̉ÿ̉ûÈûÈûÈûÁûÁûÁûÁûÁûÁûȦt&#™O&ç{1äCç{1äCäCäCäCÜg%̃p.̃p.Üg%Öc%Üg%Üg%Öc%Üg%Đ^%Đ^%Öc%Đ^%Đ^%Đ^%Đ^%! {­Î{­Î{­Î{µ̃s¥Î{­Ös¥Ös­Ös¥Ö{¥Îs­Ös­Ös¥Ös­Ös­Ös­Ös¥Ös­Ös¥Ö{­Î{­Ös­Ös­Ö{¥Ös¥Ös¥Ö{­̃{µ̃s¥Î{­̃„­Î„µ̃„µ̃{µ̃{µ̃Œ½Ö{­Ö„µ̃„µ̃„­̃{­̃„½̃ŒµÖ”½çœÆçœÆ̃¥Îçµ̉âµ̉âµ̉âµÖëÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặÎ̃ïÎ̃ï̃ç÷̉ặ̃ç÷̃ç÷̉ặØëó̃ç÷œÆ甽甽̃ŒµÖŒ½ç{µ̃„­̃{µ̃s­Ö{µ̃{µ̃{­̃s­Ös­Ös­Ö{­̃s­Ös­Ös¥Ö{­̃s¥Î{µ̃s¥Ös¥Ö{­Ö{­̃{­̃s¥Ö{µ̃s­Ös­Ö{µ̃{­̃{µ̃{µ̃s­Ös¥Ös¥Îs–µ8Xq!{µ̃{­̃{µ̃{­̃{­̃„­Î„µ̃{­̃{­̃{µ̃s¥Ös¥Ö{œ½gŒÁkŒ¥Gt¢R{ŒR{ŒR{ŒR{Œ¦tû̉-÷Ô;ÿ̃Bÿ̃Bÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;ÿ̉ÿ̉ÿ̉ÿ̉ûÈûÈûÁûÁûÁûÁûÁûÁûÈÿ̉û̉-Û²'PN) PN)¼d0äCäCäCç{1ç{1Đ^%Üg%Üg%Üg%Öc%Öc%Öc%Öc%Üg%Đ^%Đ^%Öc%Đ^%Đ^%Đ^%){­̃s¥Ö{­Î{­Ös­Ös­Ös­Ös­Ös¥Ös­Ö{­Ö{­Îs¥Îs­Ös­Ös­Ö{µ̃{µ̃{­Îs¥Ös¥Ö{­Ö{­Ö{µ̃s¥Ös¥Î{µ̃{­Ö{µ̃„­̃{­̃{µ̃„µ̃Œ½̃{µ̃{­̃„µ̃{­̃Œ½̃„µ̃ŒµÖŒµ̃”½̃˜ÁÖ¥Îç­Î̃µ̉âÁÛ́ÁÛ́µÖëÁÛ́Î̃âÎ̃âÎ̃ïÎ̃ï̃ç÷̃ç÷âï÷âï÷̃ç÷âï÷̉ặ̉ặ̃ç÷̃ç÷˜ÁÖŒ½̃Œµ̃„µ̃„µ̃”½çŒµÖ{µ̃{µ̃{­̃s­Ös­Ö{­Ös­Ö{µ̃s­çs­Ös­Ös¥Ö{­̃s¥Ös¥Ös¥Ös¥Ö{­Îs­Ös­Ös­Ö„­̃{µ̃{µ̃s­Ö{­̃s¥Öh™»*?P{­̃{­̃{­̃{­̃Œ½̃{­̃„­̃„µ̃s­Ö{­Ös¥Ös¥ÎgŒÁcŒ¥W€¡W€¡]s’Hp”R{Œ%)5&#ÿ̉ÿ̉ÿ̉û̉-÷Ô;ÿ̃B÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bû̉-ÿ̉ûÈûÈÿ̉ûÈûÁûÁûÁûÁûÁûÁûÈÿ̉û̉-÷Ô;ÿ̃BÿØLĐ|J ™O&ç{1Üg%Üg%Üg%Üg%Üg%Üg%Üg%Öc%Öc%Đ^%Đ^%Đ^%Öc%Đ^%Đ^%Đ^%ÎZ!*?P{µ̃s¥Îs¥Ö{­̃{­Ö{­Îs¥Ös­Ö{¥Îs­Ös­Ös­Ös¥Ö{µÖ{­̃{µ̃{µ̃{­Îs­Ö{­̃s­Ö{­Ös­Ös­Ö{­̃{­̃{¥Î{­Ö„µ̃„­̃{µ̃{­̃{­Ö{µ̃ŒµÖs¥Ö„µ̃„µ̃„½̃{µ̃Œµ̃˜ÁÖœÆç¥Îç¥Îç«Đë«ĐëÁÛ́µ̉âÁÛ́ÁÛ́ÁÛ́̃ç÷̃âç̃ç÷̃âç̃ç÷̃ç÷âï÷̃ç÷̉ặ̃ç÷̉ặ̃âç̃ç÷œÆ̃Œ½̃„µ̃ŒµÖ{­̃„µ̃{µ̃{­̃{­̃„­Î{­Ös­Ös¥Ös¥Ös¥Ö{­̃{­̃{µ̃{­̃s­Ö{µ̃{­̃{­̃s­Ö{­̃{­̃{­̃{­Ö{µ̃{­̃s­Ös­Ös­Ös­ÖHp”!„µ̃{­̃{­̃{­̃{­̃{µ̃{­̃{­̃s­Ös¥Îs¥Î{œµcŒ¥kŒ¥X}’R{ŒR{ŒHp”8XqÛ²'ûÁûÈÿ̉ÿ̉û̉-û̉-÷Ô;ÿ̃Bÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;ÿ̉ÿ̉ÿ̉ûÈûÈûÁûÁûÁûÁûÁûÁûÈûÈû̉-ÿ̃B÷Ô;ÿØLÿØL 8'¼d0ç{1Üg%Öc%Öc%Öc%Öc%Đ^%Đ^%Öc%Đ^%Đ^%Öc%Đ^%Đ^%¼d08Xqs­Ö{µ̃{µ̃{­Ö{­Ös¥Ö{µ̃s¥Î{­Ö{­Î{­Îs­Ös­Ö{­Ös­Ös­Ös¥Îs­ÖsœÎsœÎs­Ös­Ös¥Ös­Ö{¥Î{­̃s­Ös­Ö{µ̃„µ̃{µ̃ŒµÖ{­̃{µ̃{­̃„µ̃Œµ̃„µ̃{­̃ŒµÖ”½ç¥ÎçœÆç«Đë«Đëµ̉âµ̉âµ̉âÁÛ́ÎÖïÁÛ́Î̃ï̃ç÷̃âçâï÷̃ç÷âï÷̃ç÷âï÷̃âçØëó̉ặ̃âç̃ç÷âï÷Œ½̃Œ½̃Œµ̃{µ̃„­Î{µ̃{µ̃s¥Ö{­̃s­Ö{­̃s¥Ös­Ös¥Ös¥Ös¥Ö{­Ös­Ö{µ̃s­Ö{­̃s¥Ös­Ö{µ̃s¥Ös¥Ös­Ö{­̃{­̃s¥Ö{­̃s¥Ö{µ̃{­̃Nsƒ%)5R{Œh™»s¥Ö{µ̃{­̃{­̃s¥Ös¥Ös¥Ös­Ös¥Ö{œ½s¥Îs–µgŒÁcˆ X}’R{ŒR{ŒH_tPN)ûÁûÁûÁûÁûÈÿ̉û̉-÷Ô;û̉-÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bÿ̃Bû̉-û̉-ÿ̉ûÈûÈûÈûÁûÁûÁûÁûÁûÁûÈûÈû̉-÷Ô;ÿ̃BÿØLÛ²'PN)Æ^)Üg%Öc%Öc%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Öc%³VNsƒ{­Ös¥Îs­Ös¥Ös­Ö{­Ö{­Ö{­Ös­Ös­Ö{µ̃{­̃s¥Ös¥Ös¥Ös­Ö{­̃{­̃{µ̃s­Ös­Ös­Ö{­Ö„µ̃{­Ös¥Ös¥Ö{­̃„­̃„µ̃{µ̃{­Ö„­̃{­Ö„½̃Œ½̃Œ½̃„µ̃Œµ̃Œ½ÖœÆ̃œ½̃«Đë¥ÎçµÖëÇÔâÁÛ́Î̃ïÎ̃ïÁÛ́Î̃ï̃ç÷̃ç÷̃ç÷äéçâï÷̃ç÷ï÷÷âï÷âï÷̃âçâï÷âï÷Øëóäé眽̃”µâ„½̃Œµ̃{µ̃s¥Ö„µ̃s¥Ös¥Ös­Ö{µ̃{­Ös¥Ö{­Ös­Ös¥Ös­Ös­Ös¥Ö{­Ö{­Ös­Ö{µ̃s¥Ös¥Ös¥Ö{µ̃s¥Ö{­Ö{µ̃s¥Ös­Ö{­̃s¥ÖNsƒ%1QduZ†±s­Ö{­̃{µ̃„­̃{­̃„µ̃Œµ̃{­̃{­̃{­̃{µ̃s­Ös¥Îs¥ÎgŒÁg³Z†±X}’R{ŒR{ŒHp”) ûÁûÁûÁûÁûÁûÁûÁûÈÿ̉ÿ̉û̉-÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;û̉-û̉-ÿ̉ûÈÿ̉ûÈûÁûÁûÁûÁûÁûÁûÁûÈû̉-÷Ô;÷Ô;ÿØL&#8'™O&Öc%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%Đ^%™O&Z†±s¥Ö{­Ös¥Ös¥Ö{­̃{­Ös­Ö{­̃s­Ös­Ös­Ös¥Ös­Ö{­Ö{µÖ{­Ös­Ö{­Ös¥Ö{­Ös­Ös­Ös­Ö{¥Î{¥Î{­Ös­Ö{µ̃„µ̃{­̃„½̃{­̃Œ½̃„µ̃ŒµÖŒ½̃Œ½̃Œ½̃”µâ”½ç˜ÁÖ ̀â«ĐëÁÛ́µÖëÇÔâÁÛ́ÇÔâÁÛ́Î̃ï̃ç÷̃ç÷̃ç÷âï÷âï÷âï÷̃ç÷âï÷äéçâï÷̃âç̃ç÷äéç̃ç÷ïï÷”½̃„µ̃„µ̃„µ̃{­̃s¥Ös¥Ös­Ös­Ö{­Ös¥Ö{­̃s­Ös­Ö{µ̃s¥Ös¥Ös­Ös¥Ö{­̃s­Ös­Ö{µÖ{µÖs¥Ös¥Ös­Ö{­Ös¥Ö{­̃{µ̃{µ̃s¥Ö{µ̃Nsƒ%)5Z†±„µ̃s¥Ö„µ̃„­̃{­̃„µ̃{­̃{­̃{µ̃„­̃{µ̃„½̃{µ̃{­Ös¥Ös¥Îs–µgŒÁZ†±cˆ X}’R{ŒNsƒ)9¦tûÁûÁûÁûÁûÁûÁûÁÿ̉ÿ̉ÿ̉û̉-÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;÷Ô;ÿ̉ÿ̉ÿ̉ÿ̉ûÈûÁûÁûÁûÁûÁûÁûÁûÈûÈû̉-÷Ô;Û²'! PN)¼d0Öc%Đ^%Đ^%Đ^%Đ^%Đ^%8'sœÁs­Ös¥Îs­Ös¥Ös¥Ö{­Ös­Ös¥Ö{µ̃s¥Ö{­Ös­Ös­Ös­Ö{­Ös¥Ös­Ös­Ös¥Ös­Ös¥Ös¥Ös¥Ö{­Ös¥Îs­Ös­Ö{­Ö{­̃„µ̃„µ̃Œ½çŒ½̃”½çŒ½Ö”µâ”½̃”½̃”½̃œÆç˜ÁÖ¥Îçµ̉âµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃âÎ̃ï̃ç÷̃ç÷âï÷ï÷÷âï÷äéçâï÷̃âçâï÷äéçäéçäéçâï÷̃âçï÷猽̃„µ̃{µ̃{­̃{­̃s¥Ös­ç{­̃{­Ös¥Ö{­Ös¥Ös­Ö{­̃{µ̃s­Ö{µ̃s¥Ös¥Ö{­̃s­Ö{µÖ{­̃s­Ös­Ö{­̃s¥Îs¥Ö{µ̃{­̃{­Ö{­̃s­ÖNsƒ)8Xqcˆ s­Ö„½̃{­̃{µ̃{µ̃{µ̃{­Ö{µ̃{µ̃{µ̃s­Ös¥ÎkœËgŒÁcŒ¥cŒ¥X}’R{ŒR{Œ*?P8'ûÁûÁûÁûÁûÁûÁûÁûÁûÈÿ̉û̉-ÿ̉û̉-ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bû̉-û̉-ÿ̉ûÈûÈÿ̉ûÈûÁûÁûÁûÁûÁûÁûÁûÈÿ̉÷Ô;PN)›¬–—¢|PN)8'™O&Đ^%Đ^%Đ^%Đ^% ){¥Î{­̃{­Ö{­Ös­Ös­Ö{­Ös­Ö{­Ös¥Ö{­Ös­Ös­Ös­Ö{µÖ{­Ö{µÖs­Ö{­Ös­Ös­Ö{­Ös¥Ö{­Ö{­Ö{µ̃{­̃s¥Ö{­Ö{­̃{­Ö{µ̃Œ½Ö”½çŒ½Ö”½ç”½ç”½̃”½̃œÆ̃˜ÁÖ¥Æ̃œÆç«ĐëµÖëÇÔâÁÛ́Î̃ïÎ̃ïÎÖï̉ặäéçâï÷äéçâï÷ïï÷âï÷ï÷÷ï÷÷ï÷÷âï÷âï÷äéçâï÷âï÷ïï÷Œ½ç{­Ö{µ̃{µ̃„­̃{µ̃s¥Ös¥Ö{­̃{­̃s¥Ö{­Ö{­̃s­Ös­Ös¥Ös¥Ös­Ös­Ös­Ö{µ̃s¥Ö{µ̃s­Ö{­̃{­Ös­Ö{µ̃{­Ö{­̃s­Ös­Ös­Ös­ÖkœË*?P*?Pcˆ kœË{­̃„­̃„­̃s¥Ös­Ö{­Öh™»kœËkœËg³cŒ¥cˆ R{Œ]s’8Xqæ·ûÁûÁûÁûÁûÁûÁûÁûÁûÈÿ̉û̉-û̉-û̉-÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bû̉-û̉-ÿ̉ÿ̉ûÈûÈûÈûÁûÁûÁûÁûÁûÁûÁûÁûÈÛ²'(:-ɃɃɃɃJSU™O&³VÎZ!%)5{µ̃{­̃{­̃{­Ös¥Ö{­Î{µ̃s¥Ös¥Îs­Ös¥Ös¥Ös¥Ö{­̃s¥Ös­Ös­Ö{­Ö{­Ös¥Ös­Ös­Ö{µÖ{­Ö{µÖ{­̃s¥Ö{­̃„µ̃{­ÖŒµ̃Œ½̃”½çœÆ眽̃ ̀âœÆç˜ÁÖ”½çœÆçœÆç¥Îç¥ÎçµÖëÇÔâÁÛ́Î̃âÎ̃ïÎ̃ïÎ̃ẫç÷̃ç÷âï÷äéçâï÷ï÷ïïï÷âï÷ï÷÷ï÷÷âï÷̃âçâï÷äéçâï÷âï÷Œ½̃Œ½Ö„µ̃„­̃{­̃{µ̃{­̃{µ̃s¥Ö{­Ös­Ös¥Ös­Ös­Ö{µ̃s­Ös¥Ös­Ös¥Ös¥Ös­Ös¥Ö{­Ö{µ̃s¥Ö{¥Îs­Ös¥Ös¥Ö{­Ös­Ös­Ös­Ös­Ös­Ös¥Ö{µ̃kœË*?P{­̃{­̃s­ÖsœÎs­Ös¥Îs¥Îh™»gŒÁcŒ¥X}’X}’R{Œ8Xq¦tûÁûÁûÁûÁûÁûÁûÁûÁûÁÿ̉ÿ̉ÿ̉û̉-û̉-÷Ô;ÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bû̉-û̉-ÿ̉ÿ̉ÿ̉ûÈûÈûÁûÁûÁûÁûÁûÁûÁûÁûȦtsyɃɃɃɃɃɃx¸i(! 8Xqs¥Ös­Ös­Ö{µ̃s­Ö{­Îs¥Ö„­Îs¥Ös¥Ö{­Î{µ̃s­Ö{­Ös¥Ö{­Ös¥Ö{­Ös­Ös¥Ö{­Îs­Ös­Ö{­Ö{µ̃Œ½ÖŒµÖŒ½ÖŒµ̃Œµ̃”½̃Œµ̃”½̃œÆçœÆ̃¥ÎçœÆç«Đë¥Îç¥Îç¥Îç¥Îç­Î̃½Đáµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ïâï÷âï÷âï÷âï÷âï÷ïï÷ïï÷ï÷÷âï÷̃ç÷âï÷ï÷÷ï÷÷ïï÷âï÷ïï÷Œ½̃s­Ö{­̃{­̃s¥Ö„µ̃s­Ö{­̃{µ̃{­Ös­Ös­Ös¥Ö{µ̃s¥Ös­Ö{­̃{µ̃{­̃{­̃{µ̃s­Ös¥Ös¥Ös¥Î{­̃s¥Ö{­̃s¥Ös¥Ö{­Ös­Ö{­̃s­Ös¥Ös­Ös¥Ö{µ̃s¥ÖŒ­Ö{µ̃*?P„­̃{­̃s­Ö{µ̃s¥Îs¥Îh™»gŒÁg³cˆ ]s’R{ŒH_t™O&ûÁûÁûÁûÁûÁûÁûÁûÁûÁûÁÿ̉÷Ô;û̉-û̉-ÿ̉û̉-ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;ÿ̉ÿ̉ÿ̉ûÈÿ̉ûÈûÈûÁûÁûÁûÁûÁûÁûÁæ·ɃɃɃɃɃɃɃɃɃɃJSUNsƒs­Ö{­Îs­Ö{­̃{­̃{­̃s­Ös¥Ö{­Ö{­Î{­̃{­Îs­Ö{­Ös¥Ö{­Îs­Ö{­Ös­Ös­Ö{¥Îs¥Ö{µ̃s¥ÖŒ­Ö{µ̃”½çŒµÖ„½̃Œµ̃”½̃œÆ̃œÆçœÆç­Î̃¥Îç¥Îç«Đë«Đë¥Îç¥Îçµ̉âµ̉âµ̉âÁÛ́ÎÖïÁÛ́Î̃ïÁÛ́̃ç÷̃ç÷̃ç÷âï÷ïï÷äéçïï÷âï÷ïï÷ïï÷̃ç÷âï÷ï÷÷âï÷ïï÷äéçï÷÷{µ̃{µ̃{­̃„µ̃{µ̃{µ̃{­Ös­ÖŒ­Ö{µ̃s¥Ös¥Ös¥Ös¥Ö{µ̃{­̃s­Ös¥Ös¥Ös¥Ös¥Ös¥Ö{­̃s­Ö{­̃s­Ö{­̃{µ̃s¥Ös¥Ö{­Ös­Ö{µ̃s­Ö{µ̃{µ̃s­Ö{µ̃s­ÖHp”{µ̃{­̃s¥ÖgŒÁ*?P„­Î„­Î„­ÎsœÎs¥ÎgŒÁkŒ¥cŒ¥cˆ X}’R{ŒQdu¦tûÈûÁûÁûÁûÁûÁûÁûÁûÁÿ̉÷Ô;÷Ô;÷Ô;ÿ̉û̉-û̉-ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØL÷Ô;û̉-ÿ̉û̉-ÿ̉ÿ̉ûÈûÁûÁûÁûÁûÁûÁûÁûÁ¦tJSUɃɃɃɃɃɃɃɃɃɃɃɃx¸i(:-Z†±{¥Î{­Î{¥Î{­̃s¥Îs­Ös­Ös­Ös­Ös­Ö{­̃s­Ö{¥Îs¥Îs¥Ös­Ö{­Ö{­Îs¥Ös¥Ö{­Ö{­Ö{­Ö{µ̃{µ̃Œ½̃{­̃Œ½̃”½çŒµÖ”½̃˜ÁÖ¥Îçµ̉âµ̉âµ̉âµ̉â¥Îç¥Îç«Đëµ̉â«Đëµ̉âÁÛ́ÁÛ́Î̃ïÎÖïÎ̃ïÎ̃ï̉ặ̃ç÷̃ç÷äéçâï÷âï÷̃ç÷äéçâï÷ï÷÷ïï÷ï÷÷äéçâï÷ïï÷ïï÷ïï÷s¥Ö{µ̃{µ̃{µ̃{µ̃{µ̃s¥Ö{­Ös¥Ö{­̃s­Ös¥Ö{­̃s¥Ös­Ös­Ös­Ö{­̃s¥Ös­Ös­Ös¥Ös­Ös­Ö„½̃s­Ö{­̃s¥Ö{µ̃{­̃s¥Ö{µ̃s­Ö{­Ö{µ̃s¥Ös­ÖR{Œs¥Ös­Ö{µ̃s­Ö{­̃X}’!!1„­̃{­Ös¥Ö{­ÎkœËh™»Z†±cˆ X}’R{Œ8Xq! ™O&æ·ûÁûÁûÁûÁûÁûÈû̉-÷Ô;û̉-ÿ̉ÿ̉û̉-÷Ô;ÿ̃BÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØL÷Ô;û̉-û̉-û̉-ÿ̉ÿ̉ÿ̉ÿ̉ûÈûÁûÁûÁûÁûÁæ·x¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ib­LPN)s¥Îs­Ös¥Îs¥Ös­Ö{­Ö{µ̃s­Ö{­Ös­Ö{­Ö{­Ö{­̃s­Ös­Ös­Ös­Ö{­Ös­Ös­Ös¥Ös¥Ös¥Ö{­Ös¥Ö„½̃Œ½̃Œ½̃Œµ̃”½̃˜ÁÖœÆç«Đë¥Îçµ̉âµ̉âµ̉â­Î̃¥Îç«Đëµ̉âµ̉âµ̉â½ĐáÁÛ́Î̃ïÎ̃ïÎ̃ï̉ặ̃ç÷âï÷âï÷ïï÷âï÷ï÷ï̃ç÷âï÷âï÷ïï÷Úàáïï÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷ï÷÷{­Ö{­Ö{­Ö„µ̃{­̃{­̃{­̃{­Ö{µ̃s­Ö{µÖ{­̃s¥Ö{­̃{­̃s­Ö{­̃s¥Ö{­Ö{­̃s¥Ö{­Ö{­̃s¥Ös­Ö{­̃s­Ös­Ö{µ̃{­̃{­Ö{­Ö{­̃s­Ös¥Ös¥ÖNsƒ{­̃{µ̃{­̃gŒÁ){­Ö{¥Î{¥Îs¥Îs–µZ†±W€¡R{ŒR{Œ*?P 8'¦tûÁûÁûÁûÈÿ̉ÿ̉ûÈûÈûÈû̉-÷Ô;ÿ̃Bÿ̃BÿØLÿØLÿØLÿØLÿØLÿØL÷Ô;ÿ̃Bÿ̃Bû̉-÷Ô;÷Ô;û̉-û̉-ÿ̉ûÈûÈûÁûÁûÁûÁPN)PN)x¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ib­LC.(%1s­Ös­Ö{­Ö{¥Ö{¥Î{­Ö{­Ös­Ös­Ös­Ö{µ̃{­̃{µÖs¥Ös¥Ös­Ö{­Ö{µÖs­Ös¥Ö{­Ös¥Ös¥Ös¥Ö{µ̃„½̃Œ½̃Œ½̃”½çœÆçœÆ̃œÆç¥Îç«Đë¥Îç«Đë¥Îç«Đëµ̉âµ̉âµ̉âÁÛ́ÁÛ́µ̉âµÖëÎ̃ïÎ̃ïÎ̃ï̃ç÷̃âçäéçâï÷âï÷âï÷ï÷÷âï÷âï÷âï÷ï÷÷âï÷ïï÷äéçïï÷ïï÷ïï÷ï÷÷ï÷÷{µ̃{µ̃„µ̃„µ̃{µ̃{­̃s­Ös¥Ös¥Ö{­Ö{­̃{­̃s¥Ö{µ̃s¥Ös¥Ö{­̃s­Ös­Ö{­̃{µ̃{­Ös¥Ös¥Ös­Ös­Ö{µ̃{­̃{­̃s¥Ö{µ̃{µ̃{µ̃s­çs­ÖcŒ¥kœËs¥Ös¥ÎNsƒcˆ {¥Î{¥ÆgŒÁh™»Z†±X}’X}’R{Œ*?P! ¦tæ·ûÁûÈûÁûÁûÁÿ̉û̉-÷Ô;÷Ô;ÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃Bÿ̃Bÿ̃B÷Ô;ÿ̃Bÿ̃B÷Ô;÷Ô;û̉-ÿ̉ûÈûÁûÁûÁæ· x¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ib­Lb­Lb­LX™G(:-*?P{­̃s­Ö{¥Îs­Ös­Ö{­Ös­Ös­Ös­Ös¥Ö{­Ös­Ö{­Ö{µ̃s­Ö{­Îs­Ös¥Ös­Ös¥Ös¥Î{­̃{­̃s­Ö{­Ö„­̃„µ̃Œ½̃œÆçœÆçœÆç¥Îç¥Î眽̃«Đë¥Îç¥Îç¥Îç«ĐëµÖëµÖëÁÛ́µÖëÇÔâÁÛ́Î̃ï̉ặ̉ặ̃âçäéçâï÷̃âçâï÷âï÷̃ç÷âï÷âï÷ï÷÷âï÷âï÷ï÷÷́éñïï÷ï÷÷ïï÷ï÷÷÷ÿÿ„­̃{­Ö{­̃{­̃{­̃{µ̃s¥Ös¥Ö{­Ö{­̃s¥Ö{µ̃s­Ös­Ös¥Ös¥Ö{­̃{­̃s¥Ös¥Ös¥Ö{­̃s¥Ös¥Ö{­̃{­̃{­̃s­Ös­Ös¥Ös¥Ö{µ̃s­Ö{­̃„µ̃%1Hp”s­Ö*?Ps–µ{¥ÆsœÁg³Z†±cˆ X}’Nsƒ%1PN)¦tûÁûÁûÁûÈû̉-÷Ô;ÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;÷Ô;÷Ô;ÿ̃Bÿ̃Bÿ̃B÷Ô;û̉-û̉-ûÈûÁûÁûÁ8'(:-x¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ib­Lb­Lb­Lb­Lb­Lb­LPN)(d•s­Ös­Ös­Ös­Ös­Ös­Ös­Ö{­Ös­Ös¥Ös­Ös¥Îs¥Ö{­Ös¥Ö{­Ös¥Î{­Ö{­Ö{­Ös¥Ös¥Ö{­̃s­Ö{µ̃{­Ö„½̃”½ç”µâ¥ÎçœÆç¥ÎçœÆç ̀âœÆç«Đë«Đëµ̉âµ̉âµÖë½ĐáÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́̉ặ̉ặ̃âçâï÷äéç̃ç÷âï÷äéçâï÷ïï÷âï÷âï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿïï÷ÿÿÿÿÿÿs¥Ö„­Îs¥Ö{­̃{µ̃{­̃{­̃s­Ö{­̃{­̃s­Ös­Ös¥Ö{­̃s­Ö{µ̃s¥Ö{­Ös¥Ös¥Ö{µ̃s­Ös­Ö{­̃s­Ö{­̃s¥Ös¥Ö{µ̃s­Ö{­̃s¥Ös­Ö{­̃h™»8Xqs­ÖJSUkœË|•±gŒÁcˆ X}’X}’)9¦tÛ²'ûÈû̉-ÿ̃B÷Ô;ÿØLÿØLÿØLÿØLÿØLÿØL÷Ô;÷Ô;ÿ̃B÷Ô;û̉-û̉-ÿ̃Bÿ̃Bÿ̃Bû̉-ÿ̉ÿ̉ûÈûÁ¦tx¸ix¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ib­Lb­Lb­Lb­Lb­Lb­Lb­Lb­LL7(:-gŒÁs­Ös­Ös­Ö{­Î{¥Îs¥Ös­Ö{­Ös­Ös¥Ö{­Ös­Ö{µ̃s¥Ös­Ö{­Ö{­Ö{­̃{­Ös¥Ös¥Ö{­̃s¥Ö{­̃s­ÖŒµ̃„µ̃˜ÁÖœÆç¥ÎçœÆç¥Îç¥ÎçœÆç«Đë«ĐëÁÛ́ÁÛ́½ĐáÁÛ́½ĐáÁÛ́ÆäôÎ̃ïÁÛ́Î̃ï̉ặ̃âç̃âçâï÷âï÷âï÷̃âçäéçäéçïï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ÿÿÿÿÿÿs¥Ö{­̃{µ̃{µ̃{µ̃{­̃{­̃{µ̃{µ̃{µ̃s¥Ös­ç{µ̃{­Ös¥Ös­Ö{µ̃s¥Î{­Ö{­̃s¥Ös­Ö{µ̃s­Ö{µ̃s¥Î{µ̃{µ̃{µ̃s­Ö{­̃s­Ö{­̃{­Ö8Xq*?PNsƒgŒÁg³J{­cŒ¥R{ŒR{ŒR{ŒH_t%)5PN)Û²'÷Ô;ÿØLÿØLÿØLÿØLÿØLÿØLÿØL÷Ô;ÿ̃Bÿ̃B÷Ô;ÿ̉÷Ô;û̉-ÿ̃Bÿ̃Bû̉-ÿ̉ûÈûÈûÁPN)x¸ix¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ib­Lb­Lb­Lb­Lb­LL7L7L7L7L7L7C.%)5„­Îs­Ö„­Î{­Ös­Ös¥Î{­Ös­Ös¥Ös­Ö{­Î{µ̃{­Î{­̃s¥Î{­Ös­Ös­Ös¥Ös­Ö{­ÖsœÎs¥Ös¥Ös­Ö{µ̃{µ̃ŒµÖ˜ÁÖœÆçœÆç¥Îç­Î̃¥Îç¥Îç«ĐëµÖëÇÔâÁÛ́ÇÔâÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́Î̃âÎ̃ï̉ặâï÷âï÷̃âçâï÷̃ç÷âï÷äéçâï÷ïï÷ïï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ó÷û÷ÿÿÿÿÿï÷÷{­̃{µ̃{µ̃{µ̃{µ̃s­Ö{µ̃{­̃{­̃{­̃{­̃s­Ös¥Ös¥Ös­Ös­Ös­Ös­Ös­Ö{µÖs­Ö{µÖs­Ös­Ös¥Ö{µ̃{µ̃s¥Ös­Ös¥Îs­Ö{­̃{­̃s¥Ö%1H_ts­Ö!!1cˆ g³cŒ¥d•R{ŒR{ŒR{ŒH_tNsƒH_t8Xq§wVÿØLÿØLÿØLÿØLÿØLÿØL÷Ô;ÿ̃Bÿ̃B÷Ô;÷Ô;ÿ̃Bû̉-ÿ̃Bÿ̃B÷Ô;ÿ̉ûÈÿ̉8'x¸ix¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ib­Lb­Lb­Lb­Lb­Lb­Lb­LX™GL7L7L7L7C.C.(:-Qdu{µ̃„­Îs¥Ös¥Ös¥Î{­Î{­ÖsœÎs­Ös¥Ös¥Ös­Ö{­̃s¥Ö{­Ö{µ̃{¥Îs­Ö{­Î{­̃{­Îs­Ös¥Ös¥Ö{µ̃s¥Ö{­̃Œ½ÖœÆçœÆ̃¥ÎçœÆç¥ÎçœÆ̃¥Îçµ̉âµ̉âÎÖïÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷Î̃ïÎ̃ïÎ̃ïÎ̃ï̃ç÷̉ặ̃ç÷äéçâï÷̃âçïï÷̃ç÷ï÷÷ï÷÷äéçï÷÷ïï÷ï÷÷ï÷÷ïï÷ó÷ûï÷÷ÿÿÿï÷÷Œ­Ö{µ̃„­̃„½̃s¥Ös¥Ö{µ̃s­Ös­Ös­Ö{µ̃{­̃s­Ös¥Ös­Ö{­̃s­Ö{­̃s­Ös¥Ös­Ö{­̃s­Ös­Ö{­̃{­̃s¥Ö{µ̃{µ̃s­Ös¥Ö{­̃{­̃s­Ö){µ̃{­̃W€¡W€¡Qdug³cŒ¥cŒ¥Gt¢R{ŒHp”R{ŒHp”Hp”NsƒR{Œ8Xq*?P PN)ê¤[ÿØLÿØLÿØLÿØLÿØLÿ̃B÷Ô;÷Ô;ÿ̃B÷Ô;÷Ô;÷Ô;ÿ̃Bû̉-ÿ̉¦tJSUb­Lb­Lx¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ix¸ib­Lb­Lb­Lb­Lb­Lb­LL7L7L7L7L7L7C.L7C.C.Z†±s¥Ös­Ö{­Ös­Ö{­Ös¥Ö{­Îs­Ös­Ös¥Ö{­̃s¥Ös¥Ös­Ö{­̃{­Ös¥Ös¥Ö{­Ö{­Ös­Ö{µ̃s­Ös­Ös¥Ö{­̃{µ̃œÆçœÆçœÆç˜ÁÖ¥ÎçœÆ̃œÆç¥Îçµ̉â¥ÎçµÖëÁÛ́Î̃ïÎ̃ï̃âçÎ̃ï̃ç÷Î̃ïÎ̃ï̉ặÎ̃ï̉ặ̃ç÷̉ặ̃âç̃ç÷âï÷âï÷äéçïï÷âï÷ï÷÷ïï÷ó÷ûï÷÷ï÷÷ï÷÷ïï÷÷ÿÿÿÿÿÿÿÿ{µ̃{­̃{µ̃s­Ö{­Ös¥Ö{µ̃s¥Ös­ç{­̃s­Ö{­̃{­Ö{­̃s¥Ös¥Îs¥Ö{µ̃s­Ös¥Ö{µ̃s­ç{µ̃{µ̃s­Ö{­Ös¥Ös­Ös¥Ö{µ̃s­Ö{­̃s¥Ö{µ̃!!!1s­Ö„µ̃{­̃„µ̃8Xqg³g³cŒ¥X}’R{ŒR{ŒX}’Hp”Hp”NsƒR{ŒHp”NsƒQduJSU!!18'§wVÿØLÿØLÿ̃Bÿ̃Bû̉-û̉-û̉-ÿ̃B÷Ô;÷Ô;ÿ̃B÷Ô;Û²'(b­Lb­Lb­Lx¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ix¸ib­Lb­Lb­Lb­Lb­LL7L7L7L7L7L7L7L7C.C.C.C.s¥Îs¥Ö{µ̃s­ÖsœÎ{­̃{­̃s­Ö{­Ös­Ös­Ö{­̃{­̃s¥Î{­Ö{­Ö{­Ö{­Ö{­Ös­Ös¥Ö{­Ös­Ö„­Îs¥Ö{­̃{µ̃{­̃Œ½çœÆ甽̃”½̃¥ÎçœÆ̃¥Îç¥Îç«Đëµ̉âµ̉âµÖëÁÛ́̉ặ̉ặÎ̃âÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ï̉ặ̃âç̃ç÷̃ç÷âï÷âï÷âï÷âï÷ï÷÷ï÷÷ïï÷ïï÷ÿÿÿï÷÷ï÷÷ó÷ûó÷ûï÷÷ï÷÷ï÷÷s­Ö{­̃s¥Ös­Ö{­̃{­̃{µ̃s¥Ö{µ̃s¥Ö{­Ös¥Ös­Ös­Ös¥Ös¥Î{­̃{­̃s¥Ös­Ös¥Ö{­̃s­Ö{µ̃s­Ö{­Ö{­̃s¥Ö{µ̃s­Ö{µ̃{µ̃{­̃{µ̃%1{­̃{µ̃{µ̃{µ̃8Xqs–µ|•±g³cŒ¥cŒ¥W€¡cˆ Gt¢R{ŒR{ŒR{ŒR{ŒNsƒNsƒNsƒNsƒ8Xq*?PPN)Û²'ÿ̃Bÿ̃Bû̉-ÿ̃Bÿ̃B÷Ô;û̉-÷Ô;÷Ô; X™Gb­Lb­Lb­Lx¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ix¸ib­Lb­Lb­Lb­Lb­LL7L7L7L7L7L7C.C.C.C.C.(:-*?Ps¥Ö{­Ö{­Ös­Ös­Ö{µ̃s¥Îs­Ös¥Ös­Ös­Ös­Ös­Ös¥Ö{­Î{­̃{­Ös­Ö{¥Î{­Î{­Îs­Ös­Ös¥Ö{­̃s¥Ö{µ̃{µ̃Œ½çŒ½ç”½̃”½çœÆçœÆ̃¥ÎçµÖë­Î̃µ̉âµ̉âµÖëÁÛ́Î̃ï̉ặÎ̃ï̃ç÷̉ặ̃ç÷̉ặ̉ặäéç̃ç÷âï÷äéçâï÷âï÷âï÷âï÷ï÷÷âï÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷÷ÿÿï÷÷ó÷û÷ÿÿ÷ÿÿs­Ös­Ös¥Ö{­̃s­Ös­Ös­Ös¥Ös¥Ös­Ös¥Ös­Ös¥Ö{­̃s¥Ös¥Ö{­̃s¥Ö{­Ös­Ö{µ̃s­Ö{µ̃{µ̃s¥Ös¥Ös­Ös¥Ös­Ö{µ̃{µ̃{µ̃{µ̃{µÖ!%1{µ̃s¥Î!!1s¥Ö{­̃8XqkœËh™»gŒÁg³gŒÁcŒ¥Z†±cŒ¥cˆ d•R{ŒR{ŒR{ŒNsƒR{ŒR{ŒNsƒR{ŒNsƒ8Xq!PN)§wV÷Ô;ÿ̃B÷Ô;÷Ô;û̉-Û²'&#C.b­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ix¸ib­Lb­Lb­Lb­Lb­Lb­LL7L7L7L7L7C.C.C.C.C. X}’{­Ös­Ös­Ö{­Ös¥Ös¥Ös­Ö{­Ö{­̃s­Ös­Ö{­Ö{­Ös¥Ö{­Ös­Ö{­̃s¥Ös­Ö{­Ö{µ̃{µ̃s­Ös¥Ö{­̃{­̃s¥Ö„µ̃„µ̃Œµ̃Œ½̃Œ½̃œ½̃œÆç¥Îçµ̉âµ̉âÁÛ́µÖëÁÛ́Î̃ïÎ̃ïÎ̃ï̉ặ̉ặ̃ç÷̃ç÷̃ç÷̉ặ̃ç÷̃âç̃âçâï÷̃ç÷̉ặ̃âçâï÷âï÷ï÷÷ïï÷ï÷÷ïï÷ïï÷ó÷ûï÷÷ó÷ûï÷÷÷ÿÿ÷ÿÿ{­Ö{­Î{­Ös­Ös­Ös¥Ö{­Ö{µ̃s­Ö{­̃s¥Ö{µ̃s­Ö{­̃s¥Ös¥Ö{­̃s­Ös¥Ö{­̃s¥Ö{µ̃s¥Ös¥Ö{­Ös¥Ös­Ö{µ̃{­̃s­Ös¥Ö{µ̃{µ̃s¥Ö){­̃R{Œ*?P{µ̃8XqX}’s¥Îs¥Öh™»gŒÁ{œ½g³s–µg³Z†±cˆ cŒ¥R{ŒX}’R{ŒR{ŒR{ŒR{ŒNsƒNsƒNsƒNsƒQdu(:-PN)Û²'÷Ô;Û²'8'(L7L7b­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸iɃɃɃɃɃɃɃɃɃɃx¸ix¸ix¸ib­Lb­Lb­Lb­LL7L7L7L7L7L7L7L7C.L7L7C.C.{¥Æs­Ös¥Ö{­Ö{­Ös¥Ö{­Ös­Ös­Ö{­Ös­Ö{­Ös­Ös­Ös­Ö{­Î{­Ös­Ö{­Ös­Ös­Ös¥Ös¥Î{­̃{µ̃{µ̃s¥Ö{µ̃{µ̃„­̃„½̃ŒµÖœÆçœÆç¥Îç¥Îçµ̉âµ̉âÇÔâµÖëÁÛ́Î̃ẩặÎ̃ï̉ặ̃ç÷̃ç÷̉ặÎ̃ï̉ặ̉ặ̃ç÷̃ç÷̃ç÷̃ç÷̃ç÷âï÷äéçïï÷ï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ó÷ûó÷ûï÷÷ï÷÷s­Ö{­̃s­Ös­Ös¥Ös­Ö{­̃{­̃{­̃{µ̃s­Ö{­̃s­Ös¥Ös­Ö{­̃s¥Ö{­̃s¥Ös­Ö{­̃s¥Ös¥Ös­Ös¥Ö{µ̃{­̃{µ̃s¥Ös¥Ö{µ̃s­Ö{­̃{­̃%)5*?PH_tW€¡gŒÁs¥ÖsœÎsœÎ{­Î{œ½s¥ÎgŒÁgŒÁ|•±cŒ¥g³cŒ¥cˆ W€¡X}’X}’]s’R{ŒR{ŒNsƒfv|NsƒNsƒNsƒ*?P8'8'L7L7L7b­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸iɃɃɃɃx¸iɃɃɃɃx¸ix¸ix¸ix¸ix¸ib­Lb­LL7L7b­LL7L7L7L7L7L7L7L7L7C.(*?Ps¥Ö{¥Îs¥Ö{­Ö{µ̃{­̃{­Ös¥Î{­̃s¥Ös¥Îs¥Ös­ÖsœÎ{µ̃{­Îs¥Ös¥Ös­Ö{­Ö{µ̃s¥Ö{µ̃s¥Ö{µ̃{­̃{µ̃{µ̃{µ̃„­̃Œ½ÖŒ½Ö”½̃œÆ̃ ̀â¥Îç«Đëµ̉âµ̉âµ̉âµ̉âÁÛ́Î̃ïÎ̃ï̃ç÷âï÷̃ç÷̃ç÷̉ặÎ̃ï̃ç÷äéçâï÷̃ç÷âï÷âï÷̃âçïï÷äéçïï÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷÷ÿÿï÷÷ÿÿÿÿÿÿs¥Ö{­Îs¥Ös¥Î{µ̃{­Ö{µ̃s¥Ös­Ös­Ös­Ös­Ös­Ös­Ös­Ös­Ös­Ö{­̃s¥Ös¥Ö{µ̃{­̃s¥Ös­Ö{µ̃{­̃s¥Ö{µ̃s¥Ö{­̃s­Ö{µ̃s­çs¥ÖH_tZ†±X}’s­Ös­Ös¥Ös¥Ö{­Î{­Ös¥Îs¥ÎsœÎs¥Î{œµgŒÁgŒÁg³g³cˆ cŒ¥X}’]s’R{Œ]s’R{ŒR{ŒR{Œ]s’R{Œ]s’R{Œ*?PC.L7L7L7X™Gb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸iɃx¸iɃɃx¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­LL7L7L7L7L7L7L7L7L7C.L7C.Z†±{­Ö{­Î{­Ö{­Ö{­̃{µ̃{­Î{­Î{­Ös¥Ös¥Î{µÖ{­Ö{­Ös­Ö{­Î{­Ös¥Ös­Ö{¥Î{­Ös¥Îs­Ös­Ö{­̃{µ̃{µ̃{­̃{­ÖŒ½̃”½çŒ­Ö”½̃˜ÁÖœÆç¥Îç¥Îçµ̉âµ̉â«Đëµ̉âµ̉âÁÛ́Î̃ẩặÎ̃ïÎÖï̃ç÷̉ặ̃âç̉ặäéç̉ặ̃âçäéç̃ç÷âï÷ïï÷äéçïï÷ï÷÷ï÷÷ïï÷ÿÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷{­̃{µ̃s¥Ö{­̃„­̃s¥Ös¥Ö{­̃{µ̃s­Ös¥Ö{­Ö{­̃s­Ö{­̃s­Ö{µ̃s­Ö{µ̃s­Ös­Ö{­̃{­̃{µ̃s­Ö{µ̃s¥Ö{µ̃s­Ö{µ̃s¥Ö{­̃s­Ös­Ös¥Ö{­̃kœË8Xq{­̃s­Ö{­̃{µ̃s­Ö{­Ös­Ös¥Îs¥Îs¥ÎsœÎs¥ÎsœÎs–µgŒÁgŒÁcŒ¥cŒ¥cŒ¥cŒ¥]s’R{ŒR{ŒR{ŒR{Œ]s’NsƒR{Œ]s’]s’8XqPN)L7L7L7L7X™GL7b­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸iɃɃɃx¸ix¸ix¸ix¸ix¸ib­Lb­Lb­LL7b­LL7L7L7L7L7L7L7L7L7L7(:-s¥Ö{µ̃s¥Ös¥Ö{µÖs­Ös¥Ös­Ös­Ös­Ö{­Î{µ̃{­Î{µ̃s¥Î{­Î{­̃s¥Ös¥Ös­Ö„µ̃s¥Ös­Ö{­̃{µ̃s¥Ö„µ̃{­̃s¥Ö{­ÖŒ½̃{µ̃ŒµÖ”½̃œÆ̃œÆ̃œÆçœÆçœÆç­Î̃¥Îç¥Îç«Đëµ̉âÎ̃ï̉ặÎ̃ï̃ç÷̉ặ̃ç÷̃ç÷̃ç÷̃âç̉ặ̃ç÷̃ç÷̃ç÷äéçâï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ÿÿÿÿÿÿó÷ûó÷ûï÷÷÷ÿÿÿÿÿs­Ös­Ös­Ös¥Ös¥Îs¥Ö{­̃{µ̃{­̃{­̃s¥Ös­Ös­Ös­Ös¥Î{­̃{­̃{­Ös­Ös¥Ö{µ̃s­Ö{­̃{µ̃s­Ö{µ̃s­Ös¥Ös­Ös¥Ö{µ̃s¥Î{­Î{­̃{­Ö*?P%1{­̃s¥ÖsœÁ{­̃{­̃{¥Î{­̃s¥Ö{­̃s­Ö{­Ös­Ös¥Ö{­Îs¥Îs¥Ö{œ½s¥Îh™»{œ½|•±\•¿sŒ­cŒ¥cŒ¥Gt¢cˆ ]s’R{Œ]s’R{Œ]s’R{Œfv|]s’Qdu(:-(:-L7L7L7L7X™GL7b­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸iɃx¸ix¸ix¸ix¸ib­Lb­Lb­Lb­LL7b­LL7L7L7L7L7L7L7L7L7L78Xq{­̃s­Ös­Ö{­Ös­Ös­Ö{­Î{­Îs¥Ö{­̃{­Ös­Ös¥Ös¥Î{­̃s­Ös¥Îs¥Ö{­̃s¥Ös­Ös­Ös­Ös­Ö{µ̃s¥Ö„µ̃{­̃„­ÎŒ½çŒ½̃Œ½̃Œ½̃Œ½̃”½̃œÆ̃œÆ̃œÆçœÆçœÆç¥Îç¥Îçµ̉âµÖëÁÛ́ÎÖïÎ̃ï̃âçÎ̃ïÎ̃ï̃ç÷̉ặ̃âç̃ç÷̃âç̃ç÷âï÷âï÷ïï÷âï÷âï÷ï÷÷ïï÷ÿÿÿïï÷ï÷÷ï÷÷ó÷û÷ÿÿ÷ÿÿï÷÷s¥Ö{­Ös­Ö{µÖ{­Ö{­Ös­Ö{­̃{­̃s¥Ö{¥Îs­Ös­Ö{µ̃s­Ös­Ös¥Ös¥Ö{µ̃s­Ö{­̃{µ̃s¥Ö{­̃s¥Ö{µ̃s¥Ös­Ö{µ̃{µÖs¥Ös¥Ös¥Ös­Ös­Öh™»X}’{µ̃s¥ÖR{Œs­Ö{­̃{µ̃{­Ö{­̃{­̃s­Ös­Ös¥Ö{­Ö{­̃{µ̃{­Ös¥Ö{­Ö{¥Îs¥ÎkœËs¥ÎgŒÁh™»cŒ¥cŒ¥cŒ¥cŒ¥cˆ cˆ W€¡R{Œ]s’d•]s’]s’]s’R{ŒNsƒJSU!b­LL7L7L7L7L7L7L7L7b­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­LL7b­LL7L7L7L7L7L7L7L7L7L7(:-sœÁs­Ös¥Ös­Ös¥Ö{­̃s¥Îs­Ös¥Îs­Ös­Ös­Ös­Ö{­̃{­̃{­̃s­Ö{¥Î{­Ös­Ö{­Ös­Ös­Ö{­Î{µ̃{µ̃{­̃{µ̃{µ̃„µ̃„½̃„µ̃{µ̃Œ½̃{­ÖŒ½̃”½çœÆ̃œÆç¥Îç¥Îç¥Îç¥Îç«ĐëµÖëµÖëÎ̃âÎ̃ïÎÖï̃ç÷Î̃ïÎÖïÎ̃ï̃ç÷̃âçØëó̃ç÷âï÷äéçï÷÷ïï÷ï÷÷ï÷÷÷ÿÿï÷÷ÿÿÿï÷÷ï÷÷÷ÿÿ÷ÿÿï÷÷ÿÿÿ{­̃s¥Ös¥Ö{­Ö{­Ös­Ös­Ö{­̃s¥Ös¥Ö{µ̃s­Ö{­Ö{µÖs­Ös¥Ös­Ös­Ö{µ̃s¥Ös¥Ös­Ös­Ös­Ös­Ö{µ̃{­̃{µ̃{µ̃s¥Ös­Ös­Ö{­̃{­̃s¥Ö{­̃R{Œ*?P{µ̃{µ̃{µ̃X}’s¥Ös¥Ös­Ö{µ̃s¥Ö{µ̃s­Ös¥Ös¥Ö{­̃s¥Ös­Ös­Ö{µ̃{­̃„­Î{­̃s¥Ö{­Îs¥ÖkœËs¥Îh™»s–µg³gŒÁkŒ¥cˆ cŒ¥Gt¢W€¡d•]s’d•d•d•]s’iwd•Qdu%)5(:-C.L7L7L7L7L7b­Lb­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­LX™GL7L7L7L7L7L7L7L7L7C.%1{­̃{­Ös­Ö{­Ös¥Ös­Ös­Ös¥Ö{­Ö{­Ö{­̃s­Ö{­Ös¥Ös¥Ös­Ö{µ̃{­Î{­Ös­Ös­Ö{µ̃{­Ös­Ö„­Î„µ̃„µ̃{µ̃„µ̃„½̃„½̃„µ̃{­̃”½ç„½̃Œ½ç”½̃œÆçœÆ̃ ̀â¥Îç¥Îç«Đëµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ï̃ç÷Î̃ïÎ̃ïÎ̃ï̉ặ̉ặ̃ç÷äéçïï÷ïï÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ï÷÷ïï÷ïï÷ï÷÷ÿÿÿÿÿÿÿÿÿï÷÷ÿÿÿs¥Ös¥Ös­Ös­Ös¥Ös­Ö{µÖs­Ö{µ̃s¥Ös¥Ös¥Ö{µ̃s¥Ö{­Ö{­̃{µ̃{µÖs¥Ös¥Ös¥Ös¥Ö{­̃s¥Ös­Ös­ç{­̃s­Ö{µ̃s¥Ö{µ̃s¥Ös¥Îs¥Ö{­̃s¥Ös¥ÖZ†±)8Xq{­̃{µ̃{­Ös¥ÖR{Œcˆ )9%)5R{Œ{­̃{­̃s¥Ö{µ̃{µ̃{­̃{µ̃s¥Ö{­̃s­Ös¥Ö„­̃{µ̃{­̃{­̃{µ̃{µ̃s­Ös­Ös¥Îs¥Îs¥ÎsœÎ{œ½h™»s–µg³cŒ¥d•d•cˆ d•X}’d•d•iwiwd•iwfv|JSU!(PN)L7L7b­Lb­Lb­Lb­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­Lb­LL7L7L7L7L7L7L7L7L7L7(:-Z†±s­Ö{­Ö{¥Îs¥Ö{­Ö{­Ös­Ös¥Ös­Ös­Ö{­Ö{­Ös­Ös­Ös¥Ö{µ̃{­Îs­Ö{­̃s­Ös­Ö{­Ös¥Ö{­̃{µ̃„µ̃„µ̃„µ̃„µ̃ŒµÖ„½̃{­Ö„½̃{µ̃Œ½çŒ½̃”½ç”½̃œÆçœÆç¥Îç«Đë«ĐëµÖëÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặ̃âçäéçâï÷âï÷âï÷ïï÷äéçïï÷ï÷÷ó÷ûó÷ûïï÷ÿÿÿïï÷÷ÿÿ÷ÿÿó÷û÷ÿÿ÷ÿÿ÷ÿÿs¥Ös¥Ö{­Ö{­̃s¥Ös¥Ö{­Ö{­Îs¥Ös¥Ös¥Ös¥Ö{­̃{µ̃s¥Ös¥Ö{­̃s¥Ö{­Ös¥Ös¥Ös­Ö{µ̃s­Ö{­̃{­Ös¥Ö{µ̃s¥Ös­Ös­Ö{µ̃{µ̃{­̃{µ̃{­̃s­Ös­Ös¥Öh™»X}’g³s¥Ö{µÖ{­̃s¥Ös¥Ö{µ̃s­Ö!!1s­Ö{­Ö{­Ös¥Ö{­̃s¥Ö{µ̃{µÖ{­̃s­Ös­Ös­ç„­̃{­̃{­̃{µ̃{µÖ{­̃{­̃{­Ö{­Ö{­Î{¥Î{ Á{¥Î{œ½{œ½cŒ¥h™»kŒ¥kŒ¥kŒ¥kŒ¥kŒ¥d•y‡’iwd•d•iwd•d•Qdu%)5(:-X™GX™Gb­Lb­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­LL7X™GL7L7L7L7L7L7L7L7C.!!1„µ̃{µ̃s­Ö{­̃{µ̃{µ̃s­Ös¥Ö{­̃s­Ö{­Ös¥Ö{µÖs­Ös¥Îs­Ö{µ̃{­Ö{­Î{­Ös­Ös­Ös­Ö{­Ö{­̃{µ̃„­̃„­̃„µ̃„µ̃{µ̃„½̃{­̃ŒµÖ„µ̃„µ̃„µ̃”½̃œÆ̃œÆ̃œÆ̃œÆç«Đëµ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̃âçÎ̃ïÎ̃ïÎ̃ï̃ç÷âï÷âï÷ï÷÷äéçâï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿ÷ÿÿÿÿÿ÷ÿÿ÷ÿÿó÷û÷ÿÿó÷ûs­Ö{¥Îs¥Ös­Ö{­Ö{­̃s¥Ös­Ö{­Ö{­̃{µ̃{­̃s¥Ös¥Ös¥Ö{­̃{­̃{­̃{µÖs­çs­Ös¥Ös­Ö{­̃s­ç{­̃{µ̃s¥Ös­Ö{µ̃{µ̃s­ç{µ̃{­̃{µ̃s¥Ös­Ös¥Ö{­̃s­Ö{­̃s­Ös­Ös¥Ö{­̃{µ̃{µ̃{­̃Œ½ç%)5%1!!1kœË{µ̃s­Ö{­Ö{µ̃s¥Ö{µ̃s¥Ö{­̃s­Ö{­̃{­̃{­̃s¥ÖŒµ̃s­Ö{µ̃{­̃{µ̃{µ̃„­Î{­̃{­Ö{­Î{­Ö{­Îs¥Îs¥Î{¥Î{œµ{œµ{œµ{Œ­{Œ­kŒ¥kŒ¥kŒ¥iwkŒ¥iwiwiwiwd•R{ŒJSUX™GX™Gb­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­LL7L7L7L7L7L7L7L7L7L7L7Hp”s­Ö{µ̃s¥Ös­Ö{­̃{­̃{­Î{­Ös¥Ö{µ̃s­Ö{­Ös¥Ös¥Ös­Ös­Ö{­Ös¥Ö{­̃s¥Ös¥Ös¥Ö{­Ö{­̃{­Ö{­̃{­̃{µ̃„µ̃„µ̃{µ̃„½̃Œ½̃{µ̃„µ̃Œµ̃”½̃Œ½ÖœÆ̃”½̃¥Æ̃«Đëµ̉âµ̉âµÖëÁÛ́Î̃ïÁÛ́̉ặÎ̃âÎ̃ïÎ̃ï̉ặâï÷äéçâï÷ïï÷äéçâï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ó÷ûÿÿÿï÷÷÷ÿÿ÷ÿÿÿÿÿ÷ÿÿ{­Ö{­̃{­Ös­Ö{­Ö{­̃s­Ö{­̃s­Ö{­̃{­̃s­Ö{­̃{µ̃s­Ös­Ö{µ̃{µ̃s¥Ös¥Ös¥Ö{­̃s­ç{µ̃{­Ö{µ̃s­Ös¥Ös­Ös¥Ös¥Ös¥Ös­Ö{­Ös­Ö{­̃s¥Ö{­Ö{­̃{­̃{­̃s­Ös¥Ös¥Ös¥Ös¥Ö{­̃{µ̃{­̃s­Ö%1sœÁs­Ö{µ̃{­̃{µ̃{µ̃{µ̃s¥Ö{µ̃{­̃{­̃{­̃s¥Ö„­Î{­̃„µ̃„µ̃s­ç{µ̃{µ̃Œ­ÖŒµ̃„­ÎŒ½̃„µ̃Œµ̃{­Ö{­Îs­ÖŒ­Æ{œ½„­Î„ µ{ Á{œµ{Œ­{Œ­{Œ­z’œ{Œ­kŒ¥kŒ¥iwd•]s’d•iwiwQdu!!1(:-b­Lb­Lb­Lb­Lb­Lb­Lx¸ix¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­LL7L7L7L7L7L7L7L7L7L7PN){­̃{­̃{­̃s­Ö{¥Îs­Ö{µ̃{­̃s­Ö{­̃{µ̃{­̃{µ̃s­Ö{­Ös­Ö{­Ö{­Ös¥Ös­Ös­Ös¥Ö{­Ös­Ö{­Ö{µ̃ŒµÖ{µ̃s­Ö{µ̃{µ̃„½̃{µÖ{­̃Œ½̃{µ̃„µ̃„µ̃Œ½̃”½̃œÆçœÆç¥Îç¥Îçµ̉â½ĐáÁÛ́̃âçÎ̃âÎ̃ïÎÖïµÖëÎ̃ïäéç̃ç÷äéçïï÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ïï÷÷ÿÿï÷÷ï÷÷ï÷÷ó÷ûï÷÷ÿÿÿs¥Ös¥Îs­Ös­ç{­̃„­̃s¥Ö{­̃s¥Ö{­̃s­Ö„½̃{µÖs¥Ö{­Ö{µ̃{­̃{µ̃{µ̃s¥Ö{µ̃s­Ös¥Ö{­̃{­̃{­̃s¥Ö{­Ös­Ö{µ̃s¥Ös¥Ös¥Ö{­̃{µ̃s¥Ös¥Ös­Ö{­̃s¥Î{­̃{µ̃{µ̃{µ̃{µ̃s¥Ö{µ̃{­̃{µ̃{µ̃{µ̃„µ̃s­Ö{µ̃{­̃s­Ö{­Î{µ̃s­Ö{µ̃s¥Ö{µ̃s­Ös­Ös­Ö{­̃{­̃„­̃{­̃{­̃{­̃Œ­Ö”½̃{­̃Œ­ÖŒ½̃œÆ猵̃˜ÁÖ{µ̃{­ÎŒ­ÖŒµÎŒ­ÖŒµÎŒ­ÆŒ­ÆŒ­ÆŒ­Æ{­Î„œ­„œ­„œ­kŒ¥kŒ¥iwkŒ¥iw]s’iwiwiwfv|JSUX™Gx¸ib­Lx¸ix¸ix¸ix¸ix¸ib­Lb­Lb­Lb­Lb­LL7X™GL7L7L7L7L7L7L7L7C.8Xqs¥Ö{­̃{µ̃{µ̃s¥Ö{µ̃s¥Ös¥Ö{­Ö{­̃{­̃s­Ös­Ö{­̃{­Î{­Ö„­Îs¥Ös­Ös­Ö{­Ö{­Ös¥Î{­̃{µ̃s­Ös­Ö{­Ö„µ̃{­̃{µ̃s¥Ö{µ̃{µ̃{µ̃{­̃{µ̃{­Ö”µâ˜ÁÖœÆçœÆç¥Îç¥Îçµ̉â½ĐáÁÛ́Î̃ïÎ̃ïÎÖïÎÖïÁÛ́̉ặ̃âç̃âçâï÷äéçïï÷ïï÷ïï÷ïï÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ÿÿÿ÷ÿÿï÷÷ï÷÷ó÷ûï÷÷ÿÿÿó÷ûsœÎs­Ö{­̃{­̃{­̃s­Ö{­̃s¥Ö{µ̃s­Ö{µ̃{­̃s¥Ös­Ö{µ̃s­ÖŒµÖs­Ös­Ös¥Ös¥Ös¥Ö{­̃s­Ös­Ö{­Îs¥Ös¥Ös­Ö{µ̃s¥Ö{µ̃s¥Ö{­Ös¥Ö{­̃s¥Ö{­Ö{­̃s¥Ö{­̃s­Ös­Ös¥Ö{­Ös¥Ös­ç{µ̃µÖëïï÷ó÷ûó÷ûïï÷ÁÛ́{­̃{­̃{µ̃{µ̃{µ̃{µ̃{µ̃s­Ö{µ̃{¥Î{­̃s­Ö{µ̃„½̃{µ̃{­̃„µ̃{­̃{µ̃{­̃Œµ̃”½çŒ½ÖœÆ̃˜ÁÖ”½ç”½̃”½̃”½̃˜ÁÖŒµÎŒµÖŒµÎŒµÖŒµÖŒ­ÆŒ­Æ„ µ„ µ{Œ­{Œ­z’œ{Œ­kŒ¥iwkŒ¥iwiwiwiwd•Qdu%)5(:-x¸ix¸ib­Lx¸ib­Lb­Lb­Lb­Lb­Lb­LL7b­LL7L7L7L7L7L7L7L7){­̃{µ̃s­Ö{µ̃{­Îs¥Ö{­̃s­Ö{­̃s­Ös­Ös¥Ö{­Ös¥Î{­̃s¥Ös­Ö{­Ös¥Ö{­̃{­Î{­Ö{­Ös­Ö{­Ö{µ̃{­̃s­Ös¥Ö{µ̃s­Ös¥Ös¥Ö{­̃{­Ö{µ̃Œ½̃ŒµÖ„½̃„µ̃”½ç”½̃œÆçœÆ̃µ̉âµ̉â½ĐáÁÛ́ÁÛ́ÇÔâµÖëµÖëÎ̃ï̉ặäéçäéçâï÷âï÷ï÷÷ïï÷âï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ó÷ûÿÿÿï÷÷ÿÿÿó÷û÷ÿÿ{­̃{µ̃{­̃s¥Ös¥Ös¥Ös¥Ö{­̃s¥Ö{­Ös¥Ös¥Ös¥Ös­Ö{µ̃{­̃{­̃s­Ös¥Ö{­̃{­̃s¥Ö{µ̃{µ̃{­̃{­̃{­̃s¥Ö{­̃s¥Ö{µ̃s¥Ö{µ̃{µ̃{­Ös­Ö{µ̃µÖëó÷û«Đë{µ̃s­Ö{­̃s¥Ö{µ̃{­̃µÖë÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̉ặ{­̃{­Ö{­Ö{µ̃s­Ö{µ̃s¥Ö{­̃{µ̃{­Ö„µ̃{µ̃{­̃{µ̃{µ̃{­̃{µ̃Œ½̃”½̃Œ½̃œÆçœÆçœÆ猽̃œÆ甽甽̃˜ÁÖœÆ̃˜ÁÖ˜ÁÖŒ½Ö”½̃ŒµÖŒ½ÖŒ­ÆŒ­Æ”­½¥»{œµ„œ­sŒ­sŒ­z’œk‡•k‡•kŒ¥kŒ¥k‡•iwiwQdu*?P(X™Gx¸ib­Lb­Lb­Lb­Lb­Lb­LX™GX™GL7X™GL7L7L7L7L7(Hp”s¥Ö{µ̃s­Ös¥Ö{µ̃s­Ö{µ̃s¥Ö{­̃s­Ös¥Ö{­Ös­Ö{­Î{­̃{­Ös¥Ös­Ö{­Ös¥Î{­Îs¥Ös¥Ö{µÖs¥Ö{­Ö{­̃{­̃s¥Ös­Ös¥Ö{­̃s¥Ö{­̃s¥Ö{­̃Œµ̃{­̃Œ½̃Œ½̃Œ½̃”½ç¥Îç¥Îç¥Îçµ̉â½ĐáµÖëµ̉âµ̉âÁÛ́ÁÛ́µÖë̉ặ̉ặâï÷âï÷äéçïï÷ïï÷ïï÷ï÷÷ï÷÷ó÷ûïï÷÷ÿÿï÷÷÷ÿÿÿÿÿó÷ûó÷û÷ÿÿ÷ÿÿ÷ÿÿÿÿÿ{­̃s¥Ös¥Ös¥Ös¥Ö{µ̃{­̃s¥Ö{­̃{µ̃{­̃{­̃s¥Ös­Ös¥Ö{­̃s­Ö{µ̃s¥Ö{µ̃s¥Ö{µ̃s¥Ö{­̃{­̃s­Ös¥Ös¥Ö{­̃s­Ös­Ö{­Ö{­Ö{­Ös¥Ö{­̃̉ặÿÿÿÿÿÿïï÷{­̃s­Ö{­̃s¥Ös¥ÖÁÛ́ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïï÷Œµ̃s­Ö{­̃{µÖ{µ̃{µ̃{­̃s­Ös¥Ös¥Ö{µ̃{µ̃s¥Ö{µ̃Œ½ÖŒ½çŒµ̃Œ½̃˜ÁÖœÆçœÆç˜ÁÖœ½̃ ̀â˜ÁÖœÆ甽̃”½ç˜ÁÖœÆ碿ԜÆ̃¥¹Ê˜ÁÖœ½̃¥¹Ê¥¹Ê´Å”­½¥»’¢¯{Œ­„œ­z’œz’œy‡’k‡•y‡’iwd•]s’]s’NsƒH_t%)5PN)b­Lx¸ib­Lb­LX™GX™Gb­LX™GL7L7L7L7L7(:-)9{­̃s­Ös¥Ös¥Ös­Ö{­̃{µ̃{­Ös­Ö{­Ös­Ös¥Ös¥Ö{­Ö{­Îs­Ös¥Ös­Ös­Ö{­Î{µ̃{­̃s¥Ös¥Ö{­Ö{­Ö{µ̃s­Ö{­̃{­̃{µ̃{µ̃{µ̃{­Ö{­̃„µ̃{µ̃Œµ̃Œ½̃Œµ̃Œ½̃œÆçœÆçœÆ̃œÆç¥Îç«Đëµ̉âµÖëµÖëµ̉âÁÛ́ÇÔâÇÔâÎ̃ï̃ç÷äéçâï÷âï÷äéçïï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷÷ÿÿï÷÷ÿÿÿó÷ûÿÿÿ÷ÿÿ÷ÿÿï÷÷÷ÿÿ{­Ö{­Îs¥Ös¥Ös­Ö{­̃s¥Ös­Ös¥Ö{­̃{­̃s¥Ö{­̃s­Ö{­̃{­̃s¥Ös­Ö{µ̃s­Ös¥Ö{­Ö{µ̃s­Ö{­̃s¥Ö{­̃s¥Ö{­̃s¥Ös¥Ös­Ös¥Ös¥Ö{­̃µÖëÿÿÿÿÿÿÿÿÿâï÷s­Ö{­Ö{µ̃{­̃µÖëÿÿÿÿÿÿÿÿÿÿÿÿïï÷̉ặÎ̃ï̃ç÷ÿÿÿÿÿÿÿÿÿÿÿÿâï÷{µ̃{­̃{­̃s¥Ö{­Ös¥Ös¥Ö{µ̃s¥Ö{µ̃„­̃{­̃{µ̃„µ̃„½̃„µ̃Œ½̃œÆçœÆ̃œÆ甽̃”½ç˜ÁÖ”½̃œÆçœÆ̃ ̀┽çœÆç¥Îç«ĐëœÆç¥Æ̃­Î̃­Î̃­ÅÓ¢¿Ô¥¹Ê´ÅŒ­Æ”­½{œµ„œ­„œ­z’œz’œcŒ¥kŒ¥d•d•]s’]s’Nsƒd•Qdu*?P(:-X™Gb­Lb­Lb­LX™GL7X™GL7L7b­LPN)cˆ s¥Ö{­Ö{µ̃s¥Ös­Ös­Ös­Ös¥Ös¥Ö{­̃{­̃{µÖs­Ö{­Ös­Ö{­Ö{¥Îs­Ös­Ös­Ös­Ö{­Îs¥Ö{­Ös¥Ös­Ös¥Ö{­̃{µ̃{µ̃{µ̃s­Ös¥Ö{­Ö{µ̃{µ̃„µ̃Œ­ÖŒµÖŒ½ç”½̃”½ç”½̃¥Îç¥Îç«Đëµ̉âµ̉âµ̉â«Đë«Đë½ĐáÇÔâÎ̃ïÎ̃ï̃ç÷âï÷âï÷ïï÷ïï÷ï÷÷÷ÿÿï÷÷ï÷÷÷ÿÿïï÷÷ÿÿï÷÷ï÷÷÷ÿÿó÷û÷ÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿs­Ö{­̃{­̃{­̃s­Ös¥Ö{µ̃{­Ö{­̃s¥Ös¥Ö{­̃{­̃s¥Ö{­̃{­̃{­̃{µ̃s¥Ö{µ̃s¥Ö{­̃{­̃s­Ö„µ̃{­̃{­̃s¥Ö{­̃{­Ös­Ös­Ö{µ̃{­̃s¥Ö÷ÿÿÿÿÿÿÿÿ̉ặs¥Ö{­̃s¥Ö{µ̃„µ̃÷ÿÿÿÿÿÿÿÿó÷û«Đë„­Îs¥Ös­Ö{µ̃„µ̃ÁÛ́ÿÿÿÿÿÿÿÿÿÁÛ́s­Ös¥Ö{­Ös¥Ös­Ös¥Ös¥Ö{­̃s­Ö{µ̃{µ̃{­̃„½̃„µ̃Œ½̃”½̃œÆ̃˜ÁÖœÆ̃”½̃˜ÁÖ”½çœÆ̃”½çœÆçœÆçœÆ̃œÆçœÆ眽̃¥Îç«Đë«Đëµ̉âµ̉â­Î̃­Î̃­ÅÓ¢¿Ô”±Ê”­½Œ­Æ¥»{œµ{Œ­{Œ­kŒ¥kŒ¥d•]s’]s’]s’R{ŒNsƒR{ŒNsƒ8Xq!!1PN)X™Gb­Lb­LL7L7L7PN)*?P{µÖ{­̃{­Ös¥Ös¥Ö„­Îs¥Ö„­̃s¥Ös­Ö{­Ös­Ös¥Ös¥ÖsœÎ{µÖ{­̃s­Ös¥Ös¥Ös¥Ö{­Î{µ̃{­̃s­Ös¥Ö{­̃s¥Ö{­̃{­̃s­Ö{µ̃{µ̃s¥Ös¥Ö{µ̃„µ̃{µ̃Œ½Ö„µ̃Œµ̃Œ½̃”½̃œÆçœÆç¥Îç¥Îç¥Îçµ̉â«Đë«Đëµ̉âµÖëÁÛ́ÇÔẩặ̃âç̃ç÷äéçïï÷ïï÷ï÷÷ïï÷÷ÿÿ÷ÿÿï÷÷ó÷ûï÷÷ï÷÷ï÷÷ï÷÷ÿÿÿó÷û÷ÿÿó÷û÷ÿÿÿÿÿ{¥Îs¥Ös­Ös¥Ös­Ö{­̃s¥Îs¥Ö{µ̃{­Ös­çs¥Ö{­̃{­̃s¥Ö{­̃s­Ö{µ̃s­Ö{­̃s¥Ö{­̃{­̃s¥Ö{µ̃{µ̃s­Ö{­̃{­̃{­̃{­̃{­Ö{µ̃s­ÖµÖëÿÿÿÿÿÿ̉ặ{µ̃s¥Îs¥Ös­Ö{­̃ÁÛ́ÿÿÿÿÿÿ÷ÿÿ{­̃{µ̃{µ̃s¥Ö„µ̃{­̃{­̃{­̃¥Îçÿÿÿÿÿÿÿÿÿ„µ̃s­Ö{­Ös­Ös­Ö{µ̃{µ̃s­Ös­Ös¥Ö„­Î„½̃Œµ̃{­̃Œ½Ö”½ç”½̃œÆ甽çœÆ̃”½̃˜ÁÖ”½çœÆ甽̃œÆ̃œÆ̃¥Îç¥Îçµ̉â«Đëµ̉âµ̉âµ̉â½Đá­Î̃½Đá­Î̃œ½̃˜ÁÖŒ½ÖŒµÎŒ­Æ”­½’¢¯„œ­{Œ­sŒ­cŒ¥d•d•d•R{ŒR{ŒNsƒNsƒNsƒNsƒH_t*?P(C.b­LX™GC.kœË{­̃s¥Ö{­̃{­̃{­̃s­Ö{­Ös­Ö{­Ös­Ös¥Ös­Ös­Ös¥Ö{­Ös¥Ös­Ös­Ö{­Ö{­Ö{­Ö{¥Îs¥Î{­Ö{µ̃s¥Ö{­̃{­̃{­̃{µ̃s­Ös­ç{µ̃{­̃s¥Ö{µ̃s­ç„­̃{­ÖŒ­Ö„½̃”½̃”½̃œÆçœÆ̃¥Îçµ̉â«Đë«Đë¥Îç«Đë¥Îçµ̉âÁÛ́Î̃ïÎ̃âäéçâï÷äéçï÷÷ï÷÷ï÷÷ï÷÷ïï÷ÿÿÿï÷÷ó÷ûï÷÷ïï÷÷ÿÿï÷÷ÿÿÿ÷ÿÿó÷ûï÷÷ï÷÷ÿÿÿs¥Ös¥Ö{­Ö„­̃s¥Ös­Ös¥Ös¥Ö{­̃{µ̃{µ̃s¥Ös¥Ö{µ̃s­Ös­Ös­Ö{­̃s­Ös¥Ö{­̃s¥Ös­Ö{­̃{µ̃{­̃{­̃s¥Ös¥Ö{­Ös¥ÖsœÎ{­̃s¥Öâï÷ÿÿÿÿÿÿŒµ̃{µ̃s­Ös­Ös¥Ös¥Ö̃ç÷ÿÿÿÿÿÿ«Đë{­̃{­̃s­Ös­Ö{­̃{­̃{­Ö{­̃{­̃̃ç÷ÿÿÿÿÿÿ«Đës¥Ös¥Ös­Ö{­̃sœÎ„­Îs­Ös­Ös­Ö„­ÎŒ­ÖŒ­Ö”½̃{µ̃œÆç–·ÖœÆç¥ÎçœÆç˜ÁÖ˜ÁÖ˜ÁÖ”½̃Œ½ÖœÆ̃”½çœÆ̃¥Îç¥Îç¥Îçµ̉âµÖëµ̉â½Đáµ̉âµ̉â¥Îç¥Æ̃œ½̃˜ÁÖ˜ÁÖ–·ÖŒµÖŒ­ÆŒ­Æ{Œ­{Œ­{Œ­cŒ¥cŒ¥cŒ¥d•]s’R{Œ]s’NsƒHp”NsƒR{ŒR{Œ*?P!(:-X}’{µ̃{µ̃s¥Ö{­̃{­̃{µ̃sœÎ{­̃{µ̃{­̃s­Ö{­̃s­Ö{­̃s­Ös­Ös­Ö{­Ös­Ö„­Îs­Ös¥Îs­Ö{µ̃{µ̃{­̃s­Ös¥Ö{µ̃{µ̃s¥Ö{­Ö{­Ö{­̃„µ̃{­̃s¥Ö{­̃”½ç{­Ö„µ̃„½̃”½̃”½̃˜ÁÖœÆç¥ÎçœÆçµ̉â¥Îç«Đë¥Îç­Î̃­Î̃ÁÛ́ÁÛ́Î̃ï̉ặâï÷ïï÷ïï÷ïï÷ó÷ûï÷÷ïï÷ïï÷ï÷÷÷ÿÿï÷÷ï÷÷ïï÷ÿÿÿÿÿÿÿÿÿó÷ûï÷÷ÿÿÿó÷û{­̃{­̃s¥Ös­Ös¥Ö„­Î{­̃s­Ö{­̃s­Ö{­̃{­̃s¥Ö{µ̃s¥Ö{­̃s¥Ös­Ös¥Ö{­̃{µ̃s¥Ö{­̃s­Ö{­̃{­̃{µ̃s­Ös¥Ö{µ̃s¥Ö{­̃{­̃{­̃ó÷ûÿÿÿâï÷{­̃s­Ös­Ös­Ös­ç{­̃ó÷ûÿÿÿó÷ûs­Ö{µ̃{­̃{µ̃s­Ös¥Ös­Ö{µ̃{µ̃{­̃s­ÖÿÿÿÿÿÿÆäôs¥Ös­Ö{­̃{µ̃{­̃{­̃{­Ö{µ̃{­Ö{­Ö{µ̃˜ÁÖ”½̃”½ç˜ÁÖ”½çœÆ猽֥Î眽̃¥Îç˜ÁÖ–·ÖœÆ̃œÆçœÆçœÆçœÆ̃¥Îçµ̉â¥ÎçÁÛ́µ̉âÁÛ́ÇÔâµ̉â¥Îçµ̉â¥Îç¥Îç˜ÁÖŒ½ÖœÆ̃ŒµÖŒ­ÆŒ­Æ{œ½{œµ{œµ|•±g³cŒ¥cŒ¥d•W€¡]s’]s’R{Œ]s’R{Œ]s’R{Œfv|*?P)„­Îs¥Ös­Ös¥Ös¥Ös¥Ös­Ös¥Ös­Ö{­̃{­̃s¥Ö{µ̃s¥Ö{­̃sœÎ{¥Î{­Ös­Ös­Ös­Ö{­Î{­̃s­Ö{­̃{­̃{­̃s­Ö{­̃{µ̃{­̃{µ̃{µ̃s¥Ö{­̃„½̃s¥Ö{µ̃{µ̃ŒµÖŒ½̃„½̃Œ½̃Œ½Ö”½̃”½ç¥Îç¥ÎçœÆç¥Îç¥Îç«Đë¥Îç¥Îçµ̉âÁÛ́Î̃ïÎ̃ï̃âçâï÷ïï÷ï÷÷ï÷÷ïï÷ÿÿÿï÷÷ï÷÷ÿÿÿÿÿÿÿÿÿ÷ÿÿï÷÷ï÷÷ï÷÷ïï÷ó÷ûï÷÷ï÷÷ó÷û{µ̃s­Ös¥Ö{µ̃s­Ös¥Ö{­̃s­Ö{­̃{­Ös¥Ös¥Ös¥Ös¥Ö{­Ö{­̃s¥Ö{µ̃{­̃{­̃s¥Ö{µ̃{µ̃{­̃{­̃s¥Ö{­̃{µ̃s­Ö{µ̃s¥Ös­Ös­Ös­Öó÷ûÿÿÿÎ̃ï{­̃{µ̃{­Î{­̃s­Ös­Öó÷ûÿÿÿ̃ç÷s¥Ö{­̃{µ̃s¥Ö{µ̃{µ̃s­Ö{µ̃s­Ös­Ös¥Ö÷ÿÿÿÿÿ̃ç÷{­Ö{µ̃s¥Ös¥Ö{µ̃{­̃{µ̃{­̃{­Ö{µÖ„µ̃Œ½Ö{­̃”½ç”½̃¥ÎçœÆ̃˜ÁÖ”½̃˜ÁÖ”½̃˜ÁÖŒ½̃”½̃”½̃”½çœÆç¥Îç¥Îç¥Îçµ̉âµ̉âµÖëµ̉â½ĐáÁÛ́µ̉â­ÅÓ¥Îç¥Î眽̃œ½̃”½̃˜ÁÖ˜ÁÖŒ­ÆŒ­Æ{œµsœÎsœÁ{œµcŒ¥{Œ­cŒ¥d•cˆ d•X}’]s’]s’]s’]s’]s’]s’Nsƒ8Xq!s¥Ös¥Ö{µ̃{­̃s¥Ös­Ö{­̃s­Ö{­̃{µ̃s­Ö{µ̃s¥Ös­Ö„­Î{­Îs­Ö{­Î{­Ös¥Ös­Ös­Ö{­̃s¥Ös¥Ös­Ö{­̃{µ̃{µÖ{­Ös¥Ö{­̃s­Ö{µ̃{µ̃s¥Ös¥Ö{µ̃„½̃{­̃{µ̃{µ̃ŒµÖŒ½̃”½̃”½̃˜ÁÖ˜ÁÖœÆç¥Îç¥Îç¥Îç¥Îç¥Îç¥Îçµ̉âÁÛ́ÎÖïâï÷̃ç÷ï÷÷ï÷÷äéçïï÷ÿÿÿÿÿÿ÷ÿÿï÷÷ï÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï÷÷ó÷ûÿÿÿÿÿÿÿÿÿÿÿÿ{­̃{­Ös­Ö{­̃s¥Ös­Ö{­̃s­Ö{­̃{µ̃s­Ös­Ö{µ̃{­̃s­Ös¥Ö{­̃{­̃s­Ös¥Ö{­̃{­̃{­̃s­Ös¥Ös¥Ös­Ös¥Ös­Ös¥Ös¥Ö{µ̃s­Ö{­̃ïï÷ÿÿÿ̉ặs¥Ös¥Ös­Ös¥Ös¥Ös­Öó÷ûÿÿÿ̉ặs¥Ö{µ̃{­̃s­Ö{­̃s¥Ös¥Ö{µ̃s¥Ö{µ̃s­Öó÷ûÿÿÿïï÷s¥Ös¥Ös­Ö{µ̃{­̃{µ̃{µ̃{­̃s¥Ö{­̃{µ̃Œ½ç„½̃Œ½ç”½çœÆ甽ç˜ÁÖ¥ÎçœÆç˜ÁÖ˜ÁÖŒ½Ö”½ç”½ç ̀âœÆç¥Îç¥Îç«Đë¥Îç½ĐáÁÛ́µ̉âµ̉âµ̉âµ̉âµ̉âµ̉â¥Îç«ĐëœÆçœÆ̃˜ÁÖ”½̃ŒµÖŒµÖ„­Î„¥Î{ Á{œµsœÁsœÁ|•±cŒ¥cŒ¥cˆ W€¡d•X}’R{Œd•d•d•]s’]s’]s’ajn*?PX}’s¥Ös­Ös­Ös¥Ö{µ̃s¥Ö{­Ö{­̃{µ̃s¥Ö{µ̃{­̃s¥Ö{­Ös­Ö{­̃{­Ö{­Ös¥Î{­Ö{­Ö{­Ös¥Ö{µ̃{­̃s¥Ö{µ̃„­̃{µ̃{µ̃„½̃s­ç„­Î{µ̃{­̃{µ̃{­̃{µ̃{­̃{­̃{µÖ„½̃Œ½ÖŒ½̃˜ÁÖ”½ç˜ÁÖœÆ̃¥ÎçœÆç¥Îç«Đë¥Îç¥Îçµ̉âµÖëÁÛ́̃ç÷̃ç÷âï÷ïï÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ï÷÷ÿÿÿó÷ûÿÿÿ÷ÿÿï÷÷ÿÿÿï÷÷ï÷÷ÿÿÿ÷ÿÿ÷ÿÿï÷÷ÿÿÿs¥Ös¥Ö{­̃s¥Ös­Ö{­̃s­Ös­Ö„­Îs­Ös­Ös­Ös¥Ös¥Ös­Ös­Ös¥Ös¥Ös¥Ös¥Ös­Ö{µ̃s¥Ös¥Ös­Ö{µ̃{­̃{­̃s­Ös­Ös¥Ös¥Ö{µ̃s¥Öó÷ûÿÿÿâï÷{­̃s­Ö{µ̃{­̃s­Ö{µ̃ïï÷ÿÿÿ̃ç÷s¥Ös¥Ö„µ̃{µ̃s¥Ös¥Ös¥Ös¥Ö{µ̃{­̃{µ̃÷ÿÿÿÿÿâï÷{µÖ{µ̃{µ̃{­̃{­̃{µ̃{µ̃{µ̃{µ̃{µ̃{­̃„µ̃{µÖ˜ÁÖœÆ̃œÆ̃”½̃œÆçœÆ̃¥ÎçœÆ眽̃”½̃œÆçœÆ̃œÆ̃œ½̃œÆç˜ÁÖ¥Îçµ̉â¥Îçµ̉âµ̉âµÖëµ̉âÁÛ́µ̉âµ̉â«Đë¥Îç¥Îç˜ÁÖ˜ÁÖ”½̃”½̃Œµ̃{­Ö{­Ö{­Îs¥ÎsœÎsœÎgŒÁh™»h™»s–µcŒ¥kŒ¥d•cŒ¥k‡•]s’k‡•iwd•iwiwiwd•JSU!*?P{­̃{µ̃{µ̃{­Ö{µ̃{­Ös¥Ös¥Ös­Ös¥Ös­Ös­Ös­Ös­Ös­Ö{­̃s¥Îs­Ö{µ̃s­Ös­Ö{¥Îs­Ö{­̃s¥Ö{­̃{­̃{­̃{µÖ{­̃{­̃„µ̃„½̃{­̃{µ̃{µ̃„µ̃{­̃{µ̃{µ̃„­̃„µ̃Œ½̃„µ̃”½ç”µâ”½çœÆ̃œÆç«Đë«Đë¥Îç«Đë«Đëµ̉âµ̉âÁÛ́Î̃ï̃ç÷âï÷ïï÷äéçï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿÿÿÿï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿó÷û÷ÿÿ÷ÿÿ÷ÿÿï÷÷s­Ö{µÖs­Ö{­̃{­Ös­Ös­Ös¥Ös¥Ö{­̃{­̃{­̃s¥Ös¥Ös¥Ös¥Ös¥Ös­Ös¥Ös¥Ös¥Ö{µ̃{­̃s¥Ös­Ö{µ̃{µ̃{­Ö{­̃s­Ös¥Ös¥Ös­Ös­Öâï÷ÿÿÿÿÿÿ„µ̃{µ̃s¥Ö{­̃s­Ös¥Ö̉ặÿÿÿÿÿÿ{µ̃s­Ös­Ö{µ̃s¥Ö{­̃s¥Ö{­̃{­̃{­̃{µ̃ÿÿÿÿÿÿ̉ặ„µ̃„­Î{µ̃{µ̃{µ̃{µ̃{­̃{­̃{­̃{­̃„µ̃{­̃{­Ö”½ç”½̃˜ÁÖ”½̃Œ½Ö”½̃˜ÁÖœÆ甽̃”½̃˜ÁÖœÆ̃œÆçœÆ̃œÆ̃œÆç¥Îç ̀â«Đë«Đëµ̉â«Đë«Đëµ̉âµ̉âµÖëµ̉â¥Îç ̀â¥Î眽̃œÆ̃„½̃Œ½ÖŒµ̃{µ̃„­Î{­Ös¥Î{­Îs¥Î{¥ÆkœË{œ½s–µ|•±s–µkŒ¥z’œkŒ¥kŒ¥k‡•kŒ¥kŒ¥k‡•k‡•iwk‡•iwajn*?P!!1{¥Îs­Ös­Ö„µ̃s­Ös¥Ös¥Ös­Ös¥Ö{µ̃s­Ös­Ö{µ̃s¥Ö{­Ös¥Ös¥Ö{µ̃{µ̃s¥Ö„­Îs­Ö{­̃s­Ös¥Ö{µ̃{µ̃s­Ö„µ̃„µ̃„µ̃{­̃{­̃{­̃„µ̃{­̃„µ̃{µÖ{­̃{µ̃{µ̃{­̃Œ­ÖŒµÖŒ½̃œ½̃œ½̃œÆç˜ÁÖœÆç¥Îç¥Îç¥Îç«ĐëµÖë½ĐáÎ̃ïÁÛ́̃ç÷̃âçïï÷ï÷÷ï÷÷ï÷÷ÿÿÿï÷÷÷ÿÿó÷ûÿÿÿó÷û÷ÿÿÿÿÿó÷ûó÷ûï÷÷÷ÿÿ÷ÿÿ÷ÿÿ÷ÿÿï÷÷ï÷÷ï÷÷„­Îs¥Ö{­Ö{µ̃s­Ös¥Ö{­̃{­Ö{­̃{­̃s­Ö{­̃s­Ös¥Ö{µ̃{­Ös¥Ös¥Ös¥Ö{­̃s¥Ö{­̃{­̃s¥Ö{­̃{µ̃{µ̃s­Ös­Ös­Ös­Ö{µ̃{µ̃s­ÖµÖëÿÿÿÿÿÿÁÛ́s¥Ö{­̃{­Ö{µ̃{­̃œÆçÿÿÿÿÿÿÁÛ́{µ̃s¥Ö{µ̃s­Ös¥Ös¥Ös¥Ös­Ö{­̃¥ÎçÿÿÿÿÿÿµÖë{­̃{­Ö{­̃{­̃{­̃„µ̃{­̃„µ̃{µ̃{µ̃„µ̃s¥Ö„µ̃Œ½̃Œ½̃”½̃”½ç”½̃Œµ̃”µâŒ½Ö”½̃”½ç”½ç”½̃”½̃œÆ̃”½ç”½̃œÆç ̀â¥Æ̃¥Îç«Đë«Đë¥Îçµ̉âÁÛ́µ̉âµ̉â«Đë¥ÎçœÆ̃œ½̃Œ½̃”µâŒ½̃„­̃„µ̃{­Ö„µ̃{­Ös­Ös¥Î{­Ös­Ö{ Ás¥Îs¥Î{œµ{œµ„ µ{œµ{Œ­kŒ¥sŒ­z’œkŒ¥z’œkŒ¥y‡’y‡’y‡’y‡’y‡’JSU!h™»{µ̃s­Ö{­Ös­Ö{­̃s­Ö{­̃s­Ös¥Ö{­̃s­Ö{­̃s­Ö{­̃s¥Ö{­Ö{­̃{µ̃s¥Îs¥Ö„­Îs¥Ö{­Ös¥Ös¥Ö„­Î{­̃{µ̃{­̃„µ̃{µ̃{µ̃„µ̃„µ̃Œ½Ö„½̃„µ̃{­̃„µ̃„µ̃{µ̃„µ̃ŒµÖ”½ç”½ç”½̃œÆ甽̃œÆçœÆ甽ç«Đë¥ÎçµÖëµÖëÎ̃ïÎ̃ïâï÷âï÷äéçâï÷äéçï÷÷ó÷ûï÷÷÷ÿÿï÷÷÷ÿÿ÷ÿÿ÷ÿÿ÷ÿÿÿÿÿó÷û÷ÿÿ÷ÿÿÿÿÿÿÿÿï÷÷ï÷÷ï÷÷ó÷ûï÷÷{­̃s­Ös¥Ös¥Ös­Ös­Ö{­̃{­̃s¥Ö{µ̃{µ̃{­̃{­Ös­Ö{­̃s¥Ös­Ö{­̃{­Ös¥Ö{­̃s­Ös­Ös¥Ös¥Ö{­̃{­̃{­̃{­̃s¥Ös¥Ö{¥Îs­Ö{­̃s¥Öÿÿÿÿÿÿÿÿÿ¥Æï{­̃s­Ös­Ö{­̃{µ̃̉ặÿÿÿó÷û„µ̃{­̃{­̃s­Ös¥Ö„­̃{­Ös­Ö{µ̃ÿÿÿÿÿÿÿÿÿŒµ̃„µ̃{µÖ{­̃{µ̃{µ̃„µ̃{µ̃{µ̃„µ̃s¥Ö{µ̃{­̃{µ̃„­̃„½̃„½̃Œ½̃Œ½̃„µ̃ŒµÖ{µ̃Œ½ÖŒ½̃„µ̃Œ½̃Œ½̃”½̃œ½̃”½çœ½̃œÆçœÆç¥Îç¥Îç«Đëµ̉âµ̉âµ̉âµ̉â¥Îç¥Îç¥Îç˜ÁÖ˜ÁÖ”½ç”½̃Œµ̃Œ½ç„½̃{­Ö„½̃{µ̃{­̃s¥Ö{­Ö{­Î{­Î{­Î{­Î„¥ÎŒ­ÆŒ­Æ„ µ­¹{œµ„œ­z’œ{Œ­z’œz’œz’œy‡’y‡’y‡’y‡’z’œ™“”fv|(:-X}’s­Ö{µ̃{µ̃{µ̃s¥Ö{­̃s¥Ös¥Ö{­̃s­Ö{µ̃s¥Ö{­̃{­̃s¥Ö{µ̃s­Ö{­̃s­Ö{­Îs­Ö{­̃s¥Ös­Ös¥Ös­ç{­̃{­̃{µ̃„µ̃„µ̃{µ̃„µ̃„½̃Œ½̃Œµ̃Œ½Ö„­Î{­̃Œ½Ö„µ̃„µ̃„­̃„µ̃Œµ̃”½̃”½̃”½ç”½çœ½̃œ½̃¥ÎçœÆçµ̉âÁÛ́ÁÛ́Î̃ï̃âç̃âçï÷÷âï÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ÿÿÿï÷÷÷ÿÿÿÿÿ÷ÿÿ÷ÿÿï÷÷ÿÿÿ÷ÿÿï÷÷ÿÿÿï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷s­ç{µ̃{­̃{­̃{­̃s­Ö{­̃s¥Ös¥Ös¥Ö{­̃s­Ös¥Ös¥Ö{­̃s­Ö{­̃s¥Ös­Ö{­̃{µÖs¥Ö{µ̃{µ̃s¥Ö{µ̃s­Ö{µ̃{­Ös¥Ös­Ö{­̃s­Ö{­̃s¥ÖµÖëÿÿÿÿÿÿÿÿÿ«Đës¥Ö{µ̃{­Ös­Ö„µ̃÷ÿÿÿÿÿ÷ÿÿ„µ̃s­Ös­Ö„µ̃s­Ös¥Ö„µ̃ïï÷ÿÿÿÿÿÿ̉ặ{µ̃„½̃„µ̃„µ̃Œ½̃ŒµÖ{µ̃{µ̃ŒµÖ{­̃{µ̃„µ̃„½̃Œ­ÖŒµÖ{µ̃Œ½̃„½̃”½çŒµ̃{­̃{­̃{µ̃„µ̃ŒµÖŒ½̃Œµ̃”½ç”½̃˜ÁÖ˜ÁÖ˜ÁÖœÆ眽̃«Đë«Đë«Đë½Đáµ̉â«Đë¥Îç¥Îç¥ÎçœÆ猵̃”½̃˜ÁÖ”½̃„½̃„µ̃”µâ{µ̃{µ̃s­ç{­ÖŒ½̃ŒµÖ„µ̃Œ­ÆŒµÎŒ­ÖŒ­ÆŒµÎŒ­ÆŒµÎŒ­Æ”­½„ µ{œµ{Œ­{Œ­™“”z’œ™“”™“”§™“”™“”™“”™“”™“”ajnH_t{µÖs­Ö{­̃{µ̃s­Ös­çs­çs­Ö{­Ös­Ö{­̃{µ̃{­Ö{µ̃s­Ös­Ö{µ̃{­̃{­̃{µ̃{­Ö{­̃{µ̃s¥Ös¥Ös¥Ö{­̃s­ç{µ̃{­̃{­̃„­̃„½̃Œ½̃Œ½̃Œ½ÖŒ½̃”½̃„µ̃”½̃{µ̃Œ½çŒµ̃Œ½ÖŒ½̃”½̃”½ç˜ÁÖœÆ甽ç¥ÎçœÆ̃¥Îç½ĐáÁÛ́ÁÛ́̉ặØëó̉ặØëóâï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷û÷ÿÿï÷÷ÿÿÿÿÿÿó÷ûï÷÷÷ÿÿó÷û÷ÿÿï÷÷ÿÿÿÿÿÿïï÷ï÷÷ï÷÷ÿÿÿÿÿÿï÷÷{­Î{­̃s­Ös¥Ös¥Ös¥Ös­Ös¥Ös¥Ö{­̃s¥Ö{­Ös­Ö{­̃{­Ö{µ̃{­ÎŒ­Ö{­̃s¥Ös¥Ö{­̃s¥Ös¥Ös­Ös¥Ö{­̃{­̃s¥Ös¥Ö{­̃s­Ös­ÖsœÎ{­̃s­Ö̉ặÿÿÿÿÿÿÿÿÿÿÿÿµ̉â{­̃{­̃s­Ö{­̃ïï÷ÿÿÿÿÿÿ̉ặ„½̃{­̃Œ½ç̉ặÿÿÿÿÿÿÿÿÿÿÿÿ”½̃{µ̃„µ̃Œ½̃„­̃Œ½̃Œ½̃Œ­Ö{µ̃„µ̃s­Ö„µ̃Œ½̃Œ½̃Œ½̃{µ̃”½çŒ½̃„½̃”½çŒ½̃ŒµÖ{µ̃Œ½̃{µ̃„µ̃„µ̃Œ½̃œµ̃”½çœÆç˜ÁÖœÆ甽çœÆçœÆç¥Îç­Î̃¥Îç¥Îç«ĐëœÆ̃œÆç¥ÎçœÆç¥ÆÖ”½ç˜ÁÖŒµ̃Œ½Ö”½̃„µ̃Œ½ç{­̃Œ­Ö{­̃”½ç{µ̃„µ̃„µ̃–·ÖŒµÖ”½̃˜ÁÖŒ½Ö˜ÁÖ”±Ê´ÅŒ­ÆŒ­Æ §¬Œ­Æ §¬„œ­„œ­§™“”™“”™“”™“”™“”™“”™“”™“”sy%)5H_tŒ½̃{­Ö{¥Î{¥Îs¥Ö{­̃{­̃s¥Ö{µ̃s­Ös¥Ö{µ̃{­̃s­Ös­Ö{­̃{µ̃s¥Ö{­̃s­Ö{­̃s¥Ös­Ös­Ös¥Ös­Ö{µ̃{µ̃{­̃s­Ö{µ̃{­̃{­̃Œ½̃Œ½̃”½ç˜ÁÖŒ½ÖœÆ甽̃Œ½̃Œ½̃„µ̃Œ­Ö”½çŒ½̃Œ½ÖœÆ̃˜ÁÖœÆ̃˜ÁÖ¥Îç¥Îçµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ïâï÷̃ç÷ïï÷ïï÷ï÷÷ï÷÷ÿÿÿï÷÷ï÷÷ÿÿÿ÷ÿÿïï÷ÿÿÿï÷÷÷ÿÿï÷÷÷ÿÿï÷÷ïï÷ÿÿÿïï÷ó÷ûï÷÷ï÷÷ï÷÷ï÷÷ï÷÷s­Ös­Ös­Ö{­̃s­Ö{µ̃{µ̃{µ̃s­Ö{µ̃{­Ös¥Ös­Ös¥Ö{µ̃{µ̃s­ç{­̃{­̃s¥Ös¥Ö{­̃{­̃{µ̃s¥Ö{µ̃{µ̃s­Ös­Ö{­̃„­Î{­̃s­Ö{­̃{­̃{­̃s­Ö̉ặÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿïï÷âï÷̉ặ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÆ̃{µ̃„µ̃„­̃Œ½̃Œµ̃Œ½Ö{µ̃{­̃Œ½ç{µ̃„µ̃Œµ̃{µ̃Œ­Ö{µ̃Œµ̃Œ½Ö”½̃Œ½ÖŒ½̃„­̃{­ÖŒ½ÖŒ­Ö„½̃„µ̃„­̃Œ½̃„µ̃Œ½̃Œ½̃”½̃ ̀âœÆç¥Îç¥ÎçœÆç¥Îç¥Îç¥Îç¥Îç¥ÎçœÆçœÆçœÆ̃˜ÁÖœÆçœÆ焵̃Œ½̃ŒµÖ„µ̃Œµ̃{­̃”½̃”½ç„µ̃Œ½̃Œ½̃”½̃”½ç˜ÁÖ–·Ö˜ÁÖœÆ̃œÆ̃œÆ̃˜ÁÖ˜ÁÖ¥¹Ê–·Ö¥¹Ê¥¹Ê´ÅŸ²· §¬ §¬ §¬ §¬ §¬™“”™“”™“”™“”™“”™“”z’œajnJSUœÆç{µ̃s­Ös­Ös­Ö{­Ö{­̃s¥Ö{­Ös­Ös¥Ö{­Ös­Ö{­̃s¥Ö{­̃{µ̃s­Ös¥Ö{µ̃s¥Ö{­̃{µ̃{µ̃{­̃s­Ö{µ̃{µ̃{µ̃{µ̃{­̃{­̃„µ̃„µ̃Œ½çŒµÖ”½̃”½̃˜ÁÖœÆ̃”½̃˜ÁÖŒ½̃Œ½̃Œ½̃”½̃Œ½̃˜ÁÖ˜ÁÖ¥ÎçœÆç¥Îç¥Îç«Đëµ̉âÁÛ́ÎÖï̉ặ̃ç÷̃ç÷ïï÷ïï÷ï÷÷ïï÷ï÷÷÷ÿÿ÷ÿÿï÷÷ÿÿÿÿÿÿïï÷ï÷÷ÿÿÿï÷÷ó÷ûï÷÷ï÷÷ï÷÷ÿÿÿï÷÷ï÷÷ó÷ûï÷÷ï÷÷ïï÷ï÷÷{­̃{­̃s¥Ös­Ös­Ös¥Ö{­̃{µ̃s¥Ös­Ö{­̃{µ̃{µ̃{­Ö{­̃{µ̃s¥Ö{µ̃s¥Ös­Ö{­̃{­Ös¥Ö{­̃{­̃s¥Ös¥Ös¥Ös¥Ö{­Ö{­̃{­̃s­Ö{µ̃{­̃s­Ö{­Ö{µ̃¥Æïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿŒ½̃{µ̃{µ̃{­̃Œµ̃Œ½̃”½̃Œ½̃Œ½̃„µ̃Œ½̃{­̃„½̃„µ̃{­̃Œ½ç”½ç”½ç”½̃Œ½çŒ½̃”½çŒ½̃Œ½̃”½ç„µ̃Œ½ç„½̃Œµ̃Œ½çŒ½̃„µ̃Œµ̃œÆ甽çœÆç¥Îç¥Îç¥Îç¥ÎçœÆçœÆçœÆçœÆç¥ÎçœÆ̃¥Î甽甽̃”½̃Œ½̃„µ̃{­̃„µ̃{µ̃ŒµÖŒ½̃Œ½̃{­̃Œ½ç”½ç”½̃œ½̃œÆ̃˜ÁÖ¥Îç¥Îç¥Îç«Đë¥Îç¥Æ̃­Î̃¶Ä̉­Î̃¶Ä̉­ÅÓ¥¹Ê²³¶´ÅŸ²·Ÿ²·Ÿ²· §¬§§™“” §¬™“”™“”™“”™“”fv|(:-*?Pœ½̃œÆ̃„½̃{­Ö{­̃{­Ös­Ös­Ös­Ö{µ̃{¥Ö{µ̃s­Ö{µ̃s­Ö{­̃{µ̃{­̃{­̃{µ̃s­Ö{­̃{µ̃s­Ös­Ö{­̃s­Ös­Ös¥Ö„­̃{µ̃{­Ö„µ̃Œ½̃„µ̃œÆ猽甽眽̃œÆçœÆç˜ÁÖ”½̃”½̃”½̃œÆçœÆç˜ÁÖœ½̃œÆ̃œÆç«Đë¥Îç«Đëµ̉âÇÔâÁÛ́Î̃âÎ̃ï̃âç̃ç÷äéçïï÷ïï÷ïï÷ÿÿÿó÷û÷ÿÿï÷÷ÿÿÿï÷÷ÿÿÿï÷÷÷ÿÿó÷û÷ÿÿïï÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ÿÿÿ{­̃s­Ö{­Ös­Ös­Ö{­̃{­̃{µ̃{­Ö{­̃„µ̃s­Ö{­̃s­Ö{­̃s¥Ö{­̃{­Ös¥Ös¥Ös¥Ös¥Ö{µ̃s­Ö{­̃s¥Îs­Ös¥Ös­Ö{­Ös­Ös¥Ös­Ös­Ö{µ̃s­Ös¥Ös¥Ö«Đëó÷û«Đëâï÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâï÷¥Îç{µ̃„µ̃{­̃„µ̃„½ÖŒµ̃”½̃”½̃”½̃„µ̃Œ½̃„µ̃„½̃Œµ̃„½̃Œ½̃Œ½çŒ½Ö”½̃Œ½̃”½̃Œ½̃„½̃Œ½̃Œ½̃„½̃Œµ̃„µ̃„µ̃„µ̃”½ç„½̃{µ̃„µ̃„µ̃”½̃œÆ眽̃¥Îç¥ÎçœÆç¥Æ̃œÆçœÆ̃œÆ̃œÆç˜ÁÖ”½̃Œ½̃”½ç”½̃Œµ̃{µ̃{µ̃{­Ö{µ̃Œ½̃„µ̃„µ̃”½̃”µâ”½̃”½̃”½̃œÆçœÆç­Î̃¥Îç«Đë«Đëµ̉â­Î̃µ̉â½Đá½Đá½ĐáÁÊÔÁÊÔÁÊÔÁÊÔ¶Á¿¶Á¿Ÿ²·²³¶²³¶ §¬ §¬ §¬›¬–™“”™“”™“”™“”™“”y‡’ajn!JSU½Đá¥ÎçœÆ̃Œ½ç{­̃s­Ö{µ̃„­Î{­̃{­̃s¥Ö{µ̃{µ̃s¥Îs¥Ös¥Ö{­̃s¥Ös¥Ö{­̃{­̃s­Ös¥Ös­Ö{µÖs­Ös­Ös¥Ö{­̃{µ̃{µ̃„µ̃„µ̃Œ½çŒµ̃Œ½̃Œ½Ö˜ÁÖœÆçœÆçœÆçœÆ甽̃”½̃”½̃˜ÁÖ”½ç”½̃”½çœÆ̃ ̀â¥Æ̃«Đë«Đëµ̉âµ̉âµ̉âÎ̃ï̉ặ̃ç÷̃âçâï÷âï÷âï÷ï÷÷÷ÿÿï÷÷ó÷û÷ÿÿ÷ÿÿó÷û÷ÿÿ÷ÿÿï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûs­Ös¥Ös¥Ös­Ös­Ös¥Ö{­̃s­Ös­Ös¥Ös¥Ös­Ös¥Ös­Ö{­̃{­̃s¥Ös­Ö{µÖs¥Ö{­̃{­̃{­̃s­Ö{µ̃s­Ö{­Ö{­̃{­̃s­Ö{­Ös­Ö{µ̃s¥Ös­Ös¥Ö{µ̃̉ặÿÿÿÿÿÿœÆçs­Ö„µ̃¥ÎçµÖë̃ç÷ÿÿÿÿÿÿÿÿÿÿÿÿó÷û̃ç÷µÖëœÆçœÆ焵̃Œ½̃{µ̃„µ̃Œ½̃„µ̃Œ½̃œÆ̃–·Ö”½̃„½̃Œ½̃”½̃Œ½̃Œµ̃Œ½ÖŒ½̃Œ½̃”½̃Œ½çŒ½̃Œ½̃Œ½̃„µ̃ŒµÖŒ½Ö„½̃Œ½ç„µ̃„½̃Œ½ç”½ç„µ̃Œ½̃Œ½̃”½̃”½̃œÆ̃œ½̃”½çœÆ̃œÆç˜ÁÖœÆ̃”½̃œ½̃”½̃”µâ„µ̃Œ½̃{µ̃{µ̃{µ̃„µ̃Œ½̃{­̃{µ̃Œ½ÖŒ½çŒ½̃”½̃œÆ̃œ½̃œ½̃œÆç¥Îç¥Îç«Đë«Đëµ̉âµ̉âÇÔâÁÛ́ÁÛ́ÇÔâÁÛ́Î̃âÇÔâÇÔâÎĐѽĐáÁÊÔÈÉÉÁÊÔ¶Á¿²³¶²³¶²³¶ §¬²³¶™“”™“”™“”™“”™“”™“”™“”fv|(:-JSUÇÔâµ̉â¥Æ̃œÆ焵̃{­̃{­̃s­Ös¥Ös¥Ö{µ̃s¥Ös¥Ös¥Ös­Ös­ç{µ̃{­Ös¥Ö{­̃s­Ö{­̃{µ̃{­Ö{­Ös­Ös¥Ö{­̃s¥Ö{­̃{­̃{­̃„µ̃Œ­ÖŒ½ç”½̃”½ç˜ÁÖ”½̃˜ÁÖ”½ç”½ç”½ç˜ÁÖ”½̃œÆç¥ÎçœÆçœÆ甽̃¥Æ̃¥Îç¥Îç¥Îçµ̉âµ̉âÇÔâÎ̃ïÎ̃ïÎ̃ï̃âçâï÷äéçïï÷ïï÷âï÷ï÷÷ï÷÷÷ÿÿó÷ûó÷û÷ÿÿó÷û÷ÿÿï÷÷ï÷÷ó÷ûó÷ûó÷ûï÷÷ï÷÷ïï÷ïï÷ó÷û÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷„µ̃s¥Ö{­̃s­Ös¥Ös¥Ös¥Ö{µÖs¥Ös¥Ö{­̃{­Ö{­Ö{µ̃s¥Ös¥Ös­Ö{­Ö{­̃s­Ös­Ö{­̃s¥Ös­Ös¥Ö{µ̃s¥Ös¥Ö{­Ös­Ös¥Ös­Ö{µ̃{­̃s¥Ö{µÖ̉ặÿÿÿÿÿÿÿÿÿ̃ç÷{­̃s¥Ös­Ös­Öµ̉âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«Đ넽̃”½ç”½çŒ½Ö”½̃”½ç”½ç”½̃”½çŒ½ç”½̃”½çŒ½ç”½̃”½ç”½̃Œ½̃Œµ̃„½̃Œµ̃„µ̃Œ½ÖŒ½̃„½̃„µ̃„½̃Œ½̃Œµ̃„µ̃Œµ̃Œ½̃”½̃œ½̃”½ç˜ÁÖ”½̃”½̃”½ç”½̃”½̃Œ½̃„µ̃Œ½̃{­̃„µ̃{­Ö{­̃{­̃{µ̃s­ç„­̃„½̃„µ̃Œ½̃„µ̃”½̃”½ç”½çœÆ̃¥ÎçœÆç¥Îç«Đë«Đëµ̉â½ĐáµÖëÁÛ́Î̃ïÎ̃ï̉ặÎ̃âÎ̃âÎ̃âÔÛ̃Î̃âÔÛ̃ÇÔâÇÔâÈÉÉÈÉÉи­¶Á¿¶Á¿²³¶ §¬ §¬ §¬ §¬™“”™“”™“”™“”™“”y‡’JSU!JSUÇÔâµÖëµ̉â ̀âœÆ̃„µ̃s­Ö{­̃{­̃s­Ös­Ös¥Ös­Ö{­̃{­̃s­Ö{­̃s¥Ö{¥Ö{­̃s¥Ös­Ös¥Ö{­Ös­Ös­Ös¥Ös­Ös­Ös¥Ös­Ös¥Ö„µ̃„µ̃{µ̃„½̃”½ç”½̃”½̃”½̃”½ç”½̃”½̃”½̃”½̃œÆç¥Îç¥Îç¥ÎçœÆ̃¥Îç¥Îç¥Îç«Đëµ̉âµÖëµÖëÁÛ́Î̃ïÎ̃ï̃ç÷̃ç÷̃ç÷ïï÷âï÷ï÷ïï÷÷ï÷÷ó÷ûó÷ûÿÿÿ÷ÿÿ÷ÿÿï÷÷ÿÿÿ÷ÿÿï÷÷ó÷ûï÷÷ïï÷÷ÿÿï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷{­̃s¥Ö{­Ö{­Ö„­Îs­Ös­Ö{µ̃s¥Ös­Ö{­Ös­Ö{­̃s¥Ös¥Ö{­̃{­̃{­̃s­Ös¥Ö{­Ös­Ö{­̃s­Ö{­̃s¥Ös­Ö{­Ö{­̃s­Ö{µ̃{µ̃s¥Ö{µ̃{­̃µ̉âÿÿÿÿÿÿÿÿÿ̃ç÷s­Ös¥Ö{­̃{µÖs­ÖÁÛ́ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«Đ넽̃”½̃”½̃œ½̃œÆ甽̃”½̃”½̃”½̃”½̃œÆ眽̃”½̃Œ½ç”½ç”½̃„µ̃Œ½̃„½̃Œ½̃„µ̃Œµ̃Œ½̃„½̃„½̃Œ½̃”½ç„½̃Œ½̃{µ̃”½çŒ½̃Œµ̃„µ̃Œµ̃Œ½̃”½ç„µ̃„µ̃Œ½̃„½̃Œ½̃„µ̃{­ÖŒµÖ{­̃{­̃{­̃„µ̃{­̃s­çŒ½Ö„½̃Œµ̃”½ç”½̃œÆç˜ÁÖœÆ̃œÆç«Đë¥Îç«Đëµ̉âµÖëÁÛ́ÁÛ́Î̃ïÎ̃ẫç÷̃ç÷̉ặ̃âç̃âçäéç̃âçâï÷âï÷ÚàáÚàáÔÛ̃ÎĐÑÈÉÉÈÉÉÈÉɲ³¶²³¶ §¬ §¬§ §¬™“”¥¥™“”§™“” §¬y‡’(:-fv|ÁÛ́µ̉âµ̉â«ĐëœÆ猽̃Œµ̃s­Ös¥Ös¥Ö{­̃s¥Ös­Ös¥Ös¥Ö{­̃s­Ös¥Ös¥Ös¥Ös­Ö{­̃{µ̃{µÖs­Ös¥Ö{­Ö{µ̃{­̃{­Ös­Ö{­Ö{µ̃„µ̃„µ̃s¥Ö„½̃Œ½̃”½̃”½̃Œ½̃”½ç”½çœÆç¥Îç ̀âœÆç¥Îç¥Îç¥Îç¥Îçµ̉â¥Îç«Đë¥Îçµ̉âµ̉âµÖëÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷âï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûÿÿÿï÷÷ïï÷ÿÿÿï÷÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷s¥Ö{­̃s­Ös­Ös¥Ös¥Ös­Ö{­̃s­Ö„­Îs­Ös­Ö„­̃s­Ö{µ̃{­̃s­ç{­̃{­̃s¥Ös­Ös­Ös­Ös¥Ös­ÖsœÎs¥Ö{­Ö{­̃s¥Ös¥Ö{µ̃s¥Ös­Ös­Öó÷ûÿÿÿÿÿÿ«Đë{­̃{­̃s­Ös¥Ö{­̃s¥Ö„µ̃âï÷ÿÿÿÿÿÿ”½̃{­̃„µ̃”½ç”½çµÖëµÖë̃ç÷ÿÿÿÿÿÿ«Đ딽猽çœÆ猽̃Œ½̃ŒµÖ”½̃”½̃”½̃œÆ甽ç˜ÁÖ”½̃”½ç”½ç„µ̃Œµ̃„µ̃Œ½Ö”½̃Œ½̃Œ½̃„µ̃ŒµÖ„µ̃„½̃„µ̃{­̃ŒµÖŒµÖ„µ̃Œ½̃Œ½ç„½̃„½̃Œ½̃”½çŒ½̃Œ½̃ŒµÖ{­̃{µ̃s­Ö{­̃s­ç{­̃{µ̃{­̃{­̃{­̃{µ̃{­̃ŒµÖŒµ̃Œµ̃”½̃”½̃œÆçœÆç¥Îç¥Îç«Đë¥Îçµ̉âµ̉âµ̉âÁÛ́Î̃ïÎ̃ïÎ̃ï̃ç÷̃ç÷̃âçäéçâï÷ïï÷ïï÷ïï÷Úàá̉ặ̃âçÚàáÚàáÎĐÑÎĐÑÈÉÉÈÉɲ³¶²³¶²³¶Ÿ²·™“”„œ­™“” §¬ §¬’¢¯Ÿ²·Ÿ²· §¬ajnz’œÁÛ́µ̉â«ĐëœÆç˜ÁÖœÆ甽̃„½̃{­̃{µ̃s­ç{­Ös­Ös¥Î{­̃s¥Ös­Ös­Ö{µ̃s­Ö{­̃s­Ös¥Ös­Ös¥Ös¥Ös¥Ös¥Ös­Ö{­Î{­Ö{µ̃s­Ös­Ös¥Ö{­̃”½çŒ½̃Œ½̃œÆ̃”½çœ½̃”µâŒµÖ˜ÁÖ¥ÎçœÆç¥ÎçœÆ̃¥Îç¥Îç¥Îçµ̉âµ̉â«Đë¥Îçµ̉âÁÛ́ÁÛ́ÇÔâÎ̃ïÎ̃ẫç÷̉ặâï÷ï÷÷âï÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷ó÷ûïï÷ï÷÷ï÷÷ÿÿÿï÷÷ï÷÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷Œ­Ö{­̃s­Ö{µ̃s¥Ö{­̃s¥Î{­̃s­Ös¥Ö{­̃s­Ös¥Ö{µ̃{µ̃s­Ös­Ös¥Ös¥Ö{­̃„­̃{­̃{­̃s­Ös­Ös¥Ös­Ös¥Ö{­Ö{­̃s¥Ös­çs­Ö{­Ö¥Îçÿÿÿÿÿÿ̉ặs¥Ö{­Ö{­̃{µ̃{µ̃s¥Ö{µ̃{­̃{µ̃ïï÷ÿÿÿÿÿÿ{­̃„µ̃s¥Ö{µ̃{­̃{­̃ÁÛ́ÿÿÿÿÿÿ¥Î甽焵̃˜ÁÖ”½̃œÆ̃”½̃Œ½̃œ½̃”½̃œÆ̃˜ÁÖœÆ甽̃˜ÁÖ”½çŒ½ç„½̃„µ̃{­̃Œ½̃Œ½̃{µ̃„½̃”½ç„½̃ŒµÖ{µ̃Œ½̃ŒµÖŒ½̃ŒµÖ{µ̃„µ̃”½çŒ½̃Œ½Ö{­̃Œ­ÖŒµÖ{µ̃s¥ÖŒµÖ{­̃Œ½̃{µ̃{µ̃{µ̃ŒµÖ„­̃{­̃{µ̃{µ̃{µ̃{­̃”½̃”½̃˜ÁÖœ½̃œÆç˜ÁÖ¥Îç¥Îç«Đëµ̉âµÖëÁÛ́Î̃ïÁÛ́̃ç÷̃ç÷̃ç÷̃ç÷âï÷âï÷âï÷ï÷÷ïï÷ï÷÷ïï÷ïï÷äéḉéñâï÷ïï÷ÔÛ̃ÔÛ̃ÚàáÈÉÉÁÊÔ²³¶²³¶Ÿ²· §¬ §¬ §¬Ÿ²·Ÿ²·²³¶¢¿Ô¶Ä̉¥ÆÖµ̉â½Đáµ̉â¥Îç¥Îç¥ÎçœÆ̃˜ÁÖŒ½̃Œ½ç„½̃„µ̃{µ̃{µ̃s­ÖsœÎs¥Ös¥Ös­Ö{µ̃s­Ös¥Ös­Ös­Ö{­̃s­Ö{­̃s­Ö{µÖs¥Ös­Ös­Ö{¥Î{­̃{­̃{µ̃s¥Ö{­̃ŒµÖŒµÖ{µ̃”½ç”½ç”½̃”½̃Œ½̃”½̃–·Ö”½̃˜ÁÖ¥Îç¥Îç¥Îçµ̉âœÆ̃œÆç¥Îç«Đëµ̉âµ̉âÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ï̃âç̃ç÷äéçïï÷ï÷÷âï÷ï÷÷ï÷÷ó÷ûï÷÷÷ÿÿï÷÷ÿÿÿïï÷ï÷÷ï÷÷ï÷÷âï÷ïï÷ïï÷ïï÷ï÷÷ïï÷ïï÷ï÷÷ïï÷äéçï÷÷ï÷÷ï÷÷s¥Ös¥Ö{­̃s¥Ö{µ̃s­Ös­Ös­Ös­Ös¥Ös­Ös¥Ös­Ös¥Ö{­̃{µ̃s­Ö{µ̃{­̃s¥Ös¥Ös­Ös­Ö{­̃s­çs­Ös¥Ö{­̃{­Î{µ̃s­Ös­ÖsœÎs¥Ö̃ç÷ÿÿÿÿÿÿ{µ̃{µ̃s­Ös¥Ös¥Ö{­Ös¥Ös¥Ös¥Ö{­̃„µ̃ÿÿÿÿÿÿ«Đë{­̃{µ̃s¥Ö{µ̃{­ÖÁÛ́ÿÿÿÿÿÿ«Đ댽̃Œ½ÖœÆ̃˜ÁÖŒ½ÖŒ½Ö”½̃”½̃˜ÁÖ”½̃¥Î甽̃˜ÁÖ˜ÁÖ”½çŒ½Ö„½̃„µ̃Œ½̃”½çŒµÖ„µ̃„µ̃Œµ̃{­̃„µ̃Œ½ç{µ̃{µ̃{­ÖŒ½̃Œµ̃„µ̃Œ­ÖŒ½̃ŒµÖŒ­Ö{­Ö{µÖ{µÖ{­̃{­̃{µ̃{µ̃Œ­Ö{­̃{­̃{µÖ{µ̃„µ̃{µ̃{­̃{­̃{µ̃”½ç”½̃”½çœÆç¥Îç¥Îç¥Îç«Đëµ̉âµ̉âµÖëÁÛ́ÎÖï̃ç÷Î̃ẫç÷̃ç÷äéçâï÷âï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ó÷ûï÷÷ïï÷ïï÷ïï÷âï÷ÚàáäéçÚàáÎĐÑÁÊÔÈÉɶÄ̉¥¹Ê²³¶¥¹Ê²³¶¶Ä̉ÁÊÔ­ÅÓ½Đáµ̉âµ̉â«Đë«Đë«Đë¥ÎçœÆ̃œÆ甽猵̃”½ç„µ̃Œ½̃{­Ös­Ös­Ös¥Ö{µ̃{­Ös¥Ös¥Ö{­Ö{¥Î{­̃s­Ö{­̃{­̃s­Ös¥Ö{­Î{­Îs¥Î{­Ös­Ö{µ̃{µ̃s¥Ös¥Ö{­Ös­Ö{µ̃ŒµÖŒ½̃Œ½̃”½̃Œµ̃”½ç”½̃”½ç”½̃œÆç ̀âœÆç¥Îç¥Îç¥Îç¥Îçµ̉âµ̉âµÖë«ĐëÁÛ́ÁÛ́ÁÛ́ÎÖïÎÖïÎ̃ïäéç̃ç÷ïï÷ï÷÷äéçï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷äéçï÷÷äéçï÷÷ï÷÷ïï÷ï÷÷ïï÷ïï÷âï÷ï÷÷ï÷÷ï÷÷ï÷÷{­̃{­̃„µ̃s­Ös­Ö{­̃{­̃s¥Ös¥Ös¥Ös­Ös¥Ös­Ö{µÖ{­Ö{­̃s­Ö{­̃{­̃{­̃{µ̃s­Ös­Ö{­̃s¥Ö„­Îs¥Ö{­̃s¥Ös¥Ö{­̃{­̃{­̃{µ̃ïï÷ÿÿÿâï÷{­̃s¥Ö{µ̃{µ̃s­Ö{µ̃s­Ös¥Ö{­Ös¥Ös¥Öâï÷ÿÿÿ÷ÿÿs¥Ös¥Ö{­̃{­̃{­̃ÁÛ́ÿÿÿÿÿÿ¥Î猽猽甽̃Œ½̃œ½̃Œ½̃”½̃”½̃”½̃”½̃œÆ̃˜ÁÖ”½ç”½ç”½̃”½çŒ½̃Œ½̃„µ̃„µ̃„½̃Œ½̃Œ½̃„µ̃„­̃„½̃„½̃Œ½Ö„­̃{­Ö„µ̃„µ̃„µ̃Œµ̃{µ̃{­̃„µ̃„µ̃{µ̃{µ̃{­̃„µ̃„µ̃„½̃s­ç{µ̃„µ̃s­ç{­̃{­̃{µ̃„µ̃{­̃Œµ̃”½̃”½̃œÆ̃œÆçœÆç¥Îç«Đë¥Îç«Đëµ̉âµÖëÎ̃ïÁÛ́Î̃ï̃ç÷̃âçâï÷âï÷ï÷÷ïï÷ï÷÷ï÷÷ÿÿÿÿÿÿï÷÷÷ÿÿ÷ÿÿó÷ûï÷÷ï÷÷ï÷÷ïï÷äéç̃âç̃âçÎĐÑÎĐÑÁÊÔÁÊÔÈÉÉÁÊÔÁÊÔÁÊÔÁÊÔ½Đá½Đá½ĐáµÖëµÖë«Đë«Đë¥Îç˜ÁÖ”½̃ŒµÖŒ½̃Œ½̃„µ̃{­̃„½Ö{­̃s­Ö{­Ö{µ̃s­Ös­Ö{µ̃s¥Ös­Ö{­̃s¥Ös¥Î{µ̃s¥Ös¥Ö{­Ö{­Ös¥Ö„­Î{­Ös­Ös¥Ös­Ös­Ös¥Ö{­̃{­̃„µ̃Œµ̃„½̃Œ½̃Œ½̃”½̃œ½̃¥ÎçœÆç¥Îç¥Îç¥Îç¥Îç¥Îç­Î̃­Î̃ÁÛ́µ̉âÁÛ́ÇÔâÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷̃ç÷äéçâï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷âï÷äéçï÷÷ïï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷âï÷âï÷ï÷÷ï÷÷s¥Ö{µ̃s­Ös¥Ös¥Ös­Ös¥Ö{­̃{µÖs¥Ös¥Ö{­̃{­̃{­̃s¥Ö{­Ös¥Ö{­̃s¥Ös¥Ös­Ö{µ̃{­̃s­Ö{­̃s­Ö{­Ös­Ös¥Ös­Ö{­̃{­̃{­̃s­Öó÷ûÿÿÿ̉ặs¥Ös¥Ös­Ös¥Ös­Ös­Ö{­Ö{­̃s¥Ös­Ös¥Ö¥Îçÿÿÿÿÿÿ„µ̃s¥Ö{µ̃s¥Ö{µ̃ÁÛ́ÿÿÿÿÿÿ¥Î猽̃”½̃”½̃Œ½̃”½̃”½̃”½̃”½̃œÆçœÆ̃˜ÁÖœÆ̃”½ç”½̃Œµ̃”½̃Œ½̃„½̃Œ½çŒ½̃„µ̃{­̃{µ̃Œµ̃{µ̃„µ̃„µ̃„½̃Œ½̃„­Î{­̃{µÖ{­Ö{­̃„­̃„½̃{µ̃„µ̃„µ̃{µ̃{­Ö„µ̃{µ̃{µ̃„­̃s¥Ö{µ̃„µ̃{­̃„½̃„µ̃Œµ̃Œ½̃„µ̃”½ç”½̃”½̃œÆçœÆç¥Îç¥Îç«Đë«Đëµ̉â½ĐáÁÛ́Î̃ï̉ặ̃âçâï÷âï÷äéçïï÷ï÷÷ó÷ûï÷÷ïï÷ï÷÷ó÷ûï÷÷÷ÿÿó÷ûï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷äéç̃âçÚàáÎĐÑÇÔâÁÊÔÁÊÔ­Î̃½Đá½Đá½Đáµ̉âÁÛ́µÖëµÖë«Đë¥Îç¥ÎçœÆ甽̃Œ½̃Œ½̃Œ½̃Œµ̃Œ½̃{µ̃„µ̃s­Ö{­̃s¥Ös­Ös¥Ö{­̃{­Ös­Ös¥Ö{­Ö{­̃s­Ös¥Ös­Ös­Ö{µ̃s­Ö{µ̃s­Ö{­Ö{µÖ{­̃s¥Ös­Ös­Ö{­̃Œ½ç„µ̃Œ½̃{­̃Œ½̃„µ̃”½̃œÆ̃œÆç¥ÎçœÆç¥Îç¥Îç¥Îç¥Îçµ̉âµ̉âÁÛ́½ĐáÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặâï÷äéçäéçâï÷âï÷âï÷äéçâï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ïï÷âï÷ïï÷ï÷÷ï÷÷äéçï÷÷ï÷÷ï÷÷ïï÷s­Ös­Ös­Ös­Ös¥Ös¥Ös¥Ös­Ö{µ̃{µ̃{­̃s¥Ös¥Ö{­̃s¥Ös¥Ös¥Ös­çs¥Ös¥Ös¥Ö{­̃s­Ö{µ̃s¥Ös­Ös­Ös¥Ös¥Ös¥Ös¥Ös¥Ös­Ös­Öïï÷ÿÿÿÎ̃ïs¥Ös¥Ö{µ̃s­Ös­Ös¥Ös­Ö{­̃s¥Ö{­̃s­ÖœÆçÿÿÿÿÿÿ”½̃{µ̃s¥Ös¥Ö„µ̃ÁÛ́ÿÿÿÿÿÿ«Đ댵̃Œ½̃Œµ̃”½̃œ½̃”½çœÆç˜ÁÖ¥ÎçœÆ眽̃”½̃˜ÁÖŒ½Ö”½çŒ½̃„µ̃Œ½̃„µ̃„½̃{­̃Œµ̃„µ̃{­Ö„µ̃Œµ̃„µ̃„µ̃{­̃Œµ̃{­̃„µ̃{µ̃{­Ö{µ̃{­̃s¥Ö{µÖ{µ̃„µ̃„µ̃„µ̃{µ̃{­̃„½̃{µ̃„µ̃{­̃{µ̃„µ̃„µ̃Œµ̃”½̃”½ç˜ÁÖ”½çœÆçœÆç¥Îç¥Îç¥Îç¥Îçµ̉âµÖëÁÛ́Î̃ïÎ̃ï̃âç̃âçâï÷äéçï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ÿÿÿ÷ÿÿ÷ÿÿó÷ûó÷û÷ÿÿï÷÷ó÷ûÿÿÿï÷÷́éñâï÷äéçäéçÔÛ̃̃âç½Đá½Đá½Đá½Đá½Đá½Đáµ̉âµ̉âµ̉â­ÅÓœÆç«ĐëœÆ甽甽̃”½̃”½çŒ½̃”½̃”½̃„µ̃„µ̃s¥Ö{­Ö{µÖs¥Ö{­̃s¥Ö{­̃{­̃{µ̃{­̃s¥Ös­Ös­Ös­Ös­Ös­Ös¥Îs­Ö{­̃s­Ö{­̃s­Ös­Ö{µ̃ŒµÖ{­̃{­̃{µ̃„µ̃„µ̃„µ̃”µâœÆç˜ÁÖœÆçœÆçœÆç¥Îç¥Îç«Đë¥Îçµ̉âÁÛ́µÖëÇÔâµÖëÇÔâµÖëÎÖïÎ̃ïÎ̃ï̉ặ̃âçäéçäéḉéñâï÷äéçï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷äéçï÷÷ïï÷ïï÷ïï÷́éñï÷÷ïï÷ïï÷âï÷ïï÷ïï÷âï÷ïï÷ïï÷{­̃„­̃s­Ö{­Ös¥Ö{­̃{µ̃s­Ö{­̃{­̃s¥Ö{­Ö{­Ös­Ö{­Ös¥Ö{­̃s­Ös­Ös­Ös­Ös­Ös¥Ö{­̃„­Î{µ̃s¥Ö{­Ö{­Ös¥Ö{µ̃{­̃{µ̃{­̃ïï÷ÿÿÿâï÷s­Ös­Ö{­̃s­Ös¥Ö{­̃s¥Ö{­Ö{­̃{­Ös¥Ö¥Îçÿÿÿÿÿÿ”½çs¥Ö{µ̃„µ̃„µ̃ÁÛ́ÿÿÿÿÿÿ¥Î猵̃Œ½̃„µ̃Œ½̃œÆ̃œÆçœÆ̃œÆçœÆçœÆ̃œÆ甽çœÆ猽̃Œ½̃Œ½̃Œ½̃„µ̃„½̃Œ½̃Œ½çŒ½̃Œ­Ö{­̃„­̃{­̃{µ̃{­Ö{­̃{­̃{­̃{µ̃„µ̃„µ̃„µ̃{µ̃{­Ö{µÖ{µ̃„­̃{­̃{µ̃{­̃s­ç{µ̃{­̃„µ̃{µ̃{­̃{µ̃ŒµÖ”µâ”½ç”½çœÆ̃œÆçœÆç¥Îç¥Îç«Đë«Đë«Đë«ĐëµÖë½ĐáÎ̃ïÎ̃ï̉ặ̃ç÷âï÷ïï÷âï÷ïï÷ïï÷ÿÿÿï÷÷ï÷÷ÿÿÿï÷÷ÿÿÿï÷÷ó÷ûÿÿÿó÷ûï÷÷ó÷ûï÷÷ï÷÷âï÷ïï÷äéçäéç̃âçÎ̃âÇÔâÇÔâµ̉â­Î̃µÖë«Đëµ̉â¥Æ̃¥ÎçœÆ̃œÆ甽甽猽̃Œµ̃”½ç”½̃Œ½̃„µ̃{­ÖŒµ̃s¥Ö{­̃s¥Ös¥Ös¥Ö{µ̃s­Ös­Ö{µ̃{µ̃s­Ö{­̃{­̃s­Ös­Ös­Ö{¥Î{µ̃s¥Ö{­Ös­Ös¥Ö{­̃s­Ö{µ̃{­̃{µ̃„µ̃ŒµÖ„µ̃„µ̃Œµ̃”½̃œÆçœÆçœÆçœÆçœÆ̃¥Æ̃¥Îç¥Îç¥Îçµ̉âµÖëÁÛ́ÇÔâÁÛ́Î̃ïÎ̃âÎ̃ï̉ặÎ̃ï̃ç÷̃ç÷̃ç÷âï÷äéçï÷÷âï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷âï÷ïï÷ï÷ïï÷÷ïï÷ïï÷ï÷÷äéçïï÷âï÷ï÷÷âï÷ïï÷ï÷÷ïï÷ï÷÷s¥Ös­Ös¥Ö{­̃s¥Ös­Ös¥Îs¥Ö{µ̃s­Ös­Ö{µ̃{­̃{µ̃s­Ö{­̃s¥Ö{­Ös¥Ö{µ̃{µ̃s­Ös­Ös­Ös¥Ös­Ö{µ̃s¥Ös­Ös¥Ö{­̃s¥Ö{­̃s¥Öâï÷ÿÿÿÿÿÿ{µ̃{­̃s¥Ös¥Ös¥Ös­Ös¥Ö{­̃s¥Ö{­̃s­ç̃ç÷ÿÿÿÿÿÿŒ½̃{µ̃{­̃{­̃{­̃ÁÛ́ÿÿÿÿÿÿ¥Î猽̃„µ̃Œµ̃Œ½̃œÆç˜ÁÖœÆ̃¥Îç¥ÎçœÆçœÆç¥ÆÖ”½̃œÆ甽̃Œ½̃„µ̃{µ̃Œ½̃{µ̃„µ̃„½̃„µ̃„µ̃„µ̃{µ̃„­Î{µ̃{­̃„½̃„µ̃s¥Ö„­̃{µ̃{µ̃{­̃Œ­ÖŒµ̃{­̃{µ̃„µ̃{µ̃{­̃s¥ÖŒµÖ{­̃„µ̃{­̃„µ̃Œµ̃Œµ̃˜ÁÖ”½çœ½̃œÆç¥Îç¥Îç¥Îç«Đë«Đë¥Îç¥Îç«ĐëµÖëÁÛ́ÁÛ́Î̃ï̃ç÷âï÷̃ç÷̃âçâï÷ï÷÷ïï÷ï÷÷ÿÿÿï÷÷ÿÿÿó÷û÷ÿÿ÷ÿÿï÷÷ó÷û÷ÿÿï÷÷ï÷÷÷ÿÿï÷÷âï÷ï÷÷âï÷âï÷̃âç̃ç÷Î̃â½ĐáµÖëµ̉â«Đë¥Îç¥Îç¥Æ̃¥Æ̃œÆçœÆ̃”½̃”½̃Œµ̃Œ½ç”½ç”½çŒ½̃„µ̃Œµ̃„µ̃{­̃{­̃{­̃s¥Ös¥Ös­Ös¥Ös­Ös¥Ö{­̃{­̃{µ̃{­Ös­Ös¥Ös­Ös­Ös¥Ö{µ̃{­Ös­Ö{­̃{­Ö{­̃{­̃{µ̃{µ̃{­̃s¥Ö{µ̃„µ̃„½̃œÆçœÆç¥ÎçœÆçœÆçœÆ眽̃«Đëµ̉â«Đëµ̉âµÖëµÖë½ĐáÁÛ́Î̃âÎ̃ïÎ̃ïÎ̃ï̃ç÷̃ç÷âï÷̃âçâï÷ï÷÷âï÷âï÷ïï÷âï÷ïï÷âï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷äéçïï÷ïï÷âï÷ï÷÷ï÷÷âï÷ï÷÷äéçïï÷ïï÷ïï÷ï÷÷{­Î{µ̃„­Îs¥Ö{­Î{­̃{­Ös­Ö{­Ö{­̃{­̃s­Ös­Ös¥Ös­Ö{­̃s­Ö{¥Îs­Ö{µ̃„­Îs¥Ö{µ̃s­Ö{­Îs­Ös¥Ös¥Ö{µÖ{­̃{­Ös­Ö{­̃s¥Ö̃ç÷ÿÿÿÿÿÿµ̉âs¥Ös¥Î{­̃s­Ös­Ös­Ös¥Ös¥Ö{­̃„µ̃ÿÿÿÿÿÿÿÿÿ{µ̃s¥Ö„µ̃{­̃{­̃µÖëÿÿÿÿÿÿ¥Îç{µ̃Œ½̃Œ½̃œÆ甽̃¥Îç¥Îç¥Æ̃œÆ̃˜ÁÖ¥ÎçœÆ̃”½̃”½̃”½çŒµ̃Œ½̃Œ½̃Œ½ç{µ̃Œ½ÖŒ½̃„½̃„µ̃„½̃{µ̃{µÖ{µ̃{­̃{µ̃{­̃{µ̃{­̃{­̃{­̃„½̃ŒµÖ{µ̃{µ̃{µ̃{µ̃{µ̃{µ̃s­Ös­ç{­̃s­ç{­̃„½̃„½̃”½̃”½̃œÆç¥Îç¥Îç¥Îç¥Îç«Đë«Đë¥Îç¥Îç¥Îçµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ẫç÷̃ç÷̃ç÷ï÷÷âï÷ï÷÷ïï÷ï÷÷ï÷÷÷ÿÿï÷÷ó÷ûó÷ûÿÿÿ÷ÿÿï÷÷ÿÿÿï÷÷ÿÿÿïï÷ï÷÷ïï÷âï÷âï÷̉ặ̃âç̉ặÎ̃ïÁÛ́µ̉â«Đë«ĐëœÆ̃¥ÎçœÆ̃”½̃œ½̃”½çŒ½̃Œ½ç”½̃”½̃”½̃”½̃”½çŒ½̃„µ̃Œ­Ö{µ̃{µ̃s¥Ös­Ös¥Ö{­̃s­Ö{­̃s¥Ö{µ̃{µ̃s¥Ö{µ̃s­Ö{µ̃„­Îs¥Ös­Ö{­Î{­Ös­Ös¥Ö{µ̃{µ̃{­̃{­̃{­̃{µ̃s¥Ö{µ̃{µ̃„µ̃ŒµÖŒ½Öœµ̃œÆçœÆçœÆç¥Îçµ̉âµ̉âµ̉âµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́Î̃ïÎ̃ẫâç̃ç÷âï÷äéçäéç̃ç÷âï÷ïï÷äéçï÷÷ï÷÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷âï÷ïï÷ï÷÷âï÷̃ç÷ïï÷ïï÷âï÷ïï÷ïï÷äéçs­Ös¥Ö{µ̃{­Ö{­Ö{­̃{­ÖŒ­Ö{­Îs­Ö{­̃s¥Ö{µ̃s¥Ös¥Î{­̃s­Ös­Ös¥Ö{µ̃s­Ös¥Ös­Ö{µ̃{µ̃{­̃s¥Ös¥Ös­Ö{­Î{µ̃{µ̃{µ̃s­ÖœÆçÿÿÿÿÿÿ÷ÿÿ{­̃s¥Ö{­̃s­Ö{­̃{µ̃s¥Ös­Ö{µ̃̉ặÿÿÿÿÿÿ̃ç÷{µ̃{­̃s¥Ö{µ̃ŒµÖÁÛ́ÿÿÿÿÿÿ«Đë{µ̃Œ½Ö„½̃Œ½̃˜ÁÖ˜ÁÖ¥ÎçœÆç¥Îç¥Îç˜ÁÖœÆ̃˜ÁÖŒ½̃”½̃Œ­Ö”½ç”½̃{µ̃Œ½̃Œ½̃”½çŒµ̃„½̃{µÖ„µ̃s¥Ö”½çŒ­Ös­çs¥Ös­ç{µ̃{µ̃„½̃{µ̃{­̃{­̃{µ̃„½̃{µ̃„µ̃{­̃Œ½Ö{µ̃{µ̃{­̃„µ̃„µ̃„µ̃”½ç”½̃œÆç˜ÁÖ«Đë¥Îç«Đë«Đë«Đë¥Îç¥Îçµ̉â«Đëµ̉âÁÛ́̉ặÎ̃ï̃ç÷âï÷̃ç÷âï÷âï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ÿÿÿ÷ÿÿÿÿÿï÷÷ï÷÷ï÷÷ï÷÷âï÷ïï÷ï÷÷ïï÷ïï÷âï÷ïï÷âï÷Î̃ïÎÖïÁÛ́µ̉âµ̉â¥Îç­Î̃œÆç˜ÁÖ¥Î甽̃”½̃œÆ̃”½̃Œ½̃Œ­ÖŒ½̃œÆ̃”½ç”½̃„µ̃„µ̃{µ̃{­̃{µ̃s¥Ös­Ö{­Ös¥Ö{µ̃{­Îs­Ös­Ö{µ̃{­̃{­Ös¥Î{­Ös­Ö{µ̃{µ̃s¥Î{­Ö{µ̃s¥Î{µ̃{µ̃{­̃{µ̃s­Ös¥Ös­Ös¥Ö„µ̃{µ̃Œµ̃˜ÁÖŒµÖ”½ç ̀â¥Îç ̀â«Đëµ̉âµ̉âµÖëÇÔâÇÔâÁÛ́ÇÔâÁÛ́ÁÛ́Î̃ïÎ̃ï̃ç÷̃ç÷âï÷âï÷Øëóäéçâï÷âï÷âï÷ïï÷ïï÷äéçïï÷ïï÷ï÷÷äéçâï÷âï÷âï÷âï÷ï÷÷ï÷÷ï÷÷äéçâï÷ïï÷äéçïï÷âï÷ï÷÷{­̃s­Ös­Ös­Ö{­Ö{­Ös­Ös­Ö{µ̃s­Ö{­̃s¥Ös¥Ö{­Ös­Ös¥Ö{µ̃s­Ö{­Ös¥Ös¥Ös¥Ös¥Ös¥Ö{­̃s­Ös­Ös¥Ös­Ös­Ö{µ̃{­Ös¥Ö{­̃„­Îâï÷ÿÿÿÿÿÿïï÷{­̃s­Ö{­̃{­̃{­Ös¥Ö{­̃ÁÛ́ÿÿÿÿÿÿÿÿÿœÆç{­̃{µ̃s¥Ö{µÖ{µ̃ÁÛ́ÿÿÿÿÿÿ¥Æ̃Œµ̃„µ̃ŒµÖœÆ甽ç ̀â¥Îç¥Æ̃¥ÎçœÆ̃¥ÎçœÆç˜ÁÖ”½çŒ½ÖŒµ̃„µ̃Œ½̃{­̃{­̃„­ÎŒµ̃Œ½Ö{­̃{­̃s­Ö{µ̃{­̃„½̃{µ̃{µ̃s­Ö{­̃s­ç„½̃{µ̃{µ̃{µ̃{µ̃{µ̃{µ̃{µ̃{µ̃{µ̃{­̃„µ̃„µ̃{­̃{­̃Œ½̃¥Îç¥Îç­Î̃«Đë«Đë¥Îç«Đëµ̉âµ̉âÁÛ́¥ÎçÁÛ́«ĐëÁÛ́Î̃âÎ̃ï̃ç÷̉ặäéçâï÷âï÷âï÷âï÷÷ÿÿïï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷âï÷âï÷âï÷âï÷̃ç÷̃ç÷̃ç÷ÁÛ́ÁÛ́«Đëµ̉â¥ÎçœÆ̃˜ÁÖœÆçœÆçœÆç¥ÎçœÆ甽̃œÆç˜ÁÖŒ½ÖŒ½Ö”½̃Œ½̃Œ½̃„µ̃{µ̃{­Ö{µ̃s¥Ös¥Ös¥Ös­Ös¥Ö{­̃s¥Ös­Ös­Ös¥Ös¥Ös­Ö{­Ö{­̃{­Ö{­Ö{µ̃{­Ös­Ös­Ös­Ös­Ös­Ös¥Ös­Ö{­Ö{­̃s¥ÖŒµÖ„½̃Œ½Ö”½ç”½ç”½ç ̀âœÆçœÆç«Đëµ̉âµÖëÁÛ́µ̉âÁÛ́½ĐáÁÛ́Î̃âÁÛ́Î̃ïÎ̃âÎ̃ï̉ặäéç̃âç̃ç÷âï÷ï÷÷âï÷̃âçï÷÷âï÷ïï÷ïï÷ï÷÷âï÷ï÷÷âï÷âï÷ïï÷ï÷÷ïï÷ï÷÷âï÷ï÷÷âï÷âï÷äéçïï÷ïï÷ï÷÷s¥Ös­Ös­Ö{­Ös¥Ö{µ̃s­Ös­Ös­Ös¥Ös­Ö{­Ö{­Ös­Ös¥Ös¥Ös­Ös­Ös­Ös­Ö{­̃s­Ö{­̃s­Ös¥Ös­Ö{­̃s¥Ö{­Ös­Ö{­̃s¥Ös­Ös­Ös­Ö”½çÿÿÿÿÿÿÿÿÿÿÿÿ̉ặ”½̃s¥Ö„µ̃µÖëïï÷ÿÿÿÿÿÿÿÿÿïï÷{­̃s­Ö{­̃{µ̃{µ̃„µ̃ÁÛ́ÿÿÿÿÿÿ¥Îç{­̃Œ½̃„½̃ŒµÖœ½̃˜ÁÖœÆç¥Îç¥Îç¥ÎçœÆç¥Îç˜ÁÖ”½ç”½̃”½çŒ½Ö„µ̃Œµ̃Œ½̃Œµ̃Œ½̃Œ½̃„½̃„µ̃ŒµÖ{µ̃„­̃{µ̃Œµ̃{­̃{µ̃{­̃{µ̃{µ̃{­̃{­̃{­̃„µ̃s¥Ö{­̃„µ̃{­ÖŒµÖ„µ̃{µ̃{­Ös¥Ö{­̃Œ½̃”½çœÆç¥ÎçœÆçœÆç«Đë¥Îç«Đë«Đë«Đë«Đëµ̉âµ̉âµ̉âÁÛ́Î̃ï̉ặ̃âç̃ç÷̃ç÷âï÷äéçäéç÷ÿÿï÷÷ï÷÷âï÷ï÷÷ó÷ûï÷÷ïï÷ï÷÷ï÷÷ïï÷ï÷÷âï÷âï÷ïï÷âï÷äéçâï÷̉ặÎ̃ïÎ̃ï½Đáµ̉â«ĐëœÆç˜ÁÖ¥ÎçœÆçœÆç˜ÁÖœÆç˜ÁÖŒ½̃”½̃”½ç{µ̃ŒµÖŒ½̃ŒµÖ„µ̃„µ̃{µ̃s¥Ös¥Ös­Ös­Ös­Ös¥Ös¥Ö{­̃s¥Ö{­̃s­Ö{­̃s¥Ös¥Ös­Ö{µ̃s¥Ö{­Ö{µ̃{­Ös¥Ö{­Ö{µ̃{¥Î{µ̃s¥Ö{­̃„½̃s­ç{­̃{­̃s¥Ö„µ̃Œ½̃”½ç”½̃œÆç¥Îç¥Îç¥Îçµ̉âµ̉âÇÔâµÖë½ĐáÁÛ́Î̃ïÁÛ́ÎÖï̉ặ̉ặ̃ç÷Øëó̃âç̉ặâï÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷âï÷ï÷÷âï÷âï÷äéçïï÷̃ç÷âï÷âï÷âï÷ïï÷âï÷âï÷äéçïï÷äéçïï÷{¥Î{µ̃{­Îs¥Îs¥Î{­̃s­Ö{­̃s¥Ö„­Î{­̃{­̃s­Ö{­Ös¥Ös­Ö{µ̃{­̃{µ̃s­Ö{µ̃{­̃s­Ö{µ̃{­̃{µ̃s¥Ö{­̃s­Ö{µ̃s­Ö{­Ös¥Ös¥Ös­Ö{­ÖµÖëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„µ̃s­Ö{µ̃{­̃{­̃„µ̃{­̃ÁÛ́ÿÿÿÿÿÿ¥Î焵̃„½̃Œµ̃Œ½̃”½̃”½ç¥Îç¥Îç¥Îç¥ÎçœÆç¥ÎçœÆ甽̃˜ÁÖ”½̃Œ½̃Œ½̃„µ̃„µ̃Œµ̃„­̃Œ½̃Œ½̃Œ½ç„½̃{­Ö{µ̃s­ç{­̃{­̃{­̃„µ̃„µ̃{µ̃s­ç{µ̃Œ½̃{µ̃{µ̃„µ̃„µ̃„½̃{µ̃{­ÖŒ½̃{µ̃{­̃„µ̃„µ̃Œ½̃”½çœÆçœÆç¥Îç«Đë¥Îç«Đë«ĐëµÖëµ̉âµ̉âµ̉âµÖëµÖëÁÛ́Î̃ï̃ç÷̉ặ̃âçâï÷âï÷âï÷âï÷ïï÷ï÷÷ï÷÷âï÷ï÷÷ï÷÷́éñï÷÷ï÷÷äéçâï÷âï÷âï÷äéç̃ç÷̃âç̃ç÷̉ặÎ̃ïÁÛ́µ̉â«ĐëœÆç˜ÁÖœÆ̃œ½̃œÆ̃œÆç˜ÁÖ”½̃”½̃”½̃Œµ̃„µ̃„µ̃„µ̃„µ̃{µ̃{­Ö„µ̃{µ̃s­Ös¥Ö{µ̃s¥Ös­Ö{­̃s­Ö{­̃{µ̃{­Ös­Ö{­̃{­Ös­Ös¥Ö{­Îs­Ös¥Îs¥Ö{­̃{­Ö{­̃s­Ös¥Ös¥Ö{µ̃{µ̃{µ̃„µ̃{­̃{µ̃„µ̃„½̃{µ̃Œ½̃”½çœÆçœÆç¥Îç¥Îç«Đë¥Îç½ĐáµÖëÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̃âçÎ̃ï̉ặ̃âçäéçâï÷̃ç÷âï÷ïï÷âï÷âï÷âï÷âï÷ïï÷âï÷âï÷äéçâï÷âï÷âï÷âï÷âï÷ïï÷ï÷÷ï÷÷âï÷ïï÷́éñïï÷ï÷÷ï÷÷s­Ös¥Ö{­Ö{­̃s­Ö{­Ös¥Ös­Ös­Ös­Ö{µ̃s¥Ö{­Ös­Ös¥Ö{µ̃s­Ös¥Ö{µ̃s¥Ö{µÖ{­̃s¥Ös¥Ös¥Ös­Ö{­̃s­Ös¥Ös¥Ös­Ö{µÖ{µ̃s­Ös¥Ös­Ö{­̃µÖëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâï÷„µ̃s­Ös­Ö{­̃{µ̃s¥Ö{­̃{­ÖœÆ̃µÖë̉ặ ̀ℵ̃„µ̃Œ½̃”½̃˜ÁÖœÆ̃œ½̃­Î̃¥Îç¥Îç¥Îç¥Æ̃¥ÎçœÆçœÆ甽甽̃„½̃„½̃Œ½ÖŒ½̃Œ½̃„µ̃Œ½̃„µ̃„µ̃„µ̃{­̃„µ̃s¥Ö{­̃„µ̃{­̃„µ̃{µ̃{µ̃{µ̃{µ̃{­Ö{µ̃„µ̃Œµ̃„µ̃„µ̃{µ̃„­̃„µ̃„µ̃„µ̃Œ½̃Œ½̃œÆ眽̃¥ÎçœÆç¥Îç«Đë«ĐëÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖëµ̉â½ĐáÁÛ́Î̃ï̃âç̃âç̃âçïï÷âï÷âï÷ï÷÷âï÷ï÷÷ï÷÷âï÷âï÷ïï÷ïï÷äéçï÷÷ïï÷âï÷äéç̃ç÷̃âçâï÷̃ç÷̉ặÎ̃ï½ĐáÁÛ́µÖë¥Îç˜ÁÖœÆ甽̃”½çœ½̃Œ½̃”½̃Œµ̃”½ç„µ̃„µ̃Œ½̃”½̃„µ̃„µ̃Œµ̃„µ̃„µ̃{µ̃s¥Ös­Ös¥Ö{­̃{­Ö{­̃s¥Ö{­Ös­Ös­Ös¥Ö{­̃s¥Ös¥Ö{­̃{­Ös­Ös­Ö„­Îs¥Ös­Ös¥Ö{­̃s­Ö„µ̃„µ̃s­ç{­̃{µ̃{µ̃{µ̃{­̃„½̃„µ̃Œ½̃˜ÁÖ˜ÁÖœÆçœÆç¥Îç¥Îçµ̉âµÖëµ̉âÁÛ́ÇÔâÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặ̃âç̃ç÷̃âç̃ç÷̃âç̃âçâï÷âï÷âï÷âï÷ï÷÷âï÷ï÷÷̃ç÷âï÷ïï÷âï÷âï÷ïï÷âï÷âï÷ïï÷ï÷÷âï÷äéçâï÷ïï÷ï÷ïâï÷ïï÷{­̃s¥Ös¥Ö{­Ö{­̃{­Ös­Ös­Ös¥Ös­Ös­Ös¥Ö{­̃s¥Ös­Ö{­̃s¥Ös¥Ös¥Ö{­̃{­Ös­Ös­Ös¥Ö{­̃{µ̃s¥Ös­Ö{­Ö{­Ös­ç{­Ö{µ̃{µ̃{µ̃s­Ös¥Ö{µ̃{µ̃̉ặó÷ûÿÿÿÿÿÿÿÿÿÿÿÿâï÷«Đë{µ̃s­Ö{µ̃„µ̃{µ̃{­̃{­̃„µ̃„µ̃s­Ö„µ̃{µ̃„µ̃Œ½̃„µ̃Œ½̃”½̃œÆçœÆçœÆç¥Îç«Đë«Đë ̀â¥Î眽̃”½çœÆ甽̃Œµ̃„½̃„µ̃{µ̃Œµ̃”½̃„½̃„½̃„µ̃„µ̃{­̃„µ̃{­̃{µ̃{µ̃{µ̃{µ̃„½̃{µ̃s¥Ö{µ̃{µ̃{­̃„µ̃„µ̃{µ̃Œ½ç„µ̃„½̃ŒµÖ„­̃„½̃„µ̃„µ̃Œµ̃”½çœÆç¥Îç¥Î眽̃«Đë«Đëµ̉âÇÔâÁÛ́ÁÛ́ÁÛ́µÖëµÖëÁÛ́̉ặ̉ặ̃âçâï÷âï÷̃ç÷âï÷âï÷âï÷âï÷âï÷̃ç÷ïï÷̃âç̃âçïï÷âï÷äéçâï÷̃ç÷äéç̃ç÷âï÷Î̃ïÎ̃ïÁÛ́Î̃ïµ̉â«ĐëœÆ甽̃Œ½̃Œ½̃Œ½çŒµÖ„½̃{µ̃Œ½̃Œ½̃Œµ̃Œµ̃„­̃s­Ö„½̃„½̃{­Ö{µ̃„µ̃s­Ö{­̃s¥Ö{­̃s¥Ös­Ös¥Ös¥Ös¥Ös­Ö{­Ös¥Ös­Ös¥Ös¥Ös­Ö{­Ö{­̃s¥Îs­Ö{­Ös­Ös¥Ö{­̃{­̃{µ̃ŒµÖŒ½̃s¥Ö„µ̃{µ̃{­̃„µ̃s¥Ö„µ̃„µ̃Œ½̃”½̃œÆ̃œÆç¥Îç«Đëµ̉âµ̉âµÖëµÖëÎ̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặäéçØëó̃ç÷̃âç̃ç÷̃ç÷̃ç÷âï÷âï÷äéçäéçï÷÷âï÷äéçï÷÷ïï÷ï÷÷âï÷ïï÷âï÷âï÷ïï÷âï÷âï÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷ïï÷{­Ö{­Ös­Ös¥Ö{­Ös¥Ö{­Î{­̃{µ̃{­̃{µ̃{µ̃{­̃s­Ös­Ö{­̃{­̃{µ̃s­Ö{­Ös¥Ös¥Ö{­Ös­Ö{­̃s¥Ös¥Ös­Ös¥Ö{­̃s¥Ös­Ös­Ö{­̃{µ̃{­̃{µ̃s¥Ös­Ös­Ö{­̃s­çŒµ̃„µ̃{µ̃s­Ö{­̃„­̃s­Ö{­̃{­̃{µ̃{µ̃s¥Ö{­̃{­̃{­Ö{­ÖŒµ̃„µ̃„µ̃Œ½̃„µ̃˜ÁÖ”½̃¥ÎçœÆ̃œÆç«Đë¥ÎçœÆçœÆçœÆçœÆ̃”½̃Œµ̃Œ½̃„µ̃Œ½̃{­̃{µ̃”½̃Œµ̃„µ̃{­Ö{µ̃„µ̃„µ̃{µ̃{­̃{µ̃{µ̃{­̃{µÖ{­̃s¥Ö{­̃„µ̃„½̃„½̃Œ½̃„½̃„½̃Œ½ç„½̃{­Ö„µ̃Œ­Ö„µ̃Œ½ÖŒµ̃”½̃”½̃”½çœÆç¥Îç¥Îçµ̉âµ̉â½ĐáÁÛ́ÁÛ́µÖëµÖëÁÛ́ÁÛ́Î̃ï̃âç̃ç÷ïï÷âï÷âï÷́éñäéçâï÷̃ç÷̃ç÷̃ç÷̃âçâï÷̉ặ̃ç÷̃ç÷̃ç÷̃âç̃âç̃ç÷Î̃âÎ̃ï̉ặÁÛ́Î̃ïÁÛ́µ̉â«Đ뜽̃”½çŒ½̃„µ̃„µ̃Œ½̃Œ½̃Œ½ç„µ̃„µ̃Œµ̃{µ̃{µ̃{µ̃„µ̃{µ̃{µ̃s¥Ös­Ös­Ös¥Ö{­̃s­Ös¥Ös¥Ös­Ös¥Ös­Ös­Ös¥Ös­Ös­Ö{­̃s­Ö{­Ös¥Ö{¥Îs­Ös­Ö{­Ös­Ö„­Îs¥Ö{µ̃„µ̃{­̃{­Ö{µ̃{µ̃„µ̃„µ̃{­̃{µ̃„­̃Œ½̃„½̃”½̃”½̃Œµ̃œÆ̃œÆ̃¥Îçµ̉âµ̉â½ĐáÁÛ́ÁÛ́Î̃ïÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷̉ặâï÷äéç̃âçâï÷̉ặ̃âçâï÷̃âçâï÷âï÷ïï÷ï÷÷ïï÷äéçïï÷äéçâï÷âï÷ï÷÷âï÷âï÷âï÷ïï÷äéçï÷÷äéçïï÷s­Ös¥Ö{­Ö{­Î{¥Îs­Ös­Ö{­Îs¥Ös­Ö{­Ös¥Ö{µ̃s­Ö{µ̃s­Ös­Ös¥Ö{­̃s¥Ö{µ̃s¥Ö{µ̃s¥Ös¥Ö{­̃{¥Î{­̃s¥Ö{µ̃{­̃{­̃{­̃{µ̃{­̃{µ̃{­̃{­̃{­̃{­̃{µ̃{­̃{µ̃s­Ös­Ö{­̃{­Ö{µ̃s­Ö{­̃{µ̃s¥Ös¥Ö{µ̃{µ̃{­̃{­̃{­̃{µ̃„µ̃„½̃Œ½̃Œµ̃œÆçœÆçœÆç¥Îç¥Îç¥Îç«Đë¥ÎçœÆ̃”½̃¥Î甽猽֌µÖŒ½ÖŒ½̃ŒµÖ{­̃Œ½̃„µ̃„½̃„µ̃{µ̃„µ̃{µ̃{­̃s­Ö{µ̃„­̃{µ̃{µ̃s¥Ö„­Î{µ̃Œ½ç„½̃„½̃„µ̃”½̃Œ½̃Œ½Ö”½çŒ½̃{µ̃„µ̃Œ½̃Œ½̃Œ½̃”½̃˜ÁÖ˜ÁÖ”½ç¥Îç«Đë«Đëµ̉âÁÛ́ÇÔâÎÖïµ̉âµÖë½ĐáÁÛ́Î̃ï̃âç̃ç÷âï÷̃ç÷âï÷äéçâï÷Øëó̃âç̃ç÷âï÷̃ç÷̃âç̃âç̃âç̃ç÷̉ặâï÷̃âç̉ặ̃ç÷Î̃ïÁÛ́ÁÛ́Æäôµ̉â«Đë¥ÎçœÆ猽̃„½̃{µ̃Œ½̃Œ½ÖŒ½Ö{­̃„µ̃„µ̃„µ̃„µ̃ŒµÖŒ­Ö{µ̃{µÖ{µ̃{­̃s­Ös¥Ö{­̃s­Ö{­̃{­̃{­Ö{µÖ{µ̃{µ̃s¥Ös¥Ös¥Ös­Ös­Ös¥Î{­Îs­Ös­Ö{­Î„­Î{­̃{¥Î{­̃s¥Ö{­̃{­̃{µ̃{­̃{µ̃{­Ö„µ̃{­̃{µ̃{µ̃s­ÖŒµÖ„µ̃„µ̃”½̃”½̃Œ½ÖŒµ̃˜ÁÖµ̉â½Đáµ̉â½ĐáÎ̃ïÎ̃ïÎ̃âÎ̃ïÎ̃ï̃ç÷äéç̃ç÷̉ặ̃ç÷âï÷̃ç÷̃ç÷âï÷äéçâï÷ïï÷âï÷ïï÷âï÷ïï÷âï÷ïï÷äéçï÷÷âï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ï÷÷{­Î{­̃{­Ös¥Ö{­Î{­̃s­Ö{­Îs¥Ös­Ös­Ös¥Ö{µ̃{­Î{­̃s­Ös­Ö{µ̃{µ̃s­Ös­Ö{µ̃s¥Ö{­̃s¥ÖŒµÖ{µ̃s­Ös¥Ös­Ös­Ö{µ̃{µ̃{µ̃„µ̃{µ̃{µ̃{µ̃{µ̃Œ­Ö{­̃{µ̃{µ̃{µ̃s¥Ö{µ̃{­̃s­Ö{­̃{µ̃{­̃„­̃{µ̃{µ̃{­ÖŒ½̃ŒµÖ{­̃{µ̃Œ½̃„µ̃Œ½̃”µâœÆçœÆçœÆçœÆç¥Æ̃¥Îç¥Îç¥ÎçœÆ̃˜ÁÖ”½çœ½̃”½çŒ½̃Œ½̃Œ½Ö{µ̃”½çŒ½̃Œ½̃„µ̃”½̃{µ̃„µ̃”½çŒ­Ö{­̃{­̃{­̃{µ̃{µ̃{­̃Œ­Ö{­ÎŒ½ÖŒ½çŒ½̃„­̃„½̃{­̃”½çŒ½̃Œ½̃Œ½̃Œ½ç„½̃„µ̃”½̃”½̃”½̃œÆçœÆç¥Îç«Đë«Đëµ̉âÁÛ́ÔÛ̃ÁÛ́ÁÛ́ÁÛ́½ĐáÎ̃ïÎ̃ïäéç̃ç÷âï÷âï÷âï÷äéç̃ç÷âï÷ïï÷ÔÛ̃ÔÛ̃̃ç÷̃ç÷̉ặÎ̃ïÎ̃ïÎÖïÁÛ́ÁÛ́Î̃ïÎ̃ïÁÛ́ÁÛ́ÁÛ́½Đá¥Îçµ̉âœÆ猽֔½̃„µ̃{­̃{µ̃Œ½̃ŒµÖ{µ̃„½̃Œ½̃„­̃{­Ö{­̃{­̃{µ̃s¥Ö{µ̃{µ̃{­̃{µ̃{µ̃{­Îs­Ö{­̃s¥Ös¥Ö{­̃{­̃{­̃s­Ös­Ös­Ös­Ös¥Ös­Ös­Ö{­̃{­̃{µ̃{µ̃s­Ös­Ö{­̃„½̃{­̃”½̃{­̃„­̃{µ̃{­̃{µ̃s¥Ös­Ö{­̃Œ½̃„½̃„½̃”½̃”½̃œÆ猽̃Œ½ÖœÆç«Đëµ̉â½ĐáÇÔâÎ̃ïÁÛ́Î̃ï̉ặÎ̃ï̉ặÎ̃ï̃ç÷̃ç÷âï÷̃ç÷̃ç÷Úàáâï÷âï÷âï÷âï÷ï÷÷ïï÷ï÷÷ïï÷́éñïï÷âï÷ï÷÷âï÷ï÷÷̃ç÷âï÷ïï÷ïï÷ïï÷ïï÷ï÷÷{­̃s­Ös¥Ös¥Ös­Ö{­̃s¥Ös¥Ös¥Ö{­̃s¥Ös¥Ös­Ös­Ös­Ös¥Ös­Ö{­Îs¥Ös¥Ö{µ̃{­Îs­ç{­̃{µ̃s­Ö{­̃s¥Ö{µ̃{­̃{µ̃s­Ö{µ̃{­̃{­Ö{µ̃{­̃{­Ö{­̃Œ­Ös­Ö{µ̃{µ̃s¥Ös­Ö{­̃{µ̃{­̃{­̃{­̃{­̃„µ̃{­̃{­̃{­̃s­Ö{µ̃{­̃”½çŒµ̃{­̃Œµ̃”½ç”½ç˜ÁÖœÆ̃œÆç«Đë«Đë¥ÎçœÆçœÆ甽̃œÆ甽̃”½̃Œ½̃Œ½̃„½̃”½çŒµÖ{µ̃„½̃„µ̃„µ̃„µ̃{­̃s­Ö{µ̃„­Î{µ̃s¥Ö{­̃„µ̃{µ̃Œ½Ö{­̃Œ½̃„½̃Œ½ç„½̃{µ̃Œµ̃Œ½Ö{­̃{µ̃{­̃Œ½̃„µ̃Œ½̃Œ½̃”½̃˜ÁÖœ½̃¥Îç¥Îç«Đë«ĐëÁÛ́µ̉âÁÛ́ÁÛ́ÁÛ́ÇÔâÁÛ́Î̃ïÎ̃ï̉ặäéç̃ç÷âï÷âï÷äéçâï÷̃âç̃ç÷Î̃ï̃ç÷̉ặÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïµÖëÁÛ́Î̃ïÁÛ́ÁÛ́Î̃âµ̉âµ̉â¥ÎçœÆçœÆ甽猽ç{µ̃„µ̃{µ̃{­̃{­Ö{­Ö{µ̃„­̃{µÖ„½̃{­̃{­̃{­̃{­̃s¥Ös¥Ö{­Ös­Ö{µ̃s¥Ös­Ö{­̃s¥Ös¥Ös¥Ös­çs¥Ö{µ̃{­̃s­Ös¥Ö{­̃{­Î{µ̃sœÎ{µ̃{­Î{µ̃s­Ö„­̃{­̃s¥Ö{­̃{­̃Œ½ç{­̃„µ̃{µ̃„µ̃s¥Ö{µ̃{µ̃{µ̃Œ½Ö„µ̃”½ç”½ç”½̃Œ½̃”½̃”½çœÆç«ĐëÁÛ́½ĐáµÖëÁÛ́Î̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ï̃âç̃âçÎ̃ïÎ̃ẫç÷âï÷âï÷ïï÷ïï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ïï÷âï÷ïï÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷âï÷âï÷ï÷÷ï÷÷s­Ö{¥Îs¥Ös­Ös¥Ös­Ö{­Ö{­̃{­Ö{­̃s¥Ös¥Ös¥Ö{­̃s­Ös¥Ös¥Ö{µ̃s­Ö{µ̃s¥Ö{­̃s­Ö{µ̃{­̃s¥Ö{µ̃„­̃{µ̃{­Ös¥Ös¥Ö{µ̃{­̃s¥Ö{­̃„µ̃{­̃s­Ö{­̃{µ̃„½̃{­̃„µ̃{µ̃s¥Ö{µ̃s¥Ö{µ̃s¥Ö{µ̃s¥Ö{µ̃„­̃{µ̃s¥Ö{­̃Œ½Ö„½̃„µ̃”½çŒ½̃”½̃˜ÁÖ¥Îç¥Îç ̀â¥Îç«Đë¥Îç¥ÎçœÆçœÆçœÆç˜ÁÖ”½çŒ½̃„µ̃{µ̃Œ½̃Œ½ÖŒ½̃„½̃„µ̃Œ½̃{µ̃{µ̃{­̃{­̃{­̃{µ̃„­Î{­̃{µ̃„­̃{­̃”½ç„µ̃{µ̃„½̃„µ̃„µ̃ŒµÖ{µ̃{µ̃{µ̃Œ½̃„µ̃Œµ̃„µ̃Œ½çŒµ̃”½̃œÆ̃œÆç¥Îç«Đë«Đë«ĐëÁÛ́µÖëÆäôÁÛ́ÇÔâµÖëÁÛ́Î̃ẫç÷âï÷âï÷̃ç÷äéçäéç̉ặ̃ç÷Î̃âÎ̃ïÁÛ́̃âçÁÛ́ÁÛ́ÇÔâÁÛ́µÖëÁÛ́ÁÛ́ÁÛ́ÁÛ́µÖë½Đáµ̉â¥Îç¥ÎçœÆ̃”½çŒ½̃„µ̃{µ̃„µ̃„­ÎŒ½Ö{µ̃s¥Ö{µ̃{­̃{µ̃{­̃{­̃{µ̃{­̃s¥Ö{µ̃s¥Ös¥Ös­Ös¥Ö{µ̃s¥Ö{µ̃s¥Ö{­Ö{­̃s¥Ö„­̃{­̃{­Ös¥Ös­Ös­Ös­Ös­Ö{¥Î{­Ö{µ̃s¥Ö{µ̃s­Ös­Ös­Ö{­̃{­̃{µ̃„µ̃{­̃{­̃{­̃{µ̃{µ̃{­̃„½̃„½̃„µ̃Œµ̃Œµ̃„µ̃”½̃”½çœÆç¥Îç«ĐëµÖëµ̉âÇÔâÁÛ́ÁÛ́̉ặ̃ç÷Î̃ïÎ̃ï̉ặÎ̃âÎ̃ïÎ̃ï̉ặ̃ç÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷âï÷ïï÷ï÷÷s­Ös­Ö{­Ös¥Ös¥Ös­Ö{µ̃{­̃s­Ös­ç{µÖ{­Ös¥Ö{­Ö{­Ö{­̃{­̃{µ̃{­̃s­Ö{­Ö{µ̃s¥Ö{­̃s¥Ö{µ̃s¥Ö{­Ös­Ö{­̃{­̃s¥Ö{µ̃{­̃{­̃{µ̃s­ç„µ̃{µ̃„µ̃{­̃{µ̃s¥Ö{µ̃s¥Ö{­̃s¥Ö{­̃{µ̃s¥Ö{µ̃{µ̃{µ̃{­̃{µ̃{µ̃„µ̃„µ̃{µ̃Œ½̃Œµ̃”½ç”½̃œÆçœÆçœÆç¥Îç ̀â¥Îç¥ÎçœÆç˜ÁÖœÆ甽甽̃”½̃Œ½çŒ½̃Œ½Ö„µ̃„µ̃„½̃„½̃„µ̃„µ̃{µ̃{­Ö{µ̃{­̃{­̃{µ̃{µ̃{­̃{µ̃„µ̃„µ̃Œµ̃„µ̃{µ̃{­̃„µ̃„µ̃Œµ̃„µ̃Œ½̃„µ̃Œµ̃Œ½̃”½̃Œµ̃Œµ̃”½çœÆ甽çœÆçœÆç«Đë¥ÎçµÖëµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ï̃âçâï÷̃âç̃ç÷̃ç÷̃âç̃ç÷Î̃ïÎÖïµÖëÁÛ́ÁÛ́ÁÛ́ÇÔâµÖëµÖëµÖë«Đëµ̉âµ̉âµ̉âµ̉â«ĐëœÆç¥Î眽̃”½̃Œµ̃„½̃„½Ö„µ̃„­̃{µ̃{­̃„µ̃{µ̃{µ̃{µ̃{µ̃{µ̃{­̃{µ̃{µ̃s­Ös¥Ös¥Ö{­Ös¥Ös¥Ös­Ö{­Ö{­̃s¥Ö{­Ös¥Ö{µ̃{µ̃{­̃s¥Ö{­̃s­Ös¥Ös¥Ös­Ös¥Ö{µ̃s­Ös¥Ö{­̃s­Ös­Ö{­̃{­̃{µÖ{µ̃„µ̃{­̃„µ̃{µ̃„µ̃{µ̃„µ̃„µ̃„µ̃„µ̃Œ½̃Œ½̃„µ̃”½̃–·ÖœÆ̃œ½̃«ĐëµÖëÁÛ́½ĐáÁÛ́ÁÛ́ÎÖïÎ̃ï̉ặÎ̃ï̉ặ̉ặÎ̃ïÎ̃ï̃âçâï÷âï÷ïï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ïï÷ïï÷âï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷s­Ös­Ös­Ös­Ös¥Ö{­Ö{­Ös­Ö{µ̃s¥Ö{µ̃s¥Ö{­̃{µ̃{­Ös­Ös¥Ös¥Ös¥Ös¥Ös¥Ö{­̃{­̃„µ̃s¥Ö{µ̃„­̃{­̃{µ̃{µÖ{­̃{­̃{­Ö{µÖ„µ̃{­̃{µ̃„µ̃{µ̃{­̃s­ç{µ̃{µ̃{­̃s­ç{µÖ{µ̃{µ̃s­Ö„µ̃s¥Ö{­̃„µ̃{µ̃„µ̃{­̃{µ̃{­̃„µ̃„µ̃Œ½̃„½̃”½̃œÆ̃œÆçœÆç«Đë¥Îç¥Îç¥ÎçœÆçœÆ甽̃”½̃”½̃Œ½̃Œ½̃Œµ̃Œ½çŒ½̃{µ̃„µ̃Œ½Ö„µ̃„µ̃{µÖ{µ̃{µ̃{µ̃{­̃„½̃s­ç{µ̃{­̃{µ̃{­̃„µ̃Œ½ç„µ̃„½̃{µ̃„µ̃{­Ö„µ̃„½̃„½̃„½̃Œ½̃Œ½̃Œ½̃”½ç”½̃œÆç˜ÁÖœÆç¥Îç ̀â«Đëµ̉â«Đëµ̉âÁÛ́ÁÛ́Î̃ïÎ̃ïÎÖïÎÖïÎ̃ïâï÷̃ç÷̃âç̃ç÷̉ặ̉ặÎ̃ïÎ̃âÁÛ́ÁÛ́µ̉âµ̉âµ̉â«Đë¥Îç¥Îç¥Îç¥Îçµ̉â«Đë¥Îç¥Î眽̃œÆ甽甽̃„½̃Œµ̃„µ̃{µ̃{µ̃Œ½Ö„µ̃{­̃Œ½ç„µ̃{µ̃„­̃„µ̃{µ̃s¥Ös¥Ö{­̃{­̃s­Ö{­̃{­̃{µ̃s¥Ö{­̃{­Ös¥Ös¥Ö{­Ö{µ̃s¥Ös­Ös­Ö{­̃s­Ö{­Ös­Ös­Ös­Ös¥Ö{­Ö{µÖs­Ö{­̃s¥Ös­Ös¥Ös¥Ö{­̃{­̃{­̃{µ̃{µ̃{µ̃{µ̃„µ̃Œ½̃„µ̃Œµ̃Œµ̃”½̃”½̃”½̃œÆ碿Ԡ̀â¥Îç«Đëµ̉âµÖëÁÛ́ÁÛ́Î̃ï̉ặ̉ặ̉ặ̉ặÎ̃ïÎ̃ïÎ̃ï̃âçâï÷ïï÷ï÷÷ó÷ûï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷âï÷äéçäéçï÷÷ï÷÷ïï÷ï÷÷ïï÷s­Ö{­Ös¥Ös­Ö{­Ös­Ös¥Îs­Ös¥Ös¥Ö{­Ös­Ö{­Ö{­̃s­Ös­Ö{µ̃s¥Ös­Ös¥Ö{­̃s¥Ös­ç{µ̃{­Ö{µ̃s¥Ös¥Ös­Ös­Ö{­̃{µ̃{µ̃Œ­Ö„µ̃„µ̃{µ̃„µ̃s¥ÖŒµ̃{µ̃{µ̃„µ̃„µ̃„µ̃{­Ös¥Ö{­̃{­̃{­̃„­̃„µ̃{µ̃s¥Ö{µ̃{µ̃„­Îs¥Ö„µ̃„µ̃Œ½̃Œ½̃˜ÁÖ˜ÁÖ ̀â¥ÎçœÆçœÆç¥ÎçœÆçœÆ̃˜ÁÖ”½ç”½̃Œ½̃„µ̃Œ½̃„µ̃{µ̃Œ½ÖŒ½̃„½̃{­Ö„µ̃{µÖ{µ̃{µÖs­Ö„µ̃{µ̃{­Ö{­̃{µ̃{­̃{µ̃„µ̃{­̃„½̃„µ̃„­̃{µ̃„µ̃{µ̃{­Ö„µ̃Œµ̃Œ½̃Œ½̃Œµ̃”½çŒ½̃”½̃”½ç”½çœÆ̃˜ÁÖ¥Îç¥Îç«Đëµ̉âÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ïÁÛ́Î̃ï̉ặ̃âçäéç̃ç÷̉ặ̉ặÁÛ́ÁÛ́½Đá«Đë¥Îç¥Îç¥Îç«Đë¥Æ̃¥Îç¥Æ̃¥Îç¥Æ̃œÆçœÆç¥ÎçœÆ̃œÆ甽甽猵̃Œ½Ö„µ̃{µ̃{µ̃{­̃{­Ö„­̃{µ̃s¥Ö„µ̃„­̃{µ̃{µ̃s­Ös¥Ös­Ös­Ös­Ö{­Ös¥Ö{­̃{­Ö{­Ö{­̃s¥Ö{­Ö{­̃{­̃s­Ö„­Î{­Ös­Ös¥Ös­Ös¥Ös¥Ös­Ös­Ös­Ös¥Ös­Ö{­̃s­Ö{­̃s­Ös­Ös­Ö„µ̃{­̃„µ̃{µ̃{­̃„µ̃„µ̃s¥Ö„µ̃„½̃„½̃”½ç”½̃”½ç”½̃”½̃˜ÁÖ˜ÁÖ¥Îç¥Îç«Đëµ̉âµ̉âÁÛ́Î̃ïÎ̃ï̉ặ̉ặÎ̃ï̉ặÎ̃ï̃âçâï÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ïï÷s­Ö{µ̃s­Ö{­Îs¥Ös¥Ö{­Î{µ̃{­Ö{µ̃s¥Ös¥Ö{­̃{µ̃{­̃{µ̃s¥Ös¥Ö{­̃s¥Ös¥Ös¥Ös­Ös¥Ö{­̃{µ̃{µÖ{µ̃s¥Ö{µ̃„µ̃{µ̃{­Ös­Ö{µ̃{­̃{µ̃{­̃{­̃„µ̃{­̃{­Ö„µ̃{­̃{µ̃{µ̃s­Ö„µ̃{µ̃„­Î{­Ö{µ̃{­̃{µ̃{­̃s­Ö{µ̃ŒµÖ„µ̃„½̃„½̃Œ½̃Œ½̃˜ÁÖœÆç¥ÎçœÆç¥Îç ̀â¥ÎçœÆ̃”½çŒ½̃Œ½̃Œ½̃„µ̃„½̃„½̃Œ½ç{­̃Œ½ç„­̃{µ̃{µ̃{µ̃{µ̃{­Ö{µ̃s­ç{­Ö{µ̃{µ̃„µ̃{µÖ„µ̃{µ̃„µ̃„µ̃„µ̃{­Ö{­Ö{µ̃{­Ö„µ̃{­̃„µ̃„µ̃Œµ̃”½ç”½̃”½çŒµÖ”½ç”½̃œÆçœÆ̃¥Îç¥Îçµ̉âµ̉âÁÛ́ÁÛ́ÇÔâÁÛ́ÇÔâÎ̃ïÎ̃ï̉ặ̃ç÷̃âç̃ç÷̉ặ̉ặÎ̃ïµÖë«ĐëœÆç¥Îç ̀âœÆç¥ÎçœÆçœÆ甽ç˜ÁÖœÆ̃”½̃œÆç˜ÁÖ”½̃”½̃”½ç{µ̃„­̃„µ̃{­Ö„½̃Œ½̃Œ­Ö„µ̃{µ̃{µ̃{­Ö{­̃„­̃{µÖs­Ö{­Ö{­̃{­̃s­Ö{­Ö{µ̃{­̃{µ̃{­Ös¥Ös¥Ös­Ös¥Ö{µ̃{­̃s¥Ö{¥Îs­Ös¥Ös­Ös­Ö{­̃s¥Ö{­Î{µ̃s¥Ös­Ös­Ös¥Ös­Ö{­̃{­̃s­Ö{­̃{­̃{­Ö{µ̃„­̃{µÖ{µ̃{­̃”½ç{µ̃{­̃Œ½̃”½̃”½̃”½ç”½̃˜ÁÖ˜ÁÖœÆçœÆç ̀â¥Îçµ̉âµ̉âÁÛ́Î̃âÎ̃ẩặ̃ç÷̃ç÷̃ç÷̉ặ̃âçïï÷ïï÷ï÷÷ï÷÷ï÷÷÷ÿÿï÷÷ï÷÷âï÷ï÷÷äéçïï÷ï÷÷ï÷÷ï÷÷âï÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷ïï÷ï÷÷{¥Î{­Î{­̃{­Ös¥Ös­Ös­Ös­Ös­Ös¥Ö{­̃s­Ös¥Ö{­̃s¥Î{­Ö{­̃s¥Ös¥Ös­Ös¥Ö{­Ös­Ö{­̃{­̃{µ̃{­̃s¥Ö{­̃{µ̃{­Ö{µ̃{µ̃„­̃Œ­Ö„µ̃{­Ö{µ̃{µ̃{µ̃Œ­Ö{­Ös¥Ö{µÖ{­̃„­̃{µ̃„­Î{µ̃„­Îs­Ö{µ̃{µ̃{µ̃{­Ö{µ̃Œ½̃„µ̃„½̃„½̃„µ̃Œµ̃Œ½̃˜ÁÖ¥Îç˜ÁÖœ½̃¥ÎçœÆçœÆ̃œÆ猽̃Œ½̃Œ½̃{­̃ŒµÖ„½̃„µ̃{µ̃{­ÖŒ½Ö{µ̃{µ̃{µ̃{­̃s­Ös¥Ö{­̃{µ̃{­̃{µ̃{µ̃{µ̃{­Ö{­̃s­Ö{µ̃{­Ös­Ö„­̃s­ÖŒµÖ„½̃„½ÖŒ½Ö{­̃Œ½̃Œµ̃ŒµÖ”½̃Œµ̃˜ÁÖŒ½Ö”½̃˜ÁÖœÆ̃œ½̃¥Îç«Đëµ̉â«Đë½ĐáÁÛ́ÁÛ́Î̃âÁÛ́ÎÖïÎ̃ï̃ç÷âï÷̃ç÷Î̃ïÎ̃ïÎ̃ïÇÔâ¥ÎçœÆç˜ÁÖ–·Ö˜ÁÖœÆ̃”½̃œÆ̃˜ÁÖœÆ甽̃Œ½̃”½ç”½ç”½̃Œ½̃”½çŒ½̃{­̃{µ̃{­Ö„­̃„½̃Œ½̃„½̃Œ½̃”½ç{µ̃„­Î{µ̃s¥Ö{­Ö{­̃{­̃s¥Ö{µ̃s¥Ös­Ö{­̃s¥Ö{µ̃s­Ö{­Ös¥Ö{µ̃s¥Ö{­̃{­̃s­Ös¥Ös­Ös¥Îs­Ös¥Ös¥Ös­Ös­ÖsœÎ{­Îs¥Ös¥Ös­Ö„­Î{µ̃{µ̃s¥Ös¥Ös¥Ö{µ̃{­̃s­Ös¥Ö„­Îs­Ö{­̃„µ̃”½̃”½ç”½̃”½çœÆçœÆ̃¥ÆÖœÆ̃”½ç ̀â­Î̃µ̉âµ̉âÁÛ́ÁÛ́Î̃ï̃ç÷̃âçâï÷̃ç÷âï÷âï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷âï÷ïï÷âï÷ï÷÷äéçïï÷âï÷ïï÷ïï÷ï÷÷ïï÷äéçï÷÷ïï÷ï÷÷ïï÷{­Îs­Ö{­̃„µ̃s­Ös­Ös¥Ö{­Îs¥Ös¥Ös­Ös­Ö{­̃{µ̃s¥Ö{¥Îs¥Ö{­̃{µ̃{µ̃{­Ö{µ̃s­Ös­Ö{­̃{µ̃s­Ö{­̃„µ̃„½̃s¥Ö{­̃Œ½̃{­Ös¥ÖŒµÖŒµÖ„µ̃{µ̃{µ̃{µ̃{­̃{­̃„­Î{µ̃{µÖ{µ̃Œ½Ö{µ̃s­Ö{µ̃{­̃s¥Ö{µ̃„½̃Œ½̃{­̃Œµ̃Œ½̃„µ̃Œ½̃Œ½̃”½̃”½̃œÆçœÆ眽̃ ̀âœÆçœÆ甽̃Œ½̃”½ç{µ̃Œµ̃Œ½ç„µ̃Œ½ç{­Ös­Ö{­̃{µ̃„­̃{µ̃{µ̃„µ̃{­̃s­Ö{µ̃s¥Ö{µ̃s¥Ö{µ̃s­Ö{µ̃s­Ös¥Ös­Ös¥Ö{µ̃{­ÖŒ½̃{µ̃Œ½̃{­̃{µ̃Œ½̃„½̃Œ½ÖŒ½ÖŒµÖ”½̃˜ÁÖ˜ÁÖœÆç¥ÆÖœÆ̃¥Îçµ̉â¥Îçµ̉âÁÛ́ÁÛ́Î̃âÁÛ́Î̃ïÎ̃ïÎÖï̃ç÷̃ç÷Î̃ï̉ặÎ̃ïÁÛ́µ̉âµ̉â­Î̃Œ½̃˜ÁÖ”½̃”½̃”½ç˜ÁÖ”½ç”½çŒ½̃”½ç”½ç”½̃Œµ̃”½ç{­̃ŒµÖ{­̃{­̃{­̃{µÖŒµÖŒ½̃{µ̃Œ½Ö{µ̃{µ̃{µ̃s¥Ö{­̃s¥Ös­Ös­Ös¥Ös¥Ö{­̃{µ̃s­Ö{µ̃s¥Ö{­̃s­Ös¥Ös­Ö{­Ö{­Ö{­Ös­ÖsœÎs¥Ö{­̃s­Ös¥Îs­Ös¥Ö{µ̃{­Îs¥Îs¥Ös­Ös­Ö{­Ös¥Ö{­Ö{­̃s¥Ös­Ö{µ̃s­Ös­Ö{­̃{­̃{µ̃Œ­ÖŒµ̃”½ç”½̃Œ½̃”µâ˜ÁÖ¥Îç­Î̃¥Îç ̀â¥Îç¥Îç¥ÎçÁÛ́ÁÛ́ÎÖïÎ̃ïâï÷âï÷̃ç÷ï÷÷ïï÷ï÷÷ïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ï÷÷Úàáï÷÷âï÷âï÷ï÷÷ï÷÷âï÷ïï÷ïï÷âï÷ïï÷äéçâï÷ïï÷ï÷÷ï÷÷{µ̃s­Ö{µ̃{­̃s¥Î{¥Î{­ÖsœÎs¥Ö{¥Îs¥Ös¥Ös­Ö{­Ös¥Ö{µ̃s­Ös­Ös¥Ö{­Ös¥Ös¥Ös­Ö{­̃{­̃s­Ö{­̃„­̃{­̃„µ̃Œ½̃{µ̃{µ̃Œ½̃Œ½̃Œµ̃„µ̃Œ½̃Œ½̃{µ̃Œ­Ö{µ̃Œµ̃{­̃„µ̃„µ̃{­ÖŒµÖ{­̃s­Ö{µ̃{µ̃{µ̃„µ̃„½̃Œ­Ö{µ̃Œ½̃{µ̃ŒµÖ„µ̃”½̃”½̃œÆç¥Îç˜ÁÖœÆ̃¥ÎçœÆçœÆ猽̃Œ½ÖŒ­Ö{­̃„½̃{µ̃„µ̃„µ̃{­Ö{­̃{­̃s­Ö{µ̃s¥Ö{µ̃{µ̃{­̃{µ̃s­ç{µ̃{­Ö{µ̃s¥Ös­Ös¥Ö{­̃{µ̃„­Î„½̃{­Ö{µ̃Œµ̃„µ̃Œ½̃”½çŒ½̃„½̃Œ½̃{­̃Œ½̃„µ̃Œµ̃”½ç˜ÁÖœÆ̃˜ÁÖœÆ眽̃¥Îçµ̉âµ̉â½Đáµ̉â½ĐáÁÛ́Î̃ïÎ̃ïÎ̃ï̃ç÷̃ç÷̃ç÷̃ç÷Î̃ïÎ̃ïµ̉â½Đá¥Îç˜ÁÖ”½̃”½̃”½̃œÆ甽̃”½̃Œ½̃Œ½̃Œµ̃”½̃„½̃ŒµÖŒµ̃{µ̃{­̃{µ̃{­̃„­̃{µ̃{µ̃„µ̃ŒµÖŒ½̃{µ̃{µ̃„µ̃{µ̃{­̃{­̃{­ÖŒ­Ös­çs­Ös¥Ös­Ö{­̃s­Ö{¥Î{­̃s¥Ös¥Ö{­Ö{µ̃{µ̃{­Ö{­̃{­Ö{µ̃s­Ös­Ö{µÖ{­̃{­Îs¥Ö{µ̃{­̃{­Ö{­Ö{­Ös¥Ös­Ö{­̃s­Ö{µ̃s¥Ös­Ö„­̃{­̃s­Ö{­̃s¥Îs­ÖŒ½̃”½̃”½̃”½̃Œ½̃œÆ̃¥Îçµ̉â¥Îç¥Îç¥Îç¥Îçµ̉â½Đáµ̉âÎÖï̃ç÷̃ç÷̃ç÷âï÷ï÷÷âï÷äéçïï÷ïï÷ï÷÷ï÷÷ï÷÷ïï÷ïï÷ïï÷ï÷÷âï÷âï÷âï÷ïï÷âï÷̃ç÷ïï÷ïï÷âï÷âï÷ïï÷ï÷÷ï÷÷ïï÷s¥Ös­Ös¥Ös¥Ös­Ö„­̃{­̃{­Ö{µ̃s¥Ös¥Ös­Ö{­̃s¥Ös­Ö{­̃{­̃{­̃{­̃s¥Ös¥Ös¥Ös­Ö{µ̃{­̃s¥Ö{­̃„µ̃„µ̃„­̃„½̃„½̃ŒµÖŒ½̃{µ̃Œ½̃Œ½̃„µ̃Œ½Ö„µ̃ŒµÖ{µ̃Œ½̃„µ̃Œµ̃{µ̃{­̃{­̃Œµ̃{µ̃{µ̃„µ̃{µ̃{­̃{­ÖŒµÖ{­Ö”½ç„µ̃Œ½̃Œµ̃”½̃”½ç”½çœÆçœÆ̃œÆ眽̃œÆ̃”½çŒµ̃„µ̃{­̃{µ̃{­̃{µ̃{­̃„­̃„­̃{­Ö{­̃{µ̃{µ̃{µÖ{µ̃{­̃{­̃s¥Ö{­̃s­Ös¥Ö{µ̃s¥Ö{­̃s¥Ös­ç{­̃{­̃s¥Ö„­̃{µ̃„µ̃Œ½̃Œ½ÖŒ½çŒµÖ{­̃„½̃Œ½̃„µ̃”½̃Œ½ç”½̃œÆçœÆ̃œÆç ̀â¥Îç«Đë¥ÎçÁÛ́µ̉âµ̉âµÖëÁÛ́Î̃ïÎ̃ïÎ̃ï̃âç̃âç̃ç÷̉ặÎ̃ïÎ̃ïµÖëµ̉â¥ÎçœÆ̃”½ç”½̃Œ½̃”½̃Œµ̃”½ç”½çŒ½̃Œµ̃”½çŒµ̃Œ½̃Œ½ç„½̃{­̃s­Ö{­̃s¥Ö{­Ö{µ̃{µ̃{µ̃s¥Ö{­Ö{­̃{­̃{­̃s­Ö{­̃s­Ö{­̃s­Ös­Ös¥Ös¥Ös¥Ös­Ös¥Ö{­̃{­̃s­Ös­Ö{­Ös­Ö{­̃{µ̃{­Ö{­Ös­Ö{µ̃s­Ö{­Ös¥Ös­Ös­Ös¥Ös­Ös­Ös¥Ös­Ös¥Ö„­Î{­̃{­̃{µ̃s¥Ös¥Ös­Ö{­̃{­̃s¥Ö{µ̃{­̃{­̃„½̃”½̃”½̃˜ÁÖœÆç¥Îçµ̉â«Đëµ̉â«ĐëµÖëµÖëÁÛ́̉ặ̉ặâï÷̃ç÷äéçâï÷ïï÷ïï÷ïï÷ïï÷ï÷÷ïï÷ï÷÷ï÷÷âï÷âï÷âï÷âï÷ïï÷âï÷âï÷âï÷ï÷÷âï÷âï÷ï÷÷ïï÷ïï÷âï÷ï÷÷ïï÷s¥Î{­̃{µÖ{­Î{­Ös¥Ö{­̃s­Ö{­Ös­Ös¥Ös¥Ös¥Ös­Ös¥Ö{­̃s¥Ö{­Ös­Ö{­̃{­Ö{­̃{µ̃{µ̃{­Ö{µ̃s­Ö„µ̃„µ̃„µ̃„µ̃Œ½̃Œ½̃Œ½çŒ½̃Œ½̃”½̃”½̃”½çŒ½Ö”µâŒµÖŒ½çŒ½̃„µ̃{­Ö{µ̃{µ̃{µ̃„µ̃s­ç„µ̃{µ̃{­̃„­̃{µ̃ŒµÖ„µ̃„µ̃Œ½̃ŒµÖ”½çœÆçœÆçœÆçœÆçœÆçœÆ̃œÆ甽̃Œ½̃„µ̃{µ̃{µ̃„­Î{µ̃{µÖ„µ̃s¥Ö„½̃„µ̃„­̃{­̃{µ̃{µ̃s¥Ö{µ̃s­Ös­Ö{µ̃s­Ös­Ö{­̃{µ̃s­Ös¥Ös­Ö{µ̃{µ̃{­̃„µ̃„­̃„µ̃„½̃„µ̃„µ̃„µ̃Œ½̃„½̃Œ½̃Œ½̃Œ½̃”½ç”½̃œÆçœÆ̃ ̀â­ÅÓ«Đë«Đëµ̉âµÖëÇÔâµÖëÇÔâÎ̃ïÎ̃ïÎ̃ï̉ặ̉ặ̉ặÎ̃ïÎ̃ïÁÛ́µ̉â«Đ딽̃Œ½̃Œµ̃Œµ̃Œ½̃„µ̃”½̃–·Ö”½̃”½̃œÆ猽̃”½̃Œ½̃„½̃„µ̃„µ̃s­Ös¥Ös­Ö{­Ö{­̃s­Ö{­̃{­̃{µ̃{­Ös¥Ös¥Ös¥Ös¥Ö{­Ös¥Ö{­̃{­̃{­̃s¥Ö{­̃s¥Ö{­̃{­̃{­Ö{­Ös¥Ös¥Ö{µÖs­Ö{­̃s­Ö{­Ö{µ̃s­Ös­Ös­Ös­Ö{­Ös¥Ö{­Î{µ̃s­Ös­Ös­Ös¥Ös­Ös¥Ös¥Ö{­̃s­Ö{­Ös¥Ö{µ̃s­Ös¥Ös¥Ö{­̃„­ÎŒ½̃”½̃˜ÁÖ¥Îç¥Îç«Đëµ̉âµ̉âµÖëµ̉âµ̉âµÖëÁÛ́̉ặ̃âç̃ç÷äéçâï÷âï÷âï÷̃âçïï÷ï÷÷ïï÷ï÷÷ï÷÷âï÷âï÷äéçäéçïï÷âï÷âï÷äéçâï÷ï÷÷ïï÷̃ç÷âï÷âï÷äéçâï÷ïï÷âï÷s¥Îs­Ös­Ös­Ö{­Ös¥Ö{­Ö{µ̃s­Ös­Ö{­Ös¥Ö{­̃s­Ö{­̃s­Ös­Ös­Ö{­̃s­Ös¥Ö{­Ö{µ̃{­̃{µ̃„µ̃„µ̃„µ̃„µ̃Œµ̃„½̃„­̃„µ̃”½ç”½̃Œ½̃”½ç”½̃Œµ̃”½̃”½̃œÆ眽̃”½ç„½̃„µ̃{­Ö{µ̃„µ̃{µ̃„µ̃{µ̃{µ̃{­̃{µ̃{µ̃„µ̃Œ½̃„½̃Œ½ç”½̃Œ½̃”½çœÆ̃œÆ̃œÆçœÆçœÆ甽̃”½̃Œ½̃„µ̃{µ̃„­̃{µ̃s¥Ö{­̃s¥Ö„­Îs­Ö{­Ös­Ö{µ̃s¥Ö{­̃{µ̃s­Ös¥Î{µÖ{­̃s¥Ös¥Ös¥Ö{µ̃{µ̃{µ̃s¥Ö„µ̃„­̃{µ̃{­Ö„µ̃„µ̃„½̃„½̃„µ̃Œ½çŒµ̃„½̃„µ̃„½̃Œ½̃œÆ̃”½çœÆçœÆç¥Îç¥Îçµ̉â«Đëµ̉âÇÔâÇÔâÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÎ̃ïÇÔâÁÛ́µÖëµ̉â¥Îç˜ÁÖ”½̃„µ̃Œµ̃„µ̃„µ̃Œ½ç„µ̃”½̃”½̃”½̃˜ÁÖ˜ÁÖ”½ç”½̃„½̃„µ̃{­Ö{­Ö{­̃{­Ös­Ös¥Ös­Ö{µ̃{­̃{µ̃{­̃s¥Ös¥Ös¥Ö{­̃s­Ö{­̃s­Ös¥Ös¥Ös­Ös­Ös­Ös¥Ös­Ös¥Ös¥Ö{­Ös¥Ös¥Ös­Ö{µÖ{µ̃{­Ös¥Ös­Ös­Ös­Ös­Ö{­Ö{­Ö{­Ö{­Ös­Ös­Ös­Ö{­Ös­Ös¥Ös¥Ös­Ö{­Ös­Ös­Ös­Ös­Ö{­̃„µ̃{µ̃„µ̃”½çœÆ̃¥Îç¥Îçµ̉âµ̉âµ̉â½Đá½ĐáÁÛ́ÁÛ́ÇÔâÎ̃ïÎ̃ï̃ç÷âï÷̃ç÷äéçâï÷âï÷âï÷ï÷÷ï÷÷âï÷âï÷âï÷ïï÷ïï÷ïï÷ïï÷âï÷âï÷âï÷äéçâï÷̃âçâï÷âï÷âï÷ï÷÷äéçï÷÷âï÷{µ̃{­̃{­Ö{­Ö{­Ös¥Ös¥Ö{­Îs­Ös¥Ös­Ös¥Ö{­Ö{­Ös­Ös¥Ö{­̃s¥Ö{µ̃{­Ös¥Ös¥Ö{­ÖŒµÖ{µ̃„­̃„µ̃„µ̃Œµ̃„µ̃Œ½̃”½̃”½̃Œ½̃”½̃Œµ̃”½ç”½̃œÆ甽甽̃˜ÁÖ”½̃”½̃Œ½̃ŒµÖ{µ̃s¥Ö„­̃{­Ö{­̃{µ̃„µ̃{­Ö„½̃Œ½ÖŒµÖ{µÖ„µ̃Œ½̃„µ̃Œµ̃”½̃”½̃œÆ̃œÆçœÆ̃˜ÁÖ”½̃Œ½̃Œ½ç„µ̃{µ̃„½̃s¥Ö{­̃{­̃s¥Ö{­̃{µ̃{µ̃s¥Ös­Ö{µ̃s¥Ö{µ̃{µ̃{­̃{µ̃s¥Ös¥Ö{µ̃{µ̃{µ̃{­̃s¥Ös¥Ö{µ̃{µ̃{µ̃„µ̃„µ̃„µ̃„½̃Œ½̃„µ̃„½̃Œ½̃Œ½̃„µ̃„½̃ŒµÖ„­̃œÆ̃œÆ̃œÆç ̀â¥Îç«Đëµ̉âµ̉âµÖë½ĐáÁÛ́Î̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïµ̉âµ̉â«ĐëœÆç ̀⌽քµ̃„µ̃„µ̃„­̃{­̃Œ½̃Œ½̃Œ½̃”½ç˜ÁÖ”½̃˜ÁÖ”µâŒ½Ö„µ̃s­Ös¥Ö{­̃{­̃s­Ös¥Ös¥Ö{­̃{­̃„­̃s¥Ö{µ̃s¥Ö{­̃s¥Ös­Ö{­̃s¥Ö{­̃s¥Ös¥Ös­Ö{­̃{µ̃{­Ö{­̃s­Ös­Ö{µ̃s¥Ö{µ̃{µ̃{­Ös­Ös­Ö{­Îs­Ös¥Ös­Ös¥Î{­Ös­Ö{¥Î{­Ös¥Ö„­Îs­Ö{­̃s­Ö{­̃s¥Ös­Ös­Ö{­̃s­Ö{­Ö{µÖ{­̃{­ÖŒµ̃”½̃œÆç¥Îç«Đë«ĐëµÖëµÖëµÖëÁÛ́ÁÛ́ÁÛ́ÁÛ́ÁÛ́Î̃ï̉ặ̉ặ̉ặ̃ç÷̃ç÷äéçäéçäéçâï÷âï÷ïï÷äéç̃âç̃ç÷âï÷âï÷äéç̃ç÷ïï÷âï÷ïï÷ï÷ïâï÷âï÷âï÷ï÷÷ïï÷äéçïï÷{µ̃{­̃s­Ö{­̃s­Ös­Ö{­Ö{­Î{­Ö{­Ös¥Ö{­̃{­Ö„­̃{­̃s¥Ö{­̃{µ̃{µ̃{µ̃{µ̃s¥Ö{­̃{­̃s¥Ös­Ö„½̃Œ½̃Œ½̃Œ½̃„½̃Œ½̃”½ç”½ç”½̃Œ½̃”½ç”½çœ½̃˜ÁÖ˜ÁÖœ½̃œÆ甽̃”½ç{­̃„µ̃s­çs¥Ö{­̃{­̃{­̃{­̃{µ̃„µ̃{­̃{µ̃{µ̃Œ½ç„µ̃Œ½̃Œ½̃”½çœÆçœÆ̃”½ç˜ÁÖ”½ç”½̃Œµ̃„µ̃„­Î{µ̃„µ̃s­ç{µÖs­Ö{µ̃{­̃{­̃s­Ös­Ö{­̃s¥Ö{µ̃s¥Ö{­̃s¥Ös­Ö{µ̃s­Ös­çs­Ös¥Ö{­̃s­Ös¥Ö{­Ö{­̃„µ̃{­ÖŒµÖ{µ̃{µ̃„­̃Œ½çŒ½ç„½̃„µ̃Œ½̃{µ̃„µ̃”½̃Œ½̃”½çœÆ̃œÆç¥ÎçµÖëµ̉âÁÛ́ÇÔâ½ĐáÎ̃âÎ̃ïÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃âÁÛ́ÁÛ́ÁÛ́«Đë«Đ뜽̃”½̃„µ̃{µ̃{µ̃{­̃{­̃„µ̃{µ̃„­̃{µ̃ŒµÖŒ½̃”½çŒ½̃Œ½̃„µ̃{µ̃{­Ös­çs¥Ös¥Ö{­̃{­̃s­Ös¥Ös­Ös­Ös¥Ös¥Ös¥Ö{µ̃{­Ös¥Ös¥Ö{­̃s¥Ös¥Ös­Ö{­̃{­Ö{­̃{­̃s¥Ös­Ös¥Ö{µ̃s¥Ös¥Ös­Ö{­Ö{­Ös­Ö{­Ös­Ös­Ö{­Ös­Ös¥Îs­Ö{­̃s­Ö{­Ös­Ös¥Îs­Ö{­Ös¥Ös¥Ö{­Ös­Ö{­Ö{­Ös­Ös­Ö{­Ö„µ̃Œ½̃Œµ̃”½̃¥Îçµ̉âµÖë½Đá½ĐáµÖë½ĐáÁÛ́µÖëÁÛ́Î̃ïÎ̃ïÎ̃ï̉ặ̉ặ̃âçâï÷âï÷âï÷ïï÷ïï÷äéçâï÷ï÷÷âï÷âï÷âï÷âï÷âï÷̃ç÷äéçäéçâï÷âï÷äéçïï÷âï÷âï÷âï÷ïï÷ïï÷s¥Ö{­̃{µ̃{­Ös¥Ö{­̃s¥Ös­Ös­Ös¥Ö{­̃{µ̃s¥Ös¥Ös¥Ö{­̃s­Ös­Ös¥Ö{µ̃s¥Ö{­Ö{µ̃{­̃{µ̃{µ̃{­̃Œ½̃„µ̃Œ½̃ŒµÖŒµÖŒ½ÖŒµÖ”½ç”½̃œÆ甽̃¥ÎçœÆçœÆçœÆ̃œÆ甽甽ç{­Ö„½̃„½̃{µ̃{­̃{­̃s­Ö„µ̃{­̃{­̃Œ½̃Œ½̃Œ½̃Œµ̃Œ½̃Œ½̃Œ½̃”½çœÆç˜ÁÖŒ½Ö”½̃”½̃Œµ̃„µ̃„µ̃„½̃{µ̃{­̃s­Ös¥Ö{µ̃s¥Ö{­̃{¥Îs­Ös¥Ös¥Ös¥Ös­Ö{µ̃s¥Ö{µ̃{µ̃{­̃s¥Ö„µ̃{µ̃{µ̃s¥Ös­çŒ­Ö{µ̃{µ̃Œµ̃„­̃„­Î„µ̃Œ½çŒ½̃Œ½ÖŒ½̃„½̃Œµ̃”½ç”½çŒµÖ”½̃Œ½̃”½̃œÆçœÆçµ̉â«ĐëÁÛ́µ̉âµÖëÎ̃ïÎ̃âÁÛ́ÎÖï̉ặÎ̃ïÎ̃ïÁÛ́µÖëµ̉â«Đë¥ÎçœÆ甽̃”½̃{µ̃Œ½̃{µ̃s¥Ös¥Ö{µ̃{µ̃Œ­Ö{­ÖŒ­ÖŒ½̃„½̃„­̃„µ̃{­̃{µ̃{­̃s¥Ös¥Ö{­Ös¥Ö{­̃sœÎs­Ö{­̃„­Î{­̃s­Ö{­̃{­̃{­Î{­̃s­Ö{­̃s¥Ö{µ̃s¥Ös­Ös­Ös­Ö{­̃s­Ös¥Ös¥Ös¥Ös­Ö{­̃{¥Îs¥Ö{­̃{µ̃s­Ös­Ö{µ̃{­Îs­Ös­Ös­Ös¥Îs¥Ös¥Ös­Ös­Ös­Ös­Ö{µ̃{­Ös­Ös­Ös¥Î{­̃{µ̃{µ̃{µ̃ŒµÖŒµ̃”½çœÆç¥Îç¥Îçµ̉âµÖë½ĐáÁÛ́ÇÔâµ̉âÇÔâÎÖïÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷̃ç÷âï÷âï÷âï÷̃ç÷äéçâï÷âï÷̃ç÷âï÷ïï÷ï÷÷̃ç÷äéçäéç̃ç÷̃ç÷ïï÷âï÷âï÷äéçïï÷âï÷âï÷ï÷÷ïï÷s­Ö{µ̃{µ̃{­̃{µÖ{­̃s¥Ö{­̃s­Ö{­̃s¥Ö„­̃s­Ös­Ös¥Ö{­̃s­Ös¥Ö{µ̃{­̃s¥Ö{µ̃s­ç{µ̃{­̃Œ½Ö„µ̃Œ½çŒ½Ö{­̃”½ç”½̃ŒµÖŒ½̃Œµ̃˜ÁÖ”½ç¥ÎçœÆç¥Îç˜ÁÖœÆ眽̃œÆ甽焽̃{µ̃”½çs­ç{­̃„½̃„­̃{µ̃{­̃{­̃{µ̃”½ç{­̃Œ­Ö{µÖ„½̃„µ̃Œ½̃Œ½̃”½̃Œ½̃Œ½̃Œ½̃„µ̃{­̃{µ̃s­Ös¥Î{­̃s¥Ös­Ös¥Ö{µ̃{­̃{­̃{­̃{µ̃{­̃{µ̃s¥Î{­̃{­Ös­Ös­Ös¥Ö{µ̃{­Ös¥Ös¥Ö{­Ös­Ö{­Îs¥ÖŒ½̃{­ÖŒ½̃{µ̃Œ½ç{­̃Œ½̃Œ½̃Œ½̃Œ½̃{µ̃Œ½̃ŒµÖ”½çŒ½̃”½̃˜ÁÖœÆç«Đë«Đëµ̉âµÖëÁÛ́µÖëÎ̃ïÎ̃ï̉ặ̃ç÷̉ặÎ̃ïÎÖïÁÛ́½Đáµ̉â«Đ뜽̃˜ÁÖœ½̃Œ½̃Œ½̃{µ̃{­Ö{­̃{­Ös¥Ö{­̃Œ­Ö{µ̃„µ̃Œ½ç„½̃{­̃s­Ö{­̃s¥Ös­Ö{­̃{­Ö{µ̃s­Ö{­̃{­Î{­̃{­Ös¥Ös¥Ö{­Ö{µ̃„­̃s¥Ös­Ös¥Ö{­̃{­̃{­Ö{µ̃s­Ö{­Ös­Ös­Ö{­Ö{­Ös­Ös­Ö{¥Î{­Ös­Ö{­Îs­Ös­Ös¥Ö{µ̃{¥Îs­Ös­Ö{µ̃{¥Îs­Ös¥Ös¥Ös¥Ö{­Îs­Ös­Ö{­̃s­Ös­Ös­Ös¥Ö{­Îs­Ö{­̃{­̃Œ½̃„µ̃”½̃œ½̃¥Îçµ̉âÁÛ́½ĐáµÖëµ̉âÁÛ́µ̉âµÖëÁÛ́ÁÛ́Î̃ïÎ̃ẩặ̃ç÷̉ặâï÷̃ç÷âï÷ïï÷ïï÷̃âçâï÷âï÷̃ç÷âï÷̃ç÷âï÷̉ặâï÷̃ç÷âï÷̃âç̃ç÷̃ç÷ïï÷âï÷âï÷âï÷âï÷ïï÷{µ̃{¥Îs­Ös¥Ös­Ös¥Ö{­Ö{­Ös­Ö{­Î{­Ö{­Ös­Ö{­̃s¥Îs­ÖsœÎsœÎ{­̃s¥Ös¥Ö{µ̃{­Ö{­̃{­̃Œ½̃Œ½Ö”½̃Œ½̃„µ̃Œµ̃Œ½̃Œ½̃œÆ甽甽̃œÆ眽̃œÆç¥Îç¥ÎçœÆ̃¥ÎçœÆ甽̃Œ½Ö{­Ö{µ̃s­ç{µ̃s¥ÖŒ½Ö„µ̃{µ̃ŒµÖ{­Ö{­̃{­̃„µ̃{­Ö„µ̃Œ½̃Œµ̃{µ̃”½çŒµÖŒ½Ö„­̃{­̃{­̃{µ̃{­̃s­Ö{µ̃{­Ös­Ö{µ̃s¥Ös¥Ö{­̃s¥Îs¥Ö{­Ös­Ö{­̃s¥Ös­Ös¥Ö{­̃s­Ös¥Ös­Ös­Ös¥Ö{­Ö{­Ö{µ̃{­̃s¥Ö{µÖ{­̃„µ̃Œ½Ö{µ̃”½ç„­Î„µ̃Œ½Ö„½̃Œµ̃Œ½̃Œ½çŒµÖ”½̃œÆç¥Îç¥Îç«ĐëµÖëµÖëÁÛ́ÇÔâÎ̃ïÎ̃ïÎ̃ïÎ̃ïÎ̃ïÁÛ́Î̃ïÁÛ́ÁÛ́«Đë«ĐëœÆçœÆç–·ÖŒ½Ö{µ̃{µ̃s¥Ö{­̃{­Î{­̃{­̃s¥Ö{­̃{­̃{­̃{µ̃s¥Ö{­̃s¥Ö{­̃sœÎ{µ̃{­̃{µ̃{­Ös­Ös­ÖŒ­Ös­Ös­Ös­Ös­Ös¥Î{­Ös¥Ös­Ös­Ös¥Ös­Ö{µ̃s¥Ös­Ös¥Ö{­Î{­̃{µ̃s­Ös­Ös­Ös­Ö{­Î{­̃s¥Ös­Ö{­Ös¥Ös¥Îs­Ö{µ̃s¥Î{­Ös­Ös­Ös­Ös­Ö{­Ö{µ̃s­ÖsœÎ{µ̃{­̃s­Ös­Ös­Ös­Ös­Ös­Ö„µ̃„µ̃”½̃Œ½ÖœÆ̃œÆç¥Îçµ̉âµ̉âµÖëµ̉âÁÛ́½Đáµ̉âµ̉âÁÛ́Î̃ïÎ̃ẫç÷̉ặ̃âçâï÷âï÷Øëóäéçâï÷âï÷âï÷âï÷̃ç÷̃ç÷âï÷̃ç÷̃ç÷âï÷̃ç÷̃ç÷âï÷âï÷âï÷ïï÷âï÷äéçïï÷âï÷âï÷s­Ös­Ös­Ö{­Ö{­̃{µÖ{­Ös¥ÎsœÎ{­̃s­Ö{­̃{­Î{­̃s¥Ös¥Ö{­Ö{µ̃s­Ö{µ̃s­Ö{µ̃{µÖ{­̃„½̃„µ̃”½̃”½ç˜ÁÖ”½̃”½çŒ½̃œ½̃”½ç”½̃œÆ̃œÆçœÆç«Đë¥Îç¥Îç¥Îç¥Î眽̃”½çŒ½̃{µ̃{µ̃{­̃{µ̃„µ̃„µ̃„µ̃Œ½̃{­̃„µ̃{µ̃„µ̃„½Ö„µ̃„½̃„µ̃Œ½çŒ½Ö{µ̃„½̃{µ̃{µ̃{­Ös¥Ö{­Ös¥Ö{µ̃s­Ös­Ö{­̃s­Ös¥Ös¥Ös­Ös¥Ö{­Ös­Ös¥Ös­Ö{­Ös­Ös¥Ös¥Ös­Ö{­̃s¥Ö{µ̃s¥Ös¥Ö{µ̃s­Ö{­Ö{­̃„­̃„µ̃„µ̃{µ̃Œµ̃Œ½̃Œ½̃Œµ̃„µ̃„µ̃Œ½Ö”½̃Œ½̃”½ç”½çœÆçœÆç¥Îç«ĐëµÖëÁÛ́ÇÔâÁÛ́Î̃ïÎ̃ï̉ặÎ̃ï̃ç÷Î̃âÁÛ́ÁÛ́½Đá«ĐëœÆçœÆçœÆ甽甽̃ŒµÖ{µ̃{µ̃{µ̃s­Ö{µ̃{­Ös­Ö{­Ös­Ös­Ös­Ös­Ös¥Ö{­Ös¥Ö{­̃{µ̃s­Ö{µÖs­Ö{­Ös­Ö{µ̃s¥Ö{­Ös­Ös¥Ös¥Ö{­Ös­Ös¥Ös­Ös­Ös¥Ö{­̃s­Ös­Ös¥Ös¥Ös¥Ö{­Ös¥Ös¥Ös¥Ö{­Ös¥Ö{­Ö{¥Îs­Ö{­Ös¥Ö{­Îs¥Ö{­̃{­̃{µ̃{­Ö{­̃s­Ös­Ös­Ös­Ö{­Ös¥Ö{¥Îs­Ös¥Ös­Ös¥Îs­Ös¥Ö{­̃„µ̃„µ̃„µ̃˜ÁÖ¥ÎçœÆç«Đëµ̉âµ̉âµÖëÁÛ́µ̉âÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ïÎ̃ï̉ặ̃âç̃ç÷̃âçâï÷âï÷âï÷äéçï÷÷äéçâï÷âï÷âï÷âï÷äéçäéçâï÷̉ặ̃ç÷̃âçäéçâï÷äéçïï÷ï÷÷ï÷÷âï÷ï÷÷s­Ö{­Îs¥Ös­Ös­Ös­Ös¥Ös­Ös¥Ös­Ö{­Îs­Ös­Ö{­̃{­Ös¥Ö{­Ös­Ös­Ös­Ös­Ös­ç{­̃{­̃{µ̃„½̃Œ½̃”½̃”½ç˜ÁÖŒ½ç”½çŒ½̃˜ÁÖœÆ̃œÆ̃ ̀â«Đë¥Îç¥Îç«Đë«Đë¥ÎçœÆ甽焽̃Œµ̃{µ̃{µ̃Œµ̃{µ̃{­̃Œµ̃„µ̃„µ̃Œ½̃„½̃{µ̃Œµ̃{µ̃„­̃{­Ö„½̃„µ̃„µ̃{­̃{µ̃{µ̃s¥Ö{µ̃{µ̃{µ̃„µ̃s¥Ös­çs¥Ös­Ö{µ̃{µ̃s¥Ös¥Ös¥Ös­Ös­Ö{­̃s¥Ös­Ö{­Ö{­̃s¥Ö{­Ö{­Ö{µ̃{µ̃{­̃s­Ö{µ̃{­̃„µ̃Œµ̃„µ̃„µ̃„µ̃Œ½ç„½̃Œ½Ö„µ̃”½̃Œ½̃„µ̃”½̃”½ç”½ç”½̃˜ÁÖ˜ÁÖ¥Îçµ̉âµ̉âÁÛ́ÁÛ́ÎÖïÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÁÛ́Î̃ïµ̉â«Đë¥ÎçœÆ̃˜ÁÖ”½çŒµÖ„½̃„µ̃{µ̃s­Ö{­Ö{­Ö{­Ös¥Ö{­Îs¥Ös­Ö{­Ös­Ös¥Ös¥Ös¥Ö{­Ö{­Ös­Ös­Ö{­Ö{­̃s¥Ö{­Ö{µ̃{­Î{­Ö{¥Îs­Ös­Ös¥Ö{­Î{­Ös¥Î{­̃s­Ös­Ö{­Ö{­Ö{¥Î{­Ös¥Ös­Ös­Ös­Ös¥Ös­Ö{­Ö{­̃s¥Ö{­Ös­Ö{­Ös­Ös¥Ös­Ös¥Ö{µÖs¥Ös­Ö{­Ös­Ös¥Ös­Ö{µ̃{­Ös­Ös­Ös­Ö{­Ö{µ̃s¥Ös­Ö{­̃{­̃Œ½̃”½̃Œ½̃œÆ眽̃«Đëµ̉âÁÛ́½Đá½Đá½Đá½ĐáÁÛ́ÇÔâÁÛ́Î̃ïÎ̃ï̃âç̃âç̃âçäéçï÷÷âï÷âï÷äéçâï÷âï÷äéçâï÷̃âçäéçäéç̃ç÷̃ç÷̃ç÷âï÷äéçâï÷̃âçâï÷ïï÷ïï÷âï÷âï÷âï÷s¥Îs¥Î{­Ö{¥Îs­Ös¥Ös¥Ös¥Ö{µÖ{­Îs­Ös¥Ö{­̃{­Ö{­Ös¥Ös­Ös¥Ö{­̃s¥Ö{µ̃{­Ö{­̃{µ̃{µ̃„½̃Œµ̃”½̃˜ÁÖœÆ̃˜ÁÖ”½̃œÆ̃”½̃œÆç ̀â¥Îç¥Îç«Đë¥Îçµ̉â«Đë ̀âœÆçœÆ̃”½̃„µ̃{­̃„­̃{­Ö{µÖ„µ̃„µ̃„­̃Œµ̃ŒµÖ„µ̃„½̃„µ̃{µ̃„µ̃„­̃„µ̃ŒµÖ{µ̃„µ̃{µÖs¥Ös¥Ös¥Ös¥Ö{µ̃s­Ö{µ̃s¥Ös­Ös¥Ös­Ös­Ös­Ö„µ̃s¥Ös¥Ö{­̃s­Ös¥Ös¥Ös­Ös¥Ö{µÖ{­̃s¥Ös¥Ös­Ö{µ̃{µ̃{­̃{­Ö{µ̃„½̃„µ̃„½̃Œ½̃„½̃„µ̃„½̃Œµ̃Œ½̃”½̃Œ½̃Œ½̃Œ½̃”½ç˜ÁÖœÆç¥Æ̃«Đëµ̉âµÖëÁÛ́ÁÛ́Î̃ẩặ̉ặ̉ặÎ̃ïÁÛ́Î̃âÁÛ́µÖë«ĐëœÆçœÆ甽甽̃„µ̃{µ̃{µ̃s­Ö{­̃s­Ö{­Ös¥Ös­Ös­Ös­Ö{­Ös­Ös­Ö{­Ö{­Ös­Ös¥Ö{¥Îs­Ö„­Îs­Ös¥Ö{­Ös¥Ös­Ö{­Îs­Ös­Ös­Ös­Ös­Ös­Ös­Ös¥Îs­Ös­Ö{­Ö{­Î{­Ös¥Ös¥Ös­Ös­Ö{­Ö{­Ö{¥Îs­Ös­Ös­Ös¥Îs­Ös­Ö{­Ös­Ö{¥Î{µÖs­Ös­Ös¥Ö{­Ös­Ös­Ö{­Ö{­Îs¥Îs¥Ös­Ös­Ös­Ös¥Îs­Ös­Ös­Ö{­̃Œ½ç”½̃”½çœÆ̃œÆçœÆç«Đëµ̉âµÖëµÖëµ̉âµÖëÁÛ́ÁÛ́ÁÛ́Î̃ïÎ̃ï̉ặ̃ç÷̃ç÷̃ç÷âï÷äéçïï÷̃ç÷äéçâï÷̃ç÷äéç̉ặ̃ç÷âï÷âï÷̃ç÷âï÷̃ç÷̃ç÷̉ặäéçïï÷âï÷ïï÷ïï÷âï÷äéçïï÷s­Ö{­Ös­Ö{­̃s­Ös­Ös­Ö{­Ö{­̃{­Ö{­Ö{­Ös­Ös­Ös­Ö{­Îs­Ös¥Ös¥Ös¥Ös­Ö{µ̃{µÖ„­̃{µ̃ŒµÖ„½̃Œµ̃”½̃œÆ甽ç˜ÁÖ˜ÁÖ˜ÁÖ¥Îç«Đë¥Îç«Đë¥Îçµ̉â«Đë«Đë­ÅÓ¥ÎçœÆ甽̃„µ̃„­̃„µ̃ŒµÖ{µ̃„µ̃„µ̃„µ̃„½̃{µ̃„µ̃{µ̃{­̃„µ̃{­̃„µ̃„µ̃„½̃s­Ö{µ̃{­̃{µ̃{­̃s¥Ö„­Îs­Ö{­Ös­Ös¥Ös¥Ö{­̃{­̃s¥Ö{­̃s­Ö{µ̃s¥Ös­Ö{­Ös¥Ös­Ös¥Ö{­̃s­Ös­Ös¥Ös¥Ö{­Ö{µ̃s¥Ös¥Ö{µ̃ŒµÖ„µ̃„µ̃„µ̃„µ̃Œ½̃„½̃Œ½̃Œ½̃Œ½çŒ½̃”½ç”½ç”½ç”½çœÆ̃œÆç¥Îç¥Îçµ̉âµ̉âÇÔâÎ̃ïÎ̃ïÎ̃ï̉ặÎ̃ïÁÛ́ÁÛ́ÁÛ́ÁÛ́µ̉â«ĐëœÆ甽̃Œ½̃„µ̃„½̃{­̃{­̃{­Ös­Ös¥Ö{­Ös­Ö{­Îs¥Ös¥Ös­Ös­Ös¥Ös¥Ö{­Ö{µ̃s­Ös¥Ös­Ö{­Ös¥Ös­Ös­Ös­Ö{­Ös­Ö{­Ös­Ö{­Ös¥Ös¥Îs­Ö{­̃„­̃{­̃s­Ös­Ös­Ö{­̃s¥Ös¥Ö{­Ö„µ̃s¥Îs­Ös­Ö{­̃s¥Îs­Ö{­̃{­̃s­Ös­Ö{­̃s­Ö{­Ö{­̃s­Ös¥Ös¥Ö{­Ö{­Ös­Ö{µ̃s­Ös¥Ö{­Îs­Ös­Ös­Ös¥Ös¥Î{µ̃„µ̃Œµ̃”½ç”½̃œÆç˜ÁÖœÆç¥Îç«ĐëµÖë½Đá½ĐáµÖëÁÛ́µÖëÎ̃ïÎ̃ïÎ̃ï̉ặ̃ç÷̃ç÷âï÷âï÷ïï÷äéçâï÷âï÷âï÷âï÷̃âç̉ặ̉ặ̃âçâï÷̃âç̃ç÷âï÷̃ç÷̃ç÷âï÷âï÷âï÷ïï÷ï÷÷âï÷äéçäéçs­Ös­Ö{­Ös¥Ös¥Ös¥Ös­Ö{µ̃{­Ö{µ̃s¥Ös­Ös¥Ös­Ös¥Ös­Ö{­Ös­Ö{­Ös­Ö{µ̃s¥Ös¥Ö{­̃„µ̃„½ÖŒµÖŒ½̃”½̃”½̃”½̃”½̃”µâ¥Îç¥Îç¥Îç¥Îçµ̉â«Đëµ̉âµÖë«Đë¥ÎçœÆ甽̃”½çŒµ̃Œ½̃{­̃{­̃Œ½̃Œµ̃„½̃{µÖŒ½̃„½̃ŒµÖ„µ̃{­̃„µ̃{µ̃{µ̃s¥Ö{µ̃{­̃{µ̃{µ̃{µ̃s¥Ö{­̃{µ̃{­̃s¥Ö{µ̃{­Ö{­̃s¥Ö{­Ös­Ös¥Îs¥Ös¥Ö{­̃s­Ös­Ös¥Î{µ̃{­̃s¥Ös¥Ös­Ö{µ̃{µ̃s­Ö{µ̃{µ̃{µ̃{­̃{µ̃„½̃„µ̃Œ½̃Œ½ç„½̃Œ½̃„µ̃„µ̃Œµ̃”½̃”½ç”½ç˜ÁÖ¥Î甽̃œÆçœÆç¥Îç«Đëµ̉âÁÛ́Î̃âÎ̃ïÎ̃ï̉ặÎ̃ïÎ̃ïÁÛ́ÇÔâÁÛ́µ̉â¥Îç˜ÁÖ”½̃„µ̃„µ̃{µ̃{­̃s¥Ös­Ös­Ös­Ö{­̃{­Ö{¥Î{­Ö{­Ö{­Ös­Ö{­̃s­Ös­Ös¥Ös­Ö{­Îs¥Ös­Ö{­Ös¥Ös­Ö{­Ö{¥Îs­Ös­Ös¥Ös¥Î{­Î{­Ös­Ös¥Ös­Ö{­Ös­Ös­Ös­Ö{µ̃{­Ö{­Ö{µÖs­Ös¥Ös¥Ös­Ös­Ös­Ös¥Îs¥Ös­Ö{­Ös­Ös­Ö{­Ös¥Ös¥Ös¥Ö{µ̃{­Ö{­Îs­Ös­Ö{­̃s¥Î{­Î{­̃{­Ös­Ös­Ö{µ̃{­̃s¥Ös­Ö„½̃”½ç ̀âœÆçœÆ̃œ½̃µ̉âµ̉âµ̉âµ̉âµ̉âµÖëÁÛ́µÖëÁÛ́ÁÛ́Î̃ï̃âç̃ç÷äéçâï÷âï÷âï÷ïï÷ï÷÷äéçâï÷̃ç÷âï÷âï÷âï÷̃ç÷̃ç÷̃âçäéç̃âçäéç̃ç÷Øëó̃ç÷âï÷ïï÷âï÷âï÷ïï÷ïï÷s­Ös­Ö{¥Îs¥Ös­Ös¥Ö{­Ö{­Ö{­Îs­Ö{­Ö{­̃s¥Ös¥Ös­Ö{µ̃s¥Ö{­Î{­̃s¥Ös¥Ö{µ̃{­̃{­̃{­̃ŒµÖ„½̃Œµ̃”½̃”½̃”½̃˜ÁÖœÆç˜ÁÖ¥Îç«Đë«Đë«Đëµ̉âµ̉â­Î̃µ̉â¥Îç¥ÎçœÆ̃œ½̃”½çŒ½̃{µ̃Œ½̃„­̃„µ̃ŒµÖ„µ̃Œ½çŒ­Ös­Ö{µ̃{­̃„µ̃{­̃{µ̃ŒµÖs­Ö{µ̃s­ç„µ̃{µ̃{­Ö{­̃{­̃{­̃{­̃{µ̃s­Ös¥Ös­Ö{­̃s¥Îs­ÖsœÎs­Ös­Ös¥Îs¥Ös¥Ös¥Ös­Ös­Ös¥Ös­Ö{µ̃s¥Ö{µ̃„µ̃s­ÖŒ­Ö{µ̃{µ̃„µ̃{­̃„½̃Œ½çŒ½çŒ­ÖŒµÖ”½çŒ½̃Œ½̃˜ÁÖ”µâœÆ̃œµ̃¥ÎçœÆç¥Îç¥Æ̃«Đëµ̉âÇÔâÁÛ́ÁÛ́ÁÛ́ÁÛ́ÎÖïÁÛ́ÁÛ́µÖëµ̉â«Đë«ĐëœÆ猽̃{µ̃ŒµÖ{µ̃{­Î{­Ös¥Î{­̃s­Ös¥Ö{­̃s¥Ö{µ̃s­Ös¥Ös­Ös­Ö{­Ös¥Ö{­Îs­Ö{­Î{­Ös­Ö{­Ös­Ös­Ö{­̃s­Ös­Ös¥Ö{­Ö{­Î{µÖs¥Ö{­Ös­Ö{­̃{¥Î{­̃s¥Ös­Ö{­̃{­Î{­Îs­Ös­Ö{­̃s­Ö{­Ös¥Î{­̃{­Îs¥Ö{­Ös¥Ö{µ̃{­Ös¥Ös­Ös­Ö{µ̃{­̃s¥Ö{µ̃{­Î{­̃s­Ös¥Ö{­̃{­̃s­Ös­Ö{­Ö{­Ö{¥Î{­Î{­̃„­̃Œ½̃Œ½̃œÆç–·Ö¥Îç¥Îçµ̉âÁÛ́«Đëµ̉âµÖë½ĐáµÖëÎ̃ẫç÷Î̃ï̃ç÷̃ç÷âï÷âï÷̃ç÷̃ç÷ïï÷̃ç÷äéçâï÷âï÷̃ç÷̉ặâï÷̃ç÷âï÷âï÷äéç̃ç÷̃ç÷âï÷äéçäéçâï÷âï÷ïï÷äéçïï÷âï÷ \ No newline at end of file diff --git a/sdk/media/woob.wav b/sdk/media/woob.wav deleted file mode 100644 index c8a4d0f..0000000 Binary files a/sdk/media/woob.wav and /dev/null differ diff --git a/sdk/samples/d3dbld.mk b/sdk/samples/d3dbld.mk deleted file mode 100644 index c27e3a9..0000000 --- a/sdk/samples/d3dbld.mk +++ /dev/null @@ -1,33 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: d3dbld.mk -# Content: Master makefile for Microsoft Visual C++ 2.0 -# For controlling what gets built (debug, retail, clean) -# -############################################################################ - -goal: debug.mak - -all : debug.mak retail.mak - -debug retail: $@.mak - -!ifndef MAKENAME -MAKENAME = default.mk -!endif - -debug.mak retail.mak: - @if not exist $(@B)\nul md $(@B) - @cd $(@B) - @nmake -nologo -f ..\$(MAKENAME) DEBUG="$(@B)" - @cd .. - @echo *** Done making $(@B) *** - -clean: debug.cln retail.cln - -debug.cln retail.cln: - @if exist $(@B)\nul del $(@B) < ..\yes >nul - @if exist $(@B)\nul rd $(@B) >nul - @echo *** $(@B) is clean *** diff --git a/sdk/samples/d3dsdk.mk b/sdk/samples/d3dsdk.mk deleted file mode 100644 index 1c51e9b..0000000 --- a/sdk/samples/d3dsdk.mk +++ /dev/null @@ -1,115 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: d3dsdk.mk -# Content: Rules for building the components of the SDK. -# For use with MSVC 2.0 or higher -# -############################################################################ - -!if "$(GSDKROOT)" == "" -GSDKROOT=..\..\.. -!endif - -############################################################################# -# -# Set up include & lib path -# -############################################################################# -INCLUDE=$(GSDKROOT)\inc;..\..\misc;$(INCLUDE) -LIB=$(GSDKROOT)\lib;$(LIB) - -############################################################################# -# -# new suffixes -# -############################################################################# -.SUFFIXES: -.SUFFIXES: .asm .c .cpp .exe .dll .h .inc .lib .sym .rc .res - -############################################################################# -# -# C compiler definitions -# -############################################################################# -CC =cl -CFLAGS = $(CFLAGS) -W3 -WX -c -Zp -CFLAGS =$(CFLAGS) -G5 -DIS_32 -DWIN32 -!ifndef LOGO -CFLAGS =$(CFLAGS) -nologo -!endif - -############################################################################# -# -# Linker definitions -# -############################################################################# -LINK =link -link -LFLAGS =$(LFLAGS) -nodefaultlib -align:0x1000 -!ifndef LOGO -LFLAGS =$(LFLAGS) -nologo -!endif - -############################################################################# -# -# resource compiler definitions -# -############################################################################# -RCFLAGS =$(RCFLAGS) -I.. -RCFLAGS =$(RCFLAGS) -DWIN32 -DIS_32 -RC = rc - -############################################################################# -# -# assembler definitions -# -############################################################################# -ASM = ml -AFLAGS =$(AFLAGS) -DIS_32 -DWIN32 -AFLAGS =$(AFLAGS) -W3 -WX -Zd -c -Cx -DMASM6 - -############################################################################# -# -# librarian definitions -# -############################################################################# -LIBEXE = lib - -############################################################################# -# -# targets -# -############################################################################# - -goal: $(GOALS) - -{..}.c{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\$(@B).c -<< - -{..\..\misc}.c{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\..\misc\$(@B).c -<< - -{..}.cpp{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\$(@B).cpp -<< - -{..\..\misc}.cpp{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\..\misc\$(@B).cpp -<< - -{..}.asm{}.obj: - $(ASM) $(AFLAGS) -Fo$(@B).obj ..\$(@B).asm - -{..}.rc{}.res: - $(RC) $(RCFLAGS) -r -Fo$(@B).res ..\$(@B).rc - -{..\..\misc}.rc{}.res: - $(RC) $(RCFLAGS) -r -Fo$(@B).res ..\..\misc\$(@B).rc - diff --git a/sdk/samples/ddex1/ddex1.cpp b/sdk/samples/ddex1/ddex1.cpp deleted file mode 100644 index 34e7f89..0000000 --- a/sdk/samples/ddex1/ddex1.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddex1.cpp - * Content: Direct Draw example program 1. Creates a Direct Draw - * object and then a primary surface with a back buffer. - * Slowly flips between the primary surface and the back - * buffer. Press F12 to terminate the program. - * - ***************************************************************************/ - -#define NAME "DDExample1" -#define TITLE "Direct Draw Example 1" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include "resource.h" - -#define TIMER_ID 1 -#define TIMER_RATE 500 - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface -BOOL bActive; // is application active? - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - lpDD->Release(); - lpDD = NULL; - } -} /* finiObjects */ - -char szMsg[] = "Page Flipping Test: Press F12 to exit"; -char szFrontMsg[] = "Front buffer (F12 to quit)"; -char szBackMsg[] = "Back buffer (F12 to quit)"; - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - RECT rc; - SIZE size; - static BYTE phase = 0; - HDC hdc; - - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_CREATE: - break; - - case WM_SETCURSOR: - SetCursor(NULL); - return TRUE; - - case WM_TIMER: - // Flip surfaces - if( bActive ) - { - if (lpDDSBack->GetDC(&hdc) == DD_OK) - { - SetBkColor( hdc, RGB( 0, 0, 255 ) ); - SetTextColor( hdc, RGB( 255, 255, 0 ) ); - if( phase ) - { - TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szBackMsg) ); - phase = 0; - } - else - { - TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) ); - phase = 1; - } - lpDDSBack->ReleaseDC(hdc); - } - - while( 1 ) - { - HRESULT ddrval; - ddrval = lpDDSPrimary->Flip( NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = lpDDSPrimary->Restore(); - if( ddrval != DD_OK ) - { - break; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - } - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - } - break; - - case WM_PAINT: - BeginPaint( hWnd, &ps ); - GetClientRect(hWnd, &rc); - GetTextExtentPoint( ps.hdc, szMsg, lstrlen(szMsg), &size ); - SetBkColor( ps.hdc, RGB( 0, 0, 255 ) ); - SetTextColor( ps.hdc, RGB( 255, 255, 0 ) ); - TextOut( ps.hdc, (rc.right - size.cx)/2, (rc.bottom - size.cy)/2, - szMsg, sizeof( szMsg )-1 ); - EndPaint( hWnd, &ps ); - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - HWND hwnd; - WNDCLASS wc; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT ddrval; - HDC hdc; - char buf[256]; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = NULL; - wc.lpszMenuName = NAME; - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - WS_EX_TOPMOST, - NAME, - TITLE, - WS_POPUP, - 0, 0, - GetSystemMetrics( SM_CXSCREEN ), - GetSystemMetrics( SM_CYSCREEN ), - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval == DD_OK ) - { - // Get exclusive mode - ddrval = lpDD->SetCooperativeLevel( hwnd, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if(ddrval == DD_OK ) - { - ddrval = lpDD->SetDisplayMode( 640, 480, 8 ); - if( ddrval == DD_OK ) - { - // Create the primary surface with 1 back buffer - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval == DD_OK ) - { - // Get a pointer to the back buffer - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, - &lpDDSBack); - if( ddrval == DD_OK ) - { - // draw some text. - if (lpDDSPrimary->GetDC(&hdc) == DD_OK) - { - SetBkColor( hdc, RGB( 0, 0, 255 ) ); - SetTextColor( hdc, RGB( 255, 255, 0 ) ); - TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg) ); - lpDDSPrimary->ReleaseDC(hdc); - } - - if (lpDDSBack->GetDC(&hdc) == DD_OK) - { - SetBkColor( hdc, RGB( 0, 0, 255 ) ); - SetTextColor( hdc, RGB( 255, 255, 0 ) ); - TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) ); - lpDDSBack->ReleaseDC(hdc); - } - - // Create a timer to flip the pages - if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) ) - { - return TRUE; - } - } - } - } - } - } - - wsprintf(buf, "Direct Draw Init Failed (%08lx)\n", ddrval ); - MessageBox( hwnd, buf, "ERROR", MB_OK ); - finiObjects(); - DestroyWindow( hwnd ); - return FALSE; -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - lpCmdLine = lpCmdLine; - hPrevInstance = hPrevInstance; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return msg.wParam; - -} /* WinMain */ diff --git a/sdk/samples/ddex1/ddex1.def b/sdk/samples/ddex1/ddex1.def deleted file mode 100644 index b819846..0000000 --- a/sdk/samples/ddex1/ddex1.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME ddex1.exe - -DESCRIPTION 'Direct Draw Example Program 1 (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/ddex1/ddex1.rc b/sdk/samples/ddex1/ddex1.rc deleted file mode 100644 index 966cd77..0000000 --- a/sdk/samples/ddex1/ddex1.rc +++ /dev/null @@ -1,9 +0,0 @@ -#include "resource.h" - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/ddex1/makefile b/sdk/samples/ddex1/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/ddex1/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/ddex1/makefile.wat b/sdk/samples/ddex1/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/ddex1/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/ddex1/msvc.mk b/sdk/samples/ddex1/msvc.mk deleted file mode 100644 index f9f27cc..0000000 --- a/sdk/samples/ddex1/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = ddex1 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = ddex1.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/ddex1/readme.txt b/sdk/samples/ddex1/readme.txt deleted file mode 100644 index 489d241..0000000 --- a/sdk/samples/ddex1/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -DirectDraw example program 1. - -Creates a DirectDraw object and then a primary surface with a back buffer. -Slowly flips between the primary surface and the back buffer. diff --git a/sdk/samples/ddex1/resource.h b/sdk/samples/ddex1/resource.h deleted file mode 100644 index 4351064..0000000 --- a/sdk/samples/ddex1/resource.h +++ /dev/null @@ -1,2 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 diff --git a/sdk/samples/ddex1/watcom.mk b/sdk/samples/ddex1/watcom.mk deleted file mode 100644 index 9913857..0000000 --- a/sdk/samples/ddex1/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = ddex1 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = ddex1.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/ddex2/back.bmp b/sdk/samples/ddex2/back.bmp deleted file mode 100644 index 9a099c1..0000000 Binary files a/sdk/samples/ddex2/back.bmp and /dev/null differ diff --git a/sdk/samples/ddex2/ddex2.cpp b/sdk/samples/ddex2/ddex2.cpp deleted file mode 100644 index 3f21f7c..0000000 --- a/sdk/samples/ddex2/ddex2.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddex2.cpp - * Content: Direct Draw example program 2. Adds functionality to - * example program 1. Changes the video mode to 640x480x8. - * Reads a bitmap file from disk and copies it into the - * back buffer and then slowly flips between the primary - * surface and the back buffer. Press F12 to exit the program. - * - ***************************************************************************/ - -#define NAME "DDExample2" -#define TITLE "Direct Draw Example 2" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include "resource.h" -#include "ddutil.h" - -#define TIMER_ID 1 -#define TIMER_RATE 250 - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface -LPDIRECTDRAWPALETTE lpDDPal; // DirectDraw palette -BOOL bActive; // is application active? - -char szBackground[] = "BACK"; - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - if( lpDDPal != NULL ) - { - lpDDPal->Release(); - lpDDPal = NULL; - } - lpDD->Release(); - lpDD = NULL; - } - -} /* finiObjects */ - -char szFrontMsg[] = "Front buffer (F12 to quit)"; -char szBackMsg[] = "Back buffer (F12 to quit)"; - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - static BYTE phase = 0; - HDC hdc; - - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_CREATE: - break; - - case WM_TIMER: - // Flip surfaces - if( bActive ) - { - if (lpDDSBack->GetDC(&hdc) == DD_OK) - { - SetBkColor( hdc, RGB( 0, 0, 255 ) ); - SetTextColor( hdc, RGB( 255, 255, 0 ) ); - if( phase ) - { - TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szBackMsg) ); - phase = 0; - } - else - { - TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) ); - phase = 1; - } - lpDDSBack->ReleaseDC(hdc); - } - while( 1 ) - { - HRESULT ddrval; - ddrval = lpDDSPrimary->Flip( NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = lpDDSPrimary->Restore(); - - if( ddrval != DD_OK ) - { - break; - } - - ddrval = DDReLoadBitmap(lpDDSBack, szBackground); - - if( ddrval != DD_OK ) - { - break; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - } - break; - - case WM_SETCURSOR: - SetCursor(NULL); - return TRUE; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - DestroyWindow( hWnd ); - return 0; - } - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - HWND hwnd; - WNDCLASS wc; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT ddrval; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = NULL; - wc.lpszMenuName = NAME; - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - WS_EX_TOPMOST, - NAME, - TITLE, - WS_POPUP, - 0, - 0, - GetSystemMetrics( SM_CXSCREEN ), - GetSystemMetrics( SM_CYSCREEN ), - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval != DD_OK ) - goto error; - - // Get exclusive mode - ddrval = lpDD->SetCooperativeLevel( hwnd, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if(ddrval != DD_OK ) - goto error; - - // Set the video mode to 640x480x8 - ddrval = lpDD->SetDisplayMode( 640, 480, 8); - if(ddrval != DD_OK) - goto error; - - // Create the primary surface with 1 back buffer - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval != DD_OK ) - goto error; - - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack); - - if( ddrval != DD_OK ) - goto error; - - lpDDPal = DDLoadPalette(lpDD, szBackground); - - if (lpDDPal == NULL) - goto error; - - ddrval = lpDDSPrimary->SetPalette(lpDDPal); - - if( ddrval != DD_OK ) - goto error; - - // load a bitmap into the back buffer. - ddrval = DDReLoadBitmap(lpDDSBack, szBackground); - - if( ddrval != DD_OK ) - goto error; - - // Create a timer to flip the pages - if( !SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) ) - goto error; - - return TRUE; - -error: - finiObjects(); - MessageBox( hwnd, "DirectDraw Init FAILED", TITLE, MB_OK ); - DestroyWindow( hwnd ); - return FALSE; -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - lpCmdLine = lpCmdLine; - hPrevInstance = hPrevInstance; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while(GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return msg.wParam; - -} /* WinMain */ diff --git a/sdk/samples/ddex2/ddex2.def b/sdk/samples/ddex2/ddex2.def deleted file mode 100644 index 5522757..0000000 --- a/sdk/samples/ddex2/ddex2.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME ddex2.exe - -DESCRIPTION 'Direct Draw Example Program 2 (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/ddex2/ddex2.rc b/sdk/samples/ddex2/ddex2.rc deleted file mode 100644 index 0987788..0000000 --- a/sdk/samples/ddex2/ddex2.rc +++ /dev/null @@ -1,11 +0,0 @@ -#include "resource.h" - -BACK BITMAP BACK.BMP - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/ddex2/makefile b/sdk/samples/ddex2/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/ddex2/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/ddex2/makefile.wat b/sdk/samples/ddex2/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/ddex2/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/ddex2/msvc.mk b/sdk/samples/ddex2/msvc.mk deleted file mode 100644 index f1563a5..0000000 --- a/sdk/samples/ddex2/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = ddex2 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = ddex2.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/ddex2/readme.txt b/sdk/samples/ddex2/readme.txt deleted file mode 100644 index b667709..0000000 --- a/sdk/samples/ddex2/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -DirectDraw example program 2. - -Adds functionality to example program 1. -Changes the video mode to 640x480x8. Reads a bitmap file from disk and -copies it into the back buffer and then slowly flips between the primary -surface and the back buffer. diff --git a/sdk/samples/ddex2/resource.h b/sdk/samples/ddex2/resource.h deleted file mode 100644 index 4351064..0000000 --- a/sdk/samples/ddex2/resource.h +++ /dev/null @@ -1,2 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 diff --git a/sdk/samples/ddex2/watcom.mk b/sdk/samples/ddex2/watcom.mk deleted file mode 100644 index 7b0aa0a..0000000 --- a/sdk/samples/ddex2/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = ddex2 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = ddex2.obj ddutil.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/ddex3/ddex3.cpp b/sdk/samples/ddex3/ddex3.cpp deleted file mode 100644 index 8938bb6..0000000 --- a/sdk/samples/ddex3/ddex3.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddex3.cpp - * Content: Direct Draw example program 3. Adds functionality to - * example program 2. Creates two offscreen surfaces in - * addition to the primary surface and back buffer. Loads - * a bitmap file into each offscreen surface. Uses BltFast - * to copy the contents of an offscreen surface to the back - * buffer and then flips the buffers and copies the next - * offscreen surface to the back buffer. Press F12 to exit - * the program. This program requires at least 1.2 Megs of - * video ram. - * - ***************************************************************************/ - -#define NAME "DDExample3" -#define TITLE "Direct Draw Example 3" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include "resource.h" -#include "ddutil.h" // DDLoadPalette, DDCopyBitmap - -// Name of our bitmap resource. -char szBitmap[] = "DDEX3"; - -BOOL InitSurfaces( void ); - -#define TIMER_ID 1 -#define TIMER_RATE 500 - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface -LPDIRECTDRAWSURFACE lpDDSOne; // Offscreen surface 1 -LPDIRECTDRAWSURFACE lpDDSTwo; // Offscreen surface 2 -LPDIRECTDRAWPALETTE lpDDPal; // DirectDraw palette -BOOL bActive; // is application active? - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - if( lpDDSOne != NULL ) - { - lpDDSOne->Release(); - lpDDSOne = NULL; - } - if( lpDDSTwo != NULL ) - { - lpDDSTwo->Release(); - lpDDSTwo = NULL; - } - if( lpDDPal != NULL ) - { - lpDDPal->Release(); - lpDDPal = NULL; - } - lpDD->Release(); - lpDD = NULL; - } -} /* finiObjects */ - -/* - * restoreAll - * - * restore all lost objects - */ -HRESULT restoreAll( void ) -{ - HRESULT ddrval; - - ddrval = lpDDSPrimary->Restore(); - if( ddrval == DD_OK ) - { - ddrval = lpDDSOne->Restore(); - if( ddrval == DD_OK ) - { - ddrval = lpDDSTwo->Restore(); - if( ddrval == DD_OK ) - { - InitSurfaces(); - } - } - } - return ddrval; - -} /* restoreAll */ - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - static int phase = 0; - RECT rcRect; - - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_CREATE: - break; - - case WM_SETCURSOR: - SetCursor(NULL); - return TRUE; - - case WM_TIMER: - if( bActive ) - { - HRESULT ddrval; - LPDIRECTDRAWSURFACE pdds; - - rcRect.left = 0; - rcRect.top = 0; - rcRect.right = 640; - rcRect.bottom = 480; - if(phase) - { - pdds = lpDDSTwo; - phase = 0; - } - else - { - pdds = lpDDSOne; - phase = 1; - } - while( 1 ) - { - ddrval = lpDDSBack->BltFast( 0, 0, pdds, &rcRect, FALSE ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - break; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - - // Flip surfaces - while( 1 ) - { - ddrval = lpDDSPrimary->Flip( NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - break; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - } - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - } - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - -/* - * This function is called if the initialization function fails - */ -BOOL initFail( HWND hwnd ) -{ - finiObjects(); - MessageBox( hwnd, "DirectDraw Init FAILED", TITLE, MB_OK ); - DestroyWindow( hwnd ); - return FALSE; - -} /* initFail */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - HWND hwnd; - WNDCLASS wc; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT ddrval; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NAME; - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - 0, - NAME, - TITLE, - WS_POPUP, - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Get exclusive mode - ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Set the video mode to 640x480x8 - ddrval = lpDD->SetDisplayMode( 640, 480, 8); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Create the primary surface with 1 back buffer - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Create a offscreen bitmap. - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwHeight = 480; - ddsd.dwWidth = 640; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSOne, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Create another offscreen bitmap. - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSTwo, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Create a Direct Draw Palette and associate it with the front buffer - lpDDPal = DDLoadPalette(lpDD, szBitmap); - - if (lpDDPal) - lpDDSPrimary->SetPalette( lpDDPal ); - - if( !InitSurfaces() ) - { - return initFail(hwnd); - } - - // Create a timer to flip the pages - if( !SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) ) - { - return initFail(hwnd); - } - - return TRUE; - -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - lpCmdLine = lpCmdLine; - hPrevInstance = hPrevInstance; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while( GetMessage( &msg, NULL, 0, 0 ) ) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return msg.wParam; - -} /* WinMain */ - -/* - * InitSurfaces - This function reads the bitmap file FRNTBACK.BMP - * and stores half of it in offscreen surface 1 and the other half in - * offscreen surface 2. - */ -BOOL InitSurfaces( void ) -{ - HBITMAP hbm; - - // Load our bitmap resource. - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - - if (hbm == NULL) - return FALSE; - - DDCopyBitmap(lpDDSOne, hbm, 0, 0, 640, 480); - DDCopyBitmap(lpDDSTwo, hbm, 0, 480, 640, 480); - DeleteObject(hbm); - - return TRUE; - -} /* readBMPIntoSurfaces */ diff --git a/sdk/samples/ddex3/ddex3.def b/sdk/samples/ddex3/ddex3.def deleted file mode 100644 index fa3f55c..0000000 --- a/sdk/samples/ddex3/ddex3.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME ddex3.exe - -DESCRIPTION 'Direct Draw Example Program 3 (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/ddex3/ddex3.rc b/sdk/samples/ddex3/ddex3.rc deleted file mode 100644 index 53affe3..0000000 --- a/sdk/samples/ddex3/ddex3.rc +++ /dev/null @@ -1,11 +0,0 @@ -#include "resource.h" - -DDEX3 BITMAP FRNTBACK.BMP - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/ddex3/frntback.bmp b/sdk/samples/ddex3/frntback.bmp deleted file mode 100644 index d7d1347..0000000 Binary files a/sdk/samples/ddex3/frntback.bmp and /dev/null differ diff --git a/sdk/samples/ddex3/makefile b/sdk/samples/ddex3/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/ddex3/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/ddex3/makefile.wat b/sdk/samples/ddex3/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/ddex3/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/ddex3/msvc.mk b/sdk/samples/ddex3/msvc.mk deleted file mode 100644 index fcb8489..0000000 --- a/sdk/samples/ddex3/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = ddex3 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = ddex3.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/ddex3/readme.txt b/sdk/samples/ddex3/readme.txt deleted file mode 100644 index ebb7814..0000000 --- a/sdk/samples/ddex3/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -DirectDraw example program 3. - -Adds functionality to example program 2. Creates two offscreen surfaces in -addition to the primary surface and back buffer. Loads a bitmap file into -each offscreen surface. Uses BltFast to copy the contents of an offscreen -surface to the back buffer and then flips the buffers and copies the next -offscreen surface to the back buffer. - -This program requires at least 1.2 Megs of video ram. diff --git a/sdk/samples/ddex3/resource.h b/sdk/samples/ddex3/resource.h deleted file mode 100644 index 4351064..0000000 --- a/sdk/samples/ddex3/resource.h +++ /dev/null @@ -1,2 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 diff --git a/sdk/samples/ddex3/watcom.mk b/sdk/samples/ddex3/watcom.mk deleted file mode 100644 index 72f10f1..0000000 --- a/sdk/samples/ddex3/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = ddex3 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = ddex3.obj ddutil.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/ddex4/all.bmp b/sdk/samples/ddex4/all.bmp deleted file mode 100644 index 7dc2ede..0000000 Binary files a/sdk/samples/ddex4/all.bmp and /dev/null differ diff --git a/sdk/samples/ddex4/ddex4.cpp b/sdk/samples/ddex4/ddex4.cpp deleted file mode 100644 index 63f12b9..0000000 --- a/sdk/samples/ddex4/ddex4.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddex4.cpp - * Content: Direct Draw example program 4. Adds functionality to - * example program 3. Creates a flipping surface and loads - * a bitmap image into an offscreen surface. Uses BltFast to - * copy portions of the offscreen surface to the back buffer - * to generate an animation. Illustrates watching return - * code from BltFast to prevent image tearing. This program - * requires 1.2 Meg of video ram. - * - ***************************************************************************/ - -#define NAME "DDExample4" -#define TITLE "Direct Draw Example 4" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "resource.h" -#include "ddutil.h" - -char szBitmap[] = "ALL"; - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface -LPDIRECTDRAWSURFACE lpDDSOne; // Offscreen surface 1 -LPDIRECTDRAWPALETTE lpDDPal; // DirectDraw palette -BOOL bActive; // is application active? - -/* - * restoreAll - * - * restore all lost objects - */ -HRESULT restoreAll( void ) -{ - HRESULT ddrval; - - ddrval = lpDDSPrimary->Restore(); - if( ddrval == DD_OK ) - { - ddrval = lpDDSOne->Restore(); - if( ddrval == DD_OK ) - { - DDReLoadBitmap(lpDDSOne, szBitmap); - } - } - return ddrval; - -} /* restoreAll */ - -/* - * updateFrame - * - * Decide what needs to be blitted next, wait for flip to complete, - * then flip the buffers. - */ -void updateFrame( void ) -{ - static DWORD lastTickCount[3] = {0,0,0}; - static int currentFrame[3] = {0,0,0}; - DWORD thisTickCount; - RECT rcRect; - DWORD delay[3] = {50, 78, 13}; - int i; - int xpos[3] = {288, 190, 416}; - int ypos[3] = {128, 300, 256}; - HRESULT ddrval; - - // Decide which frame will be blitted next - thisTickCount = GetTickCount(); - for(i=0; i<3; i++) - { - if((thisTickCount - lastTickCount[i]) > delay[i]) - { - // Move to next frame; - lastTickCount[i] = thisTickCount; - currentFrame[i]++; - if(currentFrame[i] > 59) - { - currentFrame[i] = 0; - } - } - } - - // Blit the stuff for the next frame - rcRect.left = 0; - rcRect.top = 0; - rcRect.right = 640; - rcRect.bottom = 480; - while( 1 ) - { - ddrval = lpDDSBack->BltFast( 0, 0, lpDDSOne, - &rcRect, DDBLTFAST_NOCOLORKEY ); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - if(ddrval != DD_OK) - { - return; - } - - for( i=0; i<3; i++ ) - { - rcRect.left = currentFrame[i]%10*64; - rcRect.top = currentFrame[i]/10*64 + 480; - rcRect.right = currentFrame[i]%10*64 + 64; - rcRect.bottom = currentFrame[i]/10*64 + 64 + 480; - - while( 1 ) - { - ddrval = lpDDSBack->BltFast( xpos[i], ypos[i], lpDDSOne, - &rcRect, DDBLTFAST_SRCCOLORKEY ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - } - - // Flip the surfaces - while( 1 ) - { - ddrval = lpDDSPrimary->Flip( NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - break; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - -} /* updateFrame */ - - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - if( lpDDSOne != NULL ) - { - lpDDSOne->Release(); - lpDDSOne = NULL; - } - if( lpDDPal != NULL ) - { - lpDDPal->Release(); - lpDDPal = NULL; - } - lpDD->Release(); - lpDD = NULL; - } -} /* finiObjects */ - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_SETCURSOR: - SetCursor(NULL); - return TRUE; - - case WM_CREATE: - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - } - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - -/* - * This function is called if the initialization function fails - */ -BOOL initFail( HWND hwnd ) -{ - finiObjects(); - MessageBox( hwnd, "DirectDraw Init FAILED", TITLE, MB_OK ); - DestroyWindow( hwnd ); - return FALSE; - -} /* initFail */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - HWND hwnd; - WNDCLASS wc; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT ddrval; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockBrush(BLACK_BRUSH); - wc.lpszMenuName = NAME; - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - 0, - NAME, - TITLE, - WS_POPUP, - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Get exclusive mode - ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Set the video mode to 640x480x8 - ddrval = lpDD->SetDisplayMode( 640, 480, 8); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Create the primary surface with 1 back buffer - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // create and set the palette - lpDDPal = DDLoadPalette(lpDD, szBitmap); - - if (lpDDPal) - lpDDSPrimary->SetPalette(lpDDPal); - - // Create the offscreen surface, by loading our bitmap. - lpDDSOne = DDLoadBitmap(lpDD, szBitmap, 0, 0); - - if( lpDDSOne == NULL ) - { - return initFail(hwnd); - } - - // Set the color key for this bitmap (black) - DDSetColorKey(lpDDSOne, RGB(0,0,0)); - - return TRUE; -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - lpCmdLine = lpCmdLine; - hPrevInstance = hPrevInstance; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while( 1 ) - { - if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( !GetMessage( &msg, NULL, 0, 0 ) ) - return msg.wParam; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else if( bActive ) - { - updateFrame(); - } - else - { - // make sure we go to sleep if we have nothing else to do - WaitMessage(); - } - } -} /* WinMain */ diff --git a/sdk/samples/ddex4/ddex4.def b/sdk/samples/ddex4/ddex4.def deleted file mode 100644 index 866b502..0000000 --- a/sdk/samples/ddex4/ddex4.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME ddex4.exe - -DESCRIPTION 'Direct Draw Example Program 4 (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/ddex4/ddex4.rc b/sdk/samples/ddex4/ddex4.rc deleted file mode 100644 index 5d5030c..0000000 --- a/sdk/samples/ddex4/ddex4.rc +++ /dev/null @@ -1,11 +0,0 @@ -#include "resource.h" - -ALL BITMAP ALL.BMP - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/ddex4/makefile b/sdk/samples/ddex4/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/ddex4/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/ddex4/makefile.wat b/sdk/samples/ddex4/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/ddex4/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/ddex4/msvc.mk b/sdk/samples/ddex4/msvc.mk deleted file mode 100644 index 7550fe4..0000000 --- a/sdk/samples/ddex4/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = ddex4 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = ddex4.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/ddex4/readme.txt b/sdk/samples/ddex4/readme.txt deleted file mode 100644 index 657d28c..0000000 --- a/sdk/samples/ddex4/readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -Direct Draw example program 4. - -Adds functionality to example program 3. Creates a flipping surface and -loads a bitmap image into an offscreen surface. Uses BltFast to copy -portions of the offscreen surface to the back buffer to generate an -animation. - -Illustrates watching the return code from BltFast to prevent tearing. - -This program requires 1.2 Meg of video ram. diff --git a/sdk/samples/ddex4/resource.h b/sdk/samples/ddex4/resource.h deleted file mode 100644 index 4351064..0000000 --- a/sdk/samples/ddex4/resource.h +++ /dev/null @@ -1,2 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 diff --git a/sdk/samples/ddex4/watcom.mk b/sdk/samples/ddex4/watcom.mk deleted file mode 100644 index 009f5bb..0000000 --- a/sdk/samples/ddex4/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = ddex4 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = ddex4.obj ddutil.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/ddex5/all.bmp b/sdk/samples/ddex5/all.bmp deleted file mode 100644 index 2264bf4..0000000 Binary files a/sdk/samples/ddex5/all.bmp and /dev/null differ diff --git a/sdk/samples/ddex5/ddex5.cpp b/sdk/samples/ddex5/ddex5.cpp deleted file mode 100644 index 18ab53c..0000000 --- a/sdk/samples/ddex5/ddex5.cpp +++ /dev/null @@ -1,465 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddex5.cpp - * Content: Direct Draw example program 5. Adds functionality to - * example program 4. Uses GetEntries() to read a palette, - * modifies the entries, and then uses SetEntries() to update - * the palette. This program requires 1.2 Meg of video ram. - * - ***************************************************************************/ - -#define NAME "DDExample5" -#define TITLE "Direct Draw Example 5" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "resource.h" -#include "ddutil.h" - -char szBitmap[] = "ALL"; - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface -LPDIRECTDRAWSURFACE lpDDSOne; // Offscreen surface 1 -LPDIRECTDRAWPALETTE lpDDPal; // The primary surface palette -BOOL bActive; // is application active? - -BYTE torusColors[256]; // Marks the colors used in the torus - -/* - * restoreAll - * - * restore all lost objects - */ -HRESULT restoreAll( void ) -{ - HRESULT ddrval; - - ddrval = lpDDSPrimary->Restore(); - if( ddrval == DD_OK ) - { - ddrval = lpDDSOne->Restore(); - if( ddrval == DD_OK ) - { - DDReLoadBitmap(lpDDSOne, szBitmap); - } - } - return ddrval; - -} /* restoreAll */ - -/* - * updateFrame - * - * Decide what needs to be blitted next, wait for flip to complete, - * then flip the buffers. - */ -void updateFrame( void ) -{ - static DWORD lastTickCount[4] = {0,0,0,0}; - static int currentFrame[3] = {0,0,0}; - DWORD thisTickCount; - RECT rcRect; - DWORD delay[4] = {50, 78, 13, 93}; - int i; - int xpos[3] = {288, 190, 416}; - int ypos[3] = {128, 300, 256}; - PALETTEENTRY pe[256]; - HRESULT ddrval; - - // Decide which frame will be blitted next - thisTickCount = GetTickCount(); - for(i=0; i<3; i++) - { - if((thisTickCount - lastTickCount[i]) > delay[i]) - { - // Move to next frame; - lastTickCount[i] = thisTickCount; - currentFrame[i]++; - if(currentFrame[i] > 59) - currentFrame[i] = 0; - } - } - - // Blit the stuff for the next frame - rcRect.left = 0; - rcRect.top = 0; - rcRect.right = 640; - rcRect.bottom = 480; - while( 1 ) - { - ddrval = lpDDSBack->BltFast( 0, 0, lpDDSOne, - &rcRect, DDBLTFAST_NOCOLORKEY ); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - if(ddrval != DD_OK) - { - return; - } - - for(i=0; i<3; i++) - { - rcRect.left = currentFrame[i]%10*64; - rcRect.top = currentFrame[i]/10*64 + 480; - rcRect.right = currentFrame[i]%10*64 + 64; - rcRect.bottom = currentFrame[i]/10*64 + 64 + 480; - - while( 1 ) - { - ddrval = lpDDSBack->BltFast( xpos[i], ypos[i], lpDDSOne, - &rcRect, DDBLTFAST_SRCCOLORKEY ); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - } - - if( (thisTickCount - lastTickCount[3]) > delay[3] ) - { - // Change the palette - if(lpDDPal->GetEntries( 0, 0, 256, pe ) != DD_OK) - { - return; - } - - for(i=1; i<256; i++) - { - if(!torusColors[i]) - { - continue; - } - pe[i].peRed = (pe[i].peRed+2) % 256; - pe[i].peGreen = (pe[i].peGreen+1) % 256; - pe[i].peBlue = (pe[i].peBlue+3) % 256; - } - - if(lpDDPal->SetEntries( 0, 0, 256, pe) != DD_OK) - { - return; - } - - lastTickCount[3] = thisTickCount; - } - - // Flip the surfaces - while( 1 ) - { - ddrval = lpDDSPrimary->Flip( NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - break; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - -} /* updateFrame */ - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - if( lpDDSOne != NULL ) - { - lpDDSOne->Release(); - lpDDSOne = NULL; - } - if( lpDDPal != NULL ) - { - lpDDPal->Release(); - lpDDPal = NULL; - } - lpDD->Release(); - lpDD = NULL; - } - -} /* finiObjects */ - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_SETCURSOR: - SetCursor(NULL); - return TRUE; - - case WM_CREATE: - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - } - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - - - -/* - * This function is called if the initialization function fails - */ -BOOL initFail( HWND hwnd ) -{ - finiObjects(); - MessageBox( hwnd, "DirectDraw Init FAILED", TITLE, MB_OK ); - DestroyWindow( hwnd ); - return FALSE; - -} /* initFail */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - HWND hwnd; - WNDCLASS wc; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT ddrval; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockBrush(BLACK_BRUSH); - wc.lpszMenuName = NAME; - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - 0, - NAME, - TITLE, - WS_POPUP, - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - SetFocus( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Get exclusive mode - ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Set the video mode to 640x480x8 - ddrval = lpDD->SetDisplayMode( 640, 480, 8); - if(ddrval != DD_OK) - { - return initFail(hwnd); - } - - // Create the primary surface with 1 back buffer - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // create and set the palette - lpDDPal = DDLoadPalette(lpDD, szBitmap); - - if (lpDDPal) - lpDDSPrimary->SetPalette(lpDDPal); - - // Create the offscreen surface, by loading our bitmap. - lpDDSOne = DDLoadBitmap(lpDD, szBitmap, 0, 0); - - if( lpDDSOne == NULL ) - { - return initFail(hwnd); - } - - // set the color key to black - DDSetColorKey(lpDDSOne, RGB(0,0,0)); - - // - // Mark the colors used in the torus frames - // - int i,x,y; - - // First, set all colors as unused - for(i=0; i<256; i++) - { - torusColors[i] = 0; - } - - // lock the surface and scan the lower part (the torus area) - // and remember all the index's we find. - ddsd.dwSize = sizeof(ddsd); - while (lpDDSOne->Lock(NULL, &ddsd, 0, NULL) == DDERR_WASSTILLDRAWING) - ; - - // Now search through the torus frames and mark used colors - for( y=480; y<480+384; y++ ) - { - for( x=0; x<640; x++ ) - { - torusColors[((BYTE *)ddsd.lpSurface)[y*ddsd.lPitch+x]] = 1; - } - } - - lpDDSOne->Unlock(NULL); - - return TRUE; - -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - lpCmdLine = lpCmdLine; - hPrevInstance = hPrevInstance; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while( 1 ) - { - if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( !GetMessage( &msg, NULL, 0, 0 ) ) - { - return msg.wParam; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else if( bActive ) - { - updateFrame(); - } - else - { - // make sure we go to sleep if we have nothing else to do - WaitMessage(); - } - } -} /* WinMain */ diff --git a/sdk/samples/ddex5/ddex5.def b/sdk/samples/ddex5/ddex5.def deleted file mode 100644 index 78f668f..0000000 --- a/sdk/samples/ddex5/ddex5.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME ddex5.exe - -DESCRIPTION 'Direct Draw Example Program 5 (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/ddex5/ddex5.rc b/sdk/samples/ddex5/ddex5.rc deleted file mode 100644 index 5d5030c..0000000 --- a/sdk/samples/ddex5/ddex5.rc +++ /dev/null @@ -1,11 +0,0 @@ -#include "resource.h" - -ALL BITMAP ALL.BMP - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/ddex5/makefile b/sdk/samples/ddex5/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/ddex5/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/ddex5/makefile.wat b/sdk/samples/ddex5/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/ddex5/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/ddex5/msvc.mk b/sdk/samples/ddex5/msvc.mk deleted file mode 100644 index 6c76bce..0000000 --- a/sdk/samples/ddex5/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = ddex5 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = ddex5.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/ddex5/readme.txt b/sdk/samples/ddex5/readme.txt deleted file mode 100644 index 18c8eb8..0000000 --- a/sdk/samples/ddex5/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -Direct Draw example program 5. - -Adds functionality to example program 4. Uses GetEntries() to read a palette, -modifies the entries, and then uses SetEntries() to update the palette. - -This program requires 1.2 Meg of video ram. diff --git a/sdk/samples/ddex5/resource.h b/sdk/samples/ddex5/resource.h deleted file mode 100644 index 4351064..0000000 --- a/sdk/samples/ddex5/resource.h +++ /dev/null @@ -1,2 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 diff --git a/sdk/samples/ddex5/watcom.mk b/sdk/samples/ddex5/watcom.mk deleted file mode 100644 index 7f1676e..0000000 --- a/sdk/samples/ddex5/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = ddex5 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = ddex5.obj ddutil.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/donut/donut.bmp b/sdk/samples/donut/donut.bmp deleted file mode 100644 index 2b9595b..0000000 Binary files a/sdk/samples/donut/donut.bmp and /dev/null differ diff --git a/sdk/samples/donut/donut.cpp b/sdk/samples/donut/donut.cpp deleted file mode 100644 index 5314fe2..0000000 --- a/sdk/samples/donut/donut.cpp +++ /dev/null @@ -1,460 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: donut.cpp - * - ***************************************************************************/ - -#define NAME "Donut" -#define TITLE "Donut" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "resource.h" -#include "ddutil.h" - -char szBitmap[] = "DONUT"; - -int gPos = 0; -BOOL gExclusive = FALSE; -int gMode = 0; -HWND hwnd; - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSOne; // Offscreen surface 1 -LPDIRECTDRAWSURFACE lpDDSTwo; // Offscreen surface 2 -LPDIRECTDRAWPALETTE lpDDPal; // DirectDraw palette -BOOL bActive; // is application active? - -/* - * restoreAll - * - * restore all lost objects - */ -HRESULT restoreAll( void ) -{ - HRESULT ddrval; - - ddrval = lpDDSPrimary->Restore(); - if( ddrval == DD_OK ) - { - ddrval = lpDDSOne->Restore(); - if( ddrval == DD_OK ) - { - ddrval = lpDDSTwo->Restore(); - if( ddrval == DD_OK ) - { - DDReLoadBitmap(lpDDSOne, szBitmap); - } - } - } - return ddrval; - -} /* restoreAll */ - -/* - * updateFrame - * - * Decide what needs to be blitted next, wait for flip to complete, - * then flip the buffers. - */ -void updateFrame( void ) -{ - static DWORD lastTickCount = 0; - static int currentFrame = 0; - static BOOL haveBackground = FALSE; - DWORD thisTickCount; - RECT rcRect; - DWORD delay = 17; - HRESULT ddrval; - int pos; - - thisTickCount = GetTickCount(); - if((thisTickCount - lastTickCount) <= delay) - { - return; - } - - switch( gPos ) - { - case 0: pos = 0; break; - case 1: pos = 64; break; - case 2: pos = 128; break; - } - rcRect.left = 0; - rcRect.top = 0; - rcRect.right = 64; - rcRect.bottom = 64; - - // restore a previously saved patch - while( haveBackground ) - { - ddrval = lpDDSPrimary->BltFast( pos, 0, lpDDSTwo, &rcRect, FALSE ); - if( ddrval == DD_OK ) - { - haveBackground = TRUE; - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - - rcRect.left = pos; - rcRect.right = pos+64; - // Save the current primary surface that we are about to overwrite - while( 1 ) - { - haveBackground = FALSE; - ddrval = lpDDSTwo->BltFast( 0, 0, lpDDSPrimary, - &rcRect, DDBLTFAST_NOCOLORKEY); - - if( ddrval == DD_OK ) - { - haveBackground = TRUE; - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - - thisTickCount = GetTickCount(); - if((thisTickCount - lastTickCount) > delay) - { - // Move to next frame; - lastTickCount = thisTickCount; - currentFrame++; - if(currentFrame > 59) - { - currentFrame = 0; - } - } - - // Blit the stuff for the next frame - rcRect.left = currentFrame%10*64; - rcRect.top = currentFrame/10*64; - rcRect.right = currentFrame%10*64 + 64; - rcRect.bottom = currentFrame/10*64 + 64; - - while( 1 ) - { - ddrval = lpDDSPrimary->BltFast( pos, 0, lpDDSOne, - &rcRect, DDBLTFAST_SRCCOLORKEY); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - ddrval = restoreAll(); - if( ddrval != DD_OK ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - if(ddrval != DD_OK) - { - return; - } -} /* updateFrame */ - - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - if( lpDDSOne != NULL ) - { - lpDDSOne->Release(); - lpDDSOne = NULL; - } - if( lpDDPal != NULL ) - { - lpDDPal->Release(); - lpDDPal = NULL; - } - lpDD->Release(); - lpDD = NULL; - } - // Clean up the screen on exit - RedrawWindow( NULL, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | - RDW_ALLCHILDREN ); - -} /* finiObjects */ - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - hwnd = hWnd; - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_SETCURSOR: - SetCursor(NULL); - return TRUE; - - case WM_PALETTECHANGED: - if ((HWND)wParam == hWnd) - break; - // fall through to WM_QUERYNEWPALETTE - case WM_QUERYNEWPALETTE: - // install our palette here - if (lpDDPal) - { - lpDDSPrimary->SetPalette(lpDDPal); - } - DDReLoadBitmap(lpDDSOne, szBitmap); - break; - - case WM_CREATE: - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd,WM_CLOSE,0,0); - break; - } - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - -/* - * This function is called if the initialization function fails - */ -BOOL initFail( HWND hwnd ) -{ - finiObjects(); - MessageBox( hwnd, "DirectDraw Init FAILED", TITLE, MB_OK ); - DestroyWindow( hwnd ); - return FALSE; - -} /* initFail */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - HWND hwnd; - WNDCLASS wc; - DDSURFACEDESC ddsd; - HRESULT ddrval; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NAME; - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - 0, - NAME, - TITLE, - WS_POPUP, - 0, - 0, - 1, - 1, - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Get exclusive mode if requested - if(gExclusive) - { - ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - } - else - { - ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_NORMAL ); - } - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Set the video mode to 640x480x8 - switch( gMode ) - { - case 1: ddrval = lpDD->SetDisplayMode( 640, 480, 8); break; - case 2: ddrval = lpDD->SetDisplayMode( 800, 600, 8); break; - case 3: ddrval = lpDD->SetDisplayMode( 1024, 768, 8); break; - case 4: ddrval = lpDD->SetDisplayMode( 1280, 1024, 8); break; - } - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // Create the primary surface - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - lpDDPal = DDLoadPalette(lpDD, szBitmap); - - if (lpDDPal) - { - lpDDSPrimary->SetPalette(lpDDPal); - } - - lpDDSOne = DDLoadBitmap(lpDD, szBitmap, 0, 0); - if( lpDDSOne == NULL ) - { - return initFail(hwnd); - } - - // set color key to black - DDSetColorKey(lpDDSOne, RGB(0,0,0)); - - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwHeight = 64; - ddsd.dwWidth = 64; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSTwo, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - return TRUE; -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - LPSTR c; - - for(c=lpCmdLine; *c != '\0'; c++) - { - switch( *c ) - { - case '0': gPos = 0; break; - case '1': gPos = 1; break; - case '2': gPos = 2; break; - case 'X': gExclusive = TRUE; break; - case 'A': gExclusive = TRUE; gMode = 1; break; - case 'B': gExclusive = TRUE; gMode = 2; break; - case 'C': gExclusive = TRUE; gMode = 3; break; - case 'D': gExclusive = TRUE; gMode = 4; break; - } - } - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while( 1 ) - { - if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( !GetMessage( &msg, NULL, 0, 0 ) ) - return msg.wParam; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else if( !gExclusive || bActive ) - { - updateFrame(); - } - else - { - WaitMessage(); - } - } -} /* WinMain */ diff --git a/sdk/samples/donut/donut.def b/sdk/samples/donut/donut.def deleted file mode 100644 index 4c6dddc..0000000 --- a/sdk/samples/donut/donut.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME donut.exe - -DESCRIPTION 'A rotating rubber donut (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/donut/donut.rc b/sdk/samples/donut/donut.rc deleted file mode 100644 index 373855f..0000000 --- a/sdk/samples/donut/donut.rc +++ /dev/null @@ -1,11 +0,0 @@ -#include "resource.h" - -DONUT BITMAP DONUT.BMP - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/donut/makefile b/sdk/samples/donut/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/donut/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/donut/makefile.wat b/sdk/samples/donut/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/donut/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/donut/msvc.mk b/sdk/samples/donut/msvc.mk deleted file mode 100644 index 6896ea1..0000000 --- a/sdk/samples/donut/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = donut -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = donut.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/donut/readme.txt b/sdk/samples/donut/readme.txt deleted file mode 100644 index bcbd535..0000000 --- a/sdk/samples/donut/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -This program is useful for testing multiple exclusive mode apps interacting -with multiple non-exclusive mode apps. The program displays a rotating -donut in the upper left corner of the screen. It may be terminated by -pressing Esc or F12. - -Various command line switches can be specified to modify the characteristics -of this program. Each switch consists of one character and need not be -preceeded with a dash or slash. The switches are as follows: - -0 - Display in far left position -1 - Display in middle position -2 - Display in right position -X - Use exclusive mode -A - Switch mode to 640x480x8 and use exclusive mode -B - Switch mode to 800x600x8 and use exclusive mode -C - Switch mode to 1024x768x8 and use exclusive mode -D - Switch mode to 1280x1024x8 and use exclusive mode - -The switches may be combined. If two switches are used which contradict, -the last switch specified will be in effect. - -If this program is running in non-exclusive mode, it attempts to continue to -run even when it loses focus. If it is running in exclusive mode, the -program does not attempt to modify the screen when it doesn't have focus. - - diff --git a/sdk/samples/donut/resource.h b/sdk/samples/donut/resource.h deleted file mode 100644 index 4351064..0000000 --- a/sdk/samples/donut/resource.h +++ /dev/null @@ -1,2 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 diff --git a/sdk/samples/donut/watcom.mk b/sdk/samples/donut/watcom.mk deleted file mode 100644 index 2a9ac3d..0000000 --- a/sdk/samples/donut/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = donut -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = donut.obj ddutil.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/donuts/bangbang.wav b/sdk/samples/donuts/bangbang.wav deleted file mode 100644 index 84cf9e1..0000000 Binary files a/sdk/samples/donuts/bangbang.wav and /dev/null differ diff --git a/sdk/samples/donuts/bounce.wav b/sdk/samples/donuts/bounce.wav deleted file mode 100644 index 33bd786..0000000 Binary files a/sdk/samples/donuts/bounce.wav and /dev/null differ diff --git a/sdk/samples/donuts/c_bang.wav b/sdk/samples/donuts/c_bang.wav deleted file mode 100644 index 4dc29b9..0000000 Binary files a/sdk/samples/donuts/c_bang.wav and /dev/null differ diff --git a/sdk/samples/donuts/d_bang.wav b/sdk/samples/donuts/d_bang.wav deleted file mode 100644 index f6c6658..0000000 Binary files a/sdk/samples/donuts/d_bang.wav and /dev/null differ diff --git a/sdk/samples/donuts/donuts.bmp b/sdk/samples/donuts/donuts.bmp deleted file mode 100644 index 2c0015d..0000000 Binary files a/sdk/samples/donuts/donuts.bmp and /dev/null differ diff --git a/sdk/samples/donuts/donuts.c b/sdk/samples/donuts/donuts.c deleted file mode 100644 index 2782334..0000000 --- a/sdk/samples/donuts/donuts.c +++ /dev/null @@ -1,1880 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: donuts.c - * Content: Shoot-em-up game - * - * - ***************************************************************************/ -#include "donuts.h" - - -LPDIRECTDRAWSURFACE lpFrontBuffer; -LPDIRECTDRAWSURFACE lpBackBuffer; -LPDIRECTDRAWSURFACE lpDonut; -LPDIRECTDRAWSURFACE lpPyramid; -LPDIRECTDRAWSURFACE lpCube; -LPDIRECTDRAWSURFACE lpSphere; -LPDIRECTDRAWSURFACE lpShip; -LPDIRECTDRAWSURFACE lpNum; -LPDIRECTDRAW lpDD; -LPDIRECTDRAWPALETTE lpArtPalette; -LPDIRECTDRAWPALETTE lpSplashPalette; -BOOL bSoundEnabled = FALSE; -BOOL bPlayIdle = FALSE; -BOOL bPlayBuzz = FALSE; -BOOL bPlayRev = FALSE; -DWORD lastInput = 0; -BOOL lastThrust = FALSE; -BOOL lastShield = FALSE; -int showDelay = 0; -HWND hWndMain; -BOOL bShowFrameCount=TRUE; -BOOL bIsActive; -BOOL bMouseVisible; -DWORD dwFrameCount; -DWORD dwFrameTime; -DWORD dwFrames; -DWORD dwFramesLast; -BOOL bUseEmulation; -BOOL bTest=FALSE; -BOOL bStress=FALSE; -DWORD dwTransType; -RGBQUAD SPalette[256]; -DWORD lastTickCount; -int score; -int ProgramState; -int level; -int restCount; -DWORD dwFillColor; -BOOL bSpecialEffects = FALSE; -DWORD ShowLevelCount = 3000; -DWORD ScreenX; -DWORD ScreenY; -DWORD ScreenBpp; -BOOL bWantSound = TRUE; //global hack to turn off sound - -int getint(char**p, int def); - -#ifdef DEBUG -char DebugBuf[256]; -BOOL bHELBlt = FALSE; -#endif - -DBLNODE DL; // Display List - -#ifdef USE_DSOUND -LPDIRECTSOUND lpDS; -HSNDOBJ hsoBeginLevel = NULL; -HSNDOBJ hsoEngineIdle = NULL; -HSNDOBJ hsoEngineRev = NULL; -HSNDOBJ hsoSkidToStop = NULL; -HSNDOBJ hsoShieldBuzz = NULL; -HSNDOBJ hsoShipExplode = NULL; -HSNDOBJ hsoFireBullet = NULL; -HSNDOBJ hsoShipBounce = NULL; -HSNDOBJ hsoDonutExplode = NULL; -HSNDOBJ hsoPyramidExplode = NULL; -HSNDOBJ hsoCubeExplode = NULL; -HSNDOBJ hsoSphereExplode = NULL; -#endif - - -void setup_game(void) -{ - restCount = GetTickCount(); - initLevel( ++level ); - // set the palette - lpFrontBuffer->lpVtbl->SetPalette( lpFrontBuffer, lpArtPalette ); -} - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -long FAR PASCAL MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - switch( message ) - { - case WM_ACTIVATEAPP: - bIsActive = (BOOL) wParam; - if( bIsActive ) - { - bMouseVisible = FALSE; - lastTickCount = GetTickCount(); - bSpecialEffects = FALSE; - } - else - { - bMouseVisible = TRUE; - } - break; - - case WM_CREATE: - break; - - case WM_SETCURSOR: - if( !bMouseVisible ) - { - SetCursor(NULL); - } - else - { - SetCursor(LoadCursor( NULL, IDC_ARROW )); - } - return TRUE; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_NUMPAD7: - lastInput |= KEY_SHIELD; - break; - case VK_NUMPAD5: - lastInput |= KEY_STOP; - break; - case VK_DOWN: - case VK_NUMPAD2: - lastInput |= KEY_DOWN; - break; - case VK_LEFT: - case VK_NUMPAD4: - lastInput |= KEY_LEFT; - break; - case VK_RIGHT: - case VK_NUMPAD6: - lastInput |= KEY_RIGHT; - break; - case VK_UP: - case VK_NUMPAD8: - lastInput |= KEY_UP; - break; - case VK_NUMPAD3: - lastInput |= KEY_THROW; - break; - case VK_SPACE: - lastInput |= KEY_FIRE; - break; - case VK_F5: - bShowFrameCount = !bShowFrameCount; - if( bShowFrameCount ) - { - dwFrameCount = 0; - dwFrameTime = timeGetTime(); - } - break; - case VK_RETURN: - if( ProgramState == PS_SPLASH ) - { - ProgramState = PS_BEGINREST; - setup_game(); - } - break; - case VK_ESCAPE: - case VK_F12: - PostMessage( hWnd, WM_CLOSE, 0, 0 ); - return 0; - case VK_F3: -#ifdef USE_DSOUND - if(bWantSound) - { - if( bSoundEnabled ) - { - DestroySound(); - } - else - { - InitializeSound(); - } - } -#endif - break; - case VK_F1: - bSpecialEffects = !bSpecialEffects; - break; - } - break; - - - case WM_KEYUP: - switch( wParam ) - { - case VK_NUMPAD7: - lastInput &= ~KEY_SHIELD; - break; - case VK_NUMPAD5: - lastInput &= ~KEY_STOP; - break; - case VK_DOWN: - case VK_NUMPAD2: - lastInput &= ~KEY_DOWN; - break; - case VK_LEFT: - case VK_NUMPAD4: - lastInput &= ~KEY_LEFT; - break; - case VK_RIGHT: - case VK_NUMPAD6: - lastInput &= ~KEY_RIGHT; - break; - case VK_UP: - case VK_NUMPAD8: - lastInput &= ~KEY_UP; - break; - case VK_NUMPAD3: - lastInput &= ~KEY_THROW; - break; - case VK_SPACE: - lastInput &= ~KEY_FIRE; - break; - } - break; - - case WM_ERASEBKGND: - return 1; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_DESTROY: - lastInput=0; - DestroyGame(); - PostQuitMessage( 0 ); - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static BOOL initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - BOOL rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, "DONUTS_ICON"); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "DonutsClass"; - rc = RegisterClass( &wc ); - if( !rc ) - { - return FALSE; - } - - hWndMain = CreateWindowEx(0, // WS_EX_TOPMOST, - "DonutsClass", - "Donuts", - WS_VISIBLE | // so we don't have to call ShowWindow - WS_POPUP | // non-app window - WS_SYSMENU, // so we get an icon in the tray - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - hInstance, - NULL ); - - if( !hWndMain ) - { - return FALSE; - } - - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow ) -{ - MSG msg; - - while( lpCmdLine[0] == '-' ) - { - lpCmdLine++; - - switch (*lpCmdLine++) - { - case 'e': - bUseEmulation = TRUE; - break; - case 't': - bTest = TRUE; - break; - case 'S': - bWantSound = FALSE; - break; - case 'x': - bStress= TRUE; - bTest = TRUE; - break; - } - while( IS_SPACE(*lpCmdLine) ) - { - lpCmdLine++; - } - } - - ScreenX = getint(&lpCmdLine, 640); - ScreenY = getint(&lpCmdLine, 480); - ScreenBpp = getint(&lpCmdLine, 8); - - if( !initApplication(hInstance, nCmdShow) ) - { - return FALSE; - } - - if( !InitializeGame() ) - { - DestroyWindow( hWndMain ); - return FALSE; - } - - dwFrameTime = timeGetTime(); - - while( 1 ) - { - if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( !GetMessage( &msg, NULL, 0, 0 ) ) - { - return msg.wParam; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else if ( bIsActive ) - { - UpdateFrame(); - } - else - { - WaitMessage(); - } - } -} /* WinMain */ - - -void DestroyGame( void ) -{ -} - -BOOL InitializeGame( void ) -{ - DDCAPS ddcaps; - HRESULT ddrval; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; -#ifdef NT_HACK - DDSURFACEDESC DDSurfDesc; -#endif - - score = 0; - if( bTest ) - ShowLevelCount = 1000; - - if( bUseEmulation ) - ddrval = DirectDrawCreate( (LPVOID) DDCREATE_EMULATIONONLY, &lpDD, NULL ); - else - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - - if( ddrval != DD_OK ) - return CleanupAndExit("DirectDrawCreate Failed!"); - - ddrval = lpDD->lpVtbl->SetCooperativeLevel( lpDD, hWndMain, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if( ddrval != DD_OK ) - return CleanupAndExit("SetCooperativeLevel Failed"); - - #ifdef NT_HACK - DDSurfDesc.dwSize = sizeof(DDSurfDesc); - ddrval = lpDD->lpVtbl->GetDisplayMode(lpDD,&DDSurfDesc); - if(ddrval == DD_OK) - ScreenBpp = DDSurfDesc.ddpfPixelFormat.dwRGBBitCount; - #endif - - // set the mode - ddrval = lpDD->lpVtbl->SetDisplayMode( lpDD, ScreenX, ScreenY, ScreenBpp ); - if( ddrval != DD_OK ) - return CleanupAndExit("SetDisplayMode Failed!"); - - // check the color key hardware capabilities - dwTransType = DDBLTFAST_SRCCOLORKEY; - ddcaps.dwSize = sizeof( ddcaps ); - -#ifdef DEBUG - if( GetProfileInt( "Donuts", "force_dest_blt", 0) ) - { - dwTransType = DDBLTFAST_DESTCOLORKEY; - } - bHELBlt = GetProfileInt( "Donuts", "force_HEL_blt", bHELBlt ); -#endif - - // Create surfaces - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpFrontBuffer, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface FrontBuffer Failed!"); - - // get a pointer to the back buffer - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = lpFrontBuffer->lpVtbl->GetAttachedSurface( - lpFrontBuffer, - &ddscaps, - &lpBackBuffer ); - if( ddrval != DD_OK ) - return CleanupAndExit("GetAttachedDurface Failed!"); - - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; -#ifdef DEBUG - if( bHELBlt ) - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; -#endif - ddsd.dwWidth = 320; - ddsd.dwHeight = 384; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpDonut, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface lpDonut Failed!"); - - ddsd.dwHeight = 128; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpPyramid, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface lpPyramid Failed!"); - - ddsd.dwHeight = 32; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpCube, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface lpCube Failed!"); - - ddsd.dwHeight = 32; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpSphere, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface lpSphere Failed!"); - // Set the background color fill color - - ddsd.dwHeight = 256; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpShip, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface lpShip Failed!"); - - ddsd.dwHeight = 16; - ddrval = lpDD->lpVtbl->CreateSurface( lpDD, &ddsd, &lpNum, NULL ); - if( ddrval != DD_OK ) - return CleanupAndExit("CreateSurface lpNum Failed!"); - - if( !RestoreSurfaces() ) - return CleanupAndExit("RestoreSurfaces Failed!"); - - DL.next = DL.prev = &DL; // null display list - DL.type = OBJ_SHIP; - DL.surf = lpShip; - lastTickCount = GetTickCount(); - -#ifdef USE_DSOUND - if(bWantSound) - { - InitializeSound(); - } -#endif - if(bTest) - { - ProgramState = PS_ACTIVE; - setup_game(); - } - else - { - ProgramState = PS_SPLASH; - } - return TRUE; -} - -BOOL CleanupAndExit( char *err) -{ -#ifdef DEBUG - wsprintf(DebugBuf, "___CleanupAndExit err = %s\n", err ); - OutputDebugString( DebugBuf ); -#endif - - // make the cursor visible - SetCursor(LoadCursor( NULL, IDC_ARROW )); - bMouseVisible = TRUE; - - if( lpDonut != NULL ) - lpDonut->lpVtbl->Release( lpDonut ); - - if( lpPyramid != NULL ) - lpPyramid->lpVtbl->Release( lpPyramid ); - - if( lpCube != NULL ) - lpCube->lpVtbl->Release( lpCube ); - - if( lpSphere != NULL ) - lpSphere->lpVtbl->Release( lpSphere ); - - if( lpShip != NULL ) - lpShip->lpVtbl->Release( lpShip ); - - if( lpNum != NULL ) - lpNum->lpVtbl->Release( lpNum ); - - if( lpFrontBuffer != NULL ) - lpFrontBuffer->lpVtbl->Release( lpFrontBuffer ); - - if( lpArtPalette != NULL ) - lpArtPalette->lpVtbl->Release( lpArtPalette ); - - if( lpSplashPalette != NULL ) - lpSplashPalette->lpVtbl->Release( lpSplashPalette ); - - if( lpDD != NULL ) - lpDD->lpVtbl->Release( lpDD ); - - // - // warn user if there is one - // - - if( !bStress ) - { - MessageBox( hWndMain, err, "ERROR", MB_OK ); - } - return FALSE; -} - -void bltSplash( void ) -{ - HRESULT ddrval; - HBITMAP hbm; - - // set the palette before loading the splash screen - lpFrontBuffer->lpVtbl->SetPalette( lpFrontBuffer, lpSplashPalette ); - - hbm = (HBITMAP)LoadImage( GetModuleHandle( NULL ), "SPLASH", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - if ( NULL == hbm ) - return; - - // if the surface is lost, DDCopyBitmap will fail and the surface will - // be restored in FlipScreen. - ddrval = DDCopyBitmap( lpBackBuffer, hbm, 0, 0, 0, 0 ); - - DeleteObject( hbm ); - - FlipScreen(); -} - -#ifdef USE_DSOUND -// -// play a sound, but first set the panning according to where the -// object is on the screen. fake 3D sound. -// -void playPanned(HSNDOBJ hSO, DBLNODE *object) -{ - IDirectSoundBuffer *pDSB = SndObjGetFreeBuffer(hSO); - - if(!bWantSound) - return; // No sound our Work is done - - if (pDSB) - { - switch(ScreenX) - { - case 320: - IDirectSoundBuffer_SetPan(pDSB, (LONG)((20000.0 * - ((object->dst.right + object->dst.left) / 2) / 320.0) - 10000.0)); - break; - case 640: - IDirectSoundBuffer_SetPan(pDSB, (LONG)((20000.0 * - ((object->dst.right + object->dst.left) / 2) / 640.0) - 10000.0)); - break; - case 1024: - IDirectSoundBuffer_SetPan(pDSB, (LONG)((20000.0 * - ((object->dst.right + object->dst.left) / 2) / 1024.0) - 10000.0)); - break; - case 1280: - IDirectSoundBuffer_SetPan(pDSB, (LONG)((20000.0 * - ((object->dst.right + object->dst.left) / 2) / 1280.0) - 10000.0)); - break; - } - - IDirectSoundBuffer_Play(pDSB, 0, 0, 0); - } -} -#endif - -void UpdateFrame( void ) -{ - switch( ProgramState ) - { - case PS_SPLASH: - // display the splash screen - bltSplash(); - return; - case PS_ACTIVE: - UpdateDisplayList(); - CheckForHits(); - DrawDisplayList(); - if ( isDisplayListEmpty() ) - { -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjStop(hsoEngineIdle); - SndObjStop(hsoEngineRev); - } -#endif - bPlayIdle = FALSE; - bPlayRev = FALSE; - lastThrust = lastShield = FALSE; - ProgramState = PS_BEGINREST; - restCount = GetTickCount(); - initLevel( ++level ); - } - return; - case PS_BEGINREST: -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjPlay(hsoBeginLevel, 0); - } -#endif - ProgramState = PS_REST; - // - // FALLTHRU - // - case PS_REST: - if( ( GetTickCount() - restCount ) > ShowLevelCount ) - { -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjPlay(hsoEngineIdle, DSBPLAY_LOOPING); - } -#endif - bPlayIdle = TRUE; - lastTickCount = GetTickCount(); - ProgramState = PS_ACTIVE; - } - else - { - DisplayLevel(); - } - return; - } -} - -void DisplayLevel( void ) -{ - char buf[10]; - - EraseScreen(); - buf[0] = 10 + '0'; - buf[1] = 11 + '0'; - buf[2] = 12 + '0'; - buf[3] = 11 + '0'; - buf[4] = 10 + '0'; - buf[5] = '\0'; - bltScore( buf, ScreenX/2-64, ScreenY/2-8 ); - buf[0] = level / 100 + '0'; - buf[1] = level / 10 + '0'; - buf[2] = level % 10 + '0'; - buf[3] = '\0'; - bltScore( buf, ScreenX/2+22, ScreenY/2-8 ); - FlipScreen(); -} - -void bltScore( char *num, int x, int y ) -{ - char *c; - RECT src; - int i; - HRESULT ddrval; - - for(c=num; *c != '\0'; c++) - { - while( 1 ) - { - i = *c - '0'; - src.left = i*16; - src.top = 0; - src.right = src.left + 16; - src.bottom = src.top + 16; - ddrval = lpBackBuffer->lpVtbl->BltFast( lpBackBuffer, x, y, lpNum, &src, dwTransType ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if( !RestoreSurfaces() ) - return; - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - x += 16; - } -} - -void CheckForHits( void ) -{ - LPDBLNODE bullet, target, save; - int frame, x, y, l, t; - BOOL hit; - - // update screen rects - target = &DL; - do - { - frame = (DWORD)target->frame; - switch( target->type ) - { - case OBJ_DONUT: - target->dst.left = (DWORD)target->posx; - target->dst.top = (DWORD)target->posy; - target->dst.right = target->dst.left + 64; - target->dst.bottom = target->dst.top + 64; - target->src.left = 64 * (frame % 5); - target->src.top = 64 * (frame /5); - target->src.right = target->src.left + 64; - target->src.bottom = target->src.top + 64; - break; - case OBJ_PYRAMID: - target->dst.left = (DWORD)target->posx; - target->dst.top = (DWORD)target->posy; - target->dst.right = target->dst.left + 32; - target->dst.bottom = target->dst.top + 32; - target->src.left = 32 * (frame % 10); - target->src.top = 32 * (frame /10); - target->src.right = target->src.left + 32; - target->src.bottom = target->src.top + 32; - break; - case OBJ_SPHERE: - target->dst.left = (DWORD)target->posx; - target->dst.top = (DWORD)target->posy; - target->dst.right = target->dst.left + 16; - target->dst.bottom = target->dst.top + 16; - target->src.left = 16 * (frame % 20); - target->src.top = 16 * (frame /20); - target->src.right = target->src.left + 16; - target->src.bottom = target->src.top + 16; - break; - case OBJ_CUBE: - target->dst.left = (DWORD)target->posx; - target->dst.top = (DWORD)target->posy; - target->dst.right = target->dst.left + 16; - target->dst.bottom = target->dst.top + 16; - target->src.left = 16 * (frame % 20); - target->src.top = 16 * (frame /20); - target->src.right = target->src.left + 16; - target->src.bottom = target->src.top + 16; - break; - case OBJ_SHIP: - target->dst.left = (DWORD)target->posx; - target->dst.top = (DWORD)target->posy; - target->dst.right = target->dst.left + 32; - target->dst.bottom = target->dst.top + 32; - if( lastShield ) - target->src.top = 32 * (frame / 10) + 128; - else - target->src.top = 32 * (frame /10); - target->src.left = 32 * (frame % 10); - target->src.right = target->src.left + 32; - target->src.bottom = target->src.top + 32; - break; - case OBJ_BULLET: - frame = (DWORD)target->frame/20 % 4; - target->dst.left = (DWORD)target->posx; - target->dst.top = (DWORD)target->posy; - target->dst.right = target->dst.left + 3; - target->dst.bottom = target->dst.top + 3; - target->src.left = BULLET_X + frame*4; - target->src.top = BULLET_Y; - target->src.right = target->src.left + 3; - target->src.bottom = target->src.top + 3; - break; - } - target = target->next; - } - while( target != &DL ); - - bullet=&DL; - do - { - hit = FALSE; - if((bullet->type != OBJ_BULLET) && (bullet != &DL)) - { - bullet = bullet->next; - continue; - } - - x = (bullet->dst.left + bullet->dst.right) / 2; - y = (bullet->dst.top + bullet->dst.bottom) / 2; - for(target=DL.next; target != &DL; target = target->next) - { - if( ( target->type != OBJ_DONUT ) && - ( target->type != OBJ_PYRAMID ) && - ( target->type != OBJ_SPHERE ) && - ( target->type != OBJ_CUBE ) ) - continue; - - if( (x >= target->dst.left) && - (x < target->dst.right) && - (y >= target->dst.top) && - (y < target->dst.bottom) ) - { - if ((bullet != &DL) || !lastShield) - { - // the bullet hit the target - switch( target->type ) - { - case OBJ_DONUT: -#ifdef USE_DSOUND - if(bWantSound) - { - playPanned(hsoDonutExplode, target); - } -#endif - addObject( OBJ_PYRAMID, target->dst.left, - target->dst.top, -1.0, -1.0 ); - addObject( OBJ_PYRAMID, target->dst.left, - target->dst.top, -1.0, -1.0 ); - addObject( OBJ_PYRAMID, target->dst.left, - target->dst.top, -1.0, -1.0 ); - score += 10; - break; - case OBJ_PYRAMID: -#ifdef USE_DSOUND - if(bWantSound) - { - playPanned(hsoPyramidExplode, target); - } -#endif - addObject( OBJ_SPHERE, target->dst.left, - target->dst.top, -1.0, -1.0 ); - addObject( OBJ_CUBE, target->dst.left, - target->dst.top, -1.0, -1.0 ); - addObject( OBJ_CUBE, target->dst.left, - target->dst.top, -1.0, -1.0 ); - score += 20; - break; - case OBJ_CUBE: -#ifdef USE_DSOUND - if(bWantSound) - { - playPanned(hsoCubeExplode, target); - } -#endif - addObject( OBJ_SPHERE, target->dst.left, - target->dst.top, -1.0, -1.0 ); - addObject( OBJ_SPHERE, target->dst.left, - target->dst.top, -1.0, -1.0 ); - break; - score += 40; - case OBJ_SPHERE: -#ifdef USE_DSOUND - if(bWantSound) - { - playPanned(hsoSphereExplode, target); - } -#endif - score += 20; - } - - l = target->dst.left; - t = target->dst.top; - DeleteFromList( target ); - } - - hit = TRUE; - } - - if( hit ) - { - if( bullet == &DL ) - { - hit = FALSE; - if (!lastShield && !showDelay && !bTest) - { -#ifdef USE_DSOUND - if(bWantSound) - { - playPanned(hsoShipExplode, bullet); - } -#endif - score -= 150; - if (score < 0) - score = 0; - - addObject( OBJ_SPHERE, l, t, -1.0, -1.0 ); - addObject( OBJ_SPHERE, l, t, -1.0, -1.0 ); - addObject( OBJ_SPHERE, l, t, -1.0, -1.0 ); - addObject( OBJ_SPHERE, l, t, -1.0, -1.0 ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - addObject( OBJ_BULLET, l, t, - randDouble( -0.5, 0.5 ), randDouble( -0.5, 0.5 ) ); - initShip(TRUE); - } - } - - break; - } - } - - if( hit ) - { - save = bullet; - bullet = bullet->next; - - DeleteFromList( save ); - } - else - { - bullet = bullet->next; - } - - } while (bullet != &DL); -} - -void EraseScreen( void ) -{ - DDBLTFX ddbltfx; - HRESULT ddrval; - - if( bSpecialEffects ) // cool looking screen with no colorfill - return; - - // Erase the background - ddbltfx.dwSize = sizeof( ddbltfx ); - ddbltfx.dwFillColor = dwFillColor; - while( 1 ) - { - ddrval = lpBackBuffer->lpVtbl->Blt( lpBackBuffer, NULL, NULL, - NULL, DDBLT_COLORFILL, &ddbltfx ); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if( !RestoreSurfaces() ) - return; - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } -} - -void FlipScreen( void ) -{ - HRESULT ddrval; - - // Flip the surfaces - while( 1 ) - { - ddrval = lpFrontBuffer->lpVtbl->Flip( lpFrontBuffer, NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if( !RestoreSurfaces() ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } -} - -void DrawDisplayList( void ) -{ - LPDBLNODE this; - LPDBLNODE last; - HRESULT ddrval; - char scorebuf[11]; - int rem; - - // blt everything in reverse order if we are doing destination transparency - // calculate score string - scorebuf[0] = score/10000000 + '0'; - rem = score % 10000000; - scorebuf[1] = rem/1000000 + '0'; - rem = score % 1000000; - scorebuf[2] = rem/100000 + '0'; - rem = score % 100000; - scorebuf[3] = rem/10000 + '0'; - rem = score % 10000; - scorebuf[4] = rem/1000 + '0'; - rem = score % 1000; - scorebuf[5] = rem/100 + '0'; - rem = score % 100; - scorebuf[6] = rem/10 + '0'; - rem = score % 10; - scorebuf[7] = rem + '0'; -#ifdef USE_DSOUND - if( bSoundEnabled ) - { - scorebuf[8] = 14 + '0'; - scorebuf[9] = 13 + '0'; - scorebuf[10] = '\0'; - } - else -#endif - { - scorebuf[8] = '\0'; - } - - EraseScreen(); - if( dwTransType == DDBLTFAST_DESTCOLORKEY ) - { - bltScore(scorebuf, 10, ScreenY-26); - - if( bShowFrameCount ) - DisplayFrameRate(); - - this = DL.next; // start with the topmost bitmap - last = DL.next; // don't blt it twice - - if (showDelay) - last = &DL; - } - else - { - this = &DL; // start with the bottommost bitmap (the ship) - last = &DL; // don't blt it twice - - if (showDelay) - this = this->prev; - } - - do - { - while( 1 ) - { - ddrval = lpBackBuffer->lpVtbl->BltFast( lpBackBuffer, this->dst.left, this->dst.top, this->surf, &(this->src), dwTransType ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if( !RestoreSurfaces() ) - return; - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - if( dwTransType != DDBLTFAST_DESTCOLORKEY ) - { - this = this->prev; - } - else - { - this = this->next; - } - } - while( this != last ); - - if( dwTransType != DDBLTFAST_DESTCOLORKEY ) - { - bltScore(scorebuf, 10, ScreenY-26); - - if( bShowFrameCount ) - DisplayFrameRate(); - } - - FlipScreen(); -} - -void DisplayFrameRate( void ) -{ - DWORD time2; - char buff[256]; - - dwFrameCount++; - time2 = timeGetTime() - dwFrameTime; - if( time2 > 1000 ) - { - dwFrames = (dwFrameCount*1000)/time2; - dwFrameTime = timeGetTime(); - dwFrameCount = 0; - } - if( dwFrames == 0 ) - { - return; - } - - if (dwFrames != dwFramesLast) - { - dwFramesLast = dwFrames; - } - - if( dwFrames > 99 ) - { - dwFrames = 99; - } - buff[0] = (char)((dwFrames / 10) + '0'); - buff[1] = (char)((dwFrames % 10) + '0'); - buff[2] = '\0'; - bltScore(buff, ScreenX/2-25, 10); -} - -void DeleteFromList( LPDBLNODE this ) -{ - this->next->prev = this->prev; - this->prev->next = this->next; - LocalFree( this ); -} - -void UpdateDisplayList( void ) -{ - LPDBLNODE this; - LPDBLNODE save; - DWORD thisTickCount = GetTickCount(); - DWORD tickDiff = thisTickCount - lastTickCount; - double maxx, maxy; - double maxframe; - DWORD input = lastInput; - BOOL event = FALSE; - - if( bTest ) - { - input |= (KEY_RIGHT | KEY_FIRE); - } - lastTickCount = thisTickCount; - - if (showDelay) - { - showDelay -= (int)tickDiff; - if (showDelay < 0) - { - showDelay = 0; - lastShield = FALSE; - initShip( FALSE ); - } - } - - // update the ship - if( !showDelay ) - { - DL.posx += DL.velx * (double)tickDiff; - DL.posy += DL.vely * (double)tickDiff; - } - if( DL.posx > MAX_SHIP_X ) - { - DL.posx = MAX_SHIP_X; - DL.velx = -DL.velx; - event = TRUE; - } - else if ( DL.posx < 0 ) - { - DL.posx =0; - DL.velx = -DL.velx; - event = TRUE; - } - if( DL.posy > MAX_SHIP_Y ) - { - DL.posy = MAX_SHIP_Y; - DL.vely = -DL.vely; - event = TRUE; - } - else if ( DL.posy < 0 ) - { - DL.posy =0; - DL.vely = -DL.vely; - event = TRUE; - } - if (event) - { -#ifdef USE_DSOUND - if(bWantSound) - { - playPanned(hsoShipBounce, &DL); - } -#endif - event = FALSE; - } - - if ((event = (showDelay || ((input & KEY_SHIELD) == KEY_SHIELD))) != - lastShield) - { - if (event && !showDelay) - { -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjPlay(hsoShieldBuzz, DSBPLAY_LOOPING); - } -#endif - bPlayBuzz = TRUE; - } - else - { -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjStop(hsoShieldBuzz); - } -#endif - bPlayBuzz = FALSE; - } - lastShield = event; - } - if (event) - { - input &= ~(KEY_FIRE); - } - - if (input & KEY_FIRE) - { - if( !showDelay ) - { - // add a bullet to the scene - score--; - if(score < 0) - score = 0; - -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjPlay(hsoFireBullet, 0); - } -#endif - addObject( OBJ_BULLET, Dirx[(int)DL.frame]*6.0 + 16.0 + DL.posx, - Diry[(int)DL.frame]*6.0 + 16.0 + DL.posy, - Dirx[(int)DL.frame]*500.0/1000.0, - Diry[(int)DL.frame]*500.0/1000.0 ); - } - } - - event = FALSE; - if( input & KEY_LEFT ) - { - DL.frame -= 1.0; - if( DL.frame < 0.0 ) - DL.frame += MAX_SHIP_FRAME; - } - if( input & KEY_RIGHT ) - { - DL.frame += 1.0; - if( DL.frame >= MAX_SHIP_FRAME) - DL.frame -= MAX_SHIP_FRAME; - } - if( input & KEY_UP ) - { - DL.velx += Dirx[(int)DL.frame] * 10.0/1000.0; - DL.vely += Diry[(int)DL.frame] * 10.0/1000.0; - event = TRUE; - } - if( input & KEY_DOWN ) - { - DL.velx -= Dirx[(int)DL.frame] * 10.0/1000.0; - DL.vely -= Diry[(int)DL.frame] * 10.0/1000.0; - event = TRUE; - } - - if (event != lastThrust) - { - if (event) - { - input &= ~KEY_STOP; -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjStop(hsoSkidToStop); - SndObjPlay(hsoEngineRev, DSBPLAY_LOOPING); - } -#endif - bPlayRev = TRUE; - } - else - { -#ifdef USE_DSOUND - if(bWantSound) - { - SndObjStop(hsoEngineRev); - } -#endif - bPlayRev = FALSE; - } - - lastThrust = event; - } - - if( input & KEY_STOP ) - { -#ifdef USE_DSOUND - if(bWantSound) - { - if (DL.velx || DL.vely) - playPanned(hsoSkidToStop, &DL); - } -#endif - - DL.velx = 0; - DL.vely = 0; - } - - this = DL.next; - do - { - this->posx += this->velx * (double)tickDiff; - this->posy += this->vely * (double)tickDiff; - this->frame += this->delay * (double)tickDiff; - switch( this->type ) - { - case OBJ_DONUT: - maxx = (double)MAX_DONUT_X; - maxy = (double)MAX_DONUT_Y; - maxframe = (double)MAX_DONUT_FRAME; - break; - case OBJ_PYRAMID: - maxx = (double)MAX_PYRAMID_X; - maxy = (double)MAX_PYRAMID_Y; - maxframe = (double)MAX_PYRAMID_FRAME; - break; - case OBJ_SPHERE: - maxx = (double)MAX_SPHERE_X; - maxy = (double)MAX_SPHERE_Y; - maxframe = (double)MAX_SPHERE_FRAME; - break; - case OBJ_CUBE: - maxx = (double)MAX_CUBE_X; - maxy = (double)MAX_CUBE_Y; - maxframe = (double)MAX_CUBE_FRAME; - break; - case OBJ_BULLET: - maxx = (double)MAX_BULLET_X; - maxy = (double)MAX_BULLET_Y; - maxframe = (double)MAX_BULLET_FRAME; - if( this->frame >= (double)MAX_BULLET_FRAME ) - { - save = this; - this = this->next; - DeleteFromList( save ); - continue; - } - break; - } - if( this != &DL ) - { - if( this->posx > maxx ) - { - this->posx = maxx; - this->velx = -this->velx; - } - else if ( this->posx < 0 ) - { - this->posx =0; - this->velx = -this->velx; - } - if( this->posy > maxy ) - { - this->posy = maxy; - this->vely = -this->vely; - } - else if ( this->posy < 0 ) - { - this->posy =0; - this->vely = -this->vely; - } - if( this->frame >= maxframe ) - { - this->frame -= maxframe; - } - this = this->next; - } - } - while( this != &DL ); -} - -BOOL isDisplayListEmpty( void ) -{ - LPDBLNODE ptr; - - for(ptr=DL.next; ptr != &DL; ptr = ptr->next) - { - if(ptr->type != OBJ_BULLET) - return FALSE; - } - return TRUE; -} - -void initShip( BOOL delay ) -{ - DL.posx = (double)(ScreenX/2-16); // center the ship - DL.posy = (double)(ScreenY/2-16); - DL.frame = 0.0; - if( bTest ) - { - DL.velx = 0.25; - DL.vely = 0.5; - } - else - { - DL.velx = DL.vely = 0.0; // not moving - } - if( !bTest && delay ) - showDelay = DEF_SHOW_DELAY; -} - -void initLevel( int level ) -{ - int i; - - // clear any stray bullets out of the display list - while( DL.next != &DL ) - { - DeleteFromList( DL.next ); - } - for(i=0; i<(2*level-1); i++) - { - addObject( OBJ_DONUT, -1.0, -1.0, -1.0, -1.0 ); - } - initShip(TRUE); -} - -void addObject( SHORT type, double x, double y, double vx, double vy ) -{ - LPDBLNODE new; - - new = (LPDBLNODE) LocalAlloc( LPTR, sizeof( DBLNODE ) ); - if( new == NULL) - return; - - new->type = type; - switch( type ) - { - case OBJ_DONUT: - if( x < 0.0) // no position specified? - { - new->posx = randDouble( 0.0, (double)MAX_DONUT_X ); - new->posy = randDouble( 0.0, (double)MAX_DONUT_Y ); - } - else - { - new->posx = x; - new->posy = y; - } - new->velx = randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->vely = randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->frame = randDouble( 0, 30 ); - new->delay = 30.0*randDouble( 0.1, 0.4 )/1000.0; - new->surf = lpDonut; - linkObject( new ); - break; - case OBJ_PYRAMID: - if( x < 0) // no position specified? - { - new->posx = randDouble( 0.0, (double)MAX_PYRAMID_X ); - new->posy = randDouble( 0.0, (double)MAX_PYRAMID_Y ); - } - else - { - new->posx = x; - new->posy = y; - } - new->velx = 1.5*randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->vely = 1.5*randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->frame = randDouble( 0, 30 ); - new->delay = 40.0*randDouble( 0.3, 1.0 )/1000.0; - new->surf = lpPyramid; - linkObject( new ); - break; - case OBJ_SPHERE: - if( x < 0) // no position specified? - { - new->posx = randDouble( 0.0, (double)MAX_SPHERE_X ); - new->posy = randDouble( 0.0, (double)MAX_SPHERE_Y ); - } - else - { - new->posx = x; - new->posy = y; - } - new->velx = 3.0*randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->vely = 3.0*randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->frame = randDouble( 0, 30 ); - new->delay = 40.0*randDouble( 1.5, 2.0 )/1000.0; - new->surf = lpSphere; - linkObject( new ); - break; - case OBJ_CUBE: - if( x < 0) // no position specified? - { - new->posx = randDouble( 0.0, (double)MAX_CUBE_X ); - new->posy = randDouble( 0.0, (double)MAX_CUBE_Y ); - } - else - { - new->posx = x; - new->posy = y; - } - new->velx = 4.0*randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->vely = 4.0*randDouble( -50.0/1000.0, 50.0/1000.0 ); - new->frame = randDouble( 0, 30 ); - new->delay = 40.0*randDouble( 0.8, 2.0 )/1000.0; - new->surf = lpCube; - linkObject( new ); - break; - case OBJ_BULLET: - new->posx = x; - new->posy = y; - new->velx = vx; - new->vely = vy; - new->frame = 0.0; - new->delay = 1.0; - new->surf = lpNum; - linkObject( new ); - break; - } -} - -void linkObject( LPDBLNODE new ) -{ - new->next = DL.next; - new->prev = &DL; - DL.next->prev = new; - DL.next = new; -} - -void linkLastObject( LPDBLNODE new ) -{ - new->prev = DL.prev; - new->next = &DL; - DL.prev->next = new; - DL.prev = new; -} - - -BOOL RestoreSurfaces( void ) -{ - HRESULT ddrval; - HBITMAP hbm; - - ddrval = lpFrontBuffer->lpVtbl->Restore(lpFrontBuffer); - if( ddrval != DD_OK ) - return FALSE; - ddrval = lpDonut->lpVtbl->Restore(lpDonut); - if( ddrval != DD_OK ) - return FALSE; - ddrval = lpPyramid->lpVtbl->Restore(lpPyramid); - if( ddrval != DD_OK ) - return FALSE; - ddrval = lpCube->lpVtbl->Restore(lpCube); - if( ddrval != DD_OK ) - return FALSE; - ddrval = lpSphere->lpVtbl->Restore(lpSphere); - if( ddrval != DD_OK ) - return FALSE; - ddrval = lpShip->lpVtbl->Restore(lpShip); - if( ddrval != DD_OK ) - return FALSE; - ddrval = lpNum->lpVtbl->Restore(lpNum); - if( ddrval != DD_OK ) - return FALSE; - - // Create and set the palette for the splash bitmap - lpSplashPalette = DDLoadPalette( lpDD, "SPLASH" ); - if( NULL == lpSplashPalette ) - return CleanupAndExit("DDLoadPalette SPLASH"); - - // Create and set the palette for the art bitmap - lpArtPalette = DDLoadPalette( lpDD, "DONUTS8" ); - if( NULL == lpArtPalette ) - return CleanupAndExit("DDLoadPalette DONUTS"); - - // set the palette before loading the art - lpFrontBuffer->lpVtbl->SetPalette( lpFrontBuffer, lpArtPalette ); - - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "DONUTS8", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - - ddrval = DDCopyBitmap( lpDonut, hbm, 0, 0, 320, 384 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - // NOTE: Why are we calling LoadImage again? StretchBlt (which is - // called in DDCopyBitmap) does not work properly when performing - // an 8-bpp to 24- or 32-bpp blt multiple times from the same - // bitmap. The workaround is to call LoadImage before each - // StretchBlt because the first StretchBlt after a LoadImage will - // work. - if(ScreenBpp >= 24) - { - DeleteObject( hbm ); - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "DONUTS8", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - } - - ddrval = DDCopyBitmap( lpPyramid, hbm, 0, 384, 320, 128 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - if(ScreenBpp >= 24) - { - DeleteObject( hbm ); - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "DONUTS8", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - } - - ddrval = DDCopyBitmap( lpSphere, hbm, 0, 512, 320, 32 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - if(ScreenBpp >= 24) - { - DeleteObject( hbm ); - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "DONUTS8", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - } - - ddrval = DDCopyBitmap( lpCube, hbm, 0, 544, 320, 32 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - if(ScreenBpp >= 24) - { - DeleteObject( hbm ); - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "DONUTS8", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - } - - ddrval = DDCopyBitmap( lpShip, hbm, 0, 576, 320, 256 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - if(ScreenBpp >= 24) - { - DeleteObject( hbm ); - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), "DONUTS8", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - } - - ddrval = DDCopyBitmap( lpNum, hbm, 0, 832, 320, 16 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - DeleteObject( hbm ); - - // set colorfill colors and color keys according to bitmap contents - dwFillColor = DDColorMatch( lpDonut, CLR_INVALID ); - - DDSetColorKey( lpDonut, CLR_INVALID ); - DDSetColorKey( lpPyramid, CLR_INVALID ); - DDSetColorKey( lpCube, CLR_INVALID ); - DDSetColorKey( lpSphere, CLR_INVALID ); - DDSetColorKey( lpShip, CLR_INVALID ); - DDSetColorKey( lpNum, CLR_INVALID ); - - return TRUE; -} - - -int randInt( int low, int high ) -{ - int range = high - low; - int num = rand() % range; - return( num + low ); -} - -double randDouble( double low, double high ) -{ - double range = high - low; - double num = range * (double)rand()/(double)RAND_MAX; - return( num + low ); -} - -#ifdef USE_DSOUND -void InitializeSound( void ) -{ - if(!bWantSound) - return; // out of here - bSoundEnabled = FALSE; - if (SUCCEEDED(DirectSoundCreate(NULL, &lpDS, NULL))) - { - if (SUCCEEDED(lpDS->lpVtbl->SetCooperativeLevel(lpDS, hWndMain, - DSSCL_NORMAL))) - { - hsoBeginLevel = SndObjCreate(lpDS, "BeginLevel", 1); - hsoEngineIdle = SndObjCreate(lpDS, "EngineIdle", 1); - hsoEngineRev = SndObjCreate(lpDS, "EngineRev", 1); - hsoSkidToStop = SndObjCreate(lpDS, "SkidToStop", 1); - hsoShieldBuzz = SndObjCreate(lpDS, "ShieldBuzz", 1); - hsoShipExplode = SndObjCreate(lpDS, "ShipExplode", 1); - hsoFireBullet = SndObjCreate(lpDS, "Gunfire", 25); - hsoShipBounce = SndObjCreate(lpDS, "ShipBounce", 4); - hsoDonutExplode = SndObjCreate(lpDS, "DonutExplode", 10); - hsoPyramidExplode = SndObjCreate(lpDS, "PyramidExplode", 12); - hsoCubeExplode = SndObjCreate(lpDS, "CubeExplode", 15); - hsoSphereExplode = SndObjCreate(lpDS, "SphereExplode", 10); - bSoundEnabled = TRUE; - -//#ifdef USE_DSOUND this should be dead code Josephc - if( bPlayIdle ) - SndObjPlay(hsoEngineIdle, DSBPLAY_LOOPING); - - if( bPlayBuzz ) - SndObjPlay(hsoShieldBuzz, DSBPLAY_LOOPING); - - if( bPlayRev ) - SndObjPlay(hsoEngineRev, DSBPLAY_LOOPING); -//#endif - } - else - { - lpDS->lpVtbl->Release(lpDS); - lpDS = NULL; - } - } -} - -void DestroySound( void ) -{ - if(!bWantSound) - return; //No work to be done - bSoundEnabled = FALSE; - if (lpDS) - { - SndObjDestroy(hsoBeginLevel); - hsoBeginLevel = NULL; - SndObjDestroy(hsoEngineIdle); - hsoEngineIdle = NULL; - SndObjDestroy(hsoEngineRev); - hsoEngineRev = NULL; - SndObjDestroy(hsoSkidToStop); - hsoSkidToStop = NULL; - SndObjDestroy(hsoShieldBuzz); - hsoShieldBuzz = NULL; - SndObjDestroy(hsoShipExplode); - hsoShipExplode = NULL; - SndObjDestroy(hsoFireBullet); - hsoFireBullet = NULL; - SndObjDestroy(hsoShipBounce); - hsoShipBounce = NULL; - SndObjDestroy(hsoDonutExplode); - hsoDonutExplode = NULL; - SndObjDestroy(hsoPyramidExplode); - hsoPyramidExplode = NULL; - SndObjDestroy(hsoCubeExplode); - hsoCubeExplode = NULL; - SndObjDestroy(hsoSphereExplode); - hsoSphereExplode = NULL; - - lpDS->lpVtbl->Release(lpDS); - lpDS = NULL; - } -} -#endif - -int getint(char**p, int def) -{ - int i=0; - - - while (IS_SPACE(**p)) - (*p)++; - - if (!IS_NUM(**p)) - return def; - - while (IS_NUM(**p)) - i = i*10 + *(*p)++ - '0'; - - while (IS_SPACE(**p)) - (*p)++; - - return i; -} - diff --git a/sdk/samples/donuts/donuts.h b/sdk/samples/donuts/donuts.h deleted file mode 100644 index 351155f..0000000 --- a/sdk/samples/donuts/donuts.h +++ /dev/null @@ -1,238 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: donuts.h - * Content: main include file - * - * - ***************************************************************************/ - -#ifndef DONUTS_INCLUDED -#define DONUTS_INCLUDED - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#ifdef USE_DSOUND -#include -#endif -#include -#include -#include -#include "resource.h" -#include "ddutil.h" -#ifdef USE_DSOUND -#include "dsutil.h" -#endif - -#define DEF_SHOW_DELAY (2000) - -#define IS_NUM(c) ((c) >= '0' && (c) <= '9') -#define IS_SPACE(c) ((c) == ' ' || (c) == '\r' || (c) == '\n' || (c) == '\t' || (c) == 'x') - - -/* - * keyboard commands - */ - -#define KEY_STOP 0x00000001l -#define KEY_DOWN 0x00000002l -#define KEY_LEFT 0x00000004l -#define KEY_RIGHT 0x00000008l -#define KEY_UP 0x00000010l -#define KEY_FIRE 0x00000020l -#define KEY_THROW 0x00000040l -#define KEY_SHIELD 0x00000080l - -enum -{ - OBJ_DONUT = 0, - OBJ_PYRAMID, - OBJ_CUBE, - OBJ_SPHERE, - OBJ_SHIP, - OBJ_BULLET -}; - - -// program states -enum -{ - PS_SPLASH, - PS_ACTIVE, - PS_BEGINREST, - PS_REST -}; - -#define MAX_SCREEN_X (ScreenX-1) -#define MAX_SCREEN_Y (ScreenY-1) -#define MAX_DONUT_X MAX_SCREEN_X - 64 -#define MAX_DONUT_Y MAX_SCREEN_Y - 64 -#define MAX_DONUT_FRAME 30 -#define MAX_PYRAMID_X MAX_SCREEN_X - 32 -#define MAX_PYRAMID_Y MAX_SCREEN_Y - 32 -#define MAX_PYRAMID_FRAME 40 -#define MAX_SPHERE_X MAX_SCREEN_X - 16 -#define MAX_SPHERE_Y MAX_SCREEN_Y - 16 -#define MAX_SPHERE_FRAME 40 -#define MAX_CUBE_X MAX_SCREEN_X - 16 -#define MAX_CUBE_Y MAX_SCREEN_Y - 16 -#define MAX_CUBE_FRAME 40 -#define MAX_SHIP_X MAX_SCREEN_X - 32 -#define MAX_SHIP_Y MAX_SCREEN_Y - 32 -#define MAX_SHIP_FRAME 40 -#define MAX_BULLET_X MAX_SCREEN_X - 3; -#define MAX_BULLET_Y MAX_SCREEN_Y - 3; -#define MAX_BULLET_FRAME 400 - - -// Offsets for the bullet bitmap -#define BULLET_X 304 -#define BULLET_Y 0 - - -/* - * structures - */ - -/* - * DBLNODE - a node in a generic doubly-linked list - */ -typedef struct _DBLNODE -{ - struct _DBLNODE FAR *next; // link to next node - struct _DBLNODE FAR *prev; // link to previous node - SHORT type; // type of object - double posx, posy; // actual x and y position - double velx, vely; // x and y velocity (pixels/millisecond) - double frame; // current frame - double delay; // frame/millisecond - RECT src, dst; // source and destination rects - LPDIRECTDRAWSURFACE surf; // surface containing bitmap -} DBLNODE; -typedef DBLNODE FAR *LPDBLNODE; - -double Dirx[40] = -{ - 0.000000, - 0.156434, - 0.309017, - 0.453991, - 0.587785, - 0.707107, - 0.809017, - 0.891007, - 0.951057, - 0.987688, - 1.000000, - 0.987688, - 0.951057, - 0.891007, - 0.809017, - 0.707107, - 0.587785, - 0.453990, - 0.309017, - 0.156434, - 0.000000, - -0.156435, - -0.309017, - -0.453991, - -0.587785, - -0.707107, - -0.809017, - -0.891007, - -0.951057, - -0.987688, - -1.000000, - -0.987688, - -0.951056, - -0.891006, - -0.809017, - -0.707107, - -0.587785, - -0.453990, - -0.309017, - -0.156434 -}; - -double Diry[40] = -{ - -1.000000, - -0.987688, - -0.951057, - -0.891007, - -0.809017, - -0.707107, - -0.587785, - -0.453990, - -0.309017, - -0.156434, - 0.000000, - 0.156434, - 0.309017, - 0.453991, - 0.587785, - 0.707107, - 0.809017, - 0.891007, - 0.951057, - 0.987688, - 1.000000, - 0.987688, - 0.951057, - 0.891006, - 0.809017, - 0.707107, - 0.587785, - 0.453990, - 0.309017, - 0.156434, - 0.000000, - -0.156435, - -0.309017, - -0.453991, - -0.587785, - -0.707107, - -0.809017, - -0.891007, - -0.951057, - -0.987688 -}; - - -/* - * fn prototypes - */ -void DestroyGame( void ); -BOOL InitializeGame( void ); -void makeFontStuff( void ); -void UpdateFrame( void ); -BOOL CleanupAndExit( char *err ); -BOOL RestoreSurfaces( void ); -BOOL isDisplayListEmpty( void ); -void initShip( BOOL delay ); -void initLevel( int level ); -void addObject( SHORT type, double x, double y, double vx, double vy ); -void linkObject( LPDBLNODE new ); -void linkLastObject( LPDBLNODE new ); -void UpdateDisplayList( void ); -void DrawDisplayList( void ); -int randInt( int low, int high ); -double randDouble( double low, double high ); -void DeleteFromList( LPDBLNODE this ); -void CheckForHits( void ); -void bltScore( char *num, int x, int y ); -void DisplayFrameRate( void ); -void bltSplash( void ); -void EraseScreen( void ); -void FlipScreen( void ); -void DisplayLevel( void ); -void InitializeSound( void ); -void DestroySound( void ); - -#endif diff --git a/sdk/samples/donuts/donuts.ico b/sdk/samples/donuts/donuts.ico deleted file mode 100644 index 35cb7b8..0000000 Binary files a/sdk/samples/donuts/donuts.ico and /dev/null differ diff --git a/sdk/samples/donuts/donuts.rc b/sdk/samples/donuts/donuts.rc deleted file mode 100644 index 172295b..0000000 --- a/sdk/samples/donuts/donuts.rc +++ /dev/null @@ -1,20 +0,0 @@ -DONUTS_ICON ICON donuts.ico - -DONUTS8 BITMAP donuts.bmp -SPLASH BITMAP SPLASH.BMP - -BeginLevel WAV level.wav - -EngineIdle WAV hum.wav -EngineRev WAV rev.wav -SkidToStop WAV skid.wav -ShieldBuzz WAV shield.wav - -Gunfire WAV gunfire.wav -ShipBounce WAV bounce.wav -ShipExplode WAV bangbang.wav - -DonutExplode WAV d_bang.wav -PyramidExplode WAV p_bang.wav -CubeExplode WAV c_bang.wav -SphereExplode WAV s_bang.wav diff --git a/sdk/samples/donuts/gunfire.wav b/sdk/samples/donuts/gunfire.wav deleted file mode 100644 index 44b37b1..0000000 Binary files a/sdk/samples/donuts/gunfire.wav and /dev/null differ diff --git a/sdk/samples/donuts/hum.wav b/sdk/samples/donuts/hum.wav deleted file mode 100644 index dae8d35..0000000 Binary files a/sdk/samples/donuts/hum.wav and /dev/null differ diff --git a/sdk/samples/donuts/level.wav b/sdk/samples/donuts/level.wav deleted file mode 100644 index f2b171c..0000000 Binary files a/sdk/samples/donuts/level.wav and /dev/null differ diff --git a/sdk/samples/donuts/makefile b/sdk/samples/donuts/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/donuts/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/donuts/msvc.mk b/sdk/samples/donuts/msvc.mk deleted file mode 100644 index 5b4b8a0..0000000 --- a/sdk/samples/donuts/msvc.mk +++ /dev/null @@ -1,40 +0,0 @@ -NAME = donuts -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib dsound.lib - -OBJS = donuts.obj dsutil.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/donuts/p_bang.wav b/sdk/samples/donuts/p_bang.wav deleted file mode 100644 index 46fbc71..0000000 Binary files a/sdk/samples/donuts/p_bang.wav and /dev/null differ diff --git a/sdk/samples/donuts/readme.txt b/sdk/samples/donuts/readme.txt deleted file mode 100644 index 8766b50..0000000 --- a/sdk/samples/donuts/readme.txt +++ /dev/null @@ -1,54 +0,0 @@ -Space Donuts Sample Game ------------------- - -This game demonstrates many of the features of DirectDraw. It will take -advantage of hardware acceleration if it is supported by the driver. - -Roids defaults to 640x480 at 256 colors. You may specify a different -resolution and pixel depth on the command line (roids 800x600x16). - -This program requires less than 1 Meg of video ram. However, all of its -art may not fit in the vram on a 1 Meg rectangular memory card. - -The commands which this game recognizes are listed on the opening screen. - - ESC, F12 - Quit - NUMPAD 4 - Turn left - NUMPAD 6 - Turn right - NUMPAD 5 - Stop moving - NUMPAD 8 - Accelerate forward - NUMPAD 2 - Accelerate backward - SPACEBAR - Fire - NUMPAD 7 - Shield - ENTER - Starts game - F5 - toggle frame rate display - F3 - toggle audio - F1 - toggle cheesy trails effect - -Command line switches: - - -e - Use emulation, not hardware acceleration - -t - Test mode. Runs game for you. - -x - Stress mode. Never halt if you can help it. - -S - turn off sound - - These switches may be followed by three option numbers representing: - X resolution - Y resolution - Bits per pixel - - - -Sound code ----------- - -The sound code in this application is deliberately designed -to be stressful. For example, each bullet on the screen uses a different -sound buffer. Over 70 sound buffers are created (including duplicates) -and 20-25 may be playing at any time. This could be made much more -efficient, but we wanted code to stress our API and mixer. - -The sounds are implemented using the helper functions in dsutil.h and -dsutil.c (found in the sdk\samples\misc directory). These helper -functions may help you to add sound to your application quickly and -easily. diff --git a/sdk/samples/donuts/resource.h b/sdk/samples/donuts/resource.h deleted file mode 100644 index 5d93f5b..0000000 --- a/sdk/samples/donuts/resource.h +++ /dev/null @@ -1 +0,0 @@ -#define DONUTS_ICON 101 diff --git a/sdk/samples/donuts/rev.wav b/sdk/samples/donuts/rev.wav deleted file mode 100644 index 6b81b2a..0000000 Binary files a/sdk/samples/donuts/rev.wav and /dev/null differ diff --git a/sdk/samples/donuts/s_bang.wav b/sdk/samples/donuts/s_bang.wav deleted file mode 100644 index ed1efb1..0000000 Binary files a/sdk/samples/donuts/s_bang.wav and /dev/null differ diff --git a/sdk/samples/donuts/shield.wav b/sdk/samples/donuts/shield.wav deleted file mode 100644 index 25eb74f..0000000 Binary files a/sdk/samples/donuts/shield.wav and /dev/null differ diff --git a/sdk/samples/donuts/skid.wav b/sdk/samples/donuts/skid.wav deleted file mode 100644 index de0ea3d..0000000 Binary files a/sdk/samples/donuts/skid.wav and /dev/null differ diff --git a/sdk/samples/donuts/splash.bmp b/sdk/samples/donuts/splash.bmp deleted file mode 100644 index 355cd5e..0000000 Binary files a/sdk/samples/donuts/splash.bmp and /dev/null differ diff --git a/sdk/samples/dplaunch/dplaunch.c b/sdk/samples/dplaunch/dplaunch.c deleted file mode 100644 index f1c3c45..0000000 --- a/sdk/samples/dplaunch/dplaunch.c +++ /dev/null @@ -1,582 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1996 Microsoft Corporation. All Rights Reserved. - * - * File: dplaunch.c - * Content: Implementation of a DirectPlay launching utility - * - ***************************************************************************/ - -#define INITGUID -#define WIN32_LEAN_AND_MEAN - -#include -#include -#include -#include - -#include "dplay.h" -#include "dplobby.h" - -#include "resource.h" - -// maximum size of a string name -#define NAMEMAX 200 - -// service provider information -typedef struct { - GUID guidServiceProvider; // guid of service provider - GUID guidAddressType; // address type required by service provider -} SPINFO, *LPSPINFO; - -typedef struct { - HWND hWnd; - LPDIRECTPLAYLOBBYA lpDPLobbyA; -} ENUMINFO, *LPENUMINFO; - -// GUID for sessions this application creates -// {D559FC00-DC12-11cf-9C4E-00A0C905425E} -DEFINE_GUID(MY_SESSION_GUID, -0xd559fc00, 0xdc12, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e); - -// prototypes -BOOL CALLBACK LauncherWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -HRESULT InitializeLauncherWindow(HWND hWnd, LPDIRECTPLAYLOBBYA *lplpDPlayLobby); -void DestroyLauncherWindow(HWND hWnd, LPDIRECTPLAYLOBBYA lpDPlayLobby); -void LaunchDirectPlayApplication(HWND hWnd, LPDIRECTPLAYLOBBYA lpDPlayLobby); - - -// --------------------------------------------------------------------------- -// WinMain -// --------------------------------------------------------------------------- -// Description: Main windows entry point. -// Arguments: -// HINSTANCE [in] Standard windows stuff -// HINSTANCE [in] -// LPSTR [in] -// int [in] -// Returns: -// int -int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - return DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_LAUNCHERDIALOG), NULL, LauncherWndProc, (LPARAM) hInstance); -} - - -// --------------------------------------------------------------------------- -// LauncherWndProc -// --------------------------------------------------------------------------- -// Description: Message callback function for Launcher dialog. -// Arguments: -// HWND [in] Dialog window handle. -// UINT [in] Window message identifier. -// WPARAM [in] Depends on message. -// LPARAM [in] Depends on message. -// Returns: -// BOOL TRUE if message was processed internally. -BOOL CALLBACK LauncherWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - static HINSTANCE hInst; - static LPDIRECTPLAYLOBBYA lpDPlayLobby; - HRESULT hr; - - switch(uMsg) - { - case WM_INITDIALOG: - // Save the instance handle - hInst = (HINSTANCE)lParam; - - // Initialize dialog with launcher information - lpDPlayLobby = NULL; - hr = InitializeLauncherWindow(hWnd, &lpDPlayLobby); - break; - - case WM_DESTROY: - // Destroy launcher information in dialog - DestroyLauncherWindow(hWnd, lpDPlayLobby); - - // Return failure - EndDialog(hWnd, FALSE); - - break; - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDC_RUNAPPBUTTON: - // get settings and launch application - LaunchDirectPlayApplication(hWnd, lpDPlayLobby); - - break; - - case IDCANCEL: - // Return failure - EndDialog(hWnd, TRUE); - - break; - } - - break; - } - - // Allow for default processing - return FALSE; -} - -// --------------------------------------------------------------------------- -// EnumApp -// --------------------------------------------------------------------------- -// Description: Enumeration callback called by DirectPlay. -// Enumerates the applications registered with DirectPlay. -// Arguments: -// LPDPLAPPINFO [in] information about the application -// LPVOID [in] user-defined context -// DWORD [in] flags -// Returns: -// BOOL TRUE to continue enumerating -BOOL FAR PASCAL EnumApp(LPCDPLAPPINFO lpAppInfo, LPVOID lpContext, DWORD dwFlags) -{ - HWND hWnd = lpContext; - LRESULT iIndex; - LPGUID lpGuid; - - // store application name in combo box - iIndex = SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_ADDSTRING, 0, (LPARAM) lpAppInfo->lpszAppNameA); - if (iIndex == LB_ERR) - goto Failure; - - // make space for application GUID - lpGuid = (LPGUID) GlobalAllocPtr(GHND, sizeof(GUID)); - if (lpGuid == NULL) - goto Failure; - - // store pointer to GUID in combo box - *lpGuid = lpAppInfo->guidApplication; - SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) lpGuid); - -Failure: - return (TRUE); -} - -// --------------------------------------------------------------------------- -// EnumAddressType -// --------------------------------------------------------------------------- -// Description: Enumeration callback called by DirectPlayLobby. -// Enumerates the address types supported by the -// given Service Provider. -// Arguments: -// REFGUID [in] GUID of the address type -// LPVOID [in] user-defined context -// DWORD [in] flags -// Returns: -// BOOL FALSE to stop enumerating after the first callback -BOOL FAR PASCAL EnumAddressType(REFGUID guidAddressType, LPVOID lpContext, - DWORD dwFlags) -{ - LPGUID lpguidAddr = (LPGUID)lpContext; - - - // Save the address type guid in the pointer - *lpguidAddr = *guidAddressType; - - // Note: It is possible that some Service Providers will contain more - // than one address type. We are only using the first address type - // returned in this sample. A good application should save all - // address types. - return FALSE; -} - - -// --------------------------------------------------------------------------- -// EnumSP -// --------------------------------------------------------------------------- -// Description: Enumeration callback called by DirectPlay. -// Enumerates service providers registered with DirectPlay. -// Arguments: -// LPGUID [in] GUID of service provider -// LPTSTR [in] name of service provider -// DWORD [in] major version of DirectPlay -// DWORD [in] minor version of DirectPlay -// LPVOID [in] user-defined context -// Returns: -// BOOL TRUE to continue enumerating -BOOL FAR PASCAL EnumSP(LPGUID lpGuid, LPTSTR lptszDesc, DWORD dwMajorVersion, - DWORD dwMinorVersion, LPVOID lpContext) -{ - LPENUMINFO lpEnumInfo = (LPENUMINFO)lpContext; - LPDIRECTPLAYLOBBYA lpDPLobbyA = lpEnumInfo->lpDPLobbyA; - HWND hWnd = lpEnumInfo->hWnd; - HRESULT hr; - LRESULT iIndex; - LPSPINFO lpSPInfo; - - // store service provider name in combo box - iIndex = SendDlgItemMessage(hWnd, IDC_SPCOMBO, CB_ADDSTRING, 0, (LPARAM) lptszDesc); - if (iIndex == LB_ERR) - goto Failure; - - // make space for service provider info - lpSPInfo = (LPSPINFO) GlobalAllocPtr(GHND, sizeof(SPINFO)); - if (lpSPInfo == NULL) - goto Failure; - - // Initialize the guid to GUID_NULL in case it has no address types - memset(lpSPInfo, 0, sizeof(SPINFO)); - - // store service provider GUID and address type in combo box - lpSPInfo->guidServiceProvider = *lpGuid; - - // Get the address type for the Service Provider - hr = lpDPLobbyA->lpVtbl->EnumAddressTypes(lpDPLobbyA, - (LPDPLENUMADDRESSTYPESCALLBACK)EnumAddressType, - lpGuid, &lpSPInfo->guidAddressType, 0L); - - SendDlgItemMessage(hWnd, IDC_SPCOMBO, CB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) lpSPInfo); - -Failure: - return (TRUE); -} - -// --------------------------------------------------------------------------- -// InitializeLauncherWindow -// --------------------------------------------------------------------------- -// Description: Initializes the window for the Launcher. -// Arguments: -// HWND [in] Window handle. -// LPDIRECTPLAYLOBBYA [out] IDirectPlayLobby interface. -// Returns: -// HRESULT any errors initializing the window -HRESULT InitializeLauncherWindow(HWND hWnd, LPDIRECTPLAYLOBBYA *lplpDPlayLobby) -{ - LPDIRECTPLAYLOBBYA lpDPlayLobbyA = NULL; - ENUMINFO EnumInfo; - HRESULT hr; - - // get a ANSI DirectPlay lobby interface - hr = DirectPlayLobbyCreate(NULL, &lpDPlayLobbyA, NULL, NULL, 0); - if FAILED(hr) - goto Failure; - - // put all the DirectPlay applications in a combo box - lpDPlayLobbyA->lpVtbl->EnumLocalApplications(lpDPlayLobbyA, EnumApp, hWnd, 0); - - // setup the EnumInfo structure - EnumInfo.hWnd = hWnd; - EnumInfo.lpDPLobbyA = lpDPlayLobbyA; - - // put all the service providers in a combo box - DirectPlayEnumerate(EnumSP, &EnumInfo); - - // initialize the controls - SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_SETCURSEL, (WPARAM) 0, 0); - SendDlgItemMessage(hWnd, IDC_SPCOMBO, CB_SETCURSEL, (WPARAM) 0, 0); - SendDlgItemMessage(hWnd, IDC_HOSTRADIO, BM_SETCHECK, (WPARAM) BST_CHECKED, 0); - - // return the ANSI lobby interface - *lplpDPlayLobby = lpDPlayLobbyA; - - return (DP_OK); - -Failure: - - return (hr); -} - -// --------------------------------------------------------------------------- -// DestroyLauncherWindow -// --------------------------------------------------------------------------- -// Description: Destroys the launcher window. -// Arguments: -// HWND [in] Window handle. -// LPDIRECTPLAYLOBBYA [in] DirectPlay Lobby interface to destroy -// Returns: -// Nothing -void DestroyLauncherWindow(HWND hWnd, LPDIRECTPLAYLOBBYA lpDPlayLobby) -{ - WPARAM index; - LRESULT lpData; - - // destroy the GUID's stored with each app name - index = 0; - while (TRUE) - { - lpData = SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_GETITEMDATA, (WPARAM) index, 0); - if ((lpData == CB_ERR) || (lpData == 0)) - break; - - GlobalFreePtr((LPVOID) lpData); - index += 1; - } - - // destroy the GUID's stored with each service provider name - index = 0; - while (TRUE) - { - lpData = SendDlgItemMessage(hWnd, IDC_SPCOMBO, CB_GETITEMDATA, (WPARAM) index, 0); - if ((lpData == CB_ERR) || (lpData == 0)) - break; - - GlobalFreePtr((LPVOID) lpData); - index += 1; - } - - // release the lobby interface - if (lpDPlayLobby) - lpDPlayLobby->lpVtbl->Release(lpDPlayLobby); -} - -// --------------------------------------------------------------------------- -// CreateAddress -// --------------------------------------------------------------------------- -// Description: Wrapper for the IDirectPlayLobby::CreateAddress() method. -// Arguments: -// LPDIRECTPLAYLOBBYA [in] DirectPlay Lobby interface to use -// LPGUID [in] GUID of servicer provider to create address for -// LPGUID [in] GUID of address data type -// LPSTR [in] string to use as address data -// LPVOID* [out] pointer to return address in -// LPDWORD [out] pointer to return address size in -// Returns: -// HRESULT any error creating the address -HRESULT CreateAddress(LPDIRECTPLAYLOBBYA lpDPlayLobby, - LPGUID lpguidServiceProvider, - LPGUID lpguidAddressType, LPSTR lpszAddressText, - LPVOID *lplpAddress, LPDWORD lpdwAddressSize) -{ - LPVOID lpAddress = NULL; - DWORD dwAddressSize = 0; - HRESULT hr; - - // check for invalid address types - if (IsEqualGUID(lpguidAddressType, &GUID_NULL)) - return (DPERR_INVALIDPARAM); - - // see how much room is needed to store this address - hr = lpDPlayLobby->lpVtbl->CreateAddress(lpDPlayLobby, lpguidServiceProvider, - lpguidAddressType, lpszAddressText, strlen(lpszAddressText) + 1, - NULL, &dwAddressSize); - if (hr != DPERR_BUFFERTOOSMALL) - goto Failure; - - // allocate space - lpAddress = GlobalAllocPtr(GHND, dwAddressSize); - if (lpAddress == NULL) - { - hr = DPERR_NOMEMORY; - goto Failure; - } - - // create the address - hr = lpDPlayLobby->lpVtbl->CreateAddress(lpDPlayLobby, lpguidServiceProvider, - lpguidAddressType, lpszAddressText, strlen(lpszAddressText) + 1, - lpAddress, &dwAddressSize); - if FAILED(hr) - goto Failure; - - // return the address info - *lplpAddress = lpAddress; - *lpdwAddressSize = dwAddressSize; - - return (DP_OK); - -Failure: - if (lpAddress) - GlobalFreePtr(lpAddress); - - return (hr); -} - -// --------------------------------------------------------------------------- -// RunApplication -// --------------------------------------------------------------------------- -// Description: Wrapper for the IDirectPlayLobby::RunApplication() method. -// Arguments: -// LPDIRECTPLAYLOBBYA [in] DirectPlay Lobby interface to use -// LPGUID [in] GUID of application to launch -// LPGUID [in] GUID of session to host with -// LPSTR [in] GUID of service provider to connect with -// LPVOID [in] service-provider address to connect to -// DWORD [in] length of address -// LPSTR [in] name of session to host -// LPSTR [in] name of our player -// BOOL [in] TRUE to host session, FALSE to join -// Returns: -// HRESULT any error running the application -HRESULT RunApplication(LPDIRECTPLAYLOBBYA lpDPlayLobby, - LPGUID lpguidApplication, - LPGUID lpguidInstance, - LPGUID lpguidServiceProvider, - LPVOID lpAddress, - DWORD dwAddressSize, - LPSTR lpszSessionName, - LPSTR lpszPlayerName, - BOOL bHostSession) -{ - DWORD appID; - DPSESSIONDESC2 sessionInfo; - DPNAME playerName; - DPLCONNECTION connectInfo; - HRESULT hr; - - if (lpDPlayLobby == NULL) - return (DPERR_NOINTERFACE); - - // fill out session description - ZeroMemory(&sessionInfo, sizeof(DPSESSIONDESC2)); - sessionInfo.dwSize = sizeof(DPSESSIONDESC2); // Size of structure - sessionInfo.dwFlags = 0; // DPSESSION_xxx flags - sessionInfo.guidInstance = *lpguidInstance; // ID for the session instance - sessionInfo.guidApplication = *lpguidApplication;// GUID of the DirectPlay application. - sessionInfo.dwMaxPlayers = 0; // Maximum # players allowed in session - sessionInfo.dwCurrentPlayers = 0; // Current # players in session (read only) - sessionInfo.lpszSessionNameA = lpszSessionName; // ANSI name of the session - sessionInfo.lpszPasswordA = NULL; // ANSI password of the session (optional) - sessionInfo.dwReserved1 = 0; // Reserved for future MS use. - sessionInfo.dwReserved2 = 0; - sessionInfo.dwUser1 = 0; // For use by the application - sessionInfo.dwUser2 = 0; - sessionInfo.dwUser3 = 0; - sessionInfo.dwUser4 = 0; - - // fill out player name - ZeroMemory(&playerName, sizeof(DPNAME)); - playerName.dwSize = sizeof(DPNAME); // Size of structure - playerName.dwFlags = 0; // Not used. Must be zero. - playerName.lpszShortNameA = lpszPlayerName; // ANSI short or friendly name - playerName.lpszLongNameA = lpszPlayerName; // ANSI long or formal name - - // fill out connection description - ZeroMemory(&connectInfo, sizeof(DPLCONNECTION)); - connectInfo.dwSize = sizeof(DPLCONNECTION); // Size of this structure - if (bHostSession) - connectInfo.dwFlags = DPLCONNECTION_CREATESESSION; // Create a new session - else - connectInfo.dwFlags = DPLCONNECTION_JOINSESSION; // Join existing session - connectInfo.lpSessionDesc = &sessionInfo; // Pointer to session desc to use on connect - connectInfo.lpPlayerName = &playerName; // Pointer to Player name structure - connectInfo.guidSP = *lpguidServiceProvider; // GUID of the DPlay SP to use - connectInfo.lpAddress = lpAddress; // Address for service provider - connectInfo.dwAddressSize = dwAddressSize; // Size of address data - - // launch and connect the game - hr = lpDPlayLobby->lpVtbl->RunApplication(lpDPlayLobby, - 0, // Flags - &appID, // App ID - &connectInfo, // Connection data - NULL); // Connect event - return (hr); -} - -// --------------------------------------------------------------------------- -// LaunchDirectPlayApplication -// --------------------------------------------------------------------------- -// Description: Gathers information from the dialog and runs the application. -// Arguments: -// HWND [in] Window handle. -// LPDIRECTPLAYLOBBYA [in] DirectPlay Lobby interface to use -// Returns: -// Nothing -void LaunchDirectPlayApplication(HWND hWnd, LPDIRECTPLAYLOBBYA lpDPlayLobby) -{ - GUID guidApplication, guidSession, guidServiceProvider, guidAddressType; - LPSTR lpPlayerName, lpSessionName; - LPVOID lpAddress = NULL; - DWORD dwAddressSize; - LPSPINFO lpSPInfo; - char strPlayerName[NAMEMAX], strSessionName[NAMEMAX], strAddressText[NAMEMAX]; - LRESULT iApp, iSP, iHost; - HRESULT hr; - - SetDlgItemText(hWnd, IDC_STATUSEDIT, "Launching..."); - - // get guid of application to launch - iApp = SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_GETCURSEL, (WPARAM) 0, 0); - if (iApp == CB_ERR) - goto Failure; - - iApp = SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_GETITEMDATA, (WPARAM) iApp, 0); - if ((iApp == CB_ERR) || (iApp == 0)) - goto Failure; - - guidApplication = *((LPGUID) iApp); - - // get info for service provider to use for the connection - iSP = SendDlgItemMessage(hWnd, IDC_SPCOMBO, CB_GETCURSEL, (WPARAM) 0, 0); - if (iSP == CB_ERR) - goto Failure; - - iSP = SendDlgItemMessage(hWnd, IDC_SPCOMBO, CB_GETITEMDATA, (WPARAM) iSP, 0); - if ((iSP == CB_ERR) || (iSP == 0)) - goto Failure; - - lpSPInfo = (LPSPINFO) iSP; - guidServiceProvider = lpSPInfo->guidServiceProvider; // GUID of service provider - guidAddressType = lpSPInfo->guidAddressType; // address type required by service provider - - // get guid of session to create. - guidSession = MY_SESSION_GUID; - - // get name of our player - GetDlgItemText(hWnd, IDC_PLAYEREDIT, strPlayerName, NAMEMAX); - lpPlayerName = strPlayerName; - - // get host vs. join flag - iHost = SendDlgItemMessage(hWnd, IDC_HOSTRADIO, BM_GETCHECK, (WPARAM) 0, 0); - if (iHost == BST_CHECKED) - { - iHost = TRUE; // we are hosting a session - lpAddress = NULL; // don't need an address to host - dwAddressSize = 0; - - // get name of session - GetDlgItemText(hWnd, IDC_SESSIONEDIT, strSessionName, NAMEMAX); - lpSessionName = strSessionName; - } - else - { - iHost = FALSE; // we are joining an existing session - lpSessionName = NULL; // don't need a session name if we are joining - - lpAddress = NULL; // assume we don't need address data - dwAddressSize = 0; - - // the service provider supports address data - if (!IsEqualGUID(&guidAddressType, &GUID_NULL)) - { - // get service-provider specific address data as a string - GetDlgItemText(hWnd, IDC_ADDRESSEDIT, strAddressText, NAMEMAX); - - // convert string to a DirectPlay address - hr = CreateAddress(lpDPlayLobby, &guidServiceProvider, - &guidAddressType, strAddressText, - &lpAddress, &dwAddressSize); - } - } - - // launch the application - hr = RunApplication(lpDPlayLobby, - &guidApplication, - &guidSession, - &guidServiceProvider, - lpAddress, dwAddressSize, - lpSessionName, lpPlayerName, - iHost); - if FAILED(hr) - goto Failure; - - SetDlgItemText(hWnd, IDC_STATUSEDIT, "Launch successful"); - - if (lpAddress) - GlobalFreePtr(lpAddress); - return; - -Failure: - if (lpAddress) - GlobalFreePtr(lpAddress); - - SetDlgItemText(hWnd, IDC_STATUSEDIT, "Launch failed"); - - return; -} - diff --git a/sdk/samples/dplaunch/dplaunch.mak b/sdk/samples/dplaunch/dplaunch.mak deleted file mode 100644 index 053ff5f..0000000 --- a/sdk/samples/dplaunch/dplaunch.mak +++ /dev/null @@ -1,216 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -!IF "$(CFG)" == "" -CFG=dplaunch - Win32 Debug -!MESSAGE No configuration specified. Defaulting to dplaunch - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "dplaunch - Win32 Release" && "$(CFG)" !=\ - "dplaunch - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "dplaunch.mak" CFG="dplaunch - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "dplaunch - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "dplaunch - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "dplaunch - Win32 Debug" -RSC=rc.exe -MTL=mktyplib.exe -CPP=cl.exe - -!IF "$(CFG)" == "dplaunch - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\dplaunch.exe" - -CLEAN : - -@erase "$(INTDIR)\dplaunch.obj" - -@erase "$(INTDIR)\dplaunch.res" - -@erase "$(OUTDIR)\dplaunch.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/dplaunch.pch" /YX /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -RSC_PROJ=/l 0x409 /fo"$(INTDIR)/dplaunch.res" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/dplaunch.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib uuid.lib dplayx.lib /nologo /subsystem:windows /machine:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib uuid.lib dplayx.lib /nologo\ - /subsystem:windows /incremental:no /pdb:"$(OUTDIR)/dplaunch.pdb" /machine:I386\ - /out:"$(OUTDIR)/dplaunch.exe" -LINK32_OBJS= \ - "$(INTDIR)\dplaunch.obj" \ - "$(INTDIR)\dplaunch.res" - -"$(OUTDIR)\dplaunch.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "dplaunch - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "dplaunch" -# PROP BASE Intermediate_Dir "dplaunch" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\dplaunch.exe" - -CLEAN : - -@erase "$(INTDIR)\dplaunch.obj" - -@erase "$(INTDIR)\dplaunch.res" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\dplaunch.exe" - -@erase "$(OUTDIR)\dplaunch.ilk" - -@erase "$(OUTDIR)\dplaunch.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/dplaunch.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -RSC_PROJ=/l 0x409 /fo"$(INTDIR)/dplaunch.res" /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/dplaunch.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib uuid.lib dplayx.lib /nologo /subsystem:windows /debug /machine:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib uuid.lib dplayx.lib /nologo\ - /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)/dplaunch.pdb" /debug\ - /machine:I386 /out:"$(OUTDIR)/dplaunch.exe" -LINK32_OBJS= \ - "$(INTDIR)\dplaunch.obj" \ - "$(INTDIR)\dplaunch.res" - -"$(OUTDIR)\dplaunch.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -# Name "dplaunch - Win32 Release" -# Name "dplaunch - Win32 Debug" - -!IF "$(CFG)" == "dplaunch - Win32 Release" - -!ELSEIF "$(CFG)" == "dplaunch - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\dplaunch.c -DEP_CPP_DPLAU=\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dplobby.h"\ - - -"$(INTDIR)\dplaunch.obj" : $(SOURCE) $(DEP_CPP_DPLAU) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\dplaunch.rc - -"$(INTDIR)\dplaunch.res" : $(SOURCE) "$(INTDIR)" - $(RSC) $(RSC_PROJ) $(SOURCE) - - -# End Source File -# End Target -# End Project -################################################################################ diff --git a/sdk/samples/dplaunch/dplaunch.rc b/sdk/samples/dplaunch/dplaunch.rc deleted file mode 100644 index e8fb5fc..0000000 --- a/sdk/samples/dplaunch/dplaunch.rc +++ /dev/null @@ -1,159 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_LAUNCHERDIALOG DIALOGEX 0, 0, 253, 170 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "DirectPlay Launcher" -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - COMBOBOX IDC_APPCOMBO,84,8,162,70,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_SPCOMBO,84,26,162,90,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_PLAYEREDIT,84,44,162,14,ES_AUTOHSCROLL - EDITTEXT IDC_SESSIONEDIT,84,76,162,14,ES_AUTOHSCROLL - EDITTEXT IDC_ADDRESSEDIT,84,104,162,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "Run Application",IDC_RUNAPPBUTTON,188,129,58,14 - PUSHBUTTON "Quit",IDCANCEL,188,149,58,14 - CONTROL "Host session",IDC_HOSTRADIO,"Button",BS_AUTORADIOBUTTON, - 7,65,65,10 - CONTROL "Join session",IDC_JOINRADIO,"Button",BS_AUTORADIOBUTTON, - 7,93,54,10 - LTEXT "Application",IDC_STATIC,7,10,66,8 - LTEXT "Connection",IDC_STATIC,7,28,66,8 - LTEXT "Player name",IDC_STATIC,7,46,66,8 - LTEXT "Session name",IDC_STATIC,28,79,48,8 - LTEXT "Session address",IDC_STATIC,28,107,56,8 - LTEXT "Status",IDC_STATIC,7,132,21,8 - EDITTEXT IDC_STATUSEDIT,84,129,96,14,ES_AUTOHSCROLL | ES_READONLY -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_LAUNCHERDIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 246 - TOPMARGIN, 7 - BOTTOMMARGIN, 163 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Microsoft Corporation\0" - VALUE "FileDescription", "DirectPlay Launcher Utility\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "dplaunch\0" - VALUE "LegalCopyright", "Copyright © 1996\0" - VALUE "OriginalFilename", "dplaunch.exe\0" - VALUE "ProductName", "DirectPlay Launcher\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // !_MAC - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/dplaunch/makefile b/sdk/samples/dplaunch/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/dplaunch/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/dplaunch/makefile.wat b/sdk/samples/dplaunch/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/dplaunch/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/dplaunch/msvc.mk b/sdk/samples/dplaunch/msvc.mk deleted file mode 100644 index 3ed783f..0000000 --- a/sdk/samples/dplaunch/msvc.mk +++ /dev/null @@ -1,40 +0,0 @@ -NAME = dplaunch -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =libcmt.lib kernel32.lib user32.lib dplayx.lib\ - gdi32.lib uuid.lib libc.lib - -OBJS = dplaunch.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/dplaunch/readme.txt b/sdk/samples/dplaunch/readme.txt deleted file mode 100644 index 8d75f05..0000000 --- a/sdk/samples/dplaunch/readme.txt +++ /dev/null @@ -1,40 +0,0 @@ -DPLAUNCH --------- - -Sample application to demonstrate how to launch a DirectPlay application -using the IDirectPlayLobby::RunApplication function. - -Instructions: - -1) Choose which application to launch. This dropdown listbox uses - IDirectPlayLobby::EnumLocalApplications to see what applications - are available. -2) Choose which service provider to use. -3) Choose the player name for this machine -4) Choose either "Host Session" and supply a name for the session - - or - - Choose "Join Session" and supply the network address of the machine - that is hosting the session. IPX requires no network address, - Internet TCP/IP requires an IP address or machine name, modem requires - a phone number to call. -5) Click on "Run Application" - -Notes: - -- Make sure you use DPLAUNCH to launch an application on one machine - with the "Host Session" option first. Then launch the application - on other machines (using DPLAUNCH) with the same service provider using - the "Join Session" option and the network address of the host (if needed) - -- DPLAUNCH will only join sessions that were created using DPLAUNCH. The - reason is that the session instance GUID is hard coded in DPLAUNCH. - Normally, DirectPlay generates one (if the application was not lobbied) - or a lobby server generates one and passes it to the lobby clients. - -- A real lobby client would be an application similar to DPLAUNCH but it - would be communicating with some lobby server to obtain all the - parameters for the IDirectPlayLobby::RunApplication call. - -- DirectPlay 3 does not include any APIs specifically geared towards - implementing a lobby server. - diff --git a/sdk/samples/dplaunch/resource.h b/sdk/samples/dplaunch/resource.h deleted file mode 100644 index 71bc994..0000000 --- a/sdk/samples/dplaunch/resource.h +++ /dev/null @@ -1,26 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by dplaunch.rc -// -#define IDD_DIALOG1 101 -#define IDD_LAUNCHERDIALOG 102 -#define IDC_HOSTRADIO 1000 -#define IDC_JOINRADIO 1001 -#define IDC_APPCOMBO 1002 -#define IDC_SPCOMBO 1003 -#define IDC_ADDRESSEDIT 1004 -#define IDC_PLAYEREDIT 1005 -#define IDC_SESSIONEDIT 1006 -#define IDC_RUNAPPBUTTON 1007 -#define IDC_STATUSEDIT 1008 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/dplaunch/watcom.mk b/sdk/samples/dplaunch/watcom.mk deleted file mode 100644 index bd5d038..0000000 --- a/sdk/samples/dplaunch/watcom.mk +++ /dev/null @@ -1,32 +0,0 @@ -NAME = dplaunch -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS = ..\..\..\lib\dplayx.lbw - -OBJS = dplaunch.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/ds3dview/ds3dvi.h b/sdk/samples/ds3dview/ds3dvi.h deleted file mode 100644 index e1a1bd8..0000000 --- a/sdk/samples/ds3dview/ds3dvi.h +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************************************************ - - Direct3DRM and DirectSound 3D interface designed for the Viewer Sample Application - - (c) 1996 Microsoft Corporation - -************************************************************************************************************/ - -#ifndef ___DS3DVIEWER_INTERNAL -#define ___DS3DVIEWER_INTERNAL - -// "Internal" structure definitions and other include information used by -// the DS3DVIEW application. We put this stuff here so other modules can -// access it without great pain. - -// Info for the 3D3RM (RL info) -typedef struct _AppInfo -{ - // The parent frame - LPDIRECT3DRMFRAME scene; - // The frame for the camera (a child of the scene) - LPDIRECT3DRMFRAME camera; - - // Device for Windows - LPDIRECT3DRMDEVICE dev; - // Defines how the 3D scene is rendered into the 2D window - LPDIRECT3DRMVIEWPORT view; - - // Defines which color model (RGB/Ramp) is used for rendering - used when creating a device - // from the RL api - D3DRMCOLORMODEL model; - - // Whether or not the window is minimized (modified by the resizing handler) - BOOL bMinimized; -} AppInfo; - - - -/* -** Error Checking code -*/ -BOOL D3DRM_SUCCEED(HRESULT result, int force_critical = -1, char* info = NULL); -BOOL DS3D_SUCCEED(HRESULT result, int force_critical = -1, char* info = NULL); - - -/****** DirectSound3D Helper Stuff ************************************/ - -// Simple thing to copy vectors to each other independant of type -#define RLV_TO_DSV(in,out) out.x = in.x;\ - out.y = in.y;\ - out.z = in.z; - - -#endif - - - diff --git a/sdk/samples/ds3dview/ds3dview.def b/sdk/samples/ds3dview/ds3dview.def deleted file mode 100644 index 5b0c331..0000000 --- a/sdk/samples/ds3dview/ds3dview.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME DS3DVIEW - -DESCRIPTION 'Reality Lab Example Program (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/ds3dview/dsutil3d.c b/sdk/samples/ds3dview/dsutil3d.c deleted file mode 100644 index cfb3ad4..0000000 --- a/sdk/samples/ds3dview/dsutil3d.c +++ /dev/null @@ -1,519 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dsutil3d.c - * Content: Routines for dealing with sounds from resources -- this - * version has been modified and extended somewhat from the - * version found in the SAMPLES\MISC directory. - * - * - ***************************************************************************/ - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "dsound.h" - -typedef struct -{ - BYTE *pbWaveData; // pointer into wave resource (for restore) - DWORD cbWaveSize; // size of wave data (for restore) - int iAlloc; // number of buffers. - int iCurrent; // current buffer - IDirectSoundBuffer* Buffers[1]; // list of buffers - -} SNDOBJ, *HSNDOBJ; - -#define _HSNDOBJ_DEFINED -#include "dsutil3d.h" - -static const char c_szWAV[] = "WAV"; - -/////////////////////////////////////////////////////////////////////////////// -// -// DSLoadSoundBuffer - Loads a .WAV into a sound buffer and returns the sound buffer -// -/////////////////////////////////////////////////////////////////////////////// - -IDirectSoundBuffer *DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName) -{ - IDirectSoundBuffer *pDSB = NULL; - DSBUFFERDESC dsBD = {0}; - BYTE *pbWaveData; - void *pvBase; - - dsBD.dwSize = sizeof(dsBD); - dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY - | DSBCAPS_LOCSOFTWARE; - - if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) - { - if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) - { - if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) - { - IDirectSoundBuffer_Release(pDSB); - pDSB = NULL; - } - } - else - { - pDSB = NULL; - } - } else if (DSGetWaveFile(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, - &dsBD.dwBufferBytes, &pvBase)) - { - if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) - { - if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) - { - IDirectSoundBuffer_Release(pDSB); - pDSB = NULL; - } - } - else - { - pDSB = NULL; - } - UnmapViewOfFile (pvBase); - } - - return pDSB; -} - - -/////////////////////////////////////////////////////////////////////////////// -// -// DSLoad3DSoundBuffer - Loads a .WAV into a 3D sound buffer and returns the sound buffer -// -/////////////////////////////////////////////////////////////////////////////// - -IDirectSoundBuffer *DSLoad3DSoundBuffer(IDirectSound *pDS, LPCTSTR lpName) -{ - IDirectSoundBuffer *pDSB = NULL; - DSBUFFERDESC dsBD = {0}; - BYTE *pbWaveData; - void *pvBase; - - dsBD.dwSize = sizeof(dsBD); - dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME - | DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCSOFTWARE - | DSBCAPS_STICKYFOCUS; - - if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) - { - if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) - { - if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) - { - IDirectSoundBuffer_Release(pDSB); - pDSB = NULL; - } - } - else - { - pDSB = NULL; - } - } else if (DSGetWaveFile(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, - &dsBD.dwBufferBytes, &pvBase)) - { - if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) - { - if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) - { - IDirectSoundBuffer_Release(pDSB); - pDSB = NULL; - } - } - else - { - pDSB = NULL; - } - UnmapViewOfFile (pvBase); - } - - return pDSB; -} - - -/////////////////////////////////////////////////////////////////////////////// -// -// DSReloadSoundBuffer -// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName) -{ - BOOL result=FALSE; - BYTE *pbWaveData; - DWORD cbWaveSize; - void *pvBase; - - if (DSGetWaveResource(NULL, lpName, NULL, &pbWaveData, &cbWaveSize)) - { - if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB)) && - DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) - { - result = TRUE; - } - } else if( DSGetWaveFile(NULL, lpName, NULL, &pbWaveData, &cbWaveSize, &pvBase)) - { - if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB)) && - DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) - { - result = TRUE; - } - UnmapViewOfFile (pvBase); - } - - return result; -} - -/////////////////////////////////////////////////////////////////////////////// -// -// DSGetWaveResource -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pcbWaveSize) -{ - HRSRC hResInfo; - HGLOBAL hResData; - void * pvRes; - - if (((hResInfo = FindResource(hModule, lpName, c_szWAV)) != NULL) && - ((hResData = LoadResource(hModule, hResInfo)) != NULL) && - ((pvRes = LockResource(hResData)) != NULL) && - DSParseWaveResource(pvRes, ppWaveHeader, ppbWaveData, pcbWaveSize)) - { - return TRUE; - } - - return FALSE; - -} - - -/////////////////////////////////////////////////////////////////////////////// -// -// DSGetWaveFile -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSGetWaveFile(HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pcbWaveSize, - void **ppvBase) -{ - void *pvRes; - HANDLE hFile, hMapping; - - *ppvBase = NULL; - - hFile = CreateFile (lpName, GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, 0, NULL); - if (hFile == INVALID_HANDLE_VALUE) return FALSE; - - hMapping = CreateFileMapping (hFile, NULL, PAGE_READONLY, 0, 0, NULL); - if (hMapping == INVALID_HANDLE_VALUE) - { - CloseHandle (hFile); - return FALSE; - } - - CloseHandle (hFile); - - pvRes = MapViewOfFile (hMapping, FILE_MAP_READ, 0, 0, 0); - if (pvRes == NULL) - { - CloseHandle (hMapping); - return FALSE; - } - - CloseHandle (hMapping); - - if (DSParseWaveResource(pvRes, ppWaveHeader, ppbWaveData, pcbWaveSize) == FALSE) - { - UnmapViewOfFile (pvRes); - return FALSE; - } - - *ppvBase = pvRes; - return TRUE; -} - - -/////////////////////////////////////////////////////////////////////////////// -// SndObj fns -/////////////////////////////////////////////////////////////////////////////// - -SNDOBJ *SndObjCreate(IDirectSound *pDS, LPCTSTR lpName, int iConcurrent) -{ - SNDOBJ *pSO = NULL; - LPWAVEFORMATEX pWaveHeader; - BOOL fFound = FALSE; - BYTE *pbData; - UINT cbData; - void * pvBase; - - if (DSGetWaveResource(NULL, lpName, &pWaveHeader, &pbData, &cbData)) - fFound = TRUE; - if (DSGetWaveFile(NULL, lpName, &pWaveHeader, &pbData, &cbData, &pvBase)) - { - fFound = TRUE; - UnmapViewOfFile( pvBase ); - } - if( fFound ) - { - if (iConcurrent < 1) - iConcurrent = 1; - - if ((pSO = (SNDOBJ *)LocalAlloc(LPTR, sizeof(SNDOBJ) + - (iConcurrent-1) * sizeof(IDirectSoundBuffer *))) != NULL) - { - int i; - - pSO->iAlloc = iConcurrent; - pSO->pbWaveData = pbData; - pSO->cbWaveSize = cbData; - pSO->Buffers[0] = DSLoadSoundBuffer(pDS, lpName); - - for (i=1; iiAlloc; i++) - { - if (FAILED(IDirectSound_DuplicateSoundBuffer(pDS, - pSO->Buffers[0], &pSO->Buffers[i]))) - { - pSO->Buffers[i] = DSLoadSoundBuffer(pDS, lpName); - if (!pSO->Buffers[i]) { - SndObjDestroy(pSO); - pSO = NULL; - break; - } - } - } - } - } - - return pSO; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -void SndObjDestroy(SNDOBJ *pSO) -{ - if (pSO) - { - int i; - - for (i=0; iiAlloc; i++) - { - if (pSO->Buffers[i]) - { - IDirectSoundBuffer_Release(pSO->Buffers[i]); - pSO->Buffers[i] = NULL; - } - } - LocalFree((HANDLE)pSO); - } -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -IDirectSoundBuffer *SndObjGetFreeBuffer(SNDOBJ *pSO) -{ - IDirectSoundBuffer *pDSB; - - if (pSO == NULL) - return NULL; - - if (pDSB = pSO->Buffers[pSO->iCurrent]) - { - HRESULT hres; - DWORD dwStatus; - - hres = IDirectSoundBuffer_GetStatus(pDSB, &dwStatus); - - if (FAILED(hres)) - dwStatus = 0; - - if ((dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) - { - if (pSO->iAlloc > 1) - { - if (++pSO->iCurrent >= pSO->iAlloc) - pSO->iCurrent = 0; - - pDSB = pSO->Buffers[pSO->iCurrent]; - hres = IDirectSoundBuffer_GetStatus(pDSB, &dwStatus); - - if (SUCCEEDED(hres) && (dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) - { - IDirectSoundBuffer_Stop(pDSB); - IDirectSoundBuffer_SetCurrentPosition(pDSB, 0); - } - } - else - { - pDSB = NULL; - } - } - - if (pDSB && (dwStatus & DSBSTATUS_BUFFERLOST)) - { - if (FAILED(IDirectSoundBuffer_Restore(pDSB)) || - !DSFillSoundBuffer(pDSB, pSO->pbWaveData, pSO->cbWaveSize)) - { - pDSB = NULL; - } - } - } - - return pDSB; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL SndObjPlay(SNDOBJ *pSO, DWORD dwPlayFlags) -{ - BOOL result = FALSE; - - if (pSO == NULL) - return FALSE; - - if ((!(dwPlayFlags & DSBPLAY_LOOPING) || (pSO->iAlloc == 1))) - { - IDirectSoundBuffer *pDSB = SndObjGetFreeBuffer(pSO); - if (pDSB != NULL) { - result = SUCCEEDED(IDirectSoundBuffer_Play(pDSB, 0, 0, dwPlayFlags)); - } - } - - return result; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL SndObjStop(SNDOBJ *pSO) -{ - int i; - - if (pSO == NULL) - return FALSE; - - for (i=0; iiAlloc; i++) - { - IDirectSoundBuffer_Stop(pSO->Buffers[i]); - IDirectSoundBuffer_SetCurrentPosition(pSO->Buffers[i], 0); - } - - return TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize) -{ - if (pDSB && pbWaveData && cbWaveSize) - { - LPVOID pMem1, pMem2; - DWORD dwSize1, dwSize2; - - if (SUCCEEDED(IDirectSoundBuffer_Lock(pDSB, 0, cbWaveSize, - &pMem1, &dwSize1, &pMem2, &dwSize2, 0))) - { - CopyMemory(pMem1, pbWaveData, dwSize1); - - if ( 0 != dwSize2 ) - CopyMemory(pMem2, pbWaveData+dwSize1, dwSize2); - - IDirectSoundBuffer_Unlock(pDSB, pMem1, dwSize1, pMem2, dwSize2); - return TRUE; - } - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData,DWORD *pcbWaveSize) -{ - DWORD *pdw; - DWORD *pdwEnd; - DWORD dwRiff; - DWORD dwType; - DWORD dwLength; - - if (ppWaveHeader) - *ppWaveHeader = NULL; - - if (ppbWaveData) - *ppbWaveData = NULL; - - if (pcbWaveSize) - *pcbWaveSize = 0; - - pdw = (DWORD *)pvRes; - dwRiff = *pdw++; - dwLength = *pdw++; - dwType = *pdw++; - - if (dwRiff != mmioFOURCC('R', 'I', 'F', 'F')) - goto exit; // not even RIFF - - if (dwType != mmioFOURCC('W', 'A', 'V', 'E')) - goto exit; // not a WAV - - pdwEnd = (DWORD *)((BYTE *)pdw + dwLength-4); - - while (pdw < pdwEnd) - { - dwType = *pdw++; - dwLength = *pdw++; - - switch (dwType) - { - case mmioFOURCC('f', 'm', 't', ' '): - if (ppWaveHeader && !*ppWaveHeader) - { - if (dwLength < sizeof(WAVEFORMAT)) - goto exit; // not a WAV - - *ppWaveHeader = (WAVEFORMATEX *)pdw; - - if ((!ppbWaveData || *ppbWaveData) && - (!pcbWaveSize || *pcbWaveSize)) - { - return TRUE; - } - } - break; - - case mmioFOURCC('d', 'a', 't', 'a'): - if ((ppbWaveData && !*ppbWaveData) || - (pcbWaveSize && !*pcbWaveSize)) - { - if (ppbWaveData) - *ppbWaveData = (LPBYTE)pdw; - - if (pcbWaveSize) - *pcbWaveSize = dwLength; - - if (!ppWaveHeader || *ppWaveHeader) - return TRUE; - } - break; - } - - pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1)); - } - -exit: - return FALSE; -} diff --git a/sdk/samples/ds3dview/dsutil3d.h b/sdk/samples/ds3dview/dsutil3d.h deleted file mode 100644 index 6094337..0000000 --- a/sdk/samples/ds3dview/dsutil3d.h +++ /dev/null @@ -1,264 +0,0 @@ - -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dsutil.cpp - * Content: Routines for dealing with sounds from resources - * - * - ***************************************************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/////////////////////////////////////////////////////////////////////////////// -// -// These Load functions will first look in the Win32 resources, and then they -// will attempt to find the given name as a file on disk. -// -// DSLoadSoundBuffer Loads an IDirectSoundBuffer from a Win32 resource in -// the current application, or alternately from disk. -// -// DSLoad3DSoundBuffer Loads an IDirectSoundBuffer from a Win32 resource in -// the current application, and asks for DSBCAPS_CTRL3D. -// -// Params: -// pDS -- Pointer to an IDirectSound that will be used to create -// the buffer. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// Returns an IDirectSoundBuffer containing the wave data or NULL on error. -// -// example: -// in the application's resource script (.RC file) -// Turtle WAV turtle.wav -// -// some code in the application: -// IDirectSoundBuffer *pDSB = DSLoadSoundBuffer(pDS, "Turtle"); -// -// if (pDSB) -// { -// IDirectSoundBuffer_Play(pDSB, 0, 0, DSBPLAY_TOEND); -// /* ... */ -// -// or you can substitute the first line above as: -// IDirectSoundBuffer *pDSB = DSLoadSoundBuffer(pDS, "turtle.wav"); -// -/////////////////////////////////////////////////////////////////////////////// -IDirectSoundBuffer *DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName); -IDirectSoundBuffer *DSLoad3DSoundBuffer(IDirectSound *pDS, LPCTSTR lpName); - -/////////////////////////////////////////////////////////////////////////////// -// -// DSReloadSoundBuffer Reloads an IDirectSoundBuffer from a Win32 resource in -// the current application. normally used to handle -// a DSERR_BUFFERLOST error. Will also attempt to find -// the given name as a file, if there is no resource. -// Params: -// pDSB -- Pointer to an IDirectSoundBuffer to be reloaded. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// Returns a BOOL indicating whether the buffer was successfully reloaded. -// -// example: -// in the application's resource script (.RC file) -// Turtle WAV turtle.wav -// -// some code in the application: -// TryAgain: -// HRESULT hres = IDirectSoundBuffer_Play(pDSB, 0, 0, DSBPLAY_TOEND); -// -// if (FAILED(hres)) -// { -// if ((hres == DSERR_BUFFERLOST) && -// DSReloadSoundBuffer(pDSB, "Turtle")) -// { -// goto TryAgain; -// } -// /* deal with other errors... */ -// } -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName); - -/////////////////////////////////////////////////////////////////////////////// -// -// DSGetWaveResource Finds a WAV resource in a Win32 module. -// -// Params: -// hModule -- Win32 module handle of module containing WAV resource. -// Pass NULL to indicate current application. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// ppWaveHeader-- Optional pointer to WAVEFORMATEX * to receive a pointer to -// the WAVEFORMATEX header in the specified WAV resource. -// Pass NULL if not required. -// -// ppbWaveData -- Optional pointer to BYTE * to receive a pointer to the -// waveform data in the specified WAV resource. Pass NULL if -// not required. -// -// pdwWaveSize -- Optional pointer to DWORD to receive the size of the -// waveform data in the specified WAV resource. Pass NULL if -// not required. -// -// Returns a BOOL indicating whether a valid WAV resource was found. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pdwWaveSize); - -/////////////////////////////////////////////////////////////////////////////// -// -// DSGetWaveFile Finds a WAV file on disk and uses a memory mapped file to -// get a memory image of the file. -// -// Params: -// hModule -- Win32 module handle of module containing WAV resource. -// Pass NULL to indicate current application. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// ppWaveHeader-- Optional pointer to WAVEFORMATEX * to receive a pointer to -// the WAVEFORMATEX header in the specified WAV resource. -// Pass NULL if not required. -// -// ppbWaveData -- Optional pointer to BYTE * to receive a pointer to the -// waveform data in the specified WAV resource. Pass NULL if -// not required. -// -// pdwWaveSize -- Optional pointer to DWORD to receive the size of the -// waveform data in the specified WAV resource. Pass NULL if -// not required. -// -// ppvBase -- Required out-parameter which receives the base-address of -// the file mapping. This is needed for the caller to Unmap -// the file. -// -// Returns a BOOL indicating whether a valid WAV file was found and mapped. -// The caller is responsible for calling UnmapViewOfFile(*ppvBase) when they -// are done with the "memory" for the file. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSGetWaveFile(HMODULE hModule, LPCTSTR lpName, WAVEFORMATEX **ppWaveHeader, - BYTE **ppbWaveData, DWORD *pdwWaveSize, void **ppvBase); - -/////////////////////////////////////////////////////////////////////////////// -// -// HSNDOBJ Handle to a SNDOBJ object. -// -// SNDOBJs are implemented in dsutil as an example layer built on top -// of DirectSound. -// -// A SNDOBJ is generally used to manage individual -// sounds which need to be played multiple times concurrently. A -// SNDOBJ represents a queue of IDirectSoundBuffer objects which -// all refer to the same buffer memory. -// -// A SNDOBJ also automatically reloads the sound resource when -// DirectSound returns a DSERR_BUFFERLOST -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef _HSNDOBJ_DEFINED -#define _HSNDOBJ_DEFINED -DECLARE_HANDLE32(HSNDOBJ); -#endif - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjCreate Loads a SNDOBJ from a Win32 resource in -// the current application. -// -// Params: -// pDS -- Pointer to an IDirectSound that will be used to create -// the SNDOBJ. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// iConcurrent -- Integer representing the number of concurrent playbacks of -// to plan for. Attempts to play more than this number will -// succeed but will restart the least recently played buffer -// even if it is not finished playing yet. -// -// Returns an HSNDOBJ or NULL on error. -// -// NOTES: -// SNDOBJs automatically restore and reload themselves as required. -// -/////////////////////////////////////////////////////////////////////////////// -HSNDOBJ SndObjCreate(IDirectSound *pDS, LPCTSTR lpName, int iConcurrent); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjDestroy Frees a SNDOBJ and releases all of its buffers. -// -// Params: -// hSO -- Handle to a SNDOBJ to free. -// -/////////////////////////////////////////////////////////////////////////////// -void SndObjDestroy(HSNDOBJ hSO); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjPlay Plays a buffer in a SNDOBJ. -// -// Params: -// hSO -- Handle to a SNDOBJ to play a buffer from. -// -// dwPlayFlags -- Flags to pass to IDirectSoundBuffer::Play. It is not -// legal to play an SndObj which has more than one buffer -// with the DSBPLAY_LOOPING flag. Pass 0 to stop playback. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL SndObjPlay(HSNDOBJ hSO, DWORD dwPlayFlags); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjStop Stops one or more buffers in a SNDOBJ. -// -// Params: -// hSO -- Handle to a SNDOBJ to play a buffer from. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL SndObjStop(HSNDOBJ hSO); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjGetFreeBuffer returns one of the cloned buffers that is -// not currently playing -// -// Params: -// hSO -- Handle to a SNDOBJ -// -// NOTES: -// This function is provided so that callers can set things like pan etc -// before playing the buffer. -// -// EXAMPLE: -// ... -// -/////////////////////////////////////////////////////////////////////////////// -IDirectSoundBuffer *SndObjGetFreeBuffer(HSNDOBJ hSO); - -/////////////////////////////////////////////////////////////////////////////// -// -// helper routines -// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD dwWaveSize); -BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pdwWaveSize); - -#ifdef __cplusplus -} -#endif diff --git a/sdk/samples/ds3dview/file.cpp b/sdk/samples/ds3dview/file.cpp deleted file mode 100644 index 481ef4d..0000000 --- a/sdk/samples/ds3dview/file.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: file.cpp - * - * DESCRIPTION: Functionality to let users pick files and return their - * names to the object viewer (one for XOF, one for WAV) - * - ***************************************************************************/ - -#include "d3drmwin.h" -#include "resource.h" -#include -#include -#include - -/* -** Lets the user select a new geometry file to load and returns the full path and filename -*/ - -char* OpenNewFile( HWND hwnd ) -{ - static char file[256]; - static char fileTitle[256]; - static char filter[] = "Geometry files (*.x)\0*.x\0" - "All Files (*.*)\0*.*\0"; - OPENFILENAME ofn; - - strcpy( file, ""); - strcpy( fileTitle, ""); - - // Set up the OPENFILENAME structure - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hwnd; -#ifdef WIN32 - ofn.hInstance = (HANDLE) GetWindowLong(hwnd, GWL_HINSTANCE); -#else - ofn.hInstance = (HANDLE) GetWindowWord(hwnd, GWW_HINSTANCE); -#endif - ofn.lpstrFilter = filter; - ofn.lpstrCustomFilter = (LPSTR) NULL; - ofn.nMaxCustFilter = 0L; - ofn.nFilterIndex = 1L; - ofn.lpstrFile = file; - ofn.nMaxFile = sizeof(file); - ofn.lpstrFileTitle = fileTitle; - ofn.nMaxFileTitle = sizeof(fileTitle); - ofn.lpstrInitialDir = NULL; - ofn.lpstrTitle = "Open a File"; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = "*.x"; - ofn.lCustData = 0; - - ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - - // Call windows functionality to make it happen! - if (GetOpenFileName(&ofn)) - return (char*)ofn.lpstrFile; - else - return NULL; -} - -/* -** Lets the user select a new .WAV file to load and returns it's full path and filename -*/ - -char* OpenNewSoundFile( HWND hwnd ) -{ - static char file[256]; - static char fileTitle[256]; - static char filter[] = "Sound files (*.wav)\0*.wav\0" - "All Files (*.*)\0*.*\0"; - OPENFILENAME ofn; - - strcpy( file, ""); - strcpy( fileTitle, ""); - - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hwnd; -#ifdef WIN32 - ofn.hInstance = (HANDLE) GetWindowLong(hwnd, GWL_HINSTANCE); -#else - ofn.hInstance = (HANDLE) GetWindowWord(hwnd, GWW_HINSTANCE); -#endif - ofn.lpstrFilter = filter; - ofn.lpstrCustomFilter = (LPSTR) NULL; - ofn.nMaxCustFilter = 0L; - ofn.nFilterIndex = 1L; - ofn.lpstrFile = file; - ofn.nMaxFile = sizeof(file); - ofn.lpstrFileTitle = fileTitle; - ofn.nMaxFileTitle = sizeof(fileTitle); - ofn.lpstrInitialDir = NULL; - ofn.lpstrTitle = "Open a File"; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = "*.wav"; - ofn.lCustData = 0; - - ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - - if (GetOpenFileName(&ofn)) - return (char*)ofn.lpstrFile; - else - return NULL; -} diff --git a/sdk/samples/ds3dview/file.h b/sdk/samples/ds3dview/file.h deleted file mode 100644 index f0e6ba3..0000000 --- a/sdk/samples/ds3dview/file.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef ___VIEWER_FILE_OPENERS -#define ___VIEWER_FILE_OPENERS - -char* OpenNewFile(HWND); -char* OpenNewSoundFile(HWND); - -#endif - - diff --git a/sdk/samples/ds3dview/makefile b/sdk/samples/ds3dview/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/ds3dview/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/ds3dview/makefile.wat b/sdk/samples/ds3dview/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/ds3dview/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/ds3dview/msvc.mk b/sdk/samples/ds3dview/msvc.mk deleted file mode 100644 index ef5d3b4..0000000 --- a/sdk/samples/ds3dview/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = ds3dview -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib\ - comdlg32.lib gdi32.lib winmm.lib libc.lib dsound.lib - -OBJS = viewer.obj file.obj rodcone.obj rlds3d.obj dsutil3d.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-Otyb1 -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = viewer.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/ds3dview/readme.txt b/sdk/samples/ds3dview/readme.txt deleted file mode 100644 index 95f7e4f..0000000 --- a/sdk/samples/ds3dview/readme.txt +++ /dev/null @@ -1,55 +0,0 @@ -Reality Lab / DirectSound 3D Viewer Sample - -DS3DVIEW.EXE - -This sample is a simple extension of the 3D object viewer sample that shipped -with DirectX 2. It allows you to attach sounds to objects and move them around -a bit in 3D. - -Viewer Notes: -------------- -The initial scene has a light source in the top right. To see this the view -can be moved backwards and forwards using the T and R keys. Additional objects -can be loaded from the file menu, and new light sources can be added from the -lights menu. Objects can be rotated with the left mouse button and dragged -with the right. - -The last object that was rotated or dragged is the current selection. - -The device quality can be altered using the Renderer menu. Using this menu the -type of device used can also be switched from ramp to RGB. When using the RGB -device the colour of lights in the scene can be changed in the same way as you -change the colour of objects. In 256 colour mode it is advisable to dither an -RGB device for best results. - - - -Additional keyboard controls - -T Forwards. -R Back. -Z Move current selection forwards. -X Move current selection back. -G Gouraud shade -F Flat Shade -D Dither toggle. -Delete Delete the current selection. - - -Sound Notes: ------------- - -To attach a sound to an object, select the object and then select the "Attach Sound" -command from the Sound menu. You can then select a WAV file to load. To hear the -sound, select "Play Sound Once" or "Play Sound Looping." To hear some neat effects, -try "Orbit" which will orbit the object/sound around the listener, or "Bullet," -which will shoot the object/sound past the listener's head. - -Properties for the sound or the listener can also be modified using the appropriate -menu commands and dialogs. - - -Current Known Issues for DX 3, Beta 1: --------------------------------------- -* Double-cones are not currently implemented right -- the outer cone is simply set - to be the same as the inside cone, which is always valid. diff --git a/sdk/samples/ds3dview/resource.h b/sdk/samples/ds3dview/resource.h deleted file mode 100644 index 9358335..0000000 --- a/sdk/samples/ds3dview/resource.h +++ /dev/null @@ -1,66 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by viewer.rc -// -#define MENU_FILE_ABOUT 1 -#define MENU_FILE_OPEN 2 -#define MENU_FILE_EXIT 3 -#define MENU_FILE_NEW_WINDOW 4 -#define MENU_EDIT_CUT 100 -#define MENU_EDIT_COPY 101 -#define MENU_EDIT_PASTE 102 -#define MENU_EDIT_DELETE 103 -#define MENU_EDIT_COLOUR 104 -#define MENU_EDIT_BOXES 105 -#define MENU_QUALITY_LIGHTING 200 -#define MENU_QUALITY_POINTS 201 -#define MENU_QUALITY_WIREFRAME 202 -#define MENU_QUALITY_SOLID 203 -#define MENU_QUALITY_FLAT 204 -#define MENU_QUALITY_GOURAUD 205 -#define MENU_QUALITY_PHONG 206 -#define MENU_MODEL_MONO 207 -#define MENU_MODEL_RGB 208 -#define MENU_DITHER 209 -#define MENU_TEXTURE_FILTERING 210 -#define MENU_LIGHT_DIRECTIONAL 301 -#define MENU_LIGHT_PARALLEL_POINT 302 -#define MENU_LIGHT_POINT 303 -#define MENU_LIGHT_SPOT 304 -#define MENU_SOUND_ATTACHSOUND 401 -#define MENU_SOUND_REMOVESOUND 402 -#define MENU_SOUND_REMOVEALLSOUNDS 403 -#define MENU_SOUND_PLAYSOUND 404 -#define MENU_SOUND_PLAYSOUNDLOOPING 405 -#define MENU_SOUND_STOPSOUND 406 -#define MENU_SOUND_STOPALLSOUNDS 407 -#define MENU_MOTION_ORBITSELECTEDOBJECT 501 -#define MENU_MOTION_BULLETSELECTEDOBJECT 502 -#define IDC_ORBIT 1005 -#define IDC_BULLET 1006 -#define IDC_EDIT1 1007 -#define IDC_CONEANGLE 1007 -#define IDC_EDIT2 1008 -#define IDC_CONEOUTSIDEVOLUME 1008 -#define IDC_EDIT3 1009 -#define IDC_MINIMUMDISTANCE 1009 -#define IDC_EDIT4 1011 -#define IDC_MAXIMUMDISTANCE 1011 -#define IDC_DISTANCEFACTOR 1012 -#define IDC_ROLLOFFFACTOR 1013 -#define IDC_DOPPLERFACTOR 1014 -#define MENU_SOUND_GLOBALPROPERTIES 40015 -#define MENU_SOUND_SELECTEDSOUNDPROPERTIES 40016 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 106 -#define _APS_NEXT_COMMAND_VALUE 40019 -#define _APS_NEXT_CONTROL_VALUE 1015 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/ds3dview/rlds3d.cpp b/sdk/samples/ds3dview/rlds3d.cpp deleted file mode 100644 index b2fa210..0000000 --- a/sdk/samples/ds3dview/rlds3d.cpp +++ /dev/null @@ -1,2159 +0,0 @@ -/************************************************************************************************************ - - Direct3DRM and DirectSound3D interface designed for the Viewer Sample Application - - (c) 1996 Microsoft Corporation - -************************************************************************************************************/ - - -#include "rlds3d.h" -#include "ds3dvi.h" // "Internal" include stuff, like some structures - -// For resource symbols -#include "resource.h" - -#include "d3drmwin.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include "rodcone.h" -#include "file.h" - -#include -#include "dsound.h" -#include "dsutil3d.h" - - -/* -** This is an interface between the viewer and the RL/DS3D APIs which provides the -** functionality required by the viewer in simplified form. -** -** Note: This is not an object-oriented API since there should only be need for one -** copy at a time and this way C++ to C conversions should be fairly easy -** -** DESCRIPTION: The user interfaces the 3D world and objects therein by selecting an item -** with the mouse (on the screen) and performing operations on that item. The user will -** also be able to perform operations on the camera and a few global operations applied -** to all objects. -** -** USAGE: Create the interface using RLDS3D_Initialize() (returns FALSE if not created) -** and remove it using RLDS3D_Deinitialize(). The Render() functionality draws the world -** on the screen. Other functionality as described. -*/ - -/* -*********************************** GLOBALS ************************************* -*/ - -/* -** VIEWER LPDIRECT3DRMFRAME APPDATA STRUCTURE -** -** Pointers to this class are placed (as necessary) in the appdata fields for LPDIRECT3DRMFRAMEs. Any -** necessary data to be attached to frames should be added to this class -*/ - -class FRAMEAPPDATA { -public: - // Sound buffer interfaces (the standard one and the 3D interface) - LPDIRECTSOUNDBUFFER Sound; - LPDIRECTSOUND3DBUFFER i3DSound; - - // Whether or not this frame is currently in orbit (and thus contained in a temporary frame) - BOOL bOrbiting; - // Whether or not this frame is a bullet (and thus has a bullet callback and dialog) - BOOL bBullet; - // A window handle associated with the orbiting/bullet state which controls speed, etc. - HWND hDlg; - - FRAMEAPPDATA() : Sound(NULL), i3DSound(NULL), bOrbiting(FALSE), bBullet(FALSE), hDlg(0) {}; - ~FRAMEAPPDATA() { - if (i3DSound) i3DSound->Release(); - if (Sound) Sound->Release(); - }; -}; -typedef FRAMEAPPDATA* LPFRAMEAPPDATA; - -// Interface to the D3DRM functions -LPDIRECT3DRM lpD3DRM = NULL; - -// Pointer to the Directsound API -LPDIRECTSOUND lpDS = NULL; - -// Clipper for the DDraw surface -LPDIRECTDRAWCLIPPER lpDDClipper = NULL; - -// Handle to the API's parent window (passed in Initialize) -HWND hwndParent; - -// Handle to our instance -HANDLE hinst; - -AppInfo* info; - -/* -** Globals used for editing what is in the D3DRM world -*/ - -// Selected frame (contains visual currently selected by user) -LPDIRECT3DRMFRAME sFrame = NULL; - -// Whether or not editing box should be shown around the selected object -BOOL showBoxes = FALSE; - -// Currently selected visual (if one is selected) -static LPDIRECT3DRMMESHBUILDER sVisual = NULL; - -// Currently selected light (if one is selected) -static LPDIRECT3DRMLIGHT sLight = NULL; - -// Box/Speaker cone to go around the selected item (if boxes are on and if there IS a speaker) -static LPDIRECT3DRMMESH selectionBox = NULL; -static LPDIRECT3DRMMESH selectionSpeaker = NULL; - -// Clipboard frame and visual allowing cutting and pasting -LPDIRECT3DRMFRAME clipboardFrame = NULL; -LPDIRECT3DRMVISUAL clipboardVisual = NULL; - -/* -** Globals for DirectSound3D -*/ - -// Listener information (connected to the camera) -LPDIRECTSOUND3DLISTENER lp3DListenerInfo; - -// Primary Buffer (we don't REALLY need a pointer to it but we keep it just in case) -LPDIRECTSOUNDBUFFER lpDSBuff; - -/* -************************ Internal function declarations **************************** -*/ - -// These are not part of the interface and are just used by the RLDS3D functions -static BOOL CreateDevice(HWND win, AppInfo* info); -HRESULT loadTextures(char *name, void *arg, LPDIRECT3DRMTEXTURE *tex); -char* LSTRRCHR( const char* lpString, int bChar ); -static void PlaceMesh(LPDIRECT3DRMMESHBUILDER mesh, AppInfo *info); -static BOOL CreateScene(AppInfo* info); -static BOOL RebuildDevice(HWND win, AppInfo* info, int width, int height); -static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX*); -void SelectVisual(LPDIRECT3DRMMESHBUILDER visual, LPDIRECT3DRMFRAME frame); -int ChooseNewColor(HWND, D3DCOLOR*); -void RemoveSoundRecord(LPDIRECT3DRMFRAME owner); -void releaseSoundCallback(LPDIRECT3DRMFRAME frame); -void StopOrbiting(LPDIRECT3DRMFRAME stopme); -void UpdateConeVisual(void); - -/* -*********************** Error checker functions ************************************ -*/ - -/* -** These are wrapped around DS or D3DRM calls to appropriately catch errors and handle them. -** -** The generalized cases are coded, callers can pass forced reactions to errors by using the force_critical variables -*/ - -/* -** In this code the general philosophy for when to use the viewer is when requesting anything from something outside the -** program. Thus, asking a frame which we know exists to accept an added visual doesn't get checked, but trying to create -** a new frame (which tries to allocate memory) is checked in case we've run out of free memory. -*/ - -BOOL D3DRM_SUCCEED(HRESULT result, int force_critical, char* info) { - if (result == D3DRM_OK) return TRUE; - // Could be 0 for non-critical, 1 for non-critical but reports it, or 2 for critical (notify and quit) - int priority = 0; - char* error_string; - switch (result) { - case D3DRMERR_BADALLOC: error_string = "Out of memory"; priority = 2; break; - case D3DRMERR_BADDEVICE: error_string = "Device is not compatible with renderer"; priority = 2; break; - case D3DRMERR_BADFILE: error_string = "Data file is corrupt"; priority = 2; break; - case D3DRMERR_BADMAJORVERSION: error_string = "Bad DLL major version"; priority = 2; break; - case D3DRMERR_BADMINORVERSION: error_string = "Bad DLL minor version"; priority = 2; break; - case D3DRMERR_BADOBJECT: error_string = "Object expected in argument"; priority = 2; break; - case D3DRMERR_BADTYPE: error_string = "Bad argument type passed"; priority = 1; break; - case D3DRMERR_BADVALUE: error_string = "Bad argument value passed"; priority = 1; break; - case D3DRMERR_FACEUSED: error_string = "Face already used in a mesh"; priority = 1; break; - case D3DRMERR_FILENOTFOUND: error_string = "File cannot be opened"; priority = 1; break; - case D3DRMERR_NOTDONEYET: error_string = "Unimplemented function called"; priority = 1; break; - case D3DRMERR_NOTFOUND: error_string = "Object not found in specified place"; priority = 1; break; - case D3DRMERR_UNABLETOEXECUTE: error_string = "Unable to carry out procedure"; priority = 2; break; - default: error_string = "D3DRM Error: Unable to continue"; priority = 2; break; - } - - int ret; - if (force_critical >= 0) priority = force_critical; - if (priority == 1) { - ret = MessageBox(hwndParent, error_string, "D3DRM Warning", MB_APPLMODAL|MB_ICONWARNING|MB_OK); - } - else if (priority == 2) { - ret = MessageBox(hwndParent, error_string, "D3DRM Fatal Error", MB_APPLMODAL|MB_ICONSTOP|MB_OK); - PostMessage(hwndParent, WM_CLOSE,0,0); - } - return FALSE; -} - -/* -** DS isn't vital for the viewer to run so error messages don't force a quit -*/ - -BOOL DS3D_SUCCEED(HRESULT result, int force_critical, char* info) { - if (result == DS_OK) return TRUE; - // Could be 0 for no message, 1 for non-critical (simply needs to report it), or 2 for critical (notify and quit) - int priority = 0; - char* error_string = NULL; - switch (result) { - case DSERR_ALLOCATED: error_string = "Requested resources already in use"; priority = 1; break; - case DSERR_ALREADYINITIALIZED: error_string = "Object already initialized"; priority = 0; break; - case DSERR_BADFORMAT: error_string = "Wave format not supported"; priority = 0; break; - case DSERR_BUFFERLOST: error_string = "Buffer lost and must be restored"; priority = 0; break; - case DSERR_CONTROLUNAVAIL: error_string = "Control requested not available"; priority = 0; break; - case DSERR_GENERIC: error_string = "Undetermined error"; priority = 1; break; - case DSERR_INVALIDCALL: error_string = "Invalid call for object's current state"; priority = 0; break; - case DSERR_INVALIDPARAM: error_string = "Invalid parameters passed to object"; priority = 0; break; - case DSERR_NOAGGREGATION: error_string = "Object does not support aggregation"; priority = 1; break; - case DSERR_NODRIVER: error_string = "No sound driver available"; priority = 1; break; -// case DSERR_NOINTERFACE: error_string = "Requested COM interface not available"; priority = 0; break; - case DSERR_OUTOFMEMORY: error_string = "Out of memory"; priority = 1; break; - case DSERR_PRIOLEVELNEEDED: error_string = "Caller does not have required priority level"; priority = 0; break; -// case DSERR_UNINITIALIZED: error_string = "DirectSound not initialized"; priority = 1; break; - case DSERR_UNSUPPORTED: error_string = "Unsupported function called"; priority = 0; break; - default: error_string = "Undetermined error"; priority = 1; break; - } - - int ret; - if (force_critical >= 0) priority = force_critical; - if (priority == 1) { - ret = MessageBox(hwndParent, error_string, "DS3D Warning", MB_APPLMODAL|MB_ICONWARNING|MB_OK); - } - else if (priority == 2) { - ret = MessageBox(hwndParent, error_string, "DS3D Fatal Error", MB_APPLMODAL|MB_ICONSTOP|MB_OK); - PostMessage(hwndParent, WM_CLOSE,0,0); - } - return FALSE; -} - - - - -/* -************************ INITIALIZATION/DEINITIALIZATION **************************** -*/ - -/* -** Initialize will attach itself to the passed window. Call initialize after -** getting a handle for your window but before you display it. -** -** Initialize will initialize the D3DRM API and return false if it fails. It will -** also attempt to initialize a DirectSound3D API, but failing this does not -** justify a failed Initialize (since the 3D sound isn't a necessary part of -** the viewer) -*/ - -BOOL RLDS3D_Initialize(HWND hwndPW, HANDLE this_inst) { - - if (!hwndPW) return FALSE; - - hinst = this_inst; - hwndParent = hwndPW; - - // D3DRM API INIT - we force non-critical warnings here because the initialization returns a boolean for success - - // Call Direct3DRMCreate to try to make a D3DRM object - if (!D3DRM_SUCCEED(Direct3DRMCreate(&lpD3DRM), 1)) return FALSE; - - - if (!D3DRM_SUCCEED(DirectDrawCreateClipper(0, &lpDDClipper, NULL),1)) { - lpD3DRM->Release(); - return FALSE; - } - - if (!D3DRM_SUCCEED(lpDDClipper->SetHWnd(0, hwndParent),1)) { - lpDDClipper->Release(); - lpD3DRM->Release(); - return FALSE; - } - - - // Set up D3DRM information structure - info = (AppInfo*) malloc(sizeof(AppInfo)); - if (!info) { - lpDDClipper->Release(); - lpD3DRM->Release(); - return FALSE; - } - - info->model = D3DCOLOR_MONO; - - // Calls our internal function to create a viewport and device and attach it to the window (CreateDevice in misc. functionality) - // (also fills in the global information structure "info" for what D3DRM can do and is currently doing) - if (CreateDevice(hwndParent, info) == FALSE) { - lpDDClipper->Release(); - lpD3DRM->Release(); - return FALSE; - } - - // DIRECTSOUND 3D INIT - note, if this fails the entire initialization is still OK. - - // Description for our primary buffer creation - DSBUFFERDESC dsbd; - - int ret = IDRETRY; - - // Try to create the Directsound objects until we either do it, are told to ignore it, or are told to abort - while (ret == IDRETRY) { - // Create the directsound object - if (DS3D_SUCCEED(DirectSoundCreate(NULL, &lpDS, NULL))) { - // Set cooperative level - if (DS3D_SUCCEED(lpDS->SetCooperativeLevel(hwndParent, DSSCL_PRIORITY))) { - // Create a primary buffer so we can query for a 3D Listener interface - memset(&dsbd, 0, sizeof(DSBUFFERDESC)); - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D; - if (DS3D_SUCCEED(lpDS->CreateSoundBuffer(&dsbd, &lpDSBuff, NULL))) { - - // Make the primary 44.1 KHz so that it sounds better - WAVEFORMATEX wfx; - wfx.wFormatTag = WAVE_FORMAT_PCM; - wfx.nChannels = 2; - wfx.nSamplesPerSec = 44100; - wfx.nAvgBytesPerSec = 44100*2*2; - wfx.nBlockAlign = 4; - wfx.wBitsPerSample = 16; - wfx.cbSize = 0; - lpDSBuff->SetFormat(&wfx); - - // Get the 3D listener information (error currently ignored) - if (DS3D_SUCCEED(lpDSBuff->QueryInterface(IID_IDirectSound3DListener, (void**) &lp3DListenerInfo))) { - lp3DListenerInfo->SetDopplerFactor(D3DVAL(100.0), DS3D_IMMEDIATE); - } - else { - // Failed to get listener info - lpDSBuff->Release(); - lpDS->Release(); - lpDS = NULL; - } - } - else { - // Failed to create a primary buffer - lpDS->Release(); - lpDS = NULL; - } - } - else { - // Failed to set cooperative level - lpDS->Release(); - lpDS = NULL; - } - } - - // Warn that we could create the DirectSound object - if (!lpDS) { - ret = MessageBox(hwndParent, "DirectSound 3D could not initialize", "Warning", MB_APPLMODAL|MB_ICONWARNING|MB_ABORTRETRYIGNORE); - if (ret == IDABORT) { - lpDDClipper->Release(); - lpD3DRM->Release(); - return FALSE; - } - } - else ret = IDOK; - } - return TRUE; -} - -/* -** Deinitializes -*/ - -void RLDS3D_Deinitialize() { - // Releases the DSound interface... this is very important! - if (lpDS != NULL) { - lpDSBuff->Release(); - lpDS->Release(); - } - info->dev->Release(); - lpDDClipper->Release(); - lpD3DRM->Release(); - free(info); -} - -/* -******************************************** ADDING/REMOVING/EDITING OBJECTS ********************************* -*/ - -/* -** Loads XOF file into the RL world (with textures) -*/ - -void RLDS3D_LoadXOF(char* file) { - if (!file) return; - LPDIRECT3DRMMESHBUILDER builder = NULL; - if (D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&builder))) { - if (builder->Load(file, NULL, D3DRMLOAD_FROMFILE, loadTextures, NULL) != D3DRM_OK) { - MessageBox(hwndParent, "Unable to load file", "D3DRM Fatal Error", MB_APPLMODAL|MB_ICONEXCLAMATION|MB_OK); - builder->Release(); - return; - } - PlaceMesh(builder, info); - builder->Release(); - } -} - -/* -** Sets/Gets whether or not boxes are shown around selected item -*/ - -BOOL RLDS3D_GetBoxes(void) { - return showBoxes; -} - -void RLDS3D_SetBoxes(BOOL new_val) { - showBoxes = new_val; - // Re-selects the currently selected visual so that the box is generated/destroyed around it - RLDS3D_UpdateSelectionBox(); -} - -/* -** Updates the bounding box around the selected visual (this could be done using a render callback function to compare the -** frame's scaling and transform functions instead) -*/ - -void RLDS3D_UpdateSelectionBox(void) { - // When we select this visual, we destroy any existing box and create a new one around it if showBoxes is true. - SelectVisual(sVisual, sFrame); -} - -/* -** Deselects the currently selected 3D visual. -*/ - -void RLDS3D_DeselectVisual() -{ - // Removes the bounding box from around it if it's there - if (sFrame && selectionBox) { - sFrame->DeleteVisual(selectionBox); - sFrame->DeleteVisual(selectionSpeaker); - } - - - sFrame = NULL; - sLight = NULL; - sVisual = NULL; - selectionBox = NULL; - selectionSpeaker = NULL; -} - -/* -** Given coordinates it selects the first visual under those coordinates in the window's viewport -*/ - -void RLDS3D_FindAndSelectVisual(int x, int y, LPBOOL changed) { - LPDIRECT3DRMVISUAL visual; - LPDIRECT3DRMFRAME frame; - LPDIRECT3DRMPICKEDARRAY picked; - LPDIRECT3DRMFRAMEARRAY frames; - LPDIRECT3DRMMESHBUILDER mesh; - LPDIRECT3DRMVIEWPORT view = info->view; - - LPDIRECT3DRMFRAME oldframe = sFrame; - - /* - * Make sure we don't try to select the selection box of the current - * selection. - */ - RLDS3D_DeselectVisual(); - - view->Pick(x, y, &picked); - if (picked) - { if (picked->GetSize()) - { - // Get the top-level visual - picked->GetPick(0, &visual, &frames, 0); - // The frames that contain the visual are placed into a framearray in heiarchical order, take the - // last one (the one most closely associated with the visual) - frames->GetElement(frames->GetSize() - 1, &frame); - // We can only select meshes so we query the visual to make sure it is one - if (D3DRM_SUCCEED(visual->QueryInterface(IID_IDirect3DRMMeshBuilder, (void **) &mesh), 0)) - { - // If we're clicking on an orbiting frame then we need to stop it. - StopOrbiting(frame); - SelectVisual(mesh, frame); - mesh->Release(); - } - frame->Release(); - frames->Release(); - visual->Release(); - } - picked->Release(); - } - if (changed) { - if (sFrame == oldframe) *changed = FALSE; else *changed = TRUE; - } -} - -/* -** Cuts the current selection to the clipboard -*/ - -void RLDS3D_CutVisual() -{ - LPDIRECT3DRMFRAME frame; - - if (clipboardFrame) - clipboardFrame->Release(); - - if (sFrame) - { clipboardFrame = sFrame; - clipboardVisual = sVisual; - - // If a 3D sound is attached, remove it (sounds not carried to clipboard) - RemoveSoundRecord(clipboardFrame); - RLDS3D_DeselectVisual(); - - clipboardFrame->AddRef(); - clipboardFrame->GetParent(&frame); - if (frame) { - frame->DeleteChild(clipboardFrame); - frame->Release(); - } - } -} - -/* -** Copies the current selection to the clipboard -*/ - -void RLDS3D_CopyVisual() -{ - LPDIRECT3DRMFRAME frame; - - if (sFrame) - { - // Things could really foul up if the clones aren't created so we make sure they are - if (!D3DRM_SUCCEED(sFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &clipboardFrame))) { - // If we've failed, we must make sure the clipboard is empty! - clipboardVisual->Release(); - clipboardVisual = NULL; - return; - } - - if (!D3DRM_SUCCEED(sVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &clipboardVisual))) { - // If we've failed, we must make sure the clipboard is empty! - clipboardFrame->Release(); - clipboardFrame = NULL; - return; - } - - // If a 3D sound is attached, remove it (sounds not carried to clipboard) - RemoveSoundRecord(clipboardFrame); - - clipboardFrame->AddVisual(clipboardVisual); - clipboardVisual->Release(); - - clipboardFrame->GetParent(&frame); - if (frame) { - frame->DeleteChild(clipboardFrame); - frame->Release(); - } - } -} - -/* -** Pastes the current selection to the window -*/ - -void RLDS3D_PasteVisual() -{ - if (clipboardFrame) - { - LPDIRECT3DRMFRAME frame; - LPDIRECT3DRMVISUAL visual; - - if (!D3DRM_SUCCEED(clipboardFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &frame))) return; - if (!D3DRM_SUCCEED(clipboardVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &visual))) { - frame->Release(); - return; - } - - frame->AddVisual(visual); - info->scene->AddChild(frame); - visual->Release(); - frame->Release(); - } -} - -/* -** Deletes the current selection from the world without copying to the clipboard -*/ - -void RLDS3D_DeleteVisual() -{ - if (sFrame) { - LPDIRECT3DRMFRAME parent, frame; - // Make a copy of the selected frame ('cause deselecting it will make it inaccessible) - frame = sFrame; - // If a 3D sound is attached, remove it - RemoveSoundRecord(frame); - - // Deselect the frame (removes bounding box, etc, also sets sFrame to NULL) - RLDS3D_DeselectVisual(); - if (frame->GetAppData()) delete (FRAMEAPPDATA*)frame->GetAppData(); - frame->GetParent(&parent); - if (parent) { - parent->DeleteChild(frame); - parent->Release(); - } - } -} - -/* -** Add a directional light -*/ - -void RLDS3D_AddDirectionalLight() { - LPDIRECT3DRMMESHBUILDER builder; - LPDIRECT3DRMLIGHT light; - LPDIRECT3DRMFRAME frame; - - if (D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&builder))) { - if (D3DRM_SUCCEED(builder->Load("camera.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL))) { - builder->SetQuality(D3DRMRENDER_UNLITFLAT); - if (D3DRM_SUCCEED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) { - if (D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &frame))) { - frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0)); - frame->AddVisual(builder); - frame->AddLight(light); - frame->Release(); - } - light->Release(); - } - } - builder->Release(); - } -} - -/* -** Add a parallel point light -*/ - -void RLDS3D_AddParallelPointLight() { - LPDIRECT3DRMMESHBUILDER builder; - LPDIRECT3DRMLIGHT light; - LPDIRECT3DRMFRAME frame; - - if (D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&builder))) { - if (D3DRM_SUCCEED(builder->Load("sphere2.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL))) { - builder->SetQuality(D3DRMRENDER_UNLITFLAT); - builder->Scale(D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)); - if (D3DRM_SUCCEED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_PARALLELPOINT, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) { - if (D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &frame))) { - frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0)); - frame->AddVisual(builder); - frame->AddLight(light); - frame->Release(); - } - light->Release(); - } - } - builder->Release(); - } -} - -/* -** Add Point Light -*/ - -void RLDS3D_AddPointLight() { - LPDIRECT3DRMMESHBUILDER builder; - LPDIRECT3DRMLIGHT light; - LPDIRECT3DRMFRAME frame; - - if (D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&builder))) { - if (D3DRM_SUCCEED(builder->Load("sphere2.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL))) { - builder->SetQuality(D3DRMRENDER_UNLITFLAT); - builder->Scale(D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)); - if (D3DRM_SUCCEED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_POINT, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) { - if (D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &frame))) { - frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0)); - frame->AddVisual(builder); - frame->AddLight(light); - frame->Release(); - } - light->Release(); - } - } - builder->Release(); - } -} - -/* -** Add a spotlight -*/ - -void RLDS3D_AddSpotlight() { - LPDIRECT3DRMMESHBUILDER builder; - LPDIRECT3DRMLIGHT light; - LPDIRECT3DRMFRAME frame; - - if (D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&builder))) { - if (D3DRM_SUCCEED(builder->Load("camera.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL))) { - builder->SetQuality(D3DRMRENDER_UNLITFLAT); - if (D3DRM_SUCCEED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_SPOT, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) { - if (D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &frame))) { - frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0)); - frame->AddVisual(builder); - frame->AddLight(light); - frame->Release(); - } - light->Release(); - } - } - builder->Release(); - } -} - - -/* -*********************************** OBJECT MOTION/SCALING/COLORING **************************************** -*/ - -/* -** Chooses a new color and sets the selected object to it... handles the selection of the color, etc. -*/ - -void RLDS3D_SetSelColour(void) { - if (!sFrame) return; - LPDIRECT3DRMMESHBUILDER mesh; - - if (!D3DRM_SUCCEED(sVisual->QueryInterface(IID_IDirect3DRMMeshBuilder, (void**) &mesh),0)) return; - - if (sLight) - { - D3DCOLOR c = sLight->GetColor(); - - if (ChooseNewColor(hwndParent, &c)) { - mesh->SetColor(c); - sLight->SetColor(c); - } - } else { - D3DCOLOR c; - - if (mesh->GetFaceCount()) { - LPDIRECT3DRMFACEARRAY faces; - LPDIRECT3DRMFACE face; - mesh->GetFaces(&faces); - faces->GetElement(0, &face); - c = face->GetColor(); - face->Release(); - faces->Release(); - } else - c = D3DRMCreateColorRGB(D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - - if (ChooseNewColor(hwndParent, &c)) - mesh->SetColor(c); - } - - mesh->Release(); -} - - -/* -** Moves the camera relative to itself by providing scalars to multiply against the CAMERA-RELATIVE unit vectors -** forwards/up/right. -*/ - -void RLDS3D_SetCamVelRelToCam(D3DVALUE forward, D3DVALUE up, D3DVALUE right) { - D3DVECTOR vDir, vUp, vRight; - info->camera->GetOrientation(info->scene, &vDir, &vUp); - // Cross the UP vector and the RIGHT vector to get the FORWARDS vector - D3DRMVectorCrossProduct(&vRight, &vUp, &vDir); - info->camera->SetVelocity(info->scene, vDir.x*forward + vUp.x*up + vRight.x*right, - vDir.y*forward + vUp.y*up + vRight.y*right, - vDir.z*forward + vUp.z*up + vRight.z*right, - TRUE); -} - -/* -** Rotates the camera around its three axis -** -** forward_axis is roll, up_axis is yaw, right_axis is pitch -*/ - -void RLDS3D_SetCamRotForward(D3DVALUE forward_axis) { - info->camera->SetRotation(info->camera, 0.0f, 0.0f, 1.0f, forward_axis); -} - -void RLDS3D_SetCamRotUp(D3DVALUE up_axis) { - info->camera->SetRotation(info->camera, 0.0f, 1.0f, 0.0f, up_axis); -} - -void RLDS3D_SetCamRotRight(D3DVALUE right_axis) { - info->camera->SetRotation(info->camera, 1.0f, 0.0f, 0.0f, right_axis); -} - -/* -** Scales the currently selected object by the scale factors... -*/ - -void RLDS3D_ScaleSelected(D3DVALUE sx, D3DVALUE sy, D3DVALUE sz) { - if (!sFrame) return; - if (!sVisual) return; - RLDS3D_StopOrbitSelected(); - sVisual->Scale(sx, sy, sz); - RLDS3D_UpdateSelectionBox(); -} - -/* -** Moves the currently selected object in the 3D world relative to the camera -*/ - -void RLDS3D_SetSelectedVelRelToCam(D3DVALUE forward, D3DVALUE up, D3DVALUE right) { - if (!sFrame) return; - RLDS3D_StopOrbitSelected(); - D3DVECTOR vDir, vUp, vRight; - info->camera->GetOrientation(info->scene, &vDir, &vUp); - D3DRMVectorCrossProduct(&vRight, &vUp, &vDir); - sFrame->SetVelocity(info->scene, vDir.x*forward + vUp.x*up + vRight.x*right, - vDir.y*forward + vUp.y*up + vRight.y*right, - vDir.z*forward + vUp.z*up + vRight.z*right, - TRUE); -} - -/* -** Rotates the currently selected object relative to the camera's frame when passed -** a vector for the axis and an angle of rotation. -** This is useful because the AXIS which is specified is relative to what appears on the screen with it's origin at the camera -** (ie: (0,0,1) will be an axis straight into the screen and thus things will spin around the centre of the screen) -*/ - -void RLDS3D_SetSelectedRotRelToCam(D3DVALUE AxisX, D3DVALUE AxisY, D3DVALUE AxisZ, D3DVALUE angle) { - if (!sFrame) return; - RLDS3D_StopOrbitSelected(); - sFrame->SetRotation(info->camera, AxisX, AxisY, AxisZ, angle); -} - -/* -** Moves the currently selected object by x/y pixels on the screen from it's relative position. Allows a user -** to drag objects around the screen using the mouse. Assumes that the distance from the frame to the screen -** will remain constant -*/ - -void RLDS3D_MoveSelectedPosByScreenCoords(double delta_x, double delta_y) { - if (!sFrame) return; - RLDS3D_StopOrbitSelected(); - D3DVECTOR p1; - D3DRMVECTOR4D p2; - sFrame->GetPosition(info->scene, &p1); - info->view->Transform(&p2, &p1); - // returned value is in homogenous coords so we need to multiply by w to get vector coords - p2.x += D3DMultiply(D3DVAL((D3DVALUE)delta_x), p2.w); - p2.y += D3DMultiply(D3DVAL((D3DVALUE)delta_y), p2.w); - info->view->InverseTransform(&p1, &p2); - sFrame->SetPosition(info->scene, p1.x, p1.y, p1.z); -} - -void RLDS3D_GetDistanceFactor(D3DVALUE *temp) { - lp3DListenerInfo->GetDistanceFactor(temp); -} - -void RLDS3D_GetDopplerFactor(D3DVALUE *temp) { - lp3DListenerInfo->GetDopplerFactor(temp); -} - -void RLDS3D_GetRolloffFactor(D3DVALUE *temp) { - lp3DListenerInfo->GetRolloffFactor(temp); -} - -void RLDS3D_SetDistanceFactor(D3DVALUE temp) { - lp3DListenerInfo->SetDistanceFactor(temp, DS3D_IMMEDIATE); -} - -void RLDS3D_SetDopplerFactor(D3DVALUE temp) { - lp3DListenerInfo->SetDopplerFactor(temp, DS3D_IMMEDIATE); -} - -void RLDS3D_SetRolloffFactor(D3DVALUE temp) { - lp3DListenerInfo->SetRolloffFactor(temp, DS3D_IMMEDIATE); -} - -void RLDS3D_CommitDeferredSettings(void) { - lp3DListenerInfo->CommitDeferredSettings(); -} - -BOOL RLDS3D_SoundSelected(void) { - if (!lpDS) return FALSE; - if (!sFrame) return FALSE; - if (!sFrame->GetAppData()) return FALSE; - if (!((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound) return FALSE; - return TRUE; -} - -void RLDS3D_GetSelConeAngles(LPDWORD inner, LPDWORD outer) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->GetConeAngles(inner, outer); -} - -void RLDS3D_GetSelConeOutsideVolume(LPLONG temp) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->GetConeOutsideVolume(temp); -} - -void RLDS3D_GetSelMinimumDistance(D3DVALUE *temp) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->GetMinDistance(temp); -} - -void RLDS3D_GetSelMaximumDistance(D3DVALUE *temp) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->GetMaxDistance(temp); -} - -void RLDS3D_SetSelConeAngles(DWORD inner, DWORD outer) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->SetConeAngles(inner, outer, DS3D_IMMEDIATE); - UpdateConeVisual(); -} - -void RLDS3D_SetSelConeOutsideVolume(LONG temp) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->SetConeOutsideVolume(temp, DS3D_IMMEDIATE); -} - -void RLDS3D_SetSelMinimumDistance(D3DVALUE temp) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->SetMinDistance(temp, DS3D_IMMEDIATE); -} - -void RLDS3D_SetSelMaximumDistance(D3DVALUE temp) { - if (!RLDS3D_SoundSelected) return; - ((LPFRAMEAPPDATA)(sFrame->GetAppData()))->i3DSound->SetMaxDistance(temp, DS3D_IMMEDIATE); -} - - - - - -/* -** Orbit control windows have a pointer to the orbiting frame attached to them. The frame, in return, has the handle of the window in it's -** frameappdata. When the window is used (the value modified/Stop Orbit button hit) the window modifies the frame and itself appropriately. -** When the frame is modified (ie: Destroyed) it passes messages to the window appropriately. -*/ - -/* -** Structure to store info about an orbit -*/ - -struct ORBITDATA { - LPDIRECT3DRMFRAME orbit_frame; - LPDIRECT3DRMFRAME child_frame; - D3DVECTOR axis; // Axis around which the orbit is going - D3DVALUE speed; // Speed (angles per second) -}; - -typedef ORBITDATA* LPORBITDATA; - -/* -** Structure to store info about a bullet, used by both the dialog box and the callback function -*/ - -struct BULLETDATA { - LPDIRECT3DRMFRAME bullet_frame; - D3DVECTOR vStartPosition; - D3DVECTOR vDirection; - D3DVALUE fSpeed; - D3DVALUE fTime; -}; - -typedef BULLETDATA* LPBULLETDATA; - -static void CDECL bulletCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta) { - LPBULLETDATA binfo = (LPBULLETDATA)arg; - if (binfo->fTime <= D3DVAL(0.0)) { - binfo->fTime = D3DVAL(10.0); // Ten seconds, 5 for before and 5 for after. - D3DVALUE mult = D3DDivide(D3DMultiply(binfo->fTime, binfo->fSpeed), D3DVAL(-2.0)); // Calculate the displacement multiplier for calculating starting position - obj->SetPosition(info->scene, binfo->vStartPosition.x + D3DMultiply(mult, binfo->vDirection.x), - binfo->vStartPosition.y + D3DMultiply(mult, binfo->vDirection.y), - binfo->vStartPosition.z + D3DMultiply(mult, binfo->vDirection.z)); - } - else binfo->fTime -= delta; -} - - -/* -** Stops the passed frame from orbiting or from bulleting -*/ - -void StopOrbiting(LPDIRECT3DRMFRAME stopme) { - // If it isn't orbiting we don't need to stop it! - if (!stopme) return; - if (!stopme->GetAppData()) return; - FRAMEAPPDATA* data = (FRAMEAPPDATA*)stopme->GetAppData(); - if (data->bOrbiting) { - if (data->hDlg) { - // We explicitly call EndDialog on the orbit's control without sending it any message. As a result we have - // to grab it's associated orbitdata and delete it ourselves. - LPORBITDATA orbit_data = (LPORBITDATA)GetWindowLong(data->hDlg, DWL_USER); - if (orbit_data) delete orbit_data; - EndDialog(data->hDlg, TRUE); - } - - // Get its parent - LPDIRECT3DRMFRAME parent; - stopme->GetParent(&parent); - - // Put this frame back into the scene frame (this assumes that's where it came from) - info->scene->AddChild(stopme); - - // The parent frame of an orbiting visual is only around to make the object orbit, so we don't need it - parent->Release(); - data->bOrbiting = FALSE; - data->hDlg = 0; - } - if (data->bBullet) { - if (data->hDlg) { - LPBULLETDATA bullet_data = (LPBULLETDATA)GetWindowLong(data->hDlg, DWL_USER); - stopme->SetPosition(info->scene, bullet_data->vStartPosition.x, bullet_data->vStartPosition.y, bullet_data->vStartPosition.z); - if (bullet_data) delete bullet_data; - EndDialog(data->hDlg, TRUE); - stopme->DeleteMoveCallback(bulletCallback, bullet_data); - } - stopme->SetVelocity(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), TRUE); - data->bBullet = FALSE; - data->hDlg = 0; - } -} - -void RLDS3D_StopOrbitSelected() { - StopOrbiting(sFrame); -} - -/* -** Windows procedure for the orbit dialog box -*/ - -BOOL CALLBACK OrbitDlgProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - lparam = lparam; - - LPORBITDATA my_data = (ORBITDATA*)GetWindowLong(win, DWL_USER); - char lpszTS[100]; - - switch (msg) - { - case WM_INITDIALOG: - // We've set it up to pass in the pointer to our case-specific data (through WM_INITDIALOG) - // so we tuck it away for later use. This points to the ORBITDATA structure associated with - // this dialog box - SetWindowLong(win, DWL_USER, lparam); - sprintf(lpszTS, "%f", ((LPORBITDATA)lparam)->speed); - SendDlgItemMessage(win, IDC_ORBIT, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_ORBIT, EM_SETLIMITTEXT, 100, 0); - return TRUE; - - case WM_COMMAND: - { - if (wparam == IDOK) { - // Stopping the orbit will end the dialog for us. - StopOrbiting(my_data->child_frame); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_ORBIT) { - // Get string length - int stringlength = SendDlgItemMessage(win, IDC_ORBIT, EM_LINELENGTH, 0, 0); - // Check to make sure the string isn't too long - atof accepts up to 100 chars - if (stringlength > 99) return TRUE; - lpszTS[0] = (char)stringlength; - // Get string - SendDlgItemMessage(win, IDC_ORBIT, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Store speed and set new rotation - my_data->speed = D3DVAL(atof(lpszTS)); - my_data->orbit_frame->SetRotation(info->scene, my_data->axis.x, my_data->axis.y, my_data->axis.z, my_data->speed); - return TRUE; - } - else return FALSE; - } - break; - } - return FALSE; -} - -/* -** Windows proc for the bullet dialog box -*/ - -BOOL CALLBACK BulletDlgProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - lparam = lparam; - - LPBULLETDATA my_data = (BULLETDATA*)GetWindowLong(win, DWL_USER); - char lpszTS[100]; - - switch (msg) - { - case WM_INITDIALOG: - // We've set it up to pass in the pointer to our case-specific data (through WM_INITDIALOG) - // so we tuck it away for later use. This points to the ORBITDATA structure associated with - // this dialog box - SetWindowLong(win, DWL_USER, lparam); - sprintf(lpszTS, "%f", ((LPBULLETDATA)lparam)->fSpeed); - SendDlgItemMessage(win, IDC_BULLET, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_BULLET, EM_SETLIMITTEXT, 100, 0); - return TRUE; - - case WM_COMMAND: - { - if (wparam == IDOK) { - // Stopping the orbit will end the dialog for us. - StopOrbiting(my_data->bullet_frame); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_BULLET) { - // Get string length - int stringlength = SendDlgItemMessage(win, IDC_BULLET, EM_LINELENGTH, 0, 0); - // Check to make sure the string isn't too long - atof accepts up to 100 chars - if (stringlength > 99) return TRUE; - lpszTS[0] = (char)stringlength; - // Get string - SendDlgItemMessage(win, IDC_BULLET, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - - // Store speed and set - my_data->fSpeed = D3DVAL(atof(lpszTS)); - my_data->bullet_frame->SetVelocity(info->scene, D3DMultiply(my_data->vDirection.x, my_data->fSpeed), - D3DMultiply(my_data->vDirection.y, my_data->fSpeed), - D3DMultiply(my_data->vDirection.z, my_data->fSpeed), - TRUE); - return TRUE; - } - else return FALSE; - } - break; - } - return FALSE; -} - - - -/* -** Orbits the currently selected object around the camera... creates a frame which is centred at the camera and contains -** the selected frame, and then rotates that frame around the camera -*/ - -ULONG orbit_num = 1; - -void RLDS3D_OrbitSelected(void) { - if (!sFrame) return; - StopOrbiting(sFrame); - FRAMEAPPDATA* tempdat; - - // Need to create orbit data, if not then can't orbit - LPORBITDATA orbitdat = new ORBITDATA; - if (!orbitdat) return; - - if (!sFrame->GetAppData()) { - tempdat = new FRAMEAPPDATA(); - if (!tempdat) return; - sFrame->SetAppData((ULONG)(tempdat)); - } - else { - tempdat = (LPFRAMEAPPDATA)sFrame->GetAppData(); - } - - // Create a frame. Centre it around the camera. Add the selected frame. Rotate it! - LPDIRECT3DRMFRAME orbiting_frame; - - if (!D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &orbiting_frame))) return; - - orbiting_frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - orbiting_frame->SetOrientation(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0)); - orbiting_frame->AddChild(sFrame); - - D3DVECTOR vDir, vUp; - info->camera->GetOrientation(info->scene, &vDir, &vUp); - - // Store orbit info - orbitdat->orbit_frame = orbiting_frame; - orbitdat->child_frame = sFrame; - orbitdat->speed = D3DVAL(1.0); - orbitdat->axis.x = vUp.x; - orbitdat->axis.y = vUp.y; - orbitdat->axis.z = vUp.z; - - orbiting_frame->SetRotation(info->scene, vUp.x, vUp.y, vUp.z, orbitdat->speed); - - // Set the boolean in the frame's appinfo to tell everyone it's orbiting - tempdat->bOrbiting = TRUE; - - // Create a dialog box and orbitinfo so that this thing has something to control it - HWND mydial = CreateDialogParam(hinst, "OrbitBox", hwndParent, (int(__stdcall*)(void))OrbitDlgProc, (LONG)orbitdat); - if (mydial) { - char name_string[50]; - sprintf(name_string, "Orbit #%i", orbit_num++); - SetWindowText(mydial, name_string); - ShowWindow(mydial, SW_SHOW); - UpdateWindow(mydial); - tempdat->hDlg = mydial; - } -} - -/* -** Bullet the currently selected object. Bullets have two properties: Speed and bullet-time. The bullet passes through it's original -** position along the path defined by the viewer's original viewpoint (it heads towards the viewer). It takes 5 seconds to get to the -** viewer and five seconds once past the viewer, and continues doing thus until the bullet is stopped. Speed is controlled by the user. -*/ - -ULONG bullet_num = 1; - -void RLDS3D_BulletSelected(void) { - if (!sFrame) return; - StopOrbiting(sFrame); - - FRAMEAPPDATA* tempdat; - if (!sFrame->GetAppData()) { - tempdat = new FRAMEAPPDATA(); - if (!tempdat) return; - sFrame->SetAppData((ULONG)(tempdat)); - } - else { - tempdat = (LPFRAMEAPPDATA)sFrame->GetAppData(); - } - - // Create a new bullet object and attach our callback to the frame (it will release itself and put itself back - // into position when it's done!) - - LPBULLETDATA bs = new BULLETDATA; - if (!bs) return; - - sFrame->GetPosition(info->scene, &(bs->vStartPosition)); - - D3DVECTOR vDir, vUp; - info->camera->GetOrientation(info->scene, &vDir, &vUp); - // velocity heading towards camera - bs->vDirection.x = -vDir.x; - bs->vDirection.y = -vDir.y; - bs->vDirection.z = -vDir.z; - - bs->bullet_frame = sFrame; - bs->fTime = D3DVAL(10.0); // Ten seconds, 5 for before and 5 for after. - bs->fSpeed = D3DVAL(10.0); - - D3DVALUE mult = D3DDivide(D3DMultiply(bs->fTime, bs->fSpeed), D3DVAL(-2.0)); // Calculate the displacement multiplier for calculating starting position - - sFrame->SetPosition(info->scene, bs->vStartPosition.x + D3DMultiply(mult, bs->vDirection.x), - bs->vStartPosition.y + D3DMultiply(mult, bs->vDirection.y), - bs->vStartPosition.z + D3DMultiply(mult, bs->vDirection.z)); - - sFrame->SetVelocity(info->scene, D3DMultiply(bs->vDirection.x, bs->fSpeed), - D3DMultiply(bs->vDirection.y, bs->fSpeed), - D3DMultiply(bs->vDirection.z, bs->fSpeed), - TRUE); - - sFrame->AddMoveCallback(bulletCallback, (void*)bs); - - // Set the boolean in the frame's appinfo to tell everyone it's orbiting - tempdat->bBullet = TRUE; - - // Create a dialog box and orbitinfo so that this thing has something to control it - HWND mydial = CreateDialogParam(hinst, "BulletBox", hwndParent, (int(__stdcall*)(void))BulletDlgProc, (LONG)bs); - if (mydial) { - char name_string[50]; - sprintf(name_string, "Bullet #%i", bullet_num++); - SetWindowText(mydial, name_string); - ShowWindow(mydial, SW_SHOW); - UpdateWindow(mydial); - tempdat->hDlg = mydial; - } -} - -/* -********************************** DIRECTSOUND 3D FUNCTIONS ***************************************** -*/ - -/* -** The RLDS3D interface allows you to attach sound(s) to the selected object which can then be played and -** whose 3D audio position will update according to the RL object's position -** -** Some functionality is applied to all sounds, and as a result, the RLDS3D interface keeps a record of -** existing sounds and which frames they are attached to. Removal of a frame and/or a sound updates these -** records -*/ - -/* -** CALLBACKS - update position as 3D objects move around -*/ - - -// The listener callback is attached to the camera. This is done in CreateScene() -static void CDECL listenerCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta) -{ - arg = arg; - if (!lpDS) return; - D3DVECTOR rlvCameraInfo, rlvCameraUp; - - info->camera->GetPosition(info->scene, &rlvCameraInfo); - lp3DListenerInfo->SetPosition(rlvCameraInfo.x, rlvCameraInfo.y, - rlvCameraInfo.z, DS3D_DEFERRED); - - info->camera->GetOrientation(info->scene, &rlvCameraInfo, &rlvCameraUp); - lp3DListenerInfo->SetOrientation(rlvCameraInfo.x, rlvCameraInfo.y, - rlvCameraInfo.z, rlvCameraUp.x, - rlvCameraUp.y, rlvCameraUp.z, DS3D_DEFERRED); - - info->camera->GetVelocity(info->scene, &rlvCameraInfo, TRUE); - lp3DListenerInfo->SetVelocity(rlvCameraInfo.x, rlvCameraInfo.y, - rlvCameraInfo.z, DS3D_DEFERRED); - - lp3DListenerInfo->CommitDeferredSettings(); -} - - -// Sounds are updated whenever their frame moves using Render Callbacks. This is the callback function. -static void CDECL soundCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delay) -{ - arg = arg; - LPDIRECT3DRMFRAME tFrame = (LPDIRECT3DRMFRAME)obj; - if (!lpDS) return; - // Get the sound from the frame's app data - LPFRAMEAPPDATA lpAppDat = (LPFRAMEAPPDATA)tFrame->GetAppData(); - if (!lpAppDat) return; - // Get the 3D sound buffer and remove the sound callback if it's NULL since it shouldn't exist - if (!lpAppDat->Sound || !lpAppDat->i3DSound) { - releaseSoundCallback(tFrame); - return; - } - D3DVECTOR rlvVisualInfo, rlvVisualUp; - - tFrame->GetPosition(info->scene, &rlvVisualInfo); - lpAppDat->i3DSound->SetPosition(rlvVisualInfo.x, rlvVisualInfo.y, - rlvVisualInfo.z, DS3D_DEFERRED); - - tFrame->GetOrientation(info->scene, &rlvVisualInfo, &rlvVisualUp); - lpAppDat->i3DSound->SetConeOrientation(rlvVisualInfo.x, rlvVisualInfo.y, - rlvVisualInfo.z, DS3D_DEFERRED); - - tFrame->GetVelocity(info->scene, &rlvVisualInfo, TRUE); - lpAppDat->i3DSound->SetVelocity(rlvVisualInfo.x, rlvVisualInfo.y, - rlvVisualInfo.z, DS3D_DEFERRED); - - lp3DListenerInfo->CommitDeferredSettings(); -} - -// This adds a sound callback function to a frame -void setSoundCallback(LPDIRECT3DRMFRAME frame) { - frame->AddMoveCallback(soundCallback, NULL); -} - -// Removes a sound callback from a frame -void releaseSoundCallback(LPDIRECT3DRMFRAME frame) { - frame->DeleteMoveCallback(soundCallback, NULL); -} - -/* -** Sound records - keeps track of which frames have sounds associated with them and -** adds/removes the sounds as required. -*/ - -struct SoundRecord { - LPDIRECT3DRMFRAME lpFrame; - SoundRecord* next; -}; - -SoundRecord* top = NULL; - -BOOL Recurse_Remove(LPDIRECT3DRMFRAME owner, SoundRecord* record) { - if (!record) return FALSE; - if (Recurse_Remove(owner, record->next)) { - SoundRecord* temp = record->next; - record->next = temp->next; - delete temp; - } - if (owner == record->lpFrame) return TRUE; - return FALSE; -} - -// Removes a frame from the records -void RemoveSoundRecord(LPDIRECT3DRMFRAME owner) { - if (!owner) return; - - // Don't bother deleting frames without appdata and a sound associated with them - // because they SHOULDN'T be on the list. - if (!owner->GetAppData()) return; - LPFRAMEAPPDATA data = (LPFRAMEAPPDATA)(owner->GetAppData()); - if (!data->Sound) return; - - // Release the sound and remove the soundrecord from the list. - data->i3DSound->Release(); - data->i3DSound = NULL; - data->Sound->Release(); - data->Sound = NULL; - releaseSoundCallback(owner); - - if (Recurse_Remove(owner, top)) { - SoundRecord* temp = top; - top = top->next; - delete temp; - } -} - -// Adds a frame to the records -void AddSoundRecord(LPDIRECT3DRMFRAME owner, char* sound_filename) { - if (!lpDS) return; - if (!owner) return; - if (!sound_filename) return; - - // Removes all previous sounds from this frame - RemoveSoundRecord(owner); - - // Create frame data for this frame if it hasn't already been done - LPFRAMEAPPDATA data = (LPFRAMEAPPDATA)(owner->GetAppData()); - if (!data) { - data = new FRAMEAPPDATA(); - if (!data) return; - owner->SetAppData((ULONG)data); - } - - // Create the sound and attach it to the frame - data->Sound = DSLoad3DSoundBuffer(lpDS, sound_filename); - if (!data->Sound) return; - - // Query to get the 3D interface, destroy the sound buffer if it's not available... - data->Sound->QueryInterface(IID_IDirectSound3DBuffer, (void**)&data->i3DSound); - if (!data->i3DSound) { - data->Sound->Release(); - data->Sound = NULL; - return; - } - - // Set the minimum distance at which the sound's amplitude should decay. - data->i3DSound->SetMinDistance((D3DVALUE)10.0, DS3D_IMMEDIATE); - - setSoundCallback(owner); - - SoundRecord* temp = new SoundRecord; - temp->next = top; - top = temp; - top->lpFrame = owner; -} - -/* -** Functionality for users -*/ - -// Stops all the sounds in the world. (Actually, only in the local RL world.) -// Runs through the records of all the sounds and stops them. -void RLDS3D_StopAllSounds() { - if (!lpDS) return; - SoundRecord* temp = top; - while (temp) { - LPFRAMEAPPDATA data = (LPFRAMEAPPDATA)(temp->lpFrame->GetAppData()); - if (data) { - if (data->Sound) data->Sound->Stop(); - } - temp = temp->next; - } -} - -// Removes all sounds in the world -void RLDS3D_RemoveAllSounds() { - if (!lpDS) return; - while (top) RemoveSoundRecord(top->lpFrame); - UpdateConeVisual(); -} - -// Plays the sound associated with the currently selected object -void RLDS3D_PlaySound(BOOL bIsLooping) { - if (!sFrame) return; - if (!lpDS) return; - LPFRAMEAPPDATA lpAppDat = (LPFRAMEAPPDATA)sFrame->GetAppData(); - if (lpAppDat) { - if (lpAppDat->Sound) { - lpAppDat->Sound->Stop(); - lpAppDat->Sound->SetCurrentPosition(0); - if (bIsLooping) { - lpAppDat->Sound->Play(0,0,DSBPLAY_LOOPING); - } - else { - lpAppDat->Sound->Play(0,0,0); - } - } - } -} - -// Stops the sound associated with the currently selected object -void RLDS3D_StopSelectedSound() { - if (!sFrame) return; - if (!lpDS) return; - LPFRAMEAPPDATA lpAppDat = (LPFRAMEAPPDATA)sFrame->GetAppData(); - if (lpAppDat) { - if (lpAppDat->Sound) { - lpAppDat->Sound->Stop(); - } - } -} - -// Removes the sound from the currently selected object -void RLDS3D_RemoveSound() { - RLDS3D_StopSelectedSound(); - if (!sFrame) return; - if (!lpDS) return; - RemoveSoundRecord(sFrame); - UpdateConeVisual(); -} - -// Attaches a sound (filename provided) to the selected frame -void RLDS3D_AttachSound(char* filename) { - // Removes the sound attached to the currently selected item (if it exists) - RLDS3D_RemoveSound(); - if (!sFrame) return; - if (!lpDS) return; - AddSoundRecord(sFrame, filename); - UpdateConeVisual(); -} - -/* -************************************* MISC. MAINTENANCE FUNCTIONS ************************************** -*/ - -/* -** Allows external users access to the RL Device to deal with Windows-related issues -** (See case WM_ACTIVATE: and case WM_PAINT: in viewer source for examples of HandleActivate() and HandlePaint()) -** Design note: This was done to save time from the conversion from the old version of the viewer rather than -** having RLDS3D_HandleActivate(), etc. -*/ - -LPDIRECT3DRMDEVICE RLDS3D_WinDevice() { - if (!info) return NULL; - return info->dev; -} - -/* -** Handles activation messages from the window -*/ - -void RLDS3D_HandleActivate(WPARAM wparam) { - if (!info || !info->dev) return; - LPDIRECT3DRMWINDEVICE windev; - if (D3DRM_SUCCEED(info->dev->QueryInterface(IID_IDirect3DRMWinDevice, (void **) &windev))) { - windev->HandleActivate(wparam); - windev->Release(); - } -} - -/* -** Handles paint messages from the window - the paintstruct which BeginPaint has been called on is -** passed to it -*/ - -void RLDS3D_HandlePaint(PAINTSTRUCT* ps) { - if (!info) return; - LPDIRECT3DRMWINDEVICE windev; - if (D3DRM_SUCCEED(info->dev->QueryInterface(IID_IDirect3DRMWinDevice, (void **) &windev))) { - windev->HandlePaint(ps->hdc); - windev->Release(); - } -} - -/* -** Tells whether or not sound is initialized -*/ - -BOOL RLDS3D_SoundInitialized() { - if (lpDS) return TRUE; - return FALSE; -} - -/* -** Tells whether or not a frame is selected -*/ - -BOOL RLDS3D_FrameSelected() { - if (sFrame) return TRUE; - return FALSE; -} - -/* -** Render the scene into the viewport. -*/ - -void RLDS3D_Render(D3DVALUE time_delta) -{ - // When the WM_SIZE message passes 0's as size to the ResizeViewport we know that it's minimized, in which case we don't render it. - if (info->bMinimized == TRUE) return; - D3DRM_SUCCEED(info->scene->Move(time_delta)); - D3DRM_SUCCEED(info->view->Clear()); - D3DRM_SUCCEED(info->view->Render(info->scene)); - D3DRM_SUCCEED(info->dev->Update()); -} - - -/* - * Resize the viewport and device when the window size changes. - */ -void RLDS3D_ResizeViewport(int width, int height) -{ - int view_width = info->view->GetWidth(); - int view_height = info->view->GetHeight(); - int dev_width = info->dev->GetWidth(); - int dev_height = info->dev->GetHeight(); - - if (!(width && height)) { - info->bMinimized = TRUE; - return; - - } - else info->bMinimized = FALSE; - - if (view_width == width && view_height == height) - return; - else info->bMinimized = FALSE; - - if (width <= dev_width && height <= dev_height) { - info->view->Release(); - D3DRM_SUCCEED(lpD3DRM->CreateViewport(info->dev, info->camera, 0, 0, width, height, &info->view)); - info->view->SetBack(D3DVAL(400.0)); - } - - int ret; - if (!RebuildDevice(hwndParent, info, width, height)) { - ret = MessageBox(hwndParent, "Unable to create Direct3D device", "D3DRM Fatal Error", MB_APPLMODAL|MB_ICONSTOP|MB_OK); - PostMessage(hwndParent, WM_CLOSE,0,0); - }; -} - -/* -** Sets/Gets the polygon fill mode -*/ - -D3DRMFILLMODE RLDS3D_GetPolygonFillMode(void) { - return (D3DRMFILLMODE)(info->dev->GetQuality() & D3DRMFILL_MASK); -} - -void RLDS3D_SetPolygonFillMode(D3DRMFILLMODE quality) { - D3DRMRENDERQUALITY oldq = info->dev->GetQuality(); - oldq = (oldq & ~D3DRMFILL_MASK) | quality; - info->dev->SetQuality(oldq); -} - -/* -** Sets/Gets the polygon shading mode -*/ - -D3DRMSHADEMODE RLDS3D_GetPolygonShadeMode(void) { - return (D3DRMSHADEMODE)(info->dev->GetQuality() & D3DRMSHADE_MASK); -} - -void RLDS3D_SetPolygonShadeMode(D3DRMSHADEMODE quality) { - D3DRMRENDERQUALITY oldq = info->dev->GetQuality(); - oldq = (oldq & ~D3DRMSHADE_MASK) | quality; - info->dev->SetQuality(oldq); -} - - -/* -** Sets/Gets the color model for the viewport (RGB or mono (256-color-based)) -*/ - -D3DRMCOLORMODEL RLDS3D_GetColourModel(void) { - return info->model; -} - -void RLDS3D_SetColourModel(D3DRMCOLORMODEL model) { - info->model = model; - int ret; - if (!RebuildDevice(hwndParent, info, info->dev->GetWidth(), info->dev->GetHeight())) { - ret = MessageBox(hwndParent, "Unable to selected Direct3D device", "D3DRM Fatal Error", MB_APPLMODAL|MB_ICONSTOP|MB_OK); - PostMessage(hwndParent, WM_CLOSE,0,0); - } -} - -/* -** Sets/Gets whether or not lighting is on -*/ - -BOOL RLDS3D_GetLighting(void) { - D3DRMLIGHTMODE mode = (D3DRMLIGHTMODE)(info->dev->GetQuality() & D3DRMLIGHT_MASK); - if (mode == D3DRMLIGHT_ON) return TRUE; - return FALSE; -} - -void RLDS3D_SetLighting(BOOL new_val) { - D3DRMRENDERQUALITY qual = info->dev->GetQuality() & ~D3DRMLIGHT_MASK; - if (new_val) qual |= D3DRMLIGHT_ON; else qual |= D3DRMLIGHT_OFF; - info->dev->SetQuality(qual); -} - -/* -** Sets/Gets whether or not dithering is on -*/ - -BOOL RLDS3D_GetDither(void) { - return info->dev->GetDither(); -} - -void RLDS3D_SetDither(BOOL dither) { - info->dev->SetDither(dither); -} - -/* -** Sets/Gets texture quality (only relevant for RGB modes) -*/ - -D3DRMTEXTUREQUALITY RLDS3D_GetTextureQuality(void) { - return info->dev->GetTextureQuality(); -} - -void RLDS3D_SetTextureQuality(D3DRMTEXTUREQUALITY new_quality) { - info->dev->SetTextureQuality(new_quality); -} - - -/* -************************************* INTERNAL FUNCTIONS (Not part of API) ******************************** -*/ - -/* -** Given a bounding box this generates a visual representation of it using rods and cones -*/ - -static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX* box) -{ - LPDIRECT3DRMMESHBUILDER mesh; - static D3DVECTOR zero = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)}; - static D3DVECTOR dir = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)}; - D3DVECTOR a, b; - - if (!D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&mesh))) return NULL; - - dir.z = box->max.z + D3DVAL(1.0); - AddRod(mesh, D3DVAL(0.05), zero, dir); - a = dir; - a.z += D3DVAL(0.6); - AddCone(mesh, D3DVAL(0.2), dir, a); - a = box->min; - b = a; - b.y = box->max.y; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->max.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.y = box->min.y; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->min.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.z = box->max.z; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->max.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.y = box->max.y; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->min.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.y = box->min.y; - AddRod(mesh, D3DVAL(0.05), a, b); - b.y = box->max.y; a = b; b.z = box->min.z; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b = box->max; b.z = box->min.z; - AddRod(mesh, D3DVAL(0.05), a, b); - a.y = box->min.y; b = a; b.z = box->min.z; - AddRod(mesh, D3DVAL(0.05), a, b); - - if (!D3DRM_SUCCEED(mesh->SetColor(D3DRMCreateColorRGB(D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0))))) { - mesh->Release(); - return NULL; - } - return mesh; -} - -/* -** Given a box, this creates a mesh in the shape of a 16-sided speaker cone aimed forward with requested angle -*/ - -#define CONE_POINTS 16 -#define pi 3.14159 - -static LPDIRECT3DRMMESHBUILDER makeSpeaker(D3DRMBOX* box, D3DVALUE in_angle) { - if (!box) return NULL; - - D3DVALUE angle = in_angle / D3DVAL(2.0); - DWORD* speaker_faces = new DWORD[CONE_POINTS*4+1]; - if (!speaker_faces) return NULL; - memset(speaker_faces, 0, sizeof(DWORD[CONE_POINTS*4+1])); - - LPDIRECT3DRMMESHBUILDER mesh; - if (!D3DRM_SUCCEED(lpD3DRM->CreateMeshBuilder(&mesh))) { - delete speaker_faces; - return NULL; - } - - static D3DVECTOR zero = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)}; - - D3DVECTOR v[CONE_POINTS+1]; - - // center of the cone - v[CONE_POINTS] = zero; - - int looper; - - // Angle along XZ plane which is rotated CONE_POINT times to form cone - D3DVECTOR base_angle; - base_angle.z = (box->max.z + D3DVAL(2.0)) * (D3DVALUE)cos(angle * pi / 180.0); - base_angle.x = (box->max.z + D3DVAL(2.0)) * (D3DVALUE)sin(angle * pi / 180.0); - base_angle.y = D3DVAL(0.0); - - for (looper=0; looperAddFaces(CONE_POINTS+1, v, 0, NULL, speaker_faces, NULL))) { - delete speaker_faces; - mesh->Release(); - return NULL; - } - - for (looper=0; looperAddFaces(CONE_POINTS+1, v, 0, NULL, speaker_faces, NULL))) { - delete speaker_faces; - mesh->Release(); - return NULL; - } - - delete speaker_faces; - - if (!D3DRM_SUCCEED(mesh->SetColor(D3DRMCreateColorRGB(D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0))))) { - mesh->Release(); - return NULL; - } - - if (!D3DRM_SUCCEED(mesh->SetQuality((mesh->GetQuality() & ~D3DRMSHADE_MASK) | D3DRMSHADE_FLAT))) { - mesh->Release(); - return NULL; - } - - return mesh; -} - -/* -** Selects the given visual inside the given frame -*/ - -void UpdateConeVisual(void) { - if (!sFrame) return; - if (!sFrame->GetAppData()) return; - LPFRAMEAPPDATA fd = (LPFRAMEAPPDATA)sFrame->GetAppData(); - if (!fd->i3DSound) return; - if (showBoxes && sVisual) - { D3DRMBOX box; - LPDIRECT3DRMMESHBUILDER builder; - sFrame->DeleteVisual(selectionSpeaker); - sVisual->GetBox(&box); - DWORD temp, outer; - fd->i3DSound->GetConeAngles(&temp, &outer); - builder = makeSpeaker(&box, D3DVAL(temp)); - builder->CreateMesh(&selectionSpeaker); - sFrame->AddVisual(selectionSpeaker); - selectionSpeaker->Release(); - builder->Release(); - } - -} - -void SelectVisual(LPDIRECT3DRMMESHBUILDER visual, LPDIRECT3DRMFRAME frame) { - RLDS3D_DeselectVisual(); - sVisual = visual; - sFrame = frame; - - if (sVisual) - { LPDIRECT3DRMLIGHTARRAY lights; - - sLight = 0; - sFrame->GetLights(&lights); - if (lights) - { if (lights->GetSize()) - { lights->GetElement(0, &sLight); - sLight->Release(); /* reinstate reference count */ - } - lights->Release(); - } - - if (showBoxes && visual) - { D3DRMBOX box; - LPDIRECT3DRMMESHBUILDER builder; - - sVisual->GetBox(&box); - builder = makeBox(&box); - builder->CreateMesh(&selectionBox); - sFrame->AddVisual(selectionBox); - selectionBox->Release(); - builder->Release(); - UpdateConeVisual(); - } - } -} - -LPGUID -FindDevice(D3DCOLORMODEL cm) -{ - LPDIRECTDRAW lpDD; - LPDIRECT3D lpD3D; - D3DFINDDEVICESEARCH search; - static D3DFINDDEVICERESULT result; - HRESULT error; - - if (DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK) - return NULL; - - if (lpDD->QueryInterface(IID_IDirect3D, (void**) &lpD3D) != DD_OK) { - lpDD->Release(); - return NULL; - } - - memset(&search, 0, sizeof search); - search.dwSize = sizeof search; - search.dwFlags = D3DFDS_COLORMODEL; - search.dcmColorModel = (cm == D3DCOLOR_MONO) ? D3DCOLOR_MONO : D3DCOLOR_RGB; - - memset(&result, 0, sizeof result); - result.dwSize = sizeof result; - - error = lpD3D->FindDevice(&search, &result); - - lpD3D->Release(); - lpDD->Release(); - - if (error != D3D_OK) - return NULL; - else - return &result.guid; -} - -/* - * Create the device and viewport. - */ - -static BOOL CreateDevice(HWND win, AppInfo* info) -{ - RECT r; - int bpp; - HDC hdc; - - GetClientRect(win, &r); - if (!D3DRM_SUCCEED(lpD3DRM->CreateDeviceFromClipper(lpDDClipper, NULL, r.right, r.bottom, &info->dev))) return FALSE; - - hdc = GetDC(win); - bpp = GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(win, hdc); - switch (bpp) - { - case 1: - info->dev->SetShades(4); - lpD3DRM->SetDefaultTextureShades(4); - break; - case 16: - info->dev->SetShades(32); - lpD3DRM->SetDefaultTextureColors(64); - lpD3DRM->SetDefaultTextureShades(32); - info->dev->SetDither(FALSE); - break; - case 24: - info->dev->SetShades(256); - lpD3DRM->SetDefaultTextureColors(64); - lpD3DRM->SetDefaultTextureShades(256); - info->dev->SetDither(FALSE); - break; - default: - info->dev->SetDither(FALSE); - } - if (!CreateScene(info)) { - info->dev->Release(); - return FALSE; - } - if (!D3DRM_SUCCEED(lpD3DRM->CreateViewport(info->dev, info->camera, 0, 0, info->dev->GetWidth(), info->dev->GetHeight(), &info->view))) { - info->dev->Release(); - return FALSE; - } - info->view->SetBack(D3DVAL(5000.0)); - return TRUE; -} - -/* - * Creates a simple scene and adds it to the main scene - */ - -static BOOL CreateScene(AppInfo* info) -{ - LPDIRECT3DRMFRAME light; - LPDIRECT3DRMLIGHT light1, light2; - - // Note that if something fails, we don't bother freeing up everything we've created... the caller to CreateScene should destroy - // the lpD3DRM object and that should happily release everything created with it. - // Also note that, since we're just the viewer, if there's a critical error we pass a quit message with our error message since - // we'd want to quit if the initialize failed anyways... - - if (!D3DRM_SUCCEED(lpD3DRM->CreateFrame(NULL, &info->scene))) return FALSE; - if (!D3DRM_SUCCEED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light1))) return FALSE; - if (!D3DRM_SUCCEED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT, D3DVAL(0.1), D3DVAL(0.1), D3DVAL(0.1), &light2))) return FALSE; - if (!D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &light))) return FALSE; - - light->SetPosition(info->scene, D3DVAL(2.0), D3DVAL(2.0), D3DVAL(5.0)); - light->SetOrientation(info->scene, D3DVAL(-1.0), D3DVAL(-1.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0)); - light->AddLight(light1); - info->scene->AddLight(light2); - - if (!D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &info->camera))) return FALSE; - info->camera->SetPosition(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - // Add a callback to the camera's frame so that the listener is updated with the camera - info->camera->AddMoveCallback(listenerCallback, NULL); - - light->Release(), light1->Release(), light2->Release(); - return TRUE; -} - -/* - * Regenerate the device if the color model changes or the window size - * changes. - */ -static BOOL RebuildDevice(HWND win, AppInfo* info, int width, int height) -{ - int old_dither = info->dev->GetDither(); - D3DRMRENDERQUALITY old_quality = info->dev->GetQuality(); - int old_shades = info->dev->GetShades(); - - info->view->Release(); - info->dev->Release(); - - LPGUID guid = FindDevice(info->model); - - if (!guid) return FALSE; - - if (!D3DRM_SUCCEED(lpD3DRM->CreateDeviceFromClipper(lpDDClipper, guid, width, height, &info->dev))) return FALSE; - - info->dev->SetDither(old_dither); - info->dev->SetQuality(old_quality); - info->dev->SetShades(old_shades); - width = info->dev->GetWidth(); - height = info->dev->GetHeight(); - if (!D3DRM_SUCCEED(lpD3DRM->CreateViewport(info->dev, info->camera, 0, 0, width, height, &info->view))) return FALSE; - info->view->SetBack(D3DVAL(400.0)); - return TRUE; -} - -/* - * Place an object in front of the camera. - */ -static void PlaceMesh(LPDIRECT3DRMMESHBUILDER mesh, AppInfo *info) -{ - LPDIRECT3DRMFRAME frame; - - if (!D3DRM_SUCCEED(lpD3DRM->CreateFrame(info->scene, &frame))) return; - frame->AddVisual(mesh); - frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(15.0)); - frame->Release(); -} - -HRESULT loadTextures(char *name, void *arg, LPDIRECT3DRMTEXTURE *tex) -{ - char* ext = LSTRRCHR(name, (int)'.'); - - if (ext && !lstrcmpi(ext, ".ppm")) - if (D3DRM_SUCCEED(lpD3DRM->LoadTexture(name, tex))) return 0; - return -1; -} - -/* -** Finds the last occurance of bChar in a null-terminated string, good for finding a pointer to the extension of a filename -*/ -char* LSTRRCHR( const char* lpString, int bChar ) -{ - if( lpString != NULL ) - { - const char* lpBegin; - - lpBegin = lpString; - - while( *lpString != 0 ) - { - lpString++; - } - - while( 1 ) - { - if( *lpString == bChar ) - { - return (char*)lpString; - } - - if( lpString == lpBegin ) - { - break; - } - - lpString--; - } - } - - return NULL; -} /* LSTRRCHR */ - - -/* -** Strange little function to pick a color from a table using standardized Windows stuff -*/ - -int ChooseNewColor(HWND win, D3DCOLOR* current) -{ - CHOOSECOLOR cc; - COLORREF clr; - COLORREF aclrCust[16]; - int i; - - for (i = 0; i < 16; i++) - aclrCust[i] = RGB(255, 255, 255); - - clr = - RGB - ( (int) (255 * D3DRMColorGetRed(*current)), - (int) (255 * D3DRMColorGetGreen(*current)), - (int) (255 * D3DRMColorGetBlue(*current)) - ); - - memset(&cc, 0, sizeof(CHOOSECOLOR)); - cc.lStructSize = sizeof(CHOOSECOLOR); - cc.hwndOwner = win; - cc.rgbResult = clr; - cc.lpCustColors = aclrCust; - cc.Flags = CC_RGBINIT|CC_FULLOPEN; - - if (ChooseColor(&cc)) - { *current = - D3DRMCreateColorRGB - ( D3DVAL(GetRValue(cc.rgbResult) / D3DVAL(255.0)), - D3DVAL(GetGValue(cc.rgbResult) / D3DVAL(255.0)), - D3DVAL(GetBValue(cc.rgbResult) / D3DVAL(255.0)) - ); - return TRUE; - } - else return FALSE; -} diff --git a/sdk/samples/ds3dview/rlds3d.h b/sdk/samples/ds3dview/rlds3d.h deleted file mode 100644 index 8f38752..0000000 --- a/sdk/samples/ds3dview/rlds3d.h +++ /dev/null @@ -1,345 +0,0 @@ -#ifndef ___RLDS3D_HEADER_FILE -#define ___RLDS3D_HEADER_FILE - -#include "d3drmwin.h" - -/* -** This is an interface between the viewer and the RL/DS3D APIs which provides the -** functionality required by the viewer in simplified form. -** -** Note: This is not an object-oriented API since there should only be need for one -** copy at a time and this way C++ to C conversions should be fairly easy -** -** DESCRIPTION: The user interfaces the 3D world and objects therein by selecting items -** with the mouse (on the screen) and performing operations on that item. The user will -** also be able to perform operations on the camera and a few global operations applied -** to all objects. -** -** USAGE: Create the interface using RLDS3D_Initialize() (returns FALSE if not created) -** and remove it using RLDS3D_Deinitialize(). The RLDS3D_Render() functionality draws the world -** on the screen. -*/ - -/* -************************ INITIALIZATION/DEINITIALIZATION **************************** -*/ - -/* -** Initialize will attach itself to the passed window. Call initialize after -** getting a handle for your window but before you display it. -** -** Initialize will initialize the RL API and return false if it fails. It will -** also attempt to initialize a DirectSound3D API, but failing this does not -** justify a failed Initialize (since the 3D sound isn't a necessary part of -** the viewer) -*/ - -BOOL RLDS3D_Initialize(HWND hwndPW, HANDLE this_inst); - -/* -** Deinitializes where necessary (assumes program quits after calling this otherwise it'd free up memory, etc...) -*/ - -void RLDS3D_Deinitialize(); - -/* -*************************** ADDING/REMOVING/EDITING OBJECTS ********************************* -*/ - -/* -** Loads XOF file into the RL world (with textures) -*/ - -void RLDS3D_LoadXOF(char* file); - -/* -** Sets/Gets whether or not boxes are shown around selected item -*/ - -BOOL RLDS3D_GetBoxes(void); -void RLDS3D_SetBoxes(BOOL new_val); - -/* -** Updates the bounding box around the selected visual (this could be done using a render callback function to compare the -** frame's scaling and transform functions instead) -*/ - -void RLDS3D_UpdateSelectionBox(void); - -/* -** Deselects the currently selected 3D visual. -*/ - -void RLDS3D_DeselectVisual(); - -/* -** Given coordinates it selects the first visual under those coordinates in the window's viewport -*/ - -void RLDS3D_FindAndSelectVisual(int x, int y, LPBOOL changed = NULL); - -/* -** Cuts the current selection to the clipboard -*/ - -void RLDS3D_CutVisual(); - -/* -** Copies the current selection to the clipboard -*/ - -void RLDS3D_CopyVisual(); - -/* -** Pastes the current selection to the window -*/ - -void RLDS3D_PasteVisual(); - -/* -** Deletes the current selection from the world without copying to the clipboard -*/ - -void RLDS3D_DeleteVisual(); - -/* -** Add a directional light -*/ -void RLDS3D_AddDirectionalLight(); - -/* -** Add a parallel point light -*/ -void RLDS3D_AddParallelPointLight(); - -/* -** Add Point Light -*/ -void RLDS3D_AddPointLight(); - -/* -** Add a spotlight -*/ -void RLDS3D_AddSpotlight(); - -/* -*********************************** OBJECT MOTION/SCALING/COLOURING **************************************** -*/ - -/* -** Sets the selected object's colour -*/ - -void RLDS3D_SetSelColour(); - -/* -** Moves the camera relative to itself by providing scalars to multiply against the CAMERA-RELATIVE unit vectors -** forwards/up/right. -*/ - -void RLDS3D_SetCamVelRelToCam(D3DVALUE forward, D3DVALUE up, D3DVALUE right); - -/* -** Rotates the camera around its three axis -** -** forward_axis is roll, up_axis is yaw, right_axis is pitch -** (Only one affects at a time) -*/ - -void RLDS3D_SetCamRotForward(D3DVALUE forward_axis); -void RLDS3D_SetCamRotUp(D3DVALUE up_axis); -void RLDS3D_SetCamRotRight(D3DVALUE right_axis); - -/* -** Scales the selected object in the x/y/z axis of it's orientation by the specified values -*/ - -void RLDS3D_ScaleSelected(D3DVALUE sx, D3DVALUE sy, D3DVALUE sz); - -/* -** Moves the currently selected object in the 3D world relative to the camera -*/ - -void RLDS3D_SetSelectedVelRelToCam(D3DVALUE forward, D3DVALUE up, D3DVALUE right); - -/* -** Rotates the currently selected object relative to the camera's frame when passed -** a vector for the axis and an angle of rotation. -** This is useful because the AXIS which is specified is relative to what appears on the screen with it's origin at the camera -** (ie: (0,0,1) will be an axis straight into the screen and thus things will spin around the centre of the screen) -*/ - -void RLDS3D_SetSelectedRotRelToCam(D3DVALUE AxisX, D3DVALUE AxisY, D3DVALUE AxisZ, D3DVALUE angle); - -/* -** Moves the currently selected object by x/y pixels on the screen from it's relative position. Allows a user -** to drag objects around the screen using the mouse. Assumes that the distance from the frame to the screen -** will remain constant -*/ - -void RLDS3D_MoveSelectedPosByScreenCoords(double delta_x, double delta_y); - -/* -** Orbits the selected object around the camera -*/ - -void RLDS3D_OrbitSelected(void); -void RLDS3D_StopOrbitSelected(); - -/* -** Bullets it towards the camera -*/ - -void RLDS3D_BulletSelected(void); - -/* -********************** DIRECTSOUND 3D INTERFACE ****************************** -*/ - -/* -** Stops all sounds from playing -*/ - -void RLDS3D_StopAllSounds(); - -/* -** Removes all of the sounds -*/ - -void RLDS3D_RemoveAllSounds(); - -/* -** Plays the sound associated with the currently selected object -*/ - -void RLDS3D_PlaySound(BOOL bIsLooping); - -/* -** Stops the sound associated with the currently selected object -*/ - -void RLDS3D_StopSelectedSound(); - -/* -** Removes the sound from the currently selected object -*/ - -void RLDS3D_RemoveSound(); -/* -** Attaches a sound (filename provided) to the selected frame -*/ - -void RLDS3D_AttachSound(char* filename); - -/* -** Global parameter mods -*/ -void RLDS3D_GetDistanceFactor(D3DVALUE *temp); -void RLDS3D_GetDopplerFactor(D3DVALUE *temp); -void RLDS3D_GetRolloffFactor(D3DVALUE *temp); -void RLDS3D_SetDistanceFactor(D3DVALUE temp); -void RLDS3D_SetDopplerFactor(D3DVALUE temp); -void RLDS3D_SetRolloffFactor(D3DVALUE temp); - -void RLDS3D_CommitDeferredSettings(void); - -/* -** Selected sound parameter modifications -*/ - -BOOL RLDS3D_SoundSelected(void); -void RLDS3D_GetSelConeAngles(LPDWORD inner, LPDWORD outer); -void RLDS3D_GetSelConeOutsideVolume(LPLONG temp); -void RLDS3D_GetSelMinimumDistance(D3DVALUE *temp); -void RLDS3D_GetSelMaximumDistance(D3DVALUE *temp); -void RLDS3D_SetSelConeAngles(DWORD inner, DWORD outer); -void RLDS3D_SetSelConeOutsideVolume(LONG temp); -void RLDS3D_SetSelMinimumDistance(D3DVALUE temp); -void RLDS3D_SetSelMaximumDistance(D3DVALUE temp); - -/* -************************************* MISC. MAINTENANCE FUNCTIONS ************************************** -*/ - -/* -** Allows external users access to the RL Device to deal with Windows-related issues -** (See case WM_ACTIVATE: and case WM_PAINT: in viewer source for examples of HandleActivate() and HandlePaint()) -** Design note: This was done to save time from the conversion from the old version of the viewer rather than -** having RLDS3D_HandleActivate(), etc. -*/ - -LPDIRECT3DRMDEVICE RLDS3D_WinDevice(); - -// Handles window activation (pass the wparam from the winproc) -void RLDS3D_HandleActivate(WPARAM wparam); - -// Handles paint messages from the window. Pass this one the paintstructure created using BeginPaint -void RLDS3D_HandlePaint(PAINTSTRUCT* ps); - -// Tells whether or not something is currently selected - -BOOL RLDS3D_FrameSelected(); - -/* -** Renders the scene's next frame into the viewport. -*/ - -void RLDS3D_Render(D3DVALUE time_delta); - -/* - * Resize the viewport and device when the window size changes. - */ - -void RLDS3D_ResizeViewport(int width, int height); - -/* -** Returns whether or not the 3D Sound API was actually initialized properly -*/ - -BOOL RLDS3D_SoundInitialized(); - -/* -** Sets/Gets the current polygon fill mode -*/ - -D3DRMFILLMODE RLDS3D_GetPolygonFillMode(void); -void RLDS3D_SetPolygonFillMode(D3DRMFILLMODE quality); - -/* -** Sets/Gets the current polygon shade mode -*/ - -void RLDS3D_SetPolygonShadeMode(D3DRMSHADEMODE quality); -D3DRMSHADEMODE RLDS3D_GetPolygonShadeMode(void); - -/* -** Sets/Gets the colour model for the viewport (RGB or ramp) -*/ - -D3DRMCOLORMODEL RLDS3D_GetColourModel(void); -void RLDS3D_SetColourModel(D3DRMCOLORMODEL model); - -/* -** Sets/Gets whether or not the lights affect the visuals -*/ - -void RLDS3D_SetLighting(BOOL new_val); -BOOL RLDS3D_GetLighting(void); - -/* -** Sets/Gets whether or not dithering is on -*/ - -BOOL RLDS3D_GetDither(void); -void RLDS3D_SetDither(BOOL dither); - -/* -** Sets/Gets texture quality (only relevant for RGB modes) -*/ - -D3DRMTEXTUREQUALITY RLDS3D_GetTextureQuality(void); -void RLDS3D_SetTextureQuality(D3DRMTEXTUREQUALITY new_quality); - -#endif - - diff --git a/sdk/samples/ds3dview/rodcone.cpp b/sdk/samples/ds3dview/rodcone.cpp deleted file mode 100644 index f5285be..0000000 --- a/sdk/samples/ds3dview/rodcone.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: rodcone.cpp - * - ***************************************************************************/ - -/* - * Sample code for building objects out of rods and cones. - */ - -#include "d3drmwin.h" -#include "resource.h" -#include "rodcone.h" -#include - -static unsigned long rod_faces[] = -{ 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, /* end 1 */ - 4, 0, 0, 1, 1, 9, 1, 8, 0, /* side 0 */ - 4, 1, 1, 2, 2, 10, 2, 9, 1, /* side 1 */ - 4, 2, 2, 3, 3, 11, 3, 10, 2, /* side 2 */ - 4, 3, 3, 4, 4, 12, 4, 11, 3, /* side 3 */ - 4, 4, 4, 5, 5, 13, 5, 12, 4, /* side 4 */ - 4, 5, 5, 6, 6, 14, 6, 13, 5, /* side 5 */ - 4, 6, 6, 7, 7, 15, 7, 14, 6, /* side 6 */ - 4, 7, 7, 0, 0, 8, 0, 15, 7, /* side 7 */ - 8, 8, 0, 9, 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, /* end 2 */ - 0, -}; - -/* -** Error function which is actually defined in rlds3d.cpp -*/ - -BOOL D3DRM_SUCCEED(HRESULT result, int force_critical = -1, char* info = NULL); - -void AddRod(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b) -{ - if (!mesh) return; - D3DVECTOR d, u, r; - D3DVECTOR v[16]; - D3DVECTOR n[8]; - D3DVALUE f; - int i; - - /* - * Find the unit vector along the rod. - */ - d.x = b.x - a.x; - d.y = b.y - a.y; - d.z = b.z - a.z; - D3DRMVectorNormalise(&d); - - /* - * Pick a vector normal to d - */ - if (d.y != D3DVAL(0.0) || d.z != D3DVAL(0.0)) - { u.x = D3DVAL(0.0); - if (d.y == D3DVAL(0.0)) - { u.y = D3DVAL(1.0); - u.z = D3DVAL(0.0); - } else - { D3DVALUE n_fix = - D3DVAL(1.0) - + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y)); -#ifdef FIXED_POINT_API - double un_val = (double)n_fix / (double)(1<<16); - u.z = D3DVAL(sqrt(1/un_val)); -#else - u.z = D3DVAL(sqrt(D3DDivide(D3DVAL(1.0), D3DVAL(n_fix)))); -#endif - u.y = -D3DMultiply(u.z, D3DDivide(d.z, d.y)); - } - } else - { u.x = D3DVAL(0.0); - u.y = D3DVAL(0.0); - u.z = D3DVAL(1.0); - } - - /* - * Now find a vector normal to them both, to give us a coordinate - * system in the plane normal to the rod. - */ - D3DRMVectorCrossProduct(&r, &d, &u); - - /* - * Scale down the coordinates to the radius of the rod. - */ - u.x = D3DMultiply(u.x, radius); - u.y = D3DMultiply(u.y, radius); - u.z = D3DMultiply(u.z, radius); - r.x = D3DMultiply(r.x, radius); - r.y = D3DMultiply(r.y, radius); - r.z = D3DMultiply(r.z, radius); - - /* - * Calculate the corners of an octagon. - */ - f = D3DVAL((float)sqrt((double)2) / (2 * (1 + (float)sqrt((double)2) / 2))); - v[0].x = u.x + D3DMultiply(r.x, f); - v[0].y = u.y + D3DMultiply(r.y, f); - v[0].z = u.z + D3DMultiply(r.z, f); - - v[1].x = D3DMultiply(u.x, f) + r.x; - v[1].y = D3DMultiply(u.y, f) + r.y; - v[1].z = D3DMultiply(u.z, f) + r.z; - - v[2].x = D3DMultiply(-u.x, f) + r.x; - v[2].y = D3DMultiply(-u.y, f) + r.y; - v[2].z = D3DMultiply(-u.z, f) + r.z; - - v[3].x = -u.x + D3DMultiply(r.x, f); - v[3].y = -u.y + D3DMultiply(r.y, f); - v[3].z = -u.z + D3DMultiply(r.z, f); - - v[4].x = -u.x - D3DMultiply(r.x, f); - v[4].y = -u.y - D3DMultiply(r.y, f); - v[4].z = -u.z - D3DMultiply(r.z, f); - - v[5].x = D3DMultiply(-u.x, f) - r.x; - v[5].y = D3DMultiply(-u.y, f) - r.y; - v[5].z = D3DMultiply(-u.z, f) - r.z; - - v[6].x = D3DMultiply(u.x, f) - r.x; - v[6].y = D3DMultiply(u.y, f) - r.y; - v[6].z = D3DMultiply(u.z, f) - r.z; - - v[7].x = u.x - D3DMultiply(r.x, f); - v[7].y = u.y - D3DMultiply(r.y, f); - v[7].z = u.z - D3DMultiply(r.z, f); - - /* - * Add the rod endpoints and calculate the vertex normals. - */ - for (i = 0; i < 8; i++) - { n[i] = v[i]; - D3DRMVectorNormalise(&n[i]); - v[i + 8].x = v[i].x + b.x; - v[i + 8].y = v[i].y + b.y; - v[i + 8].z = v[i].z + b.z; - v[i].x += a.x; - v[i].y += a.y; - v[i].z += a.z; - } - - /* - * Now add the faces. - */ - D3DRM_SUCCEED(mesh->AddFaces(16, v, 8, n, rod_faces, NULL)); -} - -static unsigned long cone_faces[] = -{ 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, /* end 1 */ - 3, 0, 0, 1, 1, 8, 1, /* side 0 */ - 3, 1, 1, 2, 2, 8, 1, /* side 1 */ - 3, 2, 2, 3, 3, 8, 1, /* side 2 */ - 3, 3, 3, 4, 4, 8, 1, /* side 3 */ - 3, 4, 4, 5, 5, 8, 1, /* side 4 */ - 3, 5, 5, 6, 6, 8, 1, /* side 5 */ - 3, 6, 6, 7, 7, 8, 1, /* side 6 */ - 3, 7, 7, 0, 0, 8, 1, /* side 7 */ - 0, -}; - -void AddCone(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b) -{ - if (!mesh) return; - D3DVECTOR d, u, r; - D3DVECTOR v[16]; - D3DVECTOR n[8]; - D3DVALUE f; - int i; - - /* - * Find the unit vector along the rod. - */ - d.x = b.x - a.x; - d.y = b.y - a.y; - d.z = b.z - a.z; - D3DRMVectorNormalise(&d); - - /* - * Pick a vector normal to d - */ - if (d.y != D3DVAL(0.0) || d.z != D3DVAL(0.0)) - { u.x = D3DVAL(0.0); - if (d.y == D3DVAL(0.0)) - { u.y = D3DVAL(1.0); - u.z = D3DVAL(0.0); - } else - { D3DVALUE n_fix = - D3DVAL(1.0) - + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y)); -#ifdef FIXED_POINT_API - double un_val = (double)n_fix / (double)(1<<16); - u.z = D3DVAL(sqrt(1 / un_val)); -#else - u.z = D3DVAL(sqrt(D3DVAL(1.0) / D3DVAL(n_fix))); -#endif - u.y = - D3DDivide(D3DMultiply(u.z, d.z), d.y); - } - } else - { u.x = D3DVAL(0.0); - u.y = D3DVAL(0.0); - u.z = D3DVAL(1.0); - } - - /* - * Now find a vector normal to them both, to give us a coordinate - * system in the plane normal to the rod. - */ - D3DRMVectorCrossProduct(&r, &d, &u); - - /* - * Scale down the coordinates to the radius of the rod. - */ - u.x = D3DMultiply(u.x, radius); - u.y = D3DMultiply(u.y, radius); - u.z = D3DMultiply(u.z, radius); - r.x = D3DMultiply(r.x, radius); - r.y = D3DMultiply(r.y, radius); - r.z = D3DMultiply(r.z, radius); - - /* - * Calculate the corners of an octagon. - */ - f = D3DVAL((float)sqrt((double)2) / (2 * (1 + (float)sqrt((double)2) / 2))); - v[0].x = u.x + D3DMultiply(r.x, f); - v[0].y = u.y + D3DMultiply(r.y, f); - v[0].z = u.z + D3DMultiply(r.z, f); - - v[1].x = D3DMultiply(u.x, f) + r.x; - v[1].y = D3DMultiply(u.y, f) + r.y; - v[1].z = D3DMultiply(u.z, f) + r.z; - - v[2].x = D3DMultiply(-u.x, f) + r.x; - v[2].y = D3DMultiply(-u.y, f) + r.y; - v[2].z = D3DMultiply(-u.z, f) + r.z; - - v[3].x = -u.x + D3DMultiply(r.x, f); - v[3].y = -u.y + D3DMultiply(r.y, f); - v[3].z = -u.z + D3DMultiply(r.z, f); - - v[4].x = -u.x - D3DMultiply(r.x, f); - v[4].y = -u.y - D3DMultiply(r.y, f); - v[4].z = -u.z - D3DMultiply(r.z, f); - - v[5].x = D3DMultiply(-u.x, f) - r.x; - v[5].y = D3DMultiply(-u.y, f) - r.y; - v[5].z = D3DMultiply(-u.z, f) - r.z; - - v[6].x = D3DMultiply(u.x, f) - r.x; - v[6].y = D3DMultiply(u.y, f) - r.y; - v[6].z = D3DMultiply(u.z, f) - r.z; - - v[7].x = u.x - D3DMultiply(r.x, f); - v[7].y = u.y - D3DMultiply(r.y, f); - v[7].z = u.z - D3DMultiply(r.z, f); - - v[8] = b; - - /* - * Calculate the vertex normals. - */ - for (i = 0; i < 8; i++) - { n[i] = v[i]; - D3DRMVectorNormalise(&n[0]); - v[i].x += a.x; - v[i].y += a.y; - v[i].z += a.z; - } - - /* - * Now add the faces. - */ - - D3DRM_SUCCEED(mesh->AddFaces(9, v, 8, n, cone_faces, NULL)); -} diff --git a/sdk/samples/ds3dview/rodcone.h b/sdk/samples/ds3dview/rodcone.h deleted file mode 100644 index 874f616..0000000 --- a/sdk/samples/ds3dview/rodcone.h +++ /dev/null @@ -1,10 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: rodcone.h - * - ***************************************************************************/ - -void AddRod(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b); -void AddCone(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b); diff --git a/sdk/samples/ds3dview/viewer.cpp b/sdk/samples/ds3dview/viewer.cpp deleted file mode 100644 index 56c32c2..0000000 --- a/sdk/samples/ds3dview/viewer.cpp +++ /dev/null @@ -1,895 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: viewer.cpp - * - ***************************************************************************/ - - - -#define INITGUID -#include "d3drmwin.h" -#include "resource.h" - -#include -#include -#include -#include -#include -#include - -#include "rlds3d.h" -#include "file.h" - - -static char ViewerClass[32] = "ViewerClass"; - -static BOOL FirstInstance(HANDLE); -static BOOL AnyInstance(HANDLE, HWND*); -long FAR PASCAL WindowProc(HWND, UINT, WPARAM, LPARAM); -static void Idle(); - -BOOL CALLBACK WaitBoxDlgProc(HWND, UINT, WPARAM, LPARAM); - -BOOL AboutBoxOn = FALSE; - - -/* - * Initialization, message loop - */ - -int PASCAL WinMain - (HANDLE this_inst, HANDLE prev_inst, LPSTR cmdline, int cmdshow) -{ - MSG msg; - int idle; - int done = FALSE; - HACCEL accel; - - - DWORD prev_tick; - DWORD this_tick; - D3DVALUE time_delta; - - prev_inst = prev_inst; - cmdline = cmdline; - - // Register our class if necessary - if (!prev_inst) { - // Do the stuff for if this is the first instance of the program. - if (!FirstInstance(this_inst)) return FALSE; - } - - // Create our window and get it's handle (needs to be done whether we're first or not) - HWND win; - if (!AnyInstance(this_inst, &win)) return FALSE; - - // Initialize the RLDS3D interface - if (!RLDS3D_Initialize(win, this_inst)) { - // If it doesn't initialize then we don't have anything we need to clean up, so we just exit - exit(-1); - } - - // Show our window! - ShowWindow(win, cmdshow); - UpdateWindow(win); - - // Load accelerators - accel = LoadAccelerators(this_inst, "ViewerAccel"); - - prev_tick = timeGetTime(); - - - while (!done) - { idle = TRUE; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { idle = FALSE; - if (msg.message == WM_QUIT) - { done = TRUE; - break; - } - - if (!TranslateAccelerator(msg.hwnd, accel, &msg)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - } - if (idle) Idle(); - this_tick = timeGetTime(); - time_delta = D3DVAL((float)((this_tick - prev_tick)/1000.0)); - prev_tick = this_tick; - RLDS3D_Render(time_delta); - } - RLDS3D_Deinitialize(); - return msg.wParam; -} - -/* - * Register window class for the application, and do any other - * application initialization - */ -static BOOL FirstInstance(HANDLE this_inst) -{ - WNDCLASS wc; - BOOL rc; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = this_inst; - wc.hIcon = LoadIcon(this_inst, "ViewerIcon"); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = "ViewerMenu"; - wc.lpszClassName = ViewerClass; - rc = RegisterClass(&wc); - - return rc; -} - -/* - * Do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL AnyInstance(HANDLE this_inst, HWND* window_handle) -{ - HWND win; - char szCaption[] = "DirectSound3D Demo"; - - /* - * create main window - */ - win = - CreateWindow - ( ViewerClass, /* class */ - szCaption, /* caption */ - WS_OVERLAPPEDWINDOW, /* style */ - CW_USEDEFAULT, /* init. x pos */ - CW_USEDEFAULT, /* init. y pos */ - 400, /* init. x size */ - 400, /* init. y size */ - NULL, /* parent window */ - NULL, /* menu handle */ - this_inst, /* program handle */ - NULL /* create parms */ - ); - - - if (!win) return FALSE; - *window_handle = win; - return TRUE; -} - -/* - * Processes messages for the about dialog. - */ -BOOL FAR PASCAL AboutDlgProc - (HWND win, unsigned msg, WORD wparam, LONG lparam) -{ - lparam = lparam; - - switch (msg) - { - case WM_INITDIALOG: - return TRUE; - - case WM_COMMAND: - if (wparam == IDOK) - { - AboutBoxOn = FALSE; - EndDialog(win, TRUE); - return TRUE; - } - break; - case WM_CLOSE: - { - AboutBoxOn = FALSE; - EndDialog(win, TRUE); - return FALSE; - } - break; - } - return FALSE; -} - -static int - left_drag = FALSE, right_drag = FALSE, - last_x, last_y; - -static void Idle() -{ - // Stop selected item being dragged from rotating/moving - if (left_drag) { - RLDS3D_SetSelectedRotRelToCam(D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)); - } - if (right_drag) { - RLDS3D_SetSelectedVelRelToCam(D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - } -} - -static int FillModeToMenuItem(D3DRMFILLMODE fm) -{ - switch (fm) { - case D3DRMFILL_POINTS: - return 2; - - case D3DRMFILL_WIREFRAME: - return 3; - - case D3DRMFILL_SOLID: - return 4; - } - return -1; -} - -// Sets the polygon fill mode and checks/unchecks the appropriate menu items -static void SetFillMode(HWND win, D3DRMFILLMODE fm) -{ - HMENU menu; - D3DRMFILLMODE oldfm = RLDS3D_GetPolygonFillMode(); - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, FillModeToMenuItem(oldfm), - MF_BYPOSITION|MF_UNCHECKED); - CheckMenuItem(menu, FillModeToMenuItem(fm), - MF_BYPOSITION|MF_CHECKED); - RLDS3D_SetPolygonFillMode(fm); -} - -static int ShadeModeToMenuItem(D3DRMSHADEMODE sm) -{ - switch (sm) { - case D3DRMSHADE_FLAT: - return 6; - - case D3DRMSHADE_GOURAUD: - return 7; - - case D3DRMSHADE_PHONG: - return 8; - } - return -1; -} - -// Sets the polygon shade mode and checks/unchecks the appropriate menu items -static void SetShadeMode(HWND win, D3DRMSHADEMODE sm) -{ - HMENU menu; - D3DRMSHADEMODE oldsm = RLDS3D_GetPolygonShadeMode(); - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, ShadeModeToMenuItem(oldsm), - MF_BYPOSITION|MF_UNCHECKED); - CheckMenuItem(menu, ShadeModeToMenuItem(sm), - MF_BYPOSITION|MF_CHECKED); - RLDS3D_SetPolygonShadeMode(sm); -} - -// Sets the rendering model and checks/unchecks the appropriate menu items -static void SetModel(HWND win, D3DRMCOLORMODEL model) -{ - HMENU menu; - D3DRMCOLORMODEL oldModel = RLDS3D_GetColourModel(); - - if (oldModel == model) return; - - RLDS3D_SetColourModel(model); - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, 9 + (int) oldModel, MF_BYPOSITION|MF_UNCHECKED); - CheckMenuItem(menu, 9 + (int) model, MF_BYPOSITION|MF_CHECKED); -} - -// Toggles dithering and checks/unchecks menu item -static void ToggleDither(HWND win) -{ - HMENU menu; - int dither = RLDS3D_GetDither(); - int checked; - dither = !dither; - RLDS3D_SetDither(dither); - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - - if (dither) checked = MF_CHECKED; - else checked = MF_UNCHECKED; - - CheckMenuItem(menu, 13, MF_BYPOSITION|checked); -} - -// Toggles texture filtering and checks/unchecks menu item -static void ToggleTextureFiltering(HWND win) -{ - HMENU menu; - D3DRMTEXTUREQUALITY tq = RLDS3D_GetTextureQuality(); - int checked; - if (tq == D3DRMTEXTURE_NEAREST) - tq = D3DRMTEXTURE_LINEAR; - else - tq = D3DRMTEXTURE_NEAREST; - - RLDS3D_SetTextureQuality(tq); - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - - if (tq == D3DRMTEXTURE_LINEAR) checked = MF_CHECKED; - else checked = MF_UNCHECKED; - - CheckMenuItem(menu, 14, MF_BYPOSITION|checked); -} - -// Ditto for lighting -static void ToggleLighting(HWND win) -{ - HMENU menu; - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - if (RLDS3D_GetLighting()) { - CheckMenuItem(menu, 0, (MF_BYPOSITION | MF_UNCHECKED)); - RLDS3D_SetLighting(FALSE); - } - else { - CheckMenuItem(menu, 0, (MF_BYPOSITION | MF_CHECKED)); - RLDS3D_SetLighting(TRUE); - } -} - -/* -** Windows procs for the sound param dlg boxes -*/ - -BOOL CALLBACK WaitBoxDlgProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) { - return FALSE; -}; - -BOOL CALLBACK GlobalParamDlgProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - lparam = lparam; - - char lpszTS[100]; - - switch (msg) - { - case WM_INITDIALOG: - { - // Set up our edit fields appropriately - D3DVALUE temp; - RLDS3D_GetDistanceFactor(&temp); - sprintf(lpszTS, "%f",temp); - SendDlgItemMessage(win, IDC_DISTANCEFACTOR, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_DISTANCEFACTOR, EM_SETLIMITTEXT, 10, 0); - RLDS3D_GetRolloffFactor(&temp); - sprintf(lpszTS, "%f",temp); - SendDlgItemMessage(win, IDC_ROLLOFFFACTOR, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_ROLLOFFFACTOR, EM_SETLIMITTEXT, 10, 0); - RLDS3D_GetDopplerFactor(&temp); - sprintf(lpszTS, "%f",temp); - SendDlgItemMessage(win, IDC_DOPPLERFACTOR, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_DOPPLERFACTOR, EM_SETLIMITTEXT, 10, 0); - return TRUE; - } - case WM_CLOSE: - EndDialog(win, TRUE); - return FALSE; - - case WM_COMMAND: - { - if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_DOPPLERFACTOR) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_DOPPLERFACTOR, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_DOPPLERFACTOR, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - // No real need for error checking 'cause the edit field is numbers only - RLDS3D_SetDopplerFactor(D3DVAL(atof(lpszTS))); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_ROLLOFFFACTOR) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_ROLLOFFFACTOR, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_ROLLOFFFACTOR, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - RLDS3D_SetRolloffFactor(D3DVAL(atof(lpszTS))); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_DISTANCEFACTOR) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_DISTANCEFACTOR, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_DISTANCEFACTOR, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - RLDS3D_SetDistanceFactor(D3DVAL(atof(lpszTS))); - return TRUE; - } - else return FALSE; - } - break; - } - return FALSE; -} - -HWND hSelCfgDlg = 0; - -BOOL CALLBACK SelectedParamDlgProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - lparam = lparam; - - char lpszTS[100]; - - switch (msg) - { - case WM_INITDIALOG: - { - // Set up our edit fields appropriately - D3DVALUE temp; - LONG temp2; - DWORD temp3, temp4; - // Ignores the out side cone angle for now, which is fine, because elsewhere we - // set it to equal the inside angle - RLDS3D_GetSelConeAngles(&temp3, &temp4); - sprintf(lpszTS, "%i",temp3); - SendDlgItemMessage(win, IDC_CONEANGLE, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_CONEANGLE, EM_SETLIMITTEXT, 10, 0); - RLDS3D_GetSelConeOutsideVolume(&temp2); - sprintf(lpszTS, "%i",temp2); - SendDlgItemMessage(win, IDC_CONEOUTSIDEVOLUME, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_CONEOUTSIDEVOLUME, EM_SETLIMITTEXT, 10, 0); - RLDS3D_GetSelMaximumDistance(&temp); - sprintf(lpszTS, "%f",temp); - SendDlgItemMessage(win, IDC_MAXIMUMDISTANCE, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_MAXIMUMDISTANCE, EM_SETLIMITTEXT, 10, 0); - RLDS3D_GetSelMinimumDistance(&temp); - sprintf(lpszTS, "%f",temp); - SendDlgItemMessage(win, IDC_MINIMUMDISTANCE, WM_SETTEXT, 0, (LPARAM) lpszTS); - SendDlgItemMessage(win, IDC_MINIMUMDISTANCE, EM_SETLIMITTEXT, 10, 0); - hSelCfgDlg = win; - return TRUE; - } - - case WM_CLOSE: - EndDialog(win, TRUE); - hSelCfgDlg = 0; - return FALSE; - - case WM_COMMAND: - { - if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_CONEANGLE) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_CONEANGLE, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_CONEANGLE, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - // No real need for error checking 'cause the edit field is numbers only - RLDS3D_SetSelConeAngles((DWORD)atol(lpszTS), (DWORD)atol(lpszTS)); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_CONEOUTSIDEVOLUME) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_CONEOUTSIDEVOLUME, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_CONEOUTSIDEVOLUME, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - RLDS3D_SetSelConeOutsideVolume(atol(lpszTS)); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_MAXIMUMDISTANCE) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_MAXIMUMDISTANCE, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_MAXIMUMDISTANCE, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - RLDS3D_SetSelMaximumDistance(D3DVAL(atof(lpszTS))); - return TRUE; - } - else if (HIWORD(wparam) == EN_UPDATE && LOWORD(wparam) == IDC_MINIMUMDISTANCE) { - // Get value from edit box (get length, check lenth, set first char to length, request string, end it with 0) - int stringlength = SendDlgItemMessage(win, IDC_MINIMUMDISTANCE, EM_LINELENGTH, 0, 0); - if (stringlength > 10) return TRUE; - lpszTS[0] = (char)stringlength; - SendDlgItemMessage(win, IDC_MINIMUMDISTANCE, EM_GETLINE, 0, (LPARAM) lpszTS); - lpszTS[stringlength] = 0; - // Set value in RLDS3D (convert string to long and go crazy with the bad boy) - RLDS3D_SetSelMinimumDistance(D3DVAL(atof(lpszTS))); - return TRUE; - } - else return FALSE; - } - break; - } - return FALSE; -} - -#define SIGN_EXTEND(w) ((((int)(w)) << 16) >> 16) - -/* - * Handle messages for the main application window - */ - -LONG FAR PASCAL WindowProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - HANDLE inst_handle; - static HCURSOR oldCursor = NULL; - - switch (msg) - { - case WM_KEYDOWN: - { - switch (wparam) - { - - case 'A': - RLDS3D_SetCamVelRelToCam(D3DVAL(5.0), D3DVAL(0.0), D3DVAL(0.0)); - break; - - case 'Z': - RLDS3D_SetCamVelRelToCam(D3DVAL(-5.0), D3DVAL(0.0), D3DVAL(0.0)); - break; - - case VK_RIGHT: - RLDS3D_SetCamRotUp(D3DVAL(1.0)); - break; - case VK_LEFT: - RLDS3D_SetCamRotUp(D3DVAL(-1.0)); - break; - case VK_UP: - RLDS3D_SetCamRotRight(D3DVAL(1.0)); - break; - case VK_DOWN: - RLDS3D_SetCamRotRight(D3DVAL(-1.0)); - break; - } - } - break; - - case WM_KEYUP: - switch (wparam) - { - case VK_LEFT: - case VK_RIGHT: - case VK_UP: - case VK_DOWN: - // Stop the camera from rotating completely - RLDS3D_SetCamRotForward(D3DVAL(0.0)); - break; - - case 'A': - case 'Z': - RLDS3D_SetCamVelRelToCam(D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - break; - } - break; - - case WM_LBUTTONDOWN: - { HCURSOR hCur; - int x = LOWORD(lparam); - int y = HIWORD(lparam); - last_x = x; - last_y = y; - BOOL bChanged = FALSE; - RLDS3D_FindAndSelectVisual(x, y, &bChanged); - // Get rid of the Selected Object Cfg dialog if we've selected a new object - if (bChanged && hSelCfgDlg) EndDialog(hSelCfgDlg, TRUE); - left_drag = TRUE; - SetCapture(win); - /* change to a groovy cursor */ - hCur = LoadCursor(NULL, IDC_ARROW); - if (hCur) oldCursor = SetCursor(hCur); - else oldCursor = NULL; - } - break; - - case WM_LBUTTONUP: - ReleaseCapture(); - left_drag = FALSE; - if (oldCursor) SetCursor(oldCursor); - break; - - case WM_RBUTTONDOWN: - { - HCURSOR hCur; - int x = LOWORD(lparam); - int y = HIWORD(lparam); - last_x = x; - last_y = y; - BOOL bChanged = FALSE; - RLDS3D_FindAndSelectVisual(x, y, &bChanged); - // Get rid of the Selected Object Cfg dialog if we've selected a new object - if (bChanged && hSelCfgDlg) EndDialog(hSelCfgDlg, TRUE); - right_drag = TRUE; - SetCapture(win); - /* change to a groovy cursor */ - hCur = LoadCursor(NULL, IDC_ARROW); - if (hCur) oldCursor = SetCursor(hCur); - else oldCursor = NULL; - } - break; - - case WM_RBUTTONUP: - right_drag = FALSE; - ReleaseCapture(); - if (oldCursor) SetCursor(oldCursor); - break; - - case WM_MOUSEMOVE: - if ((wparam & MK_LBUTTON) && left_drag) - { double delta_x, delta_y; - delta_x = SIGN_EXTEND(LOWORD(lparam)) - last_x; - delta_y = -SIGN_EXTEND((HIWORD(lparam)) - last_y); - last_x = SIGN_EXTEND(LOWORD(lparam)); - last_y = SIGN_EXTEND(HIWORD(lparam)); - { - double delta_r = sqrt(delta_x * delta_x + delta_y * delta_y); - double radius = 50; - double denom; - - denom = 0.05 * sqrt(radius * radius + delta_r * delta_r); - - if (delta_r == 0 || denom == 0) break; - RLDS3D_SetSelectedRotRelToCam(D3DDivide(D3DVAL((float) delta_y), D3DVAL((float) delta_r)), - D3DDivide(D3DVAL((float) -delta_x), D3DVAL((float) delta_r)), - D3DVAL(0.0), - D3DDivide(D3DVAL((float) delta_r), D3DVAL((float) denom))); - } - } - else if ((wparam & MK_RBUTTON) && right_drag) - { double delta_x, delta_y; - - delta_x = SIGN_EXTEND(LOWORD(lparam)) - last_x; - delta_y = SIGN_EXTEND(HIWORD(lparam)) - last_y; - last_x = SIGN_EXTEND(LOWORD(lparam)); - last_y = SIGN_EXTEND(HIWORD(lparam)); - RLDS3D_MoveSelectedPosByScreenCoords(delta_x, delta_y); - } - break; - case WM_COMMAND: - switch( wparam & 0xffff ) - { - case MENU_MOTION_ORBITSELECTEDOBJECT: - { - RLDS3D_OrbitSelected(); - } - break; - case MENU_MOTION_BULLETSELECTEDOBJECT: - { - RLDS3D_BulletSelected(); - } - break; - case MENU_SOUND_ATTACHSOUND: - { - if (RLDS3D_SoundInitialized()) - { - if (RLDS3D_FrameSelected()) { - char* file = OpenNewSoundFile(win); - if (file) RLDS3D_AttachSound(file); - } - else MessageBox(win, "No object selected to attach a sound to!", "Doh!", MB_ICONEXCLAMATION); - } - else MessageBox(win, "Sound not initialized!", "Doh!", MB_ICONEXCLAMATION); - } - break; - case MENU_SOUND_REMOVESOUND: - RLDS3D_RemoveSound(); - break; - case MENU_SOUND_REMOVEALLSOUNDS: - RLDS3D_RemoveAllSounds(); - break; - - case MENU_SOUND_PLAYSOUND: - RLDS3D_PlaySound(FALSE); - break; - case MENU_SOUND_PLAYSOUNDLOOPING: - RLDS3D_PlaySound(TRUE); - break; - case MENU_SOUND_STOPSOUND: - RLDS3D_StopSelectedSound(); - break; - - case MENU_SOUND_STOPALLSOUNDS: - RLDS3D_StopAllSounds(); - break; - - case MENU_SOUND_SELECTEDSOUNDPROPERTIES: - { - if (RLDS3D_SoundInitialized()) { - if (RLDS3D_SoundSelected()) { - inst_handle = (HANDLE) GetWindowLong(win, GWL_HINSTANCE); - HWND mydial = CreateDialog(inst_handle, "SelectedParamBox", win, (int(__stdcall*)(void))SelectedParamDlgProc); - if (mydial) { - ShowWindow(mydial, SW_SHOW); - UpdateWindow(mydial); - } - } - else MessageBox(win, "No sound currently selected", "Doh!", MB_ICONEXCLAMATION); - } - else MessageBox(win, "Sound not initialized!", "Doh!", MB_ICONEXCLAMATION); - } - break; - case MENU_SOUND_GLOBALPROPERTIES: - { - if (RLDS3D_SoundInitialized()) { - inst_handle = (HANDLE) GetWindowLong(win, GWL_HINSTANCE); - HWND mydial = CreateDialog(inst_handle, "GlobalParamBox", win, (int(__stdcall*)(void))GlobalParamDlgProc); - if (mydial) { - ShowWindow(mydial, SW_SHOW); - UpdateWindow(mydial); - } - } - else MessageBox(win, "Sound not initialized!", "Doh!", MB_ICONEXCLAMATION); - } - break; - - case MENU_FILE_ABOUT: - { - inst_handle = (HANDLE) GetWindowLong(win, GWL_HINSTANCE); - DialogBox(inst_handle,"AboutBox", win, (int(__stdcall*)(void))AboutDlgProc); - } - break; - - case MENU_FILE_OPEN: - { - char *file = OpenNewFile(win); - if (file) { - RLDS3D_LoadXOF(file); - } - } - break; - - case MENU_FILE_EXIT: - PostQuitMessage(0); - break; - - case MENU_EDIT_CUT: - RLDS3D_CutVisual(); - break; - - case MENU_EDIT_COPY: - RLDS3D_CopyVisual(); - break; - - case MENU_EDIT_PASTE: - RLDS3D_PasteVisual(); - break; - - case MENU_EDIT_DELETE: - RLDS3D_DeleteVisual(); - break; - - case MENU_EDIT_COLOUR: - // Currently everything is handled there but the selection wheel maybe should be out here? - RLDS3D_SetSelColour(); - break; - - case MENU_EDIT_BOXES: - { - HMENU menu; - if (RLDS3D_GetBoxes() == TRUE) RLDS3D_SetBoxes(FALSE); else RLDS3D_SetBoxes(TRUE); - int checked = (RLDS3D_GetBoxes()==TRUE) ? MF_CHECKED : MF_UNCHECKED; - menu = GetMenu(win); - menu = GetSubMenu(menu, 1); - CheckMenuItem(menu, MENU_EDIT_BOXES, MF_BYCOMMAND|checked); - } - break; - - case MENU_QUALITY_LIGHTING: - ToggleLighting(win); - break; - - // Fill Modes - case MENU_QUALITY_POINTS: - SetFillMode(win, D3DRMFILL_POINTS); - break; - - case MENU_QUALITY_WIREFRAME: - SetFillMode(win, D3DRMFILL_WIREFRAME); - break; - - case MENU_QUALITY_SOLID: - SetFillMode(win, D3DRMFILL_SOLID); - break; - - // Shading modes - case MENU_QUALITY_FLAT: - SetShadeMode(win, D3DRMSHADE_FLAT); - break; - - case MENU_QUALITY_GOURAUD: - SetShadeMode(win, D3DRMSHADE_GOURAUD); - break; - - case MENU_QUALITY_PHONG: - SetShadeMode(win, D3DRMSHADE_PHONG); - break; - - // Color models - case MENU_MODEL_MONO: - SetModel(win, D3DCOLOR_MONO); - break; - - case MENU_MODEL_RGB: - SetModel(win, D3DCOLOR_RGB); - break; - - case MENU_DITHER: - ToggleDither(win); - break; - - case MENU_TEXTURE_FILTERING: - ToggleTextureFiltering(win); - break; - - case MENU_LIGHT_DIRECTIONAL: - RLDS3D_AddDirectionalLight(); - break; - case MENU_LIGHT_PARALLEL_POINT: - RLDS3D_AddParallelPointLight(); - break; - case MENU_LIGHT_POINT: - RLDS3D_AddPointLight(); - break; - case MENU_LIGHT_SPOT: - RLDS3D_AddSpotlight(); - break; - } - break; - - case WM_DESTROY: - PostQuitMessage( 0 ); - break; - - case WM_SIZE: - { - int width = LOWORD(lparam); - int height = HIWORD(lparam); - RLDS3D_ResizeViewport(width, height); - } - break; - - case WM_ACTIVATE: - { - RLDS3D_HandleActivate(wparam); - } - break; - - case WM_PAINT: - if (RLDS3D_WinDevice()) - { - RECT r; - PAINTSTRUCT ps; - - if (GetUpdateRect(win, &r, FALSE)) - { BeginPaint(win, &ps); - RLDS3D_HandlePaint(&ps); - EndPaint(win, &ps); - } - } - else return DefWindowProc(win, msg, wparam, lparam); - - default: - return DefWindowProc(win, msg, wparam, lparam); - } - return 0L; -} - diff --git a/sdk/samples/ds3dview/viewer.ico b/sdk/samples/ds3dview/viewer.ico deleted file mode 100644 index a506456..0000000 Binary files a/sdk/samples/ds3dview/viewer.ico and /dev/null differ diff --git a/sdk/samples/ds3dview/viewer.rc b/sdk/samples/ds3dview/viewer.rc deleted file mode 100644 index 444d1ce..0000000 --- a/sdk/samples/ds3dview/viewer.rc +++ /dev/null @@ -1,314 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS - - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -VIEWERICON ICON DISCARDABLE "viewer.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -VIEWERMENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&About...", MENU_FILE_ABOUT - MENUITEM "&Add 3D Visual...", MENU_FILE_OPEN - MENUITEM SEPARATOR - MENUITEM "E&xit", MENU_FILE_EXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "Cu&t", MENU_EDIT_CUT - MENUITEM "&Copy", MENU_EDIT_COPY - MENUITEM "&Paste", MENU_EDIT_PASTE - MENUITEM "&Delete", MENU_EDIT_DELETE - MENUITEM SEPARATOR - MENUITEM "C&hange Colour...", MENU_EDIT_COLOUR - MENUITEM SEPARATOR - MENUITEM "&Bounding Boxes", MENU_EDIT_BOXES - END - POPUP "&Renderer" - BEGIN - MENUITEM "&Lighting\tCtrl+L", MENU_QUALITY_LIGHTING - , CHECKED - MENUITEM SEPARATOR - MENUITEM "&Points\tCtrl+P", MENU_QUALITY_POINTS - MENUITEM "&Wireframe\tCtrl+W", MENU_QUALITY_WIREFRAME - MENUITEM "&Solid\tCtrl+S", MENU_QUALITY_SOLID, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Flat\tCtrl+F", MENU_QUALITY_FLAT, CHECKED - MENUITEM "&Gouraud\tCtrl+G", MENU_QUALITY_GOURAUD - MENUITEM "Ph&ong\tCtrl+O", MENU_QUALITY_PHONG - MENUITEM SEPARATOR - MENUITEM "&Mono Model", MENU_MODEL_MONO, CHECKED - MENUITEM "&RGB Model", MENU_MODEL_RGB - MENUITEM SEPARATOR - MENUITEM "&Dithered\tCtrl+D", MENU_DITHER - MENUITEM "&Texture Filtering", MENU_TEXTURE_FILTERING - END - POPUP "&Lights" - BEGIN - MENUITEM "&Directional", MENU_LIGHT_DIRECTIONAL - MENUITEM "&Parallel Point", MENU_LIGHT_PARALLEL_POINT - MENUITEM "P&oint", MENU_LIGHT_POINT - MENUITEM "&Spot", MENU_LIGHT_SPOT - END - POPUP "&Sound" - BEGIN - MENUITEM "Attach Sound\tCtrl-A", MENU_SOUND_ATTACHSOUND - MENUITEM "Remove Sound", MENU_SOUND_REMOVESOUND - MENUITEM "Remove All Sounds", MENU_SOUND_REMOVEALLSOUNDS - MENUITEM SEPARATOR - MENUITEM "Play Sound Once\tCtrl-P", MENU_SOUND_PLAYSOUND - MENUITEM "Play Sound Looping\tCtrl-L", MENU_SOUND_PLAYSOUNDLOOPING - MENUITEM "Stop Sound\tCtrl-S", MENU_SOUND_STOPSOUND - MENUITEM "Stop All Sounds", MENU_SOUND_STOPALLSOUNDS - MENUITEM SEPARATOR - MENUITEM "Global Properties", MENU_SOUND_GLOBALPROPERTIES - MENUITEM "Selected Sound Properties", MENU_SOUND_SELECTEDSOUNDPROPERTIES - - END - POPUP "Motion" - BEGIN - MENUITEM "Orbit Selected Object", MENU_MOTION_ORBITSELECTEDOBJECT - - MENUITEM "Bullet Selected Object", MENU_MOTION_BULLETSELECTEDOBJECT - - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -VIEWERACCEL ACCELERATORS MOVEABLE PURE -BEGIN - "D", MENU_DITHER, VIRTKEY, CONTROL, NOINVERT - "F", MENU_QUALITY_FLAT, VIRTKEY, CONTROL, NOINVERT - "G", MENU_QUALITY_GOURAUD, VIRTKEY, CONTROL, NOINVERT - "L", MENU_QUALITY_LIGHTING, VIRTKEY, CONTROL, NOINVERT - "O", MENU_QUALITY_PHONG, VIRTKEY, CONTROL, NOINVERT - "P", MENU_QUALITY_POINTS, VIRTKEY, CONTROL, NOINVERT - "S", MENU_QUALITY_GOURAUD, VIRTKEY, CONTROL, NOINVERT - VK_DELETE, MENU_EDIT_DELETE, VIRTKEY, NOINVERT - VK_DELETE, MENU_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT - VK_INSERT, MENU_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT - VK_INSERT, MENU_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT - "W", MENU_QUALITY_FLAT, VIRTKEY, CONTROL, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -ABOUTBOX DIALOG DISCARDABLE 22, 17, 144, 75 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU - -CAPTION "About DirectSound3D Viewer" - -FONT 8, "MS Sans Serif" -BEGIN - CTEXT "Copyright © 1996 Microsoft Corporation",-1,0,40,144,8 - DEFPUSHBUTTON "OK",IDOK,53,59,32,14,WS_GROUP - ICON "ViewerIcon",-1,59,15,21,20 -END - - -ORBITBOX DIALOG DISCARDABLE 0, 0, 64, 55 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION -CAPTION "Houston" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Stop Orbit",IDOK,7,34,50,14 - EDITTEXT IDC_ORBIT,7,7,50,13 -END - -BULLETBOX DIALOG DISCARDABLE 0, 0, 64, 55 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION -CAPTION "Smith & Wesson" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Stop Bullet",IDOK,7,34,50,14 - EDITTEXT IDC_BULLET,7,7,50,13 -END - -GLOBALPARAMBOX DIALOG DISCARDABLE 0, 0, 272, 90 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "3D Sound - World Parameters" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "DISTANCE FACTOR:",IDC_STATIC,7,11,70,8 - EDITTEXT IDC_DISTANCEFACTOR,83,8,40,14 - LTEXT "Meters per unit distance in the world",IDC_STATIC, - 130,12,125,8 - LTEXT "ROLLOFF FACTOR:",IDC_STATIC,7,31,66,8 - EDITTEXT IDC_ROLLOFFFACTOR,83,28,40,14 - LTEXT "% of real world attenuation due to distance",IDC_STATIC, - 130,31,134,8 - LTEXT "DOPPLER FACTOR:",IDC_STATIC,7,51,68,8 - EDITTEXT IDC_DOPPLERFACTOR,83,48,40,14 - LTEXT "% of real world doppler effect applied",IDC_STATIC,130, - 51,116,8 -END - -SELECTEDPARAMBOX DIALOG DISCARDABLE 0, 0, 132, 177 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "3D Sound - Selected Object Parameters" -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Cone Properties",IDC_STATIC,7,7,120,80 - LTEXT "CONE ANGLE:",IDC_STATIC,16,26,49,8 - EDITTEXT IDC_CONEANGLE,78,23,40,14 - LTEXT "Attenuation outside cone (1/100ths dB, must be negative)", - IDC_STATIC,16,46,56,33 - EDITTEXT IDC_CONEOUTSIDEVOLUME,78,50,40,14 - GROUPBOX "Volume Attenuation Characteristics",IDC_STATIC,7,92,120, - 76 - LTEXT "Minimum Distance for attenuation effects",IDC_STATIC,16, - 104,64,28 - EDITTEXT IDC_MINIMUMDISTANCE,78,106,40,14,ES_AUTOHSCROLL - LTEXT "Maximum Distance for attenuation effects",IDC_STATIC,16, - 132,64,28 - EDITTEXT IDC_MAXIMUMDISTANCE,78,134,40,14,ES_AUTOHSCROLL -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - "ORBITBOX", DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 57 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - "BULLETBOX", DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 57 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END - - "GLOBALPARAMBOX", DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 265 - TOPMARGIN, 7 - BOTTOMMARGIN, 83 - HORZGUIDE, 25 - HORZGUIDE, 45 - HORZGUIDE, 65 - HORZGUIDE, 85 - END - - "SELECTEDPARAMBOX", DIALOG - BEGIN - LEFTMARGIN, 7 - VERTGUIDE, 14 - TOPMARGIN, 7 - BOTTOMMARGIN, 168 - HORZGUIDE, 30 - HORZGUIDE, 55 - HORZGUIDE, 70 - HORZGUIDE, 108 - END - - "WAITBOX", DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 114 - TOPMARGIN, 7 - BOTTOMMARGIN, 15 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/ds3dview/watcom.mk b/sdk/samples/ds3dview/watcom.mk deleted file mode 100644 index aaeccd4..0000000 --- a/sdk/samples/ds3dview/watcom.mk +++ /dev/null @@ -1,43 +0,0 @@ -NAME = ds3dview -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib ..\..\..\lib\d3drm.lib ..\..\..\lib\dsound.lib uuid.lib ole32.lib comctl32.lib - -OBJS = viewer.obj file.obj rodcone.obj rlds3d.obj dsutil3d.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) tmp.lib $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) library tmp.lib @$(NAME).lnk - $(RC) $(RES) - -# -# need this because Watcom's libs don't have the ACM entries and the IMPORT -# statement on the linker doesn't work the way we want -# -tmp.lib : tmp.lbc - @wlib -q tmp.lib @tmp.lbc > NUL - -tmp.lbc : ..\$(MAKENAME) - @%write tmp.lbc ++_acmMetrics.'MSACM32.DLL'._acmMetrics.acmMetrics diff --git a/sdk/samples/dsshow/debug.h b/sdk/samples/dsshow/debug.h deleted file mode 100644 index d64de72..0000000 --- a/sdk/samples/dsshow/debug.h +++ /dev/null @@ -1,80 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.h - * Content: debug header - * - ***************************************************************************/ -#ifndef __DEBUG_INCLUDED__ -#define __DEBUG_INCLUDED__ -#ifdef __cplusplus -extern "C" -{ -#endif - -// -// -// -// -#ifdef DEBUG - #define DEBUG_SECTION "Debug" // section name for - #define DEBUG_MODULE_NAME "DSSHOW" // key name and prefix for output - #define DEBUG_MAX_LINE_LEN 255 // max line length (bytes!) -#endif - - -// -// based code makes since only in win 16 (to try and keep stuff out of -// [fixed] data segments, etc)... -// -#ifndef BCODE -#ifdef _WIN32 - #define BCODE -#else - #define BCODE _based(_segname("_CODE")) -#endif -#endif - - - - -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; -// -// -// -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - -#ifdef DEBUG - BOOL WINAPI DbgEnable(BOOL fEnable); - UINT WINAPI DbgGetLevel(void); - UINT WINAPI DbgSetLevel(UINT uLevel); - UINT WINAPI DbgInitialize(BOOL fEnable); - void WINAPI _Assert( char * szFile, int iLine ); - - void FAR CDECL dprintf(UINT uDbgLevel, LPSTR szFmt, ...); - - #define D(x) {x;} - #define DPF dprintf - #define DPI(sz) {static char BCODE ach[] = sz; OutputDebugStr(ach);} - #define ASSERT(x) if( !(x) ) _Assert( __FILE__, __LINE__) -#else - #define DbgEnable(x) FALSE - #define DbgGetLevel() 0 - #define DbgSetLevel(x) 0 - #define DbgInitialize(x) 0 - - #ifdef _MSC_VER - #pragma warning(disable:4002) - #endif - - #define D(x) - #define DPF() - #define DPI(sz) - #define ASSERT(x) -#endif - -#ifdef __cplusplus -} -#endif -#endif // __DEBUG_INCLUDED__ diff --git a/sdk/samples/dsshow/dsenum.c b/sdk/samples/dsshow/dsenum.c deleted file mode 100644 index 0a461af..0000000 --- a/sdk/samples/dsshow/dsenum.c +++ /dev/null @@ -1,142 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dstrenum.c - * Content: Illustrates enumerating DirectSound drivers - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include - -#include "dsenum.h" -#include "resource.h" - -extern HINSTANCE hInst; -extern HWND hWndMain; - - - -/****************************************************************************/ -/* DoDSoundEnumerate() */ -/* */ -/* This function takes care of handling the DirectSound enumeration, which*/ -/* simply means creating a dialog box, at this point... */ -/****************************************************************************/ -BOOL DoDSoundEnumerate( LPGUID lpGUID ) - { - if( DialogBoxParam( hInst, MAKEINTRESOURCE(IDD_DSENUMBOX), hWndMain, - DSEnumDlgProc, (LPARAM)lpGUID )) - return( TRUE ); - - return( FALSE ); - } - -/****************************************************************************/ -/* DSEnumDlgProc() */ -/* */ -/* Dialog procedure for the DSound enumeration choice dialog. Allows the */ -/* user to choose from installed drivers. Returns TRUE on error. */ -/****************************************************************************/ -BOOL CALLBACK DSEnumDlgProc( HWND hDlg, UINT msg, - WPARAM wParam, LPARAM lParam ) - { - static HWND hCombo; - static LPGUID lpGUID; - LPGUID lpTemp; - int i; - - switch( msg ) - { - case WM_INITDIALOG: - hCombo = GetDlgItem( hDlg, IDC_DSENUM_COMBO ); - lpGUID = (LPGUID)lParam; - - if( DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, &hCombo ) != DS_OK ) - { - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - if( ComboBox_GetCount( hCombo )) - ComboBox_SetCurSel( hCombo, 0 ); - else - { - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - return( TRUE ); - - - case WM_COMMAND: - switch( LOWORD( wParam )) - { - case IDOK: - for( i = 0; i < ComboBox_GetCount( hCombo ); i++ ) - { - lpTemp = (LPGUID)ComboBox_GetItemData( hCombo, i ); - if( i == ComboBox_GetCurSel( hCombo )) - { - if( lpTemp != NULL ) - memcpy( lpGUID, lpTemp, sizeof(GUID)); - else - lpGUID = NULL; - } - if( lpTemp ) - LocalFree( lpTemp ); - } - // If we got the NULL GUID, then we want to open the default - // sound driver, so return with an error and the init code - // will know not to pass in the guID and will send NULL - // instead. - if( lpGUID == NULL ) - EndDialog( hDlg, TRUE ); - else - EndDialog( hDlg, FALSE ); - return( TRUE ); - - case IDCANCEL: - // Force a NULL GUID - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - break; - - - default: - return( FALSE ); - } - - return( FALSE ); - } - - -/****************************************************************************/ -/* DSEnumProc() */ -/* */ -/* This is the Enumeration procedure called by DirectSoundEnumerate with */ -/* the parameters of each DirectSound Object available in the system. */ -/****************************************************************************/ -BOOL CALLBACK DSEnumProc( LPGUID lpGUID, LPSTR lpszDesc, - LPSTR lpszDrvName, LPVOID lpContext ) - { - HWND hCombo = *(HWND *)lpContext; - LPGUID lpTemp = NULL; - - if( lpGUID != NULL ) - { - if(( lpTemp = LocalAlloc( LPTR, sizeof(GUID))) == NULL ) - return( TRUE ); - - memcpy( lpTemp, lpGUID, sizeof(GUID)); - } - - ComboBox_AddString( hCombo, lpszDesc ); - ComboBox_SetItemData( hCombo, - ComboBox_FindString( hCombo, 0, lpszDesc ), - lpTemp ); - return( TRUE ); - } diff --git a/sdk/samples/dsshow/dsenum.h b/sdk/samples/dsshow/dsenum.h deleted file mode 100644 index 3eb360a..0000000 --- a/sdk/samples/dsshow/dsenum.h +++ /dev/null @@ -1,25 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dsenum.h - * Content: Direct Sound Enumeration defines - * - * - ***************************************************************************/ - -#ifndef __DSENUM_INCLUDED__ -#define __DSENUM_INCLUDED__ - - -// Function declarations - -BOOL DoDSoundEnumerate( LPGUID ); - -BOOL CALLBACK DSEnumProc( LPGUID, LPSTR, LPSTR, LPVOID ); -BOOL CALLBACK DSEnumDlgProc( HWND, UINT, WPARAM, LPARAM ); - - -#endif - - diff --git a/sdk/samples/dsshow/dsshow.def b/sdk/samples/dsshow/dsshow.def deleted file mode 100644 index 683ef99..0000000 --- a/sdk/samples/dsshow/dsshow.def +++ /dev/null @@ -1,3 +0,0 @@ -NAME DSSHOW - -DESCRIPTION 'DirectSound Sample App' diff --git a/sdk/samples/dsshow/dsshow.rc b/sdk/samples/dsshow/dsshow.rc deleted file mode 100644 index d2ee2e7..0000000 --- a/sdk/samples/dsshow/dsshow.rc +++ /dev/null @@ -1,192 +0,0 @@ -//Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "winver.h" -#include "dlgs.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINMENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Open", IDPD_FILE_OPEN - MENUITEM "E&xit", IDPD_FILE_EXIT - END - POPUP "&Options" - BEGIN - MENUITEM "&Output Type", IDPD_OPTIONS_OUTPUTTYPE - MENUITEM "&Check Latency", IDPD_CHECKLATENCY - MENUITEM "&Enumerate Drivers", IDPD_ENUMDRIVERS - END - POPUP "&Help" - BEGIN - MENUITEM "About", IDPD_HELP_ABOUT - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include ""dlgs.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_OUTPUTBUFFERTYPE DIALOG DISCARDABLE 0, 0, 209, 215 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Output Buffer Type" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",ID_OK,24,187,50,14 - PUSHBUTTON "Cancel",ID_CANCEL,79,187,50,14 - LISTBOX IDC_FORMATS,20,40,167,133,LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP | LBS_NOTIFY - LTEXT "Pick Output Buffer Type",IDC_STATIC,13,25,84,10 - PUSHBUTTON "&Apply",ID_APPLY,135,187,50,14 -END - -IDD_ABOUT DIALOG DISCARDABLE 0, 0, 186, 81 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",ID_OK,65,54,50,14 - CTEXT "Direct Sound Test Application",IDC_STATIC,39,7,133,12 - CTEXT "Copyright (c) 1995-1996 Microsoft Corporation",IDC_STATIC,41, - 20,133,24 - ICON IDI_ICON3,IDC_STATIC,9,8,18,20 -END - -IDD_CHECKLATENCY DIALOG DISCARDABLE 0, 0, 256, 159 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Check Latency" -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "&Done",ID_DONE,105,140,50,14 - LISTBOX IDC_FILES_LB,18,24,143,82, - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Files Loaded:",IDC_STATIC,10,9,46,10 - DEFPUSHBUTTON "&Play",ID_PLAY,184,28,50,14 - PUSHBUTTON "&Stop",ID_STOP,184,47,50,14 - LTEXT "You can use this dialog to quickly start and stop sounds to check their latency", - IDC_STATIC,9,113,229,22 - LTEXT "Beta Dialog: Not fully tested",IDC_STATIC,162,4,92,11 -END - -IDD_DSENUMBOX DIALOG DISCARDABLE 0, 0, 184, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Choose a DirectSound Driver..." -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,34,43,50,14 - PUSHBUTTON "Cancel",IDCANCEL,100,43,50,14 - COMBOBOX IDC_DSENUM_COMBO,4,12,176,36,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Driver Description:",IDC_STATIC,4,4,116,8 -END - -IDD_FILEOPEN_NEST DIALOG DISCARDABLE 0, 0, 294, 95 -STYLE DS_MODALFRAME | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS | - WS_CAPTION | WS_SYSMENU -CAPTION "Dialog" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Create as a ""sticky buffer""",IDC_FONEST_STICKY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,59,77,215,10 - LTEXT "",stc32,7,7,280,70 -END - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -IDI_APP ICON DISCARDABLE "GENERIC.ICO" -IDI_ICON1 ICON DISCARDABLE "icon1.ico" -IDI_ICON2 ICON DISCARDABLE "icon2.ico" -IDI_ICON3 ICON DISCARDABLE "icon3.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""winver.h""\r\n" - "#include ""dlgs.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/dsshow/generic.ico b/sdk/samples/dsshow/generic.ico deleted file mode 100644 index 9024ceb..0000000 Binary files a/sdk/samples/dsshow/generic.ico and /dev/null differ diff --git a/sdk/samples/dsshow/icon1.ico b/sdk/samples/dsshow/icon1.ico deleted file mode 100644 index d3f65ab..0000000 Binary files a/sdk/samples/dsshow/icon1.ico and /dev/null differ diff --git a/sdk/samples/dsshow/icon2.ico b/sdk/samples/dsshow/icon2.ico deleted file mode 100644 index 21926a9..0000000 Binary files a/sdk/samples/dsshow/icon2.ico and /dev/null differ diff --git a/sdk/samples/dsshow/icon3.ico b/sdk/samples/dsshow/icon3.ico deleted file mode 100644 index 3bd250c..0000000 Binary files a/sdk/samples/dsshow/icon3.ico and /dev/null differ diff --git a/sdk/samples/dsshow/makefile b/sdk/samples/dsshow/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/dsshow/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/dsshow/msvc.mk b/sdk/samples/dsshow/msvc.mk deleted file mode 100644 index 28a470a..0000000 --- a/sdk/samples/dsshow/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = dsshow -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib dsound.lib \ - comdlg32.lib gdi32.lib winmm.lib msacm32.lib libc.lib uuid.lib ole32.lib comctl32.lib - -OBJS = shell.obj wassert.obj wave.obj dsenum.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/dsshow/readme.txt b/sdk/samples/dsshow/readme.txt deleted file mode 100644 index 6338d84..0000000 --- a/sdk/samples/dsshow/readme.txt +++ /dev/null @@ -1,36 +0,0 @@ -DirectSound Mixing Test (dsshow) --------------------------------- - -This app allows the user to play with most of the controls exposed by -DirectSoundBuffers, including the mixing of multiple sounds, and changing -frequency, pan, and volume of those sounds. - -Open one or more .wav files using the File.Open dialog. A control bar will -be displayed for each file opened. Dsshow uses static buffers for its sounds -and is therefore designed for short sounds only. If you try to open a file -that is very large, you will run out of system memory - beware! - -The control bar for each sound contains a bunch of things. First, the file -name is displayed at the top. The next line states whether the buffer is -mixed in software (SW) or hardware (HW), and whether the buffer is playing -or stopped. Dsshow will put buffers in hardware whenever possible. On the -next two lines, the current play and write cursors are displayed. They are -updated every half second or so. Then there are sliders to control the -buffers frequency, pan, and volume settings. At the bottom, there is a -Play/Stop button (it morphs back and forth, try it!) and a Close button (to -delete the file from the view), and a checkbox for Looping. - -The dsshow title bar tells you information about the hardware mixing -capabilities of your sound card. It displays the number of free hw mixing -channels and hw memory (if you have an ISA card like most people). If both -of those numbers are 0, your card does not have hardware mixing. - -There are also two interesting things you can do from the Options menu. -First, you can set the format of the primary buffer by selecting -Options.Output Type. This will list the formats supported by the primary -buffer, and let you choose one. Also, you can toggle Options.Enumerate Drivers -which will show you what objects DirectSoundEnumerate will list for you, -and allow you to select one. This only happens when you start up Dsshow, -so to see the effect, select this menu item, exit Dsshow, and then run Dsshow -again. - diff --git a/sdk/samples/dsshow/resource.h b/sdk/samples/dsshow/resource.h deleted file mode 100644 index 7ca58d4..0000000 --- a/sdk/samples/dsshow/resource.h +++ /dev/null @@ -1,42 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by main.rc -// -#define ID_APPLY 3 -#define IDR_MAINMENU 101 -#define IDD_OUTPUTBUFFERTYPE 102 -#define IDD_ABOUT 103 -#define IDD_DSENUMBOX 109 -#define IDI_ICON1 104 -#define IDI_ICON2 105 -#define IDI_ICON3 107 -#define IDD_CHECKLATENCY 108 -#define IDD_FILEOPEN_NEST 110 -#define IDC_FONEST_STICKY 111 -#define IDC_FORMATS 1000 -#define ID_OK 1001 -#define ID_CANCEL 1002 -#define ID_DONE 1004 -#define IDC_FILES_LB 1005 -#define ID_PLAY 1006 -#define ID_STOP 1007 -#define IDC_DSENUM_COMBO 1008 -#define ID_FILE_EXIT 40002 -#define IDPD_FILE_EXIT 40002 -#define IDPD_FILE_OPEN 40003 -#define IDPD_OPTIONS_OUTPUTTYPE 40004 -#define IDPD_HELP_ABOUT 40005 -#define IDPD_CHECKLATENCY 40006 -#define IDPD_ENUMDRIVERS 40007 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 112 -#define _APS_NEXT_COMMAND_VALUE 40008 -#define _APS_NEXT_CONTROL_VALUE 1009 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/dsshow/shell.c b/sdk/samples/dsshow/shell.c deleted file mode 100644 index 61de4f6..0000000 --- a/sdk/samples/dsshow/shell.c +++ /dev/null @@ -1,3127 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: shell.c - * Content: Direct Sound show-off. - * This app basically uses the direct sound api's and pops up some - * controls that the user can play with at runtime to change - * the sound frequency, panning, volume, etc. It has a few - * other functions built in. - * - * This app also takes a couple command-line parameters. The format is: - * - * DSShow [/PLAY [/LOOP]] [file] [file] ... - * - * Specifying /PLAY causes any specified files to be played as they're - * opened. Adding the /LOOP causes them to loop as well. /LOOP without - * /PLAY means nothing. Everything else is assumed to be one or more file - * names. Filenames can be enclosed in quotes. This also means you can - * drag and drop files onto the program's icon - * - * - ***************************************************************************/ - -#define INITGUID -#include -#include -#include -#include -#include - -#include -#include -#include -#include - - -#include "wassert.h" -#include "wave.h" - -#include "resource.h" -#include "shell.h" -#include "dsenum.h" - - -/* Procedure called when the application is loaded for the first time */ - -BOOL ClassInit( hInstance ) -HANDLE hInstance; -{ - WNDCLASS myClass; - - myClass.hCursor = LoadCursor( NULL, IDC_ARROW ); - myClass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICON3)); - myClass.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); - myClass.lpszClassName = (LPSTR)szAppName; - myClass.hbrBackground = (HBRUSH)(COLOR_WINDOW); - myClass.hInstance = hInstance; - myClass.style = CS_HREDRAW | CS_VREDRAW; - myClass.lpfnWndProc = WndProc; - myClass.cbClsExtra = 0; - myClass.cbWndExtra = 0; - - if (!RegisterClass( &myClass ) ) - return FALSE; - - return TRUE; /* Initialization succeeded */ -} - - -/* - * This "hook procedure" is called by the common dialog code for certain - * events that may occur during the life of our nested dialog structure. - * We nest the Explorer style dialog inside our file open dialog so we - * can addd a check box for stick buffers. - */ -UINT CALLBACK FileOpenCustomTemplateDlgProc( hDlg, message, wParam, lParam ) -HWND hDlg; -UINT message; -WPARAM wParam; -LPARAM lParam; -{ - static LPOPENFILENAME lpofn = NULL; - - switch( message ) - { - case WM_INITDIALOG: - lpofn = (LPOPENFILENAME)lParam; - - /* Set the flag to match the current state of the check box control */ - *((LPBOOL)lpofn->lCustData) = SendDlgItemMessage( hDlg, IDC_FONEST_STICKY, - BM_GETCHECK, 0, 0 ); - return TRUE; - - case WM_NOTIFY: - switch(((LPOFNOTIFY)lParam)->hdr.code) - { - case CDN_SELCHANGE: - /* Use this area to process anything that must be updated when the - * user changes the selection in the Common Dialog Box. - * NOTE: Provided only for informational purposes - */ - return FALSE; - - case CDN_FILEOK: - /* We can do lots of things in this notification message. The most - * important is that we can decide whether the Common Dialog call will - * go through or whether it will fail. I decided to handle the checkbox - * control in this one place versus 4 others... -PRN - */ - Assert( lpofn != NULL ); - *((LPBOOL)lpofn->lCustData) = SendDlgItemMessage( hDlg, IDC_FONEST_STICKY, - BM_GETCHECK, 0, 0 ); - /* Returning zero signifies that we "approve" of the OK command, - * and allows the common dialog to finish. - */ - return FALSE; - } - /* Let the default dialog do/continue processing */ - return FALSE; - } - return FALSE; -} - - -int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow ) -HINSTANCE hInstance, hPrevInstance; -LPSTR lpszCmdLine; -int cmdShow; -{ - MSG msg; - HWND hWnd; - - // We must call this to ensure the common controls are setup for - // this application - InitCommonControls(); - - if (!hPrevInstance) { - /* Call initialization procedure if this is the first instance */ - if (!ClassInit( hInstance )) - return FALSE; - } - - - hWnd = CreateWindow((LPSTR)szAppName, - (LPSTR)szMessage, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, - CW_USEDEFAULT, - DX_MINWINDOW, - DY_MINWINDOW, - (HWND)NULL, - (HMENU)NULL, - (HANDLE)hInstance, - (LPSTR)NULL - ); - - if (!hWnd) return (int)msg.wParam; - - // Make a long line across the top. - CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - 0, - 0, - 8000, - 2, - hWnd, - (HMENU)0, - hInst, - NULL); - - - /* Save instance handle for DialogBox */ - hInst = hInstance; - - ShowWindow( hWnd, cmdShow ); - - if( lpszCmdLine && *lpszCmdLine ) - if( !ParseCommandLine( lpszCmdLine )) - goto Exit_WinMain; - - /* Polling messages from event queue */ - while (GetMessage((LPMSG)&msg, NULL, 0, 0)) { - TranslateMessage((LPMSG)&msg); - DispatchMessage((LPMSG)&msg); - } - -Exit_WinMain: - DestroyWindow(hWnd); - UnregisterClass(szAppName, hInstance); - return (int)msg.wParam; -} - -/* This function updates the status window by writing the specified - string to the window, prepended by a string indicating whether - the buffer is in hardware or software -*/ -void UpdateStatus(FILEINFO *pFileInfo, DWORD dwStatus) -{ - TCHAR szStatus[200]; - DWORD dwPlay, dwWrite; - HRESULT hr; - - lstrcpy(szStatus, pFileInfo->fHardware ? szHW : szSW); - if (dwStatus & DSBSTATUS_BUFFERLOST) - { - lstrcat(szStatus, szLost); - SendMessage(pFileInfo->hWndStatus_TXT, WM_SETTEXT, 0, (LPARAM)szStatus); - } - else if (dwStatus & DSBSTATUS_PLAYING) - { - lstrcat(szStatus, szPlaying); - SendMessage(pFileInfo->hWndStatus_TXT, WM_SETTEXT, 0, (LPARAM)szStatus); - } - else - { - lstrcat(szStatus, szStopped); - SendMessage(pFileInfo->hWndStatus_TXT, WM_SETTEXT, 0, (LPARAM)szStatus); - } - if (pFileInfo->fSticky) - { - lstrcat(szStatus, szSticky); - SendMessage(pFileInfo->hWndStatus_TXT, WM_SETTEXT, 0, (LPARAM)szStatus); - } - hr = IDirectSoundBuffer_GetCurrentPosition(pFileInfo->pDSB, &dwPlay, &dwWrite); - if (DS_OK == hr) { - wsprintf(szStatus, szFmtPlayPosition, dwPlay); - SendMessage(pFileInfo->hWndPlayPosition_TXT, WM_SETTEXT, 0, (LPARAM)szStatus); - wsprintf(szStatus, szFmtWritePosition, dwWrite); - SendMessage(pFileInfo->hWndWritePosition_TXT, WM_SETTEXT, 0, (LPARAM)szStatus); - } - - return; -} - -/* This function updates the main window title to show some - relevant information about the direct sound object -*/ -void UpdateMainStatus() -{ - DSCAPS dsc; - TCHAR szTitle[200]; - - // Update main window title with some relevant info - dsc.dwSize = sizeof(dsc); - IDirectSound_GetCaps(gpds, &dsc); - wsprintf(szTitle, "%s : free hw memory = %dKb, free hw buffers = %d", - szMessage, (dsc.dwFreeHwMemBytes+512)/1024, - dsc.dwFreeHwMixingAllBuffers); - SendMessage(hWndMain, WM_SETTEXT, 0, (LPARAM)szTitle); - return; -} - - -/* This routine will set up everything needed for the app to run. - - Input: - hWnd - App main window handle - - Output: - None. - -*/ - -int AppInit(HWND hWnd) - -{ - - UINT cT; - DSBUFFERDESC dsbd; - BOOL fUseGuid; - HRESULT hr; - DWORD dw; - - // Set up the global window handle. - hWndMain = hWnd; - - // Set up the global File...Open dialog's start directory - GetMediaStartPath(); - - // Set up the file info header - FileInfoFirst.pNext = NULL; - FileInfoFirst.pwfx = NULL; - FileInfoFirst.cox = COX_STARTCONTROL; - FileInfoFirst.coy = COY_STARTCONTROL; - - // Clear the coordinate buffer. Used to find the next available - // position to use for a new control. -1 is the invalid value. - for (cT=0; cTwFormatTag = WAVE_FORMAT_PCM; - FileInfoFirst.pwfx->nChannels = 2; - FileInfoFirst.pwfx->nSamplesPerSec = 22050; - FileInfoFirst.pwfx->nAvgBytesPerSec = 22050*2*2; - FileInfoFirst.pwfx->nBlockAlign = 4; - FileInfoFirst.pwfx->wBitsPerSample = 16; - FileInfoFirst.pwfx->cbSize = 0; - -#ifdef STARTEIGHTBITS - - FileInfoFirst.pwfx->wFormatTag = WAVE_FORMAT_PCM; - FileInfoFirst.pwfx->nChannels = 2; - FileInfoFirst.pwfx->nSamplesPerSec = 22050; - FileInfoFirst.pwfx->nAvgBytesPerSec = 22050*1*2; - FileInfoFirst.pwfx->nBlockAlign = 2; - FileInfoFirst.pwfx->wBitsPerSample = 8; - FileInfoFirst.pwfx->cbSize = 0; - - -#endif -#ifdef STARTMONO - FileInfoFirst.pwfx->wFormatTag = WAVE_FORMAT_PCM; - FileInfoFirst.pwfx->nChannels = 1; - FileInfoFirst.pwfx->nSamplesPerSec = 22050; - FileInfoFirst.pwfx->nAvgBytesPerSec = 22050*1*2; - FileInfoFirst.pwfx->nBlockAlign = 2; - FileInfoFirst.pwfx->wBitsPerSample = 16; - FileInfoFirst.pwfx->cbSize = 0; -#endif - - // Optionally enumerate DSOUND devices and allow the user to pick one... - - if (!SUCCEEDED(CoInitialize(NULL))) { - MessageBox(hWnd, "Failed to initialize COM library", "DirectSound Demo", MB_OK | MB_ICONSTOP); - return -1; - } - - fEnumDrivers = (BOOL)GetProfileInt( "DSSHOW", "EnumDrivers", FALSE ); - fUseGuid = (fEnumDrivers && !DoDSoundEnumerate(&guID)); - - hr = CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, - &IID_IDirectSound, &gpds); - - if (SUCCEEDED(hr) && (NULL != gpds)) { - - hr = IDirectSound_Initialize(gpds, fUseGuid ? &guID : NULL); - if (SUCCEEDED(hr)) { - - // Note we need to set the level to be priority to set the - // format of the primary buffer - hr = IDirectSound_SetCooperativeLevel(gpds, hWndMain, DSSCL_PRIORITY); - if (SUCCEEDED(hr)) { - - // Set up the primary direct sound buffer. - ZeroMemory(&dsbd, sizeof(dsbd)); - dsbd.dwSize = sizeof(dsbd); - dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; - - hr = IDirectSound_CreateSoundBuffer(gpds, &dsbd, &(FileInfoFirst.pDSB), NULL); - if (SUCCEEDED(hr)) { - - hr = IDirectSoundBuffer_Play(FileInfoFirst.pDSB, 0, 0, DSBPLAY_LOOPING); - if (SUCCEEDED(hr)) { - - UpdateMainStatus(); - - } else { - MessageBox(hWnd, "Cannot play primary buffer", - "DirectSound Demo", MB_OK|MB_ICONSTOP); - IDirectSoundBuffer_Release(FileInfoFirst.pDSB); - FileInfoFirst.pDSB = NULL; - } - - } else { - MessageBox(hWnd, "Cannot create primary buffer", - "DirectSound Demo", MB_OK|MB_ICONSTOP); - } - - } else { - MessageBox(hWnd, "DirectSound SetCooperativeLevel failed", - "DirectSound Demo", MB_OK|MB_ICONSTOP); - } - - } else { - MessageBox(hWnd, "Failed to Initialize DirectSound object", - "DirectSound Demo", MB_OK | MB_ICONSTOP); - } - - if (!SUCCEEDED(hr)) { - IDirectSound_Release(gpds); - gpds = NULL; - } - - } else { - MessageBox(hWnd, "Failed to create DirectSound COM object", - "DirectSound Demo", MB_OK | MB_ICONSTOP); - } - - if (SUCCEEDED(hr)) { - return 0; - } else { - CoUninitialize(); - return -1; - } -} - -/* This will destroy all the created objects, allocated memory, etc. Must be called - before termination of app. - - Input: - hWnd - Window handle of main window - - Output: - None. - -*/ -void AppDestroy( HWND hWnd ) -{ - - HRESULT hr = 0; - - if (dwTimer != 0) - { - KillTimer(hWnd, dwTimer); - dwTimer = 0; - } - - - StopAllDSounds(hWnd, &FileInfoFirst); - FreeAllList(hWnd, &FileInfoFirst); - - - // Destroy the direct sound buffer. - if(FileInfoFirst.pDSB != NULL) - { - IDirectSoundBuffer_Stop(FileInfoFirst.pDSB); - IDirectSoundBuffer_Release(FileInfoFirst.pDSB); - FileInfoFirst.pDSB = NULL; - } - - // Destroy the direct sound object. - if (gpds != NULL) - { - IDirectSound_Release(gpds); - gpds = NULL; - CoUninitialize(); - } - - if (FileInfoFirst.pwfx != NULL) - { - GlobalFreePtr(FileInfoFirst.pwfx); - FileInfoFirst.pwfx = NULL; - } - - if (FileInfoFirst.pbData != NULL) - { - GlobalFreePtr(FileInfoFirst.pbData); - FileInfoFirst.pbData = NULL; - } - - WriteProfileString( "DSSHOW", "EnumDrivers", fEnumDrivers ? "1" : "0" ); - -} - -/* Procedures which make up the window class. */ -long FAR PASCAL WndProc( hWnd, message, wParam, lParam ) -HWND hWnd; -unsigned message; -WPARAM wParam; -LPARAM lParam; -{ - - - - switch (message) - { - - case WM_CREATE: - if (AppInit(hWnd)) return (-1); - break; - - case WM_TIMER: - if (!UIMainWindowTimerHandler(hWnd, wParam, lParam)) - return(DefWindowProc(hWnd, message, wParam, lParam)); - break; - - - case WM_HSCROLL: - if (!UIMainWindowHSBHandler(hWnd, wParam, lParam)) - return(DefWindowProc(hWnd, message, wParam, lParam)); - - break; - - case WM_VSCROLL: - if (!UIMainWindowVSBHandler(hWnd, wParam, lParam)) - return(DefWindowProc(hWnd, message, wParam, lParam)); - break; - - - case WM_INITMENU: - if((HMENU)wParam != GetMenu( hWnd )) - break; - CheckMenuItem((HMENU)wParam, IDPD_ENUMDRIVERS, - fEnumDrivers ? MF_CHECKED : MF_UNCHECKED ); - break; - - case WM_COMMAND: - if (!UIMainWindowCMDHandler(hWnd, wParam, lParam)) - return(DefWindowProc(hWnd, message, wParam, lParam)); - break; - - break; - - /*case WM_PAINT: - { - - break; - }*/ - - - case WM_DESTROY: - AppDestroy(hWnd); - PostQuitMessage( 0 ); - break; - - default: - return DefWindowProc( hWnd, message, wParam, lParam ); - break; - - } - - return(0L); -} - -/* This routine will pop up the open file dialog and open a file, and make any internal - arrangements so we know the file is loaded. - - Input: - hWnd - Handle of parent window. - - Output: - None. - -*/ -void PD_FileOpen( HWND hWnd ) -{ - - char szFileName[MAX_PATH]; - UINT cSamples; - FILEINFO *pFileInfo = NULL; - int nFileName; - BOOL fSticky; - - if (GetNumControls(&FileInfoFirst) >= MAXCONTROLS) - { - MessageBox(hWnd, "No more controls allowed", - "Hold on a sec...", MB_OK); - return; - } - - // Open the file, and check its format, etc. - if (OpenFileDialog(hWnd, szFileName, &nFileName, &fSticky)) - { - - // Allocate the memory for the structure. - if ((pFileInfo = GlobalAllocPtr(GPTR, sizeof(FILEINFO))) == NULL) - { - MessageBox(hWnd, "Cannot add this file", - "Out of Memory", MB_OK|MB_ICONSTOP); - goto ERROR_DONE_ROUTINE; - } - - pFileInfo->pbData = NULL; - pFileInfo->pwfx = NULL; - pFileInfo->pDSB = NULL; - pFileInfo->fSticky = fSticky; - strcpy(pFileInfo->szFileName, szFileName); - - if (WaveLoadFile(szFileName, &pFileInfo->cbSize, - &cSamples, &pFileInfo->pwfx, &pFileInfo->pbData) != 0) - { - MessageBox(hWnd, "Bad wave file or file too big to fit in memory", - "Cannot load wave", MB_OK|MB_ICONSTOP); - goto ERROR_DONE_ROUTINE; - } - - GetNextControlCoords(&FileInfoFirst, - &pFileInfo->cox, &pFileInfo->coy); - - if (NewDirectSoundBuffer(pFileInfo) != 0) - { - MessageBox(hWnd, "Cannot create new buffer", - "Direct Sound Error", MB_OK|MB_ICONSTOP); - goto ERROR_DONE_ROUTINE; - } - - Assert(pFileInfo->pbData != NULL); - - // If we fail after this, make sure to update the list!!! - if (AddToList(&FileInfoFirst, pFileInfo) != 0) - { - MessageBox(hWnd, "Cannot add file to list", - "Out of Memory", MB_OK|MB_ICONSTOP); - goto ERROR_DONE_ROUTINE; - } - - pFileInfo->nFileName = nFileName; - CreateControl(hWnd, pFileInfo, pFileInfo->pwfx->nSamplesPerSec, - (MAXPAN_TB-MINPAN_TB)/2, MINVOL_TB ); - ChangeOutputVol(pFileInfo); - ChangeOutputFreq(pFileInfo); - ChangeOutputPan(pFileInfo); - UpdateMainStatus(); - - } - - goto DONE_ROUTINE; - -ERROR_DONE_ROUTINE: - if (pFileInfo != NULL) - { - - ReleaseDirectSoundBuffer(pFileInfo); - - if (pFileInfo->pwfx != NULL) - { - GlobalFreePtr(pFileInfo->pwfx); - - } - if (pFileInfo->pbData != NULL) - { - GlobalFreePtr(pFileInfo->pbData); - } - - GlobalFreePtr(pFileInfo); - pFileInfo = NULL; - } - -DONE_ROUTINE: - return; - -} - -/* This routine will initialize a new direct sound buffer, - set the data in the buffer, - set the rate, format, etc... - - Input: - pFileInfo - Pointer to file info with all - nessecary info filled, - like pbData, cbData, etc... - - Output: - 0 if successful, else the error code. - -*/ - -int NewDirectSoundBuffer( - FILEINFO *pFileInfo - ) -{ - - DSBUFFERDESC dsbd; - DSBCAPS dsbc; - HRESULT hr; - BYTE *pbData = NULL; - BYTE *pbData2 = NULL; - DWORD dwLength; - DWORD dwLength2; - - // Set up the direct sound buffer. - memset(&dsbd, 0, sizeof(DSBUFFERDESC)); - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = 0; - dsbd.dwFlags |= DSBCAPS_STATIC; - // Use new GetCurrentPosition() accuracy (DirectX 2 feature) - dsbd.dwFlags |= DSBCAPS_CTRLDEFAULT | DSBCAPS_GETCURRENTPOSITION2; - if (pFileInfo->fSticky) - dsbd.dwFlags |= DSBCAPS_STICKYFOCUS; - dsbd.dwBufferBytes = pFileInfo->cbSize; - dsbd.lpwfxFormat = pFileInfo->pwfx; - if ((hr = gpds->lpVtbl->CreateSoundBuffer(gpds, - &dsbd, - &(pFileInfo->pDSB), - NULL )) != 0) - { - goto ERROR_IN_ROUTINE; - } - - // Ok, lock the sucker down, and copy the memory to it. - if ((hr = pFileInfo->pDSB->lpVtbl->Lock(pFileInfo->pDSB, - 0, - pFileInfo->cbSize, - &pbData, - &dwLength, - &pbData2, - &dwLength2, - 0L)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - Assert(pbData != NULL); - memcpy(pbData, pFileInfo->pbData, pFileInfo->cbSize); - - // Ok, now unlock the buffer, we don't need it anymore. - if ((hr = pFileInfo->pDSB->lpVtbl->Unlock(pFileInfo->pDSB, - pbData, pFileInfo->cbSize, - NULL, 0)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - pbData = NULL; - - if ((hr = pFileInfo->pDSB->lpVtbl->SetVolume(pFileInfo->pDSB, - MAXVOL_VAL)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - if ((hr = pFileInfo->pDSB->lpVtbl->SetPan(pFileInfo->pDSB, - MIDPAN_VAL)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - dsbc.dwSize = sizeof(dsbc); - if (hr = IDirectSoundBuffer_GetCaps(pFileInfo->pDSB, &dsbc)) - { - goto ERROR_IN_ROUTINE; - } - - if (dsbc.dwFlags & DSBCAPS_LOCHARDWARE) { - pFileInfo->fHardware = TRUE; - } else { - pFileInfo->fHardware = FALSE; - } - - goto DONE_ROUTINE; - -ERROR_IN_ROUTINE: - if (pbData != NULL) - { - hr = pFileInfo->pDSB->lpVtbl->Unlock(pFileInfo->pDSB, pbData, - pFileInfo->cbSize, NULL, 0); - pbData = NULL; - } - - if (pFileInfo->pDSB != NULL) - { - pFileInfo->pDSB->lpVtbl->Release(pFileInfo->pDSB); - pFileInfo->pDSB = NULL; - } - -DONE_ROUTINE: - - return(hr); - -} - -/* This routine will release a direct sound buffer, - freeing up memory, resources, - whatever. - - Input: - pFileInfo - Pointer to the file info, - with the proper stuff set. - - Output: - 0 if successful, else the error code. - -*/ -int ReleaseDirectSoundBuffer( FILEINFO *pFileInfo ) -{ - - if (pFileInfo->pDSB != NULL) - { - pFileInfo->pDSB->lpVtbl->Release(pFileInfo->pDSB); - pFileInfo->pDSB = NULL; - } - - return(0); - -} - -/* This routine will find the next x and y coordinates to - write the control to. - The rgfcoxAvail is an array of booleans. - If false, then the index can be - used as an x coordinate. - - Input: - pFileInfoHead - Header of the linked list. - pcox, pcoy - Filled upon return with next - coordinates to use. - - Output: - Only pcox and pcoy change. - -*/ - -void GetNextControlCoords( - FILEINFO *pFileInfoHead, - int *pcox, - int *pcoy - ) -{ - UINT cT; - - for (cT=0; cTcox; - Assert(pFileInfo != NULL); - cox = pFileInfo->cox+DX_TEXTSPACING; - coy = pFileInfo->coy+DY_TEXTSPACING; //We may have to shift this - - coxOld = cox; - coyOld = coy; - coy -= 8; //We must adjust to fit the text in the border - - if ((hDC = GetDC(hWnd)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - - if (!GetTextExtentPoint32(hDC, pFileInfo->szFileName+pFileInfo->nFileName, strlen(pFileInfo->szFileName+pFileInfo->nFileName), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Creates the Filename window - if ((pFileInfo->hWndFileName_TXT = CreateWindow( - "STATIC", - pFileInfo->szFileName+pFileInfo->nFileName, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_FILENAME_TXT, - Size.cy, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - //Create line under Filename - cox += DX_LOOPEDSPACING; - coy += Size.cy + DY_TEXTSPACING + DY_LOOPEDSPACING; - - if ((pFileInfo->hWndFileName_EDGE = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_LOOPEDSPACING+DY_TEXTSPACING)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - // Now create status if required. - - #ifdef SHOWSTATUS - - if (!GetTextExtentPoint32(hDC, szPlaying, strlen(szPlaying), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - - //Creates Status Window - if ((pFileInfo->hWndStatus_TXT = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_STATUS_TXT, - Size.cy, // + DY_TEXTSPACING, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - cox += DX_LOOPEDSPACING; - coy += Size.cy + DY_TEXTSPACING + DY_LOOPEDSPACING; - - //Create line under Status - if ((pFileInfo->hWndStatus_EDGE = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_LOOPEDSPACING+DY_TEXTSPACING)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Creates PlayPos Window - if ((pFileInfo->hWndPlayPosition_TXT = CreateWindow( - "STATIC", "", - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_STATUS_TXT, - Size.cy, - hWnd, - NULL, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - cox += DX_LOOPEDSPACING; - coy += Size.cy + DY_TEXTSPACING + DY_LOOPEDSPACING; //Create line under PlayPos - - if ((pFileInfo->hWndPlayPosition_EDGE = CreateWindow( - "STATIC", "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_LOOPEDSPACING+DY_TEXTSPACING)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - NULL, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Creates WritePos Window - if ((pFileInfo->hWndWritePosition_TXT = CreateWindow( - "STATIC", "", - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_STATUS_TXT, - Size.cy, - hWnd, - NULL, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - cox += DX_LOOPEDSPACING; - coy += Size.cy + DY_TEXTSPACING + DY_LOOPEDSPACING; - - //Create line under WritePos - if ((pFileInfo->hWndWritePosition_EDGE = CreateWindow( - "STATIC", "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_LOOPEDSPACING+DY_TEXTSPACING)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - NULL, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - #endif - - //Set up the Freq Text - if (!GetTextExtentPoint32(hDC, szFreq, strlen(szFreq), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - // Make the frequency text there. - if ((pFileInfo->hWndFreq_TXT = CreateWindow( - "STATIC", - szFreq, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_FREQ_TXT, - Size.cy, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - coy += Size.cy; - - // Make the frequency trackbar. - if ((pFileInfo->hWndFreq_TB = CreateWindow( - TRACKBAR_CLASS, - "", - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTH, - cox, - coy, - DX_FREQ_TB, - DY_FREQ_TB, - hWnd, - (HMENU)(idBase+idFreqTB), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - SendMessage(pFileInfo->hWndFreq_TB, TBM_SETRANGEMIN, FALSE, MINFREQ_TB / FREQFACTOR ); - SendMessage(pFileInfo->hWndFreq_TB, TBM_SETRANGEMAX, FALSE, MAXFREQ_TB / FREQFACTOR ); - - SendMessage(pFileInfo->hWndFreq_TB, TBM_SETPAGESIZE, 0, FREQPAGE ); - SendMessage(pFileInfo->hWndFreq_TB, TBM_SETPOS, TRUE, (dwFreq + FREQADD)/FREQFACTOR); - pFileInfo->dwFreq = dwFreq; - - - coy += DY_FREQ_TB+DY_PANSPACING; - - if ((pFileInfo->hWndFreq_EDGE = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_PANSPACING+DY_TEXTSPACING)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Adjusts the relative position of the Text - coy -= (((DY_PANSPACING+DY_TEXTSPACING)/2)-((DY_LOOPEDSPACING+DY_TEXTSPACING)/2)); - - if (!GetTextExtentPoint32(hDC, szPan, strlen(szPan), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - - // Make the pan text there. - if ((pFileInfo->hWndPan_TXT = CreateWindow( - "STATIC", - szPan, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_PAN_TXT, - Size.cy, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - coy += Size.cy; - - // Make the pan trackbar. - if ((pFileInfo->hWndPan_TB = CreateWindow( - TRACKBAR_CLASS, - "", - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTH, - cox, - coy, - DX_PAN_TB, - DY_PAN_TB, - hWnd, - (HMENU)(idBase+idPanTB), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - SendMessage(pFileInfo->hWndPan_TB, TBM_SETRANGE, FALSE, MAKELONG(MINPAN_TB, MAXPAN_TB)); - SendMessage(pFileInfo->hWndPan_TB, TBM_SETPOS, TRUE, dwPan); - SendMessage(pFileInfo->hWndPan_TB, TBM_SETPAGESIZE, 0, PANPAGE ); - pFileInfo->dwPan = dwPan; - - - coy += DY_PAN_TB + DY_VOLSPACING; - - if ((pFileInfo->hWndPan_EDGE = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_VOLSPACING+DY_TEXTSPACING)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Adjusts the relative position of the Text - coy -= (((DY_PANSPACING+DY_TEXTSPACING)/2)-((DY_LOOPEDSPACING+DY_TEXTSPACING)/2)); - - if (!GetTextExtentPoint32(hDC, szVolume, strlen(szVolume), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - // Make the volume text there. - if ((pFileInfo->hWndVol_TXT = CreateWindow( - "STATIC", - szVolume, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox, - coy, - DX_VOL_TXT, - Size.cy, - hWnd, - (HMENU)idBase, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - coy += Size.cy; - - // Make the volume trackbars. - // Create main volume bar. - if ((pFileInfo->hWndVolM_TB = CreateWindow( - TRACKBAR_CLASS, - "", - WS_CHILD | WS_VISIBLE | TBS_VERT | TBS_BOTH, - cox, - coy, - DX_VOL_TB, - DY_VOL_TB, - hWnd, - (HMENU)(idBase+idVolMTB), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - SendMessage(pFileInfo->hWndVolM_TB, TBM_SETRANGE, FALSE, MAKELONG(MINVOL_TB, MAXVOL_TB)); - SendMessage(pFileInfo->hWndVolM_TB, TBM_SETPOS, TRUE, dwVol); - pFileInfo->dwVol = MAXVOL_TB - dwVol; - - - - // Now the left volume. - if ((pFileInfo->hWndVolL_TB = CreateWindow( - TRACKBAR_CLASS, - "", - WS_CHILD | WS_VISIBLE |WS_DISABLED| TBS_VERT | TBS_BOTH, - cox+DX_VOL_TB+DX_VOLSPACING_TB, - coy, - DX_VOL_TB, - DY_VOL_TB, - hWnd, - (HMENU)(idBase+idVolLTB), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - SendMessage(pFileInfo->hWndVolL_TB, TBM_SETRANGE, FALSE, MAKELONG(MINVOL_TB, MAXVOL_TB)); - SendMessage(pFileInfo->hWndVolL_TB, TBM_SETPOS, TRUE, MAXVOL_TB); - - if ((pFileInfo->hWndVolL_TXT = CreateWindow( - "STATIC", - "L", - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox+DX_VOL_TB*3/2+DX_VOLSPACING_TB/2, - coy+DY_VOL_TB+DY_VOLSPACINGY, - DX_VOLUMECHAR, - Size.cy, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - - // And right volume. - if ((pFileInfo->hWndVolR_TB = CreateWindow( - TRACKBAR_CLASS, - "", - WS_CHILD | WS_VISIBLE | WS_DISABLED | TBS_VERT | TBS_BOTH, - cox+DX_VOL_TB*2+DX_VOLSPACING_TB*2, - coy, - DX_VOL_TB, - DY_VOL_TB, - hWnd, - (HMENU)(idBase+idVolRTB), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - SendMessage(pFileInfo->hWndVolR_TB, - TBM_SETRANGE, FALSE, MAKELONG(MINVOL_TB, MAXVOL_TB)); - SendMessage(pFileInfo->hWndVolR_TB, - TBM_SETPOS, TRUE, MAXVOL_TB); - - if ((pFileInfo->hWndVolR_TXT = CreateWindow( - "STATIC", - "R", - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - cox+DX_VOL_TB*5/2+DX_VOLSPACING_TB/2+2, - // +2 to look nice. - coy+DY_VOL_TB+DY_VOLSPACINGY, - DX_VOLUMECHAR, - Size.cy, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - - coy += DY_VOL_TB + DY_BEFOREFIRSTBUTTON; //Line under L & R - - if ((pFileInfo->hWndVol_EDGE = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - cox, - coy - (DY_BEFOREFIRSTBUTTON)/2, - DX_LINEEDGE, - DY_LINEEDGE, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - - - if (!GetTextExtentPoint32(hDC, szPlay, strlen(szPlay), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - - //Create Play Button - if ((pFileInfo->hWndPlay_BN = CreateWindow( - "BUTTON", - szPlay, - WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, - cox, - coy, - DX_BUTTONSPACING, - Size.cy + DY_BUTTONSPACING, - hWnd, - (HMENU)(idBase+idPlayBN), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - //coy += Size.cy + DY_BUTTONSPACING + DY_BETWEENBUTTONS; - - if (!GetTextExtentPoint32(hDC, szPlay, strlen(szPlay), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Make Remove button - if ((pFileInfo->hWndRemove_BN = CreateWindow( - "BUTTON", - szRemove, - WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, - cox + DX_BUTTONSPACING + DY_BETWEENBUTTONS, - coy, - DX_BUTTONSPACING, - Size.cy + DY_BUTTONSPACING, - hWnd, - (HMENU)(idBase+idRemoveBN), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - coy += Size.cy + DY_BUTTONSPACING+ DY_BETWEENBUTTONS; - - - //Set up Looped Checkbox - if (!GetTextExtentPoint32(hDC, szLooped, strlen(szLooped), &Size)) - { - nError = -1; - goto DONE_ROUTINE; - } - - //Create Looped Checkbox window - if ((pFileInfo->hWndLooped_BN = CreateWindow( - "BUTTON", - szLooped, - WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, - cox, - coy, - DX_LOOPED_TXT, - Size.cy + DY_TEXTSPACING -2, - hWnd, - (HMENU)(idBase+idLoopedBN), - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - - // Don't need the between buttons spacing - // because there are no more controls. - coy += Size.cy;// + DY_BUTTONSPACING; //+ DY_BETWEENBUTTONS; - - if ((pFileInfo->hWndWhole_EDGE = CreateWindow( - "STATIC", - "", - WS_CHILD | WS_VISIBLE | SS_ETCHEDFRAME, - coxOld-DX_FRAMEEDGE, - coyOld-DY_FRAMEEDGE, - DX_CONTROLSPACING-DX_FRAMEEDGEINNER, - coy - coyOld + DY_FRAMEEDGE*2, - hWnd, - (HMENU)0, - hInst, - NULL)) == NULL) - { - nError = -1; - goto DONE_ROUTINE; - } - - - SetAllText(pFileInfo); - UpdateLRVolume(pFileInfo); - - -DONE_ROUTINE: - if (hDC != NULL) - { - if (ReleaseDC(hWnd, hDC) == 0) - { - nError = -1; - goto DONE_ROUTINE; - } - } - - return(nError); - -} - -/* This will add to the linked list of FileInfo's. - The FileInfo's keep track of the - files loaded, and this is done in a linked list format - - Input: - pFileInfoHead - Top of linked list. - pFileInfo - Pointer to entry to add. - - Output: - 0 if successful, else the error code. - -*/ - -int AddToList( - FILEINFO *pFileInfoHead, - FILEINFO *pFileInfo - ) -{ - - pFileInfo->pNext = NULL; - pFileInfo->fPlaying = FALSE; - - while (pFileInfoHead->pNext != NULL) - { - pFileInfoHead = pFileInfoHead->pNext; - } - - pFileInfoHead->pNext = pFileInfo; - - return(0); - -} - -/* This routine will get the number of controls in the window. - Can be used to determine new size of window. - - Input: - pFileInfoHead - Header of linked list. - - Output: - # of controls. - -*/ - -int GetNumControls( FILEINFO *pFileInfoHead ) -{ - - int cT = 0; - - while (pFileInfoHead->pNext != NULL) - { - pFileInfoHead = pFileInfoHead->pNext; - cT++; - } - - return(cT); - -} - -/* This routine will free the whole linked list in pFileInfoFirst, - including all the - memory used by the wave file, waveformatex structure, etc. - -*/ -int FreeAllList( - HWND hWnd, - FILEINFO *pFileInfoFirst - ) -{ - - FILEINFO *pFileInfo, *pFileNext; - UINT cT; - - Assert(pFileInfoFirst != NULL); - pFileInfo = pFileInfoFirst->pNext; - - while (pFileInfo != NULL) - { - ReleaseDirectSoundBuffer(pFileInfo); - GlobalFreePtr(pFileInfo->pwfx); - GlobalFreePtr(pFileInfo->pbData); - pFileNext = pFileInfo->pNext; - GlobalFreePtr(pFileInfo); - pFileInfo = pFileNext; - } - - for (cT=0; cTpNext != NULL) - { - if (pFileInfoHead->pNext == pFileInfo) - { - Assert(pFileInfo->cox/DX_CONTROLSPACING < MAXCONTROLS); - rgfcoxAvail[pFileInfo->cox/DX_CONTROLSPACING] = FALSE; - - DestroyWindow(pFileInfo->hWndFileName_TXT); - DestroyWindow(pFileInfo->hWndFreq_TB); - DestroyWindow(pFileInfo->hWndFreq_TXT); - DestroyWindow(pFileInfo->hWndPan_TB); - DestroyWindow(pFileInfo->hWndPan_TXT); - DestroyWindow(pFileInfo->hWndVol_TXT); - DestroyWindow(pFileInfo->hWndVolL_TB); - DestroyWindow(pFileInfo->hWndVolR_TB); - DestroyWindow(pFileInfo->hWndVolM_TB); - DestroyWindow(pFileInfo->hWndLooped_BN); - DestroyWindow(pFileInfo->hWndPlay_BN); - DestroyWindow(pFileInfo->hWndRemove_BN); - DestroyWindow(pFileInfo->hWndFileName_EDGE); - DestroyWindow(pFileInfo->hWndLooped_EDGE); - DestroyWindow(pFileInfo->hWndFreq_EDGE); - DestroyWindow(pFileInfo->hWndPan_EDGE); - DestroyWindow(pFileInfo->hWndVol_EDGE); - DestroyWindow(pFileInfo->hWndWhole_EDGE); - DestroyWindow(pFileInfo->hWndVolL_TXT); - DestroyWindow(pFileInfo->hWndVolR_TXT); - #ifdef SHOWSTATUS - DestroyWindow(pFileInfo->hWndStatus_TXT); - DestroyWindow(pFileInfo->hWndStatus_EDGE); - DestroyWindow(pFileInfo->hWndPlayPosition_TXT); - DestroyWindow(pFileInfo->hWndPlayPosition_EDGE); - DestroyWindow(pFileInfo->hWndWritePosition_TXT); - DestroyWindow(pFileInfo->hWndWritePosition_EDGE); - #endif - - - - - GlobalFree(pFileInfoHead->pNext->pwfx); - GlobalFree(pFileInfoHead->pNext->pbData); - pFileNext = pFileInfoHead->pNext->pNext; - GlobalFreePtr(pFileInfoHead->pNext); - pFileInfoHead->pNext = pFileNext; - break; - } - pFileInfoHead = pFileInfoHead->pNext; - } - - return(0); -} - -/* This will pop up the open file dialog and allow the user to pick one file. - - Input: - hWnd - Handle of parent window. - pszFileName - String to store filename in, must be at least MAX_PATH long. - - - Output: - TRUE if a file was picked successfully, else FALSE (user didn't pick a file) - - */ -BOOL OpenFileDialog( - HWND hWnd, - LPSTR pszFileName, - int *nFileName, - LPBOOL lpfSticky - ) -{ - - BOOL fReturn, - fValid; - OPENFILENAME ofn; - - pszFileName[0] = 0; - - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hWnd; - ofn.hInstance = hInst; - ofn.lpstrFilter = "Wave Files\0*.wav\0All Files\0*.*\0\0"; - ofn.lpstrCustomFilter = NULL; - ofn.nMaxCustFilter = 0; - ofn.nFilterIndex = 1; - ofn.lpstrFile = pszFileName; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.lpstrInitialDir = gszCDStartPath; - ofn.lpstrTitle = "File Open"; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER - | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_HIDEREADONLY; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = "wav"; - ofn.lCustData = (LONG)lpfSticky; - ofn.lpfnHook = FileOpenCustomTemplateDlgProc; - ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEOPEN_NEST); - - fValid = FALSE; - do { - - if (fReturn = GetOpenFileName(&ofn)) - { - // Set the start path for the next time this dialog is opened - lstrcpy( gszCDStartPath, pszFileName ); - gszCDStartPath[ofn.nFileOffset] = '\0'; - - fValid = IsValidWave(pszFileName); - if (!fValid) - { - MessageBox(hWnd, "Wave files must be PCM format!", - "Invalid Wave File", MB_OK|MB_ICONSTOP); - } - else - *nFileName = ofn.nFileOffset; - } - else fValid = TRUE; // Force break out of loop. - - } while (!fValid); - - return(fReturn); - -} - -/* This function will determine if the filename passed - in is a valid wave for this - app, that is a PCM wave. - - Input: - pszFileName - FileName to check. - - Output: - FALSE if not a valid wave, TRUE if it is. - -*/ -BOOL IsValidWave( - LPSTR pszFileName - ) - -{ - BOOL fReturn = FALSE; - int nError = 0; - HMMIO hmmio; - MMCKINFO mmck; - WAVEFORMATEX *pwfx; - - if ((nError = WaveOpenFile(pszFileName, &hmmio, &pwfx, &mmck)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - if (pwfx->wFormatTag != WAVE_FORMAT_PCM) - { - goto ERROR_IN_ROUTINE; - } - - WaveCloseReadFile(&hmmio, &pwfx); - - fReturn = TRUE; - -ERROR_IN_ROUTINE: - return(fReturn); - -} - -BOOL UIMainWindowVSBHandler( - HWND hWnd, - WPARAM wParam, - LPARAM lParam - ) -{ - - FILEINFO *pFileInfo; - BOOL fReturn = FALSE; - - pFileInfo = FileInfoFirst.pNext; - - Assert(pFileInfo != NULL); - - while (pFileInfo != NULL) - { - - if ((HWND)lParam == pFileInfo->hWndVolM_TB) - { - pFileInfo->dwVol = MAXVOL_TB - - SendMessage(pFileInfo->hWndVolM_TB, TBM_GETPOS, 0, 0); - ChangeOutputVol(pFileInfo); - SetAllText(pFileInfo); - UpdateLRVolume(pFileInfo); - fReturn = TRUE; - } - - pFileInfo = pFileInfo->pNext; - - } - - return (fReturn); - -} - - -/* This routine will handle all the calls to the WM_HSCROLL - for the main window, that - is, all the horizontal scrollbar (and trackbar) messages. - - Input: - Standard parameters (minus the "message" parameter) - for a window callback, though - this is called from the window callback. - - Output: - FALSE if the message isn't processed, else TRUE if it is. - If FALSE, the - return procedure should call the default windows procedure. - - -*/ -BOOL UIMainWindowHSBHandler( - HWND hWnd, - WPARAM wParam, - LPARAM lParam - ) -{ - - FILEINFO *pFileInfo; - BOOL fReturn = FALSE; - - pFileInfo = FileInfoFirst.pNext; - - Assert(pFileInfo != NULL); - - while (pFileInfo != NULL) - { - - if ((HWND)lParam == pFileInfo->hWndFreq_TB) - { - pFileInfo->dwFreq = (SendMessage(pFileInfo->hWndFreq_TB, - TBM_GETPOS, 0, 0) * FREQFACTOR) - FREQADD; - ChangeOutputFreq(pFileInfo); - SetAllText(pFileInfo); - fReturn = TRUE; - } - - else if ((HWND)lParam == pFileInfo->hWndPan_TB) - { - pFileInfo->dwPan = SendMessage(pFileInfo->hWndPan_TB, - TBM_GETPOS, 0, 0); - ChangeOutputPan(pFileInfo); - SetAllText(pFileInfo); - UpdateLRVolume(pFileInfo); - fReturn = TRUE; - } - - pFileInfo = pFileInfo->pNext; - - } - - return (fReturn); - - - -} - -/* This routine will handle all the calls to the WM_COMMAND - for the main window. - - Input: - Standard parameters (minus the "message" parameter) - for a window callback, though - this is called from the window callback. - - Output: - FALSE if the message isn't processed, else TRUE if it is. - If FALSE, the - return procedure should call the default windows procedure. - - -*/ -BOOL UIMainWindowCMDHandler( - HWND hWnd, - WPARAM wParam, - LPARAM lParam - ) -{ - - BOOL fReturn = FALSE; - FILEINFO *pFileInfo; - FILEINFO *pFileInfoNext; - DWORD dwLooping; - - pFileInfo = FileInfoFirst.pNext; - while (pFileInfo != NULL) - { - - pFileInfoNext = pFileInfo->pNext; - - if ((HWND)lParam == pFileInfo->hWndLooped_BN) - { - pFileInfo->fLooped = SendMessage(pFileInfo->hWndLooped_BN, - BM_GETCHECK, 0, 0); - // If it is playing then reset the looping to be proper - if( pFileInfo->fPlaying ) { - if( pFileInfo->fLooped ) { - dwLooping = DSBPLAY_LOOPING; - } else { - dwLooping = 0; - } - pFileInfo->pDSB->lpVtbl->Play(pFileInfo->pDSB, - 0, 0, dwLooping ); - } - fReturn = TRUE; - } - else if ((HWND)lParam == pFileInfo->hWndPlay_BN) - { - if (pFileInfo->fPlaying) - { - if (StopDSound(hWnd, pFileInfo) == 0) - { - SendMessage((HWND)lParam, - WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szPlay); - -#ifdef SHOWSTATUS - UpdateStatus(pFileInfo, 0); -#endif - - fReturn = TRUE; - break; - } - - } - else - { - if (StartDSound(hWnd, pFileInfo) == 0) - { - SendMessage((HWND)lParam, - WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szStop); -#ifdef SHOWSTATUS - UpdateStatus(pFileInfo, DSBSTATUS_PLAYING); -#endif - - fReturn = TRUE; - break; - } - - } - fReturn = TRUE; - } - - else if ((HWND)lParam == pFileInfo->hWndRemove_BN) - { - ReleaseDirectSoundBuffer(pFileInfo); - RemoveFromList(pFileInfo, &FileInfoFirst); - UpdateMainStatus(); - - fReturn = TRUE; - } - - - pFileInfo = pFileInfoNext; - - } - - if (!fReturn) - { - - switch(wParam) - { - - case IDPD_FILE_EXIT: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - - case IDPD_FILE_OPEN: - PD_FileOpen(hWnd); - break; - - case IDPD_HELP_ABOUT: - DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), - hWnd, (DLGPROC)DLGHelpAbout); - break; - - case IDPD_OPTIONS_OUTPUTTYPE: - DialogBox(hInst, MAKEINTRESOURCE(IDD_OUTPUTBUFFERTYPE), - hWnd, (DLGPROC)DLGOutputBufferType); - break; - - case IDPD_CHECKLATENCY: - StopAllDSounds(hWnd, &FileInfoFirst); - // Now fake that we're on in each voice so the - //timer will update the - // strings in the window. - pFileInfo = FileInfoFirst.pNext; - while (pFileInfo != NULL) - { - pFileInfo->fPlaying = TRUE; - pFileInfo = pFileInfo->pNext; - } - - DialogBox(hInst, MAKEINTRESOURCE(IDD_CHECKLATENCY), - hWnd, (DLGPROC)DLGCheckLatency); - break; - - case IDPD_ENUMDRIVERS: - fEnumDrivers = !fEnumDrivers; - if( fEnumDrivers ) - { - MessageBox( hWnd, - "Drivers will not be enumerated until DSSHOW is run again.", - szAppName, MB_OK ); - } - break; - - default: - return(FALSE); - - } - } - - return(TRUE); - - -} - -/* This routine will handle the timer messages. - - Input: - Standard input. - - Output: - TRUE if processed message, otherwise FALSE - -*/ -BOOL UIMainWindowTimerHandler( - HWND hWnd, - WPARAM wParam, - LPARAM lParam - ) -{ - - FILEINFO *pFileInfo; - BOOL fReturn = FALSE; - DWORD dwStatus = 0; - - for (pFileInfo = FileInfoFirst.pNext; pFileInfo != NULL; pFileInfo = pFileInfo->pNext) - { - HRESULT hr; - - hr = IDirectSoundBuffer_GetStatus(pFileInfo->pDSB, &dwStatus); - if (DS_OK != hr) continue; - - if (dwStatus & DSBSTATUS_BUFFERLOST) { - LPBYTE pbData, pbData2; - DWORD dwLength, dwLength2; - - // - // Restore the buffer, rewrite data, and play - // - hr = IDirectSoundBuffer_Restore(pFileInfo->pDSB); - if (DS_OK == hr) { - - hr = IDirectSoundBuffer_Lock(pFileInfo->pDSB, 0, - pFileInfo->cbSize, - &pbData, &dwLength, - &pbData2, &dwLength2, - 0); - - if (DS_OK == hr) { - - Assert(pbData != NULL); - Assert(pFileInfo->pbData != NULL); - memcpy(pbData, pFileInfo->pbData, pFileInfo->cbSize); - - hr = IDirectSoundBuffer_Unlock(pFileInfo->pDSB, - pbData, dwLength, - NULL, 0); - - if (DS_OK == hr) { - - if (pFileInfo->fPlaying) { - if (pFileInfo->fLooped) { - IDirectSoundBuffer_Play( pFileInfo->pDSB, 0, 0, - DSBPLAY_LOOPING ); - } else { - IDirectSoundBuffer_Play( pFileInfo->pDSB, 0, 0, - 0 ); - } - } - - IDirectSoundBuffer_GetStatus(pFileInfo->pDSB, &dwStatus); - - } - } - } - } - -#ifdef SHOWSTATUS - UpdateStatus(pFileInfo, dwStatus); -#endif - - if (!(dwStatus & DSBSTATUS_BUFFERLOST)) - { - if ((pFileInfo->fPlaying) && (!(dwStatus & DSBSTATUS_PLAYING)) ) - { - if (StopDSound(hWnd, pFileInfo) == 0) - { - SendMessage(pFileInfo->hWndPlay_BN, - WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szPlay); - } - } - } - - pFileInfo->fLost = dwStatus & DSBSTATUS_BUFFERLOST; - - fReturn = TRUE; - } - - return (fReturn); - -} - - - -/* This routine will start a sound to be played. - - Input: - hWnd - Of parent window. - pFileInfo - Pointer to file to start, - which is loaded and the - data is filled in the structure, - such as pbData, - etc. - - Output: - 0 if successful, else the error code. - -*/ -int StartDSound( - HWND hWnd, - FILEINFO *pFileInfo - ) -{ - - HRESULT hr = 0; - DWORD dwLooped; - DWORD dwStatus = 0; - - // Already playing? - - // Start sound here.... - dwLooped = 0; - if (pFileInfo->fLooped) { - dwLooped = DSBPLAY_LOOPING; - } - - - if ((hr = pFileInfo->pDSB->lpVtbl->GetStatus(pFileInfo->pDSB, - &dwStatus)) == 0) - { - if ((dwStatus&DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) - { - // Don't bother playing, just restart - if ((hr = pFileInfo->pDSB->lpVtbl->SetCurrentPosition( - pFileInfo->pDSB, 0)) != 0) - { - MessageBox(hWnd, "Cannot set current position", - "Direct Sound Error", MB_OK); - } - } - // Yes gotos are bad but this is real life not school. - else goto PLAY_THE_THING; - } - - else - { -PLAY_THE_THING: - if ((hr = pFileInfo->pDSB->lpVtbl->Play(pFileInfo->pDSB, - 0, 0, dwLooped)) != 0) - { - MessageBox(hWnd, "Cannot start playing", - "Direct Sound Error", MB_OK); - } - else - pFileInfo->fPlaying = TRUE; - } - - return(hr); - - -} - -/* This routine will stop a sound which is playing. - - Input: - hWnd - Of parent window. - pFileInfo - Pointer to file to stop playing. - - Output: - 0 if successful, else the error code. - -*/ -int StopDSound( HWND hWnd, - FILEINFO *pFileInfo - ) - -{ - HRESULT hr = 0; - - if (!pFileInfo->fPlaying) - return(0); - - - // Stop sound here... - if ((hr = pFileInfo->pDSB->lpVtbl->Stop(pFileInfo->pDSB)) != 0) - { - MessageBox(hWnd, "Cannot stop sound", - "Direct Sound Error", MB_OK); - } - else - pFileInfo->fPlaying = FALSE; - - return(hr); - -} - -/* This routine will stop all the sounds which are playing. - - Input: - hWnd - Of parent window. - pFileInfo - Pointer to file to stop playing. - (i.e. the head) - - Output: - 0 if successful, else the error code. - -*/ -int StopAllDSounds( - HWND hWnd, - FILEINFO *pFileInfo - ) - -{ - - while (pFileInfo->pNext != NULL) - { - StopDSound(hWnd, pFileInfo->pNext); - pFileInfo = pFileInfo->pNext; - } - - return(0); - -} - - - -/* This routine will set the freq, vol and pan slider text - according to the value - passed in. - - Input: - pFileInfo - File pointer to set frequency for. - - The dwFreq in the pFileInfo structure must be set. - This also uses the window handle - in the pFileInfo structure. - - Output: - None. - -*/ -void SetAllText( - FILEINFO *pFileInfo - ) -{ - char szBufT[128]; - - sprintf(szBufT, "%s: %lu Hz ", - szFreq, pFileInfo->dwFreq); - SetWindowText(pFileInfo->hWndFreq_TXT, szBufT); - - // Change PAN val to show full range - sprintf(szBufT, "%s: %ld", szPan, - (((LONG)(pFileInfo->dwPan) + SHIFTPAN_TB) * MULTPAN_TB ) ); - SetWindowText(pFileInfo->hWndPan_TXT, szBufT); - - // Change VOLUME val to show full range - sprintf(szBufT, "%s: %ld", szVolume, - (((LONG)(pFileInfo->dwVol) + SHIFTVOL_TB) * MULTVOL_TB )); - SetWindowText(pFileInfo->hWndVol_TXT, szBufT); - - -} - -/* This routine will update the left and right - volume according to main volume - and pan. - - Input: - pFileInfo - Pointer to fileinfo to update. - - Output: - Nothing worth using. - - -*/ -void UpdateLRVolume( - FILEINFO *pFileInfo - ) -{ - - int volLeft, volRight; - - if (pFileInfo->dwPan < MIDPAN_TB) - { - volLeft = pFileInfo->dwVol; - volRight = (((int)pFileInfo->dwPan) - *(int)pFileInfo->dwVol)/((int)MIDPAN_TB); - } - else - { - volLeft = ((((int)pFileInfo->dwPan - MAXPAN_TB)*-1) - *(int)pFileInfo->dwVol)/((int)MIDPAN_TB); - volRight = pFileInfo->dwVol; - } - - - - SendMessage(pFileInfo->hWndVolL_TB, TBM_SETPOS, TRUE, MAXVOL_TB-volLeft); - SendMessage(pFileInfo->hWndVolR_TB, TBM_SETPOS, TRUE, MAXVOL_TB-volRight); - - - -} - -/* This will change the output panning position for a certain FILEINFO. - This is - done by sending messages to the direct sound driver - - Input: - pFileInfo - FileInfo to set. This must contain the - panning value to set. - - Output: - 0 if successful, else the error code. - -*/ -int ChangeOutputPan( - FILEINFO *pFileInfo - ) - -{ - - HRESULT hr = 0; - - - // Change PAN val since TB does not go full range - if ((hr = pFileInfo->pDSB->lpVtbl->SetPan(pFileInfo->pDSB, - (((pFileInfo->dwPan) + SHIFTPAN_TB) * MULTPAN_TB) )) != 0) - { - goto ERROR_DONE_ROUTINE; - } - -ERROR_DONE_ROUTINE: - return(hr); - -} - -/* This will change the output freq for a certain FILEINFO. This is - done by sending messages to the direct sound driver - - Input: - pFileInfo - FileInfo to set. This must contain the - freq value to set. - - Output: - 0 if successful, else the error code. - -*/ -int ChangeOutputFreq( - FILEINFO *pFileInfo - ) - -{ - - HRESULT hr = 0; - - - if ((hr = pFileInfo->pDSB->lpVtbl->SetFrequency(pFileInfo->pDSB, pFileInfo->dwFreq)) != 0) - { - goto ERROR_DONE_ROUTINE; - } - -ERROR_DONE_ROUTINE: - return(hr); - -} - - - -/* This will change the output vol for a certain FILEINFO. This is - done by sending messages to the direct sound driver - - Input: - pFileInfo - FileInfo to set. This must contain the - freq value to set. - - Output: - 0 if successful, else the error code. - -*/ -int ChangeOutputVol( - FILEINFO *pFileInfo - ) - -{ - - HRESULT hr = 0; - - - // Shift VOLUME val by 4 bits since TB does not go full range - if ((hr = pFileInfo->pDSB->lpVtbl->SetVolume(pFileInfo->pDSB, - (((pFileInfo->dwVol) + SHIFTVOL_TB) * MULTVOL_TB) )) != 0) - { - goto ERROR_DONE_ROUTINE; - } - -ERROR_DONE_ROUTINE: - return(hr); - -} - - -/* This is the dialog box handler for the check latency dialog box. - - Input: - Standard dialog box input. - - Output: - Standard dialog box output. - -*/ - -long FAR PASCAL DLGCheckLatency( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ) -{ - - static HWND hWndFiles_LB; - FILEINFO *pFileInfo = NULL; - int nSelected; - int cT; - - - switch(uMsg) - { - case WM_INITDIALOG: - hWndFiles_LB = GetDlgItem(hWnd, IDC_FILES_LB); - - pFileInfo = FileInfoFirst.pNext; - while (pFileInfo != NULL) - { - SendMessage(hWndFiles_LB, - LB_ADDSTRING, - 0, - (LPARAM)(pFileInfo->szFileName - + pFileInfo->nFileName)); - pFileInfo = pFileInfo->pNext; - } - - break; - - case WM_COMMAND: - switch(wParam) - { - case ID_DONE: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - - case ID_PLAY: - if ((nSelected = SendMessage(hWndFiles_LB, - LB_GETCURSEL, 0, 0)) - != LB_ERR) - { - for (cT=0, pFileInfo = FileInfoFirst.pNext; - pFileInfo != NULL; - pFileInfo = pFileInfo->pNext, cT++) - { - if (cT == nSelected) - { - StartDSound(hWnd, pFileInfo); - break; - } - } - - } - - break; - - case ID_STOP: - StopAllDSounds(hWnd, &FileInfoFirst); - break; - - default: - break; - - } - break; - - case WM_CLOSE: - StopAllDSounds(hWnd, &FileInfoFirst); - EndDialog(hWnd, 0); - break; - - default: - return(0); - break; - - } - - return(1); - -} - - -/* The help about dialog procedure. - - Input: - Standard windows dialog procedure. - - Output: - Standard windows dialog procedure. - -*/ -long FAR PASCAL DLGHelpAbout( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ) -{ - switch(uMsg) - { - case WM_INITDIALOG: - break; - - case WM_COMMAND: - switch(wParam) - { - case ID_OK: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - - default: - break; - - } - break; - - case WM_CLOSE: - EndDialog(hWnd, 0); - break; - - default: - return(0); - break; - - } - - return(1); - -} - - -/* The help about dialog procedure. - - Input: - Standard windows dialog procedure. - - Output: - Standard windows dialog procedure. - -*/ - -long FAR PASCAL DLGOutputBufferType( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ) -{ - - static HWND hWndFormats_LB = NULL; - int cT; - int nSelection; - - - switch(uMsg) - { - case WM_INITDIALOG: - // Get the windows we need. - hWndFormats_LB = GetDlgItem(hWnd, IDC_FORMATS); - - // Put the strings in the list box. - for (cT=0; cTpDSB->lpVtbl->GetFormat(pFileInfo->pDSB, - &wfx, sizeof(wfx), &dwSize)) != 0) - { - goto ERROR_IN_ROUTINE; - } - if( dwSize > sizeof( wfx ) ) { - nError = DSERR_GENERIC; - goto ERROR_IN_ROUTINE; - } - - - // Change wfx to an integer. - // Assume theres an error and check all parameters to - // see if its valid. - nError = LB_ERR; - dwWaveStyle = 0; - - if (wfx.wFormatTag != WAVE_FORMAT_PCM) - goto ERROR_IN_ROUTINE; - - // Check the channels - if (wfx.nChannels == 1); - else if (wfx.nChannels == 2) - dwWaveStyle |= 1; - else - goto ERROR_IN_ROUTINE; - - // Check the bits... - if (wfx.wBitsPerSample == 8); - else if (wfx.wBitsPerSample == 16) - dwWaveStyle |= 2; - else - goto ERROR_IN_ROUTINE; - - // Check the rate. - if (wfx.nSamplesPerSec == 8000); - else if (wfx.nSamplesPerSec == 11025) - dwWaveStyle |= 4; - else if (wfx.nSamplesPerSec == 22050) - dwWaveStyle |= 8; - else if (wfx.nSamplesPerSec == 44100) - dwWaveStyle |= 12; - else - goto ERROR_IN_ROUTINE; - - nError = (int)dwWaveStyle; - -ERROR_IN_ROUTINE: - return(nError); -} - - -/* This will convert an index (from a list box for instance) - to a format by passing - in the format to direct sound. - - Input: - hWnd - Handle to window. - pFileInfo - Pointer to current file info. - index - Index value to convert to a - waveformat structure. - - Output: - 0 if successful, else the error code. - -*/ -int IndexToFormat( - HWND hWnd, - FILEINFO *pFileInfo, - int index - ) - -{ - - int nError = 0; - - - pFileInfo->pwfx->wFormatTag = WAVE_FORMAT_PCM; - - pFileInfo->pwfx->nChannels = 2; // Assume stereo. - if ((index%2) == 0) - pFileInfo->pwfx->nChannels = 1; // Its mono. - - // Assume 16 bit - pFileInfo->pwfx->nBlockAlign = 2*pFileInfo->pwfx->nChannels; - pFileInfo->pwfx->wBitsPerSample = 16; - if ((index%4) < 2) { - // Its 8 bit. - pFileInfo->pwfx->nBlockAlign = 1*pFileInfo->pwfx->nChannels; - pFileInfo->pwfx->wBitsPerSample = 8; - } - - pFileInfo->pwfx->nSamplesPerSec = 44100; // Assume 44.1 kHz - if (index < 4) - pFileInfo->pwfx->nSamplesPerSec = 8000; - else if (index < 8) - pFileInfo->pwfx->nSamplesPerSec = 11025; - else if (index < 12) - pFileInfo->pwfx->nSamplesPerSec = 22050; - - - pFileInfo->pwfx->nAvgBytesPerSec = pFileInfo->pwfx->nSamplesPerSec * - pFileInfo->pwfx->nBlockAlign; - pFileInfo->pwfx->cbSize = 0; - - if ((nError = pFileInfo->pDSB->lpVtbl->SetFormat(pFileInfo->pDSB, - pFileInfo->pwfx)) != DS_OK) { - MessageBox(hWnd, "Cannot set format buffer", - "Direct Sound Error", MB_OK); - goto ERROR_DONE_ROUTINE; - - } - -ERROR_DONE_ROUTINE: - return(nError); - -} - - -/****************************************************************************/ -/* GetMediaStartPath() */ -/* */ -/* This helper function attempts to get the media directory for Direct3D, */ -/* which is where all the installed DX wave files go. If it can't find that */ -/* it settles for the media sub-directory of the Windows directory. */ -/****************************************************************************/ -void GetMediaStartPath( void ) - { - HKEY hReg; - DWORD cbStartPathLen; - - if( ERROR_SUCCESS != RegOpenKeyEx( HKEY_LOCAL_MACHINE, - gszRegKeyDirect3D, - 0, KEY_READ, &hReg )) - { - goto REG_OPEN_FAILED; - } - else - { - // Query the Registry for the path to the media directory - cbStartPathLen = sizeof( gszCDStartPath ); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, gszRegValueD3DPath, - NULL, NULL, - gszCDStartPath, &cbStartPathLen )) - { - goto REG_OPEN_FAILED; - } - RegCloseKey( hReg ); - hReg = NULL; - } - - return; - -REG_OPEN_FAILED: - // Start off by getting the Windows directory -- we're trying to build a - // file path like "C:\WINDOWS\MEDIA", but the WINDOWS directory could be - // named anything, so we must ask. - GetWindowsDirectory( gszCDStartPath, sizeof(gszCDStartPath)); - // If there's no trailing backslash, append one - if( lstrcmp( &gszCDStartPath[lstrlen(gszCDStartPath)], TEXT("\\") )) - lstrcat( gszCDStartPath, TEXT("\\")); - // Now add on the MEDIA part of the path - lstrcat( gszCDStartPath, TEXT("MEDIA")); - } - - -///////////////////////////////////////////////////////////////////////////// -// fGetToken() -// -// Parses the command-line string "in place" starting at pszStart. A ptr -// to the start of the next token and it's length will be the out parameters, -// or NULL and 0 if no token. Note that *ppszRet will NOT be NULL-terminated -// since the string is part of another string. That's what then length is for. -// -// Returns: TRUE if a token was retrieved, or FALSE if there was no token. -// -BOOL fGetToken( PSTR pszStart, PSTR *ppszRet, int *pcchRet ) - { - PSTR pszCur = pszStart; - PSTR pszTokStart; - - if( !pszStart || NULL == ppszRet || NULL == pcchRet ) - return FALSE; - - // Skip leading whitespace - while( *pszCur && (*pszCur == ' ' || *pszCur == '\t')) - pszCur++; - - *ppszRet = NULL; - *pcchRet = 0; - - if( *pszCur ) - { - pszTokStart = pszCur; - - while( *pszCur && *pszCur != ' ' && *pszCur != '\t' ) - pszCur++; - - *ppszRet = pszTokStart; - *pcchRet = (int)(pszCur - pszTokStart); - } - - if( *pcchRet != 0 ) - return TRUE; - else - return FALSE; - } - - -/////////////////////////////////////////////////////////////////////////// -// fMatchToken() -// -// Attempts to match the first cchLen characters of pszDatum to the -// string at pszString. The comparison is case-insensitive (this function -// is designed for command-line switch matching). -// -// Returns: TRUE if the first cchLen characters are a match, else FALSE. -// -BOOL fMatchToken( PSTR pszString, PSTR pszDatum, int cchLen ) - { - int i; - - for( i = 0; i < cchLen; i++ ) - { - if( CharLower( (LPTSTR)MAKELONG( pszString[i], 0 )) - != CharLower( (LPTSTR)MAKELONG( pszDatum[i], 0 ))) - return FALSE; - } - return TRUE; - } - - -//////////////////////////////////////////////////////////////////////////// -// ParseCommandLine() -// -// Given a command-line string without the module name, this function will -// parse the command line and takes action on whatever it finds there. -// -// Returns: TRUE if successful, or FALSE if there was an error. -// -BOOL ParseCommandLine(LPSTR lpszCmdLine) - { - PSTR pszCur,pszToken; - PSTR ppszFiles[MAXCONTROLS]; - BOOL fStartPlaying = FALSE, fStartLooping = FALSE; - int cchTokLen = 0, i, nFilesFound; - - pszCur = lpszCmdLine; - - // First get all the command line switches - while( fGetToken(pszCur, &pszToken, &cchTokLen) && - (pszToken[0] == '/' || pszToken[0] == '-' )) - { - pszCur = pszToken + cchTokLen; - pszToken++; - - if( fMatchToken( pszToken, "PLAY", 4 )) - { - fStartPlaying = TRUE; - } - else if( fMatchToken( pszToken, "LOOP", 4 )) - { - fStartLooping = TRUE; - } - else - { - // We don't recognize this mysterious switch, so eat it and move on - } - } - - // Anything left on the command-line will be treated as a filename and - // we'll attempt to open it after we've found them all - nFilesFound = 0; - while( fGetToken(pszCur, &pszToken, &cchTokLen) && nFilesFound < MAXCONTROLS ) - { - pszCur = pszToken + cchTokLen; - ppszFiles[nFilesFound] = GlobalAllocPtr( GPTR, (cchTokLen+1)*sizeof(char)); - // Copy the token out of the command-line string and into our buffer - CopyMemory( ppszFiles[nFilesFound], pszToken, cchTokLen*sizeof(char)); - // Append a NULL terminator to what we just copied (to be safe) - *(ppszFiles[nFilesFound] + cchTokLen) = 0; - nFilesFound++; - } - // This function will take the array of strings we've created and open - // each string as a file. It will obey the global fStartPlaying and - // fStartLooping flags we may have already set above - if( nFilesFound ) - BatchOpenFiles( ppszFiles, nFilesFound, fStartPlaying, fStartLooping ); - - // Free the space we allocated - for( i = 0; i < nFilesFound; i++ ) - { - GlobalFreePtr( ppszFiles[i] ); - ppszFiles[i] = NULL; - } - - // Returning TRUE means the caller should continue doing what they - // were doing: we succeeded. - return TRUE; - } - - -//////////////////////////////////////////////////////////////////////////// -// BatchOpenFiles() -// -// Takes an array of string pointers and tries to open each as a file to -// playback. If fPlay is TRUE, the files will be played as they are being -// opened. If fLoop is TRUE, they will also be set to loop. -// -// Returns: FALSE in the event of catastrophic failure, otherwise TRUE. -// -BOOL BatchOpenFiles( PSTR *ppszFiles, int nFiles, BOOL fPlay, BOOL fLoop ) - { - int i; - FILEINFO *pfi; - DWORD cSamples; - - // Cap the number of files we can load out of the given set if we'd load - // too many otherwise - if( GetNumControls(&FileInfoFirst) + nFiles > MAXCONTROLS ) - nFiles = MAXCONTROLS - GetNumControls(&FileInfoFirst); - - for( i = 0; i < nFiles; i++ ) - { - if(( pfi = GlobalAllocPtr(GPTR, sizeof(FILEINFO))) == NULL ) - goto BOF_Fail; - - ZeroMemory( pfi, sizeof(FILEINFO)); - strcpy( pfi->szFileName, ppszFiles[i] ); - - if( WaveLoadFile( ppszFiles[i], &pfi->cbSize, &cSamples, - &pfi->pwfx, &pfi->pbData ) != 0 ) - goto BOF_LoopError; - - GetNextControlCoords( &FileInfoFirst, &pfi->cox, &pfi->coy ); - if( NewDirectSoundBuffer(pfi) != 0) - goto BOF_LoopError; - Assert( pfi->pbData != NULL ); - - if( AddToList( &FileInfoFirst, pfi ) != 0 ) - goto BOF_LoopError; - - pfi->nFileName = 0; - - if( CreateControl( hWndMain, pfi, pfi->pwfx->nSamplesPerSec, - (MAXPAN_TB-MINPAN_TB)/2, MINVOL_TB ) != 0 ) - { - ReleaseDirectSoundBuffer(pfi); - RemoveFromList( pfi, &FileInfoFirst ); - // RemoveFromList will do all the cleanup - pfi = NULL; - goto BOF_LoopError; - } - ChangeOutputVol(pfi); - ChangeOutputFreq(pfi); - ChangeOutputPan(pfi); - - // LOOP is only obeyed if PLAY was also specified - if( fPlay ) - { - if( fLoop ) - { - pfi->fLooped = TRUE; - SendMessage( pfi->hWndLooped_BN, BM_SETCHECK, TRUE, 0L ); - } - SendMessage( hWndMain, WM_COMMAND, 0, (LPARAM)pfi->hWndPlay_BN ); - } - - // Avoid the in-loop error cleanup by using a continue statement here - // to jump back up to the top - continue; - - // Cleanup code in case we fail to open a particular file -- we should - // just ignore this one and continue because we might still be able to - // open other files - BOF_LoopError: - if( NULL != pfi ) - { - if( NULL != pfi->pwfx ) - { - GlobalFreePtr(pfi->pwfx); - pfi->pwfx = NULL; - } - if( NULL != pfi->pbData ) - { - GlobalFreePtr(pfi->pbData); - pfi->pbData = NULL; - } - - ReleaseDirectSoundBuffer(pfi); - GlobalFreePtr(pfi); - pfi = NULL; - } - } - - UpdateMainStatus(); - - return TRUE; - -BOF_Fail: - return FALSE; - } - - diff --git a/sdk/samples/dsshow/shell.h b/sdk/samples/dsshow/shell.h deleted file mode 100644 index d6f77cc..0000000 --- a/sdk/samples/dsshow/shell.h +++ /dev/null @@ -1,297 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: shell.h - * Content: DirectSound shell header - * - ***************************************************************************/ -#ifndef __SHELL_INCLUDED__ -#define __SHELL_INCLUDED__ -// If this is defined, then an extra text string under the filename will show -// if the file is stopped or playing. -#define SHOWSTATUS - -#define MAXCONTROLS 8 - -// For setting the ranges on the freq, vol, etc. -// dwFreq*FREQMUL+FREQADD = # to show on screen. - -#define FREQFACTOR (5) -#define FREQADD (0) -#define FREQPAGE (100) -#define PANPAGE (5) - -#define MINFREQ_TB 0 -#define MAXFREQ_TB 100000 -#define MINPAN_TB 0 -#define MIDPAN_TB 400 -#define MAXPAN_TB 800 -#define SHIFTPAN_TB (-400) -#define MULTPAN_TB (10L) -#define MINPAN_VAL (-400) -#define MIDPAN_VAL 0 -#define MAXPAN_VAL 400 -#define MINVOL_TB 0 -#define MAXVOL_TB 400 -#define SHIFTVOL_TB (-400) -#define MULTVOL_TB (10L) -#define MINVOL_VAL -400 -#define MAXVOL_VAL 0 - - -// Id code deltas -#define idFreqTB 1 -#define idPanTB 2 -#define idVolLTB 3 -#define idVolRTB 4 -#define idVolMTB 5 -#define idLoopedBN 6 -#define idPlayBN 7 -#define idRemoveBN 8 - - -// UI stuff. - - -#define DX_WIN_BORDER 30 -#define DY_WIN_BORDER 30 -#define DX_MINWINDOW 640 -#define DY_MINWINDOW 450 // Was 560 Must tweek to keep above the taskbar <= 450 - -#define DX_CONTROLSPACING 150 -#define DY_CONTROLSPACING 0 - -#define DX_LINEEDGE (DX_CONTROLSPACING - 20) -#define DY_LINEEDGE (1) - - -#define COX_STARTCONTROL (20) // Defines the left edge of the first file window -#define COY_STARTCONTROL (10) // Defines the upper edge of the first file window - -#define DX_TEXTSPACING 5 -#define DY_TEXTSPACING 10 - -#define DX_LOOPEDSPACING 0 //Relative horizontal offset of top four areas -#define DY_LOOPEDSPACING -6 //Space offset around lines - -#define DX_STATUSSPACING 0 - -#ifdef SHOWSTATUS -#define DY_STATUSSPACING 8 -#else -#define DY_STATUSSPACING 0 -#endif - - -#define DX_FREQSPACING 0 -#define DY_FREQSPACING 10 - -#define DY_PANSPACING 10 -#define DY_VOLSPACING 10 - -//Establish the Widths of various windows: -#define DX_FILENAME_TXT 120 //Filename window -#define DX_STATUS_TXT 120 //Status window -#define DX_FREQ_TXT 120 //Frequency window -#define DX_PAN_TXT 100 //Pan window -#define DX_VOL_TXT 100 //Volume window -#define DX_LOOPED_TXT 100 //Checkbox + 'Looped' window - -//Establish slider sizes: -#define DX_FREQ_TB 130 //Frequency slider width -#define DY_FREQ_TB 40 //Frequency slider height -#define DX_PAN_TB 130 //Pan slider width -#define DY_PAN_TB 40 //Pan slider height -#define DX_VOL_TB 40 //Master volume slider width -#define DY_VOL_TB 100 //Master volume slider height -#define DX_VOLSPACING_TB 5 //Distance between master volume and its label - -#define DX_VOLUMECHAR 15 -#define DY_VOLSPACINGY -5 //Distance between channel mixers and L & R labels - -#define DX_BUTTONSPACING 61 //Width of the Play and Remove buttons -#define DY_BUTTONSPACING 10 -#define DY_BEFOREFIRSTBUTTON 18 //Distance above and below Volume->buttons line -#define DY_BETWEENBUTTONS 5 //Vertical space between buttons - -#define DX_FRAMEEDGE 10 //Distance between leftmost control and the window edge -#define DY_FRAMEEDGE 10 //Distance between outermost contol and the window edge -#define DX_FRAMEEDGEINNER 4 //Distance between file windows - - -// To check for stopping of sounds, a timer is set...use this for the rate. -#define TIMERPERIOD 500 // In milliseconds - -// In Options/Output Type, there are strings to pick the format...Here are the number of them. -#define C_DROPDOWNPCMFORMATS 16 - -typedef struct _fileinfo - { - BYTE *pbData; // Pointer to actual data of file. - UINT cbSize; // Size of data. - WAVEFORMATEX *pwfx; // Pointer to waveformatex structure. - - DWORD dwFreq; // Frequency. - DWORD dwPan; // Panning info. - DWORD dwVol; // Total volume. - BOOL fLooped; // Looped? - - BOOL fPlaying; // Is this one playing? - BOOL fLost; // Is this one lost? - BOOL fHardware; // Is this a hardware buffer? - BOOL fSticky; // Is this a sticky buffer? - - int cox; // Coordinates of where the structure is - int coy; // printed. - - // HWND's needed. - HWND hWndFileName_TXT; // Filename text string. - HWND hWndFreq_TB; // Trackbar handle. - HWND hWndFreq_TXT; // Text string for freq. - HWND hWndPan_TB; // Trackbar handle. - HWND hWndPan_TXT; // Text string for pan. - HWND hWndVol_TXT; // Text string for volume. - HWND hWndVolL_TB; // Trackbar for volume left. - HWND hWndVolR_TB; // Trackbar for volume right. - HWND hWndVolM_TB; // Main volume. - HWND hWndLooped_BN; // Looped - HWND hWndPlay_BN; // Play - HWND hWndRemove_BN; // Remove. - - HWND hWndFileName_EDGE; // The line under filename. - HWND hWndLooped_EDGE; // The line under looped. - HWND hWndFreq_EDGE; // The line under freq. - HWND hWndPan_EDGE; // The line under pan. - HWND hWndVol_EDGE; // The line under volume. - HWND hWndWhole_EDGE; // The whole surrounding edge. - HWND hWndVolL_TXT; // For the L - HWND hWndVolR_TXT; // For the R - - #ifdef SHOWSTATUS - HWND hWndStatus_TXT; // For status. - HWND hWndStatus_EDGE; - HWND hWndPlayPosition_TXT; - HWND hWndPlayPosition_EDGE; - HWND hWndWritePosition_TXT; - HWND hWndWritePosition_EDGE; - #endif - - LPDIRECTSOUNDBUFFER pDSB; // Pointer to direct sound buffer. - - int nFileName; // Index to filename, not including dir. - char szFileName[MAX_PATH]; - struct _fileinfo *pNext; // Pointer to next file. - - } FILEINFO; - - -char szAppName[] = "Direct Sound Demo"; -char szMessage[] = "Direct Sound Demo"; - -char gszCDStartPath[MAX_PATH]; // The path to start the Open dialog in - -// Registry Key and Value names that allow us to retrive a path something like -// "C:\DXSDK\SDK\MEDIA", but matching the current install. -const TCHAR gszRegKeyDirect3D[] = TEXT("Software\\Microsoft\\Direct3D"); -const TCHAR gszRegValueD3DPath[] = TEXT("D3D Path"); - -HANDLE hInst; -HWND hWndMain = NULL; -DWORD dwTimer = 0; // Timer handle. -GUID guID; -BOOL fEnumDrivers = FALSE; - -/* This is the main head of the linked list, but its only used for the - pNext which will point to the first FILEINFO structure, or NULL if there - are no files loaded */ -FILEINFO FileInfoFirst; // Start of linked list. - -char szFreq[] = "Freq"; -char szPan[] = "Pan"; -char szVolume[] = "Volume"; -char szLooped[] = "Looped"; -char szPlay[] = "Play"; -char szStop[] = "Stop"; -char szRemove[] = "Close"; - -#ifdef SHOWSTATUS -char szFmtPlayPosition[] = "Play %d"; -char szFmtWritePosition[] = "Write %d"; -char szPlaying[] = "Playing"; -char szStopped[] = "Stopped"; -char szSticky[] = "Sticky"; -char szLost[] = "Lost"; -char szHW[] = "HW-"; -char szSW[] = "SW-"; -#endif - - -char *rgszTypes[C_DROPDOWNPCMFORMATS] = - { // Index - "8.000 kHz, 8-Bit, Mono", // 0 - "8.000 kHz, 8-Bit, Stereo", // 1 - "8.000 kHz, 16-Bit, Mono", // 2 - "8.000 kHz, 16-Bit, Stereo", // 3 - "11.025 kHz, 8-Bit, Mono", // 4 - "11.025 kHz, 8-Bit, Stereo", // 5 - "11.025 kHz, 16-Bit, Mono", // 6 - "11.025 kHz, 16-Bit, Stereo", // 7 - "22.050 kHz, 8-Bit, Mono", // 8 - "22.050 kHz, 8-Bit, Stereo", // 9 - "22.050 kHz, 16-Bit, Mono", // 10 - "22,050 kHz, 16-Bit, Stereo", // 11 - "44.100 kHz, 8-Bit, Mono", // 12 - "44.100 kHz, 8-Bit, Stereo", // 13 - "44.100 kHz, 16-Bit, Mono", // 14 - "44.100 kHz, 16-Bit, Stereo" // 15 - }; - -BOOL rgfcoxAvail[MAXCONTROLS]; - -LPDIRECTSOUND gpds = NULL; - - -long FAR PASCAL WndProc(HWND, unsigned, WPARAM, LPARAM); -long FAR PASCAL DLGHelpAbout(HWND, UINT, WPARAM, LPARAM); -long FAR PASCAL DLGOutputBufferType(HWND, UINT, WPARAM, LPARAM); -long FAR PASCAL DLGCheckLatency(HWND, UINT, WPARAM, LPARAM); -UINT CALLBACK FileOpenCustomTemplateDlgProc(HWND, UINT, WPARAM, LPARAM); - -BOOL ClassInit(HANDLE); -void PD_FileOpen(HWND); -BOOL OpenFileDialog(HWND, LPSTR, int *, LPBOOL); -BOOL IsValidWave(LPSTR); -void GetMediaStartPath(void); - -int CreateControl(HWND, FILEINFO *, DWORD, DWORD, DWORD); -void GetNextControlCoords(FILEINFO *, int *, int *); -int AddToList(FILEINFO *, FILEINFO *); -int FreeAllList(HWND, FILEINFO *); -int RemoveFromList(FILEINFO *, FILEINFO *); -int GetNumControls(FILEINFO *); -int StartDSound(HWND, FILEINFO *); -int StopDSound(HWND, FILEINFO *); -int StopAllDSounds(HWND, FILEINFO *); - -BOOL UIMainWindowVSBHandler(HWND, WPARAM, LPARAM); -BOOL UIMainWindowHSBHandler(HWND, WPARAM, LPARAM); -BOOL UIMainWindowCMDHandler(HWND, WPARAM, LPARAM); -BOOL UIMainWindowTimerHandler(HWND, WPARAM, LPARAM); -void SetAllText(FILEINFO *); -void UpdateLRVolume(FILEINFO *); - -void AppDestroy(HWND); -BOOL AppInit(HWND); -BOOL ParseCommandLine(PSTR); -BOOL BatchOpenFiles(PSTR *,int,BOOL,BOOL); - -int NewDirectSoundBuffer(FILEINFO *); -int ReleaseDirectSoundBuffer(FILEINFO *); -int ChangeOutputPan(FILEINFO *); -int ChangeOutputFreq(FILEINFO *); -int ChangeOutputVol(FILEINFO *); - -int FormatToIndex(HWND, FILEINFO *); -int IndexToFormat(HWND, FILEINFO *, int); -#endif diff --git a/sdk/samples/dsshow/wassert.c b/sdk/samples/dsshow/wassert.c deleted file mode 100644 index f7536d4..0000000 --- a/sdk/samples/dsshow/wassert.c +++ /dev/null @@ -1,44 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wassert.c - * Content: Windows assert handler - * You must externally define hWndMain and szAppName for this - * to work. - * - ***************************************************************************/ - -#include - -extern HWND hWndMain; -extern char szAppName[]; - -#include "wassert.h" - - -#ifdef ASSERT -void AssertFail(char szErr[], char szFileName[], int nLine, char szMessage[]) - { - char szT[256]; - - if (szMessage != NULL) - wsprintf(szT, "Assert(%s);\nFile %s, line %d. %s", szErr, szFileName, nLine, szMessage); - else - wsprintf(szT, "Assert(%s);\nFile %s, line %d.", szErr, szFileName, nLine); - switch (MessageBox(hWndMain, szT, szAppName, MB_ABORTRETRYIGNORE | MB_ICONSTOP | MB_APPLMODAL)) - { - case IDABORT: - SendMessage(hWndMain, WM_CLOSE, 0, 0); - case IDRETRY: - _asm int 3; - // Fall Through // - case IDIGNORE: - break; - - } // switch - } // AssertFail - - -#endif // ASSERT - diff --git a/sdk/samples/dsshow/wassert.h b/sdk/samples/dsshow/wassert.h deleted file mode 100644 index 4bccb58..0000000 --- a/sdk/samples/dsshow/wassert.h +++ /dev/null @@ -1,28 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wassert.h - * Content: assert header - * - ***************************************************************************/ -#ifndef __WASSERT_INCLUDED__ -#define __WASSERT_INCLUDED__ - -#ifdef _DEBUG -#define ASSERT // Enable the Assert() macro -#endif - -#ifdef ASSERT - -void AssertFail(char [], char [], int, char[]); -#define Assert(f) ((f) ? (void)NULL : (void)AssertFail(#f, __FILE__, __LINE__,NULL)) -#define AssertMessage(f, szMessage) ((f) ? (void)NULL : (void)AssertFail(#f, __FILE__, __LINE__, szMessage)) - -#else -#define Assert(f) (void)NULL // Macro that does nothing -#define AssertMessage(f, szMessage) (void)NULL - -#endif // ~ASSERT - -#endif diff --git a/sdk/samples/dsshow/wave.c b/sdk/samples/dsshow/wave.c deleted file mode 100644 index c62d977..0000000 --- a/sdk/samples/dsshow/wave.c +++ /dev/null @@ -1,895 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wave.c - * Content: Wave library routines. - * This file is used for loading/saving waves, and reading and - * writing waves in smaller blocks. - * Uses WaveOpenFile, WaveReadFile and WaveCloseReadFile for - * single block access to reading wave files. - * Uses WaveCreateFile, WaveWriteFile, WaveCloseWriteFile for - * single block access for writing wave files. - * Uses WaveLoadFile to load a whole wave file into memory. - * Uses WaveSaveFile to save a whole wave file into memory. - * - ***************************************************************************/ - -/* PROTOTYPES */ -#include -#include -#include "wave.h" -#include "wassert.h" -#include "windowsx.h" - - -/* ROUTINES */ -/* -------------------------------------------------------*/ - -/* This function will open a wave input file and prepare it for reading, - * so the data can be easily - * read with WaveReadFile. Returns 0 if successful, the error code if not. - * pszFileName - Input filename to load. - * phmmioIn - Pointer to handle which will be used - * for further mmio routines. - * ppwfxInfo - Ptr to ptr to WaveFormatEx structure - * with all info about the file. - * -*/ -int WaveOpenFile( - char *pszFileName, // (IN) - HMMIO *phmmioIn, // (OUT) - WAVEFORMATEX **ppwfxInfo, // (OUT) - MMCKINFO *pckInRIFF // (OUT) - ) -{ - HMMIO hmmioIn; - MMCKINFO ckIn; // chunk info. for general use. - PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in. - WORD cbExtraAlloc; // Extra bytes for waveformatex - int nError; // Return value. - - - // Initialization... - *ppwfxInfo = NULL; - nError = 0; - hmmioIn = NULL; - - if ((hmmioIn = mmioOpen(pszFileName, NULL, MMIO_ALLOCBUF | MMIO_READ)) == NULL) - { - nError = ER_CANNOTOPEN; - goto ERROR_READING_WAVE; - } - - if ((nError = (int)mmioDescend(hmmioIn, pckInRIFF, NULL, 0)) != 0) - { - goto ERROR_READING_WAVE; - } - - - if ((pckInRIFF->ckid != FOURCC_RIFF) || (pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E'))) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Search the input file for for the 'fmt ' chunk. */ - ckIn.ckid = mmioFOURCC('f', 'm', 't', ' '); - if ((nError = (int)mmioDescend(hmmioIn, &ckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - /* Expect the 'fmt' chunk to be at least as large as ; - * if there are extra parameters at the end, we'll ignore them */ - - if (ckIn.cksize < (long) sizeof(PCMWAVEFORMAT)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Read the 'fmt ' chunk into .*/ - if (mmioRead(hmmioIn, (HPSTR) &pcmWaveFormat, (long) sizeof(pcmWaveFormat)) != (long) sizeof(pcmWaveFormat)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - - // Ok, allocate the waveformatex, but if its not pcm - // format, read the next word, and thats how many extra - // bytes to allocate. - if (pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM) - cbExtraAlloc = 0; - - else - { - // Read in length of extra bytes. - if (mmioRead(hmmioIn, (LPSTR) &cbExtraAlloc, - (long) sizeof(cbExtraAlloc)) != (long) sizeof(cbExtraAlloc)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - } - - // Ok, now allocate that waveformatex structure. - if ((*ppwfxInfo = GlobalAlloc(GMEM_FIXED, sizeof(WAVEFORMATEX)+cbExtraAlloc)) == NULL) - { - nError = ER_MEM; - goto ERROR_READING_WAVE; - } - - // Copy the bytes from the pcm structure to the waveformatex structure - memcpy(*ppwfxInfo, &pcmWaveFormat, sizeof(pcmWaveFormat)); - (*ppwfxInfo)->cbSize = cbExtraAlloc; - - // Now, read those extra bytes into the structure, if cbExtraAlloc != 0. - if (cbExtraAlloc != 0) - { - if (mmioRead(hmmioIn, (LPSTR) (((BYTE*)&((*ppwfxInfo)->cbSize))+sizeof(cbExtraAlloc)), - (long) (cbExtraAlloc)) != (long) (cbExtraAlloc)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - } - - /* Ascend the input file out of the 'fmt ' chunk. */ - if ((nError = mmioAscend(hmmioIn, &ckIn, 0)) != 0) - { - goto ERROR_READING_WAVE; - - } - - - goto TEMPCLEANUP; - -ERROR_READING_WAVE: - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - -TEMPCLEANUP: - *phmmioIn = hmmioIn; - - return(nError); - -} - -/* This routine has to be called before WaveReadFile as it searchs for the chunk to descend into for - reading, that is, the 'data' chunk. For simplicity, this used to be in the open routine, but was - taken out and moved to a separate routine so there was more control on the chunks that are before - the data chunk, such as 'fact', etc... */ - -int WaveStartDataRead( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRIFF - ) -{ - int nError; - - nError = 0; - - // Do a nice little seek... - if ((nError = mmioSeek(*phmmioIn, pckInRIFF->dwDataOffset + sizeof(FOURCC), SEEK_SET)) == -1) - { - Assert(FALSE); - } - - nError = 0; - // Search the input file for for the 'data' chunk. - pckIn->ckid = mmioFOURCC('d', 'a', 't', 'a'); - if ((nError = mmioDescend(*phmmioIn, pckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - goto CLEANUP; - -ERROR_READING_WAVE: - -CLEANUP: - return(nError); -} - - -/* This will read wave data from the wave file. Makre sure we're descended into - the data chunk, else this will fail bigtime! - hmmioIn - Handle to mmio. - cbRead - # of bytes to read. - pbDest - Destination buffer to put bytes. - cbActualRead- # of bytes actually read. - - - -*/ - - -int WaveReadFile( - HMMIO hmmioIn, // IN - UINT cbRead, // IN - BYTE *pbDest, // IN - MMCKINFO *pckIn, // IN. - UINT *cbActualRead // OUT. - - ) -{ - - MMIOINFO mmioinfoIn; // current status of - int nError; - UINT cT, cbDataIn; - - nError = 0; - - if (nError = mmioGetInfo(hmmioIn, &mmioinfoIn, 0) != 0) - { - goto ERROR_CANNOT_READ; - } - - cbDataIn = cbRead; - if (cbDataIn > pckIn->cksize) - cbDataIn = pckIn->cksize; - - pckIn->cksize -= cbDataIn; - - for (cT = 0; cT < cbDataIn; cT++) - { - /* Copy the bytes from the io to the buffer. */ - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - if ((nError = mmioAdvance(hmmioIn, &mmioinfoIn, MMIO_READ)) != 0) - { - goto ERROR_CANNOT_READ; - } - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - nError = ER_CORRUPTWAVEFILE; - goto ERROR_CANNOT_READ; - } - } - - // Actual copy. - *((BYTE*)pbDest+cT) = *((BYTE*)mmioinfoIn.pchNext)++; - } - - if ((nError = mmioSetInfo(hmmioIn, &mmioinfoIn, 0)) != 0) - { - goto ERROR_CANNOT_READ; - } - - *cbActualRead = cbDataIn; - goto FINISHED_READING; - -ERROR_CANNOT_READ: - *cbActualRead = 0; - -FINISHED_READING: - return(nError); - -} - -/* This will close the wave file openned with WaveOpenFile. - phmmioIn - Pointer to the handle to input MMIO. - ppwfxSrc - Pointer to pointer to WaveFormatEx structure. - - Returns 0 if successful, non-zero if there was a warning. - -*/ -int WaveCloseReadFile( - HMMIO *phmmio, // IN - WAVEFORMATEX **ppwfxSrc // IN - ) -{ - - if (*ppwfxSrc != NULL) - { - GlobalFree(*ppwfxSrc); - *ppwfxSrc = NULL; - } - - if (*phmmio != NULL) - { - mmioClose(*phmmio, 0); - *phmmio = NULL; - } - - return(0); - -} - -/* This routine will create a wave file for writing. This will automatically overwrite any - existing file with the same name, so be careful and check before hand!!! - pszFileName - Pointer to filename to write. - phmmioOut - Pointer to HMMIO handle that is used for further writes - pwfxDest - Valid waveformatex destination structure. - pckOut - Pointer to be set with the MMCKINFO. - pckOutRIFF - Pointer to be set with the RIFF info. - -*/ -int WaveCreateFile( - char *pszFileName, // (IN) - HMMIO *phmmioOut, // (OUT) - WAVEFORMATEX *pwfxDest, // (IN) - MMCKINFO *pckOut, // (OUT) - MMCKINFO *pckOutRIFF // (OUT) - - ) -{ - - int nError; // Return value. - DWORD dwFactChunk; // Contains the actual fact chunk. Garbage until WaveCloseWriteFile. - MMCKINFO ckOut1; - - dwFactChunk = (DWORD)-1; - nError = 0; - - *phmmioOut = mmioOpen(pszFileName, NULL, - MMIO_ALLOCBUF | MMIO_READWRITE|MMIO_CREATE); - - if (*phmmioOut == NULL) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot save WAVE file - } - - /* Create the output file RIFF chunk of form type 'WAVE'. - */ - pckOutRIFF->fccType = mmioFOURCC('W', 'A', 'V', 'E'); - pckOutRIFF->cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, pckOutRIFF, MMIO_CREATERIFF)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - /* We are now descended into the 'RIFF' chunk we just created. - * Now create the 'fmt ' chunk. Since we know the size of this chunk, - * specify it in the MMCKINFO structure so MMIO doesn't have to seek - * back and set the chunk size after ascending from the chunk. - */ - pckOut->ckid = mmioFOURCC('f', 'm', 't', ' '); - pckOut->cksize = sizeof(PCMWAVEFORMAT); // we know the size of this ck. - if ((nError = mmioCreateChunk(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - /* Write the PCMWAVEFORMAT structure to the 'fmt ' chunk if its that type. */ - if (pwfxDest->wFormatTag == WAVE_FORMAT_PCM) - { - if (mmioWrite(*phmmioOut, (HPSTR) pwfxDest, sizeof(PCMWAVEFORMAT)) - != sizeof(PCMWAVEFORMAT)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - } - - else - { - // Write the variable length size. - if ((UINT)mmioWrite(*phmmioOut, (HPSTR) pwfxDest, sizeof(*pwfxDest)+pwfxDest->cbSize) - != (sizeof(*pwfxDest)+pwfxDest->cbSize)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - } - - /* Ascend out of the 'fmt ' chunk, back into the 'RIFF' chunk. - */ - if ((nError = mmioAscend(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - // Now create the fact chunk, not required for PCM but nice to have. This is filled - // in when the close routine is called. - ckOut1.ckid = mmioFOURCC('f', 'a', 'c', 't'); - ckOut1.cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, &ckOut1, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - if (mmioWrite(*phmmioOut, (HPSTR)&dwFactChunk, sizeof(dwFactChunk)) != sizeof(dwFactChunk)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; - } - - // Now ascend out of the fact chunk... - if ((nError = mmioAscend(*phmmioOut, &ckOut1, 0)) != 0) - { - nError = ER_CANNOTWRITE; // cannot write file, probably - goto ERROR_CANNOT_WRITE; - } - - - - goto DONE_CREATE; - -ERROR_CANNOT_WRITE: - // Maybe delete the half-written file? Ah forget it for now, its good to leave the - // file there for debugging... - -DONE_CREATE: - return(nError); - -} - -/* This routine has to be called before any data is written to the wave output file, via wavewritefile. This - sets up the data to write, and creates the data chunk. -*/ - -int WaveStartDataWrite( - HMMIO *phmmioOut, // (IN) - MMCKINFO *pckOut, // (IN) - MMIOINFO *pmmioinfoOut // (OUT) - ) -{ - - int nError; - - nError = 0; - /* Create the 'data' chunk that holds the waveform samples. */ - pckOut->ckid = mmioFOURCC('d', 'a', 't', 'a'); - pckOut->cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - if ((nError = mmioGetInfo(*phmmioOut, pmmioinfoOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - - goto CLEANUP; -ERROR_CANNOT_WRITE: - -CLEANUP: - return(nError); -} - -/* This routine will write out data to a wave file. - hmmioOut - Handle to hmmioOut filled by WaveCreateFile - cbWrite - # of bytes to write out. - pbSrc - Pointer to source. - pckOut - pointer to ckOut filled by WaveCreateFile - cbActualWrite - # of actual bytes written. - pmmioinfoOut - Pointer to mmioinfoOut filled by WaveCreateFile. - - Returns 0 if successful, else the error code. - - */ - - -int WaveWriteFile( - HMMIO hmmioOut, // (IN) - UINT cbWrite, // (IN) - BYTE *pbSrc, // (IN) - MMCKINFO *pckOut, // (IN) - UINT *cbActualWrite, // (OUT) - MMIOINFO *pmmioinfoOut // (IN) - ) -{ - - - int nError; - UINT cT; - - nError = 0; - - *cbActualWrite = 0; - - for (cT=0; cT < cbWrite; cT++) - { - if (pmmioinfoOut->pchNext == pmmioinfoOut->pchEndWrite) - { - pmmioinfoOut->dwFlags |= MMIO_DIRTY; - if ((nError = mmioAdvance(hmmioOut, pmmioinfoOut, MMIO_WRITE)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - } - *((BYTE*)pmmioinfoOut->pchNext)++ = *((BYTE*)pbSrc+cT); - (*cbActualWrite)++; - } - - -ERROR_CANNOT_WRITE: - // What to do here? Well, for now, nothing, just return that error. (maybe delete the - // file later? - - return(nError); - -} - - - -/* This routine will close a wave file used for writing. Returns 0 if successful, else - the error code. - phmmioOut - Pointer to mmio handle for saving. - pckOut - Pointer to the MMCKINFO for saving. - pckOutRiff - Pointer to the riff MMCKINFO for saving. - pmmioinfoOut- Pointer to mmioinfo for saving. - cSamples - # of samples saved, for the fact chunk. For PCM, this isn't used but - will be written anyway, so this can be zero as long as programs ignore - this field when they load PCM formats. - - - -*/ -int WaveCloseWriteFile( - HMMIO *phmmioOut, // (IN) - MMCKINFO *pckOut, // (IN) - MMCKINFO *pckOutRIFF, // (IN) - MMIOINFO *pmmioinfoOut, // (IN) - DWORD cSamples // (IN) - ) -{ - - int nError; - - nError = 0; - - if (*phmmioOut == NULL) - return(0); - - pmmioinfoOut->dwFlags |= MMIO_DIRTY; - if ((nError = mmioSetInfo(*phmmioOut, pmmioinfoOut, 0)) != 0) - { - // cannot flush, probably... - goto ERROR_CANNOT_WRITE; - } - - /* Ascend the output file out of the 'data' chunk -- this will cause - * the chunk size of the 'data' chunk to be written. - */ - if ((nError = mmioAscend(*phmmioOut, pckOut, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - // Do this here instead... - if ((nError = mmioAscend(*phmmioOut, pckOutRIFF, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - nError = mmioSeek(*phmmioOut, 0, SEEK_SET); - if ((nError = (int)mmioDescend(*phmmioOut, pckOutRIFF, NULL, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - - nError = 0; - pckOut->ckid = mmioFOURCC('f', 'a', 'c', 't'); - if ((nError = mmioDescend(*phmmioOut, pckOut, pckOutRIFF, MMIO_FINDCHUNK)) == 0) - { - // If it didn't fail, write the fact chunk out, if it failed, not critical, just - // assert (below). - nError = mmioWrite(*phmmioOut, (HPSTR)&cSamples, sizeof(DWORD)); - nError = mmioAscend(*phmmioOut, pckOut, 0); - nError = 0; - } - else - { - nError = 0; - Assert(FALSE); - } - -// CANTWRITEFACT: - /* Ascend the output file out of the 'RIFF' chunk -- this will cause - * the chunk size of the 'RIFF' chunk to be written. - */ - if ((nError = mmioAscend(*phmmioOut, pckOutRIFF, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - -ERROR_CANNOT_WRITE: - if (*phmmioOut != NULL) - { - mmioClose(*phmmioOut, 0); - *phmmioOut = NULL; - } - - return(nError); - -} - -/* This routine will copy from a source wave file to a destination wave file all those useless chunks - (well, the ones useless to conversions, etc --> apparently people use them!). The source will be - seeked to the begining, but the destination has to be at a current pointer to put the new chunks. - This will also seek back to the start of the wave riff header at the end of the routine. - - phmmioIn - Pointer to input mmio file handle. - pckIn - Pointer to a nice ckIn to use. - pckInRiff - Pointer to the main riff. - phmmioOut - Pointer to output mmio file handle. - pckOut - Pointer to nice ckOut to use. - pckOutRiff - Pointer to the main riff. - - - Returns 0 if successful, else the error code. If this routine fails, it still attemps to seek back to - the start of the wave riff header, though this too could be unsuccessful. -*/ - -int WaveCopyUselessChunks( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRiff, - HMMIO *phmmioOut, - MMCKINFO *pckOut, - MMCKINFO *pckOutRiff) -{ - - int nError; - - nError = 0; - // First seek to the stinking start of the file, not including the riff header... - if ((nError = mmioSeek(*phmmioIn, pckInRiff->dwDataOffset + sizeof(FOURCC), SEEK_SET)) == -1) - { - nError = ER_CANNOTREAD; - goto ERROR_IN_PROC; - } - - nError = 0; - - while (mmioDescend(*phmmioIn, pckIn, pckInRiff, 0) == 0) - { - - // quickly check for corrupt RIFF file--don't ascend past end! - if ((pckIn->dwDataOffset + pckIn->cksize) > (pckInRiff->dwDataOffset + pckInRiff->cksize)) - goto ERROR_IN_PROC; - - switch (pckIn->ckid) - { - // explicitly skip these... - case mmioFOURCC('f', 'm', 't', ' '): - break; - - case mmioFOURCC('d', 'a', 't', 'a'): - break; - - case mmioFOURCC('f', 'a', 'c', 't'): - break; - - case mmioFOURCC('J', 'U', 'N', 'K'): - break; - - case mmioFOURCC('P', 'A', 'D', ' '): - break; - - case mmioFOURCC('c', 'u', 'e', ' '): - break; - - // copy chunks that are OK to copy - case mmioFOURCC('p', 'l', 's', 't'): - // although without the 'cue' chunk, it doesn't make much sense - riffCopyChunk(*phmmioIn, *phmmioOut, pckIn); - break; - - case mmioFOURCC('D', 'I', 'S', 'P'): - riffCopyChunk(*phmmioIn, *phmmioOut, pckIn); - break; - - - // don't copy unknown chunks - default: - break; - } - - - // step up to prepare for next chunk.. - mmioAscend(*phmmioIn, pckIn, 0); - } - -ERROR_IN_PROC: - { - int nErrorT; - // Seek back to riff header - nErrorT = mmioSeek(*phmmioIn, pckInRiff->dwDataOffset + sizeof(FOURCC), SEEK_SET); - } - - return(nError); -} - -/** BOOL RIFFAPI riffCopyChunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck) - * - * DESCRIPTION: - * - * - * ARGUMENTS: - * (LPWAVECONVCB lpwc, LPMMCKINFO lpck) - * - * RETURN (BOOL NEAR PASCAL): - * - * - * NOTES: - * - ** */ - -BOOL riffCopyChunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck) -{ - MMCKINFO ck; - HPSTR hpBuf; - - // - // - // - hpBuf = (HPSTR)GlobalAllocPtr(GHND, lpck->cksize); - if (!hpBuf) - return (FALSE); - - ck.ckid = lpck->ckid; - ck.cksize = lpck->cksize; - if (mmioCreateChunk(hmmioDst, &ck, 0)) - goto rscc_Error; - - if (mmioRead(hmmioSrc, hpBuf, lpck->cksize) != (LONG)lpck->cksize) - goto rscc_Error; - - if (mmioWrite(hmmioDst, hpBuf, lpck->cksize) != (LONG)lpck->cksize) - goto rscc_Error; - - if (mmioAscend(hmmioDst, &ck, 0)) - goto rscc_Error; - - if (hpBuf) - GlobalFreePtr(hpBuf); - - return (TRUE); - -rscc_Error: - - if (hpBuf) - GlobalFreePtr(hpBuf); - - return (FALSE); -} /* RIFFSupCopyChunk() */ - - - -/* This routine loads a full wave file into memory. Be careful, wave files can get - pretty big these days :). - szFileName - sz Filename - cbSize - Size of loaded wave (returned) - cSamples - # of samples loaded. - ppwfxInfo - Pointer to pointer to waveformatex structure. The wfx structure - IS ALLOCATED by this routine! Make sure to free it! - ppbData - Pointer to a byte pointer (globalalloc) which is allocated by this - routine. Make sure to free it! - - Returns 0 if successful, else the error code. -*/ - -int WaveLoadFile( - char *pszFileName, // (IN) - UINT *cbSize, // (OUT) - DWORD *pcSamples, // (OUT) - WAVEFORMATEX **ppwfxInfo, // (OUT) - BYTE **ppbData // (OUT) - ) -{ - - HMMIO hmmioIn; - MMCKINFO ckInRiff; - MMCKINFO ckIn; - int nError; - UINT cbActualRead; - - *ppbData = NULL; - *ppwfxInfo = NULL; - *cbSize = 0; - - if ((nError = WaveOpenFile(pszFileName, &hmmioIn, ppwfxInfo, &ckInRiff)) != 0) - { - goto ERROR_LOADING; - } - - if ((nError = WaveStartDataRead(&hmmioIn, &ckIn, &ckInRiff)) != 0) - { - goto ERROR_LOADING; - } - - // Ok, size of wave data is in ckIn, allocate that buffer. - if ((*ppbData = (BYTE *)GlobalAlloc(GMEM_FIXED, ckIn.cksize)) == NULL) - { - nError = ER_MEM; - goto ERROR_LOADING; - } - - if ((nError = WaveReadFile(hmmioIn, ckIn.cksize, *ppbData, &ckIn, &cbActualRead)) != 0) - { - goto ERROR_LOADING; - } - - *cbSize = cbActualRead; - goto DONE_LOADING; - -ERROR_LOADING: - if (*ppbData != NULL) - { - GlobalFree(*ppbData); - *ppbData = NULL; - } - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - -DONE_LOADING: - // Close the wave file. - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - - return(nError); - -} - -/* This routine saves a wave file in currently in memory. - pszFileName - FileName to save to. Automatically overwritten, be careful! - cbSize - Size in bytes to write. - cSamples - # of samples to write, used to make the fact chunk. (if !PCM) - pwfxDest - Pointer to waveformatex structure. - pbData - Pointer to the data. -*/ - -int WaveSaveFile( - char *pszFileName, // (IN) - UINT cbSize, // (IN) - DWORD cSamples, // (IN) - WAVEFORMATEX *pwfxDest, // (IN) - BYTE *pbData // (IN) - ) -{ - - HMMIO hmmioOut; - MMCKINFO ckOut; - MMCKINFO ckOutRIFF; - MMIOINFO mmioinfoOut; - UINT cbActualWrite; - int nError; - - if ((nError = WaveCreateFile(pszFileName, &hmmioOut, pwfxDest, &ckOut, &ckOutRIFF)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveStartDataWrite(&hmmioOut, &ckOut, &mmioinfoOut)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveWriteFile(hmmioOut, cbSize, pbData, &ckOut, &cbActualWrite, &mmioinfoOut)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveCloseWriteFile(&hmmioOut, &ckOut, &ckOutRIFF, &mmioinfoOut, cSamples)) != 0) - { - goto ERROR_SAVING; - } - -ERROR_SAVING: - - return(nError); - -} diff --git a/sdk/samples/dsshow/wave.h b/sdk/samples/dsshow/wave.h deleted file mode 100644 index 3e78e11..0000000 --- a/sdk/samples/dsshow/wave.h +++ /dev/null @@ -1,56 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wave.h - * Content: wave header - * - ***************************************************************************/ -#ifndef __WAVE_INCLUDED__ -#define __WAVE_INCLUDED__ -#include "windows.h" - -#define WAVEVERSION 1 - -#ifndef ER_MEM -#define ER_MEM 0xe000 -#endif - -#ifndef ER_CANNOTOPEN -#define ER_CANNOTOPEN 0xe100 -#endif - -#ifndef ER_NOTWAVEFILE -#define ER_NOTWAVEFILE 0xe101 -#endif - -#ifndef ER_CANNOTREAD -#define ER_CANNOTREAD 0xe102 -#endif - -#ifndef ER_CORRUPTWAVEFILE -#define ER_CORRUPTWAVEFILE 0xe103 -#endif - -#ifndef ER_CANNOTWRITE -#define ER_CANNOTWRITE 0xe104 -#endif - - - -int WaveOpenFile(char *, HMMIO *, WAVEFORMATEX **, MMCKINFO *); -int WaveStartDataRead(HMMIO *, MMCKINFO *, MMCKINFO *); -int WaveReadFile(HMMIO, UINT, BYTE *, MMCKINFO *, UINT *); -int WaveCloseReadFile(HMMIO *, WAVEFORMATEX **); - -int WaveCreateFile(char *, HMMIO *, WAVEFORMATEX *, MMCKINFO *, MMCKINFO *); -int WaveStartDataWrite(HMMIO *, MMCKINFO *, MMIOINFO *); -int WaveWriteFile(HMMIO, UINT, BYTE *, MMCKINFO *, UINT *, MMIOINFO *); -int WaveCloseWriteFile(HMMIO *, MMCKINFO *, MMCKINFO *, MMIOINFO *, DWORD); - -int WaveLoadFile(char *, UINT *, DWORD *, WAVEFORMATEX **, BYTE **); -int WaveSaveFile(char *, UINT, DWORD, WAVEFORMATEX *, BYTE *); - -int WaveCopyUselessChunks(HMMIO *, MMCKINFO *, MMCKINFO *, HMMIO *, MMCKINFO *, MMCKINFO *); -BOOL riffCopyChunk(HMMIO, HMMIO, const LPMMCKINFO); -#endif diff --git a/sdk/samples/dsshow3d/dblist.cpp b/sdk/samples/dsshow3d/dblist.cpp deleted file mode 100644 index aea717f..0000000 --- a/sdk/samples/dsshow3d/dblist.cpp +++ /dev/null @@ -1,234 +0,0 @@ -#include -#include "debug.h" - -template -DbLinkedList::DbLinkedList() -{ - m_pTail = m_pHead = m_pCurrent = NULL; -} - - -template -DbLinkedList::DbLinkedList( T emptyElt ) -{ - m_pTail = m_pHead = m_pCurrent = NULL; - m_emptyT = emptyElt; -} - - -template -DbLinkedList::~DbLinkedList() -{ - Clear(); -} - - -template -void DbLinkedList::Clear( void ) -{ - DblNode *pTemp; - - while( m_nElementCount ) - { - pTemp = m_pHead->pNext; - delete m_pHead; - m_pHead = pTemp; - m_nElementCount--; - } - - m_pHead = m_pTail = m_pCurrent = NULL; -} - - -template -void DbLinkedList::Remove( T val ) -{ - DblNode *pTemp = m_pHead; - - while( pTemp ) - { - if( pTemp->value == val ) - { - if( pTemp->pNext ) - pTemp->pNext->pPrev = pTemp->pPrev; - if( pTemp->pPrev ) - pTemp->pPrev->pNext = pTemp->pNext; - if( m_pHead == pTemp ) - m_pHead = pTemp->pNext; - if( m_pTail == pTemp ) - m_pTail = pTemp->pPrev; - - delete pTemp; - - m_nElementCount--; - pTemp = NULL; - return; - } - - pTemp = pTemp->pNext; - } -} - -template -void DbLinkedList::RemoveCurrent() -{ - if( m_pCurrent ) - { - ASSERT( m_nElementCount > 0 ); - - if( m_pCurrent->pNext ) - m_pCurrent->pNext->pPrev = m_pCurrent->pPrev; - if( m_pCurrent->pPrev ) - m_pCurrent->pPrev->pNext = m_pCurrent->pNext; - if( m_pHead == m_pCurrent ) - m_pHead = m_pCurrent->pNext; - if( m_pTail == m_pCurrent ) - m_pTail = m_pCurrent->pPrev; - - delete m_pCurrent; - - m_nElementCount--; - m_pCurrent = NULL; - } -} - -template -T DbLinkedList::GetCurrent() -{ - if( m_pCurrent ) - { - ASSERT( m_nElementCount > 0 ); - - return m_pCurrent->value; - } - return m_emptyT; -} - -// TRUE == success, FALSE == failure -template -BOOL DbLinkedList::InsertAfterCurrent( T val ) -{ - DbNode *pTemp = new DbNode; - - if( NULL == pTemp ) - return FALSE; - - if( NULL == m_pCurrent ) - { - AssertValid(); - if( NULL != m_pHead ) - { - pTemp->value = val; - pTemp->pPrev = m_pHead; - pTemp->pNext = m_pHead->pNext; - if( m_pHead->pNext ) - m_pHead->pNext->pPrev = pTemp; - if( m_pTail == m_pHead ) - m_pTail = pTemp; - } - } else { - pTemp->value = val; - pTemp->pPrev = m_pCurrent; - pTemp->pNext = m_pCurrent->pNext; - if( m_pCurrent->pNext ) - m_pCurrent->pNext->pPrev = pTemp; - // If we were pointing at the tail, we are no longer pointing - // at it because we put a new element after the current one. - if( m_pTail == m_pCurrent ) - m_pTail = pTemp; - } - - return TRUE; -} - - -// TRUE == success, FALSE == failure -template -BOOL DbLinkedList::InsertBeforeCurrent( T val ) -{ - DbNode *pTemp = new DbNode; - - if( NULL == pTemp ) - return FALSE; - - if( NULL == m_pCurrent ) - { - AssertValid(); - if( NULL != m_pHead ) - { - pTemp->value = val; - pTemp->pPrev = m_pHead; - pTemp->pNext = m_pHead->pNext; - if( m_pHead->pNext ) - m_pHead->pNext->pPrev = pTemp; - if( m_pTail == m_pHead ) - m_pTail = pTemp; - } - } else { - pTemp->value = val; - pTemp->pPrev = m_pCurrent; - pTemp->pNext = m_pCurrent->pNext; - if( m_pCurrent->pNext ) - m_pCurrent->pNext->pPrev = pTemp; - // If we were pointing at the tail, we are no longer pointing - // at it because we put a new element after the current one. - if( m_pTail == m_pCurrent ) - m_pTail = pTemp; - } - - return TRUE; -} - - -template -void DbLinkedList::Append( T val ) -{ - DblNode *pNode = new DblNode; - - if( NULL == pNode ) - return; - - AssertValid(); - - pNode->value = val; - pNode->pNext = NULL; - pNode->pPrev = m_pTail; - - if( m_pTail ) - m_pTail->pNext = pNode; - if( !m_pHead ) - m_pHead = pNode; - m_pTail = pNode; - m_nElementCount++; - - // If there were no elements in the list, the m_pCurrent will be NULL - if( NULL == m_pCurrent ) - { - ASSERT( m_nElementCount == 1 ); - m_pCurrent = m_pHead; - } -} - - -// Do some assertions that determine whether or not this object is in a valid -// state. If it's not, one of these will fire. -template -void DbLinkedList::AssertValid( void ) -{ - if( m_nElementCount ) - { - // If there are elements, then both these pointers should point - // at a legitimate DbNode object, or the list is corrupted - ASSERT( NULL != m_pHead ); - ASSERT( NULL != m_pTail ); - ASSERT( NULL != m_pCurrent ); - } - else - { - ASSERT( NULL == m_pHead ); - ASSERT( NULL == m_pTail ); - ASSERT( NULL == m_pCurrent ); - } -} - - diff --git a/sdk/samples/dsshow3d/dblist.h b/sdk/samples/dsshow3d/dblist.h deleted file mode 100644 index 7ec574b..0000000 --- a/sdk/samples/dsshow3d/dblist.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef __DBLIST_H__ -#define __DBLIST_H__ - -#include "debug.h" - -#ifndef __cplusplus -#error DBList.h included from a C file! -#endif - -template -class DblNode -{ -friend class DbLinkedList; - -private: - class DblNode *pNext; - class DblNode *pPrev; - - A value; -}; - -template -class DbLinkedList -{ -private: - -public: - DbLinkedList(); - DbLinkedList( T emptyElt ); - ~DbLinkedList(); - - inline void SetEmpty( T emptyElt ) { m_emptyT = emptyElt; } - - inline BOOL IsAtTail() { ASSERT( NULL != m_pCurrent ); - return (m_pCurrent->pNext == NULL); } - - void Clear( void ); - void RemoveCurrent(); - void Remove( T ); - BOOL InsertAfterCurrent( T val ); - BOOL InsertBeforeCurrent( T val ); - T GetCurrent(); - void Append( T ); - - inline void SetAtHead() { m_pCurrent = m_pHead; } - inline void SetAtTail() { m_pCurrent = m_pTail; } - - void AssertValid(); - - inline int GetElementCount( void ) { return m_nElementCount; } - - DbLinkedList &operator++() - { if( m_pCurrent && m_pCurrent->pNext ) m_pCurrent = m_pCurrent->pNext; return *this; } - DbLinkedList &operator++( int ) - { if( m_pCurrent && m_pCurrent->pNext ) m_pCurrent = m_pCurrent->pNext; return *this; } - DbLinkedList &operator--() - { if( m_pCurrent && m_pCurrent->pPrev ) m_pCurrent = m_pCurrent->pPrev; return *this; } - DbLinkedList &operator--( int ) - { if( m_pCurrent && m_pCurrent->pPrev ) m_pCurrent = m_pCurrent->pPrev; return *this; } - - -protected: - DblNode *m_pHead; - DblNode *m_pTail; - DblNode *m_pCurrent; - - int m_nElementCount; - T m_emptyT; -}; - - -// Because of the way templates work, we must include the code from the -// header file. -#include "DbList.cpp" - - -#endif - diff --git a/sdk/samples/dsshow3d/debug.c b/sdk/samples/dsshow3d/debug.c deleted file mode 100644 index c09c806..0000000 --- a/sdk/samples/dsshow3d/debug.c +++ /dev/null @@ -1,413 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.c - * Content: debug code - * - ***************************************************************************/ - -#include -#include -#include -#include -#include "debug.h" - -#if defined(DEBUG) || defined(_DEBUG) - - -// -// since we don't UNICODE our debugging messages, use the ASCII entry -// points regardless of how we are compiled. -// -#ifdef _WIN32 - #include -#else - #define lstrcatA lstrcat - #define lstrlenA lstrlen - #define GetProfileIntA GetProfileInt - #define OutputDebugStringA OutputDebugString - #define wsprintfA wsprintf - #define MessageBoxA MessageBox -#endif - -// -// -// -BOOL __gfDbgEnabled = TRUE; // master enable -UINT __guDbgLevel = 0; // current debug level - - -//--------------------------------------------------------------------------; -// -// void DbgVPrintF -// -// Description: -// -// -// Arguments: -// LPSTR szFormat: -// -// va_list va: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL DbgVPrintF -( - LPSTR szFormat, - va_list va -) -{ - char ach[DEBUG_MAX_LINE_LEN]; - BOOL fDebugBreak = FALSE; - BOOL fPrefix = TRUE; - BOOL fCRLF = TRUE; - - ach[0] = '\0'; - - for (;;) - { - switch (*szFormat) - { - case '!': - fDebugBreak = TRUE; - szFormat++; - continue; - - case '`': - fPrefix = FALSE; - szFormat++; - continue; - - case '~': - fCRLF = FALSE; - szFormat++; - continue; - } - - break; - } - - if (fDebugBreak) - { - ach[0] = '\007'; - ach[1] = '\0'; - } - - if (fPrefix) - { - lstrcatA(ach, DEBUG_MODULE_NAME ": "); - } - -#ifdef _WIN32 - wvsprintfA(ach + lstrlenA(ach), szFormat, va); -#else - wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va); -#endif - - if (fCRLF) - { - lstrcatA(ach, "\r\n"); - } - - OutputDebugStringA(ach); - - if (fDebugBreak) - { - DebugBreak(); - } -} // DbgVPrintF() - - -//--------------------------------------------------------------------------; -// -// void dprintf -// -// Description: -// dprintf() is called by the DPF() macro if DEBUG is defined at compile -// time. It is recommended that you only use the DPF() macro to call -// this function--so you don't have to put #ifdef DEBUG around all -// of your code. -// -// Arguments: -// UINT uDbgLevel: -// -// LPSTR szFormat: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL dprintf -( - UINT uDbgLevel, - LPSTR szFormat, - ... -) -{ - va_list va; - - if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel)) - return; - - va_start(va, szFormat); - DbgVPrintF(szFormat, va); - va_end(va); -} // dprintf() - - -//--------------------------------------------------------------------------; -// -// BOOL DbgEnable -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (BOOL): -// Returns the previous debugging state. -// -//--------------------------------------------------------------------------; - -BOOL WINAPI DbgEnable -( - BOOL fEnable -) -{ - BOOL fOldState; - - fOldState = __gfDbgEnabled; - __gfDbgEnabled = fEnable; - - return (fOldState); -} // DbgEnable() - - -//--------------------------------------------------------------------------; -// -// UINT DbgSetLevel -// -// Description: -// -// -// Arguments: -// UINT uLevel: -// -// Return (UINT): -// Returns the previous debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgSetLevel -( - UINT uLevel -) -{ - UINT uOldLevel; - - uOldLevel = __guDbgLevel; - __guDbgLevel = uLevel; - - return (uOldLevel); -} // DbgSetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgGetLevel -// -// Description: -// -// -// Arguments: -// None. -// -// Return (UINT): -// Returns the current debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgGetLevel -( - void -) -{ - return (__guDbgLevel); -} // DbgGetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgInitialize -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (UINT): -// Returns the debugging level that was set. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgInitialize -( - BOOL fEnable -) -{ - UINT uLevel; - - uLevel = GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, (UINT)-1); - if ((UINT)-1 == uLevel) - { - // - // if the debug key is not present, then force debug output to - // be disabled. this way running a debug version of a component - // on a non-debugging machine will not generate output unless - // the debug key exists. - // - uLevel = 0; - fEnable = FALSE; - } - - DbgSetLevel(uLevel); - DbgEnable(fEnable); - - return (__guDbgLevel); -} // DbgInitialize() - - -//--------------------------------------------------------------------------; -// -// void _Assert -// -// Description: -// This routine is called if the ASSERT macro (defined in debug.h) -// tests and expression that evaluates to FALSE. This routine -// displays an "assertion failed" message box allowing the user to -// abort the program, enter the debugger (the "retry" button), or -// ignore the assertion and continue executing. The message box -// displays the file name and line number of the _Assert() call. -// -// Arguments: -// char * szFile: Filename where assertion occurred. -// int iLine: Line number of assertion. -// -//--------------------------------------------------------------------------; - -#ifndef _WIN32 -#pragma warning(disable:4704) -#endif - -void WINAPI _Assert -( - char * szFile, - int iLine -) -{ - static char ach[300]; // debug output (avoid stack overflow) - int id; -#ifndef _WIN32 - int iExitCode; -#endif - - wsprintfA(ach, "Assertion failed in file %s, line %d. [Press RETRY to debug.]", (LPSTR)szFile, iLine); - - id = MessageBoxA(NULL, ach, "Assertion Failed", - MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE ); - - switch (id) - { - - case IDABORT: // Kill the application. -#ifndef _WIN32 - iExitCode = 0; - _asm - { - mov ah, 4Ch - mov al, BYTE PTR iExitCode - int 21h - } -#else - FatalAppExit(0, TEXT("Good Bye")); -#endif // WIN16 - break; - - case IDRETRY: // Break into the debugger. - DebugBreak(); - break; - - case IDIGNORE: // Ignore assertion, continue executing. - break; - } -} // _Assert - -#ifndef _WIN32 -#pragma warning(default:4704) -#endif - -#endif // #if defined(DEBUG) || defined(_DEBUG) - -// Silly little function gives meaningful error messages from HRESULT's -LPSTR TranslateDSError( HRESULT hr ) - { - switch( hr ) - { - case DSERR_ALLOCATED: - return "DSERR_ALLOCATED"; - - case DSERR_CONTROLUNAVAIL: - return "DSERR_CONTROLUNAVAIL"; - - case DSERR_INVALIDPARAM: - return "DSERR_INVALIDPARAM"; - - case DSERR_INVALIDCALL: - return "DSERR_INVALIDCALL"; - - case DSERR_GENERIC: - return "DSERR_GENERIC"; - - case DSERR_PRIOLEVELNEEDED: - return "DSERR_PRIOLEVELNEEDED"; - - case DSERR_OUTOFMEMORY: - return "DSERR_OUTOFMEMORY"; - - case DSERR_BADFORMAT: - return "DSERR_BADFORMAT"; - - case DSERR_UNSUPPORTED: - return "DSERR_UNSUPPORTED"; - - case DSERR_NODRIVER: - return "DSERR_NODRIVER"; - - case DSERR_ALREADYINITIALIZED: - return "DSERR_ALREADYINITIALIZED"; - - case DSERR_NOAGGREGATION: - return "DSERR_NOAGGREGATION"; - - case DSERR_BUFFERLOST: - return "DSERR_BUFFERLOST"; - - case DSERR_OTHERAPPHASPRIO: - return "DSERR_OTHERAPPHASPRIO"; - - case DSERR_UNINITIALIZED: - return "DSERR_UNINITIALIZED"; - - default: - return "Unknown HRESULT"; - } - } - - diff --git a/sdk/samples/dsshow3d/debug.h b/sdk/samples/dsshow3d/debug.h deleted file mode 100644 index 74b8472..0000000 --- a/sdk/samples/dsshow3d/debug.h +++ /dev/null @@ -1,88 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.h - * Content: debug header - * - ***************************************************************************/ -#ifndef __DEBUG_INCLUDED__ -#define __DEBUG_INCLUDED__ -#ifdef __cplusplus -extern "C" -{ -#endif - -LPSTR TranslateDSError( HRESULT ); - -// -// -// -// -#ifdef DEBUG - #define DEBUG_SECTION "Debug" // section name for - #define DEBUG_MODULE_NAME "DSSHOW3D" // key name and prefix for output - #define DEBUG_MAX_LINE_LEN 255 // max line length (bytes!) -#endif - - -// -// based code makes since only in win 16 (to try and keep stuff out of -// [fixed] data segments, etc)... -// -#ifndef BCODE -#ifdef _WIN32 - #define BCODE -#else - #define BCODE _based(_segname("_CODE")) -#endif -#endif - - - - -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; -// -// -// -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - -#if defined(DEBUG) || defined(_DEBUG) - BOOL WINAPI DbgEnable(BOOL fEnable); - UINT WINAPI DbgGetLevel(void); - UINT WINAPI DbgSetLevel(UINT uLevel); - UINT WINAPI DbgInitialize(BOOL fEnable); - void WINAPI _Assert( char * szFile, int iLine ); - - void FAR CDECL dprintf(UINT uDbgLevel, LPSTR szFmt, ...); - - #define D(x) {x;} - #define DPF dprintf - #define DPI(sz) {static char BCODE ach[] = sz; OutputDebugStr(ach);} - #define ASSERT(x) if( !(x) ) _Assert( __FILE__, __LINE__) -#else - #define DbgEnable(x) FALSE - #define DbgGetLevel() 0 - #define DbgSetLevel(x) 0 - #define DbgInitialize(x) 0 - - #ifdef _MSC_VER - #pragma warning(disable:4002) - #endif - - #define D(x) - #define DPF() - #define DPI(sz) - #define ASSERT(x) -#endif - -#if defined(DEBUG) || defined(_DEBUG) -#define ASSERT_HWND( h ) ASSERT( IsWindow((h)) ) -#else -#define ASSERT_HWND( h ) ASSERT( NULL != (h) ) -#endif - -#ifdef __cplusplus -} -#endif -#endif // __DEBUG_INCLUDED__ diff --git a/sdk/samples/dsshow3d/dsenum.c b/sdk/samples/dsshow3d/dsenum.c deleted file mode 100644 index ad17062..0000000 --- a/sdk/samples/dsshow3d/dsenum.c +++ /dev/null @@ -1,142 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dstrenum.c - * Content: Illustrates enumerating DirectSound drivers - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include - -#include "dsenum.h" -#include "resource.h" - -extern HINSTANCE ghInst; -extern HWND hWndMain; - - - -/****************************************************************************/ -/* DoDSoundEnumerate() */ -/* */ -/* This function takes care of handling the DirectSound enumeration, which*/ -/* simply means creating a dialog box, at this point... */ -/****************************************************************************/ -BOOL DoDSoundEnumerate( LPGUID lpGUID ) - { - if( DialogBoxParam( ghInst, MAKEINTRESOURCE(IDD_DSENUMBOX), hWndMain, - DSEnumDlgProc, (LPARAM)lpGUID )) - return( TRUE ); - - return( FALSE ); - } - -/****************************************************************************/ -/* DSEnumDlgProc() */ -/* */ -/* Dialog procedure for the DSound enumeration choice dialog. Allows the */ -/* user to choose from installed drivers. Returns TRUE on error. */ -/****************************************************************************/ -BOOL CALLBACK DSEnumDlgProc( HWND hDlg, UINT msg, - WPARAM wParam, LPARAM lParam ) - { - static HWND hCombo; - static LPGUID lpGUID; - LPGUID lpTemp; - int i; - - switch( msg ) - { - case WM_INITDIALOG: - hCombo = GetDlgItem( hDlg, IDC_DSENUM_COMBO ); - lpGUID = (LPGUID)lParam; - - if( DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, &hCombo ) != DS_OK ) - { - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - if( ComboBox_GetCount( hCombo )) - ComboBox_SetCurSel( hCombo, 0 ); - else - { - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - return( TRUE ); - - - case WM_COMMAND: - switch( LOWORD( wParam )) - { - case IDOK: - for( i = 0; i < ComboBox_GetCount( hCombo ); i++ ) - { - lpTemp = (LPGUID)ComboBox_GetItemData( hCombo, i ); - if( i == ComboBox_GetCurSel( hCombo )) - { - if( lpTemp != NULL ) - memcpy( lpGUID, lpTemp, sizeof(GUID)); - else - lpGUID = NULL; - } - if( lpTemp ) - LocalFree( lpTemp ); - } - // If we got the NULL GUID, then we want to open the default - // sound driver, so return with an error and the init code - // will know not to pass in the guID and will send NULL - // instead. - if( lpGUID == NULL ) - EndDialog( hDlg, TRUE ); - else - EndDialog( hDlg, FALSE ); - return( TRUE ); - - case IDCANCEL: - // Force a NULL GUID - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - break; - - - default: - return( FALSE ); - } - - return( FALSE ); - } - - -/****************************************************************************/ -/* DSEnumProc() */ -/* */ -/* This is the Enumeration procedure called by DirectSoundEnumerate with */ -/* the parameters of each DirectSound Object available in the system. */ -/****************************************************************************/ -BOOL CALLBACK DSEnumProc( LPGUID lpGUID, LPSTR lpszDesc, - LPSTR lpszDrvName, LPVOID lpContext ) - { - HWND hCombo = *(HWND *)lpContext; - LPGUID lpTemp = NULL; - - if( lpGUID != NULL ) - { - if(( lpTemp = LocalAlloc( LPTR, sizeof(GUID))) == NULL ) - return( TRUE ); - - memcpy( lpTemp, lpGUID, sizeof(GUID)); - } - - ComboBox_AddString( hCombo, lpszDesc ); - ComboBox_SetItemData( hCombo, - ComboBox_FindString( hCombo, 0, lpszDesc ), - lpTemp ); - return( TRUE ); - } diff --git a/sdk/samples/dsshow3d/dsenum.h b/sdk/samples/dsshow3d/dsenum.h deleted file mode 100644 index 24cd829..0000000 --- a/sdk/samples/dsshow3d/dsenum.h +++ /dev/null @@ -1,32 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dsenum.h - * Content: Direct Sound Enumeration defines - * - * - ***************************************************************************/ - -#ifndef __DSENUM_INCLUDED__ -#define __DSENUM_INCLUDED__ - -#ifdef __cplusplus -extern "C" { -#endif - -// Function declarations - -BOOL DoDSoundEnumerate( LPGUID ); - -BOOL CALLBACK DSEnumProc( LPGUID, LPSTR, LPSTR, LPVOID ); -BOOL CALLBACK DSEnumDlgProc( HWND, UINT, WPARAM, LPARAM ); - - -#ifdef __cplusplus -}; -#endif - - -#endif - diff --git a/sdk/samples/dsshow3d/dsshow3d.cpp b/sdk/samples/dsshow3d/dsshow3d.cpp deleted file mode 100644 index a02a8ed..0000000 --- a/sdk/samples/dsshow3d/dsshow3d.cpp +++ /dev/null @@ -1,1384 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: DSShow3d.c - * Content: Direct Sound show-off, including 3D Sound. - * - * - ***************************************************************************/ - -//#pragma warning( disable: 4102 4101 ) - -#define INITGUID -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "DSShow3D.h" -#define INIT_GVARS -#include "GVars.h" - -#include "MainWnd.h" -#include "FileInfo.h" - -#include "wave.h" -#include "debug.h" - -static char szOpenStartDir[MAX_PATH]; - -// Format codes used to compactly represent each possible output format -// -// The code is: FFCBB where... -// -// FF -> Frequency 8=8000, 11=11025, 22=22050, 44=44100 -// C -> # of channels (1 or 2) -// BB -> Bits 08 is 8-bit, 16 is 16-bit -// -// Use the FormatCodeToWFX() function to set a WAVEFORMATEX structure -// based on a format code, or FormatCodeToText() to get a text string -// representing the format. -// - -#define FC_GETFREQCODE(fc) ((fc) / 1000) -#define FC_GETBITS(fc) ((fc) % 100) -#define FC_GETCHANNELS(fc) (((fc) % 1000) / 100) - -// Functions limited in scope to this file - -static BOOL InitializeDSound( void ); -static void FreeDSound( void ); -static BOOL InitInstance( HINSTANCE, LPSTR, int ); -static BOOL InitPrimarySoundBuffer( void ); -static void GetMediaPath( LPSTR, int ); -static BOOL LoadRegistrySettings( void ); -static BOOL SaveRegistrySettings( void ); -static BOOL ParseCommandLine( LPSTR lpszCmdLine ); -static BOOL fMatchToken( PSTR pszString, PSTR pszDatum, int cchLen ); -static BOOL fGetToken( PSTR pszStart, PSTR *ppszRet, int *pcchRet ); - - -/* InitializeDSound() - * - * Initialize the DirectSound object and other stuff we'll use like the - * primary buffer and 3D listener object. - */ -BOOL InitializeDSound( void ) - { - HRESULT hr; - - hr = CoCreateInstance( CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, - IID_IDirectSound, (void**)&gpds ); - - if (FAILED(hr) || (NULL == gpds)) - { - DPF( 0, "Could not create a DSound object (%s)", TranslateDSError(hr)); - MessageBox( AppWnd.GetHwnd(), "Unable to get a DirectSound object", - "COM Failure", MB_OK | MB_ICONSTOP ); - goto ID_ExitError; - } - DPF( 2, "Got an IDirectSound object" ); - - if( grs.fDefaultDevice ) - { - DPF( 2, "Using default device as first choice" ); - hr = gpds->Initialize( &GUID_NULL ); - } - else - { - if( FAILED( hr = gpds->Initialize( &grs.guPreferredDevice ))) - { - DPF( 0, "Initialize failed on preferred device, using default" ); - if( IDNO == MessageBox( GetActiveWindow(), - "Unable to use preferred device. Use default instead?", - gszAppName, MB_YESNO )) - { - DPF( 2, "User chose not to use default device instead" ); - goto ID_ExitReleaseDS; - } - else - { - DPF( 2, "Falling back to default device" ); - hr = gpds->Initialize( &GUID_NULL ); - } - } - } - if (FAILED(hr)) - { - DPF( 0, "Failed Initialize() on IDirectSound object (%s)", TranslateDSError(hr)); - MessageBox( AppWnd.GetHwnd(), "Could not initialize DirectSound object", - gszAppName, MB_OK | MB_ICONSTOP ); - goto ID_ExitReleaseDS; - } - - if( grs.fUseExclusiveMode ) - { - hr = gpds->SetCooperativeLevel( AppWnd.GetHwnd(), DSSCL_EXCLUSIVE); - DPF( 3, "Received DSSCL_EXCLUSIVE" ); - } - else - { - hr = gpds->SetCooperativeLevel( AppWnd.GetHwnd(), DSSCL_PRIORITY); - DPF( 3, "Received DSSCL_PRIORITY" ); - } - if (FAILED(hr)) - { - DPF( 0, "Couldn't SetCooperativeLevel() (%s)", TranslateDSError(hr)); - MessageBox( AppWnd.GetHwnd(), "Could not SetCooperativeLevel()", - gszAppName, MB_OK | MB_ICONSTOP ); - goto ID_ExitReleaseDS; - } - - DPF( 3, "Creating Primary Buffer" ); - - if( !InitPrimarySoundBuffer()) - { - DPF( 0, "Failed on call to InitPrimarySoundBuffer()" ); - goto ID_ExitReleaseDS; - } - - // Return SUCCESS - return TRUE; - -ID_ExitReleaseDS: - // The InitPrimarySoundBuffer() call should have cleaned up - // after itself if it failed - - ASSERT( NULL == gp3DListener ); - ASSERT( NULL == gpdsbPrimary ); - - if( NULL != gpds ) - { - gpds->Release(); - gpds = NULL; - } - -ID_ExitError: - return FALSE; - } - - -void FreeDSound() - { - if( NULL != gpdsbPrimary ) - { - gpdsbPrimary->Stop(); - gpdsbPrimary->Release(); - gpdsbPrimary = NULL; - } - if( NULL != gp3DListener ) - { - gp3DListener->Release(); - gp3DListener = NULL; - } - if( NULL != gpds ) - { - gpds->Release(); - gpds = NULL; - } - } - - -/* InitInstance() - * - * This function is responsible for all initialization that must occur - * when a new instance of our application is started. - */ -BOOL InitInstance( HINSTANCE hInstance, LPSTR lpszCommandLine, int cmdShow ) - { - WNDCLASS myClass; - - myClass.hCursor = LoadCursor(NULL, IDC_ARROW); - myClass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_SPEAKER_RGB_3D)); - myClass.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); - myClass.lpszClassName = (LPSTR)gszAppWndClass; - myClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1); - myClass.hInstance = hInstance; - myClass.style = CS_HREDRAW | CS_VREDRAW; - myClass.lpfnWndProc = MainWndProc; - myClass.cbClsExtra = 0; - myClass.cbWndExtra = 0; - - if (!RegisterClass( &myClass )) - return FALSE; - - // Load the current registry settings - LoadRegistrySettings(); - gdwOutputFormat = grs.dwPreferredFormat; - - if( !AppWnd.Create()) - goto II_ExitError; - - AppWnd.ShowWindow( cmdShow ); - AppWnd.UpdateWindow(); - - /* Continue doing other initialization stuff */ - - // Setup the timer... - if ((gdwTimer = SetTimer(AppWnd.GetHwnd(), 1, TIMERPERIOD, NULL)) == 0) - { - MessageBox(AppWnd.GetHwnd(), "Cannot allocate timer, aborting", gszAppCaption, - MB_OK|MB_ICONSTOP); - goto II_ExitError; - } - - // Get the largest waveformatex structure. - if (MMSYSERR_NOERROR != acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, - &gcbMaxWaveFormatSize)) - { - MessageBox(AppWnd.GetHwnd(), "ACM Metrics failed, aborting", gszAppCaption, - MB_OK|MB_ICONSTOP); - goto II_ExitError; - } - - // Initialize the COM subsystem and create our DirectSound stuff - - if (!SUCCEEDED(CoInitialize(NULL))) - { - MessageBox( AppWnd.GetHwnd(), "Failed to initialize COM library", - gszAppCaption, MB_OK | MB_ICONSTOP); - goto II_ExitError; - } - else - gfCOMInitialized = TRUE; - - // Initialize the DirectSound global interfaces - if( !InitializeDSound()) - goto II_ExitShutdownCOM; - - if( !ParseCommandLine( lpszCommandLine )) - goto II_ExitFreeDSound; - - return TRUE; // TRUE indicates success - - -II_ExitFreeDSound: - FreeDSound(); - -II_ExitShutdownCOM: - if( gfCOMInitialized ) - { - DPF( 0, "Calling CoUninitialize from InitInstance error cleanup" ); - CoUninitialize(); - } - -II_ExitError: - - return FALSE; // FALSE indicates failure on initialization - } // InitInstance() - - -/* WinMain() - * - * Main entry point for this program's execution. Everything starts here. - */ -int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, int cmdShow) - { - MSG msg; - - DbgInitialize( TRUE ); - - InitCommonControls(); - - // Save instance handle - ghInst = hInstance; - - if (!InitInstance(hInstance, lpszCmdLine, cmdShow)) - return 0; - - /* Polling messages from event queue */ - while (GetMessage((LPMSG)&msg, NULL, 0, 0)) - { - // Only Translate and Dispatch the message if it's not going - // to one of our many modeless dialog windows - if( !IsDialogMessage( ghwndListener, &msg ) - && (NULL == ghDlgActive || !IsDialogMessage( ghDlgActive, &msg ))) - { - TranslateMessage((LPMSG)&msg); - DispatchMessage((LPMSG)&msg); - } - } - - UnregisterClass(gszAppWndClass, hInstance); - return (int)msg.wParam; - } // WinMain() - - -/* InitPrimarySoundBuffer() - * - * Creates and initializes the primary sound buffer for the application. - * We need the primary buffer in order to get the 3D listener interface and - * also to select output format type. - */ -BOOL InitPrimarySoundBuffer( void ) - { - HRESULT hr; - DSBUFFERDESC dsbd; - int nCurFormat; - - ZeroMemory( &dsbd, sizeof(DSBUFFERDESC)); - - gpwfxFormat = new WAVEFORMATEX; - if( NULL == gpwfxFormat ) - return FALSE; - - ZeroMemory( gpwfxFormat, sizeof(WAVEFORMATEX)); - - gpwfxFormat->wFormatTag = WAVE_FORMAT_PCM; - - FormatCodeToWFX( gdwOutputFormat, gpwfxFormat ); - DPF( 2, "Initial format code: %lu", gdwOutputFormat ); - - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; - - if( FAILED( hr = gpds->CreateSoundBuffer( &dsbd, &gpdsbPrimary, NULL ))) - { - DPF( 0, "Couldn't create primary buffer (%s)", TranslateDSError(hr)); - goto IPSB_ExitError; - } - - if( FAILED( hr = gpdsbPrimary->SetFormat( gpwfxFormat ))) - { - DisableFormatCode( gdwOutputFormat ); - - // If we couldn't load the desired format, then try everything starting - // at really high quality, and degrading to 8M8 (yuck) - nCurFormat = 0; - DPF( 2, "Unable to SetFormat() preferred format to %lu", gdwOutputFormat ); - - while( FAILED( hr ) && nCurFormat < NUM_FORMATENTRIES ) - { - gdwOutputFormat = aFormatOrder[nCurFormat]; - FormatCodeToWFX( gdwOutputFormat, gpwfxFormat ); - DPF( 2, "Trying format code: %lu", gdwOutputFormat ); - - hr = gpdsbPrimary->SetFormat( gpwfxFormat ); - if( FAILED(hr)) - { - DisableFormatCode( gdwOutputFormat ); - DPF( 2, "Return from SetFormat on primary buffer = %s", TranslateDSError(hr)); - } - else - { - EnableFormatCode( gdwOutputFormat ); - DPF( 2, "Succeeded on SetFormat() for code %lu", gdwOutputFormat ); - } - - nCurFormat++; - } - } - if( FAILED( hr )) - { - DPF( 0, "Failed SetFormat() on all formats!" ); - goto IPSB_ExitError; - } - - if( FAILED( hr = gpdsbPrimary->QueryInterface( IID_IDirectSound3DListener, - (void**)&gp3DListener))) - { - DPF( 0, "Couldn't QI primary buffer for 3D listener interface (%s)", TranslateDSError(hr)); - goto IPSB_ExitError; - } - if( FAILED( hr = gpdsbPrimary->Play( 0, 0, DSBPLAY_LOOPING ))) - { - DPF( 0, "Couldn't play primary buffer (%s)", TranslateDSError(hr)); - goto IPSB_ExitRelease; - } - - return TRUE; - -IPSB_ExitRelease: - if( gp3DListener ) - { - DPF( 0, "Releasing 3D Listener in InitPrimarySoundBuffer() error cleanup" ); - gp3DListener->Release(); - gp3DListener = NULL; - } - if( gpdsbPrimary ) - { - DPF( 0, "Releasing Primary in InitPrimarySoundBuffer() error cleanup" ); - gpdsbPrimary->Stop(); - gpdsbPrimary->Release(); - gpdsbPrimary = NULL; - } - -IPSB_ExitError: - return FALSE; - } - - -/* This will pop up the open file dialog and allow the user to pick one file. - - Input: - hWnd - Handle of parent window. - pszFileName - String to store filename in, must be >= MAX_PATH long. - - - Output: - TRUE if a file was picked successfully or FALSE if the user didn't - pick a file) - - */ -BOOL OpenFileDialog( HWND hWnd, LPSTR pszFileName, - int *nFileName, LPDWORD lpdwFlags ) - { - BOOL fReturn, - fValid; - OPENFILENAME ofn; - - pszFileName[0] = 0; - - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hWnd; - ofn.hInstance = ghInst; - ofn.lpstrFilter = "Wave Files\0*.wav\0All Files\0*.*\0\0"; - ofn.lpstrCustomFilter = NULL; - ofn.nMaxCustFilter = 0; - ofn.nFilterIndex = 1; - ofn.lpstrFile = pszFileName; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.lpstrInitialDir = grs.szInitialDir; - ofn.lpstrTitle = "File Open"; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER - | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK - | OFN_HIDEREADONLY; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = "wav"; - ofn.lCustData = (LONG)lpdwFlags; - ofn.lpfnHook = FileOpenCustomTemplateDlgProc; - ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEOPEN_NEST); - - fValid = FALSE; - do - { - if( fReturn = GetOpenFileName( &ofn )) - { - fValid = IsValidWave( pszFileName ); - if( !fValid ) - MessageBox( hWnd, "Wave files must be PCM format!", - "Invalid Wave File", MB_OK|MB_ICONSTOP ); - else - *nFileName = ofn.nFileOffset; - } - else - fValid = TRUE; // Force break out of loop. - } while( !fValid ); - - return fReturn; - } - -/* - * - * -This function will determine if the filename passed - in is a valid wave for this - app, that is a PCM wave. - - Input: - pszFileName - FileName to check. - - Output: - FALSE if not a valid wave, TRUE if it is. - -*/ -BOOL IsValidWave( LPSTR pszFileName ) - { - BOOL fReturn = FALSE; - int nError = 0; - HMMIO hmmio; - MMCKINFO mmck; - WAVEFORMATEX *pwfx; - - if ((nError = WaveOpenFile(pszFileName, &hmmio, &pwfx, &mmck)) != 0) - { - goto ERROR_IN_ROUTINE; - } - - if (pwfx->wFormatTag != WAVE_FORMAT_PCM) - { - goto ERROR_IN_ROUTINE; - } - - WaveCloseReadFile(&hmmio, &pwfx); - - fReturn = TRUE; - -ERROR_IN_ROUTINE: - return fReturn; - } - - -/* AboutDlgProc() - * - * Standard dialog procedure for the About box. As simple as can be. - */ -BOOL CALLBACK AboutDlgProc( HWND hWnd, UINT uMsg, - WPARAM wParam, LPARAM lParam ) - { - switch(uMsg) - { - case WM_INITDIALOG: - break; - - case WM_COMMAND: - switch(wParam) - { - case ID_OK: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - - default: - break; - - } - break; - - case WM_CLOSE: - EndDialog(hWnd, 0); - break; - - default: - return FALSE; - break; - - } - - return TRUE; -} - - -/* FileOpenCustomTemplateDlgProc() - * - * This "hook procedure" is called by the common dialog code for certain - * events that may occur during the life of our nested dialog structure. - * We nest the Explorer style dialog inside our file open dialog so we - * can add a check box for stick buffers. - */ -UINT CALLBACK FileOpenCustomTemplateDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - static LPOPENFILENAME lpofn = NULL; - static HWND hStickyRadio, h3DCheck, hLocalRadio, hGlobalRadio; - static HWND hGetPosRadio, hGetPos2Radio; - - switch( message ) - { - case WM_INITDIALOG: - lpofn = (LPOPENFILENAME)lParam; - - h3DCheck = GetDlgItem( hDlg, IDC_FONEST_3D ); - hLocalRadio = GetDlgItem( hDlg, IDC_FONEST_LOCAL_RADIO ); - hStickyRadio = GetDlgItem( hDlg, IDC_FONEST_STICKY_RADIO ); - hGlobalRadio = GetDlgItem( hDlg, IDC_FONEST_GLOBAL_RADIO ); - hGetPosRadio = GetDlgItem( hDlg, IDC_FONEST_GETPOS_RADIO ); - hGetPos2Radio = GetDlgItem( hDlg, IDC_FONEST_GETPOS2_RADIO ); - - Button_SetCheck( hGetPos2Radio, TRUE ); - - if( grs.dwDefaultFocusFlag & DSBCAPS_STICKYFOCUS ) - Button_SetCheck( hStickyRadio, TRUE ); - else if( grs.dwDefaultFocusFlag & DSBCAPS_GLOBALFOCUS ) - Button_SetCheck( hGlobalRadio, TRUE ); - else - { - ASSERT( grs.dwDefaultFocusFlag == 0 ); - Button_SetCheck( hLocalRadio, TRUE ); - } - - Button_SetCheck( h3DCheck, grs.fOpen3D ); - - *((LPDWORD)lpofn->lCustData) = 0; - - return TRUE; - - - case WM_NOTIFY: - switch(((LPOFNOTIFY)lParam)->hdr.code) - { - case CDN_SELCHANGE: - /* Use this area to process anything that must be updated when the - * user changes the selection in the Common Dialog Box. - * NOTE: Provided only for informational purposes - */ - return FALSE; - - case CDN_FILEOK: - /* We can do lots of things in this notification message. The most - * important is that we can decide whether the Common Dialog call - * will go through or whether it will fail. I decided to handle - * the checkbox control in this one place versus 4 others... - */ - ASSERT( lpofn != NULL ); - /* Set flags to match the current state of the check box controls */ - - /* Use normal GetPosition */ - *((LPDWORD)lpofn->lCustData) |= - Button_GetCheck(hGetPosRadio)? OPENFILENAME_F_GETPOS : 0; - /* Use DSBCAPS_GETCURRENTPOSITION2 */ - *((LPDWORD)lpofn->lCustData) |= - Button_GetCheck(hGetPos2Radio)? OPENFILENAME_F_GETPOS2 : 0; - - /* Local buffer focus */ - *((LPDWORD)lpofn->lCustData) |= - Button_GetCheck(hStickyRadio)? OPENFILENAME_F_LOCALFOCUS : 0; - /* Sticky buffer focus */ - *((LPDWORD)lpofn->lCustData) |= - Button_GetCheck(hStickyRadio)? OPENFILENAME_F_STICKYFOCUS : 0; - /* Global sound focus */ - *((LPDWORD)lpofn->lCustData) |= - Button_GetCheck(hGlobalRadio)? OPENFILENAME_F_GLOBALFOCUS : 0; - /* 3D Buffer */ - *((LPDWORD)lpofn->lCustData) |= - Button_GetCheck(h3DCheck)? OPENFILENAME_F_3D : 0; - /* Returning zero signifies that we "approve" of the OK command, - * and allows the common dialog to finish. - */ - return FALSE; - } - /* Let the default dialog do/continue processing */ - return FALSE; - } - return FALSE; -} - - -/* SettingsDlgProc() - * - * DialogBox procedure for the Settings dialog, which sets a bunch of - * the application-global settings stored in our global REGSETTINGS struct. - */ -BOOL CALLBACK SettingsDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - static BOOL fSettingsSaved; - static HWND hInitialDirEdit, hDeviceCombo, hDeviceText, hDefaultCheck; - static HWND hFormatCombo, hExclusiveCheck, hOpen3DCheck, hFocusCombo; - - int ndx, i, idxLocal, idxSticky, idxGlobal; - char szFormat[32]; - LPGUID lpguTemp; - - switch( message ) - { - case WM_INITDIALOG: - hInitialDirEdit = GetDlgItem( hDlg, IDC_SETTINGS_INITIALDIR_EDIT ); - hDeviceCombo = GetDlgItem( hDlg, IDC_SETTINGS_DSD_DEVICE_COMBO ); - hFormatCombo = GetDlgItem( hDlg, IDC_SETTINGS_DSD_FORMAT_COMBO ); - hFocusCombo = GetDlgItem( hDlg, IDC_SETTINGS_FOCUS_COMBO ); - hDeviceText = GetDlgItem( hDlg, IDC_SETTINGS_DSD_DEVICE_TEXT ); - hDefaultCheck = GetDlgItem( hDlg, IDC_SETTINGS_DSD_DEFAULT_CHECK ); - hExclusiveCheck = GetDlgItem( hDlg, IDC_SETTINGS_EXCLUSIVE_CHECK ); - hOpen3DCheck = GetDlgItem( hDlg, IDC_SETTINGS_OPEN3D_CHECK ); - - // We use this flag to determine the return value from DialogBox() - // FALSE indicates no change, TRUE means a change occurred. - fSettingsSaved = FALSE; - - // Add all the format strings to the combo box - for( i = 0; i < NUM_FORMATENTRIES; i ++ ) - { - // Only add formats that are available on this card (this will - // ignore any formats we couldn't SetFormat() with at startup, - // and any we have since found to be unusable as well). - if( !fdFormats[i].fEnable ) - continue; - - if( FormatCodeToText(fdFormats[i].dwCode, szFormat, sizeof(szFormat))) - { - ndx = ComboBox_AddString( hFormatCombo, szFormat ); - ComboBox_SetItemData( hFormatCombo, ndx, fdFormats[i].dwCode ); - } - } - - DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, (LPVOID)&hDeviceCombo ); - - // Add the three focus choices to the listbox, and set the item data - // for each to the appropriate flag - idxLocal = ComboBox_AddString( hFocusCombo, "Local" ); - ComboBox_SetItemData( hFocusCombo, idxLocal, 0 ); - idxSticky = ComboBox_AddString( hFocusCombo, "Sticky" ); - ComboBox_SetItemData( hFocusCombo, idxSticky, DSBCAPS_STICKYFOCUS ); - idxGlobal = ComboBox_AddString( hFocusCombo, "Global" ); - ComboBox_SetItemData( hFocusCombo, idxGlobal, DSBCAPS_GLOBALFOCUS ); - - // Select the proper Drop List item - if( grs.dwDefaultFocusFlag == DSBCAPS_STICKYFOCUS ) - ComboBox_SetCurSel( hFocusCombo, idxSticky ); - else if( grs.dwDefaultFocusFlag == DSBCAPS_GLOBALFOCUS ) - ComboBox_SetCurSel( hFocusCombo, idxGlobal ); - else - ComboBox_SetCurSel( hFocusCombo, idxLocal ); - - // Set the states of checkboxes and controls that depend on them - Button_SetCheck( hDefaultCheck, grs.fDefaultDevice ); - Button_SetCheck( hExclusiveCheck, grs.fUseExclusiveMode ); - Button_SetCheck( hOpen3DCheck, grs.fOpen3D ); - Static_Enable( hDeviceCombo, !grs.fDefaultDevice ); - Static_Enable( hDeviceText, !grs.fDefaultDevice ); - - Edit_LimitText( hInitialDirEdit, sizeof(grs.szInitialDir)); - Edit_SetText( hInitialDirEdit, grs.szInitialDir ); - - if (FormatCodeToText(grs.dwPreferredFormat, szFormat, sizeof(szFormat))) - { - ComboBox_SetCurSel( hFormatCombo, ComboBox_FindString( hFormatCombo, - -1, szFormat )); - } - - return TRUE; - - case WM_COMMAND: - switch( LOWORD(wParam)) - { - case IDC_SETTINGS_DSD_DEFAULT_CHECK: - grs.fDefaultDevice = !grs.fDefaultDevice; - Static_Enable( hDeviceCombo, !grs.fDefaultDevice ); - Static_Enable( hDeviceText, !grs.fDefaultDevice ); - // By selecting the first item, we wipe out the state where - // the user could come in with the box checked, uncheck it, - // and leave without selecting anything - ComboBox_SetCurSel( hDeviceCombo, 0 ); - break; - - case IDC_SETTINGS_BROWSE_INITIALDIR_BUTTON: - { - OPENFILENAME ofn; - - ZeroMemory( &ofn, sizeof(ofn)); - // Fill in the ofn structure and do the Common Dialog call - } - break; - - case IDOK: - grs.fDefaultDevice = Button_GetCheck( hDefaultCheck ); - if( !grs.fDefaultDevice ) - { - lpguTemp = (LPGUID)ComboBox_GetItemData( hDeviceCombo, - ComboBox_GetCurSel( hDeviceCombo )); - if( NULL != lpguTemp ) - grs.guPreferredDevice = *lpguTemp; - else - grs.guPreferredDevice = GUID_NULL; - } - else - grs.guPreferredDevice = GUID_NULL; - - grs.fOpen3D = Button_GetCheck( hOpen3DCheck ); - grs.fUseExclusiveMode = Button_GetCheck( hExclusiveCheck ); - grs.dwPreferredFormat = ComboBox_GetItemData( hFormatCombo, - ComboBox_GetCurSel( hFormatCombo )); - grs.dwDefaultFocusFlag = ComboBox_GetItemData( hFocusCombo, - ComboBox_GetCurSel( hFocusCombo )); - Edit_GetText( hInitialDirEdit, grs.szInitialDir, - sizeof(grs.szInitialDir)); - - SaveRegistrySettings(); - fSettingsSaved = TRUE; - SendMessage( hDlg, WM_CLOSE, 0, 0 ); - break; - - case IDCANCEL: - fSettingsSaved = FALSE; - SendMessage( hDlg, WM_CLOSE, 0, 0 ); - break; - - default: - return FALSE; - } - return TRUE; - break; - - case WM_CLOSE: - EndDialog( hDlg, fSettingsSaved ); - return TRUE; - - case WM_DESTROY: - while( ComboBox_GetCount( hDeviceCombo )) - { - lpguTemp = (LPGUID)ComboBox_GetItemData( hDeviceCombo, 0 ); - if( NULL != lpguTemp ) - delete lpguTemp; - ComboBox_DeleteString( hDeviceCombo, 0 ); - } - return TRUE; - - default: - return FALSE; - } - ASSERT( FALSE ); - return FALSE; - } - - -/* LoadRegistrySettings() - * - * Load application global REGSETTINGS structure values from the registry. - */ -BOOL LoadRegistrySettings( void ) - { - HKEY hReg; - DWORD dwVal; - DWORD cbValSize; - BOOL fRet = TRUE; - - // Load current settings from our registry key - if( ERROR_SUCCESS != RegOpenKeyEx( HKEY_CURRENT_USER, REG_SETTINGS_KEY, - 0, KEY_READ, &hReg )) - { - GetMediaPath( grs.szInitialDir, sizeof(grs.szInitialDir)); - - grs.fDefaultDevice = TRUE; - grs.fUseExclusiveMode = FALSE; - grs.fOpen3D = FALSE; - grs.dwDefaultFocusFlag = 0; - grs.szInitialDir[0] = '\0'; - grs.dwPreferredFormat = aFormatOrder[0]; - fRet = TRUE; - goto LRS_Return; - } - - // Load the "Use DirectSound Default Device" flag - cbValSize = sizeof(dwVal); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_DEVICE_DEFAULT, - NULL, NULL, (LPBYTE)&dwVal, - &cbValSize )) - { - grs.fDefaultDevice = TRUE; - fRet = FALSE; - } - else - { - grs.fDefaultDevice = (BOOL)dwVal; - - if( !grs.fDefaultDevice ) - { - // Load the GUID for the preferred device (only if it's not the default) - cbValSize = sizeof(grs.guPreferredDevice); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_DEVICE_GUID, - NULL, NULL, - (LPBYTE)&grs.guPreferredDevice, - &cbValSize )) - { - // Copy GUID_NULL into the guPreferredDevice (only works in C++) - grs.guPreferredDevice = GUID_NULL; - fRet = FALSE; - } - } - } - - cbValSize = sizeof(dwVal); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_USE_EXCLUSIVE, - NULL, NULL, (LPBYTE)&dwVal, - &cbValSize )) - { - grs.fUseExclusiveMode = FALSE; - fRet = FALSE; - } - else - grs.fUseExclusiveMode = (BOOL)dwVal; - - // Load the flag telling sus whether to default to 2D or 3D - cbValSize = sizeof(dwVal); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_OPEN3D, - NULL, NULL, (LPBYTE)&dwVal, - &cbValSize )) - { - grs.fOpen3D = FALSE; - fRet = FALSE; - } - else - grs.fOpen3D = (BOOL)dwVal; - - // Load the coded version of the preferred output format - cbValSize = sizeof(grs.dwPreferredFormat); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_OUTPUT_FORMAT, - NULL, NULL, - (LPBYTE)&grs.dwPreferredFormat, - &cbValSize )) - { - grs.dwPreferredFormat = aFormatOrder[0]; - fRet = FALSE; - } - - // Load the default focus DSBCAPS flags - cbValSize = sizeof(grs.dwDefaultFocusFlag); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_FOCUS_FLAG, - NULL, NULL, - (LPBYTE)&grs.dwDefaultFocusFlag, - &cbValSize )) - { - grs.dwDefaultFocusFlag = 0; - fRet = FALSE; - } - - // Load the initial directory for WAVE files - cbValSize = sizeof(grs.szInitialDir); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_SETTING_INITIAL_DIR, - NULL, NULL, - (LPBYTE)&grs.szInitialDir, - &cbValSize )) - { - GetMediaPath( grs.szInitialDir, sizeof(grs.szInitialDir)); - fRet = FALSE; - } - - if( hReg != NULL ) - { - RegCloseKey( hReg ); - hReg = NULL; - } - -LRS_Return: - return fRet; - } - - -/* SaveRegistrySettings() - * - * Write the values in the REGSETTINGS global structure to the registry. - */ -BOOL SaveRegistrySettings( void ) - { - HKEY hReg; - DWORD dwVal, dwCreateDisposition; - BOOL fRet = TRUE; - - // Save current settings to our registry key - if( ERROR_SUCCESS != RegCreateKeyEx( HKEY_CURRENT_USER, REG_SETTINGS_KEY, - 0, NULL, 0, KEY_WRITE, NULL, &hReg, - &dwCreateDisposition )) - { - fRet = FALSE; - goto SRS_Return; - } - - // Save the "Use DirectSound Default Device" flag - dwVal = (DWORD)grs.fDefaultDevice; - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_DEVICE_DEFAULT, - 0, REG_DWORD, (LPBYTE)&dwVal, - sizeof(DWORD))) - { - fRet = FALSE; - } - else - { - if( !grs.fDefaultDevice ) - { - // Save the GUID for the preferred device (only if it's not the default) - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_DEVICE_GUID, - 0, REG_BINARY, - (LPBYTE)&grs.guPreferredDevice, - sizeof(GUID))) - { - fRet = FALSE; - } - } - } - - // Use DSSCL_EXCLUSIVE ?? - dwVal = (DWORD)grs.fUseExclusiveMode; - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_USE_EXCLUSIVE, - 0, REG_DWORD, (LPBYTE)&dwVal, - sizeof(DWORD))) - { - fRet = FALSE; - } - - // Open in 3D by default ? - dwVal = (DWORD)grs.fOpen3D; - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_OPEN3D, - 0, REG_DWORD, (LPBYTE)&dwVal, - sizeof(DWORD))) - { - fRet = FALSE; - } - - // Save the coded version of the preferred output format - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_OUTPUT_FORMAT, - 0, REG_DWORD, - (LPBYTE)&grs.dwPreferredFormat, - sizeof(DWORD))) - { - fRet = FALSE; - } - - // Save the coded version of the preferred output format - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_FOCUS_FLAG, - 0, REG_DWORD, - (LPBYTE)&grs.dwDefaultFocusFlag, - sizeof(DWORD))) - { - fRet = FALSE; - } - - // Save the initial directory for WAVE files - if( ERROR_SUCCESS != RegSetValueEx( hReg, REG_SETTING_INITIAL_DIR, - 0, REG_SZ, - (LPBYTE)&grs.szInitialDir, - lstrlen(grs.szInitialDir))) - { - fRet = FALSE; - } - - RegCloseKey( hReg ); - hReg = NULL; - -SRS_Return: - return fRet; - } - - -/* GetMediaPath() - * - * In the absence of a registry value, this function is called to pick a - * starting point for the File|Open dialog. Usually \DXSDK\SDK\MEDIA. - */ -void GetMediaPath( LPSTR lpszBuf, int nBuf ) - { - HKEY hReg; - DWORD cbStartPathLen; - - if( ERROR_SUCCESS != RegOpenKeyEx( HKEY_LOCAL_MACHINE, - REG_DIRECT3D_KEY, - 0, KEY_READ, &hReg )) - { - goto REG_OPEN_FAILED; - } - else - { - // Query the Registry for the path to the media directory - cbStartPathLen = sizeof( szOpenStartDir ); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, REG_D3DPATH_VAL, - NULL, NULL, - (LPBYTE)szOpenStartDir, - &cbStartPathLen )) - { - goto REG_OPEN_FAILED; - } - RegCloseKey( hReg ); - hReg = NULL; - } - - return; - -REG_OPEN_FAILED: - // Start off by getting the Windows directory -- we're trying to build a - // file path like "C:\WINDOWS\MEDIA", but the WINDOWS directory could be - // named anything, so we must ask. - GetWindowsDirectory( szOpenStartDir, sizeof(szOpenStartDir)); - // If there's no trailing backslash, append one - if( lstrcmp( &szOpenStartDir[lstrlen(szOpenStartDir)], TEXT("\\") )) - lstrcat( szOpenStartDir, TEXT("\\")); - // Now add on the MEDIA part of the path - lstrcat( szOpenStartDir, TEXT("MEDIA")); - } - - -/* FormatCodeToText() - * - * This function reads format codes and puts out a text string for them. - * It does not check for invalid codes. FALSE return means the buffer was - * invalid in some way, TRUE means success. - * - */ -BOOL FormatCodeToText( DWORD dwFormat, LPSTR lpszBuf, int nBufSize ) - { - DWORD dwFreq; - - // The longest string we'll ever put in is 21 characters (including NULL) - if( NULL == lpszBuf || nBufSize < 21 ) - return FALSE; - - // Extract the sample rate - dwFreq = FC_GETFREQCODE(dwFormat); - dwFreq = ( dwFreq == 8 ? 8000 : (dwFreq / 11) * 11025); - - wsprintf( lpszBuf, "%u Hz, %u-bit %s", dwFreq, FC_GETBITS(dwFormat), - FC_GETCHANNELS(dwFormat) == 1 ? "Mono" : "Stereo" ); - - return TRUE; - } - - -/* FormatCodeToWFX() - * - * This function reads format codes and fills most of the fields of a - * WAVEFORMATEX structure based on the values read. It does not fill the - * wFormatTag or cbSize members. - * - */ -BOOL FormatCodeToWFX( DWORD dwFormat, PWAVEFORMATEX pwfx ) - { - DWORD dwFreq; - - if( NULL == pwfx ) - return FALSE; - - // Extract the sample rate - dwFreq = FC_GETFREQCODE(dwFormat); - pwfx->nSamplesPerSec = ( dwFreq == 8 ? 8000 : (dwFreq / 11) * 11025); - - pwfx->wBitsPerSample = (WORD)FC_GETBITS(dwFormat); - pwfx->nChannels = (WORD)FC_GETCHANNELS(dwFormat); - - // The nBlockAlign calculation below only works for whole-byte samples - ASSERT( pwfx->wBitsPerSample % 8 == 0 ); - - pwfx->nBlockAlign = pwfx->nChannels * (pwfx->wBitsPerSample / 8); - pwfx->nAvgBytesPerSec = pwfx->nBlockAlign * pwfx->nSamplesPerSec; - - return TRUE; - } - - -/* FormatCodeFromCommandID() - * - * Returns the Format Code that matches the given command ID. - */ -DWORD FormatCodeFromCommandID( WORD wID ) - { - int i; - - for( i = 0; i < NUM_FORMATENTRIES; i++ ) - { - if( fdFormats[i].wCommandID == wID ) - return fdFormats[i].dwCode; - } - return 0; - } - - -/* CommandIDFromFormatCode() - * - * Searchs our FORMATDATA array and returns the Command ID corresponding - * to the given format code, or 0 if there is no such valid format code. - */ -WORD CommandIDFromFormatCode( DWORD dwCode ) - { - int i; - - for( i = 0; i < NUM_FORMATENTRIES; i++ ) - { - if( fdFormats[i].dwCode == dwCode ) - return fdFormats[i].wCommandID; - } - return 0; - } - - -void DisableFormatCode( DWORD dwCode ) - { - int i; - - for( i = 0; i < NUM_FORMATENTRIES; i++ ) - { - if( fdFormats[i].dwCode == dwCode ) - { - fdFormats[i].fEnable = FALSE; - break; - } - } - } - - -void EnableFormatCode( DWORD dwCode ) - { - int i; - - for( i = 0; i < NUM_FORMATENTRIES; i++ ) - { - if( fdFormats[i].dwCode == dwCode ) - { - fdFormats[i].fEnable = TRUE; - break; - } - } - } - - -/* DSEnumProc() - * - * DirectSoundEnumerate() callback procedure which fills a combo box with - * the description strings of all devices and attachs a pointer to a GUID, - * which must be freed later by calling delete. - */ -BOOL CALLBACK DSEnumProc( LPGUID lpguDevice, LPSTR lpszDesc, - LPSTR lpszDrvName, LPVOID lpContext ) - { - HWND hCombo = *(HWND *)lpContext; - LPGUID lpguTemp = NULL; - int idx; - - if( NULL != lpguDevice ) - { - lpguTemp = new GUID; - // We failed to allocate storage, so continue with next device - if( NULL == lpguTemp ) - return( TRUE ); - - CopyMemory( lpguTemp, lpguDevice, sizeof(GUID)); - } - - idx = ComboBox_AddString( hCombo, lpszDesc ); - ComboBox_SetItemData( hCombo, - ComboBox_FindString( hCombo, 0, lpszDesc ), - lpguTemp ); - - if( !grs.fDefaultDevice ) - { - if( NULL == lpguTemp ) - { - if( grs.guPreferredDevice == GUID_NULL ) - ComboBox_SetCurSel( hCombo, idx ); - } - else if( *lpguTemp == grs.guPreferredDevice ) - ComboBox_SetCurSel( hCombo, idx ); - } - - return( TRUE ); - } - - -/* fGetToken() - * - * Parses the command-line string "in place" starting at pszStart. A ptr - * to the start of the next token and it's length will be the out parameters, - * or NULL and 0 if no token. Note that *ppszRet will NOT be NULL-terminated - * since the string is part of another string. That's what then length is for. - * - * Returns: TRUE if a token was retrieved, or FALSE if there was no token. - */ -BOOL fGetToken( PSTR pszStart, PSTR *ppszRet, int *pcchRet ) - { - PSTR pszCur = pszStart; - PSTR pszTokStart; - - if( !pszStart || NULL == ppszRet || NULL == pcchRet ) - return FALSE; - - // Skip leading whitespace - while( *pszCur && (*pszCur == ' ' || *pszCur == '\t')) - pszCur++; - - *ppszRet = NULL; - *pcchRet = 0; - - if( *pszCur ) - { - pszTokStart = pszCur; - - while( *pszCur && *pszCur != ' ' && *pszCur != '\t' ) - pszCur++; - - *ppszRet = pszTokStart; - *pcchRet = (int)(pszCur - pszTokStart); - } - - if( *pcchRet != 0 ) - return TRUE; - else - return FALSE; - } - - -/* fMatchToken() - * - * Attempts to match the first cchLen characters of pszDatum to the - * string at pszString. The comparison is case-insensitive (this function - * is designed for command-line switch matching). - * - * Returns: TRUE if the first cchLen characters are a match, else FALSE. - */ -BOOL fMatchToken( PSTR pszString, PSTR pszDatum, int cchLen ) - { - int i; - - for( i = 0; i < cchLen; i++ ) - { - if( CharLower( (LPTSTR)MAKELONG( pszString[i], 0 )) - != CharLower( (LPTSTR)MAKELONG( pszDatum[i], 0 ))) - return FALSE; - } - return TRUE; - } - - -/* ParseCommandLine() - * - * Given a command-line string without the module name, this function will - * parse the command line and takes action on whatever it finds there. - * - * Returns: TRUE if successful, or FALSE if there was an error. - */ -BOOL ParseCommandLine(LPSTR lpszCmdLine) - { - PSTR pszCur,pszToken; - PSTR ppszFiles[MAXCONTROLS]; - BOOL fStartPlaying = FALSE, fStartLooping = FALSE; - int cchTokLen = 0, i, nFilesFound; - - pszCur = lpszCmdLine; - - // First get all the command line switches - while( fGetToken(pszCur, &pszToken, &cchTokLen) && - (pszToken[0] == '/' || pszToken[0] == '-' )) - { - pszCur = pszToken + cchTokLen; - pszToken++; - - if( fMatchToken( pszToken, "PLAY", 4 )) - { - fStartPlaying = TRUE; - } - else if( fMatchToken( pszToken, "LOOP", 4 )) - { - fStartLooping = TRUE; - } - else - { - // We don't recognize this mysterious switch, so eat it and move on - } - } - - // Anything left on the command-line will be treated as a filename and - // we'll attempt to open it after we've found them all - nFilesFound = 0; - while( fGetToken(pszCur, &pszToken, &cchTokLen) && nFilesFound < MAXCONTROLS ) - { - pszCur = pszToken + cchTokLen; - ppszFiles[nFilesFound] = new char[cchTokLen+1]; - // Copy the token out of the command-line string and into our buffer - CopyMemory( ppszFiles[nFilesFound], pszToken, cchTokLen*sizeof(char)); - // Append a NULL terminator to what we just copied (to be safe) - *(ppszFiles[nFilesFound] + cchTokLen) = 0; - nFilesFound++; - } - // This function will take the array of strings we've created and open - // each string as a file. It will obey the global fStartPlaying and - // fStartLooping flags we may have already set above - if( nFilesFound ) - AppWnd.BatchOpenFiles( ppszFiles, nFilesFound, fStartPlaying, fStartLooping ); - - // Free the space we allocated - for( i = 0; i < nFilesFound; i++ ) - { - delete[] ppszFiles[i]; - ppszFiles[i] = NULL; - } - - // Returning TRUE means the caller should continue doing what they - // were doing: we succeeded. - return TRUE; - } - - diff --git a/sdk/samples/dsshow3d/dsshow3d.def b/sdk/samples/dsshow3d/dsshow3d.def deleted file mode 100644 index 2909bef..0000000 --- a/sdk/samples/dsshow3d/dsshow3d.def +++ /dev/null @@ -1,3 +0,0 @@ -NAME DSSHOW3D - -DESCRIPTION 'DirectSound3D Demo' diff --git a/sdk/samples/dsshow3d/dsshow3d.h b/sdk/samples/dsshow3d/dsshow3d.h deleted file mode 100644 index 81d9b21..0000000 --- a/sdk/samples/dsshow3d/dsshow3d.h +++ /dev/null @@ -1,95 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: DSShow3D.h - * Content: DirectSound Mixing Test with 3D sound main header file - * - ***************************************************************************/ -#ifndef __DSSHOW3D_H__ -#define __DSSHOW3D_H__ - -#define QQUOTE(x) #x -#define QUOTE(y) QQUOTE(y) -#define REMIND(str) __FILE__ "(" QUOTE(__LINE__) ") : " str - -#include -#include -#include - -#include "resource.h" -#include "debug.h" - -#define MAXCONTROLS 200 // An insanely large number of controls - -// To check for stopping of sounds, a timer is set...use this for the rate. -#define TIMERPERIOD 300 // In milliseconds - - -#define OPENFILENAME_F_LOCALFOCUS 0x00000001 -#define OPENFILENAME_F_STICKYFOCUS 0x00000002 -#define OPENFILENAME_F_GLOBALFOCUS 0x00000004 - -#define OPENFILENAME_F_GETPOS 0x00000008 -#define OPENFILENAME_F_GETPOS2 0x00000010 - -#define OPENFILENAME_F_3D 0x00000020 - - -#define MAXVOL_VAL 0 -#define MIDPAN_VAL 0 - -// Registry Keys and Values -#define REG_SETTINGS_KEY TEXT("Software\\Microsoft\\DSShow3D") -#define REG_SETTING_DEVICE_DEFAULT TEXT("UseDSoundDefault") -#define REG_SETTING_USE_EXCLUSIVE TEXT("UseExclusiveMode") -#define REG_SETTING_OUTPUT_FORMAT TEXT("PreferredOutputFormat") -#define REG_SETTING_FOCUS_FLAG TEXT("Focus") -#define REG_SETTING_OPEN3D TEXT("DefaultOpen3D") -#define REG_SETTING_INITIAL_DIR TEXT("InitialDirectory") -#define REG_SETTING_DEVICE_GUID TEXT("PreferredDevice") -#define REG_DIRECT3D_KEY TEXT("Software\\Microsoft\\Direct3D") -#define REG_D3DPATH_VAL TEXT("D3D Path") - - -typedef struct tag_rs -{ - BOOL fDefaultDevice; // Use the DSound default device? - BOOL fOpen3D; // Default to opening in 3D? - BOOL fUseExclusiveMode; // Use exclusive mode? - DWORD dwDefaultFocusFlag; // The DSBCAPS flag for the default focus - DWORD dwPreferredFormat; // Preferred output format - char szInitialDir[MAX_PATH]; // Initial open directory - GUID guPreferredDevice; // GUID of preferred device, if not default -} REGSETTINGS, *PREGSETTINGS; - - -typedef struct tag_fd -{ - DWORD dwCode; - WORD wCommandID; - BOOL fEnable; -} FORMATDATA, *PFORMATDATA; - -/////////////////////////////////////////////////////////////////////// -// Function prototypes -// - -BOOL CALLBACK DSEnumProc( LPGUID, LPSTR, LPSTR, LPVOID ); -BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM); -BOOL CALLBACK SettingsDlgProc(HWND, UINT, WPARAM, LPARAM); -UINT CALLBACK FileOpenCustomTemplateDlgProc(HWND, UINT, WPARAM, LPARAM); - -BOOL OpenFileDialog(HWND, LPSTR, int *, LPDWORD); -BOOL IsValidWave(LPSTR); - -BOOL FormatCodeToWFX( DWORD, PWAVEFORMATEX ); -BOOL FormatCodeToText( DWORD, LPSTR, int ); - -DWORD FormatCodeFromCommandID( WORD ); -WORD CommandIDFromFormatCode( DWORD ); -void DisableFormatCode( DWORD ); -void EnableFormatCode( DWORD ); - - -#endif // __DSSHOW3D_H__ diff --git a/sdk/samples/dsshow3d/dsshow3d.rc b/sdk/samples/dsshow3d/dsshow3d.rc deleted file mode 100644 index 5f05dca..0000000 --- a/sdk/samples/dsshow3d/dsshow3d.rc +++ /dev/null @@ -1,492 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "reshead.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""reshead.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SPEAKER_RGB ICON DISCARDABLE "icon3.ico" -IDI_SPEAKER_RGB_3D ICON DISCARDABLE "icon1.ico" -IDI_SMALL_3D ICON DISCARDABLE "ico00001.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINMENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Open", IDC_FILE_OPEN - MENUITEM "E&xit", IDC_FILE_EXIT - END - POPUP "&Options" - BEGIN - POPUP "&Output Format" - BEGIN - MENUITEM "8000 Hz 8-bit Mono", ID_OPTIONS_FORMAT_8M8 - MENUITEM "8000 Hz 16-bit Mono", ID_OPTIONS_FORMAT_8M16 - MENUITEM "8000 Hz 8-bit Stereo", ID_OPTIONS_FORMAT_8S8 - MENUITEM "8000 Hz 16-bit Stereo", ID_OPTIONS_FORMAT_8S16 - MENUITEM SEPARATOR - MENUITEM "11025 Hz 8-bit Mono", ID_OPTIONS_FORMAT_11M8 - MENUITEM "11025 Hz 16-bit Mono", ID_OPTIONS_FORMAT_11M16 - MENUITEM "11025 Hz 8-bit Stereo", ID_OPTIONS_FORMAT_11S8 - MENUITEM "11025 Hz 16-bit Stereo", ID_OPTIONS_FORMAT_11S16 - MENUITEM SEPARATOR - MENUITEM "22050 Hz 8-bit Mono", ID_OPTIONS_FORMAT_22M8 - MENUITEM "22050 Hz 16-bit Mono", ID_OPTIONS_FORMAT_22M16 - MENUITEM "22050 Hz 8-bit Stereo", ID_OPTIONS_FORMAT_22S8 - MENUITEM "22050 Hz 16-bit Stereo", ID_OPTIONS_FORMAT_22S16 - MENUITEM SEPARATOR - MENUITEM "44100 Hz 8-bit Mono", ID_OPTIONS_FORMAT_44M8 - MENUITEM "44100 Hz 16-bit Mono", ID_OPTIONS_FORMAT_44M16 - MENUITEM "44100 Hz 8-bit Stereo", ID_OPTIONS_FORMAT_44S8 - MENUITEM "44100 Hz 16-bit Stereo", ID_OPTIONS_FORMAT_44S16 - END - MENUITEM SEPARATOR - MENUITEM "&Settings...", IDC_OPTIONS_SETTINGS - END - POPUP "&Buffers" - BEGIN - MENUITEM "&Cascade", IDC_BUFFERS_CASCADE - MENUITEM "&Minimize All", IDC_BUFFERS_MINIMIZEALL - MENUITEM "&Restore All", IDC_BUFFERS_RESTOREALL - MENUITEM SEPARATOR - MENUITEM "Close &All", IDC_BUFFERS_CLOSEALL - END - POPUP "&Help" - BEGIN - MENUITEM "&About...", IDC_HELP_ABOUT - END -END - -IDM_POPUPS MENU DISCARDABLE -BEGIN - POPUP "FREQ_CONTEXT" - BEGIN - MENUITEM "File Default", ID_FREQCONTEXT_FILEDEFAULT - MENUITEM SEPARATOR - MENUITEM "8000 Hz", ID_FREQCONTEXT_8000HZ - MENUITEM "11025 Hz", ID_FREQCONTEXT_11025HZ - MENUITEM "22050 Hz", ID_FREQCONTEXT_22050HZ - MENUITEM "44100 Hz", ID_FREQCONTEXT_44100HZ - END - POPUP "VOL_CONTEXT" - BEGIN - MENUITEM "0 dB (100%)", ID_VOLCONTEXT_0DB - MENUITEM "-10 dB (50%)", ID_VOLCONTEXT_10DB - MENUITEM "-20 dB (25%)", ID_VOLCONTEXT_20DB - MENUITEM "-30 dB (12.5%)", ID_VOLCONTEXT_30DB - MENUITEM "-100 dB (virtually silent)", ID_VOLCONTEXT_100DB - END - POPUP "PAN_CONTEXT" - BEGIN - MENUITEM "Center", ID_PANCONTEXT_CENTER - MENUITEM SEPARATOR - MENUITEM "10 dB Left", ID_PANCONTEXT_10DB_LEFT - MENUITEM "10 dB Right", ID_PANCONTEXT_10DB_RIGHT - MENUITEM SEPARATOR - MENUITEM "Full Left", ID_PANCONTEXT_FULL_LEFT - MENUITEM "Full Right", ID_PANCONTEXT_FULL_RIGHT - END - POPUP "OUTERVOL_CONTEXT" - BEGIN - MENUITEM "0 dB (100%)", ID_OUTERVOLCONTEXT_0DB - MENUITEM "-10 dB (50%)", ID_OUTERVOLCONTEXT_10DB - MENUITEM "-20 dB (25%)", ID_OUTERVOLCONTEXT_20DB - MENUITEM "-30 dB (12.5%)", ID_OUTERVOLCONTEXT_30DB - MENUITEM "-100 dB (virtually silent)", ID_OUTERVOLCONTEXT_100DB - END - POPUP "POS_CONTEXT" - BEGIN - MENUITEM "Origin", ID_POSCONTEXT_ORIGIN - MENUITEM "Listener Position", ID_POSCONTEXT_LISTENERPOSITION - - END -END - -IDM_BUFFERDLG MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Open...", ID_BUFFERDLG_FILE_OPEN - MENUITEM "&Close", IDCANCEL - END - MENUITEM "&Duplicate!", ID_BUFFERDLG_DUPLICATE -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_DSENUMBOX DIALOG DISCARDABLE 0, 0, 184, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Choose a DirectSound Driver..." -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,34,43,50,14 - PUSHBUTTON "Cancel",IDCANCEL,100,43,50,14 - COMBOBOX IDC_DSENUM_COMBO,4,12,176,36,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Driver Description:",IDC_STATIC,4,4,116,8 -END - -IDD_FILEOPEN_NEST DIALOG DISCARDABLE 0, 0, 287, 122 -STYLE DS_MODALFRAME | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS | - WS_CAPTION | WS_SYSMENU -CAPTION "Dialog" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "",1119,7,7,280,70 - CONTROL "Create as a &3D buffer",IDC_FONEST_3D,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,6,82,92,11 - CONTROL "&Local",IDC_FONEST_LOCAL_RADIO,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,104,48,10 - CONTROL """&Sticky""",IDC_FONEST_STICKY_RADIO,"Button", - BS_AUTORADIOBUTTON,62,104,48,10 - CONTROL "&Global",IDC_FONEST_GLOBAL_RADIO,"Button", - BS_AUTORADIOBUTTON,112,104,48,10 - CONTROL "&Normal (DX 1 behavior)",IDC_FONEST_GETPOS_RADIO, - "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,172, - 92,101,10 - CONTROL "&Enhanced Accuracy (DX2)",IDC_FONEST_GETPOS2_RADIO, - "Button",BS_AUTORADIOBUTTON,172,104,102,10 - GROUPBOX "GetCurrentPosition() Behavior",IDC_FONEST_GETPOS_GROUP, - 168,82,110,34 - GROUPBOX "Sound Focus Type",IDC_STATIC,6,94,158,22 -END - -IDD_ABOUT DIALOG DISCARDABLE 0, 0, 208, 73 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",ID_OK,79,52,50,14 - LTEXT "DSShow3D",IDC_STATIC,40,8,93,9 - LTEXT "Copyright (c) 1995-1996 Microsoft Corporation", - IDC_STATIC,40,32,164,12 - ICON IDI_SPEAKER_RGB_3D,IDC_STATIC,9,8,18,20 - LTEXT "A DirectSound3D sample application",IDC_STATIC,40,20, - 136,8 -END - -IDD_BUFFER DIALOGEX 0, 0, 178, 122 -STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_NOPARENTNOTIFY | WS_EX_ACCEPTFILES -MENU IDM_BUFFERDLG -FONT 8, "MS Sans Serif", 0, 0, 0x1 -BEGIN - PUSHBUTTON "&Play",IDC_BUFFERDLG_PLAY_BUTTON,4,82,37,14 - CONTROL "&Looped",IDC_BUFFERDLG_LOOPED_CHECK,"Button", - BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,45,82,37,14 - CONTROL "Slider3",IDC_BUFFERDLG_FREQ_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,87,22,85,15 - CONTROL "Slider4",IDC_BUFFERDLG_VOL_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,87,50,85,15 - CONTROL "Slider4",IDC_BUFFERDLG_PAN_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,87,78,85,15 - LTEXT "Frequency:",IDC_STATIC,92,14,38,8 - RTEXT "",IDC_BUFFERDLG_FREQ_TEXT,130,14,38,8 - LTEXT "Write Cursor:",IDC_STATIC,4,38,42,8 - LTEXT "Play Cursor:",IDC_STATIC,4,28,42,8 - RTEXT "",IDC_BUFFERDLG_WRITECURSOR_TEXT,48,38,34,8 - RTEXT "",IDC_BUFFERDLG_PLAYCURSOR_TEXT,48,28,34,8 - GROUPBOX "2D Buffer Properties",IDC_STATIC,86,4,88,92 - LTEXT "Volume:",IDC_STATIC,92,40,32,8 - RTEXT "",IDC_BUFFERDLG_VOL_TEXT,126,40,42,8 - RTEXT "",IDC_BUFFERDLG_PAN_TEXT,116,68,52,8 - LTEXT "Pan:",IDC_STATIC,92,68,22,8 - LTEXT "Focus Mode:",IDC_STATIC,4,62,48,8 - RTEXT "",IDC_BUFFERDLG_FOCUS_TEXT,52,62,30,8 - LTEXT "GetPos Mode:",IDC_STATIC,4,72,52,8,WS_DISABLED - RTEXT "",IDC_BUFFERDLG_GETPOS_TEXT,56,72,26,8,WS_DISABLED - LTEXT "Data Format:",IDC_STATIC,4,4,50,8 - RTEXT "",IDC_BUFFERDLG_DATAFORMAT_TEXT,4,14,78,8 - CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME | SS_SUNKEN,4,48,78, - 2 - CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME | SS_SUNKEN,4,24,78, - 2 - CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME | SS_SUNKEN,0,0,178, - 1 - LTEXT "Buffer Type:",IDC_STATIC,4,52,44,8 - RTEXT "",IDC_BUFFERDLG_BUFFERTYPE_TEXT,48,52,34,8 - CONTROL "Slider1",IDC_BUFFERDLG_PROGRESS_SLIDER, - "msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,38,100, - 120,18 - LTEXT "Progress:",IDC_STATIC,4,104,34,8 - RTEXT "",IDC_BUFFERDLG_PROGRESS_TEXT,158,111,16,8 - CONTROL "Spin3",IDC_BUFFERDLG_PROGRESS_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ARROWKEYS | UDS_HORZ,158,101,16,8 -END - -IDD_BUFFER3D DIALOGEX 0, 0, 276, 146 -STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_NOPARENTNOTIFY | WS_EX_ACCEPTFILES -MENU IDM_BUFFERDLG -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "&Play",IDC_BUFFERDLG_PLAY_BUTTON,4,84,37,14 - CONTROL "&Looped",IDC_BUFFERDLG_LOOPED_CHECK,"Button", - BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,45,84,37,14 - CONTROL "Disable 3D effects",IDC_BUFFERDLG_DISABLE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,6,105,80,8 - CONTROL "Slider3",IDC_BUFFERDLG_FREQ_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,87,27,85,15 - CONTROL "Slider4",IDC_BUFFERDLG_VOL_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,87,60,85,15 - CONTROL "Slider4",IDC_BUFFERDLG_OUTERVOL_SLIDER, - "msctls_trackbar32",TBS_NOTICKS,87,93,85,15 - CONTROL "Slider1",IDC_BUFFERDLG_PROGRESS_SLIDER, - "msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,38,122, - 120,18 - CONTROL "Spin3",IDC_BUFFERDLG_PROGRESS_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ARROWKEYS | UDS_HORZ,158,123,16,8 - CONTROL "Slider2",IDC_BUFFERDLG_X_SLIDER,"msctls_trackbar32", - WS_TABSTOP,182,14,60,12 - CONTROL "Slider2",IDC_BUFFERDLG_Y_SLIDER,"msctls_trackbar32", - WS_TABSTOP,182,32,60,12 - CONTROL "Slider2",IDC_BUFFERDLG_Z_SLIDER,"msctls_trackbar32", - WS_TABSTOP,182,50,60,12 - EDITTEXT IDC_BUFFERDLG_INNERANGLE_EDIT,210,75,30,14, - ES_AUTOHSCROLL,WS_EX_NOPARENTNOTIFY - CONTROL "Spin1",IDC_BUFFERDLG_INNERANGLE_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,235,75,9,14 - EDITTEXT IDC_BUFFERDLG_OUTERANGLE_EDIT,210,94,30,14, - ES_AUTOHSCROLL,WS_EX_NOPARENTNOTIFY - CONTROL "Spin1",IDC_BUFFERDLG_OUTERANGLE_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | - UDS_ARROWKEYS | UDS_NOTHOUSANDS,235,94,9,14 - GROUPBOX "3D Buffer Properties",IDC_STATIC,178,4,94,113 - LTEXT "Frequency:",IDC_STATIC,92,19,38,8 - LTEXT "Progress:",IDC_STATIC,4,126,34,8 - RTEXT "",IDC_BUFFERDLG_FREQ_TEXT,130,19,38,8 - LTEXT "Write Cursor:",IDC_STATIC,4,38,42,8 - LTEXT "Play Cursor:",IDC_STATIC,4,28,42,8 - RTEXT "",IDC_BUFFERDLG_WRITECURSOR_TEXT,48,38,34,8 - RTEXT "",IDC_BUFFERDLG_PLAYCURSOR_TEXT,48,28,34,8 - GROUPBOX "2D Buffer Properties",IDC_STATIC,86,4,88,113 - LTEXT "Inner Volume:",IDC_STATIC,92,50,46,8 - RTEXT "",IDC_BUFFERDLG_VOL_TEXT,138,50,30,8 - LTEXT "Focus Mode:",IDC_STATIC,4,62,48,8 - RTEXT "",IDC_BUFFERDLG_FOCUS_TEXT,52,62,30,8 - LTEXT "GetPos Mode:",IDC_STATIC,4,72,52,8,WS_DISABLED - RTEXT "",IDC_BUFFERDLG_GETPOS_TEXT,56,72,26,8,WS_DISABLED - LTEXT "Data Format:",IDC_STATIC,4,4,50,8 - RTEXT "",IDC_BUFFERDLG_DATAFORMAT_TEXT,4,14,74,8 - CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME | SS_SUNKEN,4,48,78, - 2 - CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME | SS_SUNKEN,4,24,78, - 2 - CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME | SS_SUNKEN,0,0,276, - 1 - LTEXT "Buffer Type:",IDC_STATIC,4,52,44,8 - RTEXT "",IDC_BUFFERDLG_BUFFERTYPE_TEXT,48,52,34,8 - LTEXT "X:",IDC_STATIC,242,16,8,8 - LTEXT "Y:",IDC_STATIC,242,34,8,8 - LTEXT "Z:",IDC_STATIC,242,52,8,8 - LTEXT "Outer Volume:",IDC_STATIC,92,83,46,8 - RTEXT "",IDC_BUFFERDLG_OUTERVOL_TEXT,138,83,30,8 - LTEXT "Inner:",IDC_STATIC,188,78,22,8 - LTEXT "Outer:",IDC_STATIC,188,96,22,8 - GROUPBOX "Cone Angles",IDC_STATIC,184,65,60,46 - LTEXT "",IDC_BUFFERDLG_PROGRESS_TEXT,158,133,16,8 - LTEXT "",IDC_BUFFERDLG_Z_TEXT,250,52,16,8 - LTEXT "",IDC_BUFFERDLG_Y_TEXT,250,34,16,8 - LTEXT "",IDC_BUFFERDLG_X_TEXT,250,16,16,8 -END - -IDD_3DLISTENER DIALOG DISCARDABLE 0, 0, 134, 116 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "3D Listener Object Settings" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Distance Factor:",IDC_STATIC,4,8,54,8 - EDITTEXT IDC_LISTENER_DISTANCEFACTOR_EDIT,58,4,34,14, - ES_AUTOHSCROLL - LTEXT "meters/unit",IDC_STATIC,94,8,36,8 - LTEXT "Doppler Factor:",IDC_STATIC,4,24,52,8,WS_DISABLED - EDITTEXT IDC_LISTENER_DOPPLERFACTOR_EDIT,58,20,34,14, - ES_AUTOHSCROLL | WS_DISABLED - LTEXT "times real",IDC_STATIC,94,24,34,8,WS_DISABLED - EDITTEXT IDC_LISTENER_ROLLOFFFACTOR_EDIT,58,36,34,14, - ES_AUTOHSCROLL - LTEXT "RollOff Factor:",IDC_STATIC,4,40,48,8 - LTEXT "times real",IDC_STATIC,94,40,34,8 - CONTROL "Slider1",IDC_LISTENER_X_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,6,62,86,15 - LTEXT "X:",IDC_STATIC,94,64,10,8 - LTEXT "",IDC_LISTENER_X_TEXT,104,64,22,8 - CONTROL "Slider1",IDC_LISTENER_Y_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,6,79,86,15 - LTEXT "Y:",IDC_STATIC,94,81,10,8 - LTEXT "",IDC_LISTENER_Y_TEXT,104,81,22,8 - CONTROL "Slider1",IDC_LISTENER_Z_SLIDER,"msctls_trackbar32", - TBS_NOTICKS | WS_TABSTOP,6,96,86,15 - LTEXT "Z:",IDC_STATIC,94,98,10,8 - LTEXT "",IDC_LISTENER_Z_TEXT,104,98,22,8 - GROUPBOX "Head Position",IDC_STATIC,4,52,126,60 -END - -IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 226, 126 -STYLE DS_ABSALIGN | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Settings" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Use DirectSound Default",IDC_SETTINGS_DSD_DEFAULT_CHECK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,14,100,10 - COMBOBOX IDC_SETTINGS_DSD_DEVICE_COMBO,8,36,156,33, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_SETTINGS_DSD_FORMAT_COMBO,8,62,156,78, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Use DirectSound Exclusive Mode", - IDC_SETTINGS_EXCLUSIVE_CHECK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,4,84,124,10 - CONTROL "Open 3D as Default",IDC_SETTINGS_OPEN3D_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,132,84,86,10 - EDITTEXT IDC_SETTINGS_INITIALDIR_EDIT,4,108,114,14,ES_AUTOHSCROLL - PUSHBUTTON "Browse...",IDC_SETTINGS_BROWSE_INITIALDIR_BUTTON,120, - 108,38,14 - COMBOBOX IDC_SETTINGS_FOCUS_COMBO,164,108,58,45,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,172,8,50,14 - PUSHBUTTON "Cancel",IDCANCEL,172,25,50,14 - GROUPBOX "DirectSound Device",IDC_STATIC,4,4,164,76 - LTEXT "Preferred Device:",IDC_SETTINGS_DSD_DEVICE_TEXT,8,26,60, - 8 - LTEXT "Preferred Output Format:",IDC_STATIC,8,52,84,8 - LTEXT "Initial Directory:",IDC_STATIC,4,98,54,8 - LTEXT "Default Focus:",IDC_STATIC,164,98,52,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_BUFFER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 171 - TOPMARGIN, 7 - BOTTOMMARGIN, 115 - END - - IDD_BUFFER3D, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 249 - TOPMARGIN, 7 - BOTTOMMARGIN, 111 - END - - IDD_3DLISTENER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 127 - TOPMARGIN, 7 - BOTTOMMARGIN, 109 - END - - IDD_SETTINGS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 219 - TOPMARGIN, 7 - BOTTOMMARGIN, 119 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_BUFFERTYPE_HARDWARE "Hardware" - IDS_BUFFERTYPE_SOFTWARE "Software" - IDS_FOCUSMODE_LOCAL "Local" - IDS_FOCUSMODE_STICKY "Sticky" - IDS_FOCUSMODE_GLOBAL "Global" - IDS_GETPOSMODE_NORMAL "Normal" - IDS_GETPOSMODE_GETPOS2 "Accurate (DX2)" - IDS_DATAFORMAT_STEREO "%u Hz %u bit, Stereo" - IDS_DATAFORMAT_MONO "%u Hz %u bit, Mono" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/dsshow3d/fileinfo.cpp b/sdk/samples/dsshow3d/fileinfo.cpp deleted file mode 100644 index 591fe2b..0000000 --- a/sdk/samples/dsshow3d/fileinfo.cpp +++ /dev/null @@ -1,1470 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// FileInfo.cpp -// -// Implementation of the FileInfo class, which is the main class used to -// data and user interface elements associated with a sound buffer in DSShow3D. -// -// - - -#include -#include -#include -#include -#include - -#include "DSShow3D.h" -#include "GVars.h" -#include "FileInfo.h" -#include "wave.h" -#include "debug.h" - - -int FileInfo::m_xNextPos = 0; -int FileInfo::m_yNextPos = 0; - -/////////////////////////////////////////////////////////////////////////////// -// FileInfo() -// -// Class constructor -- the pmw parameter defaults to NULL, but it should be -// something useful before the class is really used. -// -FileInfo::FileInfo( MainWnd *pmw ) -{ - m_pmwOwner = pmw; - m_pbData = NULL; - m_pwfx = NULL; - ZeroMemory( m_szFileName, sizeof(m_szFileName)); - m_nFileIndex = 0; - m_hwndInterface = NULL; - ZeroMemory( &m_ht, sizeof(HWNDTABLE)); - m_dwInternalFlags = 0; - m_fPlayButtonSaysPlay = TRUE; - - ZeroMemory( &m_dsbd, sizeof(DSBUFFERDESC)); - m_pDSB = NULL; -} - - -/////////////////////////////////////////////////////////////////////////////// -// ~FileInfo() -// -// Class destructor. -// -FileInfo::~FileInfo() -{ - m_pmwOwner = NULL; - - if( m_pDSB != NULL ) - { - m_pDSB->Release(); - m_pDSB = NULL; - } - if( m_pwfx ) - { - GlobalFree( m_pwfx ); - m_pwfx = NULL; - } - if( m_pbData ) - { - GlobalFree( m_pbData ); - m_pbData = NULL; - } -} - - -/////////////////////////////////////////////////////////////////////////////// -// SetFileName() -// -// Set the internal filename data variable and implicitly update the caption -// to reflect the change. -// -void FileInfo::SetFileName( LPSTR lpsz, int nIndx ) -{ - lstrcpy( m_szFileName, lpsz ); - m_nFileIndex = nIndx; - - // If this Assert fails, then we were handed a bad index value - ASSERT( m_nFileIndex < lstrlen( m_szFileName )); - - UpdateFileName(); -} - - -/////////////////////////////////////////////////////////////////////////////// -// LoadWave() -// -// Given a filename and an index to the partial filename (i.e. an index into -// the possibly full pathname where the actual filename begins), this function -// will do everything needed to load a file into the FileInfo structure. -// -// Returns 0 on success, non-zero on failure. -// -int FileInfo::LoadWave( LPSTR lpszFile, int nIndx ) -{ - SetFileName( lpszFile, nIndx ); - - // TODO: Need to add in support for ACM filters here - - // TODO: Need to determine what's "too big" to load static and then - // setup something for streaming the buffer instead. - if( WaveLoadFile( m_szFileName, &m_cbDataSize, &m_pwfx, &m_pbData ) != 0 ) - { - // There had better be a MainWnd object, or something is really messed - ASSERT( m_pmwOwner ); - m_pmwOwner->MessageBox( "Bad wave file or file too big to fit in memory", - MB_OK|MB_ICONSTOP ); - goto LW_Error; - } - - if( NewDirectSoundBuffer() != 0 ) - { - // There had better be a MainWnd object, or something is really messed - ASSERT( m_pmwOwner ); - m_pmwOwner->MessageBox( "Cannot create new DirectSoundBuffer object", - MB_OK|MB_ICONSTOP ); - goto LW_Error; - } - - m_dwInternalFlags |= FI_INTERNALF_LOADED; - - // If we haven't failed in loading so far, this point will be a valid - // pointer to the wave's data. - ASSERT( NULL != m_pbData ); - - // Create the ControlPod interface object - CreateInterface( m_pmwOwner->GetHwnd()); - - return 0; - -LW_Error: - return -1; -} - - -/////////////////////////////////////////////////////////////////////////////// -// NewDirectSoundBuffer() -// -// This function does all the work to create a new DirectSound buffer, and -// gets the interface pointers for both 2D and 3D (if the buffer is 3D). -// -int FileInfo::NewDirectSoundBuffer() - { - DSBCAPS dsbc; - HRESULT hr; - BYTE *pbWrite1 = NULL; - BYTE *pbWrite2 = NULL; - DWORD cbLen1; - DWORD cbLen2; - - /* Set up the direct sound buffer. */ - m_dsbd.dwSize = sizeof(DSBUFFERDESC); - - // We already set the flags to zero in the constructor. Don't do it again - // or we might wipe out anything a derived class has setup. - m_dsbd.dwFlags |= DSBCAPS_STATIC; - m_dsbd.dwFlags |= DSBCAPS_CTRLDEFAULT; // !!! default - // The derived class will pick its 3D flags - if( m_dwInternalFlags & IsSticky()) - { - ASSERT( !IsGlobal()); - m_dsbd.dwFlags |= DSBCAPS_STICKYFOCUS; - } - if( m_dwInternalFlags & IsGlobal()) - { - ASSERT( !IsSticky()); - m_dsbd.dwFlags |= DSBCAPS_GLOBALFOCUS; - } - - // This flag can only be set if the open dialog detected emulation and - // allowed the proper radio buttons to be enabled - if( m_dwInternalFlags & IsUsingGetPos2()) - m_dsbd.dwFlags |= DSBCAPS_GETCURRENTPOSITION2; - - m_dsbd.dwBufferBytes = m_cbDataSize; - m_dsbd.lpwfxFormat = m_pwfx; - - /* Make sure these are NULL before we start */ - m_pDSB = NULL; - - if( FAILED( hr = gpds->CreateSoundBuffer( &m_dsbd, &m_pDSB, NULL ))) - { - goto ERROR_IN_ROUTINE; - } - - /* Ok, lock the sucker down, and copy the memory to it. */ - if( FAILED( hr = m_pDSB->Lock( 0, m_cbDataSize, &pbWrite1, &cbLen1, - &pbWrite2, &cbLen2, 0L ))) - { - goto ERROR_IN_ROUTINE; - } - - ASSERT( pbWrite1 != NULL ); - ASSERT( cbLen1 == m_cbDataSize ); - - CopyMemory( pbWrite1, m_pbData, m_cbDataSize ); - - ASSERT( 0 == cbLen2 ); - ASSERT( NULL == pbWrite2 ); - - /* Ok, now unlock the buffer, we don't need it anymore. */ - if( FAILED( hr = m_pDSB->Unlock( pbWrite1, m_cbDataSize, pbWrite2, 0 ))) - { - goto ERROR_IN_ROUTINE; - } - - pbWrite1 = NULL; - - if (FAILED(hr = m_pDSB->SetVolume( MAXVOL_VAL ))) - { - goto ERROR_IN_ROUTINE; - } - - if (!Is3D()) { - if( FAILED( hr = m_pDSB->SetPan( MIDPAN_VAL ))) - { - goto ERROR_IN_ROUTINE; - } - } - - dsbc.dwSize = sizeof(dsbc); - if( hr = m_pDSB->GetCaps( &dsbc )) - { - goto ERROR_IN_ROUTINE; - } - - if( dsbc.dwFlags & DSBCAPS_LOCHARDWARE ) - { - m_dwInternalFlags |= FI_INTERNALF_HARDWARE; - } - else - { - m_dwInternalFlags &= ~FI_INTERNALF_HARDWARE; - } - - goto DONE_ROUTINE; - -ERROR_IN_ROUTINE: - if( pbWrite1 != NULL ) - { - hr = m_pDSB->Unlock( pbWrite1, m_cbDataSize, pbWrite2, 0 ); - pbWrite1 = NULL; - } - - if( NULL != m_pDSB ) - { - m_pDSB->Release(); - m_pDSB = NULL; - } - -DONE_ROUTINE: - return hr; - } - - -/////////////////////////////////////////////////////////////////////////////// -// SendDestroyRequest() -// -// Ask the owning window object to destroy us and remove any information -// it may be keeping about our existence. -// -void FileInfo::SendDestroyRequest() - { - // We must have an owner to send the request to. We should never - // have gotten any further than the CreateInterface() without one. - ASSERT( NULL != m_pmwOwner ); - - m_pmwOwner->DestroyFileInfo( this ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// SendDestroyRequest() -// -// Plays a buffer or updates playback flags according to some class state -// variables like our looping flag. -// -void FileInfo::PlayBuffer( void ) -{ - if( m_pDSB ) - { - if( IsLooped()) - m_pDSB->Play( 0, 0, DSBPLAY_LOOPING ); - else - m_pDSB->Play( 0, 0, 0 ); - - m_dwInternalFlags |= FI_INTERNALF_PLAYING; - } -} - - -/////////////////////////////////////////////////////////////////////////////// -// StopBuffer() -// -// Stop the buffer and reset it's position to the start. -// -void FileInfo::StopBuffer( void ) -{ - if( m_pDSB ) - { - m_pDSB->Stop(); - m_pDSB->SetCurrentPosition( 0 ); - - // Clear our internal state bit - m_dwInternalFlags &= ~FI_INTERNALF_PLAYING; - } -} - - -void FileInfo::Close( void ) - { - SendMessage( m_hwndInterface, WM_COMMAND, MAKELONG(IDCANCEL, 0), 0L ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// DuplicateBuffer() -// -// Initializes this FileInfo object by duplicating the given one. -// -void FileInfo::Duplicate( FileInfo *pfiSource ) - { - if( NULL == pfiSource || NULL == pfiSource->m_pDSB || - !(pfiSource->m_dwInternalFlags & FI_INTERNALF_LOADED)) - return; - - m_cbDataSize = pfiSource->m_cbDataSize; - m_nFileIndex = pfiSource->m_nFileIndex; - m_dwInternalFlags = pfiSource->m_dwInternalFlags; - m_pmwOwner = pfiSource->m_pmwOwner; - - m_pwfx = (PWAVEFORMATEX)new BYTE[sizeof(WAVEFORMATEX) - + pfiSource->m_pwfx->cbSize]; - m_pbData = new BYTE[pfiSource->m_cbDataSize]; - - CopyMemory( m_pbData, pfiSource->m_pbData, pfiSource->m_cbDataSize ); - CopyMemory( m_pwfx, pfiSource->m_pwfx, - sizeof(WAVEFORMATEX) + pfiSource->m_pwfx->cbSize); - CopyMemory( &m_dsbd, &pfiSource->m_dsbd, sizeof(m_dsbd)); - CopyMemory( &m_szFileName, pfiSource->m_szFileName, sizeof(m_szFileName)); - - ASSERT( NULL != pfiSource->m_pDSB ); - ASSERT( NULL != gpds ); - - HRESULT hr; - - if( FAILED( hr = gpds->DuplicateSoundBuffer(pfiSource->m_pDSB, &m_pDSB))) - { - DPF( 0, "Failed to DuplicateSoundBuffer() (%s)", TranslateDSError(hr)); - } - else - { - CreateInterface( m_pmwOwner->GetHwnd()); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// CreateInterface() -// -// Creates an interface window. A return of TRUE indicates success. -// -BOOL FileInfo::CreateInterface( HWND hwndOwner ) - { - m_hwndInterface = CreateDialogParam( ghInst, MAKEINTRESOURCE(IDD_BUFFER), - hwndOwner, (DLGPROC)FileInfoDlgProc, - (LPARAM)this ); - - if( NULL == m_hwndInterface ) - goto FICI_Fail; - - UpdateFileName(); - - CascadeWindow(); - - ShowWindow( m_hwndInterface, SW_SHOW ); - - // This flag tells us an interface window was successfully created - m_dwInternalFlags |= FI_INTERNALF_INTERFACE; - return TRUE; - - -FICI_Fail: - if( m_hwndInterface ) - { - DestroyWindow( m_hwndInterface ); - m_hwndInterface = NULL; - } - // Clear the flag that says we have a good interface window created - m_dwInternalFlags &= ~FI_INTERNALF_INTERFACE; - return FALSE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// ResetCascade() -// -// -// -void FileInfo::ResetCascade( void ) - { - POINT ptParent; - - ptParent.x = ptParent.y = 0; - ClientToScreen( m_pmwOwner->GetHwnd(), &ptParent ); - m_xNextPos = ptParent.x; - m_yNextPos = ptParent.y; - } - - -/////////////////////////////////////////////////////////////////////////////// -// MinimizeWindow() -// -// -// -void FileInfo::MinimizeWindow( void ) - { - ShowWindow( m_hwndInterface, SW_MINIMIZE ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// RestoreWindow() -// -// -// -void FileInfo::RestoreWindow( void ) - { - SendMessage( m_hwndInterface, WM_SYSCOMMAND, SC_RESTORE, 0L ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// CascadeWindow() -// -// -// -void FileInfo::CascadeWindow( void ) - { - RECT rcWind; - int nStep; - - // Don't move minimized windows - if( IsIconic( m_hwndInterface )) - return; - - GetWindowRect( m_hwndInterface, &rcWind ); - - if( m_xNextPos + (rcWind.right - rcWind.left) > GetSystemMetrics(SM_CXSCREEN)) - ResetCascade(); - else if( m_yNextPos + (rcWind.bottom - rcWind.top) > GetSystemMetrics(SM_CYSCREEN)) - ResetCascade(); - - SetWindowPos( m_hwndInterface, NULL, m_xNextPos, m_yNextPos, - 0, 0, SWP_NOSIZE | SWP_NOZORDER ); - // Move diagonally by the height of the title bar - nStep = GetSystemMetrics(SM_CYCAPTION); - m_xNextPos += nStep; - m_yNextPos += nStep; - } - - -/////////////////////////////////////////////////////////////////////////////// -// FileInfoDlgProc() -// -// Window message callback function for all Interface DLGs'. Route messages -// to message handler functions -// -BOOL CALLBACK FileInfoDlgProc( HWND hDlg, UINT message, - WPARAM wParam, LPARAM lParam ) - { - FileInfo *pfi; - - switch( message ) - { - // The first step is to stash our class object pointer in the user data - // and Initialize all our controls and internal data members. - case WM_INITDIALOG: - ASSERT( NULL != lParam ); - pfi = (FileInfo *)lParam; - SetWindowLong( hDlg, DWL_USER, (LONG)pfi ); - - if( !pfi->OnInitDialog( hDlg, wParam )) - { - DestroyWindow( hDlg ); - } - return TRUE; - - // By setting the global variable that tracks the active dialog, - // we can easily dispatch keyboard messages to the proper dialog - // through IsDialogMessage() in our main message pump. - case WM_ACTIVATE: - if( !wParam ) - ghDlgActive = NULL; - else - ghDlgActive = hDlg; - return TRUE; - - case WM_INITMENU: - pfi = (FileInfo*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi ); - return pfi->OnInitMenu( wParam, lParam ); - - case WM_DROPFILES: - pfi = (FileInfo*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi ); - return pfi->m_pmwOwner->SendMessage( WM_DROPFILES, wParam, lParam ); - - case WM_COMMAND: - pfi = (FileInfo*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi ); - return pfi->OnCommand( wParam, lParam ); - - // Handle this to deal with right-clicks on our controls -- we have a - // bunch of different context menus that we can popup - case WM_CONTEXTMENU: - pfi = (FileInfo*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi ); - return pfi->OnContextMenu( hDlg, LOWORD(lParam), HIWORD(lParam)); - - // Trackbar slider notifications come through here - case WM_HSCROLL: - pfi = (FileInfo*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi ); - return pfi->OnHScroll( LOWORD(wParam), (LONG)HIWORD(wParam), (HWND)lParam ); - - case WM_DESTROY: - pfi = (FileInfo*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi ); - pfi->OnDestroy(); - return TRUE; - - default: - return FALSE; - } - - ASSERT( FALSE ); - } - - -/* OnInitMenu() - * - * Updates the state of items on the menus in response to a WM_INITMENU - * message, which means the menu is about to be displayed. - */ -BOOL FileInfo::OnInitMenu( WPARAM wParam, LPARAM lParam ) - { - HMENU hSys = GetSystemMenu( m_hwndInterface, FALSE ); - - EnableMenuItem( hSys, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( hSys, SC_SIZE, MF_BYCOMMAND | MF_GRAYED ); - return TRUE; - } - - -/* OnInitDialog() - * - * Handles the initialization of the FilInfo interface window, which is - * actually a modeless dialog. - */ -BOOL FileInfo::OnInitDialog( HWND hDlg, WPARAM wParam ) - { - TCHAR szBuf1[64], tszFmt[64]; - - // Grab a bunch of handles and store them for easy access later - m_ht.hPlayButton = GetDlgItem( hDlg, IDC_BUFFERDLG_PLAY_BUTTON ); - m_ht.hLoopedCheck = GetDlgItem( hDlg, IDC_BUFFERDLG_LOOPED_CHECK ); - m_ht.hProgressSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_PROGRESS_SLIDER ); - m_ht.hProgressText = GetDlgItem( hDlg, IDC_BUFFERDLG_PROGRESS_TEXT ); - m_ht.hProgressSpin = GetDlgItem( hDlg, IDC_BUFFERDLG_PROGRESS_SPIN ); - m_ht.hFreqText = GetDlgItem( hDlg, IDC_BUFFERDLG_FREQ_TEXT ); - m_ht.hFreqSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_FREQ_SLIDER ); - m_ht.hVolText = GetDlgItem( hDlg, IDC_BUFFERDLG_VOL_TEXT ); - m_ht.hVolSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_VOL_SLIDER ); - m_ht.hPanText = GetDlgItem( hDlg, IDC_BUFFERDLG_PAN_TEXT ); - m_ht.hPanSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_PAN_SLIDER ); - m_ht.hPlayCursorText = GetDlgItem( hDlg, IDC_BUFFERDLG_PLAYCURSOR_TEXT ); - m_ht.hWriteCursorText = GetDlgItem( hDlg, IDC_BUFFERDLG_WRITECURSOR_TEXT ); - m_ht.hDataFormatText = GetDlgItem( hDlg, IDC_BUFFERDLG_DATAFORMAT_TEXT ); - m_ht.hBufferTypeText = GetDlgItem( hDlg, IDC_BUFFERDLG_BUFFERTYPE_TEXT ); - m_ht.hFocusModeText = GetDlgItem( hDlg, IDC_BUFFERDLG_FOCUS_TEXT ); - m_ht.hGetPosModeText = GetDlgItem( hDlg, IDC_BUFFERDLG_GETPOS_TEXT ); - - // Load, fill in and set the string describing the format of the sound data - if( m_pwfx->nChannels == 1 ) - LoadString( ghInst, IDS_DATAFORMAT_MONO, tszFmt, sizeof(tszFmt)-1); - else - LoadString( ghInst, IDS_DATAFORMAT_STEREO, tszFmt, sizeof(tszFmt)-1); - wsprintf( szBuf1, tszFmt, m_pwfx->nSamplesPerSec, m_pwfx->wBitsPerSample ); - - Static_SetText( m_ht.hDataFormatText, szBuf1 ); - - // Set the Buffer Type text to HARDWARE or SOFTWARE - if( IsHardware()) - LoadString( ghInst, IDS_BUFFERTYPE_HARDWARE, szBuf1, sizeof(szBuf1)-1); - else - LoadString( ghInst, IDS_BUFFERTYPE_SOFTWARE, szBuf1, sizeof(szBuf1)-1); - Static_SetText( m_ht.hBufferTypeText, szBuf1 ); - - // Set the focus type to LOCAL, STICKY, or GLOBAL - if( IsSticky()) - LoadString( ghInst, IDS_FOCUSMODE_STICKY, szBuf1, sizeof(szBuf1)-1); - else if( IsGlobal()) - LoadString( ghInst, IDS_FOCUSMODE_GLOBAL, szBuf1, sizeof(szBuf1)-1); - else - LoadString( ghInst, IDS_FOCUSMODE_LOCAL, szBuf1, sizeof(szBuf1)-1); - Static_SetText( m_ht.hFocusModeText, szBuf1 ); - - if( Is3D()) - { - Static_Enable( m_ht.hPanText, FALSE ); - Static_Enable( m_ht.hPanSlider, FALSE ); - } - - // Set the range, page size, etc. of our "slider" (trackbar) controls - SetSliders(); - - // Update the state of the UI elements that change - UpdateUI(); - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// OnContextMenu() -// -// Handles a right-click in the client area by popping up a menu if we have -// one we'd like to display, or returning otherwise. TRUE indicates the message -// was "handled" and no further processing is needed. FALSE means the message -// was not handled. -// -BOOL FileInfo::OnContextMenu( HWND hwnd, int x, int y ) - { - HMENU hm, hSub; - int nSubMenu = -1, idFrom = 0; - POINT pt = { x, y }; - RECT rectWind1, rectWind2; - - // Set the sub-menu to the Frequency context menu if we hit the Freq. Slider - // or text control - GetWindowRect( m_ht.hFreqSlider, &rectWind1 ); - GetWindowRect( m_ht.hFreqText, &rectWind2 ); - - if( PtInRect( &rectWind1, pt ) || PtInRect( &rectWind2, pt )) - nSubMenu = 0; - - // Set the sub-menu to the Volume context menu if we hit the Vol. Slider - // or text control - GetWindowRect( m_ht.hVolSlider, &rectWind1 ); - GetWindowRect( m_ht.hVolText, &rectWind2 ); - - if( PtInRect( &rectWind1, pt ) || PtInRect( &rectWind2, pt )) - nSubMenu = 1; - - // Only have pan on non-3D buffers - if (!Is3D()) - { - // Set the sub-menu to the Pan context menu if we hit the Pan Slider - // or text control - GetWindowRect( m_ht.hPanSlider, &rectWind1 ); - GetWindowRect( m_ht.hPanText, &rectWind2 ); - - if( PtInRect( &rectWind1, pt ) || PtInRect( &rectWind2, pt )) - nSubMenu = 2; - } - - // We didn't detect any "interesting" hotspots, so return as unprocessed. - if( nSubMenu < 0 ) - return FALSE; - - // If we make it here, we're gonna popup a context menu of some sort - - // Attempt to load our menu. If we fail, we still handled the message - // so return TRUE - if(( hm = LoadMenu( ghInst, MAKEINTRESOURCE(IDM_POPUPS))) == NULL ) - return TRUE; - - hSub = GetSubMenu( hm, nSubMenu ); - TrackPopupMenu( hSub, TPM_LEFTALIGN | TPM_RIGHTBUTTON, - pt.x, pt.y, 0, m_hwndInterface, NULL ); - - DestroyMenu( hm ); - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// SetSliders() -// -// Sets the range, page size, tic frequency, and other parameters of all the -// trackbar controls we use in the interface. -// -void FileInfo::SetSliders( void ) - { - DWORD dSampleRateRange = FREQ_SLIDER_MAX - FREQ_SLIDER_MIN; - UDACCEL udAccel; - - // Scale the sample rate range into an acceptable span and keep - // track of the multiplying constant we'll have to use later when - // we want to set positions based on real values - m_dwFreqSliderFactor = 1; - while( dSampleRateRange > 10000 ) - { - dSampleRateRange /= 10; - m_dwFreqSliderFactor *= 10; - } - - SendMessage( m_ht.hFreqSlider, TBM_SETRANGEMIN, - FALSE, (LPARAM)FREQ_SLIDER_MIN / m_dwFreqSliderFactor ); - SendMessage( m_ht.hFreqSlider, TBM_SETRANGEMAX, - FALSE, (LPARAM)FREQ_SLIDER_MAX / m_dwFreqSliderFactor ); - SendMessage( m_ht.hFreqSlider, TBM_SETPAGESIZE, 0, - FREQ_SLIDER_PAGESIZE_HZ / m_dwFreqSliderFactor ); - - SendMessage( m_ht.hProgressSpin, UDM_SETBUDDY, (WPARAM)m_ht.hProgressSlider, 0 ); - SendMessage( m_ht.hProgressSpin, UDM_SETRANGE, 0, MAKELONG(PROGRESS_MAX, PROGRESS_MIN)); - SendMessage( m_ht.hProgressSpin, UDM_SETPOS, 0, MAKELONG(0,0)); - udAccel.nSec = 0; - udAccel.nInc = PROGRESS_MAX / 20; - SendMessage( m_ht.hProgressSpin, UDM_SETACCEL, 1, (LPARAM)&udAccel ); - - SendMessage( m_ht.hProgressSlider, TBM_SETRANGEMIN, FALSE, (LPARAM)PROGRESS_MIN ); - SendMessage( m_ht.hProgressSlider, TBM_SETRANGEMAX, FALSE, (LPARAM)PROGRESS_MAX ); - SendMessage( m_ht.hProgressSlider, TBM_SETPAGESIZE, FALSE, (LPARAM)PROGRESS_MAX / 20 ); - SendMessage( m_ht.hProgressSlider, TBM_SETTICFREQ, (WPARAM)PROGRESS_TIC, 0 ); - - // Intentionally set the range backwards because a large number means - // a smaller value - SendMessage( m_ht.hVolSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(VOL_MIN + VOL_SLIDER_SHIFT) / VOL_SLIDER_FACTOR ); - SendMessage( m_ht.hVolSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(VOL_MAX + VOL_SLIDER_SHIFT) / VOL_SLIDER_FACTOR ); - SendMessage( m_ht.hVolSlider, TBM_SETPAGESIZE, 0, - VOL_SLIDER_PAGE / VOL_SLIDER_FACTOR ); - // NOTE: No TICs on the volume slider - - SendMessage( m_ht.hPanSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(PAN_MIN + PAN_SLIDER_SHIFT) / PAN_SLIDER_FACTOR ); - SendMessage( m_ht.hPanSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(PAN_MAX + PAN_SLIDER_SHIFT) / PAN_SLIDER_FACTOR ); - SendMessage( m_ht.hPanSlider, TBM_SETPAGESIZE, 0, - PAN_SLIDER_PAGE / PAN_SLIDER_FACTOR ); - // NOTE: No TICs on the pan slider - - // Update the display from the buffer's current settings - UpdateFreqUI( 0, TRUE ); - UpdateVolUI( 0, TRUE ); - UpdatePanUI( 0, TRUE ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateUI() -// -// This function is normally called from the MainWnd object's timer handler -// to refresh the UI elements that are time-dependent. These are things like -// the play and write cursors and the progress. -// -void FileInfo::UpdateUI( void ) - { - char szText[8]; - DWORD dwStatus, dwPlay, dwWrite; - - if( NULL == m_pDSB ) - return; - - if( FAILED( m_pDSB->GetStatus( &dwStatus ))) - return; - - if( dwStatus & DSBSTATUS_BUFFERLOST ) - { - LPBYTE pb1, pb2; - DWORD cb1, cb2; - - if( SUCCEEDED( m_pDSB->Restore())) - { - if( SUCCEEDED( m_pDSB->Lock( 0, m_cbDataSize, &pb1, &cb1, &pb2, &cb2, 0 ))) - { - ASSERT( m_cbDataSize == cb1 ); - if( NULL != m_pbData ) - CopyMemory( pb1, m_pbData, m_cbDataSize ); - m_pDSB->Unlock( pb1, m_cbDataSize, pb2, 0 ); - - if(IsPlaying()) - PlayBuffer(); - } - } - } - else - { - if( dwStatus & DSBSTATUS_PLAYING ) - SetPlaying( TRUE ); - else - SetPlaying( FALSE ); - } - - Button_SetCheck( m_ht.hLoopedCheck, IsLooped()); - - UpdatePlayButton(); - - m_pDSB->GetCurrentPosition( &dwPlay, &dwWrite ); - wsprintf( szText, "%u", dwPlay ); - Static_SetText( m_ht.hPlayCursorText, szText ); - wsprintf( szText, "%u", dwWrite ); - Static_SetText( m_ht.hWriteCursorText, szText ); - - UpdateProgressUI( dwPlay ); - - return; - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateProgressUI() -// -// -// -void FileInfo::UpdateProgressUI( DWORD dwPlayPos ) - { - char szText[8]; - FLOAT fPercentage; - - // TODO: Set the progress slider position - fPercentage = ((FLOAT)dwPlayPos / (FLOAT)(m_cbDataSize-1)); - - SendMessage( m_ht.hProgressSlider, TBM_SETPOS, TRUE, (LPARAM)(PROGRESS_MAX * fPercentage)); - SendMessage( m_ht.hProgressSpin, UDM_SETPOS, TRUE, MAKELONG((PROGRESS_MAX * fPercentage), 0)); - - wsprintf( szText, "%i%%", (int)(100 * fPercentage)); - Static_SetText( m_ht.hProgressText, szText ); - } - -/////////////////////////////////////////////////////////////////////////////// -// UpdateVolUI() -// -// Updates the position of the volume slider and text. You can specify that -// it get the volume from the buffer by passing TRUE to fFromBuffer, or you can -// specify a volume by putting it in lForceVol and setting fFromBuffer = FALSE. -// -void FileInfo::UpdateVolUI( LONG lForceVol, BOOL fFromBuffer ) - { - LONG lVol; - char szText[16]; - - if( fFromBuffer ) - { - if( NULL != m_pDSB ) - { - m_pDSB->GetVolume( &lVol ); - } - else - lVol = 0; - } - else - lVol = lForceVol; - - SendMessage( m_ht.hVolSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lVol + VOL_SLIDER_SHIFT) / VOL_SLIDER_FACTOR ); - - // Print volume in decibels - wsprintf( szText, "%i dB", lVol / 100 ); - - Static_SetText( m_ht.hVolText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdatePanUI() -// -// Updates the position of the panning slider and text. You can specify that -// it get the pan from the buffer by passing TRUE to fFromBuffer, or you can -// specify a pan by putting it in lForcePan and setting fFromBuffer = FALSE. -// -void FileInfo::UpdatePanUI( LONG lForcePan, BOOL fFromBuffer ) - { - LONG lPan; - char szText[16]; - - if ( Is3D()) - { - lForcePan = 0; - fFromBuffer = FALSE; - } - - if( fFromBuffer ) - { - if( NULL != m_pDSB ) - { - m_pDSB->GetPan( &lPan ); - } - else - lPan = 0; - } - else - lPan = lForcePan; - - SendMessage( m_ht.hPanSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPan + PAN_SLIDER_SHIFT) / PAN_SLIDER_FACTOR ); - - // Print pan in decibels - wsprintf( szText, "%i dB", lPan / 100 ); - - Static_SetText( m_ht.hPanText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateFreqUI() -// -// Updates the position of the freq slider and text. You can specify that -// it get the freq from the buffer by passing TRUE to fFromBuffer, or you can -// specify a freq by putting it in dwForceFreq and setting fFromBuffer = FALSE. -// -void FileInfo::UpdateFreqUI( DWORD dwForceFreq, BOOL fFromBuffer ) - { - DWORD dwFreq; - char szText[16]; - - if( fFromBuffer ) - { - if( NULL != m_pDSB ) - m_pDSB->GetFrequency( &dwFreq ); - else - dwFreq = 0; - } - else - dwFreq = dwForceFreq; - - SendMessage( m_ht.hFreqSlider, TBM_SETPOS, - (WPARAM)TRUE, (LPARAM)dwFreq / m_dwFreqSliderFactor ); - - wsprintf( szText, "%u Hz", dwFreq ); - - Static_SetText( m_ht.hFreqText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdatePlayButton() -// -// Uses an internal state flag and the "IsPlaying" flag to determine and set -// the proper text (Play/Stop) for the Play button. -// -void FileInfo::UpdatePlayButton( void ) - { - if( m_fPlayButtonSaysPlay && IsPlaying()) - { - // Set to "Stop" - m_fPlayButtonSaysPlay = FALSE; - Button_SetText( m_ht.hPlayButton, TEXT("Stop")); - } - else if( !m_fPlayButtonSaysPlay && !IsPlaying()) - { - // Set to "Play" - Button_SetText( m_ht.hPlayButton, TEXT("Play")); - m_fPlayButtonSaysPlay = TRUE; - } - else - return; - } - - -/////////////////////////////////////////////////////////////////////////////// -// OnHScroll() -// -// Main message handler for the WM_HSCROLL message. this function basically -// figures out which horizontal scrolling control is responsible for sending -// the message and passes on handling to an appropriate function for handling. -// -BOOL FileInfo::OnHScroll( WORD wNotification, LONG lPos, HWND hControl ) - { - if( !hControl ) - return FALSE; - - if( hControl == m_ht.hProgressSpin ) - { - HandleProgressSpinScroll( wNotification, lPos ); - return TRUE; - } - else if( hControl == m_ht.hProgressSlider ) - { - HandleProgressSliderScroll( wNotification, lPos ); - return TRUE; - } - else if( hControl == m_ht.hFreqSlider ) - { - HandleFreqSliderScroll( wNotification, lPos ); - return TRUE; - } - else if( hControl == m_ht.hVolSlider ) - { - HandleVolSliderScroll( wNotification, lPos ); - return TRUE; - } - else if( hControl == m_ht.hPanSlider ) - { - HandlePanSliderScroll( wNotification, lPos ); - return TRUE; - } - else - return FALSE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleFreqSliderScroll() -// -// Helper function for OnHScroll() which handles the WM_HSCROLL message for -// the Frequency slider. Figures out the next position, sets it, and updates -// the UI elements that are affected (text). -// -void FileInfo::HandleFreqSliderScroll( WORD wNot, LONG lPos ) - { - DWORD dwFreq; - - switch( wNot ) - { - case TB_THUMBTRACK: - if( NULL != m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency( lPos * m_dwFreqSliderFactor ))) - { - UpdateFreqUI( lPos * m_dwFreqSliderFactor, FALSE ); - } - } - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht.hFreqSlider, TBM_GETPOS, 0, 0 ); - if( NULL != m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency( lPos * m_dwFreqSliderFactor ))) - { - UpdateFreqUI( lPos * m_dwFreqSliderFactor, FALSE ); - } - else - { - if( SUCCEEDED( m_pDSB->GetFrequency( &dwFreq ))) - { - SendMessage( m_ht.hFreqSlider, TBM_SETPOS, - TRUE, dwFreq / m_dwFreqSliderFactor ); - } - } - } - break; - } - - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleProgressSliderScroll() -// -// -// -void FileInfo::HandleProgressSliderScroll( WORD wNot, LONG lPos ) - { - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - if( IsPlaying()) - fUpdate = FALSE; - break; - - case TB_ENDTRACK: - fUpdate = FALSE; - break; - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht.hProgressSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB ) - { - FLOAT fPercentage = ((FLOAT)lPos / 10000); - - m_pDSB->SetCurrentPosition( (DWORD)(fPercentage * (m_cbDataSize-1))); - UpdateUI(); -// UpdateProgressUI( (DWORD)(fPercentage * (m_cbDataSize-1))); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleProgressSpinScroll() -// -// -// -void FileInfo::HandleProgressSpinScroll( WORD wNot, LONG lPos ) - { - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case SB_THUMBPOSITION: - lPos = SendMessage( m_ht.hProgressSpin, UDM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB ) - { - FLOAT fPercentage = ((FLOAT)lPos / 10000); - - m_pDSB->SetCurrentPosition( (DWORD)(fPercentage * (m_cbDataSize-1))); - UpdateUI(); - UpdateProgressUI( (DWORD)(fPercentage * (m_cbDataSize-1))); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleVolSliderScroll() -// -// Helper function for OnHScroll() which handles the WM_HSCROLL message for -// the Volume slider. Figures out the next position, sets it, and updates -// the UI elements that are affected (text). -// -void FileInfo::HandleVolSliderScroll( WORD wNot, LONG lPos ) - { - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht.hVolSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB ) - { - m_pDSB->SetVolume( (lPos * VOL_SLIDER_FACTOR) - VOL_SLIDER_SHIFT ); - DPF( 1, "SetVolume: %i", (lPos * VOL_SLIDER_FACTOR) - VOL_SLIDER_SHIFT ); - UpdateVolUI( (lPos * VOL_SLIDER_FACTOR) - VOL_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandlePanSliderScroll() -// -// Helper function for OnHScroll() which handles the WM_HSCROLL message for -// the Pan slider. Figures out the next position, sets it, and updates the UI -// elements that are affected (text). -// -void FileInfo::HandlePanSliderScroll( WORD wNot, LONG lPos ) - { - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht.hPanSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB ) - { - m_pDSB->SetPan( (lPos * PAN_SLIDER_FACTOR) - PAN_SLIDER_SHIFT ); - UpdatePanUI( (lPos * PAN_SLIDER_FACTOR) - PAN_SLIDER_SHIFT, FALSE ); - } - } - - -/* OnDestroy() - * - */ -void FileInfo::OnDestroy() - { - SendDestroyRequest(); - return; - } - - -/////////////////////////////////////////////////////////////////////////////// -// OnCommand() -// -// Handles WM_COMMAND messages sent to the dialog interface. -// -BOOL FileInfo::OnCommand( WPARAM wParam, LPARAM lParam ) - { - ASSERT( NULL != m_hwndInterface ); - - // These three functions break out the handling of the WM_COMMAND messages - // that will be sent by various context menus. There's no real difference - // between these and other messages, but keeping them seperate emphasizes - // where they come from and keeps our switch a bit shorter. - if( HandleFreqContext( wParam ) || HandleVolContext( wParam ) - || HandlePanContext( wParam )) - { - return TRUE; - } - - switch( LOWORD( wParam )) - { - case ID_BUFFERDLG_FILE_OPEN: - // For convenience, the File|Open command is on the dialog's menu. - // If we see it, we should reflect it to the parent for processing. - ASSERT( NULL != m_pmwOwner ); - SendMessage( m_pmwOwner->GetHwnd(), WM_COMMAND, - MAKEWPARAM( IDC_FILE_OPEN, 0 ), 0L ); - break; - - case ID_BUFFERDLG_DUPLICATE: - m_pmwOwner->DuplicateBuffer( this ); - break; - - case IDCANCEL: - // This is what the dialog subsystem will send us when the user - // clicks the Close button from the caption bar or the System menu - DestroyWindow( m_hwndInterface ); - break; - - case IDC_BUFFERDLG_PLAY_BUTTON: - // Handle the Play button depending on whether or not the buffer is - // playing or stopped. - if( IsPlaying()) - { - StopBuffer(); - } - else - { - PlayBuffer(); - } - UpdatePlayButton(); - break; - - case IDC_BUFFERDLG_LOOPED_CHECK: - // Toggle the state of the looping flag with an XOR - m_dwInternalFlags ^= FI_INTERNALF_LOOPED; - - // Calling Play will update the looping state in DSound - if( IsPlaying()) - PlayBuffer(); - break; - - default: - // FALSE means we didn't want to deal with the message - return FALSE; - } - - // TRUE means we processed the message - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateFileName() -// -// Updates the file name which is displayed in the dialog window caption. -// -void FileInfo::UpdateFileName( void ) - { - if( NULL != m_hwndInterface ) - { - SendMessage( m_hwndInterface, WM_SETTEXT, 0L, - (LPARAM)&m_szFileName[m_nFileIndex] ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandlePanContext() -// -// Handle WM_COMMAND messages from the Pan context menu. Returns TRUE if a -// message was handled. -// -BOOL FileInfo::HandlePanContext( WPARAM wParam ) - { - switch( LOWORD( wParam )) - { - case ID_PANCONTEXT_CENTER: - if( m_pDSB ) - { - m_pDSB->SetPan(0); - UpdatePanUI( 0, FALSE ); - } - break; - case ID_PANCONTEXT_10DB_LEFT: - if( m_pDSB ) - { - m_pDSB->SetPan(-1000); - UpdatePanUI( -1000, FALSE ); - } - break; - case ID_PANCONTEXT_10DB_RIGHT: - if( m_pDSB ) - { - m_pDSB->SetPan(1000); - UpdatePanUI( 1000, FALSE ); - } - break; - case ID_PANCONTEXT_FULL_LEFT: - if( m_pDSB ) - { - m_pDSB->SetPan(-10000); - UpdatePanUI( -10000, FALSE ); - } - break; - case ID_PANCONTEXT_FULL_RIGHT: - if( m_pDSB ) - { - m_pDSB->SetPan(10000); - UpdatePanUI( 10000, FALSE ); - } - break; - - default: - return FALSE; - } - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleVolContext() -// -// Handle WM_COMMAND messages from the Vol context menu. Returns TRUE if a -// message was handled. -// -BOOL FileInfo::HandleVolContext( WPARAM wParam ) - { - switch( LOWORD( wParam )) - { - case ID_VOLCONTEXT_0DB: - if( m_pDSB ) - { - m_pDSB->SetVolume(0); - UpdateVolUI( 0, FALSE ); - } - break; - case ID_VOLCONTEXT_10DB: - if( m_pDSB ) - { - m_pDSB->SetVolume(-1000); - UpdateVolUI( -1000, FALSE ); - } - break; - case ID_VOLCONTEXT_20DB: - if( m_pDSB ) - { - m_pDSB->SetVolume(-2000); - UpdateVolUI( -2000, FALSE ); - } - break; - case ID_VOLCONTEXT_30DB: - if( m_pDSB ) - { - m_pDSB->SetVolume(-3000); - UpdateVolUI( -3000, FALSE ); - } - break; - case ID_VOLCONTEXT_100DB: - if( m_pDSB ) - { - m_pDSB->SetVolume(-10000); - UpdateVolUI( -10000, FALSE ); - } - break; - - default: - return FALSE; - } - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleFreqContext() -// -// Handle WM_COMMAND messages from the Freq context menu. Returns TRUE if a -// message was handled. -// -BOOL FileInfo::HandleFreqContext( WPARAM wParam ) - { - switch( LOWORD( wParam )) - { - case ID_FREQCONTEXT_FILEDEFAULT: - if( m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency(m_pwfx->nSamplesPerSec))) - UpdateFreqUI( m_pwfx->nSamplesPerSec, FALSE ); - } - break; - - case ID_FREQCONTEXT_8000HZ: - if( m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency(8000))) - UpdateFreqUI( 8000, FALSE ); - } - break; - - case ID_FREQCONTEXT_11025HZ: - if( m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency(11025))) - UpdateFreqUI( 11025, FALSE ); - } - break; - - case ID_FREQCONTEXT_22050HZ: - if( m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency(22050))) - UpdateFreqUI( 22050, FALSE ); - } - break; - - case ID_FREQCONTEXT_44100HZ: - if( m_pDSB ) - { - if( SUCCEEDED( m_pDSB->SetFrequency(44100))) - UpdateFreqUI( 44100, FALSE ); - } - break; - - default: - return FALSE; - } - return TRUE; - } - diff --git a/sdk/samples/dsshow3d/fileinfo.h b/sdk/samples/dsshow3d/fileinfo.h deleted file mode 100644 index 0ab6b8a..0000000 --- a/sdk/samples/dsshow3d/fileinfo.h +++ /dev/null @@ -1,194 +0,0 @@ -#ifndef __FILEINFO_H__ -#define __FILEINFO_H__ - - -#include -#include -#include - -#define FREQ_SLIDER_PAGESIZE_HZ 1000 // Move 1000 Hz per page -#define FREQ_SLIDER_MAX 100000 -#define FREQ_SLIDER_MIN 100 - -#define VOL_SLIDER_FACTOR 100 // Scaling factor -#define VOL_SLIDER_SHIFT 10000 // Offset (guarantees >0 range) -#define VOL_SLIDER_PAGE 500 -#define VOL_MIN -10000 -#define VOL_MAX 0 - -#define PAN_SLIDER_FACTOR 100 // Scaling factor -#define PAN_SLIDER_SHIFT 10000 // Offset (guarantees >0 range) -#define PAN_SLIDER_PAGE 500 -#define PAN_MIN -10000 -#define PAN_MAX 10000 - -#define PROGRESS_MIN 0 -#define PROGRESS_MAX 10000 -#define PROGRESS_TIC 1000 - -// Internal class state flags -#define FI_INTERNALF_3D 0x00000001 -#define FI_INTERNALF_HARDWARE 0x00000002 -#define FI_INTERNALF_LOOPED 0x00000004 -#define FI_INTERNALF_PLAYING 0x00000008 -#define FI_INTERNALF_LOST 0x00000010 -#define FI_INTERNALF_LOADED 0x00000020 -#define FI_INTERNALF_STATIC 0x00000040 -#define FI_INTERNALF_STREAMING 0x00000080 -#define FI_INTERNALF_USEGETPOS2 0x00000100 -#define FI_INTERNALF_INTERFACE 0x00000200 -#define FI_INTERNALF_STICKY 0x00000400 -#define FI_INTERNALF_GLOBAL 0x00000800 - -typedef struct tag_hwtable -{ - HWND hLoopedCheck; - HWND hProgressSlider, hProgressText, hProgressSpin; - HWND hFreqText, hFreqSlider; - HWND hVolText, hVolSlider; - HWND hPanText, hPanSlider; - HWND hDataFormatText; - HWND hPlayCursorText, hWriteCursorText; - HWND hBufferTypeText, hFocusModeText, hGetPosModeText; - HWND hPlayButton; - -} HWNDTABLE, *PHWNDTABLE; - -class FileInfo -{ -friend BOOL CALLBACK FileInfoDlgProc( HWND, UINT, WPARAM, LPARAM ); - -// Useful protected member functions -protected: - virtual BOOL OnInitDialog( HWND, WPARAM ); - virtual BOOL OnInitMenu( WPARAM, LPARAM ); - virtual BOOL OnCommand( WPARAM, LPARAM ); - virtual BOOL OnHScroll( WORD, LONG, HWND ); - virtual BOOL OnContextMenu( HWND, int, int ); - virtual void OnDestroy(); - - virtual BOOL CreateInterface( HWND ); - virtual void UpdateFileName( void ); - void UpdatePlayButton( void ); - - virtual void SetSliders( void ); - - void UpdateProgressUI( DWORD ); - void UpdateVolUI( LONG, BOOL ); - void UpdatePanUI( LONG, BOOL ); - void UpdateFreqUI( DWORD, BOOL ); - - void HandleFreqSliderScroll( WORD, LONG ); - void HandleVolSliderScroll( WORD, LONG ); - void HandlePanSliderScroll( WORD, LONG ); - void HandleProgressSliderScroll( WORD, LONG ); - void HandleProgressSpinScroll( WORD, LONG ); - - BOOL HandleFreqContext( WPARAM ); - BOOL HandleVolContext( WPARAM ); - BOOL HandlePanContext( WPARAM ); - - inline void SetInternalFlag( BOOL fSet, DWORD dwVal ) - { if( fSet ) m_dwInternalFlags |= dwVal; - else m_dwInternalFlags &= ~dwVal; } - -public: - FileInfo( class MainWnd *pmw = NULL ); - virtual ~FileInfo(); - - int LoadWave( LPSTR lpszFile, int nIndx ); - virtual int NewDirectSoundBuffer( void ); - void SetFileName( LPSTR lpsz, int nIndx ); - void PlayBuffer( void ); - void StopBuffer( void ); - - void Close( void ); - - virtual void UpdateUI( void ); - virtual void Duplicate( FileInfo * ); - - void CascadeWindow( void ); - void ResetCascade( void ); - void MinimizeWindow( void ); - void RestoreWindow( void ); - - void SetOwner( class MainWnd *pmw ) { if( pmw ) m_pmwOwner = pmw; } - - inline void Set3D( BOOL fNew ) - { SetInternalFlag( fNew, FI_INTERNALF_3D ); } - - inline void SetPlaying( BOOL fNew ) - { SetInternalFlag( fNew, FI_INTERNALF_PLAYING ); } - - inline void SetSticky( BOOL fNew ) - { SetInternalFlag( fNew, FI_INTERNALF_STICKY ); } - - inline void SetGlobal( BOOL fNew ) - { SetInternalFlag( fNew, FI_INTERNALF_GLOBAL ); } - - inline void SetLooped( BOOL fNew ) - { SetInternalFlag( fNew, FI_INTERNALF_LOOPED ); } - - inline void SetUseGetPos2( BOOL fNew ) - { SetInternalFlag( fNew, FI_INTERNALF_USEGETPOS2 ); } - - inline BOOL Is3D() - { return (m_dwInternalFlags & FI_INTERNALF_3D); } - - inline BOOL IsPlaying() - { return (m_dwInternalFlags & FI_INTERNALF_PLAYING ); } - - inline BOOL IsLooped() - { return (m_dwInternalFlags & FI_INTERNALF_LOOPED ); } - - inline BOOL IsSticky() - { return (m_dwInternalFlags & FI_INTERNALF_STICKY ); } - - inline BOOL IsGlobal() - { return (m_dwInternalFlags & FI_INTERNALF_GLOBAL ); } - - inline BOOL IsHardware() - { return (m_dwInternalFlags & FI_INTERNALF_HARDWARE ); } - - inline BOOL IsUsingGetPos2() - { return (m_dwInternalFlags & FI_INTERNALF_USEGETPOS2 ); } - - // Send a request to the owner MainWnd object that this object be - // destroyed, which may involve more than a simple delete (like removal - // from a list or something). - void SendDestroyRequest( void ); - -// Member data -protected: - LPBYTE m_pbData; // Pointer to actual data of file. - UINT m_cbDataSize; // Size of data. - LPWAVEFORMATEX m_pwfx; // Pointer to waveformatex structure. - DSBUFFERDESC m_dsbd; - - DWORD m_dwFreqSliderFactor; // Scaling factor - - DWORD m_dwInternalFlags; // A bit field of flags - - HWND m_hwndInterface; - HWNDTABLE m_ht; // A table of all the control HWND's - - BOOL m_fPlayButtonSaysPlay; - - char m_szFileName[MAX_PATH]; - int m_nFileIndex; // Index to filename, without dir. - - class MainWnd* m_pmwOwner; - - LPDIRECTSOUNDBUFFER m_pDSB; // Pointer to direct sound buffer. - - static int m_xNextPos, m_yNextPos; -}; - -typedef FileInfo * PFILEINFO; - -BOOL CALLBACK FileInfoDlgProc( HWND, UINT, WPARAM, LPARAM ); - - -#endif // __FILEINFO_H__ - - diff --git a/sdk/samples/dsshow3d/finfo3d.cpp b/sdk/samples/dsshow3d/finfo3d.cpp deleted file mode 100644 index 67cd01a..0000000 --- a/sdk/samples/dsshow3d/finfo3d.cpp +++ /dev/null @@ -1,979 +0,0 @@ -#include -#include -#include -#include -#include - -#include "wave.h" -#include "debug.h" -#include "DSShow3D.h" -#include "FInfo3D.h" -#include "GVars.h" - - -/////////////////////////////////////////////////////////////////////////////// -// FileInfo3D() -// -// Class constructor for the 3D interface/information class. -// -FileInfo3D::FileInfo3D( MainWnd * pmw ) : FileInfo( pmw ) - { - ZeroMemory( &m_ht3d, sizeof(HWNDTABLE3D)); - ZeroMemory( &m_vPos, sizeof(D3DVECTOR)); - m_pDSB3D = NULL; - - m_dwInternalFlags |= FI_INTERNALF_3D; - - m_dwInnerAngle = FI3D_DEFAULT_INNER_ANGLE; - m_dwOuterAngle = FI3D_DEFAULT_OUTER_ANGLE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// ~FileInfo3D() -// -// Virtual destructor for the FileInfo3D class. Should deallocate any space -// allocated by the constructor. -// -FileInfo3D::~FileInfo3D() - { - // If we do an allocation of memory specific to the FileInfo3D class, - // we should free it here. - - // Release the 3D interface - if( m_pDSB3D != NULL ) - { - m_pDSB3D->Release(); - m_pDSB3D = NULL; - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// NewDirectSoundBuffer() -// -// Virtual function which handles opening a new sound bufer by setting some -// flags and calling down to the base class handler, which actually does most -// of the work. Upon return, this function will do a bit more work to get a 3D -// interface. -// -int FileInfo3D::NewDirectSoundBuffer() - { - HRESULT hr; - - m_dsbd.dwFlags = DSBCAPS_CTRL3D; - - if( !FileInfo::NewDirectSoundBuffer()) - { - // Try to grab the 3D interface pointer - - if( FAILED( hr = m_pDSB->QueryInterface( IID_IDirectSound3DBuffer, - (void **)&m_pDSB3D ))) - { - DPF( 0, "QI for DS3DBuffer interface: %s", TranslateDSError(hr)); - return -1; - } - return 0; - } - else - return -1; - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL FileInfo3D::OnInitDialog( HWND hDlg, WPARAM wParam ) - { - HRESULT hr; - char szTS[6]; - - // Grab some 3D interface HWND's and pass along to the base class - m_ht3d.hXSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_X_SLIDER ); - m_ht3d.hYSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_Y_SLIDER ); - m_ht3d.hZSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_Z_SLIDER ); - m_ht3d.hOuterVolSlider = GetDlgItem( hDlg, IDC_BUFFERDLG_OUTERVOL_SLIDER ); - m_ht3d.hOuterVolText = GetDlgItem( hDlg, IDC_BUFFERDLG_OUTERVOL_TEXT ); - m_ht3d.hInnerAngleEdit = GetDlgItem( hDlg, IDC_BUFFERDLG_INNERANGLE_EDIT ); - m_ht3d.hInnerAngleSpin = GetDlgItem( hDlg, IDC_BUFFERDLG_INNERANGLE_SPIN ); - m_ht3d.hOuterAngleEdit = GetDlgItem( hDlg, IDC_BUFFERDLG_OUTERANGLE_EDIT ); - m_ht3d.hOuterAngleSpin = GetDlgItem( hDlg, IDC_BUFFERDLG_OUTERANGLE_SPIN ); - m_ht3d.hXText = GetDlgItem( hDlg, IDC_BUFFERDLG_X_TEXT ); - m_ht3d.hYText = GetDlgItem( hDlg, IDC_BUFFERDLG_Y_TEXT ); - m_ht3d.hZText = GetDlgItem( hDlg, IDC_BUFFERDLG_Z_TEXT ); - m_ht3d.hDisable3D = GetDlgItem( hDlg, IDC_BUFFERDLG_DISABLE ); - - // The tab order in the dialog must be such that the spin control is - // immediately after the edit control it is expected to auto-buddy to. - // That case is tested here. - ASSERT( (HWND)SendMessage( m_ht3d.hInnerAngleSpin, - UDM_GETBUDDY, 0, 0 ) == m_ht3d.hInnerAngleEdit ); - - // If this fails, the tab order in the dialog resource is wrong (see above) - ASSERT( (HWND)SendMessage( m_ht3d.hOuterAngleSpin, - UDM_GETBUDDY, 0, 0 ) == m_ht3d.hOuterAngleEdit ); - - SendMessage( m_ht3d.hInnerAngleSpin, UDM_SETRANGE, 0, MAKELONG( 360, 0 )); - SendMessage( m_ht3d.hOuterAngleSpin, UDM_SETRANGE, 0, MAKELONG( 360, 0 )); - - SendMessage( m_ht3d.hInnerAngleSpin, UDM_SETPOS, - 0, MAKELONG(m_dwInnerAngle, 0)); - wsprintf( szTS, "%u", m_dwInnerAngle ); - Edit_SetText( m_ht3d.hInnerAngleEdit, szTS ); - - SendMessage( m_ht3d.hOuterAngleSpin, UDM_SETPOS, - 0, MAKELONG(m_dwOuterAngle, 0)); - wsprintf( szTS, "%u", m_dwOuterAngle ); - Edit_SetText( m_ht3d.hOuterAngleEdit, szTS ); - - if( m_pDSB3D ) - { - if( FAILED( hr = m_pDSB3D->SetConeAngles( m_dwInnerAngle, - m_dwOuterAngle, DS3D_IMMEDIATE ))) - DPF( 0, "SetConeAngles: %s", TranslateDSError(hr)); - - m_pDSB3D->GetPosition( &m_vPos ); - } - - return FileInfo::OnInitDialog( hDlg, wParam ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL FileInfo3D::OnCommand( WPARAM wParam, LPARAM lParam ) - { - BOOL fRet = FALSE; - - if( HandleOuterVolContext( wParam ) || HandlePositionContext( wParam )) - fRet = TRUE; - else if( HandleConeInnerEditNotify( wParam, lParam )) - fRet = TRUE; - else if( HandleConeOuterEditNotify( wParam, lParam )) - fRet = TRUE; - else if( HandleDisableNotify( wParam, lParam )) - fRet = TRUE; - else - fRet = FileInfo::OnCommand( wParam, lParam ); - - return fRet; - } - - -/////////////////////////////////////////////////////////////////////////////// -// OnHScroll() -// -// -// -BOOL FileInfo3D::OnHScroll( WORD wNotification, LONG lPos, HWND hControl ) - { - if( !hControl ) - return FALSE; - if( hControl == m_ht3d.hOuterVolSlider ) - HandleOuterVolSliderScroll( wNotification, lPos ); - else if( hControl == m_ht3d.hXSlider ) - HandleXSliderScroll( wNotification, lPos ); - else if( hControl == m_ht3d.hYSlider ) - HandleYSliderScroll( wNotification, lPos ); - else if( hControl == m_ht3d.hZSlider ) - HandleZSliderScroll( wNotification, lPos ); - // All messages we don't handle pass through to the base class - else - return FileInfo::OnHScroll( wNotification, lPos, hControl ); - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::HandleOuterVolSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht3d.hOuterVolSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB3D ) - { -// DPF( 3, "SetConeOutsideVolume: %i", ( lPos * VOL_SLIDER_FACTOR ) - VOL_SLIDER_SHIFT ); - if( FAILED( hr = m_pDSB3D->SetConeOutsideVolume(( lPos * VOL_SLIDER_FACTOR ) - - VOL_SLIDER_SHIFT, DS3D_IMMEDIATE ))) - DPF( 0, "SetConeOutsideVolume: %s", TranslateDSError(hr)); - UpdateOuterVolUI(( lPos * VOL_SLIDER_FACTOR ) - VOL_SLIDER_SHIFT, - FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::HandleXSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht3d.hXSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB3D ) - { - m_vPos.x = D3DVAL(lPos * X_SLIDER_FACTOR) - POS_SLIDER_SHIFT; -// DPF( 3, "Setting buffer pos: (%i, %i, %i)", -// (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z ); - if( FAILED( hr = m_pDSB3D->SetPosition( m_vPos.x, m_vPos.y, - m_vPos.z, DS3D_IMMEDIATE ))) - DPF( 0, "SetPosition: %s", TranslateDSError(hr)); - UpdateXSliderUI((lPos * X_SLIDER_FACTOR) - POS_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::HandleYSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht3d.hYSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB3D ) - { - m_vPos.y = D3DVAL(lPos * Y_SLIDER_FACTOR) - POS_SLIDER_SHIFT; -// DPF( 3, "Setting buffer pos: (%i, %i, %i)", -// (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z ); - if( FAILED( hr = m_pDSB3D->SetPosition( m_vPos.x, m_vPos.y, - m_vPos.z, DS3D_IMMEDIATE ))) - DPF( 0, "SetPosition: %s", TranslateDSError(hr)); - UpdateYSliderUI((lPos * Y_SLIDER_FACTOR) - POS_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::HandleZSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_ht3d.hZSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != m_pDSB3D ) - { - m_vPos.z = D3DVAL(lPos * Z_SLIDER_FACTOR) - POS_SLIDER_SHIFT; -// DPF( 3, "Setting buffer pos: (%i, %i, %i)", -// (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z ); - if( FAILED( hr = m_pDSB3D->SetPosition( m_vPos.x, m_vPos.y, - m_vPos.z, DS3D_IMMEDIATE ))) - DPF( 0, "SetPosition: %s", TranslateDSError(hr)); - UpdateZSliderUI((lPos * Z_SLIDER_FACTOR) - POS_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateOuterVolUI() -// -// -// -// -// -void FileInfo3D::UpdateOuterVolUI( LONG lForceVol, BOOL fFromBuffer ) - { - HRESULT hr; - LONG lVol; - char szText[16]; - - if( fFromBuffer ) - { - if( NULL != m_pDSB3D ) - { - if( FAILED( hr = m_pDSB3D->GetConeOutsideVolume( &lVol ))) - DPF( 0, "GetConeOutsideVolume: %s", TranslateDSError(hr)); - } - else - lVol = 0; - } - else - lVol = lForceVol; - - SendMessage( m_ht3d.hOuterVolSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lVol + VOL_SLIDER_SHIFT) / VOL_SLIDER_FACTOR ); - - // Print volume in decibels - wsprintf( szText, "%i dB", lVol / 100 ); - - Static_SetText( m_ht3d.hOuterVolText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL FileInfo3D::OnContextMenu( HWND hDlg, int x, int y ) - { - HMENU hm, hSub; - int nSubMenu = -1; - POINT pt = { x, y }; - RECT rectWind1, rectWind2, rectWind3; - - // Set the sub-menu to the Outer Volume context menu if we hit the proper - // slider or text control - GetWindowRect( m_ht3d.hOuterVolSlider, &rectWind1 ); - GetWindowRect( m_ht3d.hOuterVolText, &rectWind2 ); - - if( PtInRect( &rectWind1, pt ) || PtInRect( &rectWind2, pt )) - nSubMenu = 3; - - // Set the POS_CONTEXT submenu if there's a click on the position sliders - // or text controls - GetWindowRect( m_ht3d.hXSlider, &rectWind1 ); - GetWindowRect( m_ht3d.hYSlider, &rectWind2 ); - GetWindowRect( m_ht3d.hZSlider, &rectWind3 ); - - if( PtInRect( &rectWind1, pt ) || PtInRect( &rectWind2, pt ) - || PtInRect( &rectWind3, pt )) - nSubMenu = 4; - - GetWindowRect( m_ht3d.hXText, &rectWind1 ); - GetWindowRect( m_ht3d.hYText, &rectWind2 ); - GetWindowRect( m_ht3d.hZText, &rectWind3 ); - - if( PtInRect( &rectWind1, pt ) || PtInRect( &rectWind2, pt ) - || PtInRect( &rectWind3, pt )) - nSubMenu = 4; - - // We didn't detect any "interesting" hotspots, so pass along to base class - if( nSubMenu < 0 ) - return FileInfo::OnContextMenu( hDlg, x, y ); - - // If we make it here, we're gonna popup a context menu of some sort - - // Attempt to load our menu. If we fail, we still handled the message - // so return TRUE - if(( hm = LoadMenu( ghInst, MAKEINTRESOURCE(IDM_POPUPS))) == NULL ) - return TRUE; - - hSub = GetSubMenu( hm, nSubMenu ); - TrackPopupMenu( hSub, TPM_LEFTALIGN | TPM_RIGHTBUTTON, - pt.x, pt.y, 0, m_hwndInterface, NULL ); - - DestroyMenu( hm ); - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::OnDestroy() - { - FileInfo::OnDestroy(); - return; - } - - -void FileInfo3D::Duplicate( FileInfo *pfiSource ) - { - HRESULT hr; - - FileInfo::Duplicate( pfiSource ); - - if( FAILED( hr = m_pDSB->QueryInterface( IID_IDirectSound3DBuffer, - (void **)&m_pDSB3D ))) - { - DPF( 0, "QI for DS3DBuffer interface: %s", TranslateDSError(hr)); - } - else - { - // Update the UI from the interface we just got - UpdateOuterVolUI( 0, TRUE ); - UpdateXSliderUI( 0, TRUE ); - UpdateYSliderUI( 0, TRUE ); - UpdateZSliderUI( 0, TRUE ); - - m_pDSB3D->GetConeAngles( &m_dwInnerAngle, &m_dwOuterAngle ); - - DWORD dwMode; - char szTS[6]; - - SendMessage( m_ht3d.hInnerAngleSpin, UDM_SETPOS, - 0, MAKELONG(m_dwInnerAngle, 0)); - wsprintf( szTS, "%u", m_dwInnerAngle ); - Edit_SetText( m_ht3d.hInnerAngleEdit, szTS ); - - SendMessage( m_ht3d.hOuterAngleSpin, UDM_SETPOS, - 0, MAKELONG(m_dwOuterAngle, 0)); - wsprintf( szTS, "%u", m_dwOuterAngle ); - Edit_SetText( m_ht3d.hOuterAngleEdit, szTS ); - - m_pDSB3D->GetMode( &dwMode ); - Button_SetCheck( m_ht3d.hDisable3D, dwMode == DS3DMODE_DISABLE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// CreateInterface() -// -// Very similar to the interface creation code for 2D objects, but creates a -// different dialog. (Eventually may do more stuff related to D3D display). -// -BOOL FileInfo3D::CreateInterface( HWND hwndOwner ) - { - m_hwndInterface = CreateDialogParam( ghInst, MAKEINTRESOURCE(IDD_BUFFER3D), - hwndOwner, (DLGPROC)FileInfo3DDlgProc, - (LPARAM)this ); - - if( NULL == m_hwndInterface ) - goto FICI_Fail; - else - UpdateFileName(); - - CascadeWindow(); - ShowWindow( m_hwndInterface, SW_SHOW ); - - // This flag tells us an interface window was successfully created - m_dwInternalFlags |= FI_INTERNALF_INTERFACE; - return TRUE; - - -FICI_Fail: - if( m_hwndInterface ) - { - DestroyWindow( m_hwndInterface ); - m_hwndInterface = NULL; - } - // Clear the flag that says we have a good interface window created - m_dwInternalFlags &= ~FI_INTERNALF_INTERFACE; - return FALSE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::SetSliders( void ) - { - // Do 3D controls slider initialization - - // Intentionally set the range backwards because a large number means - // a smaller value - SendMessage( m_ht3d.hOuterVolSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(VOL_MIN + VOL_SLIDER_SHIFT) / VOL_SLIDER_FACTOR ); - SendMessage( m_ht3d.hOuterVolSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(VOL_MAX + VOL_SLIDER_SHIFT) / VOL_SLIDER_FACTOR ); - SendMessage( m_ht3d.hOuterVolSlider, TBM_SETPAGESIZE, 0, - VOL_SLIDER_PAGE / VOL_SLIDER_FACTOR ); - // NOTE: No TICs on the cone volume slider - - SendMessage( m_ht3d.hXSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(POS_SLIDER_MIN + POS_SLIDER_SHIFT) / X_SLIDER_FACTOR ); - SendMessage( m_ht3d.hXSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(POS_SLIDER_MAX + POS_SLIDER_SHIFT) / X_SLIDER_FACTOR ); - SendMessage( m_ht3d.hXSlider, TBM_SETPAGESIZE, 0, X_SLIDER_FACTOR ); - - SendMessage( m_ht3d.hYSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(POS_SLIDER_MIN + POS_SLIDER_SHIFT) / Y_SLIDER_FACTOR ); - SendMessage( m_ht3d.hYSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(POS_SLIDER_MAX + POS_SLIDER_SHIFT) / Y_SLIDER_FACTOR ); - SendMessage( m_ht3d.hYSlider, TBM_SETPAGESIZE, 0, Y_SLIDER_FACTOR ); - - SendMessage( m_ht3d.hZSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(POS_SLIDER_MIN + POS_SLIDER_SHIFT) / Z_SLIDER_FACTOR ); - SendMessage( m_ht3d.hZSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(POS_SLIDER_MAX + POS_SLIDER_SHIFT) / Z_SLIDER_FACTOR ); - SendMessage( m_ht3d.hZSlider, TBM_SETPAGESIZE, 0, Z_SLIDER_FACTOR ); - -// SendMessage( m_ht3d.hOuterVolSlider, TBM_SETPAGESIZE, 0, -// VOL_SLIDER_PAGE / VOL_SLIDER_FACTOR ); - // NOTE: No TICs on the position sliders - - // Update the display from the buffer's current settings - UpdateOuterVolUI( 0, TRUE ); - UpdateXSliderUI( 0, TRUE ); - UpdateYSliderUI( 0, TRUE ); - UpdateZSliderUI( 0, TRUE ); - - FileInfo::SetSliders(); - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FileInfo3D::UpdateUI( void ) - { - FileInfo::UpdateUI(); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateFileName() -// -// Updates the file name which is displayed in the dialog window caption. -// -void FileInfo3D::UpdateFileName( void ) - { - char szTitle[MAX_PATH + 5]; - - if( NULL != m_hwndInterface ) - { - lstrcpy( szTitle, &m_szFileName[m_nFileIndex] ); - lstrcat( szTitle, TEXT(" (3D)")); - SendMessage( m_hwndInterface, WM_SETTEXT, 0L, (LPARAM)szTitle ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// FileInfo3DDlgProc() -// -// -// -BOOL CALLBACK FileInfo3DDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - FileInfo3D *pfi3d; - - switch( message ) - { - // The first step is to stash our class object pointer in the user data - // and Initialize all our controls and internal data members. - case WM_INITDIALOG: - ASSERT( NULL != lParam ); - pfi3d = (FileInfo3D *)lParam; - SetWindowLong( hDlg, DWL_USER, (LONG)pfi3d ); - - if( !pfi3d->OnInitDialog( hDlg, wParam )) - { - DestroyWindow( hDlg ); - } - return TRUE; - - case WM_COMMAND: - pfi3d = (FileInfo3D*)GetWindowLong( hDlg, DWL_USER ); - // It's possible to get notification messages from child controls - // before we have been given a WM_INITDIALOG message. This is not - // a good thing for dereferencing the pointer because we won't have - // class info. Specifically, the spin controls in our dialog force - // the edit control to send EN_CHANGE and EN_UPDATE messages when - // they set the text of the edit control they're tied to. - if( NULL == pfi3d || NULL == pfi3d->m_hwndInterface ) - return FALSE; - return !pfi3d->OnCommand( wParam, lParam ); - - // Handle this to deal with right-clicks on our controls -- we have a - // bunch of different context menus that we can popup - case WM_CONTEXTMENU: - pfi3d = (FileInfo3D*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi3d ); - return pfi3d->OnContextMenu( hDlg, LOWORD(lParam), HIWORD(lParam)); - - // Trackbar slider notifications come through here - case WM_HSCROLL: - pfi3d = (FileInfo3D*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi3d ); - return pfi3d->OnHScroll( LOWORD(wParam), (LONG)HIWORD(wParam), (HWND)lParam ); - - case WM_DESTROY: - pfi3d = (FileInfo3D*)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pfi3d ); - pfi3d->OnDestroy(); - return TRUE; - - default: - return FileInfoDlgProc( hDlg, message, wParam, lParam ); - } - - ASSERT( FALSE ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandleOuterVolContext() -// -// Pre-process the parameters to WM_COMMAND messages we get and sees if we -// knows how to handle any of them. We know how to handle any message that -// comes from the Outer Volume controls' context menu. -// -BOOL FileInfo3D::HandleOuterVolContext( WPARAM wParam ) - { - HRESULT hr; - - switch( wParam ) - { - case ID_OUTERVOLCONTEXT_0DB: - if( FAILED( hr = m_pDSB3D->SetConeOutsideVolume( 0, - DS3D_IMMEDIATE ))) - DPF( 0, "SetConeOutsideVolume: %s", TranslateDSError(hr)); - UpdateOuterVolUI( 0, TRUE ); - break; - - case ID_OUTERVOLCONTEXT_10DB: - if( FAILED( hr = m_pDSB3D->SetConeOutsideVolume( -1000, - DS3D_IMMEDIATE ))) - DPF( 0, "SetConeOutsideVolume: %s", TranslateDSError(hr)); - UpdateOuterVolUI( -1000, TRUE ); - break; - - case ID_OUTERVOLCONTEXT_20DB: - if( FAILED( hr = m_pDSB3D->SetConeOutsideVolume( -2000, - DS3D_IMMEDIATE ))) - DPF( 0, "SetConeOutsideVolume: %s", TranslateDSError(hr)); - UpdateOuterVolUI( -2000, TRUE ); - break; - - case ID_OUTERVOLCONTEXT_30DB: - if( FAILED( hr = m_pDSB3D->SetConeOutsideVolume( -3000, - DS3D_IMMEDIATE ))) - DPF( 0, "SetConeOutsideVolume: %s", TranslateDSError(hr)); - UpdateOuterVolUI( -3000, TRUE ); - break; - - case ID_OUTERVOLCONTEXT_100DB: - if( FAILED( hr = m_pDSB3D->SetConeOutsideVolume( -10000, - DS3D_IMMEDIATE ))) - DPF( 0, "SetConeOutsideVolume: %s", TranslateDSError(hr)); - UpdateOuterVolUI( -10000, TRUE ); - break; - - default: - return FALSE; - } - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// HandlePositionContext() -// -// Pre-process the parameters to WM_COMMAND messages we get and sees if we -// knows how to handle any of them. We know how to handle any message that -// comes from the Position controls' context menu. -// -BOOL FileInfo3D::HandlePositionContext( WPARAM wParam ) - { - D3DVECTOR d3dListener; - - switch( wParam ) - { - case ID_POSCONTEXT_ORIGIN: - ASSERT( NULL != m_pDSB3D ); - m_pDSB3D->SetPosition( D3DVAL(0), D3DVAL(0), D3DVAL(0), DS3D_IMMEDIATE ); - UpdateXSliderUI( 0, TRUE ); - UpdateYSliderUI( 0, TRUE ); - UpdateZSliderUI( 0, TRUE ); - break; - - case ID_POSCONTEXT_LISTENERPOSITION: - ASSERT( NULL != m_pDSB3D ); - ASSERT( NULL != gp3DListener ); - gp3DListener->GetPosition( &d3dListener ); - m_pDSB3D->SetPosition( d3dListener.x, d3dListener.y, - d3dListener.z, DS3D_IMMEDIATE ); - UpdateXSliderUI( (DWORD)d3dListener.x, TRUE ); - UpdateYSliderUI( (DWORD)d3dListener.y, TRUE ); - UpdateZSliderUI( (DWORD)d3dListener.z, TRUE ); - break; - - default: - return FALSE; - } - - return TRUE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateXSliderUI() -// -// Update anything that displays the position of the X slider in some manner -// to reflect the new position, either from the buffer or from the parameter. -// -void FileInfo3D::UpdateXSliderUI( LONG lForcePos, BOOL fFromBuffer ) - { - char szText[8]; - LONG lPos; - - if( fFromBuffer ) - { - if( NULL != m_pDSB3D ) - { - m_pDSB3D->GetPosition( &m_vPos ); - lPos = (LONG)m_vPos.x; - } - else - lPos = 0; - } - else - lPos = lForcePos; - - SendMessage( m_ht3d.hXSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPos + POS_SLIDER_SHIFT) / X_SLIDER_FACTOR ); - wsprintf( szText, "%i", lPos ); - Static_SetText( m_ht3d.hXText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateYSliderUI() -// -// Update anything that displays the position of the Y slider in some manner -// to reflect the new position, either from the buffer or from the parameter. -// -void FileInfo3D::UpdateYSliderUI( LONG lForcePos, BOOL fFromBuffer ) - { - char szText[8]; - LONG lPos; - - if( fFromBuffer ) - { - if( NULL != m_pDSB3D ) - { - m_pDSB3D->GetPosition( &m_vPos ); - lPos = (LONG)m_vPos.y; - } - else - lPos = 0; - } - else - lPos = lForcePos; - - SendMessage( m_ht3d.hYSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPos + POS_SLIDER_SHIFT) / Y_SLIDER_FACTOR ); - wsprintf( szText, "%i", lPos ); - Static_SetText( m_ht3d.hYText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateZSliderUI() -// -// Update anything that displays the position of the Z slider in some manner -// to reflect the new position, either from the buffer or from the parameter. -// -void FileInfo3D::UpdateZSliderUI( LONG lForcePos, BOOL fFromBuffer ) - { - char szText[8]; - LONG lPos; - - if( fFromBuffer ) - { - if( NULL != m_pDSB3D ) - { - m_pDSB3D->GetPosition( &m_vPos ); - lPos = (LONG)m_vPos.z; - } - else - lPos = 0; - } - else - lPos = lForcePos; - - SendMessage( m_ht3d.hZSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPos + POS_SLIDER_SHIFT) / Z_SLIDER_FACTOR ); - wsprintf( szText, "%i", lPos ); - Static_SetText( m_ht3d.hZText, szText ); - } - - -BOOL FileInfo3D::HandleConeInnerEditNotify( WPARAM wParam, LPARAM lParam ) - { - HRESULT hr; - BOOL fRet = FALSE; - LONG lValue; - char szTS[6]; - - if( HIWORD( wParam ) == EN_CHANGE ) - { - if( (HWND)lParam == m_ht3d.hInnerAngleEdit ) - { - Edit_GetText( m_ht3d.hInnerAngleEdit, szTS, sizeof(szTS)); - lValue = atol(szTS); - if( lValue < 0 ) - { - Edit_SetText( m_ht3d.hInnerAngleEdit, "0" ); - return TRUE; - } - else - m_dwInnerAngle = (DWORD)lValue; - - // Make sure we haven't incremented the inner cone larger than - // the outer cone - if( m_dwInnerAngle > m_dwOuterAngle ) - { - m_dwOuterAngle = m_dwInnerAngle; - SendMessage( m_ht3d.hOuterAngleSpin, UDM_SETPOS, - 0, MAKELONG(m_dwOuterAngle, 0)); - wsprintf( szTS, "%u", m_dwOuterAngle ); - Edit_SetText( m_ht3d.hOuterAngleEdit, szTS ); - } - if( m_pDSB3D ) - if( FAILED( hr = m_pDSB3D->SetConeAngles( m_dwInnerAngle, - m_dwOuterAngle, DS3D_IMMEDIATE ))) - DPF( 0, "SetConeAngles: %s", TranslateDSError(hr)); - fRet = TRUE; - } - } - - return fRet; - } - - -BOOL FileInfo3D::HandleConeOuterEditNotify( WPARAM wParam, LPARAM lParam ) - { - HRESULT hr; - BOOL fRet = FALSE; - LONG lValue; - char szTS[6]; - - if( HIWORD( wParam ) == EN_CHANGE ) - { - if( (HWND)lParam == m_ht3d.hOuterAngleEdit ) - { - Edit_GetText( m_ht3d.hOuterAngleEdit, szTS, sizeof(szTS)); - lValue = atol(szTS); - if( lValue < 0 ) - { - Edit_SetText( m_ht3d.hOuterAngleEdit, "0" ); - return TRUE; - } - else - m_dwOuterAngle = (DWORD)lValue; - // Make sure we haven't decremented the outer cone smaller than - // the inner cone - if( m_dwInnerAngle > m_dwOuterAngle ) - { - m_dwInnerAngle = m_dwOuterAngle; - SendMessage( m_ht3d.hInnerAngleSpin, UDM_SETPOS, - 0, MAKELONG(m_dwInnerAngle, 0)); - wsprintf( szTS, "%u", m_dwInnerAngle ); - Edit_SetText( m_ht3d.hInnerAngleEdit, szTS ); - } - if( m_pDSB3D ) - if( FAILED( hr = m_pDSB3D->SetConeAngles( m_dwInnerAngle, - m_dwOuterAngle, DS3D_IMMEDIATE ))) - DPF( 0, "SetConeAngles: %s", TranslateDSError(hr)); - fRet = TRUE; - } - } - - return fRet; - } - -BOOL FileInfo3D::HandleDisableNotify( WPARAM wParam, LPARAM lParam ) - { - HRESULT hr; - BOOL fRet = FALSE; - - if( (HWND)lParam == m_ht3d.hDisable3D ) - { - if( Button_GetCheck( m_ht3d.hDisable3D )) - { - if( m_pDSB3D ) { - if( FAILED( hr = m_pDSB3D->SetMode( DS3DMODE_DISABLE, 0 ))) - DPF( 0, "SetMode: %s", TranslateDSError(hr)); - fRet = TRUE; - } - } - else - { - if( m_pDSB3D ) { - if( FAILED( hr = m_pDSB3D->SetMode( DS3DMODE_NORMAL, 0 ))) - DPF( 0, "SetMode: %s", TranslateDSError(hr)); - fRet = TRUE; - } - } - } - - return fRet; - } - diff --git a/sdk/samples/dsshow3d/finfo3d.h b/sdk/samples/dsshow3d/finfo3d.h deleted file mode 100644 index d99aaac..0000000 --- a/sdk/samples/dsshow3d/finfo3d.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef __FILEINFO3D_H__ -#define __FILEINFO3D_H__ - -#include "FileInfo.h" - -#define CONEVOL_MIN -10000 -#define CONEVOL_MAX 0 -#define CONEVOL_SLIDER_FACTOR 100 -#define CONEVOL_SLIDER_SHIFT 10000 -#define CONEVOL_SLIDER_PAGE 500 - -#define X_SLIDER_FACTOR 1 -#define Y_SLIDER_FACTOR 1 -#define Z_SLIDER_FACTOR 1 - -#define POS_SLIDER_MIN -50 // Centimeters -#define POS_SLIDER_MAX 50 // Centimeters -#define POS_SLIDER_SHIFT 50 // Shift so min is 0 - -#define FI3D_DEFAULT_INNER_ANGLE 90 -#define FI3D_DEFAULT_OUTER_ANGLE 120 - -typedef struct tag_ht3d -{ - HWND hXSlider, hYSlider, hZSlider; - HWND hOuterVolText, hOuterVolSlider; - HWND hInnerAngleEdit, hInnerAngleSpin; - HWND hOuterAngleEdit, hOuterAngleSpin; - HWND hXText, hYText, hZText; - HWND hDisable3D; -} HWNDTABLE3D; - - - -class FileInfo3D : public FileInfo -{ -friend BOOL CALLBACK FileInfo3DDlgProc( HWND, UINT, WPARAM, LPARAM ); - -public: - FileInfo3D( MainWnd *pmw = NULL ); - virtual ~FileInfo3D(); - - virtual int NewDirectSoundBuffer( void ); - - virtual void Duplicate( FileInfo * ); - - virtual void UpdateUI( void ); - virtual void UpdateFileName( void ); - -// Useful protected member functions -protected: - virtual BOOL OnInitDialog( HWND, WPARAM ); - virtual BOOL OnCommand( WPARAM, LPARAM ); - virtual BOOL OnHScroll( WORD, LONG, HWND ); - virtual BOOL OnContextMenu( HWND, int, int ); - virtual void OnDestroy(); - - virtual BOOL CreateInterface( HWND ); - virtual void SetSliders( void ); - - void HandleOuterVolSliderScroll( WORD, LONG ); - void HandleXSliderScroll( WORD, LONG ); - void HandleYSliderScroll( WORD, LONG ); - void HandleZSliderScroll( WORD, LONG ); - - BOOL HandleConeInnerEditNotify( WPARAM, LPARAM ); - BOOL HandleConeOuterEditNotify( WPARAM, LPARAM ); - - BOOL HandleDisableNotify( WPARAM, LPARAM ); - - BOOL HandleOuterVolContext( WPARAM ); - BOOL HandlePositionContext( WPARAM ); - - void UpdateOuterVolUI( LONG, BOOL ); - void UpdateXSliderUI( LONG, BOOL ); - void UpdateYSliderUI( LONG, BOOL ); - void UpdateZSliderUI( LONG, BOOL ); - -protected: - HWNDTABLE3D m_ht3d; - D3DVECTOR m_vPos; - DWORD m_dwInnerAngle, m_dwOuterAngle; - - LPDIRECTSOUND3DBUFFER m_pDSB3D; // DirectSound 3D buffer interface -}; - - -typedef FileInfo3D * PFILEINFO3D; - -BOOL CALLBACK FileInfo3DDlgProc( HWND, UINT, WPARAM, LPARAM ); - -#endif - - diff --git a/sdk/samples/dsshow3d/gvars.h b/sdk/samples/dsshow3d/gvars.h deleted file mode 100644 index 0e9f6be..0000000 --- a/sdk/samples/dsshow3d/gvars.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef __GVARS_H__ -#define __GVARS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -class FileInfo; -class MainWnd; -class FileInfo3D; -class ListenerInfo; - -#include -#include "DSShow3d.h" -#include "MainWnd.h" - -// Make sure to change this if you add format code entries to fdFormats[] -#define NUM_FORMATENTRIES 16 - -#ifdef INIT_GVARS - -char gszAppName[] = "DSShow3D"; -char gszAppCaption[] = "DirectSound 3D Mixing Test"; -char gszAppWndClass[] = "DSShow3D_MainApp_WndClass"; - -FORMATDATA fdFormats[] = { { 8108, ID_OPTIONS_FORMAT_8M8, TRUE }, - { 8116, ID_OPTIONS_FORMAT_8M16, TRUE }, - { 8208, ID_OPTIONS_FORMAT_8S8, TRUE }, - { 8216, ID_OPTIONS_FORMAT_8S16, TRUE }, - { 11108, ID_OPTIONS_FORMAT_11M8, TRUE }, - { 11116, ID_OPTIONS_FORMAT_11M16, TRUE }, - { 11208, ID_OPTIONS_FORMAT_11S8, TRUE }, - { 11216, ID_OPTIONS_FORMAT_11S16, TRUE }, - { 22108, ID_OPTIONS_FORMAT_22M8, TRUE }, - { 22116, ID_OPTIONS_FORMAT_22M16, TRUE }, - { 22208, ID_OPTIONS_FORMAT_22S8, TRUE }, - { 22216, ID_OPTIONS_FORMAT_22S16, TRUE }, - { 44108, ID_OPTIONS_FORMAT_44M8, TRUE }, - { 44116, ID_OPTIONS_FORMAT_44M16, TRUE }, - { 44208, ID_OPTIONS_FORMAT_44S8, TRUE }, - { 44216, ID_OPTIONS_FORMAT_44S16, TRUE } }; - - -DWORD aFormatOrder[] = { 44216, 44116, 44208, 44108, 22216, 22116, 22208, 22108, - 11216, 11116, 11208, 11108, 8216, 8116, 8208, 8108 }; - -HINSTANCE ghInst; -HWND hWndMain = NULL; -HWND ghDlgActive = NULL; -DWORD gdwTimer = 0; // Timer handle. -DWORD gcbMaxWaveFormatSize= 0; -DWORD gdwOutputFormat = 0; -BOOL gfCOMInitialized = FALSE; -REGSETTINGS grs; - -PWAVEFORMATEX gpwfxFormat = NULL; -ListenerInfo * gpListenerInfo = NULL; -HWND ghwndListener = NULL; - -LPDIRECTSOUND gpds = NULL; -LPDIRECTSOUNDBUFFER gpdsbPrimary = NULL; -LPDIRECTSOUND3DLISTENER gp3DListener = NULL; - -MainWnd AppWnd; - -#else // INIT_GVARS - -extern char gszAppName[]; -extern char gszAppCaption[]; -extern char gszAppWndClass[]; - -extern FORMATDATA fdFormats[]; -extern DWORD aFormatOrder[]; - -extern HINSTANCE ghInst; -extern HWND hWndMain; -extern HWND ghDlgActive; -extern DWORD gdwTimer; // Timer handle. -extern DWORD gcbMaxWaveFormatSize; -extern DWORD gdwOutputFormat; -extern BOOL gfCOMInitialized; -extern REGSETTINGS grs; - -extern PWAVEFORMATEX gpwfxFormat; -extern ListenerInfo * gpListenerInfo; -extern HWND ghwndListener; - -extern LPDIRECTSOUND gpds; -extern LPDIRECTSOUNDBUFFER gpdsbPrimary; -extern LPDIRECTSOUND3DLISTENER gp3DListener; - -extern MainWnd AppWnd; - -#endif // INIT_GVARS - - -#ifdef __cplusplus -} -#endif - -#endif // __GVARS_H__ - - diff --git a/sdk/samples/dsshow3d/ico00001.ico b/sdk/samples/dsshow3d/ico00001.ico deleted file mode 100644 index 74ed991..0000000 Binary files a/sdk/samples/dsshow3d/ico00001.ico and /dev/null differ diff --git a/sdk/samples/dsshow3d/icon1.ico b/sdk/samples/dsshow3d/icon1.ico deleted file mode 100644 index 7bdf3a4..0000000 Binary files a/sdk/samples/dsshow3d/icon1.ico and /dev/null differ diff --git a/sdk/samples/dsshow3d/icon3.ico b/sdk/samples/dsshow3d/icon3.ico deleted file mode 100644 index 3bd250c..0000000 Binary files a/sdk/samples/dsshow3d/icon3.ico and /dev/null differ diff --git a/sdk/samples/dsshow3d/lsnrinfo.cpp b/sdk/samples/dsshow3d/lsnrinfo.cpp deleted file mode 100644 index f3205e7..0000000 --- a/sdk/samples/dsshow3d/lsnrinfo.cpp +++ /dev/null @@ -1,416 +0,0 @@ -#include -#include -#include -#include -#include - -#include "DSShow3D.h" -#include "debug.h" -#include "GVars.h" -#include "LsnrInfo.h" - - -ListenerInfo::ListenerInfo() - { - m_hDistanceEdit = m_hDopplerEdit = m_hRolloffEdit = NULL; - m_hXSlider = m_hYSlider = m_hZSlider = NULL; - m_hXText = m_hYText = m_hZText = NULL; - - m_vPos.x = m_vPos.y = m_vPos.z = (D3DVALUE)0.0; - } - - -ListenerInfo::~ListenerInfo() - { - } - - -BOOL ListenerInfo::OnInitDialog( HWND hDlg, WPARAM wParam ) - { - m_hDistanceEdit = GetDlgItem( hDlg, IDC_LISTENER_DISTANCEFACTOR_EDIT ); - m_hDopplerEdit = GetDlgItem( hDlg, IDC_LISTENER_DOPPLERFACTOR_EDIT ); - m_hRolloffEdit = GetDlgItem( hDlg, IDC_LISTENER_ROLLOFFFACTOR_EDIT ); - - m_hXSlider = GetDlgItem( hDlg, IDC_LISTENER_X_SLIDER ); - m_hYSlider = GetDlgItem( hDlg, IDC_LISTENER_Y_SLIDER ); - m_hZSlider = GetDlgItem( hDlg, IDC_LISTENER_Z_SLIDER ); - - m_hXText = GetDlgItem( hDlg, IDC_LISTENER_X_TEXT ); - m_hYText = GetDlgItem( hDlg, IDC_LISTENER_Y_TEXT ); - m_hZText = GetDlgItem( hDlg, IDC_LISTENER_Z_TEXT ); - - // Initialize the distance factor to metres - Edit_SetText( m_hDistanceEdit, "1.0" ); - Edit_SetText( m_hRolloffEdit, "1.0" ); - - gp3DListener->SetPosition( D3DVAL(0.0f), D3DVAL(0.0f), D3DVAL(-10.0f), DS3D_IMMEDIATE ); -// gp3DListener->CommitDeferredSettings(); - - SetSliders(); - - return TRUE; - } - - -void ListenerInfo::UpdateUI( void ) - { - UpdateXSliderUI( 0, TRUE ); - UpdateYSliderUI( 0, TRUE ); - UpdateZSliderUI( 0, TRUE ); - } - - -BOOL ListenerInfo::OnCommand( WPARAM wParam, LPARAM lParam ) - { - char szEdit[16]; - - if( HIWORD(wParam) == EN_CHANGE ) - { - if( (HWND)lParam == m_hDistanceEdit ) - { - Edit_GetText( m_hDistanceEdit, szEdit, sizeof(szEdit)); - - ASSERT( NULL != gp3DListener ); - DPF( 3, "Setting Distance Factor: %s", szEdit ); - gp3DListener->SetDistanceFactor(D3DVAL(atof(szEdit)), DS3D_IMMEDIATE ); - } - else if((HWND)lParam == m_hDopplerEdit ) - { - Edit_GetText( m_hDopplerEdit, szEdit, sizeof(szEdit)); - - ASSERT( NULL != gp3DListener ); - DPF( 3, "Setting Doppler Factor: %s", szEdit ); - gp3DListener->SetDopplerFactor(D3DVAL(atof(szEdit)), DS3D_IMMEDIATE ); - } - else if((HWND)lParam == m_hRolloffEdit ) - { - Edit_GetText( m_hRolloffEdit, szEdit, sizeof(szEdit)); - - ASSERT( NULL != gp3DListener ); - DPF( 3, "Setting Rolloff Factor: %s", szEdit ); - gp3DListener->SetRolloffFactor(D3DVAL(atof(szEdit)), DS3D_IMMEDIATE ); - } - } - return FALSE; - } - - -/////////////////////////////////////////////////////////////////////////////// -// OnHScroll() -// -// Main message handler for the WM_HSCROLL message. this function basically -// figures out which horizontal scrolling control is responsible for sending -// the message and passes on handling to an appropriate function for handling. -// -BOOL ListenerInfo::OnHScroll( WORD wNotification, LONG lPos, HWND hControl ) - { - if( !hControl ) - return FALSE; - - if( hControl == m_hXSlider ) - { - HandleXSliderScroll( wNotification, lPos ); - return TRUE; - } - else if( hControl == m_hYSlider ) - { - HandleYSliderScroll( wNotification, lPos ); - return TRUE; - } - else if( hControl == m_hZSlider ) - { - HandleZSliderScroll( wNotification, lPos ); - return TRUE; - } - else - return FALSE; - } - - -void ListenerInfo::OnDestroy( void ) - { - } - - -BOOL CALLBACK ListenerInfoDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - PLISTENERINFO pli; - - switch( message ) - { - case WM_INITDIALOG: - ASSERT( lParam != NULL ); - pli = (PLISTENERINFO)lParam; - SetWindowLong( hDlg, DWL_USER, (LONG)pli ); - - if( !pli->OnInitDialog( hDlg, wParam )) - DestroyWindow( hDlg ); - return TRUE; - - case WM_HSCROLL: - pli = (PLISTENERINFO)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pli ); - return !pli->OnHScroll( LOWORD(wParam), (LONG)HIWORD(wParam), (HWND)lParam ); - - case WM_COMMAND: - pli = (PLISTENERINFO)GetWindowLong( hDlg, DWL_USER ); - // It's possible to get child notifications before the - // INITDIALOG message, so we'll handle a NULL class item - // here a less stringently - if( !pli ) - return FALSE; - return !pli->OnCommand( wParam, lParam ); - - case WM_DESTROY: - pli = (PLISTENERINFO)GetWindowLong( hDlg, DWL_USER ); - ASSERT( NULL != pli ); - pli->OnDestroy(); - return TRUE; - - default: - return FALSE; - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ListenerInfo::SetSliders( void ) - { - SendMessage( m_hXSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(LISTENER_SLIDER_MIN + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - SendMessage( m_hXSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(LISTENER_SLIDER_MAX + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - SendMessage( m_hXSlider, TBM_SETPAGESIZE, 0, LISTENER_SLIDER_FACTOR); - - SendMessage( m_hYSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(LISTENER_SLIDER_MIN + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - SendMessage( m_hYSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(LISTENER_SLIDER_MAX + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - SendMessage( m_hYSlider, TBM_SETPAGESIZE, 0, LISTENER_SLIDER_FACTOR); - - SendMessage( m_hZSlider, TBM_SETRANGEMIN, FALSE, - (LPARAM)(LISTENER_SLIDER_MIN + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - SendMessage( m_hZSlider, TBM_SETRANGEMAX, FALSE, - (LPARAM)(LISTENER_SLIDER_MAX + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - SendMessage( m_hZSlider, TBM_SETPAGESIZE, 0, LISTENER_SLIDER_FACTOR); - - UpdateUI(); - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ListenerInfo::HandleXSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_hXSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != gp3DListener ) - { - m_vPos.x = D3DVAL(lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT; - DPF( 3, "Setting listener pos: (%i, %i, %i)", (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z ); - if( FAILED( hr = gp3DListener->SetPosition( m_vPos.x, m_vPos.y, - m_vPos.z, DS3D_IMMEDIATE ))) - DPF( 0, "IDirectSound3DListener::SetPosition returned : %s", TranslateDSError(hr)); - UpdateXSliderUI((lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ListenerInfo::HandleYSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_hYSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != gp3DListener ) - { - m_vPos.y = D3DVAL(lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT; - DPF( 3, "Setting listener pos: (%i, %i, %i)", (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z ); - if( FAILED( hr = gp3DListener->SetPosition( m_vPos.x, m_vPos.y, - m_vPos.z, DS3D_IMMEDIATE ))) - DPF( 0, "IDirectSound3DListener::SetPosition returned : %s", TranslateDSError(hr)); - UpdateYSliderUI((lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ListenerInfo::HandleZSliderScroll( WORD wNot, LONG lPos ) - { - HRESULT hr; - BOOL fUpdate = TRUE; - - switch( wNot ) - { - case TB_THUMBTRACK: - break; - - case TB_ENDTRACK: - case TB_LINEDOWN: - case TB_LINEUP: - case TB_PAGEDOWN: - case TB_PAGEUP: - lPos = SendMessage( m_hZSlider, TBM_GETPOS, 0, 0 ); - break; - - default: - fUpdate = FALSE; - } - - if( fUpdate && NULL != gp3DListener ) - { - m_vPos.z = D3DVAL(lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT; - DPF( 3, "Setting listener pos: (%i, %i, %i)", (int)m_vPos.x, (int)m_vPos.y, (int)m_vPos.z ); - if( FAILED( hr = gp3DListener->SetPosition( m_vPos.x, m_vPos.y, - m_vPos.z, DS3D_IMMEDIATE ))) - DPF( 0, "IDirectSound3DListener::SetPosition returned : %s", TranslateDSError(hr)); - UpdateZSliderUI((lPos * LISTENER_SLIDER_FACTOR) - LISTENER_SLIDER_SHIFT, FALSE ); - } - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateXSliderUI() -// -// Update anything that displays the position of the X slider in some manner -// to reflect the new position, either from the buffer or from the parameter. -// -void ListenerInfo::UpdateXSliderUI( LONG lForcePos, BOOL fFromInterface ) - { - char szText[8]; - LONG lPos; - - if( fFromInterface ) - { - if( NULL != gp3DListener ) - { - gp3DListener->GetPosition( &m_vPos ); - lPos = (LONG)m_vPos.x; - } - else - lPos = 0; - } - else - lPos = lForcePos; - - SendMessage( m_hXSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPos + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - wsprintf( szText, "%i", lPos ); - Static_SetText( m_hXText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateYSliderUI() -// -// Update anything that displays the position of the Y slider in some manner -// to reflect the new position, either from the buffer or from the parameter. -// -void ListenerInfo::UpdateYSliderUI( LONG lForcePos, BOOL fFromInterface ) - { - char szText[8]; - LONG lPos; - - if( fFromInterface ) - { - if( NULL != gp3DListener ) - { - gp3DListener->GetPosition( &m_vPos ); - lPos = (LONG)m_vPos.y; - } - else - lPos = 0; - } - else - lPos = lForcePos; - - SendMessage( m_hYSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPos + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - wsprintf( szText, "%i", lPos ); - Static_SetText( m_hYText, szText ); - } - - -/////////////////////////////////////////////////////////////////////////////// -// UpdateZSliderUI() -// -// Update anything that displays the position of the Z slider in some manner -// to reflect the new position, either from the buffer or from the parameter. -// -void ListenerInfo::UpdateZSliderUI( LONG lForcePos, BOOL fFromInterface ) - { - char szText[8]; - LONG lPos; - - if( fFromInterface ) - { - if( NULL != gp3DListener ) - { - gp3DListener->GetPosition( &m_vPos ); - lPos = (LONG)m_vPos.z; - } - else - lPos = 0; - } - else - lPos = lForcePos; - - SendMessage( m_hZSlider, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)(lPos + LISTENER_SLIDER_SHIFT) / LISTENER_SLIDER_FACTOR ); - wsprintf( szText, "%i", lPos ); - Static_SetText( m_hZText, szText ); - } - - - - diff --git a/sdk/samples/dsshow3d/lsnrinfo.h b/sdk/samples/dsshow3d/lsnrinfo.h deleted file mode 100644 index c6fefc7..0000000 --- a/sdk/samples/dsshow3d/lsnrinfo.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef __LISTENERINFO_H__ -#define __LISTENERINFO_H__ - -#define LISTENER_SLIDER_MAX (50) -#define LISTENER_SLIDER_MIN (-LISTENER_SLIDER_MAX) -#define LISTENER_SLIDER_FACTOR (1) -#define LISTENER_SLIDER_SHIFT (LISTENER_SLIDER_MAX) - -class ListenerInfo -{ -friend BOOL CALLBACK ListenerInfoDlgProc( HWND, UINT, WPARAM, LPARAM ); - -public: - ListenerInfo(); - ~ListenerInfo(); - - void UpdateUI( void ); - -// Useful protected member functions -protected: - BOOL OnInitDialog( HWND, WPARAM ); - BOOL OnCommand( WPARAM, LPARAM ); - BOOL OnHScroll( WORD, LONG, HWND ); - void OnDestroy( void ); - - void HandleXSliderScroll( WORD, LONG ); - void HandleYSliderScroll( WORD, LONG ); - void HandleZSliderScroll( WORD, LONG ); - - void UpdateXSliderUI( LONG, BOOL ); - void UpdateYSliderUI( LONG, BOOL ); - void UpdateZSliderUI( LONG, BOOL ); - - void SetSliders( void ); - -protected: - HWND m_hDistanceEdit, m_hDopplerEdit, m_hRolloffEdit; - HWND m_hXSlider, m_hYSlider, m_hZSlider; - HWND m_hXText, m_hYText, m_hZText; - - D3DVECTOR m_vPos; -}; - - -typedef ListenerInfo * PLISTENERINFO; - -BOOL CALLBACK ListenerInfoDlgProc( HWND, UINT, WPARAM, LPARAM ); - -#endif - - diff --git a/sdk/samples/dsshow3d/mainwnd.cpp b/sdk/samples/dsshow3d/mainwnd.cpp deleted file mode 100644 index 3313926..0000000 --- a/sdk/samples/dsshow3d/mainwnd.cpp +++ /dev/null @@ -1,655 +0,0 @@ -#include -#include -#include -#include - -#include "resource.h" -#include "DSShow3D.h" -#include "GVars.h" - -#include "MainWnd.h" -#include "FInfo3D.h" -#include "FileInfo.h" -#include "LsnrInfo.h" -#include "wave.h" -#include "debug.h" - -static HWND hMainWndClient; - -MainWnd::MainWnd() -{ - m_fCreated = FALSE; - m_hwnd = NULL; - m_n3DBuffers = 0; - ZeroMemory( &m_dscaps, sizeof(DSCAPS)); - m_dscaps.dwSize = sizeof(m_dscaps); -} - - -MainWnd::~MainWnd() -{ - // This situation should never really occur, but we should make sure - // that there are no coding errors by asserting that fact. - if( m_hwnd ) - { - ASSERT_HWND(m_hwnd); - ::DestroyWindow( m_hwnd ); - m_hwnd = NULL; - m_fCreated = FALSE; - } -} - - -BOOL MainWnd::Create() -{ - if( m_fCreated ) - return FALSE; - - ASSERT( NULL == m_hwnd ); - m_hwnd = CreateWindowEx( WS_EX_ACCEPTFILES, - gszAppWndClass, - gszAppCaption, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, - CW_USEDEFAULT, - 200, - 150, - (HWND)NULL, - (HMENU)NULL, - (HANDLE)ghInst, - (LPSTR)NULL ); - - if( !m_hwnd ) - return FALSE; - - SetWindowLong( m_hwnd, GWL_USERDATA, (LONG)this ); - m_fCreated = TRUE; - - EnableMenuItem(GetMenu(m_hwnd), 2, MF_BYPOSITION | - (m_dlInfoList.GetElementCount() ? MF_ENABLED : MF_GRAYED)); - DrawMenuBar( m_hwnd ); - - UpdateStatus(); - - return TRUE; -} - - -int MainWnd::MessageBox( LPCSTR lpcszMessage, UINT uType ) -{ - return ::MessageBox( m_hwnd, lpcszMessage, gszAppName, uType ); -} - -int MainWnd::MessageBox( UINT uResID, UINT uType ) -{ - // TODO Make the 512 some defined constant - LPTSTR lptszMessage = new TCHAR[512]; - int nRet; - - if( !lptszMessage ) - return 0; - - LoadString( ghInst, uResID, lptszMessage, 512 ); - nRet = ::MessageBox( m_hwnd, lptszMessage, gszAppName, uType ); - delete[] lptszMessage; - - return nRet; -} - -BOOL MainWnd::OnTimer( WPARAM wParam, LPARAM lParam ) -{ - // Move to the Head of the list - m_dlInfoList.SetAtHead(); - - if( NULL != gpListenerInfo ) - gpListenerInfo->UpdateUI(); - - // While the current element isn't NULL, call OnTimer on each FileInfo - for( int i = 0; i < m_dlInfoList.GetElementCount(); i++ ) - { - m_dlInfoList.GetCurrent()->UpdateUI(); - // Overloaded increment moves to next position in the list - m_dlInfoList++; - } - return TRUE; -} - -void MainWnd::OnDestroy() -{ - HRESULT hr = 0; - - if( gdwTimer != 0 ) - { - KillTimer( m_hwnd, gdwTimer ); - gdwTimer = 0; - } - - if( NULL != gpwfxFormat ) - { - delete gpwfxFormat; - gpwfxFormat = NULL; - } - - /* Destroy the direct sound object. */ - if( gp3DListener != NULL ) - { - DPF( 3, "Releasing 3D Listener in MainWnd::OnDestroy()" ); - gp3DListener->Release(); - gp3DListener = NULL; - } - if( gpdsbPrimary ) - { - DPF( 3, "Releasing Primary in MainWnd::OnDestroy()" ); - gpdsbPrimary->Stop(); - gpdsbPrimary->Release(); - gpdsbPrimary = NULL; - } - if( gpds != NULL ) - { - DPF( 3, "Releasing DSound object in MainWnd::OnDestroy()" ); - gpds->Release(); - gpds = NULL; - } - - if( gfCOMInitialized ) - CoUninitialize(); - -// WriteProfileString( gszAppName, "EnumDrivers", gfEnumDrivers ? "1" : "0" ); - - if( m_hwnd ) - m_hwnd = NULL; - return; -} - - -/* MainWndProc() - * - * Window message handler function for the main application window. - * For the most part, this sucker just dispatchs calls to some helper - * functions in this module which do the actual handling. - */ -LRESULT CALLBACK MainWndProc( HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam ) -{ - if( !hWnd ) - return 0L; - - // This will be a valid pointer to the class object for any message - // after the WM_CREATE - MainWnd *pmw = (MainWnd *)GetWindowLong( hWnd, GWL_USERDATA ); - - switch (message) - { - case WM_CREATE: - // If we want to do anything with the class here, we'll have - // to modify the code to pass pmw in LPARAM since there's no - // other way to get it yet: the code that sets the WindowLong - // user data has not yet executed - break; - - case WM_ACTIVATE: - ASSERT( NULL != pmw ); - pmw->UpdateStatus(); - break; - - case WM_TIMER: - ASSERT( NULL != pmw ); - if (!pmw->OnTimer(wParam, lParam)) - return(DefWindowProc(hWnd, message, wParam, lParam)); - break; - - case WM_DROPFILES: - ASSERT( NULL != pmw ); - if( !pmw->OnDropFiles( wParam )) - return(DefWindowProc(hWnd, message, wParam, lParam)); - break; - - case WM_PAINT: - ASSERT( NULL != pmw ); - if( !pmw->OnPaint(wParam, lParam)) - return(DefWindowProc(hWnd, message, wParam, lParam)); - break; - - case WM_INITMENU: - ASSERT( NULL != pmw ); - if((HMENU)wParam != GetMenu( hWnd )) - break; - return pmw->OnInitMenu( wParam ); - break; - - case WM_COMMAND: - ASSERT( NULL != pmw ); - if (!pmw->OnCommand(wParam, lParam)) - return DefWindowProc(hWnd, message, wParam, lParam); - break; - - case WM_DESTROY: - ASSERT( NULL != pmw ); - pmw->OnDestroy(); - PostQuitMessage(0); - break; - - default: - return DefWindowProc( hWnd, message, wParam, lParam ); - break; - } - - return 0L; -} - - -BOOL MainWnd::OnInitMenu( WPARAM wParam ) -{ - int i; - - CheckMenuItem( (HMENU)wParam, - CommandIDFromFormatCode( gdwOutputFormat ), - MF_BYCOMMAND | MF_CHECKED ); - - for( i = 0; i < NUM_FORMATENTRIES; i++ ) - { - if( !fdFormats[i].fEnable ) - EnableMenuItem((HMENU)wParam, - CommandIDFromFormatCode( fdFormats[i].dwCode ), - MF_BYCOMMAND | MF_GRAYED ); - else - EnableMenuItem((HMENU)wParam, - CommandIDFromFormatCode( fdFormats[i].dwCode ), - MF_BYCOMMAND | MF_ENABLED ); - } - // If there are no buffers open, then disable the buffers menu - EnableMenuItem((HMENU)wParam, 2, MF_BYPOSITION | - (m_dlInfoList.GetElementCount() ? MF_ENABLED : MF_GRAYED)); - return TRUE; -} - -/* OnDropFiles() - * - * Handles the WM_DROPFILES message, which is a message sent when someone - * drags and drops files onto our application window. - */ -BOOL MainWnd::OnDropFiles( WPARAM wParam ) -{ - WORD wNumFiles = DragQueryFile((HDROP)wParam, (UINT)-1, NULL, (UINT)0 ); - WORD nFile, nPathLength; - LPSTR lpszFile; - - for( nFile = 0; nFile < wNumFiles; nFile++ ) - { - nPathLength = DragQueryFile((HDROP)wParam, nFile, NULL, 0 ) + 1; - if(( lpszFile = new char[nPathLength] ) == NULL ) - continue; - DragQueryFile((HDROP)wParam, nFile, lpszFile, nPathLength ); - - // Open the file - OnFileOpen( lpszFile ); - - delete[] lpszFile; - } - - DragFinish((HDROP)wParam); - return TRUE; -} - - -/* OnCommand() - * - * WM_COMMAND message handler for the main window procedure. - */ -BOOL MainWnd::OnCommand( WPARAM wParam, LPARAM lParam ) -{ - HRESULT hr; - DWORD dwNewFormat; - int i = 0; - - if(( dwNewFormat = FormatCodeFromCommandID( LOWORD(wParam))) != 0 ) - { - CheckMenuItem( GetMenu( m_hwnd ), - CommandIDFromFormatCode( gdwOutputFormat ), - MF_BYCOMMAND | MF_UNCHECKED ); - FormatCodeToWFX( dwNewFormat, gpwfxFormat ); - DPF( 2, "Setting output format to code: %lu", dwNewFormat ); - hr = gpdsbPrimary->SetFormat( gpwfxFormat ); - if( SUCCEEDED( hr )) - gdwOutputFormat = dwNewFormat; - else - { - DisableFormatCode( dwNewFormat ); - EnableMenuItem( GetMenu( m_hwnd ), - CommandIDFromFormatCode( dwNewFormat ), - MF_BYCOMMAND | MF_GRAYED ); - FormatCodeToWFX( gdwOutputFormat, gpwfxFormat ); - gpdsbPrimary->SetFormat( gpwfxFormat ); - } - return TRUE; - } - - switch( LOWORD(wParam)) - { - case IDC_FILE_EXIT: - PostMessage(WM_CLOSE, 0, 0); - break; - - case IDC_FILE_OPEN: - OnFileOpen( NULL ); - UpdateStatus(); - break; - - case IDC_OPTIONS_SETTINGS: - DialogBox(ghInst, MAKEINTRESOURCE(IDD_SETTINGS), - m_hwnd, (DLGPROC)SettingsDlgProc); - UpdateStatus(); - break; - - case IDC_BUFFERS_MINIMIZEALL: - m_dlInfoList.SetAtHead(); - for( i = 0; i < m_dlInfoList.GetElementCount(); i++) - { - m_dlInfoList.GetCurrent()->MinimizeWindow(); - m_dlInfoList++; - } - break; - - case IDC_BUFFERS_RESTOREALL: - m_dlInfoList.SetAtHead(); - for( i = 0; i < m_dlInfoList.GetElementCount(); i++) - { - m_dlInfoList.GetCurrent()->RestoreWindow(); - m_dlInfoList++; - } - break; - - case IDC_BUFFERS_CLOSEALL: - while( m_dlInfoList.GetElementCount()) - { - m_dlInfoList.SetAtHead(); - m_dlInfoList.GetCurrent()->Close(); - // Element is removed from the list by processing elsewhere - } - EnableMenuItem(GetMenu(m_hwnd), 2, MF_BYPOSITION | - (m_dlInfoList.GetElementCount() ? MF_ENABLED : MF_GRAYED)); - DrawMenuBar( m_hwnd ); - break; - - case IDC_BUFFERS_CASCADE: - m_dlInfoList.SetAtHead(); - for( i = 0; i < m_dlInfoList.GetElementCount(); i++) - { - if( 0 == i ) - m_dlInfoList.GetCurrent()->ResetCascade(); - m_dlInfoList.GetCurrent()->CascadeWindow(); - m_dlInfoList++; - } - break; - - case IDC_HELP_ABOUT: - DialogBox(ghInst, MAKEINTRESOURCE(IDD_ABOUT), - m_hwnd, (DLGPROC)AboutDlgProc); - break; - - default: - return FALSE; - } - - /* If we broke out of the switch, it means we handled the message - * so we return TRUE to indicate this. - */ - return TRUE; -} - - -/* DuplicateBuffer() - * - * Does the work of duplicating a FileInfo object. - */ -void MainWnd::DuplicateBuffer( FileInfo *pfiSource ) -{ - FileInfo *pfiNew; - - if( NULL == pfiSource ) - return; - - if( m_dlInfoList.GetElementCount() >= MAXCONTROLS ) - { - MessageBox( "No more controls allowed" ); - return; - } - - if( pfiSource->Is3D()) - { - m_n3DBuffers++; - pfiNew = new FileInfo3D( this ); - } - else - pfiNew = new FileInfo( this ); - - if( NULL == pfiNew ) - return; - - pfiNew->Duplicate( pfiSource ); - m_dlInfoList.Append( pfiNew ); -} - - -/* OnFileOpen() - * - * Handles the File|Open menu command. - */ -FileInfo *MainWnd::OnFileOpen( LPSTR lpszForcePath ) -{ - char szFileName[MAX_PATH]; - FileInfo *pFileInfo = NULL; - LPSTR lpszFileTitle; - int nFileIndex; - DWORD dwFlags; - - if( m_dlInfoList.GetElementCount() >= MAXCONTROLS ) - { - MessageBox( "No more controls allowed" ); - return NULL; - } - - if( NULL != lpszForcePath ) - { - dwFlags = OPENFILENAME_F_GETPOS2; - if( grs.dwDefaultFocusFlag & DSBCAPS_STICKYFOCUS ) - dwFlags |= OPENFILENAME_F_STICKYFOCUS; - else if( grs.dwDefaultFocusFlag & DSBCAPS_GLOBALFOCUS ) - dwFlags |= OPENFILENAME_F_GLOBALFOCUS; - - if( grs.fOpen3D ) - dwFlags |= OPENFILENAME_F_3D; - lpszFileTitle = strrchr( lpszForcePath, '\\' ); - if( NULL == lpszFileTitle ) - nFileIndex = 0; - else - nFileIndex = lpszFileTitle - lpszForcePath + sizeof(char); - lstrcpy( szFileName, lpszForcePath ); - } - else - { - // Open the file, and check its format, etc. - if( !OpenFileDialog( m_hwnd, szFileName, &nFileIndex, &dwFlags )) - return NULL; - } - - // Allocate the memory for the structure. - if( dwFlags & OPENFILENAME_F_3D ) - { - pFileInfo = new FileInfo3D( this ); - } - else - pFileInfo = new FileInfo( this ); - - if( NULL == pFileInfo ) - { - MessageBox( "Cannot add this file -- out of memory", - MB_OK|MB_ICONSTOP ); - goto ERROR_DONE_ROUTINE; - } - - if( m_dlInfoList.GetElementCount() == 0 ) - pFileInfo->ResetCascade(); - - m_dlInfoList.Append( pFileInfo ); - - pFileInfo->SetSticky((dwFlags & OPENFILENAME_F_STICKYFOCUS) - ? TRUE : FALSE ); - pFileInfo->SetGlobal((dwFlags & OPENFILENAME_F_GLOBALFOCUS) - ? TRUE : FALSE ); - pFileInfo->Set3D((dwFlags & OPENFILENAME_F_3D) ? TRUE : FALSE ); - pFileInfo->SetUseGetPos2((dwFlags & OPENFILENAME_F_GETPOS2) - ? TRUE : FALSE ); - - if( pFileInfo->LoadWave( szFileName, nFileIndex ) != 0 ) - { - m_dlInfoList.Remove( pFileInfo ); - goto ERROR_DONE_ROUTINE; - } - - // If we fail after this, make sure to update the list!!! - if( pFileInfo->Is3D()) - { - if( m_n3DBuffers++ == 0 ) - { - // We only want to create this dialog once, and if this is the - // first 3D buffer opened, then there should be no listener DLG yet - ASSERT( NULL == ghwndListener ); - - gpListenerInfo = new ListenerInfo; - ghwndListener = CreateDialogParam( ghInst, - MAKEINTRESOURCE(IDD_3DLISTENER), - AppWnd.GetHwnd(), - (DLGPROC)ListenerInfoDlgProc, - (LPARAM)(gpListenerInfo)); - ::ShowWindow( ghwndListener, SW_SHOW ); - } - } - - // If there are no buffers open, then disable the buffers menu - EnableMenuItem(GetMenu(m_hwnd), 2, MF_BYPOSITION | - (m_dlInfoList.GetElementCount() ? MF_ENABLED : MF_GRAYED)); - DrawMenuBar( m_hwnd ); - - return pFileInfo; - - -ERROR_DONE_ROUTINE: - if( pFileInfo != NULL ) - { - delete pFileInfo; - pFileInfo = NULL; - } - return NULL; -} - - -/* DestroyFileInfo() - * - * Destroys a FileInfo structure and removes it from the list. - */ -void MainWnd::DestroyFileInfo( FileInfo *pfi ) -{ - if( NULL == pfi ) - return; - - if( pfi->Is3D() ) - { - if( --m_n3DBuffers == 0 ) - { - ::DestroyWindow( ghwndListener ); - ghwndListener = NULL; - delete gpListenerInfo; - gpListenerInfo = NULL; - } - } - - m_dlInfoList.Remove( pfi ); - delete pfi; - UpdateStatus(); -} - - -BOOL MainWnd::OnPaint( WPARAM wParam, LPARAM lParam ) - { - PAINTSTRUCT ps; - RECT rcClient; - SIZE sizeExtent; - char szText[128]; - - if( !BeginPaint( m_hwnd, &ps )) - return FALSE; - - GetClientRect( m_hwnd, &rcClient ); - - SetBkMode( ps.hdc, TRANSPARENT ); - - wsprintf( szText, "Free HW Mem: %luKb", m_dscaps.dwFreeHwMemBytes / 1024 ); - GetTextExtentPoint32( ps.hdc, szText, lstrlen(szText), &sizeExtent ); - - DrawText( ps.hdc, szText, -1, &rcClient, DT_TOP | DT_LEFT ); - - wsprintf( szText, "Free HW Buffers: %lu", m_dscaps.dwFreeHwMixingStaticBuffers ); - rcClient.top += sizeExtent.cy; - DrawText( ps.hdc, szText, -1, &rcClient, DT_TOP | DT_LEFT ); - - EndPaint( m_hwnd, &ps ); - return TRUE; - } - - -void MainWnd::UpdateStatus( void ) - { - if( gpds ) - { - // Get updated statistics on the DSound device - gpds->GetCaps( &m_dscaps ); - - // Force a window client area repaint - InvalidateRect( m_hwnd, NULL, TRUE ); - UpdateWindow(); - } - } - -//////////////////////////////////////////////////////////////////////////// -// BatchOpenFiles() -// -// Takes an array of string pointers and tries to open each as a file to -// playback. If fPlay is TRUE, the files will be played as they are being -// opened. If fLoop is TRUE, they will also be set to loop. -// -// Returns: FALSE in the event of catastrophic failure, otherwise TRUE. -// -BOOL MainWnd::BatchOpenFiles( PSTR *ppszFiles, int nFiles, BOOL fPlay, BOOL fLoop ) -{ - FileInfo *pfi; - int i; - - // Cap the number of files we can load out of the given set if we'd load - // too many otherwise - if( m_dlInfoList.GetElementCount() >= MAXCONTROLS ) - { - MessageBox( "No more controls allowed" ); - return FALSE; - } - - for( i = 0; i < nFiles; i++ ) - { - if(( pfi = OnFileOpen( ppszFiles[i] )) == NULL ) - continue; - - // LOOP is only obeyed if PLAY was also specified - if( fPlay ) - { - if( fLoop ) - { - pfi->SetLooped( TRUE ); - } - pfi->PlayBuffer(); - } - - pfi->UpdateUI(); - } - - return TRUE; -} - diff --git a/sdk/samples/dsshow3d/mainwnd.h b/sdk/samples/dsshow3d/mainwnd.h deleted file mode 100644 index 180f12d..0000000 --- a/sdk/samples/dsshow3d/mainwnd.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef __MAINWND_H__ -#define __MAINWND_H__ - -// Pickup the ASSERT_HWND() macro -#include "DbList.h" - -class MainWnd -{ - friend LRESULT CALLBACK MainWndProc(HWND, unsigned, WPARAM, LPARAM); -public: - MainWnd(); - ~MainWnd(); - - BOOL Create(); - BOOL BatchOpenFiles( PSTR *, int, BOOL, BOOL ); - - void UpdateStatus( void ); - inline HWND GetHwnd() { return m_hwnd; } - - void DuplicateBuffer( FileInfo *pfiSource ); - void DestroyFileInfo( FileInfo *pfi ); - - // For convenience, we redefine some global window related functions as - // members of this class since we can automagically validate and pass the - // HWND for the class object. - BOOL UpdateWindow() { ASSERT_HWND( m_hwnd ); - return ::UpdateWindow( m_hwnd ); } - BOOL ShowWindow( int cmdShow ) { ASSERT_HWND( m_hwnd ); - return ::ShowWindow( m_hwnd, cmdShow ); } - LRESULT SendMessage( UINT m, WPARAM w, LPARAM l ) - { ASSERT_HWND( m_hwnd ); return ::SendMessage( m_hwnd, m, w, l ); } - LRESULT PostMessage( UINT m, WPARAM w, LPARAM l ) - { ASSERT_HWND( m_hwnd ); return ::PostMessage( m_hwnd, m, w, l ); } - int MessageBox( LPCSTR, UINT uType = MB_OK | MB_APPLMODAL ); - int MessageBox( UINT uResID, UINT uType = MB_OK | MB_APPLMODAL ); - -protected: - void OnDestroy( void ); - BOOL OnCommand( WPARAM, LPARAM ); - BOOL OnTimer( WPARAM, LPARAM ); - BOOL OnPaint( WPARAM, LPARAM ); - BOOL OnDropFiles( WPARAM ); - BOOL OnInitMenu( WPARAM ); - - FileInfo *OnFileOpen( LPSTR ); - -protected: - HWND m_hwnd; - BOOL m_fCreated; - int m_n3DBuffers; - DSCAPS m_dscaps; - - DbLinkedList m_dlInfoList; - -}; - - - -#endif - - diff --git a/sdk/samples/dsshow3d/makefile b/sdk/samples/dsshow3d/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/dsshow3d/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/dsshow3d/makefile.wat b/sdk/samples/dsshow3d/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/dsshow3d/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/dsshow3d/msvc.mk b/sdk/samples/dsshow3d/msvc.mk deleted file mode 100644 index 6103994..0000000 --- a/sdk/samples/dsshow3d/msvc.mk +++ /dev/null @@ -1,43 +0,0 @@ -NAME = DSShow3D -EXT = EXE - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib dsound.lib shell32.lib \ - comdlg32.lib gdi32.lib winmm.lib msacm32.lib libc.lib uuid.lib ole32.lib comctl32.lib - -OBJS = debug.obj lsnrinfo.obj wave.obj mainwnd.obj dsshow3d.obj fileinfo.obj \ - finfo3d.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Ox -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/dsshow3d/readme.txt b/sdk/samples/dsshow3d/readme.txt deleted file mode 100644 index e63b4d8..0000000 --- a/sdk/samples/dsshow3d/readme.txt +++ /dev/null @@ -1,49 +0,0 @@ -DSShow3D -- DirectSound3D Sample -================================ - - -THIS SAMPLE IS STILL UNDER DEVELOPMENT, PLEASE SEE THE "KNOWN ISSUES" SECTION - -This program is an improved version of the DirectSound Show (DSSHOW) sample -that shipped in previous DirectX SDKs. It features a more compact interface, -support for 3D sounds and new buffer options, the ability to open countless -sounds (i.e. more than 8, which was dsshow's limit), and a new UI that takes -advantage of your entire desktop for placing (or minimizing) windows. - -Here are some things to try: - -* Right click on a volume, frequency, or pan control to select some common - settings. - -* Frequency control will use the full range reported by IDirectSound::GetCaps() - -* Open a bunch of files :) - -* Try using the various focus settings in the File|Open Box - - - -KNOWN ISSUES: -------------- -* No text controls for 3D position - -* Hopefully the client window will get a Direct3D visual representation of the - sound world you're playing with, but this isn't certain - -* Windows all open at the same position -- there will be a cascade option, and - new windows will cascade by default - -* 3D functionality not complete for buffer controls -- missing cone orientation, - min distance, max distance - -* 3D Listener controls not present -- on the way - -* Can't move progress indicator yet - -* Doesn't stream large files automagically (yet) - -* Progress updating is kind of rough (perhaps not frequent enough) - -* Setting frequency to 0 Hz by quickly dragging doesn't behave properly - -* App may not properly respond to user log off while running diff --git a/sdk/samples/dsshow3d/reshead.h b/sdk/samples/dsshow3d/reshead.h deleted file mode 100644 index 30b63c2..0000000 --- a/sdk/samples/dsshow3d/reshead.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifdef APSTUDIO_INVOKED // Built from inside VC -#include "afxres.h" - -#else // Built from the command-line (some command-lines don't have MFC headers) - -#undef RC_INVOKED -#define RC_INVOKED - -#undef IDC_STATIC -#define IDC_STATIC -1 - -#include "windows.h" -#include "commctrl.h" - -#endif diff --git a/sdk/samples/dsshow3d/resource.h b/sdk/samples/dsshow3d/resource.h deleted file mode 100644 index 8bc4eba..0000000 --- a/sdk/samples/dsshow3d/resource.h +++ /dev/null @@ -1,158 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by dsshow3d.rc -// -#define IDR_MAINMENU 101 -#define IDB_SOUNDCARD 102 -#define IDD_ABOUT 103 -#define IDI_SPEAKER_RGB 107 -#define IDI_SPEAKER_RGB_3D 109 -#define IDD_DSENUMBOX 109 -#define IDB_WAVE_3D 110 -#define IDD_FILEOPEN_NEST 110 -#define IDB_WAVE_2D 111 -#define IDB_BUTTON_LOOP 115 -#define IDI_SMALL_3D 119 -#define IDB_OVERLAY_SW 121 -#define IDB_OVERLAY_HW 122 -#define IDB_OVERLAY_S 123 -#define IDB_OVERLAY_H 124 -#define IDB_BUTTON_CLOSE 127 -#define IDB_BUTTON_PLAY 128 -#define IDB_BUTTON_STOP 129 -#define IDB_BUTTON_AUDIBLE 130 -#define IDB_BUTTON_LOOP2 131 -#define IDB_BUTTON_MUTE 132 -#define IDD_BUFFER 132 -#define IDM_POPUPS 134 -#define IDD_BUFFER3D 135 -#define IDM_BUFFERDLG 135 -#define IDD_3DLISTENER 136 -#define IDD_SETTINGS 137 -#define IDS_MB_DRIVERENUM_MESSAGE 512 -#define ID_OK 1001 -#define IDC_FONEST_3D 1001 -#define IDC_FONEST_STICKY_RADIO 1007 -#define IDC_DSENUM_COMBO 1008 -#define IDC_FONEST_GLOBAL_RADIO 1008 -#define IDC_FONEST_GETPOS_RADIO 1009 -#define IDC_FONEST_GETPOS2_RADIO 1010 -#define IDC_FONEST_LOCAL_RADIO 1012 -#define IDC_FONEST_GETPOS_GROUP 1013 -#define IDC_BUFFERDLG_PLAY_BUTTON 1014 -#define IDC_BUFFERDLG_X_SLIDER 1022 -#define IDC_BUFFERDLG_FREQ_SLIDER 1023 -#define IDC_BUFFERDLG_Y_SLIDER 1024 -#define IDS_BUFFERTYPE_HARDWARE 1024 -#define IDC_BUFFERDLG_Z_SLIDER 1025 -#define IDS_BUFFERTYPE_SOFTWARE 1025 -#define IDC_BUFFERDLG_VOL_SLIDER 1026 -#define IDS_FOCUSMODE_LOCAL 1026 -#define IDC_BUFFERDLG_PAN_SLIDER 1027 -#define IDS_FOCUSMODE_STICKY 1027 -#define IDS_FOCUSMODE_GLOBAL 1028 -#define IDS_GETPOSMODE_NORMAL 1029 -#define IDS_GETPOSMODE_GETPOS2 1030 -#define IDC_BUFFERDLG_FOCUS_TEXT 1031 -#define IDS_DATAFORMAT_STEREO 1031 -#define IDC_BUFFERDLG_GETPOS_TEXT 1032 -#define IDS_DATAFORMAT_MONO 1032 -#define IDC_BUFFERDLG_PAN_TEXT 1033 -#define IDC_BUFFERDLG_VOL_TEXT 1034 -#define IDC_BUFFERDLG_FREQ_TEXT 1035 -#define IDC_BUFFERDLG_WRITECURSOR_TEXT 1036 -#define IDC_BUFFERDLG_DATAFORMAT_TEXT 1037 -#define IDC_BUFFERDLG_PLAYCURSOR_TEXT 1038 -#define IDC_BUFFERDLG_PROGRESS_SLIDER 1039 -#define IDC_BUFFERDLG_PROGRESS_SPIN 1057 -#define IDC_BUFFERDLG_OUTERVOL_SLIDER 1059 -#define IDC_BUFFERDLG_OUTERVOL_TEXT 1060 -#define IDC_BUFFERDLG_INNERANGLE_EDIT 1062 -#define IDC_BUFFERDLG_OUTERANGLE_EDIT 1063 -#define IDC_BUFFERDLG_OUTERANGLE_SPIN 1064 -#define IDC_BUFFERDLG_INNERANGLE_SPIN 1065 -#define IDC_BUFFERDLG_PROGRESS_TEXT 1066 -#define IDC_BUFFERDLG_BUFFERTYPE_TEXT 1067 -#define IDC_BUFFERDLG_LOOPED_CHECK 1068 -#define IDC_LISTENER_DISTANCEFACTOR_EDIT 1069 -#define IDC_LISTENER_DOPPLERFACTOR_EDIT 1070 -#define IDC_LISTENER_ROLLOFFFACTOR_EDIT 1071 -#define IDC_SETTINGS_DSD_DEVICE_COMBO 1072 -#define IDC_SETTINGS_DSD_DEFAULT_CHECK 1073 -#define IDC_SETTINGS_DSD_FORMAT_COMBO 1074 -#define IDC_SETTINGS_INITIALDIR_EDIT 1075 -#define IDC_SETTINGS_EXCLUSIVE_CHECK 1077 -#define IDC_SETTINGS_DSD_DEVICE_TEXT 1078 -#define IDC_SETTINGS_OPEN3D_CHECK 1079 -#define IDC_SETTINGS_FOCUS_COMBO 1080 -#define IDC_SETTINGS_BROWSE_INITIALDIR_BUTTON 1081 -#define IDC_LISTENER_X_SLIDER 1082 -#define IDC_LISTENER_X_TEXT 1083 -#define IDC_LISTENER_Y_SLIDER 1084 -#define IDC_BUFFERDLG_Z_TEXT 1084 -#define IDC_LISTENER_Y_TEXT 1085 -#define IDC_BUFFERDLG_Y_TEXT 1085 -#define IDC_LISTENER_Z_SLIDER 1086 -#define IDC_BUFFERDLG_X_TEXT 1086 -#define IDC_LISTENER_Z_TEXT 1087 -#define IDC_BUFFERDLG_DISABLE 1088 -#define ID_FREQCONTEXT_FILEDEFAULT 40001 -#define IDC_FILE_EXIT 40002 -#define ID_FREQCONTEXT_8000HZ 40002 -#define IDC_FILE_OPEN 40003 -#define ID_FREQCONTEXT_11025HZ 40003 -#define ID_FREQCONTEXT_22050HZ 40004 -#define IDC_HELP_ABOUT 40005 -#define ID_FREQCONTEXT_44100HZ 40005 -#define ID_VOLCONTEXT_0DB 40006 -#define IDC_OPTIONS_ENUMDRIVERS 40007 -#define ID_VOLCONTEXT_10DB 40007 -#define ID_VOLCONTEXT_20DB 40008 -#define ID_VOLCONTEXT_30DB 40009 -#define ID_VOLCONTEXT_100DB 40010 -#define ID_PANCONTEXT_CENTER 40011 -#define ID_PANCONTEXT_10DB_LEFT 40012 -#define ID_PANCONTEXT_10DB_RIGHT 40013 -#define ID_PANCONTEXT_FULL_LEFT 40014 -#define ID_PANCONTEXT_FULL_RIGHT 40015 -#define ID_BUFFERDLG_FILE_OPEN 40019 -#define ID_OUTERVOLCONTEXT_0DB 40020 -#define ID_OUTERVOLCONTEXT_10DB 40021 -#define ID_OUTERVOLCONTEXT_20DB 40022 -#define ID_OUTERVOLCONTEXT_30DB 40023 -#define ID_OUTERVOLCONTEXT_100DB 40024 -#define ID_OPTIONS_FORMAT_8M8 40025 -#define ID_OPTIONS_FORMAT_8M16 40026 -#define ID_OPTIONS_FORMAT_8S8 40027 -#define ID_OPTIONS_FORMAT_8S16 40028 -#define ID_OPTIONS_FORMAT_11M8 40029 -#define ID_OPTIONS_FORMAT_11M16 40030 -#define ID_OPTIONS_FORMAT_11S8 40031 -#define ID_OPTIONS_FORMAT_11S16 40032 -#define ID_OPTIONS_FORMAT_22M8 40033 -#define ID_OPTIONS_FORMAT_22M16 40034 -#define ID_OPTIONS_FORMAT_22S8 40035 -#define ID_OPTIONS_FORMAT_22S16 40036 -#define ID_OPTIONS_FORMAT_44S16 40037 -#define ID_OPTIONS_FORMAT_44S8 40038 -#define ID_OPTIONS_FORMAT_44M16 40039 -#define ID_OPTIONS_FORMAT_44M8 40040 -#define IDC_OPTIONS_SETTINGS 40041 -#define IDC_BUFFERS_MINIMIZEALL 40042 -#define IDC_BUFFERS_RESTOREALL 40043 -#define IDC_BUFFERS_CLOSEALL 40044 -#define IDC_BUFFERS_CASCADE 40045 -#define ID_POSCONTEXT_ORIGIN 40047 -#define ID_POSCONTEXT_LISTENERPOSITION 40049 -#define ID_BUFFERDLG_DUPLICATE 40050 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 138 -#define _APS_NEXT_COMMAND_VALUE 40051 -#define _APS_NEXT_CONTROL_VALUE 1087 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/dsshow3d/watcom.mk b/sdk/samples/dsshow3d/watcom.mk deleted file mode 100644 index 62f4447..0000000 --- a/sdk/samples/dsshow3d/watcom.mk +++ /dev/null @@ -1,43 +0,0 @@ -NAME = DSShow3D -EXT = EXE - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib ..\..\..\lib\dsound.lib uuid.lib ole32.lib comctl32.lib - -OBJS = debug.obj lsnrinfo.obj wave.obj mainwnd.obj dsshow3d.obj fileinfo.obj finfo3d.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) tmp.lib $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) library tmp.lib @$(NAME).lnk - $(RC) $(RES) - -# -# need this because Watcom's libs don't have the ACM entries and the IMPORT -# statement on the linker doesn't work the way we want -# -tmp.lib : tmp.lbc - @wlib -q tmp.lib @tmp.lbc > NUL - -tmp.lbc : ..\$(MAKENAME) - @%write tmp.lbc ++_acmMetrics.'MSACM32.DLL'._acmMetrics.acmMetrics diff --git a/sdk/samples/dsshow3d/wave.c b/sdk/samples/dsshow3d/wave.c deleted file mode 100644 index fe74cb6..0000000 --- a/sdk/samples/dsshow3d/wave.c +++ /dev/null @@ -1,894 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wave.c - * Content: Wave library routines. - * This file is used for loading/saving waves, and reading and - * writing waves in smaller blocks. - * Uses WaveOpenFile, WaveReadFile and WaveCloseReadFile for - * single block access to reading wave files. - * Uses WaveCreateFile, WaveWriteFile, WaveCloseWriteFile for - * single block access for writing wave files. - * Uses WaveLoadFile to load a whole wave file into memory. - * Uses WaveSaveFile to save a whole wave file into memory. - * - ***************************************************************************/ - -/* PROTOTYPES */ -#include -#include -#include "wave.h" -#include "debug.h" -#include "windowsx.h" - - -/* ROUTINES */ -/* -------------------------------------------------------*/ - -/* This function will open a wave input file and prepare it for reading, - * so the data can be easily - * read with WaveReadFile. Returns 0 if successful, the error code if not. - * pszFileName - Input filename to load. - * phmmioIn - Pointer to handle which will be used - * for further mmio routines. - * ppwfxInfo - Ptr to ptr to WaveFormatEx structure - * with all info about the file. - * -*/ -int WaveOpenFile( - char *pszFileName, // (IN) - HMMIO *phmmioIn, // (OUT) - WAVEFORMATEX **ppwfxInfo, // (OUT) - MMCKINFO *pckInRIFF // (OUT) - ) -{ - HMMIO hmmioIn; - MMCKINFO ckIn; // chunk info. for general use. - PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in. - WORD cbExtraAlloc; // Extra bytes for waveformatex - int nError; // Return value. - - - // Initialization... - *ppwfxInfo = NULL; - nError = 0; - hmmioIn = NULL; - - if ((hmmioIn = mmioOpen(pszFileName, NULL, MMIO_ALLOCBUF | MMIO_READ)) == NULL) - { - nError = ER_CANNOTOPEN; - goto ERROR_READING_WAVE; - } - - if ((nError = (int)mmioDescend(hmmioIn, pckInRIFF, NULL, 0)) != 0) - { - goto ERROR_READING_WAVE; - } - - - if ((pckInRIFF->ckid != FOURCC_RIFF) || (pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E'))) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Search the input file for for the 'fmt ' chunk. */ - ckIn.ckid = mmioFOURCC('f', 'm', 't', ' '); - if ((nError = (int)mmioDescend(hmmioIn, &ckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - /* Expect the 'fmt' chunk to be at least as large as ; - * if there are extra parameters at the end, we'll ignore them */ - - if (ckIn.cksize < (long) sizeof(PCMWAVEFORMAT)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Read the 'fmt ' chunk into .*/ - if (mmioRead(hmmioIn, (HPSTR) &pcmWaveFormat, (long) sizeof(pcmWaveFormat)) != (long) sizeof(pcmWaveFormat)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - - // Ok, allocate the waveformatex, but if its not pcm - // format, read the next word, and thats how many extra - // bytes to allocate. - if (pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM) - cbExtraAlloc = 0; - - else - { - // Read in length of extra bytes. - if (mmioRead(hmmioIn, (LPSTR) &cbExtraAlloc, - (long) sizeof(cbExtraAlloc)) != (long) sizeof(cbExtraAlloc)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - } - - // Ok, now allocate that waveformatex structure. - if ((*ppwfxInfo = GlobalAlloc(GMEM_FIXED, sizeof(WAVEFORMATEX)+cbExtraAlloc)) == NULL) - { - nError = ER_MEM; - goto ERROR_READING_WAVE; - } - - // Copy the bytes from the pcm structure to the waveformatex structure - memcpy(*ppwfxInfo, &pcmWaveFormat, sizeof(pcmWaveFormat)); - (*ppwfxInfo)->cbSize = cbExtraAlloc; - - // Now, read those extra bytes into the structure, if cbExtraAlloc != 0. - if (cbExtraAlloc != 0) - { - if (mmioRead(hmmioIn, (LPSTR) (((BYTE*)&((*ppwfxInfo)->cbSize))+sizeof(cbExtraAlloc)), - (long) (cbExtraAlloc)) != (long) (cbExtraAlloc)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - } - - /* Ascend the input file out of the 'fmt ' chunk. */ - if ((nError = mmioAscend(hmmioIn, &ckIn, 0)) != 0) - { - goto ERROR_READING_WAVE; - - } - - - goto TEMPCLEANUP; - -ERROR_READING_WAVE: - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - -TEMPCLEANUP: - *phmmioIn = hmmioIn; - - return(nError); - -} - -/* This routine has to be called before WaveReadFile as it searchs for the chunk to descend into for - reading, that is, the 'data' chunk. For simplicity, this used to be in the open routine, but was - taken out and moved to a separate routine so there was more control on the chunks that are before - the data chunk, such as 'fact', etc... */ - -int WaveStartDataRead( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRIFF - ) -{ - int nError; - - nError = 0; - - // Do a nice little seek... - if ((nError = mmioSeek(*phmmioIn, pckInRIFF->dwDataOffset + sizeof(FOURCC), SEEK_SET)) == -1) - { - ASSERT(FALSE); - } - - nError = 0; - // Search the input file for for the 'data' chunk. - pckIn->ckid = mmioFOURCC('d', 'a', 't', 'a'); - if ((nError = mmioDescend(*phmmioIn, pckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - goto CLEANUP; - -ERROR_READING_WAVE: - -CLEANUP: - return(nError); -} - - -/* This will read wave data from the wave file. Makre sure we're descended into - the data chunk, else this will fail bigtime! - hmmioIn - Handle to mmio. - cbRead - # of bytes to read. - pbDest - Destination buffer to put bytes. - cbActualRead- # of bytes actually read. - - - -*/ - - -int WaveReadFile( - HMMIO hmmioIn, // IN - UINT cbRead, // IN - BYTE *pbDest, // IN - MMCKINFO *pckIn, // IN. - UINT *cbActualRead // OUT. - - ) -{ - - MMIOINFO mmioinfoIn; // current status of - int nError; - UINT cT, cbDataIn; - - nError = 0; - - if (nError = mmioGetInfo(hmmioIn, &mmioinfoIn, 0) != 0) - { - goto ERROR_CANNOT_READ; - } - - cbDataIn = cbRead; - if (cbDataIn > pckIn->cksize) - cbDataIn = pckIn->cksize; - - pckIn->cksize -= cbDataIn; - - for (cT = 0; cT < cbDataIn; cT++) - { - /* Copy the bytes from the io to the buffer. */ - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - if ((nError = mmioAdvance(hmmioIn, &mmioinfoIn, MMIO_READ)) != 0) - { - goto ERROR_CANNOT_READ; - } - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - nError = ER_CORRUPTWAVEFILE; - goto ERROR_CANNOT_READ; - } - } - - // Actual copy. - *((BYTE*)pbDest+cT) = *((BYTE*)mmioinfoIn.pchNext)++; - } - - if ((nError = mmioSetInfo(hmmioIn, &mmioinfoIn, 0)) != 0) - { - goto ERROR_CANNOT_READ; - } - - *cbActualRead = cbDataIn; - goto FINISHED_READING; - -ERROR_CANNOT_READ: - *cbActualRead = 0; - -FINISHED_READING: - return(nError); - -} - -/* This will close the wave file openned with WaveOpenFile. - phmmioIn - Pointer to the handle to input MMIO. - ppwfxSrc - Pointer to pointer to WaveFormatEx structure. - - Returns 0 if successful, non-zero if there was a warning. - -*/ -int WaveCloseReadFile( - HMMIO *phmmio, // IN - WAVEFORMATEX **ppwfxSrc // IN - ) -{ - - if (*ppwfxSrc != NULL) - { - GlobalFree(*ppwfxSrc); - *ppwfxSrc = NULL; - } - - if (*phmmio != NULL) - { - mmioClose(*phmmio, 0); - *phmmio = NULL; - } - - return(0); - -} - -/* This routine will create a wave file for writing. This will automatically overwrite any - existing file with the same name, so be careful and check before hand!!! - pszFileName - Pointer to filename to write. - phmmioOut - Pointer to HMMIO handle that is used for further writes - pwfxDest - Valid waveformatex destination structure. - pckOut - Pointer to be set with the MMCKINFO. - pckOutRIFF - Pointer to be set with the RIFF info. - -*/ -int WaveCreateFile( - char *pszFileName, // (IN) - HMMIO *phmmioOut, // (OUT) - WAVEFORMATEX *pwfxDest, // (IN) - MMCKINFO *pckOut, // (OUT) - MMCKINFO *pckOutRIFF // (OUT) - - ) -{ - - int nError; // Return value. - DWORD dwFactChunk; // Contains the actual fact chunk. Garbage until WaveCloseWriteFile. - MMCKINFO ckOut1; - - dwFactChunk = (DWORD)-1; - nError = 0; - - *phmmioOut = mmioOpen(pszFileName, NULL, - MMIO_ALLOCBUF | MMIO_READWRITE|MMIO_CREATE); - - if (*phmmioOut == NULL) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot save WAVE file - } - - /* Create the output file RIFF chunk of form type 'WAVE'. - */ - pckOutRIFF->fccType = mmioFOURCC('W', 'A', 'V', 'E'); - pckOutRIFF->cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, pckOutRIFF, MMIO_CREATERIFF)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - /* We are now descended into the 'RIFF' chunk we just created. - * Now create the 'fmt ' chunk. Since we know the size of this chunk, - * specify it in the MMCKINFO structure so MMIO doesn't have to seek - * back and set the chunk size after ascending from the chunk. - */ - pckOut->ckid = mmioFOURCC('f', 'm', 't', ' '); - pckOut->cksize = sizeof(PCMWAVEFORMAT); // we know the size of this ck. - if ((nError = mmioCreateChunk(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - /* Write the PCMWAVEFORMAT structure to the 'fmt ' chunk if its that type. */ - if (pwfxDest->wFormatTag == WAVE_FORMAT_PCM) - { - if (mmioWrite(*phmmioOut, (HPSTR) pwfxDest, sizeof(PCMWAVEFORMAT)) - != sizeof(PCMWAVEFORMAT)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - } - - else - { - // Write the variable length size. - if ((UINT)mmioWrite(*phmmioOut, (HPSTR) pwfxDest, sizeof(*pwfxDest)+pwfxDest->cbSize) - != (sizeof(*pwfxDest)+pwfxDest->cbSize)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - } - - /* Ascend out of the 'fmt ' chunk, back into the 'RIFF' chunk. - */ - if ((nError = mmioAscend(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - // Now create the fact chunk, not required for PCM but nice to have. This is filled - // in when the close routine is called. - ckOut1.ckid = mmioFOURCC('f', 'a', 'c', 't'); - ckOut1.cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, &ckOut1, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - if (mmioWrite(*phmmioOut, (HPSTR)&dwFactChunk, sizeof(dwFactChunk)) != sizeof(dwFactChunk)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; - } - - // Now ascend out of the fact chunk... - if ((nError = mmioAscend(*phmmioOut, &ckOut1, 0)) != 0) - { - nError = ER_CANNOTWRITE; // cannot write file, probably - goto ERROR_CANNOT_WRITE; - } - - - - goto DONE_CREATE; - -ERROR_CANNOT_WRITE: - // Maybe delete the half-written file? Ah forget it for now, its good to leave the - // file there for debugging... - -DONE_CREATE: - return(nError); - -} - -/* This routine has to be called before any data is written to the wave output file, via wavewritefile. This - sets up the data to write, and creates the data chunk. -*/ - -int WaveStartDataWrite( - HMMIO *phmmioOut, // (IN) - MMCKINFO *pckOut, // (IN) - MMIOINFO *pmmioinfoOut // (OUT) - ) -{ - - int nError; - - nError = 0; - /* Create the 'data' chunk that holds the waveform samples. */ - pckOut->ckid = mmioFOURCC('d', 'a', 't', 'a'); - pckOut->cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - if ((nError = mmioGetInfo(*phmmioOut, pmmioinfoOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - - goto CLEANUP; -ERROR_CANNOT_WRITE: - -CLEANUP: - return(nError); -} - -/* This routine will write out data to a wave file. - hmmioOut - Handle to hmmioOut filled by WaveCreateFile - cbWrite - # of bytes to write out. - pbSrc - Pointer to source. - pckOut - pointer to ckOut filled by WaveCreateFile - cbActualWrite - # of actual bytes written. - pmmioinfoOut - Pointer to mmioinfoOut filled by WaveCreateFile. - - Returns 0 if successful, else the error code. - - */ - - -int WaveWriteFile( - HMMIO hmmioOut, // (IN) - UINT cbWrite, // (IN) - BYTE *pbSrc, // (IN) - MMCKINFO *pckOut, // (IN) - UINT *cbActualWrite, // (OUT) - MMIOINFO *pmmioinfoOut // (IN) - ) -{ - - - int nError; - UINT cT; - - nError = 0; - - *cbActualWrite = 0; - - for (cT=0; cT < cbWrite; cT++) - { - if (pmmioinfoOut->pchNext == pmmioinfoOut->pchEndWrite) - { - pmmioinfoOut->dwFlags |= MMIO_DIRTY; - if ((nError = mmioAdvance(hmmioOut, pmmioinfoOut, MMIO_WRITE)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - } - *((BYTE*)pmmioinfoOut->pchNext)++ = *((BYTE*)pbSrc+cT); - (*cbActualWrite)++; - } - - -ERROR_CANNOT_WRITE: - // What to do here? Well, for now, nothing, just return that error. (maybe delete the - // file later? - - return(nError); - -} - - - -/* This routine will close a wave file used for writing. Returns 0 if successful, else - the error code. - phmmioOut - Pointer to mmio handle for saving. - pckOut - Pointer to the MMCKINFO for saving. - pckOutRiff - Pointer to the riff MMCKINFO for saving. - pmmioinfoOut- Pointer to mmioinfo for saving. - cSamples - # of samples saved, for the fact chunk. For PCM, this isn't used but - will be written anyway, so this can be zero as long as programs ignore - this field when they load PCM formats. - - - -*/ -int WaveCloseWriteFile( - HMMIO *phmmioOut, // (IN) - MMCKINFO *pckOut, // (IN) - MMCKINFO *pckOutRIFF, // (IN) - MMIOINFO *pmmioinfoOut, // (IN) - DWORD cSamples // (IN) - ) -{ - - int nError; - - nError = 0; - - if (*phmmioOut == NULL) - return(0); - - pmmioinfoOut->dwFlags |= MMIO_DIRTY; - if ((nError = mmioSetInfo(*phmmioOut, pmmioinfoOut, 0)) != 0) - { - // cannot flush, probably... - goto ERROR_CANNOT_WRITE; - } - - /* Ascend the output file out of the 'data' chunk -- this will cause - * the chunk size of the 'data' chunk to be written. - */ - if ((nError = mmioAscend(*phmmioOut, pckOut, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - // Do this here instead... - if ((nError = mmioAscend(*phmmioOut, pckOutRIFF, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - nError = mmioSeek(*phmmioOut, 0, SEEK_SET); - if ((nError = (int)mmioDescend(*phmmioOut, pckOutRIFF, NULL, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - - nError = 0; - pckOut->ckid = mmioFOURCC('f', 'a', 'c', 't'); - if ((nError = mmioDescend(*phmmioOut, pckOut, pckOutRIFF, MMIO_FINDCHUNK)) == 0) - { - // If it didn't fail, write the fact chunk out, if it failed, not critical, just - // assert (below). - nError = mmioWrite(*phmmioOut, (HPSTR)&cSamples, sizeof(DWORD)); - nError = mmioAscend(*phmmioOut, pckOut, 0); - nError = 0; - } - else - { - nError = 0; - ASSERT(FALSE); - } - -// CANTWRITEFACT: - /* Ascend the output file out of the 'RIFF' chunk -- this will cause - * the chunk size of the 'RIFF' chunk to be written. - */ - if ((nError = mmioAscend(*phmmioOut, pckOutRIFF, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - -ERROR_CANNOT_WRITE: - if (*phmmioOut != NULL) - { - mmioClose(*phmmioOut, 0); - *phmmioOut = NULL; - } - - return(nError); - -} - -/* This routine will copy from a source wave file to a destination wave file all those useless chunks - (well, the ones useless to conversions, etc --> apparently people use them!). The source will be - seeked to the begining, but the destination has to be at a current pointer to put the new chunks. - This will also seek back to the start of the wave riff header at the end of the routine. - - phmmioIn - Pointer to input mmio file handle. - pckIn - Pointer to a nice ckIn to use. - pckInRiff - Pointer to the main riff. - phmmioOut - Pointer to output mmio file handle. - pckOut - Pointer to nice ckOut to use. - pckOutRiff - Pointer to the main riff. - - - Returns 0 if successful, else the error code. If this routine fails, it still attemps to seek back to - the start of the wave riff header, though this too could be unsuccessful. -*/ - -int WaveCopyUselessChunks( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRiff, - HMMIO *phmmioOut, - MMCKINFO *pckOut, - MMCKINFO *pckOutRiff) -{ - - int nError; - - nError = 0; - // First seek to the stinking start of the file, not including the riff header... - if ((nError = mmioSeek(*phmmioIn, pckInRiff->dwDataOffset + sizeof(FOURCC), SEEK_SET)) == -1) - { - nError = ER_CANNOTREAD; - goto ERROR_IN_PROC; - } - - nError = 0; - - while (mmioDescend(*phmmioIn, pckIn, pckInRiff, 0) == 0) - { - - // quickly check for corrupt RIFF file--don't ascend past end! - if ((pckIn->dwDataOffset + pckIn->cksize) > (pckInRiff->dwDataOffset + pckInRiff->cksize)) - goto ERROR_IN_PROC; - - switch (pckIn->ckid) - { - // explicitly skip these... - case mmioFOURCC('f', 'm', 't', ' '): - break; - - case mmioFOURCC('d', 'a', 't', 'a'): - break; - - case mmioFOURCC('f', 'a', 'c', 't'): - break; - - case mmioFOURCC('J', 'U', 'N', 'K'): - break; - - case mmioFOURCC('P', 'A', 'D', ' '): - break; - - case mmioFOURCC('c', 'u', 'e', ' '): - break; - - // copy chunks that are OK to copy - case mmioFOURCC('p', 'l', 's', 't'): - // although without the 'cue' chunk, it doesn't make much sense - riffCopyChunk(*phmmioIn, *phmmioOut, pckIn); - break; - - case mmioFOURCC('D', 'I', 'S', 'P'): - riffCopyChunk(*phmmioIn, *phmmioOut, pckIn); - break; - - - // don't copy unknown chunks - default: - break; - } - - - // step up to prepare for next chunk.. - mmioAscend(*phmmioIn, pckIn, 0); - } - -ERROR_IN_PROC: - { - int nErrorT; - // Seek back to riff header - nErrorT = mmioSeek(*phmmioIn, pckInRiff->dwDataOffset + sizeof(FOURCC), SEEK_SET); - } - - return(nError); -} - -/** BOOL RIFFAPI riffCopyChunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck) - * - * DESCRIPTION: - * - * - * ARGUMENTS: - * (LPWAVECONVCB lpwc, LPMMCKINFO lpck) - * - * RETURN (BOOL NEAR PASCAL): - * - * - * NOTES: - * - ** */ - -BOOL riffCopyChunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck) -{ - MMCKINFO ck; - HPSTR hpBuf; - - // - // - // - hpBuf = (HPSTR)GlobalAllocPtr(GHND, lpck->cksize); - if (!hpBuf) - return (FALSE); - - ck.ckid = lpck->ckid; - ck.cksize = lpck->cksize; - if (mmioCreateChunk(hmmioDst, &ck, 0)) - goto rscc_Error; - - if (mmioRead(hmmioSrc, hpBuf, lpck->cksize) != (LONG)lpck->cksize) - goto rscc_Error; - - if (mmioWrite(hmmioDst, hpBuf, lpck->cksize) != (LONG)lpck->cksize) - goto rscc_Error; - - if (mmioAscend(hmmioDst, &ck, 0)) - goto rscc_Error; - - if (hpBuf) - GlobalFreePtr(hpBuf); - - return (TRUE); - -rscc_Error: - - if (hpBuf) - GlobalFreePtr(hpBuf); - - return (FALSE); -} /* RIFFSupCopyChunk() */ - - - -/* This routine loads a full wave file into memory. Be careful, wave files can get - pretty big these days :). - szFileName - sz Filename - cbSize - Size of loaded wave (returned) - cSamples - # of samples loaded. - ppwfxInfo - Pointer to pointer to waveformatex structure. The wfx structure - IS ALLOCATED by this routine! Make sure to free it! - ppbData - Pointer to a byte pointer (globalalloc) which is allocated by this - routine. Make sure to free it! - - Returns 0 if successful, else the error code. -*/ - -int WaveLoadFile( - char *pszFileName, // (IN) - UINT *cbSize, // (OUT) - WAVEFORMATEX **ppwfxInfo, // (OUT) - BYTE **ppbData // (OUT) - ) -{ - - HMMIO hmmioIn; - MMCKINFO ckInRiff; - MMCKINFO ckIn; - int nError; - UINT cbActualRead; - - *ppbData = NULL; - *ppwfxInfo = NULL; - *cbSize = 0; - - if ((nError = WaveOpenFile(pszFileName, &hmmioIn, ppwfxInfo, &ckInRiff)) != 0) - { - goto ERROR_LOADING; - } - - if ((nError = WaveStartDataRead(&hmmioIn, &ckIn, &ckInRiff)) != 0) - { - goto ERROR_LOADING; - } - - // Ok, size of wave data is in ckIn, allocate that buffer. - if ((*ppbData = (BYTE *)GlobalAlloc(GMEM_FIXED, ckIn.cksize)) == NULL) - { - nError = ER_MEM; - goto ERROR_LOADING; - } - - if ((nError = WaveReadFile(hmmioIn, ckIn.cksize, *ppbData, &ckIn, &cbActualRead)) != 0) - { - goto ERROR_LOADING; - } - - *cbSize = cbActualRead; - goto DONE_LOADING; - -ERROR_LOADING: - if (*ppbData != NULL) - { - GlobalFree(*ppbData); - *ppbData = NULL; - } - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - -DONE_LOADING: - // Close the wave file. - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - - return(nError); - -} - -/* This routine saves a wave file in currently in memory. - pszFileName - FileName to save to. Automatically overwritten, be careful! - cbSize - Size in bytes to write. - cSamples - # of samples to write, used to make the fact chunk. (if !PCM) - pwfxDest - Pointer to waveformatex structure. - pbData - Pointer to the data. -*/ - -int WaveSaveFile( - char *pszFileName, // (IN) - UINT cbSize, // (IN) - DWORD cSamples, // (IN) - WAVEFORMATEX *pwfxDest, // (IN) - BYTE *pbData // (IN) - ) -{ - - HMMIO hmmioOut; - MMCKINFO ckOut; - MMCKINFO ckOutRIFF; - MMIOINFO mmioinfoOut; - UINT cbActualWrite; - int nError; - - if ((nError = WaveCreateFile(pszFileName, &hmmioOut, pwfxDest, &ckOut, &ckOutRIFF)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveStartDataWrite(&hmmioOut, &ckOut, &mmioinfoOut)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveWriteFile(hmmioOut, cbSize, pbData, &ckOut, &cbActualWrite, &mmioinfoOut)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveCloseWriteFile(&hmmioOut, &ckOut, &ckOutRIFF, &mmioinfoOut, cSamples)) != 0) - { - goto ERROR_SAVING; - } - -ERROR_SAVING: - - return(nError); - -} diff --git a/sdk/samples/dsshow3d/wave.h b/sdk/samples/dsshow3d/wave.h deleted file mode 100644 index 92b007b..0000000 --- a/sdk/samples/dsshow3d/wave.h +++ /dev/null @@ -1,67 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wave.h - * Content: wave header - * - ***************************************************************************/ -#ifndef __WAVE_INCLUDED__ -#define __WAVE_INCLUDED__ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define WAVEVERSION 1 - -#ifndef ER_MEM -#define ER_MEM 0xe000 -#endif - -#ifndef ER_CANNOTOPEN -#define ER_CANNOTOPEN 0xe100 -#endif - -#ifndef ER_NOTWAVEFILE -#define ER_NOTWAVEFILE 0xe101 -#endif - -#ifndef ER_CANNOTREAD -#define ER_CANNOTREAD 0xe102 -#endif - -#ifndef ER_CORRUPTWAVEFILE -#define ER_CORRUPTWAVEFILE 0xe103 -#endif - -#ifndef ER_CANNOTWRITE -#define ER_CANNOTWRITE 0xe104 -#endif - - - -int WaveOpenFile(char *, HMMIO *, WAVEFORMATEX **, MMCKINFO *); -int WaveStartDataRead(HMMIO *, MMCKINFO *, MMCKINFO *); -int WaveReadFile(HMMIO, UINT, BYTE *, MMCKINFO *, UINT *); -int WaveCloseReadFile(HMMIO *, WAVEFORMATEX **); - -int WaveCreateFile(char *, HMMIO *, WAVEFORMATEX *, MMCKINFO *, MMCKINFO *); -int WaveStartDataWrite(HMMIO *, MMCKINFO *, MMIOINFO *); -int WaveWriteFile(HMMIO, UINT, BYTE *, MMCKINFO *, UINT *, MMIOINFO *); -int WaveCloseWriteFile(HMMIO *, MMCKINFO *, MMCKINFO *, MMIOINFO *, DWORD); - -int WaveLoadFile(char *, UINT *, WAVEFORMATEX **, BYTE **); -int WaveSaveFile(char *, UINT, DWORD, WAVEFORMATEX *, BYTE *); - -int WaveCopyUselessChunks(HMMIO *, MMCKINFO *, MMCKINFO *, HMMIO *, MMCKINFO *, MMCKINFO *); -BOOL riffCopyChunk(HMMIO, HMMIO, const LPMMCKINFO); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/sdk/samples/dsstream/debug.c b/sdk/samples/dsstream/debug.c deleted file mode 100644 index ebd7c8f..0000000 --- a/sdk/samples/dsstream/debug.c +++ /dev/null @@ -1,356 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.c - * Content: debug code - * - ***************************************************************************/ - -#ifdef DEBUG - -#include -#include -#include -#include "debug.h" - - -// -// since we don't UNICODE our debugging messages, use the ASCII entry -// points regardless of how we are compiled. -// -#ifdef _WIN32 - #include -#else - #define lstrcatA lstrcat - #define lstrlenA lstrlen - #define GetProfileIntA GetProfileInt - #define OutputDebugStringA OutputDebugString - #define wsprintfA wsprintf - #define MessageBoxA MessageBox -#endif - -// -// -// -BOOL __gfDbgEnabled = TRUE; // master enable -UINT __guDbgLevel = 0; // current debug level - - -//--------------------------------------------------------------------------; -// -// void DbgVPrintF -// -// Description: -// -// -// Arguments: -// LPSTR szFormat: -// -// va_list va: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL DbgVPrintF -( - LPSTR szFormat, - va_list va -) -{ - char ach[DEBUG_MAX_LINE_LEN]; - BOOL fDebugBreak = FALSE; - BOOL fPrefix = TRUE; - BOOL fCRLF = TRUE; - - ach[0] = '\0'; - - for (;;) - { - switch (*szFormat) - { - case '!': - fDebugBreak = TRUE; - szFormat++; - continue; - - case '`': - fPrefix = FALSE; - szFormat++; - continue; - - case '~': - fCRLF = FALSE; - szFormat++; - continue; - } - - break; - } - - if (fDebugBreak) - { - ach[0] = '\007'; - ach[1] = '\0'; - } - - if (fPrefix) - { - lstrcatA(ach, DEBUG_MODULE_NAME ": "); - } - -#ifdef _WIN32 - wvsprintfA(ach + lstrlenA(ach), szFormat, va); -#else - wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va); -#endif - - if (fCRLF) - { - lstrcatA(ach, "\r\n"); - } - - OutputDebugStringA(ach); - - if (fDebugBreak) - { - DebugBreak(); - } -} // DbgVPrintF() - - -//--------------------------------------------------------------------------; -// -// void dprintf -// -// Description: -// dprintf() is called by the DPF() macro if DEBUG is defined at compile -// time. It is recommended that you only use the DPF() macro to call -// this function--so you don't have to put #ifdef DEBUG around all -// of your code. -// -// Arguments: -// UINT uDbgLevel: -// -// LPSTR szFormat: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL dprintf -( - UINT uDbgLevel, - LPSTR szFormat, - ... -) -{ - va_list va; - - if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel)) - return; - - va_start(va, szFormat); - DbgVPrintF(szFormat, va); - va_end(va); -} // dprintf() - - -//--------------------------------------------------------------------------; -// -// BOOL DbgEnable -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (BOOL): -// Returns the previous debugging state. -// -//--------------------------------------------------------------------------; - -BOOL WINAPI DbgEnable -( - BOOL fEnable -) -{ - BOOL fOldState; - - fOldState = __gfDbgEnabled; - __gfDbgEnabled = fEnable; - - return (fOldState); -} // DbgEnable() - - -//--------------------------------------------------------------------------; -// -// UINT DbgSetLevel -// -// Description: -// -// -// Arguments: -// UINT uLevel: -// -// Return (UINT): -// Returns the previous debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgSetLevel -( - UINT uLevel -) -{ - UINT uOldLevel; - - uOldLevel = __guDbgLevel; - __guDbgLevel = uLevel; - - return (uOldLevel); -} // DbgSetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgGetLevel -// -// Description: -// -// -// Arguments: -// None. -// -// Return (UINT): -// Returns the current debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgGetLevel -( - void -) -{ - return (__guDbgLevel); -} // DbgGetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgInitialize -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (UINT): -// Returns the debugging level that was set. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgInitialize -( - BOOL fEnable -) -{ - UINT uLevel; - - uLevel = GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, (UINT)-1); - if ((UINT)-1 == uLevel) - { - // - // if the debug key is not present, then force debug output to - // be disabled. this way running a debug version of a component - // on a non-debugging machine will not generate output unless - // the debug key exists. - // - uLevel = 0; - fEnable = FALSE; - } - - DbgSetLevel(uLevel); - DbgEnable(fEnable); - - return (__guDbgLevel); -} // DbgInitialize() - - -//--------------------------------------------------------------------------; -// -// void _Assert -// -// Description: -// This routine is called if the ASSERT macro (defined in debug.h) -// tests and expression that evaluates to FALSE. This routine -// displays an "assertion failed" message box allowing the user to -// abort the program, enter the debugger (the "retry" button), or -// ignore the assertion and continue executing. The message box -// displays the file name and line number of the _Assert() call. -// -// Arguments: -// char * szFile: Filename where assertion occurred. -// int iLine: Line number of assertion. -// -//--------------------------------------------------------------------------; - -#ifndef _WIN32 -#pragma warning(disable:4704) -#endif - -void WINAPI _Assert -( - char * szFile, - int iLine -) -{ - static char ach[300]; // debug output (avoid stack overflow) - int id; -#ifndef _WIN32 - int iExitCode; -#endif - - wsprintfA(ach, "Assertion failed in file %s, line %d. [Press RETRY to debug.]", (LPSTR)szFile, iLine); - - id = MessageBoxA(NULL, ach, "Assertion Failed", - MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE ); - - switch (id) - { - - case IDABORT: // Kill the application. -#ifndef _WIN32 - iExitCode = 0; - _asm - { - mov ah, 4Ch - mov al, BYTE PTR iExitCode - int 21h - } -#else - FatalAppExit(0, TEXT("Good Bye")); -#endif // WIN16 - break; - - case IDRETRY: // Break into the debugger. - DebugBreak(); - break; - - case IDIGNORE: // Ignore assertion, continue executing. - break; - } -} // _Assert - -#ifndef _WIN32 -#pragma warning(default:4704) -#endif - -#endif // #ifdef DEBUG - diff --git a/sdk/samples/dsstream/debug.h b/sdk/samples/dsstream/debug.h deleted file mode 100644 index f2de178..0000000 --- a/sdk/samples/dsstream/debug.h +++ /dev/null @@ -1,80 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.h - * Content: debug header - * - ***************************************************************************/ -#ifndef __DEBUG_INCLUDED__ -#define __DEBUG_INCLUDED__ -#ifdef __cplusplus -extern "C" -{ -#endif - -// -// -// -// -#ifdef DEBUG - #define DEBUG_SECTION "Debug" // section name for - #define DEBUG_MODULE_NAME "DSSTREAM" // key name and prefix for output - #define DEBUG_MAX_LINE_LEN 255 // max line length (bytes!) -#endif - - -// -// based code makes since only in win 16 (to try and keep stuff out of -// [fixed] data segments, etc)... -// -#ifndef BCODE -#ifdef _WIN32 - #define BCODE -#else - #define BCODE _based(_segname("_CODE")) -#endif -#endif - - - - -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; -// -// -// -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - -#ifdef DEBUG - BOOL WINAPI DbgEnable(BOOL fEnable); - UINT WINAPI DbgGetLevel(void); - UINT WINAPI DbgSetLevel(UINT uLevel); - UINT WINAPI DbgInitialize(BOOL fEnable); - void WINAPI _Assert( char * szFile, int iLine ); - - void FAR CDECL dprintf(UINT uDbgLevel, LPSTR szFmt, ...); - - #define D(x) {x;} - #define DPF dprintf - #define DPI(sz) {static char BCODE ach[] = sz; OutputDebugStr(ach);} - #define ASSERT(x) if( !(x) ) _Assert( __FILE__, __LINE__) -#else - #define DbgEnable(x) FALSE - #define DbgGetLevel() 0 - #define DbgSetLevel(x) 0 - #define DbgInitialize(x) 0 - - #ifdef _MSC_VER - #pragma warning(disable:4002) - #endif - - #define D(x) - #define DPF() - #define DPI(sz) - #define ASSERT(x) -#endif - -#ifdef __cplusplus -} -#endif -#endif // __DEBUG_INCLUDED__ diff --git a/sdk/samples/dsstream/dsstream.c b/sdk/samples/dsstream/dsstream.c deleted file mode 100644 index 1f4ba9d..0000000 --- a/sdk/samples/dsstream/dsstream.c +++ /dev/null @@ -1,1617 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dsstream.c - * Content: Illustrates streaming data from a disk WAVE file to a - * DirectSound secondary buffer for playback. - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dsstream.h" -#include "wassert.h" - -char szAppClass[] = "DSStreamWndClass"; -char szAppName[] = "DSStream"; - -char szAppTitle[64]; -char szAppCaption[64]; -char szPan[32]; -char szVolume[32]; -char szFrequency[32]; -char szProgress[32]; -char szOpenFilter[128]; -char szOpenDLGTitle[64]; - - -char szTemp[256]; -char szDebug[128]; -char szFileBuffer[MAX_PATH]; -char szFileTitle[MAX_PATH]; -char szCDStartPath[MAX_PATH]; // The path to start the Open dialog in - -// Registry Key and Value names that allow us to retrive a path something like -// "C:\DXSDK\SDK\MEDIA", but matching the current install. -static const TCHAR gszRegKeyDirect3D[] = TEXT("Software\\Microsoft\\Direct3D"); -static const TCHAR gszRegValueD3DPath[] = TEXT("D3D Path"); - -// Size of longest token below -#define MAX_TOKEN_LEN 7 - - -static TCHAR gszPlayToken[] = TEXT("PLAY"); -static TCHAR gszLoopToken[] = TEXT("LOOP"); -static TCHAR gszCloseToken[] = TEXT("CLOSE"); -static TCHAR gszStickyToken[] = TEXT("STICKY"); -static TCHAR gszGlobalToken[] = TEXT("GLOBAL"); - -LPDIRECTSOUND lpDS = NULL; -LPDIRECTSOUNDBUFFER lpDSBStreamBuffer = NULL; - -WAVEINFOCA wiWave; - -HWND hWndMain, hWndPan, hWndPanText, hWndVol, hWndVolText, hWndFreqText; -HWND hWndBar, hWndPlay, hWndStop, hWndLoopCheck, hWndFreq, hWndProg; -HWND hWndProgText; - -#ifdef DEBUG -HWND hWndList; -#endif - -HINSTANCE hInst; - -static BOOL bFileOpen = FALSE, bPlaying = FALSE, bTimerInstalled = FALSE; -static BOOL bEnumDrivers = FALSE, gfCloseOnDone = FALSE; -static UINT uTimerID = 0, uLastPercent = 100; -static GUID guID; -static DWORD gdwFocus = 0; - -static BOOL InitApp( HINSTANCE ); -static BOOL InitInstance( HINSTANCE, int ); -static void BuildTitleBarText( void ); -// Call this in initialization to set the szCDStartPath[] global variable -static void GetMediaStartPath( void ); -static void FillDataBuffer( void ); -static void LoadFromCommandLine( LPSTR lpszCmd ); - -/****************************************************************************** - * WinMain() - * - * Entry point for all Windows programs - performs initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) - { - MSG msg; - - hInst = hInstance; - - /* Make sure the common controls are loaded for our use */ - InitCommonControls(); - - - if( !hPrevInstance ) - if( !InitApp( hInstance )) - { - ErrorMessageBox( IDS_ERROR_APPINIT, MB_ICONSTOP ); - return( FALSE ); - } - - if( !InitInstance( hInstance, nCmdShow )) - { - ErrorMessageBox( IDS_ERROR_INSTANCEINIT, MB_ICONSTOP ); - return( FALSE ); - } - - // We know how to take exactly one file name from the command-line and open - // it as a file to play. We can also accept a couple command like /play, - // /close, and /loop - if( lpCmdLine[0] ) - LoadFromCommandLine( lpCmdLine ); - - while( GetMessage((LPMSG)&msg, NULL, 0, 0 )) - { - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } - - UnregisterClass( szAppClass, hInstance ); - return( msg.wParam ); - } /* End of WinMain() */ - - -/*****************************************************************************/ -/* InitApp() */ -/* */ -/* Inits things that only need to be created once for the this application */ -/* (like creating the window class). */ -/*****************************************************************************/ -static BOOL InitApp( HINSTANCE hInstance ) - { - WNDCLASS wc; - - /* Set up and register a window class */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpszClassName = szAppClass; - wc.lpfnWndProc = (WNDPROC)MainWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof( DWORD ); - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON1 )); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); - wc.lpszMenuName = MAKEINTRESOURCE( IDR_MAINMENU ); - - if( !RegisterClass( &wc )) - { - ErrorMessageBox( IDS_ERROR_REGISTERCLASS, MB_ICONSTOP ); - return( FALSE ); - } - return( TRUE ); - } /* End of InitApp() */ - - -/*****************************************************************************/ -/* InitInstance() */ -/* */ -/* Performs initialization that must be done for each application instance. */ -/* */ -/*****************************************************************************/ -static BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) - { - HWND hWnd; - HRESULT dsRetVal; - RECT crect; - int cx, cy; - UINT uCharsRead; - BOOL fUseGuid = FALSE; - HMENU hSysMenu; - - DbgInitialize( TRUE ); - - // Initialize the Media start path for common open boxes - GetMediaStartPath(); - - LoadString( hInstance, IDS_APP_TITLE, szAppTitle, sizeof(szAppTitle)); - LoadString( hInstance, IDS_APP_CAPTION, szAppCaption, sizeof(szAppCaption)); - LoadString( hInstance, IDS_TBTITLE_PAN, szPan, sizeof(szPan)); - LoadString( hInstance, IDS_TBTITLE_VOLUME, szVolume, sizeof(szVolume)); - LoadString( hInstance, IDS_TBTITLE_FREQUENCY, - szFrequency, sizeof(szFrequency)); - LoadString( hInstance, IDS_TBTITLE_PROGRESS, - szProgress, sizeof(szProgress)); - LoadString( hInstance, IDS_OPEN_DLGTITLE, - szOpenDLGTitle, sizeof(szOpenDLGTitle)); -/* This is a little trick designed to allow us to load a common dialog box - * filter string, which is really a concatentation of several NULL-terminated - * strings. Note that while is is possible to enter something else into the - * resource as placeholders for the NULL characters, this has the undesireable - * effect of forcing us to search-and-replace byte-by-byte and doesn't make it - * as easy to internationalize our strings... - */ - memset( szOpenFilter, 0, sizeof(szOpenFilter)); - uCharsRead = LoadString( hInstance, IDS_OPEN_FILTER1, - szOpenFilter, sizeof(szOpenFilter)) + 1; - uCharsRead += LoadString( hInstance, IDS_OPEN_FILTER2, - &szOpenFilter[uCharsRead], - sizeof(szOpenFilter) - uCharsRead ) + 1; - uCharsRead += LoadString( hInstance, IDS_OPEN_FILTER3, - &szOpenFilter[uCharsRead], - sizeof(szOpenFilter) - uCharsRead ) + 1; - LoadString( hInstance, IDS_OPEN_FILTER4, - &szOpenFilter[uCharsRead], - sizeof(szOpenFilter) - uCharsRead ); - - /* Calculate the size of the client window */ - cx = CONTROL_SPACE_CX + 2*BORDER_SPACE_CX + BUTTON_CX + PAN_TB_CX - + 2*GetSystemMetrics( SM_CXBORDER ) + PAN_TEXT_CX + TEXT_SPACE_CX; - - cy = 2*(BORDER_SPACE_CY + GetSystemMetrics( SM_CYBORDER )) - + PAN_TB_CY + VOL_TB_CY + FREQ_TB_CY + PROG_TB_CY - + GetSystemMetrics( SM_CYMENU ) + 3*CONTROL_SPACE_CY - + GetSystemMetrics( SM_CYCAPTION ); - - /* Create an application window */ -#ifdef DEBUG - hWnd = CreateWindow( szAppClass, /* class name */ - szAppCaption, /* caption for window */ - WS_OVERLAPPEDWINDOW /* style */ - & ~WS_THICKFRAME | WS_BORDER, - CW_USEDEFAULT, /* x position */ - CW_USEDEFAULT, /* y position */ - cx, /* width */ - cy + 200, /* height */ - NULL, /* parent window */ - NULL, /* menu */ - hInstance, /* instance */ - NULL ); /* parms */ -#else - hWnd = CreateWindow( szAppClass, /* class name */ - szAppCaption, /* caption for window */ - WS_OVERLAPPEDWINDOW /* style */ - & ~WS_THICKFRAME | WS_BORDER, - CW_USEDEFAULT, /* x position */ - CW_USEDEFAULT, /* y position */ - cx, /* width */ - cy, /* height */ - NULL, /* parent window */ - NULL, /* menu */ - hInstance, /* instance */ - NULL ); /* parms */ -#endif - - if( !hWnd ) - { - ErrorMessageBox( IDS_ERROR_MAINWNDCREATE, MB_ICONSTOP ); - return( FALSE ); - } - - hWndMain = hWnd; - GetClientRect( hWndMain, &crect ); - - // Apparently WM_INITMENU isn't called for the main window's context version - // of the system menu, so we must gray these at startup as well. - hSysMenu = GetSystemMenu( hWndMain, FALSE ); - EnableMenuItem( hSysMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( hSysMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED ); - -#ifdef DEBUG - cy = 2*BORDER_SPACE_CY + PAN_TB_CY + VOL_TB_CY + FREQ_TB_CY + PROG_TB_CY - + 3*CONTROL_SPACE_CY; - - hWndList = CreateWindow( "listbox", NULL, WS_CHILD | WS_VISIBLE - | LBS_NOINTEGRALHEIGHT | WS_VSCROLL, - 0, cy, crect.right-crect.left, - crect.bottom - crect.top - cy, - hWnd, NULL, hInstance, NULL ); -#endif - - /* Create some controls for things like volume, panning, etc. */ - if( CreateChildren( crect )) - return( FALSE ); - - ShowWindow( hWnd, nCmdShow ); - UpdateWindow( hWnd ); - - /* Create the main DirectSound object */ - - bEnumDrivers = GetProfileInt( "DSSTREAM", "EnumDrivers", FALSE ); - if( bEnumDrivers && !DoDSoundEnumerate( &guID )) - { - fUseGuid = TRUE; - } - dsRetVal = DirectSoundCreate( fUseGuid ? &guID : NULL, &lpDS, NULL ); - - - if( dsRetVal != DS_OK ) - { - ErrorMessageBox( IDS_ERROR_DSCREATE, MB_ICONSTOP ); - return( FALSE ); - } - - dsRetVal = lpDS->lpVtbl->SetCooperativeLevel( lpDS, - hWndMain, - DSSCL_NORMAL ); - if( dsRetVal != DS_OK ) - { - ErrorMessageBox( IDS_ERROR_DSCOOPERATIVE, MB_ICONSTOP ); - return( FALSE ); - } - - - return( TRUE ); - } /* End of InitInstance() */ - - -/****************************************************************************/ -/* MainWindowProc() */ -/* */ -/* Messages for our main window are handled here */ -/* */ -/****************************************************************************/ -extern LONG lInTimer; -LRESULT CALLBACK MainWindowProc( HWND hWnd, unsigned uMsg, - WPARAM wParam, LPARAM lParam ) - { -#ifndef DEBUG - LPMINMAXINFO lpMinMax; -#endif - DWORD dwCDErr = 0, dwProg; - float fPercent; - UINT uPercent; - BOOL bResult = FALSE; - int nChkErr; - HRESULT dsrval; - - switch( uMsg ) - { - case WM_DSSTREAM_PROGRESS: - dwProg = (DWORD)lParam; - dwProg = dwProg % wiWave.mmckInRIFF.cksize; - fPercent = (float)((dwProg * 100) - / wiWave.mmckInRIFF.cksize); - SendMessage( hWndProg, TBM_SETPOS, - TRUE, (DWORD)(float)(fPercent*(float)PROG_MULTIPLIER)); - uPercent = (UINT)fPercent; - if( uPercent != uLastPercent ) - { - uLastPercent = uPercent; - wsprintf( szTemp, "%s: %u%%", szProgress, uPercent ); - Static_SetText( hWndProgText, szTemp ); -#ifdef DEBUG - ListBox_AddString( hWndList, szTemp ); -#endif - } - break; - - /* - * This message will be posted by the helper DLL when the TimeFunc - * is done streaming the WAVE file. It serves as notification that the - * caller should terminate WAVE playback and end the MM timer event. - */ - case WM_DSSTREAM_DONE: - /* Emulate a WM_COMMAND to ourselves */ - SendMessage( hWnd, WM_COMMAND, MAKEWPARAM( IDM_STOP, 0 ), 0L ); - break; - -#ifdef DEBUG - case WM_DSSTREAM_DEBUG: - if( LOWORD(wParam) == DEBUGF_PLAYPOSITION ) - { - wsprintf( szDebug, "pp = %li", lParam ); - ListBox_AddString( hWndList, szDebug ); - DPF( 4, szDebug ); - } - else if( LOWORD(wParam) == DEBUGF_WRITEPOSITION ) - { - wsprintf( szDebug, "wp = %li", lParam ); - ListBox_AddString( hWndList, szDebug ); - DPF( 4, szDebug ); - } - else if( LOWORD(wParam) == DEBUGF_NEXTWRITE ) - { - wsprintf( szDebug, "nw = %li", lParam ); - ListBox_AddString( hWndList, szDebug ); - DPF( 4, szDebug ); - } - else if( LOWORD(wParam) == DEBUGF_SKIP ) - { - ListBox_AddString( hWndList, "Skipped segment read" ); - DPF( 5, szDebug ); - } - break; -#endif - - case WM_COMMAND: - switch( LOWORD( wParam )) - { - case IDM_FILE_OPEN: - { - OPENFILENAME ofn; - /* - * Clear out and fill in an OPENFILENAME structure in preparation - * for creating a common dialog box to open a file. - */ - memset( &ofn, 0, sizeof(OPENFILENAME)); - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hWnd; - ofn.hInstance = hInst; - ofn.lpstrFilter = szOpenFilter; - ofn.nFilterIndex = 1; - szFileBuffer[0] = '\0'; - ofn.lpstrFile = szFileBuffer; - ofn.nMaxFile = sizeof(szFileBuffer); - ofn.lpstrFileTitle = szFileTitle; - ofn.nMaxFileTitle = sizeof(szFileTitle); - ofn.lpstrInitialDir = szCDStartPath; - ofn.lpstrDefExt = "WAV"; - ofn.lpstrTitle = szOpenDLGTitle; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - - bResult = GetOpenFileName( &ofn ); /* Do the dialog box */ - - /* - * A return of TRUE indicates that the user did not select a filename. - * The possible reasons are: Cancel was clicked, or an error occured. - * If Cancel was clicked, the CommDlgExtendedError() function will not - * return a valid code. For anything else, an error code will come back. - */ - if( bResult == FALSE ) - { - dwCDErr = CommDlgExtendedError(); - if( dwCDErr ) - { - /* Handle a common dialog box error */ - HandleCommDlgError( dwCDErr ); - } - else /* Clicked Cancel, so finish msg processing */ - return( 0 ); - } - else - { - // Copy the directory name we opened from so that we start there - // next time we open the dialog box... - lstrcpy( szCDStartPath, szFileBuffer ); - szCDStartPath[ofn.nFileOffset] = '\0'; - - if( bFileOpen ) - { - // Before we force a close, disable auto close - // because the user has picked a new file and is - // obviously not ready for us to go away yet. - gfCloseOnDone = FALSE; - /* Need to close the previous file before we open a new one. The best - * way to do this is by faking a menu command, so that we only have the - * actual code in one place and it can easily be changed. - */ - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDM_FILE_CLOSE, 0 ), 0L ); - } - - if(( nChkErr = StreamBufferSetup()) != 0 ) - { - // Error opening the WAVE file so abort - break; - } - else - { - bFileOpen = TRUE; - EnableMenuItem( GetMenu( hWnd ), IDM_PLAY, - MF_BYCOMMAND | MF_ENABLED ); - EnableWindow( hWndPlay, TRUE ); - EnableMenuItem( GetMenu( hWnd ), IDM_FILE_CLOSE, - MF_BYCOMMAND | MF_ENABLED ); - DrawMenuBar( hWnd ); - BuildTitleBarText(); - } - } - } - break; - - case IDM_FILE_CLOSE: - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDM_STOP, - DSSTREAM_STOPF_NOREOPEN ), 0L ); - BuildTitleBarText(); - break; - - case IDM_OPTIONS_ENUMDRIVERS: - bEnumDrivers = !bEnumDrivers; - if( bEnumDrivers ) - { - LoadString( hInst, IDS_ENUMWARNING, szTemp, sizeof(szTemp)); - MessageBox( hWnd, szTemp, szAppCaption, MB_OK ); - } - break; - - case IDM_HELP_ABOUT: - DialogBox( hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWndMain, - (DLGPROC)DLG_About ); - break; - - case IDC_LOOPCHECK: - wiWave.bLoopFile = !wiWave.bLoopFile; - Button_SetCheck( hWndLoopCheck, wiWave.bLoopFile ); - if( !bPlaying && bFileOpen ) - ResetWavePlayer(); - break; - - case IDM_PLAY: -#ifdef DEBUG - wsprintf( szDebug, " bFileOpen = %s", - bFileOpen == TRUE ? "TRUE" : "FALSE" ); - DPF( 3, "IDM_PLAY Debug" ); - DPF( 3, szDebug ); - wsprintf( szDebug, " bTimerInstalled = %s", - bTimerInstalled == TRUE ? "TRUE" : "FALSE" ); - DPF( 3, szDebug ); - wsprintf( szDebug, " bPlaying = %s", - bPlaying == TRUE ? "TRUE" : "FALSE" ); - DPF( 3, szDebug ); -#endif - if( bPlaying ) - { - gfCloseOnDone = FALSE; - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDM_STOP, 0 ), 0L ); - } - if( bFileOpen && lpDSBStreamBuffer ) - { - // Ensure that position is at 0, ready to go - dsrval = lpDSBStreamBuffer->lpVtbl->SetCurrentPosition( - lpDSBStreamBuffer, - 0 ); - dsrval = lpDSBStreamBuffer->lpVtbl->Play( lpDSBStreamBuffer, - 0, 0, DSBPLAY_LOOPING ); - } - else - { - bPlaying = bTimerInstalled = FALSE; - break; - } - - if( timeBeginPeriod( PLAYBACK_TIMER_PERIOD - / PLAYBACK_OVERSAMPLE ) != 0 ) - { - /* Can't create timer! */ - dsrval = lpDSBStreamBuffer->lpVtbl->Stop( lpDSBStreamBuffer ); - bPlaying = bTimerInstalled = FALSE; - break; - } - else - { - lInTimer = FALSE; - if(( uTimerID = timeSetEvent( PLAYBACK_TIMER_PERIOD - / PLAYBACK_OVERSAMPLE, - PLAYBACK_TIMER_ACCURACY, - TimeFunc, (DWORD)0, - TIME_PERIODIC )) != 0 ) - bTimerInstalled = TRUE; - } - bPlaying = TRUE; - EnableMenuItem( GetMenu( hWnd ), IDM_STOP, - MF_BYCOMMAND | MF_ENABLED ); - EnableWindow( hWndStop, TRUE ); - DrawMenuBar( hWnd ); - break; - - case IDM_STOP: -#ifdef DEBUG - wsprintf( szDebug, " bFileOpen = %s", - bFileOpen == TRUE ? "TRUE" : "FALSE" ); - DPF( 3, "IDM_STOP Debug" ); - DPF( 3, szDebug ); - wsprintf( szDebug, " bTimerInstalled = %s", - bTimerInstalled == TRUE ? "TRUE" : "FALSE" ); - DPF( 3, szDebug ); - wsprintf( szDebug, " bPlaying = %s", - bPlaying == TRUE ? "TRUE" : "FALSE" ); - DPF( 3, szDebug ); -#endif - wiWave.bDonePlaying = TRUE; - if( bTimerInstalled ) - { - timeKillEvent( uTimerID ); - timeEndPeriod( PLAYBACK_TIMER_PERIOD / PLAYBACK_OVERSAMPLE ); - // Busy wait for timer func to exit - while (InterlockedExchange(&lInTimer, TRUE)) Sleep(100); - bTimerInstalled = FALSE; - } - if( bPlaying ) - { - bPlaying = FALSE; - dsrval = lpDSBStreamBuffer->lpVtbl->Stop( lpDSBStreamBuffer ); - EnableMenuItem( GetMenu( hWnd ), IDM_STOP, - MF_BYCOMMAND | MF_GRAYED ); - EnableWindow( hWndStop, FALSE ); - DrawMenuBar( hWnd ); - } - // Short circuit to allow command-line forced shutdown - if(!( HIWORD(wParam) & DSSTREAM_STOPF_NOREOPEN ) - && !gfCloseOnDone ) - { - ResetWavePlayer(); - break; - } - else - { - if( bFileOpen ) - { - WaveCloseReadFile( &wiWave.hmmio, - &wiWave.pwfx ); - if( lpDSBStreamBuffer ) - dsrval = lpDSBStreamBuffer->lpVtbl->Release( - lpDSBStreamBuffer ); - - lpDSBStreamBuffer = NULL; - - bFileOpen = FALSE; - // The file is closed, so disable the close option - EnableMenuItem( GetMenu( hWnd ), IDM_FILE_CLOSE, - MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( GetMenu( hWnd ), IDM_PLAY, - MF_BYCOMMAND | MF_GRAYED ); - EnableWindow( hWndPlay, FALSE ); - PostMessage( hWnd, WM_DSSTREAM_PROGRESS, 0L, 0L ); - if( gfCloseOnDone && - !(HIWORD(wParam) && DSSTREAM_STOPF_NOEXIT)) - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDM_FILE_EXIT, 0 ), 0L ); - } - } - break; - - case IDM_FILE_EXIT: - DestroyWindow( hWnd ); - break; - } - break; -#ifndef DEBUG - case WM_GETMINMAXINFO: - /* - * We know exactly how big this window should be, and it's sort of a - * little pop-up control panel, so we can disable window sizing by - * forcing all the minimum and maximum sizes to be the calculated size. - */ - lpMinMax = (LPMINMAXINFO)lParam; - - lpMinMax->ptMaxSize.x = CONTROL_SPACE_CX + 2*BORDER_SPACE_CX - + BUTTON_CX + PAN_TB_CX + PAN_TEXT_CX - + TEXT_SPACE_CX - + 2*GetSystemMetrics( SM_CXBORDER ); - lpMinMax->ptMaxSize.y = 2*(BORDER_SPACE_CY - + GetSystemMetrics( SM_CYBORDER )) - + PAN_TB_CY + VOL_TB_CY + FREQ_TB_CY - + PROG_TB_CY + 3*CONTROL_SPACE_CY - + GetSystemMetrics( SM_CYMENU ) - + GetSystemMetrics( SM_CYCAPTION ); - - lpMinMax->ptMinTrackSize.x = lpMinMax->ptMaxTrackSize.x - = lpMinMax->ptMaxSize.x; - - lpMinMax->ptMinTrackSize.y = lpMinMax->ptMaxTrackSize.y - = lpMinMax->ptMaxSize.y; - break; -#endif - case WM_HSCROLL: - if(((HWND)lParam == hWndPan) && lpDSBStreamBuffer ) - { - HandlePanScroll( (int)LOWORD(wParam), (int)HIWORD(wParam)); - } - else if(((HWND)lParam == hWndVol) && lpDSBStreamBuffer ) - { - HandleVolScroll( (int)LOWORD(wParam), (int)HIWORD(wParam)); - } - else if(((HWND)lParam == hWndFreq) && lpDSBStreamBuffer ) - { - HandleFreqScroll( (int)LOWORD(wParam), (int)HIWORD(wParam)); - } - break; - - case WM_INITMENU: - { - HMENU hSysMenu = GetSystemMenu( hWnd, FALSE ); - - EnableMenuItem( hSysMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( hSysMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED ); - - if((HMENU)wParam != GetMenu( hWnd )) - break; - CheckMenuItem((HMENU)wParam, IDM_OPTIONS_ENUMDRIVERS, - bEnumDrivers ? MF_CHECKED : MF_UNCHECKED ); - } - break; - - case WM_DESTROY: - /* - * Free all the DirectSound objects we created - */ - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDM_STOP, DSSTREAM_STOPF_NOREOPEN - | DSSTREAM_STOPF_NOEXIT ), 0 ); - - if( bTimerInstalled ) - { - timeKillEvent( uTimerID ); - timeEndPeriod( PLAYBACK_TIMER_PERIOD / PLAYBACK_OVERSAMPLE ); - // Busy wait for timer func to exit - while (InterlockedExchange(&lInTimer, TRUE)) Sleep(100); - bTimerInstalled = FALSE; - } - - if( lpDS ) dsrval = lpDS->lpVtbl->Release( lpDS ); - - WriteProfileString( "DSSTREAM", "EnumDrivers", - bEnumDrivers ? "1" : "0" ); - - PostQuitMessage( 0 ); - break; - - default: - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - } - return 0L; - } /* WindowProc */ - - -/*****************************************************************************/ -/* DLG_About() */ -/* */ -/* Dialog procedure for the Help...About... box which simply pops up a */ -/* little copyright message and brief program description. */ -/* */ -/*****************************************************************************/ -BOOL CALLBACK DLG_About( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) - { - switch( msg ) - { - case WM_INITDIALOG: - break; - - case WM_COMMAND: - switch( LOWORD(wParam)) - { - case IDOK: - EndDialog( hDlg, FALSE ); - return( TRUE ); - - default: - break; - } - break; - - default: - return( FALSE ); - } - - return( FALSE ); - } - - -/*****************************************************************************/ -/* HandleCommDlgError() */ -/* */ -/* The function translates extended common dialog error codes into a */ -/* string resource ID, loads that string from our module, and displays it in */ -/* a message box. This implementation only covers the general CD error codes.*/ -/* */ -/*****************************************************************************/ -int HandleCommDlgError( DWORD dwError ) - { - char szTitle[128]; - UINT uMsgID; - - if( dwError == CDERR_DIALOGFAILURE ) - uMsgID = IDS_CDERR_DIALOGFAILURE; - else - uMsgID = (UINT)dwError + IDS_CDERR_GENERAL_BASE; - - LoadString( hInst, uMsgID, szTemp, sizeof(szTemp)); - LoadString( hInst, IDS_CDERR_TITLESTRING, szTitle, sizeof(szTitle)); - MessageBox( GetActiveWindow(), szTemp, szTitle, - MB_OK | MB_ICONEXCLAMATION ); - - return( 0 ); - } - - -/*****************************************************************************/ -/* StreamBufferSetup() */ -/* */ -/* This function uses the filename stored in the global character array to*/ -/* open a WAVE file. Then it creates a secondary DirectSoundBuffer object */ -/* which will later be used to stream that file from disk during playback. */ -/* */ -/*****************************************************************************/ -int StreamBufferSetup( void ) - { - DSBUFFERDESC dsbd; - HRESULT dsRetVal; - - int nChkErr; - - /* This portion of the WAVE I/O is patterned after what's in DSTRWAVE, which - * was in turn adopted from WAVE.C which is part of the DSSHOW sample. - */ - - if(( nChkErr = WaveOpenFile( szFileBuffer, &wiWave.hmmio, &wiWave.pwfx, &wiWave.mmckInRIFF )) != 0 ) - { - ErrorMessageBox( IDS_ERROR_WAVEFILEOPEN, MB_ICONEXCLAMATION ); - return( ERR_WAVE_OPEN_FAILED ); - } - - if( wiWave.pwfx->wFormatTag != WAVE_FORMAT_PCM ) - { - ErrorMessageBox( IDS_ERROR_WAVENOTPCM, MB_ICONEXCLAMATION ); - WaveCloseReadFile( &wiWave.hmmio, &wiWave.pwfx ); - return( ERR_WAVE_INVALID_FORMAT ); - } - /* Seek to the data chunk */ - if(( nChkErr = WaveStartDataRead( &wiWave.hmmio, &wiWave.mmck, &wiWave.mmckInRIFF )) != 0 ) - { - ErrorMessageBox( IDS_ERROR_WAVESEEKFAILED, MB_ICONEXCLAMATION ); - WaveCloseReadFile( &wiWave.hmmio, &wiWave.pwfx ); - return( ERR_WAVE_CORRUPTED_FILE ); - } - /* As a side note, mmck.ckSize will be the size of all the data in this file. - * That's something which might be handy when calculating the length... */ - - /* Calculate a buffer length, making sure it is an exact multiple of the - * buffer segment size. - */ - wiWave.dwBufferSize = ((DWORD)wiWave.pwfx->nAvgBytesPerSec - * (((NUM_BUFFER_SEGMENTS * PLAYBACK_TIMER_PERIOD) - / 10)) / 100); - -#ifdef DEBUG - wsprintf( szDebug, "BufferSize = %lu", wiWave.dwBufferSize ); - ListBox_AddString( hWndList, szDebug ); -#endif - /* - * Create the secondary DirectSoundBuffer object to receive our sound data. - */ - memset( &dsbd, 0, sizeof( DSBUFFERDESC )); - dsbd.dwSize = sizeof( DSBUFFERDESC ); - // Use new GetCurrentPosition() accuracy (DirectX 2 feature) - dsbd.dwFlags = DSBCAPS_CTRLDEFAULT | DSBCAPS_GETCURRENTPOSITION2 | gdwFocus; - dsbd.dwBufferBytes = wiWave.dwBufferSize; - - /* Set Format properties according to the WAVE file we just opened */ - dsbd.lpwfxFormat = wiWave.pwfx; - dsRetVal = lpDS->lpVtbl->CreateSoundBuffer( lpDS, - &dsbd, - &lpDSBStreamBuffer, - NULL ); - if( dsRetVal != DS_OK ) - { - ErrorMessageBox( IDS_ERROR_DSBCREATE, MB_ICONEXCLAMATION ); - return( ERR_CREATEDSB_FAILED ); - } - - wiWave.lpDSBStreamBuffer = lpDSBStreamBuffer; - wiWave.bFoundEnd = FALSE; - wiWave.dwBytesRemaining = 0; - wiWave.bLoopFile = Button_GetCheck( hWndLoopCheck ); - - FillDataBuffer(); - - wiWave.bDonePlaying = FALSE; - -#ifdef DEBUG - wsprintf( szDebug, "wiWave.dwBufferSize = %lu", wiWave.dwBufferSize ); - DPF( 3, "StreamBufferSetup Debug" ); - DPF( 3, szDebug ); -#endif - - SendMessage( hWndVol, TBM_SETPOS, TRUE, VOL_MAX ); - SendMessage( hWndPan, TBM_SETPOS, TRUE, PAN_CENTER ); - SendMessage( hWndFreq, TBM_SETPOS, TRUE, - (LPARAM)wiWave.pwfx->nSamplesPerSec / FREQ_MULTIPLIER ); - PostMessage( hWndMain, WM_DSSTREAM_PROGRESS, 0L, 0L ); - UpdateFromControls(); - return( 0 ); - } - - -/*****************************************************************************/ -/* ResetWavePlayer() */ -/* */ -/* Performs a subset of the above operations (in StreamBufferSetup). Things */ -/* not done include creating a DSB and opening the file (it's already open). */ -/* */ -/*****************************************************************************/ -void ResetWavePlayer( void ) - { - WaveStartDataRead( &wiWave.hmmio, &wiWave.mmck, &wiWave.mmckInRIFF ); - wiWave.bFoundEnd = FALSE; - wiWave.dwBytesRemaining = 0; - - FillDataBuffer(); - - wiWave.bDonePlaying = FALSE; - PostMessage( hWndMain, WM_DSSTREAM_PROGRESS, 0L, 0L ); - } - - -/*****************************************************************************/ -/* FillDataBuffer() */ -/* */ -/* This function fills the sound buffer with a block of data, starting at */ -/* the current read position. The entire buffer is filled. */ -/* */ -/*****************************************************************************/ -void FillDataBuffer( void ) - { - LPBYTE lpWrite1, lpWrite2; - DWORD dwLen1, dwLen2; - UINT uActualBytesWritten; - int nChkErr; - HRESULT dsRetVal; - - dsRetVal = lpDSBStreamBuffer->lpVtbl->Lock( lpDSBStreamBuffer, - 0, wiWave.dwBufferSize, - &((LPVOID)lpWrite1), &dwLen1, - &((LPVOID)lpWrite2), &dwLen2, - 0 ); - if( dsRetVal != DS_OK ) - { - return; - //ErrorMessageBox( IDS_ERROR_DSBLOCK, MB_EXLCAMATION ); - } - - Assert( NULL == lpWrite2 ); - Assert( 0 == dwLen2 ); - - if( dwLen1 ) - { - Assert( NULL != lpWrite1 ); - - nChkErr = WaveReadFile( wiWave.hmmio, (UINT)dwLen1, lpWrite1, - &wiWave.mmck, &uActualBytesWritten ); - if( uActualBytesWritten < dwLen1 ) - { - if( wiWave.bLoopFile ) - { - /* If the file is shorter than the buffer and we're looping, we need to - * read the file in again so that we don't get a block of silence before - * the timer loops playback. - */ - LPBYTE lpTemp = lpWrite1; - DWORD cbReadLoopTotal = dwLen1; - - do - { - /* Continue decrementing our count and moving our temp - * pointer forward until we've read the file enough times - * to fill the buffer. NOTE: It's probably not efficient - * to bother with the overhead of streaming a file that's - * not at least as large as the buffer... */ - lpTemp += uActualBytesWritten; - cbReadLoopTotal -= uActualBytesWritten; - nChkErr = WaveStartDataRead( &wiWave.hmmio, - &wiWave.mmck, - &wiWave.mmckInRIFF ); - nChkErr = WaveReadFile( wiWave.hmmio, (UINT)cbReadLoopTotal, - lpTemp, - &wiWave.mmck, &uActualBytesWritten ); - } while( uActualBytesWritten < cbReadLoopTotal ); - } - else - { - wiWave.bFoundEnd = TRUE; - wiWave.dwBytesRemaining = (DWORD)uActualBytesWritten; - DPF( 3,"Setting bFoundEnd in load" ); - - // Fill in silence - FillMemory( lpWrite1+uActualBytesWritten, - dwLen1-uActualBytesWritten, - (BYTE)(wiWave.pwfx->wBitsPerSample == 8 ? 128 : 0 )); - } - } - } - dsRetVal = lpDSBStreamBuffer->lpVtbl->Unlock( lpDSBStreamBuffer, - (LPVOID)lpWrite1, dwLen1, - (LPVOID)lpWrite2, 0 ); - - wiWave.dwNextWriteOffset = wiWave.dwProgress = 0; - } - - -/*****************************************************************************/ -/* CreateChildren() */ -/* */ -/* This function creates a bunch of child controls for the main window. */ -/* Most of them are used for controling various things about a playing sound */ -/* file, like volume and panning. Returns FALSE if no errors, TRUE otherwise.*/ -/* */ -/*****************************************************************************/ -int CreateChildren( RECT crect ) - { - SIZE Size; - HDC hDC; - int x, y; - UINT uType; - char szTemplate[128], szType[32]; - LPSTR lpszControl; - - LoadString( hInst, IDS_ERROR_CHILDTEMPLATE, szTemplate, sizeof(szTemplate)); - - /* Don't handle failure for this one, because the app will still run fine */ - hWndBar = CreateWindow( "static", NULL, - WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - 0, 0, crect.right, 2, hWndMain, - (HMENU)0, hInst, NULL ); - - hDC = GetDC( hWndMain ); - if( !GetTextExtentPoint32( hDC, szPan, strlen(szPan), &Size )) - { - ErrorMessageBox( IDS_ERROR_GETTEXTEXTENT, MB_ICONEXCLAMATION ); - ReleaseDC( hWndMain, hDC ); - return( TRUE ); - } - ReleaseDC( hWndMain, hDC ); - - y = BORDER_SPACE_CY; - - /* STATIC control -- text label for the pan trackbar */ - if(( hWndPanText = CreateWindow( "static", szPan, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX + PAN_TB_CX + TEXT_SPACE_CX, - y + (PAN_TB_CY - Size.cy)/2, - PAN_TEXT_CX, Size.cy, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szPan; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - - /* PAN (left to right balance) trackbar control */ - if(( hWndPan = CreateWindow( TRACKBAR_CLASS, NULL, - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTTOM, - BORDER_SPACE_CX, - y, PAN_TB_CX, PAN_TB_CY, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szPan; - uType = IDS_ERROR_TRACKBAR; - goto DISPLAY_CREATE_FAILURE; - } - - SendMessage( hWndPan, TBM_SETRANGE, FALSE, MAKELONG( PAN_MIN, PAN_MAX )); - SendMessage( hWndPan, TBM_SETPOS, TRUE, PAN_CENTER ); - SendMessage( hWndPan, TBM_SETPAGESIZE, 0L, PAN_PAGESIZE ); - - y += PAN_TB_CY + CONTROL_SPACE_CY; - - /* STATIC control -- text label for the volume trackbar */ - if(( hWndVolText = CreateWindow( "static", szVolume, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX + VOL_TB_CX + TEXT_SPACE_CX, - y + (VOL_TB_CY - Size.cy)/2, - VOL_TEXT_CX, Size.cy, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szVolume; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - - /* Create the VOLUME trackbar */ - if(( hWndVol = CreateWindow( TRACKBAR_CLASS, NULL, - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTTOM, - BORDER_SPACE_CX, - y, VOL_TB_CX, VOL_TB_CY, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szVolume; - uType = IDS_ERROR_TRACKBAR; - goto DISPLAY_CREATE_FAILURE; - } - - SendMessage( hWndVol, TBM_SETRANGE, FALSE, - MAKELONG( VOL_MIN, VOL_MAX )); - SendMessage( hWndVol, TBM_SETPOS, TRUE, VOL_MAX ); - SendMessage( hWndVol, TBM_SETPAGESIZE, 0L, VOL_PAGESIZE ); - - y += VOL_TB_CY + CONTROL_SPACE_CY; - - /* STATIC control -- text label for the frequency trackbar */ - if(( hWndFreqText = CreateWindow( "static", szFrequency, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX + FREQ_TB_CX + TEXT_SPACE_CX, - y + (FREQ_TB_CY - Size.cy)/2, - FREQ_TEXT_CX, Size.cy, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szFrequency; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - - /* Create the FREQUENCY trackbar */ - if(( hWndFreq = CreateWindow( TRACKBAR_CLASS, NULL, - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTTOM, - BORDER_SPACE_CX, - y, FREQ_TB_CX, FREQ_TB_CY, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szFrequency; - uType = IDS_ERROR_TRACKBAR; - goto DISPLAY_CREATE_FAILURE; - } - - SendMessage( hWndFreq, TBM_SETRANGE, FALSE, MAKELONG( FREQ_MIN, FREQ_MAX )); - SendMessage( hWndFreq, TBM_SETPOS, TRUE, FREQ_MAX ); - SendMessage( hWndFreq, TBM_SETPAGESIZE, 0L, FREQ_PAGESIZE ); - - y += FREQ_TB_CY + CONTROL_SPACE_CY; - - /* STATIC control -- text label for the progress trackbar */ - if(( hWndProgText = CreateWindow( "static", szProgress, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX + PROG_TB_CX + TEXT_SPACE_CX, - y + (PROG_TB_CY - Size.cy)/2, - PROG_TEXT_CX, Size.cy, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szProgress; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - - /* Create the PROGRESSS trackbar */ - if(( hWndProg = CreateWindow( TRACKBAR_CLASS, NULL, - WS_CHILD | WS_VISIBLE | TBS_HORZ - | TBS_BOTTOM | WS_DISABLED, - BORDER_SPACE_CX, - y, PROG_TB_CX, PROG_TB_CY, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szProgress; - uType = IDS_ERROR_TRACKBAR; - goto DISPLAY_CREATE_FAILURE; - } - - SendMessage( hWndProg, TBM_SETRANGE, - FALSE, MAKELPARAM( PROG_MIN, PROG_MAX )); - SendMessage( hWndProg, TBM_SETPOS, TRUE, 0L ); - - x = BORDER_SPACE_CX + PAN_TEXT_CX + TEXT_SPACE_CX - + PAN_TB_CX + CONTROL_SPACE_CX; - y += PROG_TB_CY; - y -= 2*(BUTTON_CY + BUTTON_SPACE_CY) + CHECK_CY; - - /* Create the LOOPED CHECKBOX */ - LoadString( hInst, IDS_CHECK_LOOPED, szTemp, sizeof(szTemp)); - if(( hWndLoopCheck = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | BS_CHECKBOX, - x, y, CHECK_CX, CHECK_CY, hWndMain, - (HMENU)IDC_LOOPCHECK, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_CHECK; - goto DISPLAY_CREATE_FAILURE; - } - y += CHECK_CY + BUTTON_SPACE_CY; - - /* Create the PLAY BUTTON */ - LoadString( hInst, IDS_BUTTON_PLAY, szTemp, sizeof(szTemp)); - if(( hWndPlay = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | WS_DISABLED, - x, y, BUTTON_CX, BUTTON_CY, hWndMain, - (HMENU)IDM_PLAY, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_BUTTON; - goto DISPLAY_CREATE_FAILURE; - } - y += BUTTON_CY + BUTTON_SPACE_CY; - - /* Create the STOP BUTTON */ - LoadString( hInst, IDS_BUTTON_STOP, szTemp, sizeof(szTemp)); - if(( hWndStop = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | WS_DISABLED, - x, y, BUTTON_CX, BUTTON_CY, hWndMain, - (HMENU)IDM_STOP, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_BUTTON; - goto DISPLAY_CREATE_FAILURE; - } - - UpdateFromControls(); - goto RETURN_NORMAL; - -DISPLAY_CREATE_FAILURE: - LoadString( hInst, uType, szType, sizeof(szType)); - wsprintf( szTemp, szTemplate, lpszControl, szType ); - MessageBox( GetActiveWindow(), szTemp, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - return( TRUE ); - -RETURN_NORMAL: - return( FALSE ); - } - - -/********************************************************************************/ -/* UpdateFromControls() */ -/* */ -/* This function gets all the required values from the DirectSoundBuffer and */ -/* updates the screen interface controls. */ -/* */ -/********************************************************************************/ -void UpdateFromControls( void ) - { - long lPan, lVol, lFreq; - HRESULT hr; - - lPan = (LONG)SendMessage( hWndPan, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - lVol = (LONG)SendMessage( hWndVol, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - lFreq = (LONG)SendMessage( hWndFreq, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - - /* Set the volume and then the pan */ - if( lpDSBStreamBuffer ) - { - /* Set the volume */ - wsprintf( szTemp, "%s: %lidB", szVolume, - ( lVol + VOL_SHIFT ) / VOL_DIV ); - Static_SetText( hWndVolText, szTemp ); - - hr = lpDSBStreamBuffer->lpVtbl->SetVolume( lpDSBStreamBuffer, - (((lVol+VOL_SHIFT) * VOL_MULT)) ); - if( hr != 0 ) - DPF( 0, "Unable to SetVolume in UpdateFromControls()" ); - else - { - wsprintf( szDebug, "Set volume to %lidB", - ( lVol + VOL_SHIFT ) / VOL_DIV ); - DPF( 3, szDebug ); - } - - /* Set the Pan */ - wsprintf( szTemp, "%s: %lidB", szPan, ( lPan + PAN_SHIFT ) / PAN_DIV ); - Static_SetText( hWndPanText, szTemp ); - - hr = lpDSBStreamBuffer->lpVtbl->SetPan( lpDSBStreamBuffer, - (((lPan+PAN_SHIFT) * PAN_MULT)) ); - if( hr != 0 ) - DPF( 0, "Unable to SetPan in UpdateFromControls()" ); - else - { - wsprintf( szDebug, "Set pan to %lidB", - ( lPan + PAN_SHIFT ) / PAN_DIV ); - DPF( 3, szDebug ); - } - - /* Set the frequency */ - wsprintf( szTemp, "%s: %liHz", szFrequency, lFreq * FREQ_MULTIPLIER ); - Static_SetText( hWndFreqText, szTemp ); - - hr = lpDSBStreamBuffer->lpVtbl->SetFrequency( lpDSBStreamBuffer, - lFreq * FREQ_MULTIPLIER); - if( hr != 0 ) - DPF( 0, "Unable to SetFrequency in UpdateFromControls()" ); - else - { - wsprintf( szDebug, "Set frequency to %liHz", lFreq*FREQ_MULTIPLIER ); - DPF( 3, szDebug ); - } - } - return; - } - - -/********************************************************************************/ -/* HandlePanScroll() */ -/* */ -/* Handles the pan trackbar scroll when a WM_HSCROLL is received. */ -/* */ -/********************************************************************************/ -void HandlePanScroll( int nCode, int nPos ) - { - long lPan, lDelta; - - lPan = (LONG)SendMessage( hWndPan, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - - switch( nCode ) - { - case TB_LINEUP: - if( lPan >= PAN_MIN - 1 ) - lDelta = -1; - break; - case TB_LINEDOWN: - if( lPan <= PAN_MAX + 1 ) - lDelta = 1; - break; - case TB_PAGEUP: - if( lPan >= PAN_MIN - PAN_PAGESIZE ) - lDelta = -16; - break; - case TB_PAGEDOWN: - if( lPan <= PAN_MAX + PAN_PAGESIZE ) - lDelta = 16; - break; - case TB_ENDTRACK: - return; - default: - lDelta = 0; - } - - if( lDelta ) - SendMessage( hWndPan, TBM_SETPOS, TRUE, lPan + lDelta ); - else - SendMessage( hWndPan, TBM_SETPOS, TRUE, (long)nPos ); - UpdateFromControls(); - } - - -/********************************************************************************/ -/* HandleVolScroll() */ -/* */ -/* Handles the volume trackbar scrolling when a WM_HSCROLL is received. */ -/* */ -/********************************************************************************/ -void HandleVolScroll( int nCode, int nPos ) - { - long lVol, lDelta; - - lVol = (LONG)SendMessage( hWndVol, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - - switch( nCode ) - { - case TB_LINEDOWN: - if( lVol <= VOL_MAX - 1 ) - lDelta = 1; - break; - case TB_LINEUP: - if( lVol >= VOL_MIN + 1 ) - lDelta = -1; - break; - case TB_PAGEDOWN: - if( lVol <= VOL_MAX - VOL_PAGESIZE ) - lDelta = 10; - break; - case TB_PAGEUP: - if( lVol >= VOL_MIN + VOL_PAGESIZE ) - lDelta = -10; - break; - case TB_ENDTRACK: - return; - default: - lDelta = 0; - } - - if( lDelta ) - SendMessage( hWndVol, TBM_SETPOS, TRUE, (lVol + lDelta)); - else - SendMessage( hWndVol, TBM_SETPOS, TRUE, (long)nPos ); - UpdateFromControls(); - } - - -/********************************************************************************/ -/* HandleFreqScroll() */ -/* */ -/* Handles the volume trackbar scrolling when a WM_HSCROLL is received. */ -/* */ -/********************************************************************************/ -void HandleFreqScroll( int nCode, int nPos ) - { - long lFreq, lDelta; - - lFreq = (LONG)SendMessage( hWndFreq, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - - switch( nCode ) - { - case TB_LINEDOWN: - if( lFreq <= FREQ_MAX-1 ) - lDelta = 1; - break; - case TB_LINEUP: - if( lFreq >= FREQ_MIN+1 ) - lDelta = -1; - break; - case TB_PAGEDOWN: - if( lFreq <= FREQ_MAX - FREQ_PAGESIZE ) - lDelta = 10; - break; - case TB_PAGEUP: - if( lFreq >= FREQ_MIN + FREQ_PAGESIZE ) - lDelta = -10; - break; - case TB_ENDTRACK: - return; - default: - lDelta = 0; - } - - if( lDelta ) - SendMessage( hWndFreq, TBM_SETPOS, TRUE, (lFreq + lDelta)); - else - SendMessage( hWndFreq, TBM_SETPOS, TRUE, (long)nPos ); - UpdateFromControls(); - } - - -/****************************************************************************/ -/* ErrorMessageBox() */ -/* */ -/* A little routine to load error messages from the string resource table */ -/* and pop them up in a MessageBox() for the world to see. The dwMBFlags */ -/* parameter allows the caller to specify the type of icon to use. */ -/* */ -/****************************************************************************/ -void ErrorMessageBox( UINT uID, DWORD dwMBFlags ) - { - LoadString( hInst, uID, szTemp, sizeof(szTemp)); - MessageBox( GetActiveWindow(), szTemp, szAppTitle, MB_OK | dwMBFlags ); - } - - -/****************************************************************************/ -/* BuildTitleBar() */ -/* */ -/* Small routine to build and set the title bar text depending on whether */ -/* or not a file is open. */ -/****************************************************************************/ -void BuildTitleBarText( void ) - { - char szTitle[ sizeof(szAppCaption) + MAX_PATH + sizeof(" - ")]; - - lstrcpy( szTitle, szAppCaption ); - if( bFileOpen ) - { - lstrcat( szTitle, " - " ); - lstrcat( szTitle, szFileTitle ); - } - SetWindowText( hWndMain, szTitle ); - } - - -/****************************************************************************/ -/* GetMediaStartPath() */ -/* */ -/* This helper function attempts to get the media directory for Direct3D, */ -/* which is where all the installed DX wave files go. If it can't find that */ -/* it settles for the media sub-directory of the Windows directory. */ -/****************************************************************************/ -void GetMediaStartPath( void ) - { - HKEY hReg; - DWORD cbStartPathLen; - - if( ERROR_SUCCESS != RegOpenKeyEx( HKEY_LOCAL_MACHINE, - gszRegKeyDirect3D, - 0, KEY_READ, &hReg )) - { - goto REG_OPEN_FAILED; - } - else - { - // Query the Registry for the path to the media directory - cbStartPathLen = sizeof( szCDStartPath ); - if( ERROR_SUCCESS != RegQueryValueEx( hReg, gszRegValueD3DPath, - NULL, NULL, - szCDStartPath, &cbStartPathLen )) - { - goto REG_OPEN_FAILED; - } - RegCloseKey( hReg ); - hReg = NULL; - } - - return; - -REG_OPEN_FAILED: - // Start off by getting the Windows directory -- we're trying to build a - // file path like "C:\WINDOWS\MEDIA", but the WINDOWS directory could be - // named anything, so we must ask. - GetWindowsDirectory( szCDStartPath, sizeof(szCDStartPath)); - // If there's no trailing backslash, append one - if( lstrcmp( &szCDStartPath[lstrlen(szCDStartPath)], TEXT("\\") )) - lstrcat( szCDStartPath, TEXT("\\")); - // Now add on the MEDIA part of the path - lstrcat( szCDStartPath, TEXT("MEDIA")); - } - - -void LoadFromCommandLine( LPSTR lpszCmd ) - { - LPSTR lpsz = lpszCmd; - LPSTR lpToken; - BOOL fStartPlaying = FALSE, fStartLooping = FALSE; - char szToken[MAX_TOKEN_LEN+1]; - int i; - - if( !lpsz ) - return; - - // Clear leading spaces - while( *lpsz == ' ' ) - lpsz++; - - // If we need to accept more command-line parameters later, we can - // extend the code below into a loop that searchs for each one. - while( *lpsz == '/' || *lpsz == '-' ) - { - // Don't advance lpsz until we're sure we really should be reading - // this string (i.e. we recognize that it's the play command - lpToken = ++lpsz; - for( i = 0; i < MAX_TOKEN_LEN; i++ ) - { - if( !*lpToken || *lpToken == ' ' ) - break; - szToken[i] = *lpToken++; - } - szToken[i] = 0; - - if( !lstrcmpi( szToken, gszPlayToken )) - { - // Automagically start playing the file - fStartPlaying = TRUE; - lpsz = lpToken; - } - else if( !lstrcmpi( szToken, gszLoopToken )) - { - // Set the player in looping mode at startup - fStartLooping = TRUE; - lpsz = lpToken; - } - else if( !lstrcmpi( szToken, gszStickyToken )) - { - // Use Sticky Focus for the buffer - gdwFocus = DSBCAPS_STICKYFOCUS; - lpsz = lpToken; - } - else if( !lstrcmpi( szToken, gszGlobalToken )) - { - // Use Global Focus for the buffer - gdwFocus = DSBCAPS_GLOBALFOCUS; - lpsz = lpToken; - } - else if( !lstrcmpi( szToken, gszCloseToken )) - { - // "/close" will cause the program to shutdown after it's done - // playing the file that was presumably loaded at the command-line - gfCloseOnDone = TRUE; - lpsz = lpToken; - } - else - { - // Unrecognized parameter followed the slash, so skip over it - // and find the next break - while( *lpsz && *lpsz != ' ' ) - lpsz++; - } - // Clear any spaces out again - while( *lpsz == ' ' ) - lpsz++; - } - - // If that's all that was on the command-line, simply return - if( !*lpsz ) - return; - - // ASSUMPTION: We assume that a single filename is the only remaining - // parameter. This works out okay because anything else will fail in the - // file load inside StreamBufferSetup(); - lstrcpy( szFileBuffer, lpsz ); - - // Search backwards and find the last backslash, stopping at the - // beginning of the file name - lpsz = &szFileBuffer[lstrlen(szFileBuffer)]; - - while( lpsz > szFileBuffer ) - { - if( *(lpsz-1) == '\\' ) - { - break; - } - lpsz--; - } - // Fake the szFileTitle, which normally gets set by the Common Dialog - lstrcpy( szFileTitle, lpsz ); - lstrcpy( szCDStartPath, szFileBuffer ); - szCDStartPath[lpsz-szFileBuffer] = 0; - - if( fStartLooping ) - { - // Allowing auto-close when the user will have plenty of time to click - // stop would cause the app to shutdown right as they hit the button, - // which is weird behavior. - gfCloseOnDone = FALSE; - Button_SetCheck( hWndLoopCheck, TRUE ); - } - - if( StreamBufferSetup() != 0 ) - { - // Error opening the WAVE file so abort - return; - } - else - { - bFileOpen = TRUE; - EnableMenuItem( GetMenu( hWndMain ), IDM_PLAY, - MF_BYCOMMAND | MF_ENABLED ); - EnableWindow( hWndPlay, TRUE ); - EnableMenuItem( GetMenu( hWndMain ), IDM_FILE_CLOSE, - MF_BYCOMMAND | MF_ENABLED ); - DrawMenuBar( hWndMain ); - BuildTitleBarText(); - - if( fStartPlaying ) - SendMessage( hWndMain, WM_COMMAND, MAKEWPARAM( IDM_PLAY, 0 ), 0L ); - } - } - diff --git a/sdk/samples/dsstream/dsstream.def b/sdk/samples/dsstream/dsstream.def deleted file mode 100644 index 9ea779a..0000000 --- a/sdk/samples/dsstream/dsstream.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME DSSTREAM - -DESCRIPTION 'DirectSound Streaming Playback Example' - -EXPORTS - DLG_About - DSEnumProc - DSEnumDlgProc - MainWindowProc - TimeFunc diff --git a/sdk/samples/dsstream/dsstream.h b/sdk/samples/dsstream/dsstream.h deleted file mode 100644 index dfa65f6..0000000 --- a/sdk/samples/dsstream/dsstream.h +++ /dev/null @@ -1,212 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: DSStream.h - * Content: DirectSound Stream Sample Application Header - * - ***************************************************************************/ -#ifndef __DSSTREAM_INCLUDED__ -#define __DSSTREAM_INCLUDED__ - -#include -#include "resource.h" -#include "debug.h" - -/* WARNING -- Be careful about changing NUM_BUFFER_SEGMENTS -- it should be at - * least 3, or there will probably not be enough time for the interrupt to do - * its thing before the player catches up to it. Also, PLAYBACK_TIMER_PERIOD - * is set at 200 milliseconds because we are OVERSAMPLING by a factor of four. - * This is so we can shift the frequency on the fly and still keep up with the - * play cursor. The timer routine will only fill when necessary. Experiments - * have shown that the timer still operates well when interrupted every 50ms - * (and possibly even more often than that). If you do not require real-time - * frequency changes, you reduce the OVERSAMPLE as well as the TIMER_PERIOD. - * However, note that since a buffer segment is only an approximation of the - * number of bytes played per interrupt, it's a good idea to interupt a bit more - * often than the TIMER_PERIOD, just to make sure the timer isn't falling behind - * the player. If your frequency is fixed, the call to initialize the timer - * event could be changed to first calculate something like (TIMER_PERIOD * .8). - * This should ensure that the buffer is well maintained and system performance - * is maximized. - */ - -#define NUM_BUFFER_SEGMENTS 6 -#define PLAYBACK_TIMER_PERIOD 200 -#define PLAYBACK_OVERSAMPLE 4 -#define PLAYBACK_TIMER_ACCURACY 10 - -#define DSSTREAM_STOPF_NOREOPEN 0x0001 -#define DSSTREAM_STOPF_NOEXIT 0x0002 // Prevent the stop code from calling exit - -#define ERR_WAVE_OPEN_FAILED -100 -#define ERR_WAVE_INVALID_FORMAT -101 -#define ERR_CREATEDSB_FAILED -102 -#define ERR_WAVE_CORRUPTED_FILE -103 - - -#define BORDER_SPACE_CX 10 -#define BORDER_SPACE_CY 10 -#define CONTROL_SPACE_CX 4 -#define CONTROL_SPACE_CY 4 -#define TEXT_SPACE_CY 0 -#define TEXT_SPACE_CX 2 - -#define BUTTON_CX 70 -#define BUTTON_CY 32 -#define CHECK_CX 70 -#define CHECK_CY 22 -#define BUTTON_SPACE_CY 6 - -#define PAN_TEXT_CX 140 -#define VOL_TEXT_CX 140 -#define FREQ_TEXT_CX 140 -#define PROG_TEXT_CX 140 - -#define PAN_TB_CX 200 -#define PAN_TB_CY 30 -#define VOL_TB_CX 200 -#define VOL_TB_CY 30 -#define FREQ_TB_CX 200 -#define FREQ_TB_CY 30 -#define PROG_TB_CX 200 -#define PROG_TB_CY 30 - -// The values for PAN may change in range... - -//#define PAN_TB_MIN 0 -//#define PAN_TB_MAX 2000 -//#define PAN_TB_CENTER 1000 -//#define PAN_MULTIPLIER 1 -#define PAN_MIN 0 -#define PAN_MAX 800 -#define PAN_CENTER 400 -#define PAN_SHIFT (-400) -#define PAN_PAGESIZE 10 -#define PAN_DIV 10 -#define PAN_MULT 10 - -//#define PAN_DSB_MIN (-400) -//#define PAN_DSB_MAX 400 -//#define PAN_DSB_CENTER 0 - -//#define VOL_TB_MIN 0 -//#define VOL_TB_MAX 1000 -//#define VOL_MULTIPLIER 1 -#define VOL_SHIFT (-400) -#define VOL_MIN 0 -#define VOL_MAX 400 -#define VOL_PAGESIZE 10 -#define VOL_DIV 10 -#define VOL_MULT 10 -#define FREQ_MIN 441 -#define FREQ_MAX 4410 -#define FREQ_PAGESIZE 100 -#define FREQ_MULTIPLIER 10 -#define PROG_MIN 0 -#define PROG_MAX 10000 -#define PROG_MULTIPLIER 100 - - -/* WAVE I/O subsystem defines */ - -#define WAVEVERSION 1 - -#ifndef ER_MEM -#define ER_MEM 0xe000 -#endif - -#ifndef ER_CANNOTOPEN -#define ER_CANNOTOPEN 0xe100 -#endif - -#ifndef ER_NOTWAVEFILE -#define ER_NOTWAVEFILE 0xe101 -#endif - -#ifndef ER_CANNOTREAD -#define ER_CANNOTREAD 0xe102 -#endif - -#ifndef ER_CORRUPTWAVEFILE -#define ER_CORRUPTWAVEFILE 0xe103 -#endif - -#ifndef ER_CANNOTWRITE -#define ER_CANNOTWRITE 0xe104 -#endif - -/* Streaming communication defines and structures */ - -#define WM_DSSTREAM_DONE WM_USER + 0x100 /* Make our own app messages */ -#define WM_DSSTREAM_DEBUG WM_USER + 0x101 -#define WM_DSSTREAM_PROGRESS WM_USER + 0x102 - -#define DEBUGF_PLAYPOSITION 0x0300 -#define DEBUGF_WRITEPOSITION 0x0301 -#define DEBUGF_NEXTWRITE 0x0302 -#define DEBUGF_SKIP 0x0303 - -/* - * This structure keeps all the data that the TimeFunc callback uses in one - * place. In this implementation, that means the global data segement. This - * is setup so that if you wanted to put your callback in a DLL, all you'd need - * to do is pass the address of this structure as a parameter. - */ - -typedef struct waveinfoca_tag -{ - WAVEFORMATEX *pwfx; /* Wave Format data structure */ - HMMIO hmmio; /* MM I/O handle for the WAVE */ - MMCKINFO mmck; /* Multimedia RIFF chunk */ - MMCKINFO mmckInRIFF; /* Use in opening a WAVE file */ - LPDIRECTSOUNDBUFFER lpDSBStreamBuffer; /* Points to DirectSoundBuffer */ - DWORD dwBufferSize; /* Size of the entire buffer */ - DWORD dwNextWriteOffset; /* Offset to next buffer segment */ - DWORD dwProgress; /* Used with above to show prog. */ - DWORD dwBytesRemaining; /* Bytes 'til timer shutdown */ - BOOL bDonePlaying; /* Signals early abort to timer */ - BOOL bLoopFile; /* Should we loop playback? */ - BOOL bFoundEnd; /* Timer found file end */ -} WAVEINFOCA, *LPWAVEINFOCA; - -/* Function declarations */ - -LRESULT CALLBACK MainWindowProc( HWND, unsigned, WPARAM, LPARAM ); -BOOL CALLBACK DLG_About( HWND, UINT, WPARAM, LPARAM ); -void CALLBACK TimeFunc( UINT, UINT, DWORD, DWORD, DWORD ); -BOOL CALLBACK DSEnumDlgProc( HWND, UINT, WPARAM, LPARAM ); -BOOL CALLBACK DSEnumProc( LPGUID, LPSTR, LPSTR, LPVOID ); - -void ErrorMessageBox( UINT, DWORD ); -void HandlePanScroll( int, int ); -void HandleVolScroll( int, int ); -void HandleFreqScroll( int, int ); -void ResetWavePlayer( void ); -void UpdateFromControls( void ); - -int CreateChildren( RECT ); -int HandleCommDlgError( DWORD ); -int StreamBufferSetup( void ); - -BOOL DoDSoundEnumerate( LPGUID ); - -int WaveOpenFile(char *, HMMIO *, WAVEFORMATEX **, MMCKINFO *); -int WaveStartDataRead(HMMIO *, MMCKINFO *, MMCKINFO *); -int WaveReadFile(HMMIO, UINT, BYTE *, MMCKINFO *, UINT *); -int WaveCloseReadFile(HMMIO *, WAVEFORMATEX **); - -int WaveCreateFile(char *, HMMIO *, WAVEFORMATEX *, MMCKINFO *, MMCKINFO *); -int WaveStartDataWrite(HMMIO *, MMCKINFO *, MMIOINFO *); -int WaveWriteFile(HMMIO, UINT, BYTE *, MMCKINFO *, UINT *, MMIOINFO *); -int WaveCloseWriteFile(HMMIO *, MMCKINFO *, MMCKINFO *, MMIOINFO *, DWORD); - -int WaveLoadFile(char *, UINT *, DWORD *, WAVEFORMATEX **, BYTE **); -int WaveSaveFile(char *, UINT, DWORD, WAVEFORMATEX *, BYTE *); - -int WaveCopyUselessChunks(HMMIO *, MMCKINFO *, MMCKINFO *, HMMIO *, - MMCKINFO *, MMCKINFO *); -BOOL riffCopyChunk(HMMIO, HMMIO, const LPMMCKINFO); - -#endif /* __DSSTREAM_INCLUDED__ */ - diff --git a/sdk/samples/dsstream/dsstream.rc b/sdk/samples/dsstream/dsstream.rc deleted file mode 100644 index 7ae6bb7..0000000 --- a/sdk/samples/dsstream/dsstream.rc +++ /dev/null @@ -1,245 +0,0 @@ -//Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "winver.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINMENU MENU PRELOAD DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Open...", IDM_FILE_OPEN - MENUITEM "&Close", IDM_FILE_CLOSE, GRAYED - MENUITEM "E&xit", IDM_FILE_EXIT - END - MENUITEM "&Play!", IDM_PLAY, GRAYED - MENUITEM "&Stop!", IDM_STOP, GRAYED - POPUP "&Options" - BEGIN - MENUITEM "&Enumerate Drivers", IDM_OPTIONS_ENUMDRIVERS - END - POPUP "&Help" - BEGIN - MENUITEM "&About...", IDM_HELP_ABOUT - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""winver.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 192, 85 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "About DSStream" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,71,65,50,14 - LTEXT "DSStream Sample Application",IDC_STATIC,52,8,128,8 - ICON IDI_ICON1,IDC_STATIC,8,8,18,20 - LTEXT "Copyright (c) 1995-1996 Microsoft Corporation",IDC_STATIC, - 52,44,128,8 - LTEXT "Shows streaming WAVE audio from disk to a secondary DirectSoundBuffer", - IDC_STATIC,52,20,128,20 -END - -IDD_DSENUMBOX DIALOG DISCARDABLE 0, 0, 184, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Choose a DirectSound Driver..." -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,34,43,50,14 - PUSHBUTTON "Cancel",IDCANCEL,100,43,50,14 - COMBOBOX IDC_DSENUM_COMBO,4,12,176,36,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Driver Description:",IDC_STATIC,4,4,116,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -IDI_ICON1 ICON DISCARDABLE "icon3.ico" -IDI_ICON2 ICON DISCARDABLE "icon2.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Microsoft Corporation\0" - VALUE "FileDescription", "dsstream\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "dsstream\0" - VALUE "LegalCopyright", "Copyright (c) 1995-1996\0" - VALUE "OriginalFilename", "dsstream.exe\0" - VALUE "ProductName", "DirectSound Stream Playback Sample Application\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CDERR_GENERAL_BASE "Common Dialog Subsystem Error" - IDS_CDERR_FINDRESFAILURE "Could not find a required resource." - IDS_CDERR_INITIALIZATION - "Initialization failed: Memory resources may be running low." - IDS_CDERR_LOADRESFAILURE "Could not load a required resource." - IDS_CDERR_LOCKRESFAILURE "Could not lock a required resource." - IDS_CDERR_LOADSTRFAILURE "Could not load a required string resource" - IDS_CDERR_MEMALLOCFAILURE - "Unable to allocate sufficient memory for internal data structures: memory resources may be running low." - IDS_CDERR_MEMLOCKFAILURE "Could not lock a memory resource." - IDS_CDERR_NOHINSTANCE "The caller attempted to use a dialog template with specifiying an instance handle" - IDS_CDERR_NOHOOK "The caller requested use of a hook procedure, but failed to provide one." - IDS_CDERR_NOTEMPLATE "The caller requested use of a dialog template, but failed to provide one." - IDS_CDERR_REGISTERMSGFAIL - "The common dialog subsystem was unable to register a private message using RegisterWindowMessage()." - IDS_CDERR_STRUCTSIZE "The common dialog subsystem received a structure with an improper size member." - IDS_CDERR_DIALOGFAILURE "Unable to create dialog box." - IDS_CDERR_TITLESTRING "Common Dialog Error!" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TBTITLE_PAN "Pan" - IDS_TBTITLE_VOLUME "Volume" - IDS_TBTITLE_FREQUENCY "Frequency" - IDS_TBTITLE_PROGRESS "Progress" - IDS_BUTTON_PLAY "Play" - IDS_BUTTON_STOP "Stop" - IDS_CHECK_LOOPED "Looped" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "DirectSound Stream" - IDS_APP_CAPTION "DirectSound Stream Sample Application" - IDS_APP_NAME "DSStream" - IDS_OPEN_DLGTITLE "Open WAVE File for Playback" - IDS_OPEN_FILTER1 "WAVE Audio Files (*.WAV)" - IDS_OPEN_FILTER2 "*.WAV" - IDS_OPEN_FILTER3 "All Files (*.*)" - IDS_OPEN_FILTER4 "*.*" - IDS_ENUMWARNING "Drivers will not be enumerated until DSStream is run again." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_APPINIT "Could not initialize application" - IDS_ERROR_INSTANCEINIT "Could not initialize an instance of this application" - IDS_ERROR_REGISTERCLASS "RegisterClass() failed while attempting to register the main application window class" - IDS_ERROR_MAINWNDCREATE "Could not create the main application window: CreateWindow() failed." - IDS_ERROR_DSCREATE "Could not create a Directsound object: Either the required device is busy, or the DirectSound subsystem is not properly installed." - IDS_ERROR_WAVEFILEOPEN "Could not open the requested WAVE file: Resources may be running low" - IDS_ERROR_WAVENOTPCM "The selected WAVE file is not a PCM encoded file and cannot be opened by this application." - IDS_ERROR_WAVESEEKFAILED - "An error occured while attempting to seek to the data chunk of the WAVE file: the file may be corrupt." - IDS_ERROR_DSBCREATE "The application was unable to create a DirectSoundBuffer object. Resources may be running low or the sound device may be busy." - IDS_ERROR_PAN "Pan" - IDS_ERROR_VOL "Volume" - IDS_ERROR_FREQ "Freq" - IDS_ERROR_DSCOOPERATIVE "Could not set Cooperative Level on DirectSound object!" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_PROG "Prog" - IDS_ERROR_CHILDTEMPLATE "Unable to create the %s %s control -- CreateWindow() failed in CreateChildren(). Resources may be running low." - IDS_ERROR_TRACKBAR "Trackbar" - IDS_ERROR_BUTTON "Button" - IDS_ERROR_STATICTEXT "Static Text" - IDS_ERROR_GETTEXTEXTENT "Unable to determine text size while creating child controls: GetTextExtentPoint32() failed." - IDS_ERROR_CHECK "Checkbox" -END - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/dsstream/dstrenum.c b/sdk/samples/dsstream/dstrenum.c deleted file mode 100644 index 0e43704..0000000 --- a/sdk/samples/dsstream/dstrenum.c +++ /dev/null @@ -1,141 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dstrenum.c - * Content: Illustrates enumerating DirectSound drivers - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include - -#include "dsstream.h" - -extern HINSTANCE hInst; -extern HWND hWndMain; - - - -/****************************************************************************/ -/* DoDSoundEnumerate() */ -/* */ -/* This function takes care of handling the DirectSound enumeration, which*/ -/* simply means creating a dialog box, at this point... */ -/****************************************************************************/ -BOOL DoDSoundEnumerate( LPGUID lpGUID ) - { - if( DialogBoxParam( hInst, MAKEINTRESOURCE(IDD_DSENUMBOX), hWndMain, - DSEnumDlgProc, (LPARAM)lpGUID )) - return( TRUE ); - - return( FALSE ); - } - -/****************************************************************************/ -/* DSEnumDlgProc() */ -/* */ -/* Dialog procedure for the DSound enumeration choice dialog. Allows the */ -/* user to choose from installed drivers. Returns TRUE on error. */ -/****************************************************************************/ -BOOL CALLBACK DSEnumDlgProc( HWND hDlg, UINT msg, - WPARAM wParam, LPARAM lParam ) - { - static HWND hCombo; - static LPGUID lpGUID; - LPGUID lpTemp; - int i; - - switch( msg ) - { - case WM_INITDIALOG: - hCombo = GetDlgItem( hDlg, IDC_DSENUM_COMBO ); - lpGUID = (LPGUID)lParam; - - if( DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, &hCombo ) != DS_OK ) - { - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - if( ComboBox_GetCount( hCombo )) - ComboBox_SetCurSel( hCombo, 0 ); - else - { - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - return( TRUE ); - - - case WM_COMMAND: - switch( LOWORD( wParam )) - { - case IDOK: - for( i = 0; i < ComboBox_GetCount( hCombo ); i++ ) - { - lpTemp = (LPGUID)ComboBox_GetItemData( hCombo, i ); - if( i == ComboBox_GetCurSel( hCombo )) - { - if( lpTemp != NULL ) - memcpy( lpGUID, lpTemp, sizeof(GUID)); - else - lpGUID = NULL; - } - if( lpTemp ) - LocalFree( lpTemp ); - } - // If we got the NULL GUID, then we want to open the default - // sound driver, so return with an error and the init code - // will know not to pass in the guID and will send NULL - // instead. - if( lpGUID == NULL ) - EndDialog( hDlg, TRUE ); - else - EndDialog( hDlg, FALSE ); - return( TRUE ); - - case IDCANCEL: - // Force a NULL GUID - EndDialog( hDlg, TRUE ); - return( TRUE ); - } - break; - - - default: - return( FALSE ); - } - - return( FALSE ); - } - - -/****************************************************************************/ -/* DSEnumProc() */ -/* */ -/* This is the Enumeration procedure called by DirectSoundEnumerate with */ -/* the parameters of each DirectSound Object available in the system. */ -/****************************************************************************/ -BOOL CALLBACK DSEnumProc( LPGUID lpGUID, LPSTR lpszDesc, - LPSTR lpszDrvName, LPVOID lpContext ) - { - HWND hCombo = *(HWND *)lpContext; - LPGUID lpTemp = NULL; - - if( lpGUID != NULL ) - { - if(( lpTemp = LocalAlloc( LPTR, sizeof(GUID))) == NULL ) - return( TRUE ); - - memcpy( lpTemp, lpGUID, sizeof(GUID)); - } - - ComboBox_AddString( hCombo, lpszDesc ); - ComboBox_SetItemData( hCombo, - ComboBox_FindString( hCombo, 0, lpszDesc ), - lpTemp ); - return( TRUE ); - } diff --git a/sdk/samples/dsstream/dstrtime.c b/sdk/samples/dsstream/dstrtime.c deleted file mode 100644 index 512fe65..0000000 --- a/sdk/samples/dsstream/dstrtime.c +++ /dev/null @@ -1,328 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: Dstrtime.c - * Content: This source file contains a Multimedia Timer Callback - * procedure which is used by the DirectSound Stream Sample - * application to update the playback buffer at regular intervals - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dsstream.h" - -extern HWND hWndMain; -extern char szDebug[]; -extern WAVEINFOCA wiWave; - -LONG lInTimer = FALSE; - -void CALLBACK TimeFunc( UINT uTimerID, UINT uMsg, DWORD dwUser, - DWORD dw1, DWORD dw2 ) - { - LPBYTE lpWrite1, lpWrite2, lpTemp; - DWORD dwLen1, dwLen2, dwPlay, dwWrite, dwPlayedLength, dwWriteLength; - DWORD dwLeftToRead, dwStatus; - int nChkErr; - UINT uChkErr; - BOOL fRefillLostBuffer = FALSE; - HRESULT hr; - - if (InterlockedExchange(&lInTimer, TRUE)) return; - - /* See if the buffer has been lost */ - IDirectSoundBuffer_GetStatus( wiWave.lpDSBStreamBuffer, &dwStatus ); - if( DSBSTATUS_BUFFERLOST & dwStatus ) - { - // Restore the buffer and set some variables that will cause it - // to be filled again and replayed - hr = IDirectSoundBuffer_Restore( wiWave.lpDSBStreamBuffer ); - if( FAILED( hr )) - { - InterlockedExchange( &lInTimer, FALSE ); - return; - } - wiWave.dwNextWriteOffset = 0; - fRefillLostBuffer = TRUE; - } - - /* Get and print the current position of the play cursor */ - wiWave.lpDSBStreamBuffer->lpVtbl->GetCurrentPosition( - wiWave.lpDSBStreamBuffer, &dwPlay, &dwWrite ); - - /* If the play cursor is at the same spot as the last call, there are two - * possibilities. The first is that we were called extremely late and - * happened to land on an integer number of complete buffer cycles. This - * is not very likely. The other is that the play cursor didn't move. - * Since we're oversampling, this is very likely. In this case, we should - * bail. - */ - - if( dwPlay == wiWave.dwNextWriteOffset && !fRefillLostBuffer ) - { -#ifdef DEBUG - PostMessage( hWndMain, WM_DSSTREAM_DEBUG, - MAKEWPARAM( DEBUGF_SKIP, 0 ), 0 ); -#endif - InterlockedExchange(&lInTimer, FALSE); - return; - } - -#ifdef DEBUG - PostMessage( hWndMain, WM_DSSTREAM_DEBUG, - MAKEWPARAM( DEBUGF_PLAYPOSITION, 0 ), dwPlay ); -#endif - -#ifdef DEBUG - PostMessage( hWndMain, WM_DSSTREAM_DEBUG, - MAKEWPARAM( DEBUGF_WRITEPOSITION, 0 ), - wiWave.dwNextWriteOffset ); -#endif - - /* Have we found the end of the file and passed the buffer end? */ - if( wiWave.bFoundEnd && !wiWave.dwBytesRemaining ) - { - if( !wiWave.bDonePlaying ) - { - wiWave.bDonePlaying = TRUE; - PostMessage( hWndMain, WM_DSSTREAM_DONE, (WPARAM)0, (LPARAM)0 ); - } - InterlockedExchange(&lInTimer, FALSE); - return; - } - - if( dwPlay < wiWave.dwNextWriteOffset ) - { - /* Calculate how many writeable bytes there are behind the play cursor */ - dwPlayedLength = (dwPlay + wiWave.dwBufferSize - wiWave.dwNextWriteOffset); - } - else - { - /* Calculate how many writeable bytes there are behind the play cursor */ - dwPlayedLength = (dwPlay - wiWave.dwNextWriteOffset); - } - - // If the buffer was lost, then we need to start filling data at the start of - // the buffer, but we can decrease startup latency by only filling a segment - // or two this time around. - if( fRefillLostBuffer ) - dwWriteLength = 2 * wiWave.dwBufferSize / NUM_BUFFER_SEGMENTS; - else - dwWriteLength = dwPlayedLength; - - wiWave.dwProgress += dwPlayedLength; - - PostMessage( hWndMain, WM_DSSTREAM_PROGRESS, 0L, wiWave.dwProgress ); - - - /* - * If wiWave.bFoundEnd == TRUE, then we've finished reading in the file, - * but we need to wait until the buffer's play cursor passes the point we - * were at when we found out we were done reading. - */ - if( wiWave.bFoundEnd && wiWave.dwBytesRemaining ) - { - // Decrement the count of how many bytes we have to wait for before - // we can kill the timer procedure safely - if( dwPlayedLength > wiWave.dwBytesRemaining ) - wiWave.dwBytesRemaining = 0; - else - wiWave.dwBytesRemaining -= dwPlayedLength; - - if( wiWave.lpDSBStreamBuffer->lpVtbl->Lock( wiWave.lpDSBStreamBuffer, - wiWave.dwNextWriteOffset, - dwWriteLength, - &((LPVOID)lpWrite1), &dwLen1, - &((LPVOID)lpWrite2), &dwLen2, - 0 ) != 0 ) - { - OutputDebugString( "TimeFunc() could not lock DirectSoundBuffer" ); - InterlockedExchange(&lInTimer, FALSE); - return; - } - - /* Silence out both parts of the locked buffer */ - memset( lpWrite1, wiWave.pwfx->wBitsPerSample == 8 ? 128 : 0, dwLen1 ); - - if( lpWrite2 && dwLen2 ) - memset( lpWrite2, - wiWave.pwfx->wBitsPerSample == 8 ? 128 : 0, - dwLen2 ); - - wiWave.lpDSBStreamBuffer->lpVtbl->Unlock( wiWave.lpDSBStreamBuffer, - (LPVOID)lpWrite1, dwLen1, - (LPVOID)lpWrite2, dwLen2 ); - /* - * This code is stolen from the end of the routine -- we need to keep - * zeroing out buffer segments while we're waiting for the play cursor to - * catch up to the end of the WAVE data. - */ - wiWave.dwNextWriteOffset += dwWriteLength; - if( wiWave.dwNextWriteOffset >= wiWave.dwBufferSize ) - wiWave.dwNextWriteOffset -= wiWave.dwBufferSize; - -#ifdef DEBUG - PostMessage( hWndMain, WM_DSSTREAM_DEBUG, - MAKEWPARAM( DEBUGF_NEXTWRITE, 0 ), - wiWave.dwNextWriteOffset ); -#endif - InterlockedExchange(&lInTimer, FALSE); - return; - } - - /* Lock a segment of memory that is behind the play cursor */ - if( wiWave.lpDSBStreamBuffer->lpVtbl->Lock( wiWave.lpDSBStreamBuffer, - wiWave.dwNextWriteOffset, - dwWriteLength, - &((LPVOID)lpWrite1), &dwLen1, - &((LPVOID)lpWrite2), &dwLen2, - 0 ) != 0 ) - { - OutputDebugString( "TimeFunc() could not lock DirectSoundBuffer" ); - InterlockedExchange(&lInTimer, FALSE); - return; - } - - if( dwLen1 && !wiWave.bDonePlaying ) - { - nChkErr = WaveReadFile( wiWave.hmmio, (UINT)dwLen1, lpWrite1, - &wiWave.mmck, &uChkErr ); - if( uChkErr < (UINT)dwLen1 ) - { - if( !wiWave.bLoopFile ) - { - /* Zero out the rest of this block */ - if( wiWave.pwfx->wBitsPerSample == 8 ) - memset( lpWrite1+uChkErr, 128, ((UINT)dwLen1-uChkErr)); - else if( wiWave.pwfx->wBitsPerSample == 16 ) - memset( lpWrite1+uChkErr, 0, ((UINT)dwLen1-uChkErr)); - -/* Enable play completion detection code at the beginning of the next call */ - - wiWave.bFoundEnd = TRUE; - if( dwPlay > wiWave.dwNextWriteOffset ) - wiWave.dwBytesRemaining = (wiWave.dwNextWriteOffset - + wiWave.dwBufferSize - dwPlay); - else - wiWave.dwBytesRemaining = (wiWave.dwNextWriteOffset - - dwPlay); - } - else - { - lpTemp = lpWrite1; - dwLeftToRead = dwLen1; - do - { - /* Continue decrementing our count and moving our temp - * pointer forward until we've read the file enough times - * to fill the buffer. NOTE: It's probably not efficient - * to bother with the overhead of streaming a file that's - * not at least as large as the buffer... */ - lpTemp += uChkErr; - dwLeftToRead -= uChkErr; - nChkErr = WaveStartDataRead( &wiWave.hmmio, - &wiWave.mmck, - &wiWave.mmckInRIFF ); - nChkErr = WaveReadFile( wiWave.hmmio, (UINT)dwLeftToRead, - lpTemp, - &wiWave.mmck, &uChkErr ); - } while( uChkErr < dwLeftToRead ); - } - } - } - /* - * The bDonePlaying flag is set by the caller if the user stops playback - * before the end of the WAVE file is encountered. It tells us to cut this - * racket out and play nothing in case it takes the caller a couple - * interrupts to shut off the timer. - */ - else if( dwLen1 && wiWave.bDonePlaying ) - { - // Set the appropriate silence value - _fmemset( lpWrite1, - wiWave.pwfx->wBitsPerSample == 8 ? 128 : 0, - dwLen1); - } - - if( dwLen2 && !wiWave.bDonePlaying ) - { - nChkErr = WaveReadFile( wiWave.hmmio, (UINT)dwLen2, lpWrite2, - &wiWave.mmck, &uChkErr ); - if( uChkErr < (UINT)dwLen2 ) - { - if( !wiWave.bLoopFile ) - { - /* Zero out the rest of this block */ - if( wiWave.pwfx->wBitsPerSample == 8 ) - memset( lpWrite2+uChkErr, 128, ((UINT)dwLen2-uChkErr)); - else if( wiWave.pwfx->wBitsPerSample == 16 ) - memset( lpWrite2+uChkErr, 0, ((UINT)dwLen2-uChkErr)); - /* Enable play completion detection code at the beginning - * of the next call - */ - wiWave.bFoundEnd = TRUE; - if( dwPlay > wiWave.dwNextWriteOffset ) - wiWave.dwBytesRemaining = (wiWave.dwNextWriteOffset - + wiWave.dwBufferSize - dwPlay); - else - wiWave.dwBytesRemaining = (wiWave.dwNextWriteOffset - - dwPlay); - } - else - { - lpTemp = lpWrite2; - dwLeftToRead = dwLen2; - do - { - /* Continue decrementing our count and moving our temp - * pointer forward until we've read the file enough times - * to fill the buffer. NOTE: It's probably not efficient - * to bother with the overhead of streaming a file that's - * not at least as large as the buffer... */ - lpTemp += uChkErr; - dwLeftToRead -= uChkErr; - nChkErr = WaveStartDataRead( &wiWave.hmmio, - &wiWave.mmck, - &wiWave.mmckInRIFF ); - nChkErr = WaveReadFile( wiWave.hmmio, (UINT)dwLeftToRead, - lpTemp, - &wiWave.mmck, &uChkErr ); - } while( uChkErr < dwLeftToRead ); - } - } - } - else if( lpWrite2 && dwLen2 && wiWave.bDonePlaying ) - { - // Set the appropriate silence value - _fmemset( lpWrite2, - wiWave.pwfx->wBitsPerSample == 8 ? 128 : 0, - dwLen2 ); - } - - wiWave.lpDSBStreamBuffer->lpVtbl->Unlock( wiWave.lpDSBStreamBuffer, - (LPVOID)lpWrite1, dwLen1, - (LPVOID)lpWrite2, dwLen2 ); - - wiWave.dwNextWriteOffset += dwWriteLength; - if( wiWave.dwNextWriteOffset >= wiWave.dwBufferSize ) - wiWave.dwNextWriteOffset -= wiWave.dwBufferSize; - -#ifdef DEBUG - PostMessage( hWndMain, WM_DSSTREAM_DEBUG, - MAKEWPARAM( DEBUGF_NEXTWRITE, 0 ), - wiWave.dwNextWriteOffset ); -#endif - if( fRefillLostBuffer ) - IDirectSoundBuffer_Play( wiWave.lpDSBStreamBuffer, 0, 0, DSBPLAY_LOOPING ); - InterlockedExchange(&lInTimer, FALSE); - return; - } diff --git a/sdk/samples/dsstream/dstrwave.c b/sdk/samples/dsstream/dstrwave.c deleted file mode 100644 index 160394b..0000000 --- a/sdk/samples/dsstream/dstrwave.c +++ /dev/null @@ -1,901 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: dstrwave.c - * Content: Wave library routines. - * - * This file is used for loading/saving waves, and reading and - * writing waves in smaller blocks. - * Uses WaveOpenFile, WaveReadFile and WaveCloseReadFile for - * single block access to reading wave files. - * Uses WaveCreateFile, WaveWriteFile, WaveCloseWriteFile for - * single block access for writing wave files. - * Uses WaveLoadFile to load a whole wave file into memory. - * Uses WaveSaveFile to save a whole wave file from memory. - * - ***************************************************************************/ - -/* PROTOTYPES */ -#include -#include -#include -#include "dsstream.h" -#include "wassert.h" - - -/* ROUTINES */ -/* -------------------------------------------------------*/ - -/* This function will open a wave input file and prepare it for reading, - * so the data can be easily - * read with WaveReadFile. Returns 0 if successful, the error code if not. - * pszFileName - Input filename to load. - * phmmioIn - Pointer to handle which will be used - * for further mmio routines. - * ppwfxInfo - Ptr to ptr to WaveFormatEx structure - * with all info about the file. - * -*/ -int WaveOpenFile( - char *pszFileName, // (IN) - HMMIO *phmmioIn, // (OUT) - WAVEFORMATEX **ppwfxInfo, // (OUT) - MMCKINFO *pckInRIFF // (OUT) - ) -{ - HMMIO hmmioIn; - MMCKINFO ckIn; // chunk info. for general use. - PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in. - WORD cbExtraAlloc; // Extra bytes for waveformatex - int nError; // Return value. - - - // Initialization... - *ppwfxInfo = NULL; - nError = 0; - hmmioIn = NULL; - - if ((hmmioIn = mmioOpen(pszFileName, NULL, MMIO_ALLOCBUF | MMIO_READ)) == NULL) - { - nError = ER_CANNOTOPEN; - goto ERROR_READING_WAVE; - } - - if ((nError = (int)mmioDescend(hmmioIn, pckInRIFF, NULL, 0)) != 0) - { - goto ERROR_READING_WAVE; - } - - - if ((pckInRIFF->ckid != FOURCC_RIFF) || (pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E'))) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Search the input file for for the 'fmt ' chunk. */ - ckIn.ckid = mmioFOURCC('f', 'm', 't', ' '); - if ((nError = (int)mmioDescend(hmmioIn, &ckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - /* Expect the 'fmt' chunk to be at least as large as ; - * if there are extra parameters at the end, we'll ignore them */ - - if (ckIn.cksize < (long) sizeof(PCMWAVEFORMAT)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Read the 'fmt ' chunk into .*/ - if (mmioRead(hmmioIn, (HPSTR) &pcmWaveFormat, (long) sizeof(pcmWaveFormat)) != (long) sizeof(pcmWaveFormat)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - - // Ok, allocate the waveformatex, but if its not pcm - // format, read the next word, and thats how many extra - // bytes to allocate. - if (pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM) - cbExtraAlloc = 0; - - else - { - // Read in length of extra bytes. - if (mmioRead(hmmioIn, (LPSTR) &cbExtraAlloc, - (long) sizeof(cbExtraAlloc)) != (long) sizeof(cbExtraAlloc)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - } - - // Ok, now allocate that waveformatex structure. - if ((*ppwfxInfo = GlobalAlloc(GMEM_FIXED, sizeof(WAVEFORMATEX)+cbExtraAlloc)) == NULL) - { - nError = ER_MEM; - goto ERROR_READING_WAVE; - } - - // Copy the bytes from the pcm structure to the waveformatex structure - memcpy(*ppwfxInfo, &pcmWaveFormat, sizeof(pcmWaveFormat)); - (*ppwfxInfo)->cbSize = cbExtraAlloc; - - // Now, read those extra bytes into the structure, if cbExtraAlloc != 0. - if (cbExtraAlloc != 0) - { - if (mmioRead(hmmioIn, (LPSTR) (((BYTE*)&((*ppwfxInfo)->cbSize))+sizeof(cbExtraAlloc)), - (long) (cbExtraAlloc)) != (long) (cbExtraAlloc)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - } - - /* Ascend the input file out of the 'fmt ' chunk. */ - if ((nError = mmioAscend(hmmioIn, &ckIn, 0)) != 0) - { - goto ERROR_READING_WAVE; - - } - - - goto TEMPCLEANUP; - -ERROR_READING_WAVE: - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - -TEMPCLEANUP: - *phmmioIn = hmmioIn; - - return(nError); - -} - -/* This routine has to be called before WaveReadFile as it searchs for the chunk to descend into for - reading, that is, the 'data' chunk. For simplicity, this used to be in the open routine, but was - taken out and moved to a separate routine so there was more control on the chunks that are before - the data chunk, such as 'fact', etc... */ - -int WaveStartDataRead( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRIFF - ) -{ - int nError; - - nError = 0; - - // Do a nice little seek... - if ((nError = mmioSeek(*phmmioIn, pckInRIFF->dwDataOffset + sizeof(FOURCC), SEEK_SET)) == -1) - { - Assert(FALSE); - } - - nError = 0; - // Search the input file for for the 'data' chunk. - pckIn->ckid = mmioFOURCC('d', 'a', 't', 'a'); - if ((nError = mmioDescend(*phmmioIn, pckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - goto CLEANUP; - -ERROR_READING_WAVE: - -CLEANUP: - return(nError); -} - - -/* This will read wave data from the wave file. Makre sure we're descended into - the data chunk, else this will fail bigtime! - hmmioIn - Handle to mmio. - cbRead - # of bytes to read. - pbDest - Destination buffer to put bytes. - cbActualRead- # of bytes actually read. - - - -*/ - - -int WaveReadFile( - HMMIO hmmioIn, // IN - UINT cbRead, // IN - BYTE *pbDest, // IN - MMCKINFO *pckIn, // IN. - UINT *cbActualRead // OUT. - - ) -{ - - MMIOINFO mmioinfoIn; // current status of - int nError; - UINT cT, cbDataIn, uCopyLength; - - nError = 0; - - if (nError = mmioGetInfo(hmmioIn, &mmioinfoIn, 0) != 0) - { - goto ERROR_CANNOT_READ; - } - - cbDataIn = cbRead; - if (cbDataIn > pckIn->cksize) - cbDataIn = pckIn->cksize; - - pckIn->cksize -= cbDataIn; - - for (cT = 0; cT < cbDataIn; ) - { - /* Copy the bytes from the io to the buffer. */ - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - if ((nError = mmioAdvance(hmmioIn, &mmioinfoIn, MMIO_READ)) != 0) - { - goto ERROR_CANNOT_READ; - } - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - nError = ER_CORRUPTWAVEFILE; - goto ERROR_CANNOT_READ; - } - } - - // Actual copy. - uCopyLength = (UINT)(mmioinfoIn.pchEndRead - mmioinfoIn.pchNext); - if((cbDataIn - cT) < uCopyLength ) - uCopyLength = cbDataIn - cT; - memcpy( (BYTE*)(pbDest+cT), (BYTE*)mmioinfoIn.pchNext, uCopyLength ); - cT += uCopyLength; - mmioinfoIn.pchNext += uCopyLength; - } - - if ((nError = mmioSetInfo(hmmioIn, &mmioinfoIn, 0)) != 0) - { - goto ERROR_CANNOT_READ; - } - - *cbActualRead = cbDataIn; - goto FINISHED_READING; - -ERROR_CANNOT_READ: - *cbActualRead = 0; - -FINISHED_READING: - return(nError); - -} - -/* This will close the wave file openned with WaveOpenFile. - phmmioIn - Pointer to the handle to input MMIO. - ppwfxSrc - Pointer to pointer to WaveFormatEx structure. - - Returns 0 if successful, non-zero if there was a warning. - -*/ -int WaveCloseReadFile( - HMMIO *phmmio, // IN - WAVEFORMATEX **ppwfxSrc // IN - ) -{ - - if (*ppwfxSrc != NULL) - { - GlobalFree(*ppwfxSrc); - *ppwfxSrc = NULL; - } - - if (*phmmio != NULL) - { - mmioClose(*phmmio, 0); - *phmmio = NULL; - } - - return(0); - -} - -/* This routine will create a wave file for writing. This will automatically overwrite any - existing file with the same name, so be careful and check before hand!!! - pszFileName - Pointer to filename to write. - phmmioOut - Pointer to HMMIO handle that is used for further writes - pwfxDest - Valid waveformatex destination structure. - pckOut - Pointer to be set with the MMCKINFO. - pckOutRIFF - Pointer to be set with the RIFF info. - -*/ -int WaveCreateFile( - char *pszFileName, // (IN) - HMMIO *phmmioOut, // (OUT) - WAVEFORMATEX *pwfxDest, // (IN) - MMCKINFO *pckOut, // (OUT) - MMCKINFO *pckOutRIFF // (OUT) - - ) -{ - - int nError; // Return value. - DWORD dwFactChunk; // Contains the actual fact chunk. Garbage until WaveCloseWriteFile. - MMCKINFO ckOut1; - - dwFactChunk = (DWORD)-1; - nError = 0; - - *phmmioOut = mmioOpen(pszFileName, NULL, - MMIO_ALLOCBUF | MMIO_READWRITE|MMIO_CREATE); - - if (*phmmioOut == NULL) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot save WAVE file - } - - /* Create the output file RIFF chunk of form type 'WAVE'. - */ - pckOutRIFF->fccType = mmioFOURCC('W', 'A', 'V', 'E'); - pckOutRIFF->cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, pckOutRIFF, MMIO_CREATERIFF)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - /* We are now descended into the 'RIFF' chunk we just created. - * Now create the 'fmt ' chunk. Since we know the size of this chunk, - * specify it in the MMCKINFO structure so MMIO doesn't have to seek - * back and set the chunk size after ascending from the chunk. - */ - pckOut->ckid = mmioFOURCC('f', 'm', 't', ' '); - pckOut->cksize = sizeof(PCMWAVEFORMAT); // we know the size of this ck. - if ((nError = mmioCreateChunk(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - /* Write the PCMWAVEFORMAT structure to the 'fmt ' chunk if its that type. */ - if (pwfxDest->wFormatTag == WAVE_FORMAT_PCM) - { - if (mmioWrite(*phmmioOut, (HPSTR) pwfxDest, sizeof(PCMWAVEFORMAT)) - != sizeof(PCMWAVEFORMAT)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - } - - else - { - // Write the variable length size. - if ((UINT)mmioWrite(*phmmioOut, (HPSTR) pwfxDest, sizeof(*pwfxDest)+pwfxDest->cbSize) - != (sizeof(*pwfxDest)+pwfxDest->cbSize)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - } - - /* Ascend out of the 'fmt ' chunk, back into the 'RIFF' chunk. - */ - if ((nError = mmioAscend(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - // Now create the fact chunk, not required for PCM but nice to have. This is filled - // in when the close routine is called. - ckOut1.ckid = mmioFOURCC('f', 'a', 'c', 't'); - ckOut1.cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, &ckOut1, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - if (mmioWrite(*phmmioOut, (HPSTR)&dwFactChunk, sizeof(dwFactChunk)) != sizeof(dwFactChunk)) - { - nError = ER_CANNOTWRITE; - goto ERROR_CANNOT_WRITE; - } - - // Now ascend out of the fact chunk... - if ((nError = mmioAscend(*phmmioOut, &ckOut1, 0)) != 0) - { - nError = ER_CANNOTWRITE; // cannot write file, probably - goto ERROR_CANNOT_WRITE; - } - - - - goto DONE_CREATE; - -ERROR_CANNOT_WRITE: - // Maybe delete the half-written file? Ah forget it for now, its good to leave the - // file there for debugging... - -DONE_CREATE: - return(nError); - -} - -/* This routine has to be called before any data is written to the wave output file, via wavewritefile. This - sets up the data to write, and creates the data chunk. -*/ - -int WaveStartDataWrite( - HMMIO *phmmioOut, // (IN) - MMCKINFO *pckOut, // (IN) - MMIOINFO *pmmioinfoOut // (OUT) - ) -{ - - int nError; - - nError = 0; - /* Create the 'data' chunk that holds the waveform samples. */ - pckOut->ckid = mmioFOURCC('d', 'a', 't', 'a'); - pckOut->cksize = 0; - if ((nError = mmioCreateChunk(*phmmioOut, pckOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; // cannot write file, probably - } - - if ((nError = mmioGetInfo(*phmmioOut, pmmioinfoOut, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - - goto CLEANUP; -ERROR_CANNOT_WRITE: - -CLEANUP: - return(nError); -} - -/* This routine will write out data to a wave file. - hmmioOut - Handle to hmmioOut filled by WaveCreateFile - cbWrite - # of bytes to write out. - pbSrc - Pointer to source. - pckOut - pointer to ckOut filled by WaveCreateFile - cbActualWrite - # of actual bytes written. - pmmioinfoOut - Pointer to mmioinfoOut filled by WaveCreateFile. - - Returns 0 if successful, else the error code. - - */ - - -int WaveWriteFile( - HMMIO hmmioOut, // (IN) - UINT cbWrite, // (IN) - BYTE *pbSrc, // (IN) - MMCKINFO *pckOut, // (IN) - UINT *cbActualWrite, // (OUT) - MMIOINFO *pmmioinfoOut // (IN) - ) -{ - - - int nError; - UINT cT; - - nError = 0; - - *cbActualWrite = 0; - - for (cT=0; cT < cbWrite; cT++) - { - if (pmmioinfoOut->pchNext == pmmioinfoOut->pchEndWrite) - { - pmmioinfoOut->dwFlags |= MMIO_DIRTY; - if ((nError = mmioAdvance(hmmioOut, pmmioinfoOut, MMIO_WRITE)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - } - *((BYTE*)pmmioinfoOut->pchNext)++ = *((BYTE*)pbSrc+cT); - (*cbActualWrite)++; - } - - -ERROR_CANNOT_WRITE: - // What to do here? Well, for now, nothing, just return that error. (maybe delete the - // file later? - - return(nError); - -} - - - -/* This routine will close a wave file used for writing. Returns 0 if successful, else - the error code. - phmmioOut - Pointer to mmio handle for saving. - pckOut - Pointer to the MMCKINFO for saving. - pckOutRiff - Pointer to the riff MMCKINFO for saving. - pmmioinfoOut- Pointer to mmioinfo for saving. - cSamples - # of samples saved, for the fact chunk. For PCM, this isn't used but - will be written anyway, so this can be zero as long as programs ignore - this field when they load PCM formats. - - - -*/ -int WaveCloseWriteFile( - HMMIO *phmmioOut, // (IN) - MMCKINFO *pckOut, // (IN) - MMCKINFO *pckOutRIFF, // (IN) - MMIOINFO *pmmioinfoOut, // (IN) - DWORD cSamples // (IN) - ) -{ - - int nError; - - nError = 0; - - if (*phmmioOut == NULL) - return(0); - - pmmioinfoOut->dwFlags |= MMIO_DIRTY; - if ((nError = mmioSetInfo(*phmmioOut, pmmioinfoOut, 0)) != 0) - { - // cannot flush, probably... - goto ERROR_CANNOT_WRITE; - } - - /* Ascend the output file out of the 'data' chunk -- this will cause - * the chunk size of the 'data' chunk to be written. - */ - if ((nError = mmioAscend(*phmmioOut, pckOut, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - // Do this here instead... - if ((nError = mmioAscend(*phmmioOut, pckOutRIFF, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - nError = mmioSeek(*phmmioOut, 0, SEEK_SET); - if ((nError = (int)mmioDescend(*phmmioOut, pckOutRIFF, NULL, 0)) != 0) - { - goto ERROR_CANNOT_WRITE; - } - - nError = 0; - pckOut->ckid = mmioFOURCC('f', 'a', 'c', 't'); - if ((nError = mmioDescend(*phmmioOut, pckOut, pckOutRIFF, MMIO_FINDCHUNK)) == 0) - { - // If it didn't fail, write the fact chunk out, if it failed, not critical, just - // assert (below). - nError = mmioWrite(*phmmioOut, (HPSTR)&cSamples, sizeof(DWORD)); - nError = mmioAscend(*phmmioOut, pckOut, 0); - nError = 0; - } - else - { - nError = 0; - Assert(FALSE); - } - -// CANTWRITEFACT: - /* Ascend the output file out of the 'RIFF' chunk -- this will cause - * the chunk size of the 'RIFF' chunk to be written. - */ - if ((nError = mmioAscend(*phmmioOut, pckOutRIFF, 0)) != 0) - goto ERROR_CANNOT_WRITE; // cannot write file, probably - - - -ERROR_CANNOT_WRITE: - if (*phmmioOut != NULL) - { - mmioClose(*phmmioOut, 0); - *phmmioOut = NULL; - } - - return(nError); - -} - -/* This routine will copy from a source wave file to a destination wave file all those useless chunks - (well, the ones useless to conversions, etc --> apparently people use them!). The source will be - seeked to the begining, but the destination has to be at a current pointer to put the new chunks. - This will also seek back to the start of the wave riff header at the end of the routine. - - phmmioIn - Pointer to input mmio file handle. - pckIn - Pointer to a nice ckIn to use. - pckInRiff - Pointer to the main riff. - phmmioOut - Pointer to output mmio file handle. - pckOut - Pointer to nice ckOut to use. - pckOutRiff - Pointer to the main riff. - - - Returns 0 if successful, else the error code. If this routine fails, it still attemps to seek back to - the start of the wave riff header, though this too could be unsuccessful. -*/ - -int WaveCopyUselessChunks( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRiff, - HMMIO *phmmioOut, - MMCKINFO *pckOut, - MMCKINFO *pckOutRiff) -{ - - int nError; - - nError = 0; - // First seek to the stinking start of the file, not including the riff header... - if ((nError = mmioSeek(*phmmioIn, pckInRiff->dwDataOffset + sizeof(FOURCC), SEEK_SET)) == -1) - { - nError = ER_CANNOTREAD; - goto ERROR_IN_PROC; - } - - nError = 0; - - while (mmioDescend(*phmmioIn, pckIn, pckInRiff, 0) == 0) - { - - // quickly check for corrupt RIFF file--don't ascend past end! - if ((pckIn->dwDataOffset + pckIn->cksize) > (pckInRiff->dwDataOffset + pckInRiff->cksize)) - goto ERROR_IN_PROC; - - switch (pckIn->ckid) - { - // explicitly skip these... - case mmioFOURCC('f', 'm', 't', ' '): - break; - - case mmioFOURCC('d', 'a', 't', 'a'): - break; - - case mmioFOURCC('f', 'a', 'c', 't'): - break; - - case mmioFOURCC('J', 'U', 'N', 'K'): - break; - - case mmioFOURCC('P', 'A', 'D', ' '): - break; - - case mmioFOURCC('c', 'u', 'e', ' '): - break; - - // copy chunks that are OK to copy - case mmioFOURCC('p', 'l', 's', 't'): - // although without the 'cue' chunk, it doesn't make much sense - riffCopyChunk(*phmmioIn, *phmmioOut, pckIn); - break; - - case mmioFOURCC('D', 'I', 'S', 'P'): - riffCopyChunk(*phmmioIn, *phmmioOut, pckIn); - break; - - - // don't copy unknown chunks - default: - break; - } - - - // step up to prepare for next chunk.. - mmioAscend(*phmmioIn, pckIn, 0); - } - -ERROR_IN_PROC: - { - int nErrorT; - // Seek back to riff header - nErrorT = mmioSeek(*phmmioIn, pckInRiff->dwDataOffset + sizeof(FOURCC), SEEK_SET); - } - - return(nError); -} - -/** BOOL RIFFAPI riffCopyChunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck) - * - * DESCRIPTION: - * - * - * ARGUMENTS: - * (LPWAVECONVCB lpwc, LPMMCKINFO lpck) - * - * RETURN (BOOL NEAR PASCAL): - * - * - * NOTES: - * - ** */ - -BOOL riffCopyChunk(HMMIO hmmioSrc, HMMIO hmmioDst, const LPMMCKINFO lpck) -{ - MMCKINFO ck; - HPSTR hpBuf; - - // - // - // - hpBuf = (HPSTR)GlobalAllocPtr(GHND, lpck->cksize); - if (!hpBuf) - return (FALSE); - - ck.ckid = lpck->ckid; - ck.cksize = lpck->cksize; - if (mmioCreateChunk(hmmioDst, &ck, 0)) - goto rscc_Error; - - if (mmioRead(hmmioSrc, hpBuf, lpck->cksize) != (LONG)lpck->cksize) - goto rscc_Error; - - if (mmioWrite(hmmioDst, hpBuf, lpck->cksize) != (LONG)lpck->cksize) - goto rscc_Error; - - if (mmioAscend(hmmioDst, &ck, 0)) - goto rscc_Error; - - if (hpBuf) - GlobalFreePtr(hpBuf); - - return (TRUE); - -rscc_Error: - - if (hpBuf) - GlobalFreePtr(hpBuf); - - return (FALSE); -} /* RIFFSupCopyChunk() */ - - - -/* This routine loads a full wave file into memory. Be careful, wave files can get - pretty big these days :). - szFileName - sz Filename - cbSize - Size of loaded wave (returned) - cSamples - # of samples loaded. - ppwfxInfo - Pointer to pointer to waveformatex structure. The wfx structure - IS ALLOCATED by this routine! Make sure to free it! - ppbData - Pointer to a byte pointer (globalalloc) which is allocated by this - routine. Make sure to free it! - - Returns 0 if successful, else the error code. -*/ - -int WaveLoadFile( - char *pszFileName, // (IN) - UINT *cbSize, // (OUT) - DWORD *pcSamples, // (OUT) - WAVEFORMATEX **ppwfxInfo, // (OUT) - BYTE **ppbData // (OUT) - ) -{ - - HMMIO hmmioIn; - MMCKINFO ckInRiff; - MMCKINFO ckIn; - int nError; - UINT cbActualRead; - - *ppbData = NULL; - *ppwfxInfo = NULL; - *cbSize = 0; - - if ((nError = WaveOpenFile(pszFileName, &hmmioIn, ppwfxInfo, &ckInRiff)) != 0) - { - goto ERROR_LOADING; - } - - if ((nError = WaveStartDataRead(&hmmioIn, &ckIn, &ckInRiff)) != 0) - { - goto ERROR_LOADING; - } - - // Ok, size of wave data is in ckIn, allocate that buffer. - if ((*ppbData = (BYTE *)GlobalAlloc(GMEM_FIXED, ckIn.cksize)) == NULL) - { - nError = ER_MEM; - goto ERROR_LOADING; - } - - if ((nError = WaveReadFile(hmmioIn, ckIn.cksize, *ppbData, &ckIn, &cbActualRead)) != 0) - { - goto ERROR_LOADING; - } - - *cbSize = cbActualRead; - goto DONE_LOADING; - -ERROR_LOADING: - if (*ppbData != NULL) - { - GlobalFree(*ppbData); - *ppbData = NULL; - } - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - -DONE_LOADING: - // Close the wave file. - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - - return(nError); - -} - -/* This routine saves a wave file in currently in memory. - pszFileName - FileName to save to. Automatically overwritten, be careful! - cbSize - Size in bytes to write. - cSamples - # of samples to write, used to make the fact chunk. (if !PCM) - pwfxDest - Pointer to waveformatex structure. - pbData - Pointer to the data. -*/ - -int WaveSaveFile( - char *pszFileName, // (IN) - UINT cbSize, // (IN) - DWORD cSamples, // (IN) - WAVEFORMATEX *pwfxDest, // (IN) - BYTE *pbData // (IN) - ) -{ - - HMMIO hmmioOut; - MMCKINFO ckOut; - MMCKINFO ckOutRIFF; - MMIOINFO mmioinfoOut; - UINT cbActualWrite; - int nError; - - if ((nError = WaveCreateFile(pszFileName, &hmmioOut, pwfxDest, &ckOut, &ckOutRIFF)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveStartDataWrite(&hmmioOut, &ckOut, &mmioinfoOut)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveWriteFile(hmmioOut, cbSize, pbData, &ckOut, &cbActualWrite, &mmioinfoOut)) != 0) - { - goto ERROR_SAVING; - } - - if ((nError = WaveCloseWriteFile(&hmmioOut, &ckOut, &ckOutRIFF, &mmioinfoOut, cSamples)) != 0) - { - goto ERROR_SAVING; - } - -ERROR_SAVING: - - return(nError); - -} diff --git a/sdk/samples/dsstream/icon2.ico b/sdk/samples/dsstream/icon2.ico deleted file mode 100644 index c564383..0000000 Binary files a/sdk/samples/dsstream/icon2.ico and /dev/null differ diff --git a/sdk/samples/dsstream/icon3.ico b/sdk/samples/dsstream/icon3.ico deleted file mode 100644 index 3bd250c..0000000 Binary files a/sdk/samples/dsstream/icon3.ico and /dev/null differ diff --git a/sdk/samples/dsstream/makefile b/sdk/samples/dsstream/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/dsstream/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/dsstream/msvc.mk b/sdk/samples/dsstream/msvc.mk deleted file mode 100644 index a8d8598..0000000 --- a/sdk/samples/dsstream/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = dsstream -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib dsound.lib comdlg32.lib gdi32.lib \ - winmm.lib comctl32.lib libc.lib advapi32.lib - -OBJS = dsstream.obj dstrtime.obj dstrwave.obj wassert.obj debug.obj dstrenum.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/dsstream/readme.txt b/sdk/samples/dsstream/readme.txt deleted file mode 100644 index c52f49f..0000000 --- a/sdk/samples/dsstream/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -DirectSound Streaming Test (dsstream) -------------------------------------- - -This sample illustrates how to play a long sound using a streaming -DirectSoundBuffer. Because of this design, it may not work correctly when -using very short sounds, like only 1 or 2 seconds long. Those files are -more appropriate for static buffers; see DirectSound Mixing Test (dsshow) -for examples of how to code such buffers. - -Open a .wav files using the File.Open dialog. The UI of the sample only -allows you to open one file at a time; however, this is a limitation of the -sample, not a limitation of DirectSound. - -There are buttons to Play and Stop the file, and a checkbox to indicate -whether the file should be looped or not. Regardless of the checkbox, -the DirectSoundBuffer will be played with looping since a streaming buffer -is being used. - -There are sliders to control the sound's frequency, pan, and volume settings. -In addition, there is a slider indicating the progress through the sound -data. - -The last thing to know: you can toggle Options.Enumerate Drivers, which -will show you what objects DirectSoundEnumerate will list for you, and allow -you to select one. This only happens when you start up Dsstream, so to see -the effect, select this menu item, exit Dsstream, and then run Dsstream -again. - diff --git a/sdk/samples/dsstream/resource.h b/sdk/samples/dsstream/resource.h deleted file mode 100644 index 08bc18d..0000000 --- a/sdk/samples/dsstream/resource.h +++ /dev/null @@ -1,82 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by DSStream.rc -// -#define IDR_MAINMENU 101 -#define IDD_ABOUTBOX 102 -#define IDD_DSENUMBOX 103 -#define IDI_ICON1 107 -#define IDI_ICON2 108 -#define IDC_DSENUM_COMBO 1000 -#define IDS_TBTITLE_PAN 8192 -#define IDS_TBTITLE_VOLUME 8193 -#define IDS_TBTITLE_FREQUENCY 8194 -#define IDS_TBTITLE_PROGRESS 8195 -#define IDS_BUTTON_PLAY 8196 -#define IDS_BUTTON_STOP 8197 -#define IDS_CHECK_LOOPED 8198 -#define IDS_APP_TITLE 8208 -#define IDS_APP_CAPTION 8209 -#define IDS_APP_NAME 8210 -#define IDS_OPEN_DLGTITLE 8211 -#define IDS_OPEN_FILTER1 8212 -#define IDS_OPEN_FILTER2 8213 -#define IDS_OPEN_FILTER3 8214 -#define IDS_OPEN_FILTER4 8215 -#define IDS_ENUMWARNING 8216 -#define IDS_ERROR_APPINIT 8224 -#define IDS_ERROR_INSTANCEINIT 8225 -#define IDS_ERROR_REGISTERCLASS 8226 -#define IDS_ERROR_MAINWNDCREATE 8227 -#define IDS_ERROR_DSCREATE 8229 -#define IDS_ERROR_WAVEFILEOPEN 8230 -#define IDS_ERROR_WAVENOTPCM 8231 -#define IDS_ERROR_WAVESEEKFAILED 8232 -#define IDS_ERROR_DSBCREATE 8233 -#define IDS_ERROR_PAN 8234 -#define IDS_ERROR_VOL 8236 -#define IDS_ERROR_FREQ 8238 -#define IDS_ERROR_DSCOOPERATIVE 8239 -#define IDS_ERROR_PROG 8241 -#define IDS_ERROR_CHILDTEMPLATE 8244 -#define IDS_ERROR_TRACKBAR 8245 -#define IDS_ERROR_BUTTON 8246 -#define IDS_ERROR_STATICTEXT 8247 -#define IDS_ERROR_GETTEXTEXTENT 8248 -#define IDS_ERROR_CHECK 8249 -#define IDS_CDERR_GENERAL_BASE 16384 -#define IDS_CDERR_FINDRESFAILURE 16385 -#define IDS_CDERR_INITIALIZATION 16386 -#define IDS_CDERR_LOADRESFAILURE 16387 -#define IDS_CDERR_LOCKRESFAILURE 16388 -#define IDS_CDERR_LOADSTRFAILURE 16389 -#define IDS_CDERR_MEMALLOCFAILURE 16390 -#define IDS_CDERR_MEMLOCKFAILURE 16391 -#define IDS_CDERR_NOHINSTANCE 16392 -#define IDS_CDERR_NOHOOK 16393 -#define IDS_CDERR_NOTEMPLATE 16394 -#define IDS_CDERR_REGISTERMSGFAIL 16395 -#define IDS_CDERR_STRUCTSIZE 16396 -#define IDS_CDERR_DIALOGFAILURE 16397 -#define IDS_CDERR_TITLESTRING 16398 -#define IDC_LOOPCHECK 40001 -#define IDM_FILE_EXIT 40002 -#define IDM_HELP_ABOUT 40003 -#define IDM_FILE_OPEN 40004 -#define IDM_FILE_CLOSE 40005 -#define IDM_PLAY 40006 -#define IDM_STOP 40007 -#define IDM_OPTIONS_ENUMDRIVERS 40008 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 111 -#define _APS_NEXT_COMMAND_VALUE 40009 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/dsstream/wassert.c b/sdk/samples/dsstream/wassert.c deleted file mode 100644 index 4555900..0000000 --- a/sdk/samples/dsstream/wassert.c +++ /dev/null @@ -1,45 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wassert.c - * Content: Windows assert handler - * You must externally define hWndMain and szAppName for this - * to work. - * - ***************************************************************************/ - -#define WIN32_LEAN_AND_MEAN -#include - -extern HWND hWndMain; -extern char szAppName[]; - -#include "wassert.h" - - -#ifdef WASSERT -void AssertFail(char szErr[], char szFileName[], int nLine, char szMessage[]) - { - char szT[256]; - - if (szMessage != NULL) - wsprintf(szT, "Assert(%s);\nFile %s, line %d. %s", szErr, szFileName, nLine, szMessage); - else - wsprintf(szT, "Assert(%s);\nFile %s, line %d.", szErr, szFileName, nLine); - switch (MessageBox(hWndMain, szT, szAppName, MB_ABORTRETRYIGNORE | MB_ICONSTOP | MB_APPLMODAL)) - { - case IDABORT: - SendMessage(hWndMain, WM_CLOSE, 0, 0); - case IDRETRY: - _asm int 3; - // Fall Through // - case IDIGNORE: - break; - - } // switch - } // AssertFail - - -#endif // ASSERT - diff --git a/sdk/samples/dsstream/wassert.h b/sdk/samples/dsstream/wassert.h deleted file mode 100644 index 65eb765..0000000 --- a/sdk/samples/dsstream/wassert.h +++ /dev/null @@ -1,36 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wassert.h - * Content: assert header - * - ***************************************************************************/ -#ifndef __WASSERT_INCLUDED__ -#define __WASSERT_INCLUDED__ - -#ifdef DEBUG -#define WASSERT // Enable the Assert() macro -#endif - -#ifdef WASSERT - -#ifdef _cplusplus -extern "C" { -#endif - -void AssertFail(char [], char [], int, char[]); -#define Assert(f) ((f) ? (void)NULL : (void)AssertFail(#f, __FILE__, __LINE__,NULL)) -#define AssertMessage(f, szMessage) ((f) ? (void)NULL : (void)AssertFail(#f, __FILE__, __LINE__, szMessage)) - -#else -#define Assert(f) (void)NULL // Macro that does nothing -#define AssertMessage(f, szMessage) (void)NULL - -#ifdef _cplusplus -}; -#endif - -#endif // ~ASSERT - -#endif diff --git a/sdk/samples/duel/bfire.wav b/sdk/samples/duel/bfire.wav deleted file mode 100644 index 7587a0d..0000000 Binary files a/sdk/samples/duel/bfire.wav and /dev/null differ diff --git a/sdk/samples/duel/comm.c b/sdk/samples/duel/comm.c deleted file mode 100644 index cbcc842..0000000 --- a/sdk/samples/duel/comm.c +++ /dev/null @@ -1,352 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: comm.c - * Content: DirectPlay related code - * - * - ***************************************************************************/ -#include "comm.h" -#include "lobby.h" - -/* - * Externals - */ -extern LPGUID glpGuid; // duel's guid -extern LPDPLCONNECTION glpdplConnection; // connection settings - -/* - * Globals - */ -LPDPSESSIONDESC2 glpdpSD; // current session description -LPDIRECTPLAY2 glpDP=NULL; // directplay object pointer - -/* - * DPlayClose - * - * Wrapper for DirectPlay Close API - */ -HRESULT DPlayClose(void) -{ - HRESULT hr=E_FAIL; - - if (glpDP) - hr = IDirectPlay2_Close(glpDP); - - return hr; -} - -/* - * DPlayCreate - * - * Wrapper for DirectPlay Create API. Retrieves a DirectPlay2/DirectPlay2A interface - * based on the UNICODE flag - * - */ -HRESULT DPlayCreate(LPGUID lpGuid) -{ - HRESULT hr=E_FAIL; - LPDIRECTPLAY lpDP=NULL; - - // create a DirectPlay1 interface - if ((hr = DirectPlayCreate(lpGuid, &lpDP, NULL)) == DP_OK) - { - if (lpDP) - { - // query for a DirectPlay2(A) interface -#ifdef UNICODE - hr = IDirectPlay_QueryInterface(lpDP,&IID_IDirectPlay2,(LPVOID *)&glpDP); -#else - hr = IDirectPlay_QueryInterface(lpDP,&IID_IDirectPlay2A,(LPVOID *)&glpDP); -#endif - // no longer need the DirectPlay1 interface - IDirectPlay_Release(lpDP); - } - } - - return hr; -} - -/* - * DPlayCreatePlayer - * - * Wrapper for DirectPlay CreatePlayer API. - */ - -HRESULT DPlayCreatePlayer(LPDPID lppidID, LPTSTR lptszPlayerName, HANDLE hEvent, - LPVOID lpData, DWORD dwDataSize) -{ - HRESULT hr=E_FAIL; - DPNAME name; - - ZeroMemory(&name,sizeof(name)); - name.dwSize = sizeof(DPNAME); - -#ifdef UNICODE - name.lpszShortName = lptszPlayerName; -#else - name.lpszShortNameA = lptszPlayerName; -#endif - - if (glpDP) - hr = IDirectPlay2_CreatePlayer(glpDP, lppidID, &name, hEvent, lpData, - dwDataSize, 0); - - return hr; -} - -/* - * DPlayCreateSession - * - * Wrapper for DirectPlay CreateSession API.Uses the global application guid (glpGuid). - */ -HRESULT DPlayCreateSession(LPTSTR lptszSessionName) -{ - HRESULT hr = E_FAIL; - DPSESSIONDESC2 dpDesc; - - ZeroMemory(&dpDesc, sizeof(dpDesc)); - dpDesc.dwSize = sizeof(dpDesc); - dpDesc.dwFlags = DPSESSION_MIGRATEHOST | DPSESSION_KEEPALIVE; - -#ifdef UNICODE - dpDesc.lpszSessionName = lptszSessionName; -#else - dpDesc.lpszSessionNameA = lptszSessionName; -#endif - - // set the application guid - if (glpGuid) - dpDesc.guidApplication = *glpGuid; - - if (glpDP) - hr = IDirectPlay2_Open(glpDP, &dpDesc, DPOPEN_CREATE); - - return hr; -} - -/* - * DPlayDestroyPlayer - * - * Wrapper for DirectPlay DestroyPlayer API. - */ -HRESULT DPlayDestroyPlayer(DPID pid) -{ - HRESULT hr=E_FAIL; - - if (glpDP) - hr = IDirectPlay2_DestroyPlayer(glpDP, pid); - - return hr; -} - -/* - * DPlayEnumPlayers - * - * Wrapper for DirectPlay API EnumPlayers - */ -HRESULT DPlayEnumPlayers(LPGUID lpSessionGuid, LPDPENUMPLAYERSCALLBACK2 lpEnumCallback, - LPVOID lpContext, DWORD dwFlags) -{ - HRESULT hr=E_FAIL; - - if (glpDP) - hr = IDirectPlay2_EnumPlayers(glpDP, lpSessionGuid, lpEnumCallback, lpContext, dwFlags); - - return hr; -} - -/* - * DPlayEnumSessions - * - * Wrapper for DirectPlay EnumSessions API. - */ -HRESULT DPlayEnumSessions(DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumCallback, - LPVOID lpContext, DWORD dwFlags) -{ - HRESULT hr = E_FAIL; - DPSESSIONDESC2 dpDesc; - - ZeroMemory(&dpDesc, sizeof(dpDesc)); - dpDesc.dwSize = sizeof(dpDesc); - if (glpGuid) - dpDesc.guidApplication = *glpGuid; - - if (glpDP) - hr = IDirectPlay2_EnumSessions(glpDP, &dpDesc, dwTimeout, lpEnumCallback, - lpContext, dwFlags); - - - return hr; -} - -/* - * DPlayGetPlayerData - * - * Wrapper for DirectPlay GetPlayerData API. - */ -HRESULT DPlayGetPlayerData(DPID pid, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags) -{ - HRESULT hr=E_FAIL; - - if (glpDP) - hr = IDirectPlay2_GetPlayerData(glpDP, pid, lpData, lpdwDataSize, dwFlags); - - return hr; -} - -/* - * DPlayGetSessionDesc - * - * Wrapper for DirectPlay GetSessionDesc API. - */ -HRESULT DPlayGetSessionDesc(void) -{ - HRESULT hr=E_FAIL; - DWORD dwSize; - - // free old session desc, if any - if (glpdpSD) - { - free(glpdpSD); - glpdpSD = NULL; - } - - if (glpDP) - { - // first get the size for the session desc - if ((hr = IDirectPlay2_GetSessionDesc(glpDP, NULL, &dwSize)) == DPERR_BUFFERTOOSMALL) - { - // allocate memory for it - glpdpSD = (LPDPSESSIONDESC2) malloc(dwSize); - if (glpdpSD) - { - // now get the session desc - hr = IDirectPlay2_GetSessionDesc(glpDP, glpdpSD, &dwSize); - } - else - { - hr = E_OUTOFMEMORY; - } - } - } - - return hr; -} - -/* - * IsDPlay - * - * Returns TRUE if a DirectPlay interface exists, otherwise FALSE. - */ -BOOL IsDPlay(void) -{ - return (glpDP ? TRUE:FALSE); -} - -/* - * DPlayOpenSession - * - * Wrapper for DirectPlay OpenSession API. - */ -HRESULT DPlayOpenSession(LPGUID lpSessionGuid) -{ - HRESULT hr = E_FAIL; - DPSESSIONDESC2 dpDesc; - - ZeroMemory(&dpDesc, sizeof(dpDesc)); - dpDesc.dwSize = sizeof(dpDesc); - - // set the session guid - if (lpSessionGuid) - dpDesc.guidInstance = *lpSessionGuid; - // set the application guid - if (glpGuid) - dpDesc.guidApplication = *glpGuid; - - // open it - if (glpDP) - hr = IDirectPlay2_Open(glpDP, &dpDesc, DPOPEN_JOIN); - - return hr; -} - - -/* - * DPlayReceive - * - * Wrapper for DirectPlay Receive API - */ -HRESULT DPlayReceive(LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize) -{ - HRESULT hr = E_FAIL; - - if (glpDP) - hr = IDirectPlay2_Receive(glpDP, lpidFrom, lpidTo, dwFlags, lpData, lpdwDataSize); - - return hr; -} - -/* - * DPlayRelease - * - * Wrapper for DirectPlay Release API. - */ -HRESULT DPlayRelease(void) -{ - HRESULT hr = E_FAIL; - - if (glpDP) - { - // free session desc, if any - if (glpdpSD) - { - free(glpdpSD); - glpdpSD = NULL; - } - - // free connection settings structure, if any (lobby stuff) - if (glpdplConnection) - { - free(glpdplConnection); - glpdplConnection = NULL; - } - // release dplay - hr = IDirectPlay2_Release(glpDP); - glpDP = NULL; - } - - return hr; -} - -/* - * DPlaySend - * - * Wrapper for DirectPlay Send API. - */ -HRESULT DPlaySend(DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize) -{ - HRESULT hr = E_FAIL; - - if (glpDP) - hr = IDirectPlay2_Send(glpDP, idFrom, idTo, dwFlags, lpData, dwDataSize); - - return hr; -} - -/* - * DPlaySetPlayerData - * - * Wrapper for DirectPlay SetPlayerData API - */ -HRESULT DPlaySetPlayerData(DPID pid, LPVOID lpData, DWORD dwSize, DWORD dwFlags) -{ - HRESULT hr=E_FAIL; - - if (glpDP) - hr = IDirectPlay2_SetPlayerData(glpDP, pid, lpData, dwSize, dwFlags); - - return hr; -} - diff --git a/sdk/samples/duel/comm.h b/sdk/samples/duel/comm.h deleted file mode 100644 index f743a1b..0000000 --- a/sdk/samples/duel/comm.h +++ /dev/null @@ -1,40 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: comm.h - * Content: communication routines include file - * - * - ***************************************************************************/ -#define IDIRECTPLAY2_OR_GREATER -#include -#include "duel.h" - -/* - * Prototypes - */ -HRESULT DPlayClose(void); -HRESULT DPlayCreate(LPGUID lpGuid); -HRESULT DPlayCreatePlayer(LPDPID lppidID, LPTSTR lpPlayerName, HANDLE hEvent, - LPVOID lpData, DWORD dwDataSize); -HRESULT DPlayCreateSession(LPTSTR lptszSessionName); -HRESULT DPlayDestroyPlayer(DPID pid); -HRESULT DPlayEnumPlayers(LPGUID lpSessionGuid, LPDPENUMPLAYERSCALLBACK2 lpEnumCallback, - LPVOID lpContext, DWORD dwFlags); -HRESULT DPlayEnumSessions(DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumCallback, - LPVOID lpContext, DWORD dwFlags); -HRESULT DPlayGetPlayerData(DPID pid, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags); -HRESULT DPlayGetSessionDesc(void); -BOOL IsDPlay(void); -HRESULT DPlayOpenSession(LPGUID lpSessionGuid); -HRESULT DPlayReceive(LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, - LPDWORD lpdwDataSize); -HRESULT DPlayRelease(void); -HRESULT DPlaySend(DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, - DWORD dwDataSize); -HRESULT DPlaySetPlayerData(DPID pid, LPVOID lpData, DWORD dwSize, DWORD dwFlags); - - - - diff --git a/sdk/samples/duel/csession.bmp b/sdk/samples/duel/csession.bmp deleted file mode 100644 index aff7ee5..0000000 Binary files a/sdk/samples/duel/csession.bmp and /dev/null differ diff --git a/sdk/samples/duel/ddutil.cpp b/sdk/samples/duel/ddutil.cpp deleted file mode 100644 index 1c97095..0000000 --- a/sdk/samples/duel/ddutil.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddutil.cpp - * Content: Routines for loading bitmap and palettes from resources - * - ***************************************************************************/ -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "ddutil.h" - -/* - * DDLoadBitmap - * - * create a DirectDrawSurface from a bitmap resource. - * - */ -extern "C" IDirectDrawSurface * DDLoadBitmap(IDirectDraw *pdd, LPCTSTR tszBitmap, int dx, int dy) -{ - HBITMAP hbm; - BITMAP bm; - DDSURFACEDESC ddsd; - IDirectDrawSurface *pdds; - - // - // try to load the bitmap as a resource, if that fails, try it as a file - // - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), tszBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); - - if (hbm == NULL) - hbm = (HBITMAP)LoadImage(NULL, tszBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION); - - if (hbm == NULL) - return NULL; - - // - // get size of the bitmap - // - GetObject(hbm, sizeof(bm), &bm); // get size of bitmap - - // - // create a DirectDrawSurface for this bitmap - // - ZeroMemory(&ddsd, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwWidth = bm.bmWidth; - ddsd.dwHeight = bm.bmHeight; - - if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK) - return NULL; - - DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); - - DeleteObject(hbm); - - return pdds; -} - -/* - * DDReLoadBitmap - * - * load a bitmap from a file or resource into a directdraw surface. - * normaly used to re-load a surface after a restore. - * - */ -HRESULT DDReLoadBitmap(IDirectDrawSurface *pdds, LPCTSTR tszBitmap) -{ - HBITMAP hbm; - HRESULT hr; - - // - // try to load the bitmap as a resource, if that fails, try it as a file - // - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), tszBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - - if (hbm == NULL) - hbm = (HBITMAP)LoadImage(NULL, tszBitmap, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); - - if (hbm == NULL) - { - OutputDebugString(TEXT("handle is null\n")); - return E_FAIL; - } - - hr = DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); - if (hr != DD_OK) - { - OutputDebugString(TEXT("ddcopybitmap failed\n")); - } - - - DeleteObject(hbm); - return hr; -} - -/* - * DDCopyBitmap - * - * draw a bitmap into a DirectDrawSurface - * - */ -extern "C" HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP hbm, int x, int y, int dx, int dy) -{ - HDC hdcImage; - HDC hdc; - BITMAP bm; - DDSURFACEDESC ddsd; - HRESULT hr; - - if (hbm == NULL || pdds == NULL) - return E_FAIL; - - // - // make sure this surface is restored. - // - pdds->Restore(); - - // - // select bitmap into a memoryDC so we can use it. - // - hdcImage = CreateCompatibleDC(NULL); - if (!hdcImage) - OutputDebugString(TEXT("createcompatible dc failed\n")); - SelectObject(hdcImage, hbm); - - // - // get size of the bitmap - // - GetObject(hbm, sizeof(bm), &bm); // get size of bitmap - dx = dx == 0 ? bm.bmWidth : dx; // use the passed size, unless zero - dy = dy == 0 ? bm.bmHeight : dy; - - // - // get size of surface. - // - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; - pdds->GetSurfaceDesc(&ddsd); - - if ((hr = pdds->GetDC(&hdc)) == DD_OK) - { - StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY); - pdds->ReleaseDC(hdc); - } - - DeleteDC(hdcImage); - - return hr; -} - -// -// DDLoadPalette -// -// Create a DirectDraw palette object from a bitmap resoure -// -// if the resource does not exist or NULL is passed create a -// default 332 palette. -// -extern "C" IDirectDrawPalette * DDLoadPalette(IDirectDraw *pdd, LPCTSTR tszBitmap) -{ - IDirectDrawPalette* ddpal; - int i; - int n; - HANDLE fh; - HRSRC h; - LPBITMAPINFOHEADER lpbi; - PALETTEENTRY ape[256]; - RGBQUAD * prgb; - DWORD dwRead; - - // - // build a 332 palette as the default. - // - for (i=0; i<256; i++) - { - ape[i].peRed = (BYTE)(((i >> 5) & 0x07) * 255 / 7); - ape[i].peGreen = (BYTE)(((i >> 2) & 0x07) * 255 / 7); - ape[i].peBlue = (BYTE)(((i >> 0) & 0x03) * 255 / 3); - ape[i].peFlags = (BYTE)0; - } - - // - // get a pointer to the bitmap resource. - // - if (tszBitmap && (h = FindResource(NULL, tszBitmap, RT_BITMAP))) - { - lpbi = (LPBITMAPINFOHEADER)LockResource(LoadResource(NULL, h)); - if (!lpbi) - OutputDebugString(TEXT("lock resource failed\n")); - prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->biSize); - - if (lpbi == NULL || lpbi->biSize < sizeof(BITMAPINFOHEADER)) - n = 0; - else if (lpbi->biBitCount > 8) - n = 0; - else if (lpbi->biClrUsed == 0) - n = 1 << lpbi->biBitCount; - else - n = lpbi->biClrUsed; - - // - // a DIB color table has its colors stored BGR not RGB - // so flip them around. - // - for(i=0; i 8) - n = 0; - else if (bi.biClrUsed == 0) - n = 1 << bi.biBitCount; - else - n = bi.biClrUsed; - - // - // a DIB color table has its colors stored BGR not RGB - // so flip them around. - // - for(i=0; iCreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL); - - return ddpal; -} - -/* - * DDColorMatch - * - * convert a RGB color to a pysical color. - * - * we do this by leting GDI SetPixel() do the color matching - * then we lock the memory and see what it got mapped to. - */ -extern "C" DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb) -{ - COLORREF rgbT; - HDC hdc; - DWORD dw = CLR_INVALID; - DDSURFACEDESC ddsd; - HRESULT hres; - - // - // use GDI SetPixel to color match for us - // - if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK) - { - rgbT = GetPixel(hdc, 0, 0); // save current pixel value - SetPixel(hdc, 0, 0, rgb); // set our value - pdds->ReleaseDC(hdc); - } - - // - // now lock the surface so we can read back the converted color - // - ddsd.dwSize = sizeof(ddsd); - while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING) - ; - - if (hres == DD_OK) - { - dw = *(DWORD *)ddsd.lpSurface; // get DWORD - dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1; // mask it to bpp - pdds->Unlock(NULL); - } - - // - // now put the color that was there back. - // - if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK) - { - SetPixel(hdc, 0, 0, rgbT); - pdds->ReleaseDC(hdc); - } - - return dw; -} - -/* - * DDSetColorKey - * - * set a color key for a surface, given a RGB. - * if you pass CLR_INVALID as the color key, the pixel - * in the upper-left corner will be used. - */ -extern "C" HRESULT DDSetColorKey(IDirectDrawSurface *pdds, COLORREF rgb) -{ - DDCOLORKEY ddck; - - ddck.dwColorSpaceLowValue = DDColorMatch(pdds, rgb); - ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue; - return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck); -} diff --git a/sdk/samples/duel/ddutil.h b/sdk/samples/duel/ddutil.h deleted file mode 100644 index 05adb46..0000000 --- a/sdk/samples/duel/ddutil.h +++ /dev/null @@ -1,25 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: ddutil.cpp - * Content: Routines for loading bitmap and palettes from resources - * - ***************************************************************************/ - -#include - -#ifdef __cplusplus -extern "C" { /* Assume C declarations for C++ */ -#endif /* __cplusplus */ - -extern IDirectDrawPalette * DDLoadPalette(IDirectDraw *pdd, LPCTSTR szBitmap); -extern IDirectDrawSurface * DDLoadBitmap(IDirectDraw *pdd, LPCTSTR szBitmap, int dx, int dy); -extern HRESULT DDReLoadBitmap(IDirectDrawSurface *pdds, LPCTSTR szBitmap); -extern HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP hbm, int x, int y, int dx, int dy); -extern DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb); -extern HRESULT DDSetColorKey(IDirectDrawSurface *pdds, COLORREF rgb); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ diff --git a/sdk/samples/duel/ds3dutil.c b/sdk/samples/duel/ds3dutil.c deleted file mode 100644 index d1cde3e..0000000 --- a/sdk/samples/duel/ds3dutil.c +++ /dev/null @@ -1,337 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: ds3dutil.c - * Content: Routines for dealing with sounds from resources - * The last 3 functions (the wave file parsing code) - * are copied from dsutil.cpp - * - * - ***************************************************************************/ -#include -#include -#include "ds3dutil.h" -//*************************** FUNCTION PROTOTYPES **************************/ -BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, - BYTE **ppbWaveData,DWORD *pcbWaveSize); -BOOL DSGetWaveResource ( HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, - DWORD *pcbWaveSize); -BOOL DSFillSoundBuffer( IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize); -BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName); - -//*************************** GLOBAL VARIABLES **************************/ - -_TCHAR gszWaveString[5] = _T("WAVE"); - -/***************************************************************************** -FUNCTION: WaveInit - -PURPOSE: Loads a WAVEDATA struct with the named WAVE resource. - -PARAMETERS: -lplpWD A pointer to a WAVEDATA struct. - -lpDS: A pointer to an IDirectSound object. This object must be, - initialized BEFORE being passed to this function, and MUST have been - initialized with the DSBCAPS_CTRL3D flag. - -lpName: A string that contains the name of the .WAV resource. -*****************************************************************************/ -BOOL WaveInit(LPWAVEDATA *lplpWD, LPDIRECTSOUND lpDS, LPCTSTR lpName) -{ -DSBUFFERDESC dsBD = {0}; -BYTE *pbWaveData=NULL; -LPWAVEDATA lpWD; - -lpWD = (*lplpWD) = (LPWAVEDATA)malloc(sizeof(WAVEDATA)); -lpWD->lpDirectSoundBuffer = NULL; -lpWD->lpName = NULL; -lpWD->lpDS = NULL; - -#ifndef UNICODE - lpWD->lpName = (LPTSTR)malloc(strlen(lpName) + 1); -#else - lpWD->lpName = (LPTSTR)malloc(2*(wcslen(lpName) + 1)); -#endif - if (lpWD->lpName != NULL) - { - _tcscpy(lpWD->lpName, lpName); - - if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) - { - dsBD.dwSize = sizeof(DSBUFFERDESC); - dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D; - if (DS_OK == IDirectSound_CreateSoundBuffer(lpDS, &dsBD, &lpWD->lpDirectSoundBuffer, NULL)) - { - if (DSFillSoundBuffer(lpWD->lpDirectSoundBuffer, pbWaveData, dsBD.dwBufferBytes)) - { - lpWD->lpDS = lpDS; //also copy the DirectSoundObject - return(TRUE); - } - IDirectSoundBuffer_Release(lpWD->lpDirectSoundBuffer); - lpWD->lpDirectSoundBuffer = NULL; - } - } - free(lpWD->lpName); - lpWD->lpName = NULL; - } - free(*lplpWD); - *lplpWD = NULL; - return(FALSE); -}; - - -/***************************************************************************** -FUNCTION: WaveGetBuffers - -PARAMS: lplpWD A pointer to a WAVEDATA struct. - - lplpDirectSoundBuffer: - The address of a pointer to a DirectSoundBuffer Interface. - lplpDirectSound3DBuffer: - The address of a pointer to a DirectSound3DBuffer Interface. - - Both of these must be Release()'d after their use. - -PURPOSE: Gives the caller back two interface pointers: one to a regular - DirectSoundBuffer interface and one to a 3D buffer interface. These - MUST be Released() by the caller. - -RETURNS: Should always return TRUE, unless something really catastrophic has happened. - -NOTES: BOTH of these Interfaces MUST be ->Release()'d when the object - or whatever is done using them. Otherwise the buffer they point - to will just hang around and waste memory. This wastes processing time, - since each buffer is checked by the mixer quite frequently to see if it - is playing. - - Defaults: Both Position and Velocity vectors are set to (0,0,0). - -**************************************************************************************/ -BOOL WaveGetBuffers (LPWAVEDATA lpWD, - LPDIRECTSOUNDBUFFER *lplpDirectSoundBuffer, - LPDIRECTSOUND3DBUFFER *lplpDirectSound3DBuffer) -{ - if (DS_OK==IDirectSound_DuplicateSoundBuffer(lpWD->lpDS, lpWD->lpDirectSoundBuffer, lplpDirectSoundBuffer)) - { - if (DS_OK==IDirectSoundBuffer_QueryInterface(*lplpDirectSoundBuffer, &IID_IDirectSound3DBuffer, (void **)lplpDirectSound3DBuffer)) - { - return TRUE; - } - IDirectSoundBuffer_Release(*lplpDirectSoundBuffer); - *lplpDirectSoundBuffer=NULL; - *lplpDirectSound3DBuffer = NULL; - } - return FALSE; -}; - - - -/***************************************************************************** -FUNCTION: WaveFree - -PURPOSE: When this is called, we HOPE that all the buffers - (both the normal and the 3D ones) duplicated from "lpDirectSoundBuffer" - in the function WaveGetBuffers() have been ->Release()'d. This frees - up the original buffer (lpDirectSoundBuffer) that all the other buffers - have been duplicated from. -*****************************************************************************/ -void WaveFree(LPWAVEDATA lpWD) -{ -if (lpWD!=NULL) - { - if (lpWD->lpDirectSoundBuffer != NULL) - IDirectSoundBuffer_Release(lpWD->lpDirectSoundBuffer); - if (lpWD->lpName != NULL) - free(lpWD->lpName); - free(lpWD); - } -}; - -/***************************************************************************** -FUNCTION: WaveReload - -PURPOSE: This reloads the wave's sound effect. -*****************************************************************************/ -BOOL WaveReload(LPWAVEDATA lpWD) -{ -return DSReloadSoundBuffer(lpWD->lpDirectSoundBuffer, lpWD->lpName); -}; - - - -/***************************************************************************** -FUNCTION: DSGetWaveResource - -PURPOSE: Sets the following: - a. A pointer to a WAV file header structure - b. A pointer to the WAV file data. - c. A DWORD which is the length of the data (in bytes, not samples) -*****************************************************************************/ -BOOL DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, - DWORD *pcbWaveSize) -{ - HRSRC hResInfo; - HGLOBAL hResData; - void *pvRes; - - - if (((hResInfo = FindResource(hModule, lpName, gszWaveString)) != NULL) && - ((hResData = LoadResource(hModule, hResInfo)) != NULL) && - ((pvRes = LockResource(hResData)) != NULL) && - DSParseWaveResource(pvRes, ppWaveHeader, ppbWaveData, pcbWaveSize)) - { - return TRUE; - } - return FALSE; -} - - - - -/***************************************************************************** -FUNCTION: DSParseWaveResource - -PURPOSE: This does the real meat of the file parsing, and is called by - DSGetWaveResource -*****************************************************************************/ -BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, - BYTE **ppbWaveData,DWORD *pcbWaveSize) -{ - DWORD *pdw; - DWORD *pdwEnd; - DWORD dwRiff; - DWORD dwType; - DWORD dwLength; - - if (ppWaveHeader) - *ppWaveHeader = NULL; - - if (ppbWaveData) - *ppbWaveData = NULL; - - if (pcbWaveSize) - *pcbWaveSize = 0; - - pdw = (DWORD *)pvRes; - dwRiff = *pdw++; - dwLength = *pdw++; - dwType = *pdw++; - - if (dwRiff != mmioFOURCC('R', 'I', 'F', 'F')) - goto exit; // not even RIFF - - if (dwType != mmioFOURCC('W', 'A', 'V', 'E')) - goto exit; // not a WAV - - pdwEnd = (DWORD *)((BYTE *)pdw + dwLength-4); - - while (pdw < pdwEnd) - { - dwType = *pdw++; - dwLength = *pdw++; - - switch (dwType) - { - case mmioFOURCC('f', 'm', 't', ' '): - if (ppWaveHeader && !*ppWaveHeader) - { - if (dwLength < sizeof(WAVEFORMAT)) - goto exit; // not a WAV - - *ppWaveHeader = (WAVEFORMATEX *)pdw; - - if ((!ppbWaveData || *ppbWaveData) && - (!pcbWaveSize || *pcbWaveSize)) - { - return TRUE; - } - } - break; - - case mmioFOURCC('d', 'a', 't', 'a'): - if ((ppbWaveData && !*ppbWaveData) || - (pcbWaveSize && !*pcbWaveSize)) - { - if (ppbWaveData) - *ppbWaveData = (LPBYTE)pdw; - - if (pcbWaveSize) - *pcbWaveSize = dwLength; - - if (!ppWaveHeader || *ppWaveHeader) - return TRUE; - } - break; - } - - pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1)); - } - -exit: - return FALSE; -} - - - -/***************************************************************************** -FUNCTION: DSFillSoundBuffer - -PURPOSE: Given an already-initialized DirectSoundBuffer, and pointer to - some sound data, and the sound data's size, this writes the data - to the DirectSoundBuffer. -*****************************************************************************/ -BOOL DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize) -{ - if (pDSB && pbWaveData && cbWaveSize) - { - LPVOID pMem1, pMem2; - DWORD dwSize1, dwSize2; - - if (SUCCEEDED(IDirectSoundBuffer_Lock(pDSB, 0, cbWaveSize, - &pMem1, &dwSize1, &pMem2, &dwSize2, 0))) - { - ZeroMemory(pMem1, dwSize1); - CopyMemory(pMem1, pbWaveData, dwSize1); - - if ( 0 != dwSize2 ) - CopyMemory(pMem2, pbWaveData+dwSize1, dwSize2); - - IDirectSoundBuffer_Unlock(pDSB, pMem1, dwSize1, pMem2, dwSize2); - return TRUE; - } - } - return FALSE; -} - - -/***************************************************************************** -FUNCTION: DSReloadSoundBuffer - -PURPOSE: If an application with WRITE_PRIMARY takes the focus from our - humble window, then our secondary sound buffers become "lost" and - we must call restore and re-fill them. -*****************************************************************************/ -BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName) -{ - BOOL result=FALSE; - BYTE *pbWaveData; - DWORD cbWaveSize; - - if (DSGetWaveResource(NULL, lpName, NULL, &pbWaveData, &cbWaveSize)) - { - if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB))) - { - if (DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) - { - result = TRUE; - } - } - - } - - return result; -} diff --git a/sdk/samples/duel/ds3dutil.h b/sdk/samples/duel/ds3dutil.h deleted file mode 100644 index 62d4346..0000000 --- a/sdk/samples/duel/ds3dutil.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef DS3DUTIL_HEADER -#define DS3DUTIL_HEADER - -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: ds3dutil.h - * Content: Header file prototyping routines for dealing with - * sounds from resources. Much of this stuff - * (especially the wave file parsing code) is copied - * from dsutil.cpp - * - * - ***************************************************************************/ -#include - -typedef struct -{ -LPDIRECTSOUNDBUFFER lpDirectSoundBuffer; -LPTSTR lpName; -LPDIRECTSOUND lpDS; -} -WAVEDATA, *LPWAVEDATA; - - -BOOL WaveInit(LPWAVEDATA *lplpWD, LPDIRECTSOUND lpDS, LPCTSTR lpName); -BOOL WaveGetBuffers (LPWAVEDATA lpWD, LPDIRECTSOUNDBUFFER *ppDirectSoundBuffer, - LPDIRECTSOUND3DBUFFER *ppDirectSound3DBuffer); -void WaveFree(LPWAVEDATA lpWD); -BOOL WaveReload(LPWAVEDATA lpWD); - - -#endif - diff --git a/sdk/samples/duel/duel.bmp b/sdk/samples/duel/duel.bmp deleted file mode 100644 index a603f34..0000000 Binary files a/sdk/samples/duel/duel.bmp and /dev/null differ diff --git a/sdk/samples/duel/duel.c b/sdk/samples/duel/duel.c deleted file mode 100644 index 602d253..0000000 --- a/sdk/samples/duel/duel.c +++ /dev/null @@ -1,620 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: duel.c - * Content: Multi-player duel - * - * - ***************************************************************************/ -#define INITGUID -#include "duel.h" -#include "gameproc.h" -#include "gfx.h" -#include "comm.h" -#include "input.h" -#include "lobby.h" -#include "wizard.h" -#include "util.h" -#include "sfx.h" - -// {33925241-05F8-11d0-8063-00A0C90AE891} -DEFINE_GUID(DUEL_GUID, -0x33925241, 0x5f8, 0x11d0, 0x80, 0x63, 0x0, 0xa0, 0xc9, 0xa, 0xe8, 0x91); - -/* - * Externals - */ -extern DWORD gdwFrameCount; -extern DWORD gdwFrameTime; -extern int gnProgramState; -extern SHIP gOurShip; -extern LPDPLCONNECTION glpdplConnection; -extern DPID gOurID; -extern BOOL gbNoField; - - -/* - * Globals - */ -LPGUID glpGuid; // Duel's GUID -HWND ghWndMain; // Main application window handle -HINSTANCE ghinst; // Application instance handle -BOOL gbShowFrameCount=TRUE; // Show FPS ? -BOOL gbIsActive; // Is the application active ? -BOOL gbUseEmulation; // DDHEL or DDHAL for Graphics -BOOL gbIsHost; // Are we hosting or joining a game -DWORD gdwKeys; // User keyboard input -DWORD gdwOldKeys; // Last frame's keyboard input -BOOL gbFullscreen=FALSE; // Window or FullScreen mode ? -RECT grcWindow; // client rectangle of main window -HANDLE ghThread; // handle to wizard thread -TCHAR gtszClassName[MAX_CLASSNAME]; // Duel's class name -BOOL gbReliable; // sends are reliable - -/* - * Statics - */ -static BOOL gbReinitialize; // used for switching display modes - -/* - * WinMain - */ -int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow ) -{ - BOOL bHelp=FALSE; - MSG msg; - - ghinst = hinstance; - - // Parse command line - while( lpCmdLine[0] == '-' ) - { - lpCmdLine++; - - switch (*lpCmdLine++) - { - case 'e': - gbUseEmulation = TRUE; - break; - case 'd': - gbNoField = TRUE; - break; - case '?': - default: - bHelp= TRUE; - gbFullscreen= FALSE; // give help in windowed mode - break; - } - - while( isspace(*lpCmdLine) ) - { - lpCmdLine++; - } - } - - /* - * Give user help if asked for - */ - - if( bHelp ) - { - TCHAR tszHelpMsg[MAX_HELPMSG]; - TCHAR tszTitle[MAX_WINDOWTITLE]; - - LoadString(ghinst, IDS_DUEL_HELP, tszHelpMsg, MAX_HELPMSG); - LoadString(ghinst, IDS_DUEL_TITLE, tszTitle, MAX_WINDOWTITLE); - MessageBox(ghWndMain, tszHelpMsg, tszTitle, MB_OK ); - return TRUE; - } - - - if( !InitApplication(hinstance) ) - { - return FALSE; - } - - // were we launched by a lobby ? - if (LaunchedByLobby()) - { - // start game - PostMessage(ghWndMain, UM_LAUNCH, 0, 0); - gbIsActive = TRUE; - } - - gdwFrameTime = timeGetTime(); - - while( TRUE ) - { - if (gbIsActive) - { - // any windows messages ? (returns immediately) - if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( !GetMessage( &msg, NULL, 0, 0 ) ) - { - return msg.wParam; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else - { - // Poll our receive queue. Polling is used in the sample only for simplicity. - // Receiving messages using an event is the recommended way. - if (gnProgramState != PS_SPLASH) - { - ReceiveMessages(); - } - - // update screen - if (!UpdateFrame()) - { - ExitGame(); - } - } - } - else - { - // any windows messages ? (blocks until a message arrives) - if( !GetMessage( &msg, NULL, 0, 0 ) ) - { - return msg.wParam; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } -} /* WinMain */ - - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -long WINAPI MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - DWORD dwRetCode; - DWORD dwTid; - - switch( message ) - { - case WM_SIZE: - case WM_MOVE: - // get the client rectangle - if (gbFullscreen) - { - SetRect(&grcWindow, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); - } - else - { - GetClientRect(hWnd, &grcWindow); - ClientToScreen(hWnd, (LPPOINT)&grcWindow); - ClientToScreen(hWnd, (LPPOINT)&grcWindow+1); - } - break; - - case WM_ACTIVATE: - // ignore this message during reinitializing graphics - if (gbReinitialize) return 0; - - // When we are deactivated, although we don't update our screen, we still need to - // to empty our receive queue periodically as messages will pile up otherwise. - // Polling the receive queue continuously even when we are deactivated causes our app - // to consume all the CPU time. To avoid hogging the CPU, we block on GetMessage() WIN API - // and setup a timer to wake ourselves up at regular intervals to process our messages. - - if (LOWORD(wParam) == WA_INACTIVE) - { - // deactivated - gbIsActive = FALSE; - if (PS_ACTIVE == gnProgramState) - { - SetTimer(hWnd, RECEIVE_TIMER_ID, RECEIVE_TIMEOUT, NULL); - } - } - else - { - // activated - gbIsActive = TRUE; - if (PS_ACTIVE == gnProgramState) - { - KillTimer(hWnd, RECEIVE_TIMER_ID); - } - } - - // set game palette, if activated in game mode - if (gbIsActive && (gnProgramState != PS_SPLASH)) - SetGamePalette(); - - ReacquireInputDevices(); - - return 0; - - case WM_CREATE: - break; - - case WM_SYSKEYUP: - switch( wParam ) - { - // handle ALT+ENTER (fullscreen/window mode) - case VK_RETURN: - // mode switch is allowed only during the game - if (gnProgramState == PS_ACTIVE) - { - gbReinitialize = TRUE; - ReleaseLocalData(); //only sound buffers have to be rels'd anyway. - CleanupSfx(); - CleanupInput(); - CleanupGraphics(); - DestroyWindow(ghWndMain); - gbFullscreen = !gbFullscreen; - InitGraphics(); - InitInput(); - InitSfx(); - InitLocalSoundData(); - gbReinitialize = FALSE; - } - break; - } - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case 'r': - case 'R': - // toggle reliable status - gbReliable = !gbReliable; - UpdateTitle(); - break; - - case VK_F1: - { - TCHAR tszHelpMsg[MAX_HELPMSG]; - TCHAR tszTitle[MAX_WINDOWTITLE]; - - LoadString(ghinst, IDS_DUEL_HELP, tszHelpMsg, MAX_HELPMSG); - LoadString(ghinst, IDS_DUEL_TITLE, tszTitle, MAX_WINDOWTITLE); - MessageBox(ghWndMain, tszHelpMsg, tszTitle, MB_OK ); - } - break; - - case VK_F5: - gbShowFrameCount = !gbShowFrameCount; - if( gbShowFrameCount ) - { - gdwFrameCount = 0; - gdwFrameTime = timeGetTime(); - } - break; - - case VK_RETURN: - if( (gnProgramState == PS_SPLASH) && !gbFullscreen) - { - // get connection settings from user - ghThread = CreateThread(NULL, 0, (LPVOID)DoWizard, 0, 0, &dwTid); - } - break; - - case VK_ESCAPE: - case VK_F12: - // adios - ExitGame(); - return 0; - } - break; - - case WM_ERASEBKGND: - return 1; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - if (gnProgramState == PS_SPLASH) - { - // display the splash screen - bltSplash(NULL); - } - - EndPaint( hWnd, &ps ); - return 1; - - case UM_LAUNCH: - // cleanup the wizard thread - if (ghThread) - { - // wait for thread to exit - while (!GetExitCodeThread(ghThread, &dwRetCode)); - CloseHandle(ghThread); - } - - // start the game in rest mode - gnProgramState = PS_REST; - LaunchGame(); - return 1; - - case UM_ABORT: - // cleanup the wizard thread - if (ghThread) - { - // wait for thread to exit - while (!GetExitCodeThread(ghThread, &dwRetCode)); - CloseHandle(ghThread); - } - ExitGame(); - return 1; - - case WM_TIMER: - ReceiveMessages(); - break; - - case WM_DESTROY: - // if gbReinitialize is TRUE don't quit, we are just switching display modes - if (!gbReinitialize) - { - CleanupApplication(); - PostQuitMessage( 0 ); - } - return 0; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * InitApplication - * - * Do that initialization stuff... - */ -BOOL InitApplication( HINSTANCE hinst ) -{ - WNDCLASS wc; - BOOL rc; - - glpGuid = (LPGUID) &DUEL_GUID; - - LoadString(ghinst, IDS_DUEL_CLASSNAME, gtszClassName, MAX_CLASSNAME); - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hinst; - wc.hIcon = LoadIcon( hinst, MAKEINTRESOURCE(DUEL_ICON)); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = gtszClassName; - rc = RegisterClass( &wc ); - if( !rc ) - { - return FALSE; - } - - // Initialize all components - if ((!InitGraphics()) || (!InitInput()) || (!InitSfx())) - { - return FALSE; - } - - // start in splash mode - gnProgramState = PS_SPLASH; - - return TRUE; - -} /* initApplication */ - -/* - * CleanupApplication - * - * Calls clean up on all components - */ -void CleanupApplication( void ) -{ - CleanupComm(); - CleanupSfx(); - CleanupGraphics(); - CleanupInput(); -} - -/* - * LaunchedByLobby - * - * Determines if we were launched by a lobby. If so, gets the connection settings - * and creates our player using the information from the lobby - */ -BOOL LaunchedByLobby(void) -{ - HRESULT hr; - HWND hwndStatus; - - // create a lobby object - hr = DPLobbyCreate(); - if (FAILED(hr)) - { - ShowError(IDS_DPLOBBY_ERROR_C); - return FALSE; - } - - // get connection settings from the lobby (into glpdplConnection) - hr = DPLobbyGetConnectionSettings(); - if (FAILED(hr)) - { - if (DPERR_NOTLOBBIED == hr) - { - // we were not lobbied - start up game normally - hr = DPLobbyRelease(); - if (FAILED(hr)) - { - ShowError(IDS_DPLOBBY_ERROR_R); - goto FAIL; - } - // move on - return FALSE; - } - else - { - ShowError(IDS_DPLOBBY_ERROR_GCS); - goto FAIL; - } - } - - // are we hosting or joining ? - if (glpdplConnection->dwFlags & DPLCONNECTION_CREATESESSION) - { - gbIsHost = TRUE; - } - - // set our session flags - glpdplConnection->lpSessionDesc->dwFlags = DPSESSION_MIGRATEHOST | - DPSESSION_KEEPALIVE; - - // let lobby know our connection flags - hr = DPLobbySetConnectionSettings(); - if (FAILED(hr)) - { - ShowError(IDS_DPLOBBY_ERROR_SCS); - goto FAIL; - } - - if ( !gbIsHost ) - { - // show splash screen and - // connection status if we are joining a game - UpdateWindow(ghWndMain); - hwndStatus = ShowConnectStatus(); - } - else - { - // we are hosting, don't need connection status - hwndStatus = NULL; - } - - // connect to the lobby - hr = DPLobbyConnect(); - - if ( hwndStatus ) - { - // get rid of the connectino status window - DestroyWindow(hwndStatus); - } - - if (FAILED(hr)) - { - ShowError(IDS_DPLOBBY_ERROR_CONNECT); - goto FAIL; - } - - // create our player - hr = DPlayCreatePlayer( - &gOurID, -#ifdef UNICODE - glpdplConnection->lpPlayerName->lpszShortName, -#else - glpdplConnection->lpPlayerName->lpszShortNameA, -#endif - NULL, - NULL, - 0 - ); - - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_CP); - goto FAIL; - } - - - // cleanup - hr = DPLobbyRelease(); - if (FAILED(hr)) - { - ShowError(IDS_DPLOBBY_ERROR_R); - goto FAIL; - } - - // we were lobbied - return TRUE; - -FAIL: - // cleanup and exit - DPLobbyRelease(); - ExitGame(); - return FALSE; -} - -/* - * Displays error to the user - */ -BOOL ShowError( int iStrID ) -{ - TCHAR tszMsg[MAX_ERRORMSG]; - TCHAR tszTitle[MAX_WINDOWTITLE]; - - LoadString(ghinst, iStrID, tszMsg, MAX_ERRORMSG); - LoadString(ghinst, IDS_DUEL_ERROR_TITLE, tszTitle, MAX_WINDOWTITLE); - MessageBox( ghWndMain, tszMsg, tszTitle, MB_OK ); - return FALSE; -} - -/* - * Displays connection status to the user - */ -HWND ShowConnectStatus(void) -{ - HWND hwnd; - - hwnd = CreateDialog( ghinst, MAKEINTRESOURCE(IDD_CONNECT_STATUS), ghWndMain, NULL); - - return hwnd; - -} - -/* - * UpdateTitle - * - * Updates the window title based on application status - */ -void UpdateTitle(void) -{ - DWORD dwFeatures; - TCHAR tszTitle[MAX_WINDOWTITLE]; - UINT iStringID; - - // calculate title features - dwFeatures = 0; - if (gbReliable) - dwFeatures |= 1; - if (gbIsHost) - dwFeatures |= 2; - - switch (dwFeatures) - { - case 0: - iStringID = IDS_DUEL_TITLE; - break; - case 1: - iStringID = IDS_DUEL_RELIABLE_TITLE; - break; - case 2: - iStringID = IDS_DUEL_HOST_TITLE; - break; - case 3: - iStringID = IDS_DUEL_HOST_RELIABLE_TITLE; - break; - } - - // get appropriate window title for these features - LoadString(ghinst, iStringID, tszTitle, MAX_WINDOWTITLE); - // change window title - SetWindowText(ghWndMain, tszTitle); -} - - diff --git a/sdk/samples/duel/duel.h b/sdk/samples/duel/duel.h deleted file mode 100644 index 08f6532..0000000 --- a/sdk/samples/duel/duel.h +++ /dev/null @@ -1,82 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: duel.h - * Content: main include file - * - * - ***************************************************************************/ - -#ifndef DUEL_INCLUDED -#define DUEL_INCLUDED - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "resource.h" -#include - -/* - * Application messages - */ - -#define UM_LAUNCH WM_USER -#define UM_ABORT WM_USER+1 -#define UM_RESTARTTIMER WM_USER+2 - -// program states -enum -{ - PS_SPLASH, - PS_ACTIVE, - PS_REST -}; - -#define MAX_SCREEN_X 639 -#define MAX_SCREEN_Y 479 -#define MAX_PLAYERNAME 50 -#define MAX_SESSIONNAME 50 -#define MAX_SPNAME 50 -#define MAX_CLASSNAME 50 -#define MAX_WINDOWTITLE 50 -#define MAX_ERRORMSG 256 -#define MAX_FONTNAME 50 -#define MAX_HELPMSG 512 - -#define RECEIVE_TIMER_ID 1 -#define RECEIVE_TIMEOUT 1000 // in milliseconds - -// default window size -#define MAX_DEFWIN_X 640 -#define MAX_DEFWIN_Y 480 - - -// tree view image info -#define CX_BITMAP 25 -#define CY_BITMAP 25 -#define NUM_BITMAPS 2 - -// registry info -#define DUEL_KEY (TEXT("Software\\Microsoft\\Duel")) - -// macros -#define DEBUG_OUT(s) OutputDebugString(s); - -/* - * fn prototypes - */ - -int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow ); -long WINAPI MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); -BOOL InitApplication(HINSTANCE hinst); -void CleanupApplication(void); -BOOL LaunchedByLobby(void); -BOOL ShowError( int err ); -HWND ShowConnectStatus(void); -void UpdateTitle(void); - -#endif - diff --git a/sdk/samples/duel/duel.ico b/sdk/samples/duel/duel.ico deleted file mode 100644 index 4f91acb..0000000 Binary files a/sdk/samples/duel/duel.ico and /dev/null differ diff --git a/sdk/samples/duel/duel.mak b/sdk/samples/duel/duel.mak deleted file mode 100644 index 0f1f7bd..0000000 --- a/sdk/samples/duel/duel.mak +++ /dev/null @@ -1,474 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -!IF "$(CFG)" == "" -CFG=duel - Win32 Debug -!MESSAGE No configuration specified. Defaulting to duel - Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "duel - Win32 Release" && "$(CFG)" != "duel - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "duel.mak" CFG="duel - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "duel - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "duel - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "duel - Win32 Debug" -CPP=cl.exe -RSC=rc.exe -MTL=mktyplib.exe - -!IF "$(CFG)" == "duel - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -OUTDIR=.\Release -INTDIR=.\Release - -ALL : "$(OUTDIR)\duel.exe" - -CLEAN : - -@erase "$(INTDIR)\comm.obj" - -@erase "$(INTDIR)\ddutil.obj" - -@erase "$(INTDIR)\Ds3dutil.obj" - -@erase "$(INTDIR)\duel.obj" - -@erase "$(INTDIR)\duel.res" - -@erase "$(INTDIR)\gameproc.obj" - -@erase "$(INTDIR)\gfx.obj" - -@erase "$(INTDIR)\input.obj" - -@erase "$(INTDIR)\lobby.obj" - -@erase "$(INTDIR)\Sfx.obj" - -@erase "$(INTDIR)\util.obj" - -@erase "$(INTDIR)\wizard.obj" - -@erase "$(OUTDIR)\duel.exe" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/duel.pch" /YX /Fo"$(INTDIR)/" /c -CPP_OBJS=.\Release/ -CPP_SBRS=.\. -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -RSC_PROJ=/l 0x409 /fo"$(INTDIR)/duel.res" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/duel.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib comctl32.lib winmm.lib dplayx.lib ddraw.lib dinput.lib dsound.lib /nologo /subsystem:windows /machine:I386 -# SUBTRACT LINK32 /nodefaultlib -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib\ - shell32.lib uuid.lib comctl32.lib winmm.lib dplayx.lib ddraw.lib dinput.lib\ - dsound.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)/duel.pdb"\ - /machine:I386 /out:"$(OUTDIR)/duel.exe" -LINK32_OBJS= \ - "$(INTDIR)\comm.obj" \ - "$(INTDIR)\ddutil.obj" \ - "$(INTDIR)\Ds3dutil.obj" \ - "$(INTDIR)\duel.obj" \ - "$(INTDIR)\duel.res" \ - "$(INTDIR)\gameproc.obj" \ - "$(INTDIR)\gfx.obj" \ - "$(INTDIR)\input.obj" \ - "$(INTDIR)\lobby.obj" \ - "$(INTDIR)\Sfx.obj" \ - "$(INTDIR)\util.obj" \ - "$(INTDIR)\wizard.obj" - -"$(OUTDIR)\duel.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "duel - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -OUTDIR=.\Debug -INTDIR=.\Debug - -ALL : "$(OUTDIR)\duel.exe" - -CLEAN : - -@erase "$(INTDIR)\comm.obj" - -@erase "$(INTDIR)\ddutil.obj" - -@erase "$(INTDIR)\Ds3dutil.obj" - -@erase "$(INTDIR)\duel.obj" - -@erase "$(INTDIR)\duel.res" - -@erase "$(INTDIR)\gameproc.obj" - -@erase "$(INTDIR)\gfx.obj" - -@erase "$(INTDIR)\input.obj" - -@erase "$(INTDIR)\lobby.obj" - -@erase "$(INTDIR)\Sfx.obj" - -@erase "$(INTDIR)\util.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(INTDIR)\wizard.obj" - -@erase "$(OUTDIR)\duel.exe" - -@erase "$(OUTDIR)\duel.ilk" - -@erase "$(OUTDIR)\duel.pdb" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/duel.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\Debug/ -CPP_SBRS=.\. -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -RSC_PROJ=/l 0x409 /fo"$(INTDIR)/duel.res" /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/duel.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib comctl32.lib winmm.lib dplayx.lib ddraw.lib dinput.lib dsound.lib /nologo /subsystem:windows /debug /machine:I386 -# SUBTRACT LINK32 /nodefaultlib -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib\ - shell32.lib uuid.lib comctl32.lib winmm.lib dplayx.lib ddraw.lib dinput.lib\ - dsound.lib /nologo /subsystem:windows /incremental:yes\ - /pdb:"$(OUTDIR)/duel.pdb" /debug /machine:I386 /out:"$(OUTDIR)/duel.exe" -LINK32_OBJS= \ - "$(INTDIR)\comm.obj" \ - "$(INTDIR)\ddutil.obj" \ - "$(INTDIR)\Ds3dutil.obj" \ - "$(INTDIR)\duel.obj" \ - "$(INTDIR)\duel.res" \ - "$(INTDIR)\gameproc.obj" \ - "$(INTDIR)\gfx.obj" \ - "$(INTDIR)\input.obj" \ - "$(INTDIR)\lobby.obj" \ - "$(INTDIR)\Sfx.obj" \ - "$(INTDIR)\util.obj" \ - "$(INTDIR)\wizard.obj" - -"$(OUTDIR)\duel.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Target - -# Name "duel - Win32 Release" -# Name "duel - Win32 Debug" - -!IF "$(CFG)" == "duel - Win32 Release" - -!ELSEIF "$(CFG)" == "duel - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\duel.c -DEP_CPP_DUEL_=\ - ".\comm.h"\ - ".\ds3dutil.h"\ - ".\duel.h"\ - ".\gameproc.h"\ - ".\gfx.h"\ - ".\input.h"\ - ".\lobby.h"\ - ".\sfx.h"\ - ".\util.h"\ - ".\wizard.h"\ - {$(INCLUDE)}"\d3dtypes.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\Dinput.h"\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dplobby.h"\ - {$(INCLUDE)}"\dsound.h"\ - -NODEP_CPP_DUEL_=\ - "..\..\debug\inc\subwtype.h"\ - - -"$(INTDIR)\duel.obj" : $(SOURCE) $(DEP_CPP_DUEL_) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\duel.rc -DEP_RSC_DUEL_R=\ - ".\csession.bmp"\ - ".\DUEL.BMP"\ - ".\duel.ico"\ - ".\osession.bmp"\ - ".\player.bmp"\ - ".\SPLASH.BMP"\ - - -"$(INTDIR)\duel.res" : $(SOURCE) $(DEP_RSC_DUEL_R) "$(INTDIR)" - $(RSC) $(RSC_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\wizard.c -DEP_CPP_WIZAR=\ - ".\comm.h"\ - ".\ds3dutil.h"\ - ".\duel.h"\ - ".\gameproc.h"\ - ".\sfx.h"\ - ".\util.h"\ - ".\wizard.h"\ - {$(INCLUDE)}"\d3dtypes.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dsound.h"\ - -NODEP_CPP_WIZAR=\ - "..\..\debug\inc\subwtype.h"\ - - -"$(INTDIR)\wizard.obj" : $(SOURCE) $(DEP_CPP_WIZAR) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\gameproc.c -DEP_CPP_GAMEP=\ - ".\comm.h"\ - ".\ds3dutil.h"\ - ".\duel.h"\ - ".\gameproc.h"\ - ".\gfx.h"\ - ".\input.h"\ - ".\lobby.h"\ - ".\sfx.h"\ - ".\util.h"\ - ".\wizard.h"\ - {$(INCLUDE)}"\d3dtypes.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\Dinput.h"\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dplobby.h"\ - {$(INCLUDE)}"\dsound.h"\ - -NODEP_CPP_GAMEP=\ - "..\..\debug\inc\subwtype.h"\ - - -"$(INTDIR)\gameproc.obj" : $(SOURCE) $(DEP_CPP_GAMEP) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\gfx.c -DEP_CPP_GFX_C=\ - ".\ddutil.h"\ - ".\duel.h"\ - ".\gfx.h"\ - ".\input.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\Dinput.h"\ - - -"$(INTDIR)\gfx.obj" : $(SOURCE) $(DEP_CPP_GFX_C) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\util.c -DEP_CPP_UTIL_=\ - ".\util.h"\ - - -"$(INTDIR)\util.obj" : $(SOURCE) $(DEP_CPP_UTIL_) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\comm.c -DEP_CPP_COMM_=\ - ".\comm.h"\ - ".\duel.h"\ - ".\lobby.h"\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dplobby.h"\ - - -"$(INTDIR)\comm.obj" : $(SOURCE) $(DEP_CPP_COMM_) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\ddutil.cpp -DEP_CPP_DDUTI=\ - ".\ddutil.h"\ - {$(INCLUDE)}"\ddraw.h"\ - - -"$(INTDIR)\ddutil.obj" : $(SOURCE) $(DEP_CPP_DDUTI) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\input.c -DEP_CPP_INPUT=\ - ".\ds3dutil.h"\ - ".\duel.h"\ - ".\gameproc.h"\ - ".\input.h"\ - ".\sfx.h"\ - {$(INCLUDE)}"\d3dtypes.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\Dinput.h"\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dsound.h"\ - -NODEP_CPP_INPUT=\ - "..\..\debug\inc\subwtype.h"\ - - -"$(INTDIR)\input.obj" : $(SOURCE) $(DEP_CPP_INPUT) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\lobby.c -DEP_CPP_LOBBY=\ - ".\duel.h"\ - ".\lobby.h"\ - {$(INCLUDE)}"\dplay.h"\ - {$(INCLUDE)}"\dplobby.h"\ - - -"$(INTDIR)\lobby.obj" : $(SOURCE) $(DEP_CPP_LOBBY) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\Sfx.c -DEP_CPP_SFX_C=\ - ".\ds3dutil.h"\ - ".\duel.h"\ - ".\sfx.h"\ - {$(INCLUDE)}"\d3dtypes.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\dsound.h"\ - -NODEP_CPP_SFX_C=\ - "..\..\debug\inc\subwtype.h"\ - - -"$(INTDIR)\Sfx.obj" : $(SOURCE) $(DEP_CPP_SFX_C) "$(INTDIR)" - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\Ds3dutil.c -DEP_CPP_DS3DU=\ - ".\ds3dutil.h"\ - {$(INCLUDE)}"\d3dtypes.h"\ - {$(INCLUDE)}"\ddraw.h"\ - {$(INCLUDE)}"\dsound.h"\ - -NODEP_CPP_DS3DU=\ - "..\..\debug\inc\subwtype.h"\ - - -"$(INTDIR)\Ds3dutil.obj" : $(SOURCE) $(DEP_CPP_DS3DU) "$(INTDIR)" - - -# End Source File -# End Target -# End Project -################################################################################ diff --git a/sdk/samples/duel/duel.rc b/sdk/samples/duel/duel.rc deleted file mode 100644 index 1c628f4..0000000 --- a/sdk/samples/duel/duel.rc +++ /dev/null @@ -1,267 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_JOINSESSION DIALOG DISCARDABLE 0, 0, 272, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Select Session" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Please select a session:",IDC_JOIN_SESSION_TITLE,49,16, - 152,11 - EDITTEXT IDC_JOIN_PLAYERNAME,49,151,169,14,ES_AUTOHSCROLL - LTEXT "Player Name",IDC_JOIN_PLAYER_TITLE,50,139,91,10 - CONTROL "Tree1",IDC_JOIN_SESSION,"SysTreeView32",TVS_HASBUTTONS | - TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | - TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,49,29,167,102 - GROUPBOX "",IDC_STATIC,4,6,266,167 -END - -IDD_HOSTSESSION DIALOG DISCARDABLE 0, 0, 272, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Host Session" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Session Name",IDC_HOST_SESSION_TITLE,47,47,69,11 - LTEXT "Player Name",IDC_HOST_PLAYER_TITLE,48,104,76,12 - EDITTEXT IDC_HOST_SESSIONNAME,47,60,152,13,ES_AUTOHSCROLL - EDITTEXT IDC_HOST_PLAYERNAME,47,119,152,13,ES_AUTOHSCROLL - LTEXT "Please provide information to host game:", - IDC_HOST_TITLE,13,18,227,12 - GROUPBOX "",IDC_STATIC,1,4,266,163 -END - -IDD_GAMESETUP DIALOG DISCARDABLE 0, 0, 273, 175 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Create Game or Connect to Game?" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "Host a new game",IDC_HOSTSESSION,"Button", - BS_AUTORADIOBUTTON,92,61,111,12 - CONTROL "Join a game in progress",IDC_JOINSESSION,"Button", - BS_AUTORADIOBUTTON,92,105,132,12 - LTEXT "Would you like to:",IDC_GAMESETUP_TITLE,31,34,117,12 - LTEXT "or",IDC_STATIC,92,84,26,8 - GROUPBOX "",IDC_STATIC,4,7,265,164 -END - -IDD_CHOOSEPROVIDER DIALOG DISCARDABLE 0, 0, 273, 183 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Choose Connection Mechanism" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_SERVICEPROVIDERS,43,50,192,98,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Please select a communication channel:",IDC_SP_TITLE,17, - 25,230,13 - GROUPBOX "",IDC_STATIC,5,6,266,164 -END - -IDD_CONNECT_STATUS DIALOG DISCARDABLE 120, 110, 162, 31 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Duel Connection Status" -FONT 8, "MS Sans Serif" -BEGIN - CTEXT "Finding game...",IDC_DUEL_STATUSTEXT,7,7,141,16 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -SPLASH BITMAP MOVEABLE PURE "SPLASH.BMP" -DUEL8 BITMAP MOVEABLE PURE "DUEL.BMP" -IDB_OPEN_SESSION BITMAP DISCARDABLE "osession.bmp" -IDB_CLOSED_SESSION BITMAP DISCARDABLE "csession.bmp" -IDB_PLAYER BITMAP DISCARDABLE "player.bmp" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -DUEL_ICON ICON DISCARDABLE "duel.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// WAVE -// - -SBOUNCE WAVE DISCARDABLE "Sbounce.wav" -LBOOM WAVE DISCARDABLE "Lboom.wav" -SBOOM WAVE DISCARDABLE "Sboom.wav" -BFIRE WAVE DISCARDABLE "Bfire.wav" -SENGINE WAVE DISCARDABLE "Sengine.wav" -SSTART WAVE DISCARDABLE "Sstart.wav" -SSTOP WAVE DISCARDABLE "Sstop.wav" - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_CONNECT_STATUS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 148 - TOPMARGIN, 7 - BOTTOMMARGIN, 24 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DDRAW_ERROR_DDC "DirectDraw create failed" - IDS_DDRAW_ERROR_SCL "SetCooperativeLevel failed" - IDS_DDRAW_ERROR_SDM "SetDisplayMode failed" - IDS_DDRAW_ERROR_CSFB "Front buffer creation failed" - IDS_DDRAW_ERROR_GAS "Backbuffer couldn't be obtained" - IDS_DDRAW_ERROR_CC "CreateClipper failed" - IDS_DDRAW_ERROR_SH "Clipper SetHwnd failed" - IDS_DDRAW_ERROR_SC "Clipper object couldn't be attached to the front buffer" - IDS_DDRAW_ERROR_CSS0 "Ship surface 0 creation failed" - IDS_DDRAW_ERROR_CSS1 "Ship surface 1 creation failed" - IDS_DDRAW_ERROR_CSS2 "Ship surface 2 creation failed" - IDS_DDRAW_ERROR_CSS3 "Ship surface 3 creation failed" - IDS_DDRAW_ERROR_CSN "Number surface creation failed" - IDS_DDRAW_ERROR_RS "Surfaces couldn't be restored" - IDS_DINPUT_ERROR_DIC "DirectInputCreate failed" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DINPUT_ERROR_ED "Enum keyboard devices failed" - IDS_DINPUT_ERROR_CD "Create keyboard device failed" - IDS_DINPUT_ERROR_SP "Set non-exclusive mode failed" - IDS_DINPUT_ERROR_A "Keyboard acquire failed" - IDS_DPLAY_ERROR_CP "Player create failed" - IDS_DPLAY_ERROR_JS "Session join failed" - IDS_DPLAY_ERROR_CS "Session create failed" - IDS_DDRAW_ERROR_CSBB "Back buffer create failed" - IDS_DUEL_CLASSNAME "DuelClass" - IDS_DUEL_MSG_UNKNOWN "Unknown message" - IDS_DUEL_ERROR_TITLE "Duel Message" - IDS_DUEL_TITLE "Duel" - IDS_WIZARD_FONTNAME "Times" - IDS_WIZARD_TITLE_SP "Communications Channel (1/3)" - IDS_WIZARD_TITLE_GS "Game Setup (2/3)" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_WIZARD_TITLE_JS "Join Session (3/3)" - IDS_WIZARD_TITLE_HS "Host Session (3/3)" - IDS_WIZARD_TITLE "Duel Setup" - IDS_DUEL_HELP "Spacebar\t\t- Fire\nRight Arrow\t- Rotate right\nLeft Arrow\t- Rotate left\nUp Arrow\t\t- Forward\nDown Arrow\t- Backward\nNumPad 5\t- Stop\nR\t\t- Reliable Messaging\nF1\t\t- Help\nF5\t\t- FPS\nESC or F12\t- Quit\n\nCommand line parameters\n\n-e Use emulator\n\n" - IDS_DDUTIL_ERROR_LI "LoadImage failed. Handle is NULL." - IDS_DDUTIL_ERROR_DDCB "DDCopyBitmap failed" - IDS_DDUTIL_ERROR_CCDC "CreateCompatibleDC failed" - IDS_WIZARD_ERROR_GSG "Session guid couldn't be obtained from the parent item" - IDS_DINPUT_ERROR_DF "Set keyboard data format failed" - IDS_DPLAY_ERROR_IDC "DirectPlay object create failed" - IDS_DSOUND_LOADWAVES "Could not load WAVE resource." - IDS_DSOUND_DUPBUF "Could not duplicate a sound buffer for new ship" - IDS_DPLAY_ERROR_SL "You have been disconnected from the session" - IDS_DPLAY_ERROR_GPLD "Get player local data failed" - IDS_DPLAY_ERROR_SPLD "Set player local data failed" - IDS_DPLAY_ERROR_GPRD "Get player remote data failed" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DPLAY_ERROR_SPRD "Set player remote data failed" - IDS_DPLAY_ERROR_GSD "Get session description failed" - IDS_DPLAY_ERROR_EP "Enumerate players failed" - IDS_DPLAY_ERROR_ES "Enumerate sessions failed" - IDS_DPLAY_ERROR_C "DirectPlay Close failed" - IDS_DPLAY_ERROR_R "DirectPlay Release failed" - IDS_DPLAY_ERROR_DP "Destroy player failed" - IDS_DPLOBBY_ERROR_R "DirectPlayLobby Release failed" - IDS_DPLOBBY_ERROR_GCS "DirectPlayLobby GetConnectionSettings failed" - IDS_DPLOBBY_ERROR_SCS "DirectPlayLobby SetConnectionSettings failed" - IDS_DPLOBBY_ERROR_C "DirectPlayLobby Create failed" - IDS_DPLOBBY_ERROR_CONNECT "DirectPlayLobby Connect failed" - IDS_DUEL_HOST_TITLE "Duel (Host)" - IDS_DUEL_HOST_RELIABLE_TITLE "Duel (Host, Reliable)" - IDS_DUEL_RELIABLE_TITLE "Duel (Reliable)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/duel/gameproc.c b/sdk/samples/duel/gameproc.c deleted file mode 100644 index c253b34..0000000 --- a/sdk/samples/duel/gameproc.c +++ /dev/null @@ -1,1985 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: gameproc.c - * Content: Game processing code - * - * - ***************************************************************************/ -#include "gameproc.h" -#include "util.h" -#include "gfx.h" -#include "comm.h" -#include "input.h" -#include "lobby.h" -#include "wizard.h" -#include "dsound.h" -#include "sfx.h" -#include "stdio.h" - -/* - * Externals - */ -extern DWORD gdwKeys; -extern LPDIRECTDRAWSURFACE glpShip0; -extern LPDIRECTDRAWSURFACE glpShip1; -extern LPDIRECTDRAWSURFACE glpShip2; -extern LPDIRECTDRAWSURFACE glpShip3; -extern BOOL gbShowFrameCount; -extern LPDIRECTDRAWSURFACE glpNum; -extern BOOL gbIsHost; -extern BOOL gbIsActive; -extern LPDPSESSIONDESC2 glpdpSD; -extern HWND ghWndMain; -extern HINSTANCE ghinst; -extern BOOL gbReliable; - -/* - * Globals - */ -FRAG gFrags[64]; // ship framents -BLOCKS gBlocks; // field layout -LPVOID glpvReceiveBuffer = NULL; // buffer to store received messages -DWORD gdwReceiveBufferSize = 0; // size of buffer -DPID gOurID; // our player id -BOOL gbHaveHostInit; // do we need to do host initializaton -int gnProgramState; // current state of the game -DWORD gdwFrameCount; // used for fps calc -DWORD gdwFramesLast; // .. -DWORD gdwFrameTime; // .. -BOOL gbUpdate; // TRUE if player data needs to be updated -BOOL gbNoField; // display blocks ? -BOOL gbSessionLost; // did we get disconnected ? -HOSTMSG gHostMsg; // message buffer -BLOCKHITMSG gBlockHitMsg; // .. -SHIPHITMSG gShipHitMsg; // .. -ADDBLOCKMSG gAddBlockMsg; // .. -CONTROLMSG gControlMsg; // .. -SYNCMSG gSyncMsg; // .. -TCHAR gDebugBuff[MAX_ERRORMSG]; // buffer for debug output - -/* - * Statics - */ - -static double gDirx[40] = -{ - 0.000000, - 0.156434, - 0.309017, - 0.453991, - 0.587785, - 0.707107, - 0.809017, - 0.891007, - 0.951057, - 0.987688, - 1.000000, - 0.987688, - 0.951057, - 0.891007, - 0.809017, - 0.707107, - 0.587785, - 0.453990, - 0.309017, - 0.156434, - 0.000000, - -0.156435, - -0.309017, - -0.453991, - -0.587785, - -0.707107, - -0.809017, - -0.891007, - -0.951057, - -0.987688, - -1.000000, - -0.987688, - -0.951056, - -0.891006, - -0.809017, - -0.707107, - -0.587785, - -0.453990, - -0.309017, - -0.156434 -}; - -static double gDiry[40] = -{ - -1.000000, - -0.987688, - -0.951057, - -0.891007, - -0.809017, - -0.707107, - -0.587785, - -0.453990, - -0.309017, - -0.156434, - 0.000000, - 0.156434, - 0.309017, - 0.453991, - 0.587785, - 0.707107, - 0.809017, - 0.891007, - 0.951057, - 0.987688, - 1.000000, - 0.987688, - 0.951057, - 0.891006, - 0.809017, - 0.707107, - 0.587785, - 0.453990, - 0.309017, - 0.156434, - 0.000000, - -0.156435, - -0.309017, - -0.453991, - -0.587785, - -0.707107, - -0.809017, - -0.891007, - -0.951057, - -0.987688 -}; - -/* - * InitMessageBuffers - * - * Sets up buffes used for sending different types of messages - */ -void InitMessageBuffers(void) -{ - gHostMsg.byType = MSG_HOST; - gBlockHitMsg.byType = MSG_BLOCKHIT; - gShipHitMsg.byType = MSG_SHIPHIT; - gAddBlockMsg.byType = MSG_ADDBLOCK; - gControlMsg.byType = MSG_CONTROL; - gSyncMsg.byType = MSG_SYNC; -} - -/* - * LaunchGame - * - * Sets up the game layout and launches - */ -void LaunchGame(void) -{ - HRESULT hr; - - // initialize global message buffers - InitMessageBuffers(); - - // update window title - UpdateTitle(); - - // get current session description (glpdpSD is initialized in here) - hr = DPlayGetSessionDesc(); - if (FAILED(hr) || (!glpdpSD)) - { - ShowError(IDS_DPLAY_ERROR_GSD); - goto ABORT; - } - - // initialize random number seed - srand((int)GetTickCount()); - - // clear front buffer before changing palette - EraseScreen(); - FlipScreen(); - - // initialize us - hr = InitOurShip(); - if (FAILED(hr)) - { - goto ABORT; - } - - // get the field layout - if( gbIsHost ) - { - // initialize field (done only by host) - if (!gbNoField) - InitField(); - - // we have host initialization - gbHaveHostInit = TRUE; - - // start updating screen - gbIsActive = TRUE; - } - else - { - // get it from host, if we are joining - gbHaveHostInit = FALSE; - } - - // success - return; - -ABORT: - // something went wrong, terminate game - ExitGame(); -} - -/* - * ExitGame - * - * Game termination code - */ -void ExitGame(void) -{ - // shut down app - PostMessage( ghWndMain, WM_CLOSE, 0, 0 ); -} - -/* - * InitOurShip - * - * Initializes our ship's initial attributes - */ -HRESULT InitOurShip(void) -{ - int i; - SHIP ship; - HRESULT hr; - - // wipe out everything - ZeroMemory(&ship, sizeof(ship)); - - // initialize sound buffers - InitPlayerLocalSoundData(&ship); - - // calculate ship type based on the number of players in the game - // we cycle through four ships (Y,R,G,B) for now. - - ship.byType = (BYTE) ((glpdpSD->dwCurrentPlayers-1) % NUM_SHIP_TYPES); - ship.dPosX = randInt(0,MAX_SHIP_X); - ship.dPosY = randInt(0,MAX_SHIP_Y); - ship.cFrame = randInt(0, MAX_SHIP_FRAME); - ship.bEnable = TRUE; - - // set our local data - hr = DPlaySetPlayerData(gOurID, &ship, sizeof(ship), DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - - // no ship fragments - for(i=0; i<64; i++) - gFrags[i].valid = FALSE; - - // success - return DP_OK; - -FAIL: - // failed - return hr; -} - -/* - *FUNCTION: InitPlayerLocalSoundData - * - * - *NOTES: Takes a ship and initializes ONLY its soundbuffers and sound flags. - * It leaves everything else alone. Good for when going to - * full-screen mode, when we need to get rid of the sound buffers - * for a bit, but don't want to change the data. - */ -void InitPlayerLocalSoundData(LPSHIP lpShip) -{ -int i; - if (gbSoundInitialized) - { - for (i=0; ilpDirectSoundBuffer[i], &lpShip->lpDirectSound3DBuffer[i])) - {//if it didn't work, get rid of all the other sound buffers - ShowError(IDS_DSOUND_DUPBUF); - for (--i; i>=0; i--) - { - IDirectSoundBuffer_Release(lpShip->lpDirectSoundBuffer [i]); - IDirectSoundBuffer_Release(lpShip->lpDirectSound3DBuffer[i]); - lpShip->lpDirectSoundBuffer [i] = NULL; - lpShip->lpDirectSound3DBuffer[i] = NULL; - } - return; - } - } - - lpShip->bFiring = FALSE; - lpShip->bBounced = FALSE; - lpShip->bDeath = FALSE; - lpShip->bBlockHit = FALSE; - lpShip->bEngineRunning = FALSE; - lpShip->bMoving = FALSE; - } - else - { - //if sound initialization has already failed in InitSfx(), then we want the ships' - //sound buffers to be NULL so that we don't try to release them later. - for (i=0; ilpDirectSoundBuffer [i] = NULL; - lpShip->lpDirectSound3DBuffer[i] = NULL; - } - } -}; - -/* - *FUNCTION: SetPlayerLocalSoundDataCB (CALLBACK) - * - *PURPOSE: Initializes and registers a player's local SOUND data ONLY. - */ -BOOL WINAPI SetPlayerLocalSoundDataCB(DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext) -{ - SHIP ship; - DWORD dwSize = sizeof(ship); - HRESULT hr; - - DPlayGetPlayerData(dpId, &ship, &dwSize, DPGET_LOCAL); - - // no player data yet - if (0 == dwSize) - return TRUE; - - InitPlayerLocalSoundData(&ship); - - hr = DPlaySetPlayerData(dpId, &ship, dwSize, DPSET_LOCAL); - return (DP_OK == hr); -}; - -/* - *FUNCTION: InitLocalSoundData - * - *PURPOSE: Initializes and registers all players' sound data ONLY - */ -HRESULT InitLocalSoundData(void) -{ - HRESULT hr; - hr = DPlayEnumPlayers(&(glpdpSD->guidInstance), SetPlayerLocalSoundDataCB, NULL, 0); - return hr; -} - -/* - *FUNCTION: ReleaseLocalSoundData - * - *NOTES: Releases a single ship's local sound buffers. - */ -void ReleasePlayerLocalSoundData(LPSHIP lpShip) -{ -int i; - - if (gbSoundInitialized) - { - for (i=0; ilpDirectSoundBuffer[i] != NULL) - { - IDirectSoundBuffer_Stop (lpShip->lpDirectSoundBuffer[i]); - IDirectSoundBuffer_Release (lpShip->lpDirectSoundBuffer[i]); - lpShip->lpDirectSoundBuffer[i] = NULL; - } - - if (lpShip->lpDirectSound3DBuffer[i] != NULL) - { - IDirectSound3DBuffer_Release(lpShip->lpDirectSound3DBuffer[i]); - lpShip->lpDirectSound3DBuffer[i] = NULL; - } - } - } -}; - -/* - *FUNCTION: ReleasePlayerLocalData (CALLBACK) - * - *PURPOSE: Retrieves and releases a player's local data from dplay. - */ -BOOL WINAPI ReleasePlayerLocalDataCB(DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext) -{ - SHIP ship; - DWORD dwSize = sizeof(SHIP); - HRESULT hr; - - hr = DPlayGetPlayerData(dpId, &ship, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - { - wsprintf(gDebugBuff, TEXT("Get Player local data failed for id %d\n"), dpId); - DEBUG_OUT(gDebugBuff); - goto FAIL; - } - - // no player data yet - if (0 == dwSize) - return TRUE; - - ReleasePlayerLocalSoundData(&ship); - - hr = DPlaySetPlayerData(dpId, &ship, dwSize, DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - - // success - return TRUE; -FAIL: - // we failed - return FALSE; -} - -/* - *FUNCTION: ReleaseLocalData - * - *PURPOSE: Releases local data of ALL players. - */ -void ReleaseLocalData(void) -{ - HRESULT hr; - - if (gnProgramState == PS_ACTIVE) - { - hr = DPlayEnumPlayers(&(glpdpSD->guidInstance), ReleasePlayerLocalDataCB, NULL, 0); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_EP); - } - } -}; - -/* - * ProcessUserInput - * - * Processes any input from the user and updates our ship state - */ -void ProcessUserInput(LPSHIP lpShip) -{ - static dwOldKeys = 0; - - gbUpdate = FALSE; - - // DSOUND: check if the engine was turned off - if (!(gdwKeys & (KEY_DOWN | KEY_UP)) && - (dwOldKeys & (KEY_DOWN | KEY_UP))) - { - gdwKeys |= KEY_ENGINEOFF; - - gControlMsg.byState = (BYTE) gdwKeys; - // let everyone know that we just turned our engine off - SendGameMessage((LPGENERICMSG) &gControlMsg, DPID_ALLPLAYERS); - } - - // update our ship state - UpdateState(lpShip, gdwKeys); - - // remember current keys for next frame - dwOldKeys = gdwKeys; -} - -/* - * UpdateState - * - * Updates the current state of our ship, given user input - */ -void UpdateState(LPSHIP lpShip, DWORD dwControls) -{ - lpShip->dwKeys = dwControls; - - if( dwControls & KEY_LEFT ) - { - gbUpdate = TRUE; - lpShip->cFrame -= 1; - if( lpShip->cFrame < 0 ) - lpShip->cFrame += MAX_SHIP_FRAME; - } - if( dwControls & KEY_RIGHT ) - { - gbUpdate = TRUE; - lpShip->cFrame += 1; - if( lpShip->cFrame >= MAX_SHIP_FRAME ) - lpShip->cFrame -= MAX_SHIP_FRAME; - } - if( dwControls & KEY_UP ) - { - gbUpdate = TRUE; - lpShip->dVelX += gDirx[lpShip->cFrame] * 10.0 / 1000.0; - lpShip->dVelY += gDiry[lpShip->cFrame] * 10.0 / 1000.0; - } - if( dwControls & KEY_DOWN ) - { - gbUpdate = TRUE; - lpShip->dVelX -= gDirx[lpShip->cFrame] * 10.0 / 1000.0; - lpShip->dVelY -= gDiry[lpShip->cFrame] * 10.0 / 1000.0; - } - if( dwControls & KEY_STOP ) - { - gbUpdate = TRUE; - lpShip->dVelX = 0.0; - lpShip->dVelY = 0.0; - } - if( !lpShip->bBulletEnable && lpShip->bEnable ) - { - if( dwControls & KEY_FIRE ) - { - gbUpdate = TRUE; - // launch a new bullet - lpShip->dBulletPosX = (WORD) (gDirx[lpShip->cFrame]*6.0 + 16.0 + lpShip->dPosX); - lpShip->dBulletPosY = (WORD) (gDiry[lpShip->cFrame]*6.0 + 16.0 + lpShip->dPosY); - lpShip->dBulletVelX = gDirx[lpShip->cFrame]*500.0/1000.0; - lpShip->dBulletVelY = gDiry[lpShip->cFrame]*500.0/1000.0; - lpShip->bBulletEnable = TRUE; - lpShip->dwBulletFrame = 0; - } - } -} - -/* - * SendSync - * - * Sends a sync message with the rendevous position. We are using a synchronization technique in - * which every player informs everyone else where the player is going to be at the end of the - * next sync interval. Based on this rendezvous position, everyone tries to move their corresponding - * ghosts to the rendezvous position by the end of the interval. - */ -void SendSync(LPSHIP lpShip) -{ - gSyncMsg.byShipType = lpShip->byType; - gSyncMsg.cFrame = lpShip->cFrame; - gSyncMsg.dPosX = lpShip->dPosX + lpShip->dVelX*1000; - gSyncMsg.dPosY = lpShip->dPosY + lpShip->dVelY*1000; - - SendGameMessage((LPGENERICMSG) &gSyncMsg, DPID_ALLPLAYERS); -} - -/* - * UpdateDisplayStatus - * - * Updates the disable timeout. Enables the ship if disable timeout has elapsed. - */ -void UpdateDisplayStatus(LPSHIP lpShip) -{ - DWORD dwTickDiff; - DWORD dwTickCount; - - // current time - dwTickCount = timeGetTime(); - - // time elapsed since last update - dwTickDiff = dwTickCount - lpShip->dwLastTick; - - // timestamp - lpShip->dwLastTick = dwTickCount; - - // update time-out - lpShip->iCountDown -= dwTickDiff; - - // time-out ? - if( lpShip->iCountDown < 0 ) - { - // get new position and enable our lpShip - lpShip->dPosX = randInt(0,MAX_SHIP_X); - lpShip->dPosY = randInt(0,MAX_SHIP_Y); - lpShip->cFrame = randInt(0, MAX_SHIP_FRAME); - lpShip->bEnable = TRUE; - } -} - -/* - * UpdatePosition - * - * Updates our ship's position - */ -void UpdatePosition(DPID dpId, LPSHIP lpShip ) -{ - int x,y; - BYTE oldxCell, oldyCell, newxCell, newyCell, mask, col, row; - double thisTick, totalTick, xtick, ytick; - DWORD dwTickCount; - DWORD dwTickDiff; - - if( !lpShip->bEnable ) - return; - - // how long has it been since we last updated - dwTickCount = timeGetTime(); - dwTickDiff = dwTickCount - lpShip->dwLastTick; - - // current timestamp - lpShip->dwLastTick = dwTickCount; - - oldxCell = (int)(lpShip->dPosX+16.0) >> 4; - oldyCell = (int)(lpShip->dPosY+16.0) >> 4; - - // compute new position - lpShip->dPosX += lpShip->dVelX * dwTickDiff; - lpShip->dPosY += lpShip->dVelY * dwTickDiff; - - newxCell = (int)(lpShip->dPosX+16.0) >> 4; - newyCell = (int)(lpShip->dPosY+16.0) >> 4; - if(oldxCell != newxCell) - { - // we allow ghosts to pass through the blocks - if( (dpId == gOurID) && IsHit( newxCell, newyCell ) ) - { - if( lpShip->dVelX > 0.0 ) - lpShip->dPosX = (oldxCell << 4) + 15 - 16; - else - lpShip->dPosX = (oldxCell << 4) - 16; - lpShip->dVelX = -lpShip->dVelX*0.9; - newxCell = oldxCell; - lpShip->bBounced = TRUE; - } - } - if(oldyCell != newyCell) - { - // we allow ghosts to pass through the blocks - if( (dpId == gOurID) && IsHit( newxCell, newyCell ) ) - { - if( lpShip->dVelY > 0.0 ) - lpShip->dPosY = (oldyCell << 4) + 15 - 16; - else - lpShip->dPosY = (oldyCell << 4) - 16; - - lpShip->dVelY = -lpShip->dVelY*0.9; - lpShip->bBounced = TRUE; - } - } - - if( lpShip->dPosX > MAX_SHIP_X ) - { - lpShip->dPosX = MAX_SHIP_X; - lpShip->dVelX = -lpShip->dVelX*0.9; - lpShip->bBounced = TRUE; - } - else if ( lpShip->dPosX < 0 ) - { - lpShip->dPosX =0; - lpShip->dVelX = -lpShip->dVelX*0.9; - lpShip->bBounced = TRUE; - } - if( lpShip->dPosY > MAX_SHIP_Y ) - { - lpShip->dPosY = MAX_SHIP_Y; - lpShip->dVelY = -lpShip->dVelY*0.9; - lpShip->bBounced = TRUE; - } - else if ( lpShip->dPosY < 0 ) - { - lpShip->dPosY =0; - lpShip->dVelY = -lpShip->dVelY*0.9; - lpShip->bBounced = TRUE; - } - - if ((dpId == gOurID) && lpShip->bBounced) - { - SendSync(lpShip); - } - - if( !lpShip->bBulletEnable ) - return; - - // update the active bullet - lpShip->dwBulletFrame += dwTickDiff; - if( lpShip->dwBulletFrame >= MAX_BULLET_FRAME ) - { - lpShip->bFiring = FALSE; - lpShip->bBulletEnable = FALSE; - return; - } - - - if( lpShip->dBulletVelX != 0.0 ) - xtick = 8.0/lpShip->dBulletVelX; - else - xtick = 999999.0; - - if( lpShip->dBulletVelY != 0.0 ) - ytick = 8.0/lpShip->dBulletVelY; - else - ytick = 999999.0; - - if( xtick < 0.0 ) - xtick = -xtick; - if( ytick < 0.0 ) - ytick = -ytick; - - if( xtick < ytick ) - thisTick = xtick; - else - thisTick = ytick; - - if( thisTick > dwTickDiff ) - thisTick = dwTickDiff; - - for( totalTick = 0.0; totalTick < dwTickDiff; ) - { - totalTick += thisTick; - - lpShip->dBulletPosX += lpShip->dBulletVelX * thisTick; - lpShip->dBulletPosY += lpShip->dBulletVelY * thisTick; - - if( lpShip->dBulletPosX > MAX_BULLET_X ) - { - lpShip->dBulletPosX = MAX_BULLET_X; - lpShip->dBulletVelX = -lpShip->dBulletVelX*0.9; - } - else if ( lpShip->dBulletPosX < 0 ) - { - lpShip->dBulletPosX =0; - lpShip->dBulletVelX = -lpShip->dBulletVelX*0.9; - } - if( lpShip->dBulletPosY > MAX_BULLET_Y ) - { - lpShip->dBulletPosY = MAX_BULLET_Y; - lpShip->dBulletVelY = -lpShip->dBulletVelY*0.9; - } - else if ( lpShip->dBulletPosY < 0 ) - { - lpShip->dBulletPosY =0; - lpShip->dBulletVelY = -lpShip->dBulletVelY*0.9; - } - - // check to see if it hit anything - x = (int)(lpShip->dBulletPosX + 0.5) + 1; - y = (int)(lpShip->dBulletPosY + 0.5) + 1; - - row = y >> 4; - col = x >> 4; - mask = 1 << (col & 0x7); - col = col >> 3; - if( gBlocks.bits[row][col] & mask ) - { - // dwScored a block hit - gBlockHitMsg.byRow = row; - gBlockHitMsg.byCol = col; - gBlockHitMsg.byMask = mask; - SendGameMessage((LPGENERICMSG) &gBlockHitMsg, DPID_ALLPLAYERS); - - gBlocks.bits[row][col] &= ~mask; - lpShip->dwScore += 10; - lpShip->bBulletEnable = FALSE; - lpShip->bBlockHit = TRUE; - lpShip->bFiring = FALSE; - } - } -} - - -/* - * IsHit - * - * Tells if there is a block at (x,y) location - */ -BOOL IsHit( int x, int y ) -{ - int col, mask; - - // outside screen boundaries? - if( (x < 0) || (y < 0) || (x >= 40) || (y >= 30) ) - return TRUE; - - // look at the block bits - mask = 1 << (x & 0x7); - col = x >> 3; - if( gBlocks.bits[y][col] & mask ) - return TRUE; - else - return FALSE; -} - -/* - * InitField - * - * Initializes block positions on the field - */ -void InitField(void) -{ - int i, x, y; - - // clear all gBlocks - for(x=0; x<5; x++) - for(y=0; y<30; y++) - gBlocks.bits[y][x] = 0; - - // set random gBlocks - for(i=0; i<400; i++) - { - x = randInt(0, 40); - y = randInt(0, 30); - if( !setBlock(x, y) ) i--; - } -} - -/* - * AddBlock - * - * Adds a block to the field - */ -void AddBlock(void) -{ - int x,y; - - // maybe add a block? - if(gbIsHost && gbIsActive && ( randInt( 0, 100 ) > 98 )) - { - x = randInt( 0, 40); - y = randInt( 0, 30); - if( setBlock( x, y) ) - { - gAddBlockMsg.byX = (BYTE) x; - gAddBlockMsg.byY = (BYTE) y; - SendGameMessage((LPGENERICMSG) &gAddBlockMsg, DPID_ALLPLAYERS); - } - } -} - -/* - * setBlock - * - * Turns on a block - */ -BOOL setBlock( int x, int y ) -{ - BYTE mask, col; - - mask = 1 << (x & 0x7); - col = x >> 3; - - // is Block already set? - if( gBlocks.bits[y][col] & mask ) - return FALSE; - - // set the block and return success - gBlocks.bits[y][col] |= mask; - return TRUE; -} - -/* - * AddFrag - * - * Turns on a fragment - */ -void AddFrag(LPSHIP lpShip, int offX, int offY) -{ - int i; - for(i=0; i<64; i++) // find available fragment - { - if( !gFrags[i].valid ) - break; - } - if( i == 64 ) - return; - - - gFrags[i].dPosX = offX + lpShip->dPosX; - gFrags[i].dPosY = offY + lpShip->dPosY; - switch( lpShip->byType ) - { - case 0: gFrags[i].surf = glpShip0; break; - case 1: gFrags[i].surf = glpShip1; break; - case 2: gFrags[i].surf = glpShip2; break; - case 3: gFrags[i].surf = glpShip3; break; - default: DEBUG_OUT(TEXT("Unknown ship type\n")); return; - } - gFrags[i].src.top = 32 * ( (int)lpShip->cFrame / 10 ) + offX; - gFrags[i].src.left = 32 * ( (int)lpShip->cFrame % 10 ) + offY; - gFrags[i].src.right = gFrags[i].src.left + 8; - gFrags[i].src.bottom = gFrags[i].src.top + 8; - gFrags[i].dVelX = ((double)offX - 12.0)/24.0; - gFrags[i].dVelY = ((double)offY - 12.0)/24.0; - gFrags[i].valid = TRUE; -} - -/* - * UpdateFragment - * - * Updates the position of a fragment - */ -void UpdateFragment(int i) -{ - DWORD dwTickCount; - static DWORD dwTickDiff; - static DWORD dwLastTick; - - if( i == 0) - { - dwTickCount = timeGetTime(); - dwTickDiff = dwTickCount - dwLastTick; - dwLastTick = dwTickCount; - } - - if( !gFrags[i].valid ) - return; - - gFrags[i].dPosX += (int) (gFrags[i].dVelX * dwTickDiff); - gFrags[i].dPosY += (int) (gFrags[i].dVelY * dwTickDiff); - if( (gFrags[i].dPosX < 0.0) || (gFrags[i].dPosX >= 632.0) || - (gFrags[i].dPosY < 0.0) || (gFrags[i].dPosY >= 472.0) ) - { - gFrags[i].valid = FALSE; - } -} - -/* - * DestroyShip - * - * Renders a bunch of fragments to show that the ship is destroyed - */ -void DestroyShip( LPSHIP lpShip ) -{ - // Set flag for explosion sound - lpShip->bDeath = TRUE; - - // add ship fragments - AddFrag(lpShip, 0, 0); - AddFrag(lpShip, 8, 0); - AddFrag(lpShip, 16, 0); - AddFrag(lpShip, 24, 0); - AddFrag(lpShip, 0, 8); - AddFrag(lpShip, 8, 8); - AddFrag(lpShip, 16, 8); - AddFrag(lpShip, 24, 8); - AddFrag(lpShip, 0, 16); - AddFrag(lpShip, 8, 16); - AddFrag(lpShip, 16, 16); - AddFrag(lpShip, 24, 16); - AddFrag(lpShip, 0, 24); - AddFrag(lpShip, 8, 24); - AddFrag(lpShip, 16, 24); - AddFrag(lpShip, 24, 24); - - // Play explosion sound - ProcessSoundFlags(lpShip); -} - -/* - * UpdateFrame - * - * Refreshes the screen - */ -BOOL UpdateFrame( void ) -{ - int i; - DWORD dwTickCount; - SHIP ship; - DWORD dwSize; - HRESULT hr; - static dwSyncLastTick = 0; - static dwUpdateLastTick = 0; - - switch( gnProgramState ) - { - case PS_ACTIVE: - // DINPUT: use DirectInput to read game-play keys - DI_ReadKeys(); - - // get our local data - dwSize = sizeof(ship); - hr = DPlayGetPlayerData(gOurID, &ship, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - { - wsprintf(gDebugBuff, TEXT("Get Player local data failed for id %d\n"), gOurID); - DEBUG_OUT(gDebugBuff); - goto FAIL; - } - - if (!ship.bEnable) - { - // update disable timeout and display status - UpdateDisplayStatus(&ship); - } - else - { - // process any change in game controls - ProcessUserInput(&ship); - - dwTickCount = timeGetTime(); - - // synchronize if it's time - if (gbIsActive && ((dwTickCount - dwSyncLastTick) > SYNC_INTERVAL)) - { - SendSync(&ship); - dwSyncLastTick = dwTickCount; - } - - // if our player changed any keys, let everyone know - if (gbUpdate) - { - // control the number of packets we send - if ((dwTickCount - dwUpdateLastTick) > UPDATE_INTERVAL) - { - // let others know - gControlMsg.byState = (BYTE) gdwKeys; - SendGameMessage((LPGENERICMSG) &gControlMsg, DPID_ALLPLAYERS); - dwUpdateLastTick = dwTickCount; - } - } - } - - // save ship data as RenderPlayerCB reads stored data - hr = DPlaySetPlayerData(gOurID, &ship, sizeof(ship), DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - - // update fragments - for(i=0; i<64; i++) - UpdateFragment(i); - - // add a block - if (!gbNoField) - AddBlock(); - - // render everything - if (!DrawScreen()) - { - goto FAIL; - } - break; - - case PS_REST: - if( gbHaveHostInit ) - { - SetGamePalette(); - gnProgramState = PS_ACTIVE; - } - break; - } - - // success - return TRUE; - -FAIL: - // failed - return FALSE; -} - -/* - *FUNCTION: ProcessSoundFlags - * - *PARAMETERS: - * lpShip: Points to a ship structure (originally retrieved from - * GetPlayerData) in RenderPlayer. - * - *NOTES: All y-coordinates must be made negative, because the - * 3D Sound API's use an opposite coordinate system than - * the screen. - */ -void ProcessSoundFlags(LPSHIP lpShip) -{ - int i; - BOOL bStart[MAX_SOUNDS]; //flags, used so we can - BOOL bStop [MAX_SOUNDS]; - - if (!gbSoundInitialized) - return; - - //if one is NULL, so are the other ones and we aren't initialized yet. - for (i=0; ilpDirectSoundBuffer[i]==NULL) - return; - } - - //set all our temporary flags to FALSE. - for (i=0; idwKeys & KEY_ENGINEOFF) - { - bStop[SENGINE] = TRUE; - lpShip->bEngineRunning = FALSE; - } - - if (lpShip->dwKeys & (KEY_UP | KEY_DOWN)) - { - if (!lpShip->bEngineRunning) //turn on engine - { - bStart[SENGINE] = TRUE; - if (!lpShip->bMoving) //"fire-up-engine" sound - { - bStart[SSTART] = TRUE; - IDirectSound3DBuffer_SetPosition(lpShip->lpDirectSound3DBuffer[SSTART], - P2M(lpShip->dPosX - 320), - -P2M(lpShip->dPosY - 240), - D3DVAL(0), - DS3D_DEFERRED); - bStart[SSTART] = TRUE; - lpShip->bMoving = TRUE; - } - lpShip->bEngineRunning = TRUE; - } - } - - if (lpShip->bMoving) - { - IDirectSound3DBuffer_SetPosition(lpShip->lpDirectSound3DBuffer[SENGINE], - P2M(lpShip->dPosX - 320), - -P2M(lpShip->dPosY - 240), - D3DVAL(0), - DS3D_DEFERRED); - IDirectSound3DBuffer_SetVelocity(lpShip->lpDirectSound3DBuffer[SENGINE], - D3DVAL(lpShip->dVelX * 10), //exagerater vel - D3DVAL(lpShip->dVelY * 10), - D3DVAL(0), - DS3D_DEFERRED); - } - - if (lpShip->dwKeys & KEY_STOP) - { - if (lpShip->bMoving) - { - IDirectSound3DBuffer_SetPosition(lpShip->lpDirectSound3DBuffer[SSTOP], - P2M(lpShip->dPosX - 320), - -P2M(lpShip->dPosY - 240), - D3DVAL(0), - DS3D_DEFERRED); - bStart[SSTOP] = TRUE; - bStop[SENGINE] = TRUE; - lpShip->bEngineRunning = FALSE; - lpShip->bMoving = FALSE; - } - } - - if (lpShip->dwKeys & KEY_FIRE) - { - if (!lpShip->bFiring) - { - IDirectSound3DBuffer_SetPosition(lpShip->lpDirectSound3DBuffer[BFIRE], - P2M(lpShip->dPosX - 320), - -P2M(lpShip->dPosY - 240), - D3DVAL(0), - DS3D_DEFERRED); - bStart[BFIRE] = TRUE; - lpShip->bFiring = TRUE; - } - } - - if (lpShip->bBlockHit) - { - IDirectSound3DBuffer_SetPosition(lpShip->lpDirectSound3DBuffer[LBOOM], - - P2M(lpShip->dBulletPosX - 320), - -P2M(lpShip->dBulletPosY - 240), - D3DVAL(0), - DS3D_DEFERRED); - - bStart[LBOOM] = TRUE; - lpShip->bBlockHit = FALSE; - } - - if (lpShip->bBounced) - { - IDirectSound3DBuffer_SetPosition(lpShip->lpDirectSound3DBuffer[SBOUNCE], - P2M(lpShip->dPosX - 320), - -P2M(lpShip->dPosY - 240), - D3DVAL(0), - DS3D_DEFERRED); - - bStart[SBOUNCE] = TRUE; - lpShip->bBounced = FALSE; - } - - - if (lpShip->bDeath) - { - bStop [BFIRE] = TRUE; - bStop [SBOUNCE] = TRUE; - bStop [SSTOP] = TRUE; - bStop [SSTART] = TRUE; - bStop [SENGINE] = TRUE; - bStart[SBOOM] = TRUE; - lpShip->bDeath = FALSE; //turn off sound flag. - } - - //stop, update, and start sounds. - for (i=0; ilpDirectSoundBuffer[i]); - bStart[i] = FALSE; - } - } - IDirectSound3DListener_CommitDeferredSettings(glpDirectSound3DListener); - - for (i=0; ilpDirectSoundBuffer[i], 0); - - if (DSERR_BUFFERLOST==IDirectSoundBuffer_Play(lpShip->lpDirectSoundBuffer[i], - 0, - 0, - (i==SENGINE) ? DSBPLAY_LOOPING : 0)) - { - WaveReload(gSoundEffect[i]); - } - } - } - lpShip->dwKeys = 0; -}; - - - - -/* - * RenderPlayerCB - * - * Renders a ship in its current state. Also checks if we hit the ship and informs - * the ship that it has been destroyed. - */ - -BOOL WINAPI RenderPlayerCB(DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext) -{ - SHIP ship, ourShip; - DWORD dwSize = sizeof(ship); - BOOL bHit = FALSE; - HRESULT hr; - DWORD dwTickCount; - - // get ship data - hr = DPlayGetPlayerData(dpId, &ship, &dwSize, DPGET_LOCAL); - - if (FAILED(hr)) - { - wsprintf(gDebugBuff, TEXT("Get Player local data failed for id %d\n"), dpId); - DEBUG_OUT(gDebugBuff); - goto FAIL; - } - - // no player data yet - if (0 == dwSize) - return TRUE; - - // ignore current ship ? - if (ship.bIgnore) - { - // if this ship was being ignored, update ignore time-out - // A time-out is used here to ensure that this ship doesn't get ignored - // forever on our screen in case the destroy message was dropped. - dwTickCount = timeGetTime(); - ship.iCountDown -= dwTickCount - ship.dwLastTick; - ship.dwLastTick = dwTickCount; - if( ship.iCountDown < 0 ) - { - ship.bIgnore = FALSE; - } - - // save ship data - hr = DPlaySetPlayerData(dpId, &ship, sizeof(ship), DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - // we are ignoring this ship, so just bail - return TRUE; - } - - // bail, if ship is disabled - if (!ship.bEnable) return TRUE; - - // update ship's position - UpdatePosition(dpId, &ship); - - // get our player data to compare with others - dwSize = sizeof(ship); - hr = DPlayGetPlayerData(gOurID, &ourShip, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - { - wsprintf(gDebugBuff, TEXT("Get Player local data failed for id %d\n"), dpId); - DEBUG_OUT(gDebugBuff); - goto FAIL; - } - - // check if our bullet hit the current ship - if((dpId != gOurID) && ourShip.bBulletEnable && ship.bEnable) - { - if( (ourShip.dBulletPosX > ship.dPosX) && - (ourShip.dBulletPosX < (ship.dPosX + 32.0) ) && - (ourShip.dBulletPosY > ship.dPosY) && - (ourShip.dBulletPosY < (ship.dPosY + 32.0) ) ) - { - // hasta-la-vista baby - DestroyShip(&ship); - // we nailed it - bHit = TRUE; - // turn off ship locally - ship.bEnable = FALSE; - // temporarily ignore ship until we get a response - ship.bIgnore = TRUE; - // set its ignore time-out - ship.iCountDown = HIDE_TIMEOUT; - // time-stamp - ship.dwLastTick = timeGetTime(); - // turn our bullet off - ship.bBulletEnable = FALSE; - // update our score - ourShip.dwScore += 1000; - // save our score - hr = DPlaySetPlayerData(gOurID, &ourShip, sizeof(ourShip), DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - } - } - - // render the ship - if (ship.bBulletEnable) DrawBullet(&ship); - if (ship.bEnable) DrawShip(&ship); - - ProcessSoundFlags(&ship); - - // save ship data - hr = DPlaySetPlayerData(dpId, &ship, sizeof(ship), DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - - // inform the player - if (bHit) - { - gShipHitMsg.Id = dpId; - SendGameMessage((LPGENERICMSG) &gShipHitMsg, dpId); - } - - // success - return TRUE; - -FAIL: - // failed - return FALSE; -} - -/* - * DrawScreen - * - * Renders the current frame - */ -BOOL DrawScreen( void ) -{ - BYTE mask, col; - int x, y; - HRESULT hr; - - // clear screen - EraseScreen(); - - // render players - hr = DPlayEnumPlayers(NULL, RenderPlayerCB, NULL, 0); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_EP); - goto FAIL; - } - - // render field - for( y=0; y<30; y++) - { - for( x=0; x<40; x++) - { - mask = 1 << (x & 0x7); - col = x >> 3; - if( gBlocks.bits[y][col] & mask ) - DrawBlock( x, y ); - } - } - - // render score - if (!DrawScore()) - { - goto FAIL; - } - - // render fragments - DrawFragments(); - - // render frame rate - if( gbShowFrameCount ) - DisplayFrameRate(); - - // show - FlipScreen(); - - // success - return TRUE; - -FAIL: - return FALSE; -} - -/* - * DisplayFrameRate - * - * Renders current frame rate - */ -void DisplayFrameRate( void ) -{ - DWORD time2; - char buff[256]; - static DWORD dwFrames; - - gdwFrameCount++; - time2 = timeGetTime() - gdwFrameTime; - if( time2 > 1000 ) - { - dwFrames = (gdwFrameCount*1000)/time2; - gdwFrameTime = timeGetTime(); - gdwFrameCount = 0; - } - if( dwFrames == 0 ) - { - return; - } - - if (dwFrames != gdwFramesLast) - { - gdwFramesLast = dwFrames; - } - - if( dwFrames > 99 ) - { - dwFrames = 99; - } - buff[0] = (char)((dwFrames / 10) + '0'); - buff[1] = (char)((dwFrames % 10) + '0'); - buff[2] = '\0'; - bltScore(buff, 295, 10); -} - -/* - * DrawScore - * - * Renders our current score - */ -BOOL DrawScore( void ) -{ - SHIP ship; - DWORD dwSize; - char dwScorebuf[11]; - int rem; - HRESULT hr; - - dwSize = sizeof(ship); - hr = DPlayGetPlayerData(gOurID, &ship, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - { - wsprintf(gDebugBuff, TEXT("Get Player local data failed for id %d\n"), gOurID); - DEBUG_OUT(gDebugBuff); - goto FAIL; - } - - // blt everything in reverse order if we are doing destination transparency - // calculate dwScore string - dwScorebuf[0] = (BYTE)ship.dwScore/100000 + '0'; - rem = ship.dwScore % 100000; - dwScorebuf[1] = rem/10000 + '0'; - rem = ship.dwScore % 10000; - dwScorebuf[2] = rem/1000 + '0'; - rem = ship.dwScore % 1000; - dwScorebuf[3] = rem/100 + '0'; - rem = ship.dwScore % 100; - dwScorebuf[4] = rem/10 + '0'; - rem = ship.dwScore % 10; - dwScorebuf[5] = rem + '0'; - dwScorebuf[6] = '\0'; - - bltScore(dwScorebuf, 8, 8); - - // save ship data - hr = DPlaySetPlayerData(gOurID, &ship, sizeof(ship), DPSET_LOCAL); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_SPLD); - goto FAIL; - } - - return TRUE; - -FAIL: - // failed - return FALSE; -} - -/* - * DrawBlock - * - * Renders a block - */ -void DrawBlock( int x, int y ) -{ - RECT src; - - src.top = 0; - src.left = 224; - src.right = src.left + 16; - src.bottom = src.top + 16; - bltObject( x << 4, y << 4, glpNum, &src, DDBLTFAST_SRCCOLORKEY ); -} - -/* - * DrawShip - * - * Renders a ship - */ -void DrawShip( LPSHIP lpShip ) -{ - RECT src; - LPDIRECTDRAWSURFACE surf; - - src.top = 32 * (lpShip->cFrame / 10 ); - src.left = 32 * (lpShip->cFrame % 10 ); - src.right = src.left + 32; - src.bottom = src.top + 32; - switch( lpShip->byType ) - { - case 0: surf = glpShip0; break; - case 1: surf = glpShip1; break; - case 2: surf = glpShip2; break; - case 3: surf = glpShip3; break; - default: DEBUG_OUT(TEXT("Ship type not specified\n")); return; - } - bltObject((int)lpShip->dPosX, (int)lpShip->dPosY, surf, &src, DDBLTFAST_SRCCOLORKEY ); -} - -/* - * DrawBullet - * - * Renders a bullet - */ -void DrawBullet( LPSHIP lpShip ) -{ - RECT src; - - src.top = BULLET_Y; - src.left = BULLET_X + (lpShip->byType)*4; - src.right = src.left + 3; - src.bottom = src.top + 3; - bltObject((int)lpShip->dBulletPosX, (int)lpShip->dBulletPosY, glpNum, &src, DDBLTFAST_SRCCOLORKEY ); -} - -/* - * DrawFragments - * - * Renders the fragments - */ - -void DrawFragments( void ) -{ - int i; - - for(i=0; i<64; i++) - { - if( gFrags[i].valid ) - { - bltObject((int)gFrags[i].dPosX, (int)gFrags[i].dPosY, gFrags[i].surf, - &(gFrags[i].src), DDBLTFAST_SRCCOLORKEY ); - } - } -} - -/* - * ReceiveGameMessages - * - * Checks if there are any messages for us and receives them - */ -HRESULT ReceiveMessages( void ) -{ - DPID idFrom, idTo; - LPVOID lpvMsgBuffer; - DWORD dwMsgBufferSize; - HRESULT hr; - - // read all messages in queue - dwMsgBufferSize = gdwReceiveBufferSize; - lpvMsgBuffer = glpvReceiveBuffer; - - while (TRUE) - { - // see what's out there - idFrom = 0; - idTo = 0; - - hr = DPlayReceive(&idFrom, &idTo, DPRECEIVE_ALL, lpvMsgBuffer, &dwMsgBufferSize); - if (hr == DPERR_BUFFERTOOSMALL) - { - if (lpvMsgBuffer == NULL) - { - lpvMsgBuffer = GlobalAllocPtr(GHND, dwMsgBufferSize); - if (lpvMsgBuffer == NULL) - return (DPERR_NOMEMORY); - glpvReceiveBuffer = lpvMsgBuffer; - gdwReceiveBufferSize = dwMsgBufferSize; - } - else if (dwMsgBufferSize > gdwReceiveBufferSize) - { - lpvMsgBuffer = GlobalReAllocPtr(lpvMsgBuffer, dwMsgBufferSize, 0); - if (lpvMsgBuffer == NULL) - return (DPERR_NOMEMORY); - glpvReceiveBuffer = lpvMsgBuffer; - gdwReceiveBufferSize = dwMsgBufferSize; - } - } - else if ((hr == DP_OK) && - ((dwMsgBufferSize >= sizeof(GENERICMSG)) || - (dwMsgBufferSize >= sizeof(DPMSG_GENERIC)))) - { - if (idFrom == DPID_SYSMSG) - { - DoSystemMessage((LPDPMSG_GENERIC) lpvMsgBuffer, dwMsgBufferSize, idFrom, idTo); - } - else - { - DoApplicationMessage((LPGENERICMSG) lpvMsgBuffer, dwMsgBufferSize, idFrom, idTo); - } - } - else - break; - }; - - return hr; -} - -/* - * DoSystemMessage - * - * Evaluates system messages and performs appropriate actions - */ -void DoSystemMessage( LPDPMSG_GENERIC lpMsg, DWORD dwMsgSize, DPID idFrom, DPID idTo ) -{ - switch( lpMsg->dwType) - { - case DPSYS_CREATEPLAYERORGROUP: - { - LPDPMSG_CREATEPLAYERORGROUP lpAddMsg = (LPDPMSG_CREATEPLAYERORGROUP) lpMsg; - - if( gbIsHost) - { - gHostMsg.Blocks = gBlocks; - SendGameMessage((LPGENERICMSG) &gHostMsg, lpAddMsg->dpId); - } - } - break; - - case DPSYS_DESTROYPLAYERORGROUP: - { - LPSHIP lpShip; - LPDPMSG_DESTROYPLAYERORGROUP lpDestroyMsg = (LPDPMSG_DESTROYPLAYERORGROUP) lpMsg; - - if ((sizeof(SHIP) != lpDestroyMsg->dwLocalDataSize) || - (NULL == lpDestroyMsg->lpLocalData)) - break; - - lpShip = lpDestroyMsg->lpLocalData; - ReleasePlayerLocalSoundData(lpShip); - } - break; - - case DPSYS_HOST: - { - gbIsHost = TRUE; - UpdateTitle(); - } - - break; - - case DPSYS_SESSIONLOST: - // inform user that session was lost - ShowError(IDS_DPLAY_ERROR_SL); - gbSessionLost = TRUE; - break; - } -} - -/* - * DoApplicationMessage - * - * Evaluates an application message and performs appropriate actions - */ -void DoApplicationMessage( LPGENERICMSG lpMsg, DWORD dwMsgSize, DPID idFrom, DPID idTo ) -{ - HRESULT hr; - - switch( lpMsg->byType ) - { - case MSG_HOST: - { - LPHOSTMSG lpHost; - - if( !gbIsHost ) - { - lpHost = (LPHOSTMSG) lpMsg; - // receive the field layout - gBlocks = lpHost->Blocks; - - // have host initializtion at this point - gbHaveHostInit = TRUE; - - // start updating screen - gbIsActive = TRUE; - } - } - break; - - case MSG_BLOCKHIT: - { - LPBLOCKHITMSG lpBlockHit; - - lpBlockHit = (LPBLOCKHITMSG) lpMsg; - gBlocks.bits[lpBlockHit->byRow][lpBlockHit->byCol] &= ~lpBlockHit->byMask; - } - break; - - case MSG_ADDBLOCK: - { - LPADDBLOCKMSG lpAddBlock; - - lpAddBlock = (LPADDBLOCKMSG) lpMsg; - setBlock( lpAddBlock->byX, lpAddBlock->byY); - } - break; - - case MSG_SHIPHIT: - { - LPSHIPHITMSG lpShipHit = (LPSHIPHITMSG) lpMsg; - SHIP ship; - DWORD dwSize; - - dwSize = sizeof(SHIP); - // get player local data - hr = DPlayGetPlayerData(lpShipHit->Id, &ship, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - return; - - // no player data yet - if (0 == dwSize) - return; - - if (!ship.bIgnore) - { - // explode the ship on our screen - DestroyShip(&ship); - - // turn it off - ship.bEnable = FALSE; - ship.bBulletEnable = FALSE; - - // if it is us - if (lpShipHit->Id == gOurID) - { - // set our hide time-out - ship.iCountDown = HIDE_TIMEOUT; - ship.dwLastTick = timeGetTime(); - // let the world know that we are dead - gShipHitMsg.Id = gOurID; - SendGameMessage((LPGENERICMSG) &gShipHitMsg, DPID_ALLPLAYERS); - } - } - // update player local data - DPlaySetPlayerData(lpShipHit->Id, &ship, sizeof(ship), DPSET_LOCAL); - } - break; - - case MSG_CONTROL: - { - LPCONTROLMSG lpControlMsg; - SHIP ship; - DWORD dwSize; - - lpControlMsg = (LPCONTROLMSG) lpMsg; - dwSize = sizeof(SHIP); - // get player local data - hr = DPlayGetPlayerData(idFrom, &ship, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - return; - - // no player data yet - if (0 == dwSize) - return; - - // update its State - UpdateState(&ship, (DWORD)lpControlMsg->byState); - - // save it back - DPlaySetPlayerData(idFrom, &ship, dwSize, DPSET_LOCAL); - } - break; - - case MSG_SYNC: - { - LPSYNCMSG lpSyncMsg; - SHIP ship; - DWORD dwSize; - - lpSyncMsg = (LPSYNCMSG) lpMsg; - dwSize = sizeof(SHIP); - // get player local data - hr = DPlayGetPlayerData(idFrom, &ship, &dwSize, DPGET_LOCAL); - if (FAILED(hr)) - return; - - // we are seeing this player for the first time - // so do the initialization - if (0 == dwSize) - { - ZeroMemory(&ship, sizeof(ship)); - - // initialize sound buffers - InitPlayerLocalSoundData(&ship); - - ship.byType = lpSyncMsg->byShipType; - ship.dPosX = lpSyncMsg->dPosX; - ship.dPosY = lpSyncMsg->dPosY; - ship.cFrame = lpSyncMsg->cFrame; - ship.dwLastTick = timeGetTime(); - ship.bEnable = TRUE; - } - - if (ship.bEnable) - { - // head towards rendezvous location (accelerate/decelerate as necessary) - ship.dVelX = (lpSyncMsg->dPosX - ship.dPosX)/1000; - ship.dVelY = (lpSyncMsg->dPosY - ship.dPosY)/1000; - ship.cFrame = lpSyncMsg->cFrame; - } - else if (!ship.bIgnore) - // Ship is alive, but we just don't know it. - // So, display it at the rendezvous location. - { - ship.dPosX = lpSyncMsg->dPosX; - ship.dPosY = lpSyncMsg->dPosY; - ship.cFrame = lpSyncMsg->cFrame; - ship.dwLastTick = timeGetTime(); - ship.bEnable = TRUE; - } - - // save it back - DPlaySetPlayerData(idFrom, &ship, sizeof(ship), DPSET_LOCAL); - } - break; - - default: - { - wsprintf(gDebugBuff, TEXT("Unknown message type %d\n"), lpMsg->byType); - DEBUG_OUT( gDebugBuff ); - } - break; - } -} - -/* - * SendGameMessage - * - * Sends a message to specified player(s) - */ -void SendGameMessage( LPGENERICMSG lpMsg, DPID idTo ) -{ - int nBytes; - DWORD dwFlags = 0; - - if (gbSessionLost) - { - // no sends when we are not in the session - return; - } - - switch( lpMsg->byType ) - { - case MSG_HOST: - nBytes = sizeof( HOSTMSG ); - dwFlags = DPSEND_GUARANTEED; - break; - - case MSG_BLOCKHIT: - nBytes = sizeof( BLOCKHITMSG ); - break; - - case MSG_SHIPHIT: - nBytes = sizeof( SHIPHITMSG ); - break; - - case MSG_ADDBLOCK: - nBytes = sizeof( ADDBLOCKMSG ); - break; - - case MSG_CONTROL: - nBytes = sizeof( CONTROLMSG ); - break; - - case MSG_SYNC: - nBytes = sizeof( SYNCMSG ); - break; - - default: - return; - } - - if (gbReliable) - { - dwFlags = DPSEND_GUARANTEED; - } - - // Send the message to the relevant player(s) - DPlaySend(gOurID, idTo, dwFlags, (LPVOID)lpMsg, nBytes); -} - -/* - * CleanupComm - * - * Cleans up communication stuff - */ -void CleanupComm(void) -{ - HRESULT hr; - - //free up all the local sound buffers - ReleaseLocalData(); - - // free the receive buffer - if (glpvReceiveBuffer) - { - GlobalFreePtr(glpvReceiveBuffer); - glpvReceiveBuffer = NULL; - } - - // delete our player - if( gOurID ) - { - hr = DPlayDestroyPlayer(gOurID); - if (FAILED(hr)) - { - ShowError(IDS_DPLAY_ERROR_DP); - } - gOurID = 0; - } - - // cleanup directplay objects - hr = DPlayClose(); - hr = DPlayRelease(); -} - diff --git a/sdk/samples/duel/gameproc.h b/sdk/samples/duel/gameproc.h deleted file mode 100644 index 0867a26..0000000 --- a/sdk/samples/duel/gameproc.h +++ /dev/null @@ -1,214 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: gameproc.h - * Content: game processing info. include file - * - * - ***************************************************************************/ -#define IDIRECTPLAY2_OR_GREATER -#include -#include -#include -#include "sfx.h" -#include "duel.h" - -// align on single byte boundaries -// this is a stop-gap measure until the structures can be re-arranged. -#pragma pack(1) - -#define MAX_SHIP_X (MAX_SCREEN_X - 32) -#define MAX_SHIP_Y (MAX_SCREEN_Y - 32) -#define MAX_SHIP_FRAME 40 -#define MAX_BULLET_X (MAX_SCREEN_X - 3) -#define MAX_BULLET_Y (MAX_SCREEN_Y - 3) -#define MAX_BULLET_FRAME 400 - -#define NUM_SHIP_TYPES 4 - -#define DEF_SHOW_DELAY (2000) -#define MAX_BUFFER_SIZE 256 - -#define UPDATE_INTERVAL 40 // interval between position updates in milliseconds (25 FPS) -#define SYNC_INTERVAL 1000 // synchronize once every second -#define HIDE_TIMEOUT 5000 // time for which a ship is disabled after a hit - -/* - * keyboard commands - */ - -#define KEY_STOP 0x00000001l -#define KEY_DOWN 0x00000002l -#define KEY_LEFT 0x00000004l -#define KEY_RIGHT 0x00000008l -#define KEY_UP 0x00000010l -#define KEY_FIRE 0x00000020l -#define KEY_ENGINEOFF 0x00000040l - -/* - * Offsets for the bullet bitmap - */ - -#define BULLET_X 304 -#define BULLET_Y 0 - -typedef struct _frag -{ - double dPosX; - double dPosY; - LPDIRECTDRAWSURFACE surf; - RECT src; - double dVelX; - double dVelY; - BOOL valid; -} FRAG, *LPFRAG; - -/* - * structures - */ - -typedef struct _SHIP -{ - double dPosX, dPosY; // ship x and y position - double dBulletPosX, dBulletPosY; // bullet x and y position - DWORD dwBulletFrame; // bullet frame - char cFrame; // current ship frame - BYTE byType; // ship type - BOOL bEnable; // is this ship active? - BOOL bBulletEnable; // Is there an active bullet? - - double dVelX, dVelY; // ship x and y velocity (pixels/millisecond) - double dBulletVelX, dBulletVelY; // bullet x and y velocity (pixels/millisecond) - DWORD dwScore; // current score - DWORD dwLastTick; // most recent time stamp - BOOL bIgnore; // flag used to synchronize ship explosions - int iCountDown; // enable time-out - DWORD dwFrameCount; // number of frames since beginning of time - /* DSOUND members */ - LPDIRECTSOUNDBUFFER lpDirectSoundBuffer [MAX_SOUNDS]; // SoundBuffer interface - LPDIRECTSOUND3DBUFFER lpDirectSound3DBuffer[MAX_SOUNDS]; // 3D interface (to same buffer) - DWORD dwKeys; // the keyboard state - BOOL bEngineRunning; // These BOOLs keep track of the ship's - BOOL bMoving; // last condition so we can play sounds - BOOL bBounced; // when they change - BOOL bBlockHit; - BOOL bDeath; - BOOL bFiring; - /* DSOUND members */ - -} SHIP, *LPSHIP; - -typedef struct _BLOCKS -{ - BYTE bits[30][5]; -} BLOCKS, *LPBLOCKS; - -//---------------------------------------------------------- -// communication packet structures -//---------------------------------------------------------- -#define MSG_HOST 0x11 // message containing field layout, sent by host -#define MSG_BLOCKHIT 0x22 // block hit message -#define MSG_SHIPHIT 0x33 // ship hit message -#define MSG_ADDBLOCK 0x44 // add block message -#define MSG_CONTROL 0x55 // game keys message -#define MSG_SYNC 0x66 // synchronization message containing the rendezvous location - -typedef struct _GENERICMSG -{ - BYTE byType; -} GENERICMSG, *LPGENERICMSG; - -typedef struct _HOSTMSG -{ - BYTE byType; - BLOCKS Blocks; -} HOSTMSG, *LPHOSTMSG; - -typedef struct _BLOCKHITMSG -{ - BYTE byType; - BYTE byRow; - BYTE byCol; - BYTE byMask; -} BLOCKHITMSG, *LPBLOCKHITMSG; - -typedef struct _SHIPHITMSG -{ - BYTE byType; - DPID Id; -} SHIPHITMSG, *LPSHIPHITMSG; - -typedef struct _ADDBLOCKMSG -{ - BYTE byType; - BYTE byX; - BYTE byY; -} ADDBLOCKMSG, *LPADDBLOCKMSG; - -typedef struct _CONTROLMSG -{ - BYTE byType; - BYTE byState; -} CONTROLMSG, *LPCONTROLMSG; - -typedef struct _SYNCMSG -{ - BYTE byType; - BYTE byShipType; // this is needed only when sends are unreliable - char cFrame; - double dPosX; - double dPosY; -} SYNCMSG, *LPSYNCMSG; - -/* - * Prototypes - */ -void LaunchGame(void); -void ExitGame(void); -HRESULT InitOurShip(void); - -HRESULT InitLocalSoundData(void); -void InitPlayerLocalSoundData(LPSHIP lpShip); -BOOL WINAPI SetPlayerLocalSoundDataCB(DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext); - -void ReleaseLocalData(void); -void ReleasePlayerLocalSoundData(LPSHIP lpShip); -BOOL WINAPI ReleasePlayerLocalDataCB(DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext); - -void UpdateState(LPSHIP lpShip, DWORD dwControls); -void SendSync(LPSHIP lpShip); -void UpdateDisplayStatus(LPSHIP lpShip); -void UpdatePosition( DPID dpId, LPSHIP ship ); -BOOL IsHit( int x, int y ); -void InitField(void); -BOOL setBlock( int x, int y ); -void AddFrag(LPSHIP lpShip, int offX, int offY); -void UpdateFragment(int i); -void DestroyShip( LPSHIP lpShip); -void DestroyGame( void ); -BOOL UpdateFrame( void ); - -void ProcessSoundFlags(LPSHIP lpShip); -BOOL WINAPI RenderPlayerCB(DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext); -BOOL DrawScreen( void ); -BOOL DrawScore( void ); -void DrawShip( LPSHIP lpShip ); -void DrawBlock( int x, int y ); -void DrawBullet( LPSHIP lpShip ); -void DrawFragments( void ); -void DisplayFrameRate( void ); - -void GetConnection(void); -HRESULT ReceiveMessages( void ); -void DoSystemMessage( LPDPMSG_GENERIC lpMsg, DWORD dwMsgSize, DPID idFrom, DPID idTo ); -void DoApplicationMessage( LPGENERICMSG lpMsg, DWORD dwMsgSize, DPID idFrom, DPID idTo ); -void SendGameMessage( LPGENERICMSG lpMsg, DPID idTo ); -void CleanupComm(void); - - -// restore default alignment -#pragma pack() diff --git a/sdk/samples/duel/gfx.c b/sdk/samples/duel/gfx.c deleted file mode 100644 index c51b22e..0000000 --- a/sdk/samples/duel/gfx.c +++ /dev/null @@ -1,564 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: gfx.c - * Content: DirectDraw related code. - * - * - ***************************************************************************/ -#include "gfx.h" -#include "input.h" -#include "ddutil.h" - -/* - * Externals - */ -extern BOOL gbUseEmulation; // user DDHEL or DDHAL ? -extern BOOL gbFullscreen; // window or fullscreen mode ? -extern HWND ghWndMain; // main window -extern DWORD gdwKeys; -extern int gnProgramState; // current state of program (rest, splash, active, etc.) -extern RECT grcWindow; // client window rectangle -extern BOOL gbFullscreen; // fullscreen or window mode ? -extern HINSTANCE ghinst; // application instance handle -extern TCHAR gtszClassName[]; // Duel's class name - - -/* - * Globals - */ -LPDIRECTDRAWSURFACE glpFrontBuffer; // primary surface -LPDIRECTDRAWSURFACE glpBackBuffer; // back buffer for animation -LPDIRECTDRAWSURFACE glpSplash; // splash screen -LPDIRECTDRAWSURFACE glpShip0; // ship bitmaps -LPDIRECTDRAWSURFACE glpShip1; -LPDIRECTDRAWSURFACE glpShip2; -LPDIRECTDRAWSURFACE glpShip3; -LPDIRECTDRAWSURFACE glpNum; // Numbers bitmap -LPDIRECTDRAW glpDD; // DirectDraw interface -LPDIRECTDRAWPALETTE glpArtPalette=NULL; // Game screen palette -LPDIRECTDRAWPALETTE glpSplashPalette=NULL; // Splash screen palette -LPDIRECTDRAWCLIPPER glpClipper=NULL; // Clipper for front buffer -DWORD gdwFillColor; -int gnGameBPP; // primary surface bit depth -#ifdef DEBUG -BOOL gbHELBlt = FALSE; -#endif - -BOOL InitGraphics( void ) -{ - DDCAPS ddcaps; - HRESULT ddrval; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - TCHAR tszTitle[MAX_WINDOWTITLE]; - - LoadString(ghinst, IDS_DUEL_TITLE, tszTitle, MAX_WINDOWTITLE); - - // Create a window - ghWndMain = CreateWindowEx( - WS_EX_APPWINDOW, // WS_EX_TOPMOST, - gtszClassName, - tszTitle, - // don't show the window yet - WS_POPUP | // non-app window POPUP - WS_SYSMENU, // so we get an icon in the tray - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - ghinst, - NULL ); - - if( !ghWndMain ) - { - return FALSE; - } - - UpdateWindow( ghWndMain ); - SetFocus( ghWndMain ); - - // ddraw stuff begins here - if( gbUseEmulation ) - ddrval = DirectDrawCreate( (LPVOID) DDCREATE_EMULATIONONLY, &glpDD, NULL ); - else - ddrval = DirectDrawCreate( NULL, &glpDD, NULL ); - - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_DDC); - - // set access mode based on fullscreen/window - if (gbFullscreen) - { - ddrval = glpDD->lpVtbl->SetCooperativeLevel( glpDD, ghWndMain, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - } - else - { - ddrval = glpDD->lpVtbl->SetCooperativeLevel( glpDD, ghWndMain, - DDSCL_NORMAL); - } - - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_SCL); - - if (gbFullscreen) - { - // set the mode to 640 by 480 by 8 - ddrval = glpDD->lpVtbl->SetDisplayMode( glpDD, 640, 480, 8 ); - - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_SDM); - } - else - { - RECT rcWork; - RECT rc; - HDC hdc; - DWORD dwStyle; - - // - // when in rome (I mean when in windows) we should use the - // current mode - // - hdc = GetDC(NULL); - gnGameBPP = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(NULL, hdc); - - // - // if we are still a WS_POPUP window we should convert to a - // normal app window so we look like a windows app. - // - dwStyle = GetWindowStyle(ghWndMain); - dwStyle &= ~WS_POPUP; - dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX; - SetWindowLong(ghWndMain, GWL_STYLE, dwStyle); - - // set window size - SetRect(&rc, 0, 0, MAX_DEFWIN_X, MAX_DEFWIN_Y); - - AdjustWindowRectEx(&rc, - GetWindowStyle(ghWndMain), - GetMenu(ghWndMain) != NULL, - GetWindowExStyle(ghWndMain)); - - SetWindowPos(ghWndMain, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - - SetWindowPos(ghWndMain, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); - - // - // make sure our window does not hang outside of the work area - // this will make people who have the tray on the top or left - // happy. - // - SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0); - GetWindowRect(ghWndMain, &rc); - if (rc.left < rcWork.left) rc.left = rcWork.left; - if (rc.top < rcWork.top) rc.top = rcWork.top; - SetWindowPos(ghWndMain, NULL, rc.left, rc.top, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - } - - // check the color key hardware capabilities - ddcaps.dwSize = sizeof( ddcaps ); - - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - - if (gbFullscreen) - { - // Create surfaces - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpFrontBuffer, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSFB); - - // get a pointer to the back buffer - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = glpFrontBuffer->lpVtbl->GetAttachedSurface( - glpFrontBuffer, - &ddscaps, - &glpBackBuffer ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_GAS); - } - else - { - // window case, create the primary surface - // and create a backbuffer in offscreen memory - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpFrontBuffer, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSFB); - - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - - ddsd.dwWidth = MAX_DEFWIN_X; - ddsd.dwHeight = MAX_DEFWIN_Y; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpBackBuffer, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSBB); - - ddrval = glpDD->lpVtbl->CreateClipper(glpDD, 0, &glpClipper, NULL); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CC); - - ddrval = glpClipper->lpVtbl->SetHWnd(glpClipper, 0, ghWndMain); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_SH); - - ddrval = glpFrontBuffer->lpVtbl->SetClipper(glpFrontBuffer, glpClipper); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_SC); - } - - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; -#ifdef DEBUG - if( gbHELBlt ) - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; -#endif - - ddsd.dwWidth = 320; - ddsd.dwHeight = 128; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpShip0, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSS0); - - ddsd.dwWidth = 320; - ddsd.dwHeight = 128; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpShip1, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSS1); - - ddsd.dwWidth = 320; - ddsd.dwHeight = 128; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpShip2, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSS2); - - ddsd.dwWidth = 320; - ddsd.dwHeight = 128; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpShip3, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSS3); - - ddsd.dwHeight = 16; - ddrval = glpDD->lpVtbl->CreateSurface( glpDD, &ddsd, &glpNum, NULL ); - if( ddrval != DD_OK ) - return ShowError(IDS_DDRAW_ERROR_CSN); - - if( !RestoreSurfaces() ) - return ShowError(IDS_DDRAW_ERROR_RS); - - gdwKeys = 0; - ShowWindow(ghWndMain, SW_SHOW); - return TRUE; -} - -void CleanupGraphics(void) -{ - if( glpShip0 != NULL ) - glpShip0->lpVtbl->Release( glpShip0 ); - - if( glpShip1 != NULL ) - glpShip1->lpVtbl->Release( glpShip1 ); - - if( glpShip2 != NULL ) - glpShip2->lpVtbl->Release( glpShip2 ); - - if( glpShip3 != NULL ) - glpShip3->lpVtbl->Release( glpShip3 ); - - if( glpNum != NULL ) - glpNum->lpVtbl->Release( glpNum ); - - if (!gbFullscreen && glpClipper) - glpClipper->lpVtbl->Release( glpClipper ); - - if( glpFrontBuffer != NULL ) - glpFrontBuffer->lpVtbl->Release( glpFrontBuffer ); - - if( glpArtPalette != NULL ) - glpArtPalette->lpVtbl->Release( glpArtPalette ); - - if( glpSplashPalette != NULL ) - glpSplashPalette->lpVtbl->Release( glpSplashPalette ); - - if( !gbFullscreen && (glpBackBuffer != NULL )) - glpBackBuffer->lpVtbl->Release( glpBackBuffer ); - - if( glpDD != NULL ) - glpDD->lpVtbl->Release( glpDD ); -} - -void bltSplash( LPRECT rc) -{ - HRESULT ddrval; - HBITMAP hbm; - - if( ( glpFrontBuffer == NULL ) || - ( glpSplashPalette == NULL ) || - ( glpBackBuffer == NULL ) ) - { - return; - } - - // set the palette before loading the splash screen - glpFrontBuffer->lpVtbl->SetPalette( glpFrontBuffer, glpSplashPalette ); - - hbm = (HBITMAP)LoadImage( GetModuleHandle( NULL ), TEXT("SPLASH"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - if ( NULL == hbm ) - return; - - // if the surface is lost, DDCopyBitmap will fail and the surface will - // be restored below. - ddrval = DDCopyBitmap( glpBackBuffer, hbm, 0, 0, 0, 0 ); - - DeleteObject( hbm ); - - while( 1 ) - { - if( NULL == rc) - { - ddrval = glpFrontBuffer->lpVtbl->Blt( glpFrontBuffer, - &grcWindow, glpBackBuffer, NULL, DDBLT_WAIT, NULL); - } - else - { - ddrval = glpFrontBuffer->lpVtbl->Blt( glpFrontBuffer, - &grcWindow, glpBackBuffer, rc, DDBLT_WAIT, NULL); - } - - if( ddrval == DD_OK ) - return; - if( ddrval == DDERR_SURFACELOST ) - if( !RestoreSurfaces() ) - return; - if( ddrval != DDERR_WASSTILLDRAWING ) - return; - } -} - -void bltScore( char *num, int x, int y ) -{ - char *c; - RECT src; - int i; - - for(c=num; *c != '\0'; c++) - { - i = *c - '0'; - src.left = i*16; - src.top = 0; - src.right = src.left + 16; - src.bottom = src.top + 16; - bltObject( x, y, glpNum, &src, DDBLTFAST_SRCCOLORKEY ); - x += 16; - } -} - -void bltObject( int x, int y, LPDIRECTDRAWSURFACE surf, LPRECT src, DWORD flags ) -{ - HRESULT ddrval; - - while( 1 ) - { - ddrval = glpBackBuffer->lpVtbl->BltFast( glpBackBuffer, x, y, surf, src, flags ); - if( ddrval == DD_OK ) - return; - if( ddrval == DDERR_SURFACELOST ) - if( !RestoreSurfaces() ) - return; - if( ddrval != DDERR_WASSTILLDRAWING ) - return; - } -} - -void EraseScreen( void ) -{ - DDBLTFX ddbltfx; - HRESULT ddrval; - - // Erase the background - ddbltfx.dwSize = sizeof( ddbltfx ); - ddbltfx.dwFillColor = gdwFillColor; - while( 1 ) - { - ddrval = glpBackBuffer->lpVtbl->Blt( glpBackBuffer, NULL, NULL, - NULL, DDBLT_COLORFILL, &ddbltfx ); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if( !RestoreSurfaces() ) - return; - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } -} - -void FlipScreen( void ) -{ - HRESULT ddrval; - - // Flip the surfaces - if (gbFullscreen) - { - while( 1 ) - { - ddrval = glpFrontBuffer->lpVtbl->Flip( glpFrontBuffer, NULL, 0 ); - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if( !RestoreSurfaces() ) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - break; - } - } - } - else - { - ddrval = IDirectDrawSurface_Blt( - glpFrontBuffer, // dest surface - &grcWindow, // dest rect - glpBackBuffer, // src surface - NULL, // src rect (all of it) - DDBLT_WAIT, - NULL); - } -} - -BOOL RestoreSurfaces( void ) -{ - HRESULT ddrval; - HBITMAP hbm; - - ddrval = glpFrontBuffer->lpVtbl->Restore(glpFrontBuffer); - if( ddrval != DD_OK ) - return FALSE; - ddrval = glpBackBuffer->lpVtbl->Restore(glpBackBuffer); - if( ddrval != DD_OK ) - return FALSE; - ddrval = glpShip0->lpVtbl->Restore(glpShip0); - if( ddrval != DD_OK ) - return FALSE; - ddrval = glpShip1->lpVtbl->Restore(glpShip1); - if( ddrval != DD_OK ) - return FALSE; - ddrval = glpShip2->lpVtbl->Restore(glpShip2); - if( ddrval != DD_OK ) - return FALSE; - ddrval = glpShip3->lpVtbl->Restore(glpShip3); - if( ddrval != DD_OK ) - return FALSE; - ddrval = glpNum->lpVtbl->Restore(glpNum); - if( ddrval != DD_OK ) - return FALSE; - - // Create and set the palette for the splash bitmap - glpSplashPalette = DDLoadPalette( glpDD, TEXT("SPLASH") ); - if( NULL == glpSplashPalette ) - return FALSE; - - // Create and set the palette for the art bitmap - glpArtPalette = DDLoadPalette( glpDD, TEXT("Duel8") ); - if( NULL == glpArtPalette ) - return FALSE; - - // set the palette before loading the art - glpFrontBuffer->lpVtbl->SetPalette( glpFrontBuffer, glpArtPalette ); - - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), TEXT("Duel8"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); - - if( NULL == hbm ) - return FALSE; - - ddrval = DDCopyBitmap( glpShip0, hbm, 0, 0, 320, 128 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - ddrval = DDCopyBitmap( glpShip1, hbm, 0, 128, 320, 128 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - ddrval = DDCopyBitmap( glpShip2, hbm, 0, 256, 320, 128 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - ddrval = DDCopyBitmap( glpShip3, hbm, 0, 384, 320, 128 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - ddrval = DDCopyBitmap( glpNum, hbm, 0, 512, 320, 16 ); - if( ddrval != DD_OK ) - { - DeleteObject( hbm ); - return FALSE; - } - - DeleteObject( hbm ); - - // set colorfill colors and color gdwKeys according to bitmap contents - gdwFillColor = DDColorMatch( glpShip0, CLR_INVALID ); - - DDSetColorKey( glpShip0, CLR_INVALID ); - DDSetColorKey( glpShip1, CLR_INVALID ); - DDSetColorKey( glpShip2, CLR_INVALID ); - DDSetColorKey( glpShip3, CLR_INVALID ); - DDSetColorKey( glpNum, CLR_INVALID ); - - return TRUE; -} - -void SetGamePalette(void) -{ - if (glpFrontBuffer) - glpFrontBuffer->lpVtbl->SetPalette( glpFrontBuffer, glpArtPalette ); -} - -void FlipToGDI(void) -{ - if (glpDD) - glpDD->lpVtbl->FlipToGDISurface( glpDD ); -} - - diff --git a/sdk/samples/duel/gfx.h b/sdk/samples/duel/gfx.h deleted file mode 100644 index 8391847..0000000 --- a/sdk/samples/duel/gfx.h +++ /dev/null @@ -1,26 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: gfx.h - * Content: graphics routines include file - * - * - ***************************************************************************/ -#include "duel.h" -#include "ddraw.h" - -/* - * Prototypes - */ -BOOL InitGraphics( void ); -void CleanupGraphics(void); -void bltSplash( LPRECT ); -void bltScore( char *num, int x, int y ); -void bltObject( int x, int y, LPDIRECTDRAWSURFACE surf, LPRECT src, DWORD flags ); -void EraseScreen( void ); -void FlipScreen( void ); -BOOL RestoreSurfaces( void ); -void SetGamePalette(void); -void FlipToGDI(void); - diff --git a/sdk/samples/duel/input.c b/sdk/samples/duel/input.c deleted file mode 100644 index c3d6b38..0000000 --- a/sdk/samples/duel/input.c +++ /dev/null @@ -1,198 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: input.c - * Content: DirectInput functionality for Multi-player duel - * - * - ***************************************************************************/ - - -#include "input.h" -#include "gameproc.h" - -extern HINSTANCE ghinst; // program instance -extern HWND ghWndMain; // app window handle - -static LPDIRECTINPUT lpdi; // DirectInput interface -static LPDIRECTINPUTDEVICE lpdiKeyboard; // keyboard device interface -static BOOL fKeybdAcquired; // has the keyboard been acquired? - -extern DWORD gdwKeys; // gameplay keys - -/* -* -* InitInput -* -* Initialize DirectInput objects & devices -* -*/ -BOOL InitInput(void) -{ - GUID guid = GUID_SysKeyboard; - HRESULT hRes; - - // try to create di object - if(DirectInputCreate(ghinst, DIRECTINPUT_VERSION, &lpdi, NULL) != DI_OK) - { - ShowError(IDS_DINPUT_ERROR_DIC); - return FALSE; - } - - - // try to create keyboard device - if(lpdi->lpVtbl->CreateDevice(lpdi, &guid, &lpdiKeyboard, NULL) !=DI_OK) - { - ShowError(IDS_DINPUT_ERROR_CD); - return FALSE; - } - - // Tell DirectInput that we want to receive data in keyboard format - if (lpdiKeyboard->lpVtbl->SetDataFormat(lpdiKeyboard, &c_dfDIKeyboard) != DI_OK) - { - ShowError(IDS_DINPUT_ERROR_DF); - return FALSE; - } - - // set cooperative level - if(lpdiKeyboard->lpVtbl->SetCooperativeLevel(lpdiKeyboard, ghWndMain, - DISCL_NONEXCLUSIVE | DISCL_FOREGROUND) != DI_OK) - { - ShowError(IDS_DINPUT_ERROR_SP); - return FALSE; - } - - // try to acquire the keyboard - hRes = lpdiKeyboard->lpVtbl->Acquire(lpdiKeyboard); - if(SUCCEEDED(hRes)) - { - // keyboard was acquired - fKeybdAcquired = TRUE; - } - else - { - // keyboard was NOT acquired - fKeybdAcquired = FALSE; - } - - // if we get here, all objects were created successfully - return TRUE; - -} - - -/* -* -* DI_ReadKeys -* -* Use DirectInput to read game-play keys -* -*/ -void DI_ReadKeys(void) -{ - BYTE rgbKeybd[256]; - HRESULT hRes; - - hRes = lpdiKeyboard->lpVtbl->GetDeviceState(lpdiKeyboard, sizeof(rgbKeybd), rgbKeybd); - if(hRes != DI_OK) - { - if(hRes == DIERR_INPUTLOST) - { - // we lost control of the keyboard, reacquire - fKeybdAcquired = FALSE; - if(SUCCEEDED(lpdiKeyboard->lpVtbl->Acquire(lpdiKeyboard))) - { - fKeybdAcquired = TRUE; - } - } - - // failed to read the keyboard, just return - return; - } - - // reset key states - gdwKeys = gdwKeys ^ gdwKeys; - - // check & update key states - if(rgbKeybd[DIK_NUMPAD5] & 0x80) - gdwKeys |= KEY_STOP; - - if((rgbKeybd[DIK_NUMPAD2] & 0x80) || (rgbKeybd[DIK_DOWN] & 0x80)) - gdwKeys |= KEY_DOWN; - - if((rgbKeybd[DIK_NUMPAD4] & 0x80) || (rgbKeybd[DIK_LEFT] & 0x80)) - gdwKeys |= KEY_LEFT; - - if((rgbKeybd[DIK_NUMPAD6] & 0x80) || (rgbKeybd[DIK_RIGHT] & 0x80)) - gdwKeys |= KEY_RIGHT; - - if((rgbKeybd[DIK_NUMPAD8] & 0x80) || (rgbKeybd[DIK_UP] & 0x80)) - gdwKeys |= KEY_UP; - - if(rgbKeybd[DIK_SPACE] & 0x80) - gdwKeys |= KEY_FIRE; - -} - -/* -* -* CleanupInput -* -* Cleans up DirectInput objects -* -*/ -void CleanupInput(void) -{ - if(fKeybdAcquired) - { - lpdiKeyboard->lpVtbl->Unacquire(lpdiKeyboard); - fKeybdAcquired = FALSE; - } - - if(lpdiKeyboard != NULL) - lpdiKeyboard->lpVtbl->Release(lpdiKeyboard); - - if(lpdi!= NULL) - lpdi->lpVtbl->Release(lpdi); - -} - - -/* -* -* ReacquireInputDevices -* -* Reacquires DirectInput devices as needed -* -*/ -BOOL ReacquireInputDevices(void) -{ - // try to acquire the keyboard - if(lpdiKeyboard != NULL) - { - lpdiKeyboard->lpVtbl->Acquire(lpdiKeyboard); - } - else - { - // keyboard device has not been created. - fKeybdAcquired = FALSE; - return FALSE; - } - - // if we get here, we are acquired again - fKeybdAcquired = TRUE; - return TRUE; -} - - - - - - - - - - - - diff --git a/sdk/samples/duel/input.h b/sdk/samples/duel/input.h deleted file mode 100644 index 46692a9..0000000 --- a/sdk/samples/duel/input.h +++ /dev/null @@ -1,27 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: input.h - * Content: input routines include file - * - * - ***************************************************************************/ - -#ifndef _INPUT_H -#define _INPUT_H - -#include -#include "duel.h" - -BOOL InitInput(void); -BOOL CALLBACK DI_EnumDevProc(LPDIDEVICEINSTANCE lpdidi, LPVOID lpv); -void DI_ReadKeys(void); -void CleanupInput(void); -BOOL ReacquireInputDevices(void); - - -#endif // _INPUT_H - - - diff --git a/sdk/samples/duel/lboom.wav b/sdk/samples/duel/lboom.wav deleted file mode 100644 index 97cf0ca..0000000 Binary files a/sdk/samples/duel/lboom.wav and /dev/null differ diff --git a/sdk/samples/duel/lobby.c b/sdk/samples/duel/lobby.c deleted file mode 100644 index e533a72..0000000 --- a/sdk/samples/duel/lobby.c +++ /dev/null @@ -1,130 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: lobby.c - * Content: DirectPlayLobby related code - * - * - ***************************************************************************/ -#include "lobby.h" - -/* - * Externals - */ -extern LPDIRECTPLAY2 glpDP; // directplay object pointer - -/* - * Globals - */ -LPDPLCONNECTION glpdplConnection; // connection settings - -/* - * Statics - */ -static LPDIRECTPLAYLOBBY glpDPL; // lobby object pointer - - - -/* - * DPLobbyCreate - * - * Wrapper for DirectPlayLobby DirectPlayLobbyCreate API. - */ -HRESULT DPLobbyCreate(void) -{ - HRESULT hr=E_FAIL; - - hr = DirectPlayLobbyCreate(NULL, &glpDPL, NULL, NULL, 0); - - return hr; -} - -/* - * DPLobbyConnect - * - * Wrapper for DirectPlayLobby Connect API. - */ -HRESULT DPLobbyConnect(void) -{ - HRESULT hr=E_FAIL; - - hr = IDirectPlayLobby_Connect(glpDPL, 0, &glpDP, NULL) ; - - return hr; -} - -/* - * DPLobbyGetConnectionSettings - * - * Wrapper for DirectPlayLobby GetConnectionSettings API - */ -HRESULT DPLobbyGetConnectionSettings(void) -{ - HRESULT hr=E_FAIL; - DWORD dwSize; - - if (glpDPL) - { - // get size for the connection settings structure - hr = IDirectPlayLobby_GetConnectionSettings(glpDPL, 0, NULL, &dwSize); - if (DPERR_BUFFERTOOSMALL == hr) - { - // if we already have one, free it - if (glpdplConnection) - { - free(glpdplConnection); - glpdplConnection = NULL; - } - - // allocate memory for the new one - glpdplConnection = (LPDPLCONNECTION) malloc(dwSize); - - // get the connection settings - if (glpdplConnection) - hr = IDirectPlayLobby_GetConnectionSettings(glpDPL, 0, glpdplConnection, &dwSize); - } - } - - return hr; -} - -/* - * DPLobbyRelease - * - * Wrapper for DirectPlayLobby Release API - */ -HRESULT DPLobbyRelease(void) -{ - HRESULT hr=E_FAIL; - - // free our connection settings - if (glpdplConnection) - { - free(glpdplConnection); - glpdplConnection = NULL; - } - - // release the lobby object - if (glpDPL) - { - hr = IDirectPlayLobby_Release(glpDPL); - glpDPL = NULL; - } - return hr; -} - -/* - * DPLobbySetConnectionSettings - * - * Wrapper for DirectPlayLobby SetConnectionSettings API - */ -HRESULT DPLobbySetConnectionSettings(void) -{ - HRESULT hr=E_FAIL; - - hr = IDirectPlayLobby_SetConnectionSettings(glpDPL, 0, 0, glpdplConnection); - - return hr; -} - diff --git a/sdk/samples/duel/lobby.h b/sdk/samples/duel/lobby.h deleted file mode 100644 index 50eeefc..0000000 --- a/sdk/samples/duel/lobby.h +++ /dev/null @@ -1,25 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: lobby.h - * Content: lobby related routines include file - * - * - ***************************************************************************/ -#include -#include "duel.h" - -/* - * Prototypes - */ - -HRESULT DPLobbyCreate(void); -HRESULT DPLobbyConnect(void); -HRESULT DPLobbyGetConnectionSettings(void); -HRESULT DPLobbyRelease(void); -HRESULT DPLobbySetConnectionSettings(void); - - - - diff --git a/sdk/samples/duel/makefile b/sdk/samples/duel/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/duel/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/duel/msvc.mk b/sdk/samples/duel/msvc.mk deleted file mode 100644 index 7d7dcb3..0000000 --- a/sdk/samples/duel/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = duel -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib dplayx.lib\ - comdlg32.lib gdi32.lib winmm.lib libc.lib comctl32.lib dinput.lib \ - dsound.lib - -OBJS = duel.obj ddutil.obj util.obj wizard.obj gameproc.obj gfx.obj \ - comm.obj input.obj lobby.obj ds3dutil.obj sfx.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/duel/osession.bmp b/sdk/samples/duel/osession.bmp deleted file mode 100644 index dfe68d0..0000000 Binary files a/sdk/samples/duel/osession.bmp and /dev/null differ diff --git a/sdk/samples/duel/player.bmp b/sdk/samples/duel/player.bmp deleted file mode 100644 index babfc1a..0000000 Binary files a/sdk/samples/duel/player.bmp and /dev/null differ diff --git a/sdk/samples/duel/readme.txt b/sdk/samples/duel/readme.txt deleted file mode 100644 index 296cf07..0000000 --- a/sdk/samples/duel/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -Duel Sample Game ------------------- - -This program requires less than 1 Meg of video ram. - -The commands which this game recognizes are listed on the opening screen. - - ESC, F12 - Quit - NUMPAD 4 - Turn left - NUMPAD 6 - Turn right - NUMPAD 5 - Stop moving - NUMPAD 8 - Accelerate forward - NUMPAD 2 - Accelerate backward - SPACEBAR - Fire - ENTER - Starts game - F5 - toggle frame rate display - - -To play multiplayer one machine hosts a game, the others join. - -To play using TCP/IP over the Internet, the people who are joining the -game must enter the IP address of the machine that hosted the game. -You can find out the IP address of your machine by running "winipcfg". -If you have a net card and a modem installed, you will need to make -sure you read the IP address of the modem connection to the Internet. -The modem will show up as a "PPP Adapter". DirectPlay will not work -through proxies or firewalls. - -Also see the DPLAUNCH example. - - diff --git a/sdk/samples/duel/resource.h b/sdk/samples/duel/resource.h deleted file mode 100644 index 200d821..0000000 --- a/sdk/samples/duel/resource.h +++ /dev/null @@ -1,103 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by duel.rc -// -#define IDS_DDRAW_ERROR_DDC 1 -#define IDS_DDRAW_ERROR_SCL 2 -#define IDS_DDRAW_ERROR_SDM 3 -#define IDS_DDRAW_ERROR_CSFB 4 -#define IDS_DDRAW_ERROR_GAS 5 -#define IDS_DDRAW_ERROR_CC 6 -#define IDS_DDRAW_ERROR_SH 7 -#define IDS_DDRAW_ERROR_SC 8 -#define IDS_DDRAW_ERROR_CSS0 9 -#define IDS_DDRAW_ERROR_CSS1 10 -#define IDS_DDRAW_ERROR_CSS2 11 -#define IDS_DDRAW_ERROR_CSS3 12 -#define IDS_DDRAW_ERROR_CSN 13 -#define IDS_DDRAW_ERROR_RS 14 -#define IDS_DINPUT_ERROR_DIC 15 -#define IDS_DINPUT_ERROR_ED 16 -#define IDS_DINPUT_ERROR_CD 17 -#define IDS_DINPUT_ERROR_SP 18 -#define IDS_DINPUT_ERROR_A 19 -#define IDS_DPLAY_ERROR_CP 20 -#define IDS_DPLAY_ERROR_JS 21 -#define IDS_DPLAY_ERROR_CS 22 -#define IDS_DDRAW_ERROR_CSBB 23 -#define IDS_DUEL_CLASSNAME 24 -#define IDS_DUEL_MSG_UNKNOWN 25 -#define IDS_DUEL_ERROR_TITLE 26 -#define IDS_DUEL_TITLE 27 -#define IDS_WIZARD_FONTNAME 29 -#define IDS_WIZARD_TITLE_SP 30 -#define IDS_WIZARD_TITLE_GS 31 -#define IDS_WIZARD_TITLE_JS 32 -#define IDS_WIZARD_TITLE_HS 33 -#define IDS_WIZARD_TITLE 34 -#define IDS_DUEL_HELP 35 -#define IDS_DDUTIL_ERROR_LI 36 -#define IDS_DDUTIL_ERROR_DDCB 37 -#define IDS_DDUTIL_ERROR_CCDC 38 -#define IDS_WIZARD_ERROR_GSG 39 -#define IDS_DINPUT_ERROR_DF 40 -#define IDS_DPLAY_ERROR_IDC 41 -#define IDS_DSOUND_LOADWAVES 42 -#define IDS_DSOUND_DUPBUF 43 -#define IDS_DPLAY_ERROR_SL 44 -#define IDS_DPLAY_ERROR_GPLD 45 -#define IDS_DPLAY_ERROR_SPLD 46 -#define IDS_DPLAY_ERROR_GPRD 47 -#define IDS_DPLAY_ERROR_SPRD 48 -#define IDS_DPLAY_ERROR_GSD 49 -#define IDS_DPLAY_ERROR_EP 50 -#define IDS_DPLAY_ERROR_ES 51 -#define IDS_DUEL_ERROR_CRT 52 -#define IDS_DPLAY_ERROR_C 52 -#define IDS_DUEL_ERROR_CRE 53 -#define IDS_DPLAY_ERROR_R 53 -#define IDS_DPLAY_ERROR_DP 54 -#define IDS_DPLOBBY_ERROR_R 55 -#define IDS_DPLOBBY_ERROR_GC 56 -#define IDS_DPLOBBY_ERROR_GCS 56 -#define IDS_DPLOBBY_ERROR_SCS 57 -#define IDS_DPLOBBY_ERROR_C 58 -#define IDS_DPLOBBY_ERROR_CONNECT 59 -#define IDS_DUEL_HOST_TITLE 60 -#define IDS_DUEL_HOST_RELIABLE_TITLE 61 -#define IDS_DUEL_RELIABLE_TITLE 62 -#define IDB_OPEN_SESSION 101 -#define IDB_CLOSED_SESSION 102 -#define IDB_PLAYER 103 -#define DUEL_ICON 104 -#define IDD_GAMESETUP 108 -#define IDD_CONNECT_STATUS 114 -#define IDD_CHOOSEPROVIDER 129 -#define IDD_JOINSESSION 130 -#define IDD_HOSTSESSION 131 -#define IDC_HOST_PLAYERNAME 1001 -#define IDC_SP_TITLE 1003 -#define IDC_GAMESETUP_TITLE 1004 -#define IDC_HOST_TITLE 1005 -#define IDC_HOST_SESSION_TITLE 1006 -#define IDC_HOST_PLAYER_TITLE 1007 -#define IDC_JOIN_SESSION_TITLE 1008 -#define IDC_JOIN_PLAYER_TITLE 1009 -#define IDC_DUEL_STATUSTEXT 1010 -#define IDC_SERVICEPROVIDERS 1021 -#define IDC_JOIN_SESSION 1024 -#define IDC_HOST_SESSIONNAME 1025 -#define IDC_JOIN_PLAYERNAME 1026 -#define IDC_HOSTSESSION 1027 -#define IDC_JOINSESSION 1028 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 115 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1011 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/duel/sboom.wav b/sdk/samples/duel/sboom.wav deleted file mode 100644 index a3e2ac4..0000000 Binary files a/sdk/samples/duel/sboom.wav and /dev/null differ diff --git a/sdk/samples/duel/sbounce.wav b/sdk/samples/duel/sbounce.wav deleted file mode 100644 index 8b651e0..0000000 Binary files a/sdk/samples/duel/sbounce.wav and /dev/null differ diff --git a/sdk/samples/duel/sengine.wav b/sdk/samples/duel/sengine.wav deleted file mode 100644 index 7e56b2a..0000000 Binary files a/sdk/samples/duel/sengine.wav and /dev/null differ diff --git a/sdk/samples/duel/sfx.c b/sdk/samples/duel/sfx.c deleted file mode 100644 index e0e7589..0000000 --- a/sdk/samples/duel/sfx.c +++ /dev/null @@ -1,209 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: sfx.c - * Content: Routines - * - * - ***************************************************************************/ -#include "resource.h" -#include "duel.h" -#include "ds3dutil.h" -#include "sfx.h" - -/***************************** EXTERNALS ***************************/ -extern HWND ghWndMain; - -/******************************* GLOBAL VARIABLES ***************************/ -LPDIRECTSOUND glpDirectSound; -LPDIRECTSOUND3DLISTENER glpDirectSound3DListener; -LPDIRECTSOUNDBUFFER glpPrimaryBuffer; -LPWAVEDATA gSoundEffect[MAX_SOUNDS]; - -_TCHAR *szResourceName[MAX_SOUNDS] = -{_T("BFIRE"), //Bullet Firing - _T("SBOOM"), //Ship Exploding - _T("SENGINE"),//Ship Engine - _T("SSTART"), //Starting Engine - _T("SSTOP"), //Stopping Engine (key 5) - _T("SBOUNCE"),//Bouncing off a block or window edge - _T("LBOOM")}; //Block destruction - -BOOL gbSoundInitialized = FALSE; //did the sound engine initialize or not? - -/***************************** FUNCTION PROTOTYPES **************************/ -BOOL Init_Sounds(void); -void Free_Sounds(void); -BOOL Init_Globals(void); -void Free_Globals(void); - -/**************************************************************************** -FUNCTION: InitSfx - - -PURPOSE: Initializes global variables, then loads the gSoundEffect "objects" - with sound data. This should always return TRUE. If for some reason - sound can't be initialized, then it will note that fact and still - return TRUE. -*****************************************************************************/ -BOOL InitSfx(void) -{ -if (Init_Globals()) - { - if (Init_Sounds()) - { - gbSoundInitialized=TRUE; - return TRUE; - } - Free_Globals(); - } -gbSoundInitialized = FALSE; -return TRUE; -}; - - - -/**************************************************************************** -FUNCTION: CleanupSfx - -PURPOSE: Frees everything that was allocated by InitSfx, if it was - successfully initialized in the beginning. -*****************************************************************************/ -void CleanupSfx(void) -{ -if (gbSoundInitialized) - { - Free_Sounds(); - Free_Globals(); - } -}; - -/**************************************************************************** -FUNCTION: Init_Globals - -PURPOSE: Initializes the three main global variables. After this is done, - we should have allocated: - a. A DirectSound Object - b. A DirectSound3DListener Object - c. A Primary Buffer (16 bit, stereo, 22050khz) - - These are all global. -*****************************************************************************/ -BOOL Init_Globals(void) -{ -PCMWAVEFORMAT pcmwf; -DSBUFFERDESC dsbdesc; - -if (DS_OK == DirectSoundCreate(NULL, &glpDirectSound, NULL)) - { - memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT)); - pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM; - pcmwf.wf.nChannels = 2; - pcmwf.wf.nSamplesPerSec = 22050; - pcmwf.wf.nBlockAlign = 4; - pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign; - pcmwf.wBitsPerSample = 16; - memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); - dsbdesc.dwSize = sizeof(DSBUFFERDESC); - dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D; - dsbdesc.dwBufferBytes = 0; //dwBufferBytes and lpwfxFormat must be set this way. - dsbdesc.lpwfxFormat = NULL; - - if (DS_OK== IDirectSound_SetCooperativeLevel(glpDirectSound, ghWndMain,DSSCL_NORMAL)) - { - if (DS_OK== IDirectSound_CreateSoundBuffer(glpDirectSound, &dsbdesc, &glpPrimaryBuffer, NULL)) - { - if (DS_OK==glpPrimaryBuffer->lpVtbl->QueryInterface(glpPrimaryBuffer, &IID_IDirectSound3DListener, (void **)&glpDirectSound3DListener)) - { - if (DS_OK==IDirectSound3DListener_SetPosition(glpDirectSound3DListener, 0.f, 0.f, -1.f, DS3D_DEFERRED)) - { - if (DS_OK==IDirectSound3DListener_SetDopplerFactor(glpDirectSound3DListener, 9.9f ,DS3D_DEFERRED)) - { - if (DS_OK==IDirectSound3DListener_SetRolloffFactor(glpDirectSound3DListener, 0.25f ,DS3D_DEFERRED)) - { - if (DS_OK==IDirectSound3DListener_CommitDeferredSettings(glpDirectSound3DListener)) - { - return TRUE; - } - } - } - } - IDirectSound3DListener_Release(glpDirectSound3DListener); - } - glpPrimaryBuffer->lpVtbl->Release(glpPrimaryBuffer); - } - } - IDirectSound_Release(glpDirectSound); - } -return (FALSE); -}; - - -/***************************************************************************** -FUNCTION: Free_Globals - -PURPOSE: Frees up all three of the global interfaces that were created by - Init_Globabls. - - NOTES: Free_Sounds MUST be called before this. -*****************************************************************************/ -void Free_Globals(void) -{ -if (glpPrimaryBuffer!=NULL) - glpPrimaryBuffer->lpVtbl->Release(glpPrimaryBuffer); -if (glpDirectSound3DListener!=NULL) - IDirectSound3DListener_Release(glpDirectSound3DListener); -if (glpDirectSound!=NULL) - IDirectSound_Release(glpDirectSound); -}; - - -/**************************************************************************** -FUNCTION: Init_Sounds - -PURPOSE: Loads the gSoundEffect array (of sound objects) with the correct - data from the WAVE resources, so that only a GetBuffers call needs - to be made to get access to the sound effects. - -NOTES: If this fails, all sound objects will end up uninitialized. - Init_Globals MUST be called before this function. -*****************************************************************************/ -BOOL Init_Sounds(void) -{ -int i; - -for (i=0; i=0; i--) - { - WaveFree(gSoundEffect[i]); - gSoundEffect[i] = NULL; - } - ShowError(IDS_DSOUND_LOADWAVES); - return FALSE; - } - } -return TRUE; -}; - -/***************************************************************************** -FUNCTION: Free_Sounds - -PURPOSE: Frees up any sound objects that were loaded into memory. -*****************************************************************************/ -void Free_Sounds(void) -{int i; - -for (i=0; i -#include "ds3dutil.h" -/******************* DEFINITIONS *************************** -These will be used to index the array of CSound3D objects. -*********************************************************/ -#define BFIRE 0 //Bullet Firing -#define SBOOM 1 //Ship Exploding -#define SENGINE 2 //Ship Engine -#define SSTART 3 //Starting Engine -#define SSTOP 4 //Stopping Engine (key 5) -#define SBOUNCE 5 //Bouncing off a block or window edge -#define LBOOM 6 //Block destruction - -#define MAX_SOUNDS 7 - -/******************* DEFINITIONS FOR SHARED INFO ************/ -#define ENGINE_STATE 0x00000001l // Set if Engine is running - - -/**************** CONVERSION MACROS ************************** -These would be faster if hard-coded, but are left like this -for readability. -**************************************************************/ -#define SCREEN_METERS D3DVAL(6) //(How many meters wide is the screen?) -#define PPM D3DVAL(640/SCREEN_METERS) //How many pixels per meter? -#define MPP D3DVAL(SCREEN_METERS/640.f) //How many meters per pixel? -#define P2M(x) D3DVAL(D3DVAL(x) * MPP) //converts pixels to meters -#define M2P(x) D3DVAL(D3DVAL(x) * PPM) //converts meters to pixels - -/****************** FUNCTION PROTOTYPES *********************/ -BOOL InitSfx(void); -void CleanupSfx(void); -/************************ VARIABLES *************************/ -extern LPWAVEDATA gSoundEffect[MAX_SOUNDS]; -extern BOOL gbSoundInitialized; -extern CHAR * gszResourceName[MAX_SOUNDS]; -extern LPDIRECTSOUND glpDirectSound; -extern LPDIRECTSOUND3DLISTENER glpDirectSound3DListener; -extern LPDIRECTSOUNDBUFFER glpPrimaryBuffer; - -#endif diff --git a/sdk/samples/duel/splash.bmp b/sdk/samples/duel/splash.bmp deleted file mode 100644 index ca850ce..0000000 Binary files a/sdk/samples/duel/splash.bmp and /dev/null differ diff --git a/sdk/samples/duel/sstart.wav b/sdk/samples/duel/sstart.wav deleted file mode 100644 index a815627..0000000 Binary files a/sdk/samples/duel/sstart.wav and /dev/null differ diff --git a/sdk/samples/duel/sstop.wav b/sdk/samples/duel/sstop.wav deleted file mode 100644 index a8a7d94..0000000 Binary files a/sdk/samples/duel/sstop.wav and /dev/null differ diff --git a/sdk/samples/duel/util.c b/sdk/samples/duel/util.c deleted file mode 100644 index 5017dcc..0000000 --- a/sdk/samples/duel/util.c +++ /dev/null @@ -1,236 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: util.c - * Content: miscellaneous functions - * - * - ***************************************************************************/ -#include "util.h" - -/* - * Globals - */ -static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-', - 8, 9, '-', 10, 11, 12, 13, 14, 15 }; -static const WCHAR wszDigits[] = L"0123456789ABCDEF"; - - -/* - * StringFromGUID - * - * Converts a GUID into a wide string - */ -int StringFromGUID(LPGUID lpguid, LPWSTR lpwsz) -{ - int i; - - const BYTE * pBytes = (const BYTE *) lpguid; - - *lpwsz++ = L'{'; - - for (i = 0; i < sizeof(GuidMap); i++) - { - if (GuidMap[i] == '-') - { - *lpwsz++ = L'-'; - } - else - { - *lpwsz++ = wszDigits[ (pBytes[GuidMap[i]] & 0xF0) >> 4 ]; - *lpwsz++ = wszDigits[ (pBytes[GuidMap[i]] & 0x0F) ]; - } - } - *lpwsz++ = L'}'; - *lpwsz = L'\0'; - - return GUIDSTR_MAX; -} - -/* - * IsEqualGuid - * - * Determines if two guids are equal - */ -BOOL IsEqualGuid(GUID *lpguid1, GUID *lpguid2) -{ - return ( - ((PLONG) lpguid1)[0] == ((PLONG) lpguid2)[0] && - ((PLONG) lpguid1)[1] == ((PLONG) lpguid2)[1] && - ((PLONG) lpguid1)[2] == ((PLONG) lpguid2)[2] && - ((PLONG) lpguid1)[3] == ((PLONG) lpguid2)[3]); -} - - -// convert a hex char to an int - used by str to guid conversion -// we wrote our own, since the ole one is slow, and requires ole32.dll -// we use ansi strings here, since guids won't get internationalized -int GetDigit(LPSTR lpstr) -{ - char ch = *lpstr; - - if (ch >= '0' && ch <= '9') - return(ch - '0'); - if (ch >= 'a' && ch <= 'f') - return(ch - 'a' + 10); - if (ch >= 'A' && ch <= 'F') - return(ch - 'A' + 10); - return(0); -} -// walk the string, writing pairs of bytes into the byte stream (guid) -// we need to write the bytes into the byte stream from right to left -// or left to right as indicated by fRightToLeft -void ConvertField(LPBYTE lpByte,LPSTR * ppStr,int iFieldSize,BOOL fRightToLeft) -{ - int i; - - for (i=0;i - -#define GUIDSTR_MAX 38 -#define GUID_STRING_SIZE 64 - -int StringFromGUID(GUID *lpguid, LPWSTR lpsz); -BOOL IsEqualGuid(GUID *lpguid1, LPGUID lpguid2); -int GetDigit(LPSTR lpstr); -void ConvertField(LPBYTE lpByte,LPSTR * ppStr,int iFieldSize,BOOL fRightToLeft); -HRESULT GUIDFromString(LPWSTR lpWStr, GUID * pGuid); -int WideToAnsi(LPSTR lpStr,LPWSTR lpWStr,int cchStr); -int AnsiToWide(LPWSTR lpWStr,LPSTR lpStr,int cchWStr); -int randInt( int low, int high ); -double randDouble( double low, double high ); - diff --git a/sdk/samples/duel/wizard.c b/sdk/samples/duel/wizard.c deleted file mode 100644 index f06652a..0000000 --- a/sdk/samples/duel/wizard.c +++ /dev/null @@ -1,956 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wizard.c - * Content: User input (setup wizard) related code - * - * - ***************************************************************************/ -#include -#include "prsht.h" -#include "wizard.h" -#include "util.h" -#include "comm.h" -#include "gameproc.h" - -/* - * Externals - */ -extern HINSTANCE ghinst; // program instance -extern HWND ghWndMain; // main window -extern BOOL gbIsHost; // is the user hosting/joining a game -extern DPID gOurID; // player id -extern LPGUID glpGuid; // duel's guid - -/* - * Globals to this module - */ -static HFONT ghTitleFont; // font for titles on setup wizard -static HFONT ghHeadingFont; // font for headings on setup wizard -static int gnSession,gnPlayer; // indexes for tree view images -static HKEY ghDuelKey=NULL; // duel registry key handle -static DWORD gdwDuelDisp; // key created or opened -static GUID gSPGuid; // currently selected service provider guid -static HTREEITEM ghtiSession; // points to a visible session item in tree control - // used for inserting players into tree control -static HWND ghWndSPCtl; // handle to service provider control - -/* - * SetupFonts - * - * Initializes font structures (used for wizard controls) - */ -void SetupFonts(HDC hDC) -{ - LOGFONT lf; - TCHAR tszFontName[MAX_FONTNAME]; - - LoadString(ghinst, IDS_WIZARD_FONTNAME, tszFontName, MAX_FONTNAME); - - ZeroMemory(&lf,sizeof(lf)); - lf.lfHeight = -MulDiv(11,GetDeviceCaps(hDC, LOGPIXELSY),72); - lf.lfWeight = 500; - lf.lfItalic = TRUE; - _tcscpy(lf.lfFaceName,tszFontName); - ghTitleFont = CreateFontIndirect(&lf); - - ZeroMemory(&lf,sizeof(lf)); - lf.lfHeight = -MulDiv(11,GetDeviceCaps(hDC, LOGPIXELSY),72); - lf.lfWeight = 500; - _tcscpy(lf.lfFaceName,tszFontName); - ghHeadingFont = CreateFontIndirect(&lf); -} - -/* - * CleanupFonts - * - * Cleans up font structures - */ -void CleanupFonts(void) -{ - if (ghTitleFont) DeleteObject(ghTitleFont); - if (ghHeadingFont) DeleteObject(ghHeadingFont); -} - -/* - * RegSet - * - * Stores a data value in the registry - */ -LONG RegSet(LPCTSTR lptszName, CONST BYTE * lpData, DWORD dwSize) -{ -#ifdef UNICODE - dwSize *= 2; // calc number of bytes -#endif - return RegSetValueEx(ghDuelKey, lptszName, 0, REG_SZ, lpData, dwSize); -} - -/* - * RegSetA - * - * Stores data as an ascii string in the registry - */ -LONG RegSetA(LPCTSTR lptszName, CONST BYTE * lpData, DWORD dwSize) -{ - return RegSetValueEx(ghDuelKey, lptszName, 0, REG_SZ, lpData, dwSize); -} - -/* - * RegGet - * - * Queries a value from the registry - */ -LONG RegGet(LPCTSTR lptszName, LPBYTE lpData, LPDWORD lpdwDataSize) -{ - DWORD dwType; - - return RegQueryValueEx(ghDuelKey, lptszName, NULL, &dwType, lpData, lpdwDataSize); -} - -/* - * DoWizard - * - * Creates and launches a wizard (property sheets) for user input - */ -DWORD WINAPI DoWizard(LPVOID pv) -{ - PROPSHEETPAGE psp[4]; - PROPSHEETHEADER psh; - TCHAR tszTitle1[MAX_WINDOWTITLE]; - TCHAR tszTitle2[MAX_WINDOWTITLE]; - TCHAR tszTitle3[MAX_WINDOWTITLE]; - TCHAR tszTitle4[MAX_WINDOWTITLE]; - TCHAR tszTitle5[MAX_WINDOWTITLE]; - - LoadString(ghinst, IDS_WIZARD_TITLE_SP, tszTitle1, MAX_WINDOWTITLE); - LoadString(ghinst, IDS_WIZARD_TITLE_GS, tszTitle2, MAX_WINDOWTITLE); - LoadString(ghinst, IDS_WIZARD_TITLE_JS, tszTitle3, MAX_WINDOWTITLE); - LoadString(ghinst, IDS_WIZARD_TITLE_HS, tszTitle4, MAX_WINDOWTITLE); - LoadString(ghinst, IDS_WIZARD_TITLE, tszTitle5, MAX_WINDOWTITLE); - - psp[0].dwSize = sizeof(PROPSHEETPAGE); - psp[0].dwFlags = PSP_USEICONID | PSP_USETITLE; - psp[0].hInstance = ghinst; - psp[0].pszTemplate = MAKEINTRESOURCE(IDD_CHOOSEPROVIDER); - psp[0].pszIcon = NULL; - psp[0].pfnDlgProc = DlgProcChooseProvider; - psp[0].pszTitle = tszTitle1; - psp[0].lParam = 0; - psp[0].pfnCallback = NULL; - - psp[1].dwSize = sizeof(PROPSHEETPAGE); - psp[1].dwFlags = PSP_USEICONID | PSP_USETITLE; - psp[1].hInstance = ghinst; - psp[1].pszTemplate = MAKEINTRESOURCE(IDD_GAMESETUP); - psp[1].pszIcon = NULL; - psp[1].pfnDlgProc = DlgProcGameSetup; - psp[1].pszTitle = tszTitle2; - psp[1].lParam = 0; - psp[1].pfnCallback = NULL; - - psp[2].dwSize = sizeof(PROPSHEETPAGE); - psp[2].dwFlags = PSP_USEICONID | PSP_USETITLE; - psp[2].hInstance = ghinst; - psp[2].pszTemplate = MAKEINTRESOURCE(IDD_JOINSESSION); - psp[2].pszIcon = NULL; - psp[2].pfnDlgProc = DlgProcJoinSession; - psp[2].pszTitle = tszTitle3; - psp[2].lParam = 0; - psp[2].pfnCallback = NULL; - - psp[3].dwSize = sizeof(PROPSHEETPAGE); - psp[3].dwFlags = PSP_USEICONID | PSP_USETITLE; - psp[3].hInstance = ghinst; - psp[3].pszTemplate = MAKEINTRESOURCE(IDD_HOSTSESSION); - psp[3].pszIcon = NULL; - psp[3].pfnDlgProc = DlgProcHostSession; - psp[3].pszTitle = tszTitle4; - psp[3].lParam = 0; - psp[3].pfnCallback = NULL; - - psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE | PSH_WIZARD; - psh.hwndParent = ghWndMain; - psh.hInstance = ghinst; - psh.pszIcon = NULL; - psh.pszCaption = tszTitle5; - psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); - psh.nStartPage = 0; - psh.ppsp = (LPCPROPSHEETPAGE) &psp; - psh.pfnCallback = NULL; - - // open/create duel registry key - RegCreateKeyEx(HKEY_CURRENT_USER, - DUEL_KEY, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, - NULL, - &ghDuelKey, - &gdwDuelDisp - ); - - // setup fonts - SetupFonts(GetDC(ghWndMain)); - - // launch the wizard - PropertySheet(&psh); - - // cleanup - CleanupFonts(); - - // was communication initialized correctly ? - if (IsDPlay()) - { - // if so, launch game - PostMessage( ghWndMain, UM_LAUNCH, 0, 0 ); - } - else - { - // otherwise, abort game - PostMessage( ghWndMain, UM_ABORT, 0, 0 ); - } - - return 0; -} - -/* - * EnumSP - * - * DirectPlayEnumerate callback. Stores the service provider information in the - * passed in list box control. - */ -BOOL WINAPI EnumSP(LPGUID lpGuid, LPTSTR lptszDesc, DWORD dwMajorVersion, - DWORD dwMinorVersion, LPVOID lpv) -{ - LONG iIndex; - HWND hWnd = (HWND) lpv; - LPGUID lpSPGuid; - - // insert service provider description in the list box item - iIndex = SendMessage(hWnd, LB_ADDSTRING, 0, (LPARAM) lptszDesc); - - // allocate memory to remember the service provider guid - lpSPGuid = (LPGUID) malloc(sizeof(GUID)); - if (!lpSPGuid) return FALSE; - - // copy guid - *lpSPGuid = *lpGuid; - - // store the service provider guid pointer as item data - if (iIndex != LB_ERR) - SendMessage(hWnd, LB_SETITEMDATA, iIndex, (LPARAM) lpSPGuid); - - return(TRUE); -} - -/* - * DlgProcChooseProvider - * - * Dialog procedure for the choose service provider dialog - */ -BOOL CALLBACK DlgProcChooseProvider(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - LPGUID lpGuid; - static LONG iIndex; - static HWND hWndCtl; - DWORD dwSize; - BYTE szSPGuid[GUIDSTR_MAX+1]; - WCHAR wszSPGuid[GUIDSTR_MAX+1]; - int i; - HRESULT hr; - - switch (msg) - { - case WM_NOTIFY: - switch (((NMHDR FAR *) lParam)->code) - { - case PSN_SETACTIVE: - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT); - return(TRUE); - - case PSN_WIZNEXT: - // Release previously selected DPlay object, if any. - DPlayRelease(); - if (iIndex != LB_ERR) - { - lpGuid = (LPGUID) SendMessage(hWndCtl, LB_GETITEMDATA, iIndex, 0); - - if (lpGuid) - { - // remember the selection - gSPGuid = *lpGuid; - - // create directplay object - if ((hr = DPlayCreate(lpGuid)) == DP_OK) - { - return(TRUE); - } - else - { - ShowError(IDS_DPLAY_ERROR_IDC); - } - } - } - SetWindowLong(hDlg, DWL_MSGRESULT, -1); - return(TRUE); - - case PSN_QUERYCANCEL: - ReleaseSPData(); - DPlayRelease(); - return(TRUE); - } - break; - - case WM_INITDIALOG: - SendDlgItemMessage(hDlg, IDC_SP_TITLE, WM_SETFONT, (WPARAM)ghTitleFont, MAKELPARAM(TRUE,0)); - - hWndCtl = GetDlgItem(hDlg, IDC_SERVICEPROVIDERS); - if (hWndCtl == NULL) return(TRUE); - - // remember the service provider control. used later in freeing sp information. - ghWndSPCtl = hWndCtl; - DirectPlayEnumerate(EnumSP, (LPVOID)hWndCtl); - SetFocus(hWndCtl); - - // setup user's saved preferences - iIndex = 0; - dwSize = GUIDSTR_MAX+1; - if (ghDuelKey && (RegGet(TEXT("ServiceProvider"), szSPGuid, &dwSize) == ERROR_SUCCESS)) - { - AnsiToWide(wszSPGuid, szSPGuid, sizeof(szSPGuid)); - GUIDFromString(wszSPGuid, &gSPGuid); - - for (i=0; iguidInstance; -#ifdef UNICODE - hItem = AddItemToTree(hWnd, lpDPSessionDesc->lpszSessionName, (DWORD)lpGuid, 1); -#else - hItem = AddItemToTree(hWnd, lpDPSessionDesc->lpszSessionNameA, (DWORD)lpGuid, 1); -#endif - TreeView_SelectItem(hWnd, hItem); - - return(TRUE); -} - -/* - * DlgProcGameSetup - * - * Dialog procedure for the Game Setup Dialog. - */ -BOOL CALLBACK DlgProcGameSetup (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_NOTIFY: - switch (((NMHDR FAR *) lParam)->code) - { - case PSN_SETACTIVE: - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT); - return(TRUE); - - case PSN_WIZNEXT: - if (gbIsHost) - SetWindowLong(hDlg, DWL_MSGRESULT, IDD_HOSTSESSION); - return(TRUE); - - case PSN_QUERYCANCEL: - ReleaseSPData(); - DPlayRelease(); - return(TRUE); - } - break; - - case WM_INITDIALOG: - // setup title fonts - SendDlgItemMessage(hDlg, IDC_GAMESETUP_TITLE, WM_SETFONT, (WPARAM)ghTitleFont, MAKELPARAM(TRUE,0)); - SendDlgItemMessage(hDlg, IDC_JOINSESSION, WM_SETFONT, (WPARAM)ghHeadingFont, MAKELPARAM(TRUE,0)); - SendDlgItemMessage(hDlg, IDC_HOSTSESSION, WM_SETFONT, (WPARAM)ghHeadingFont, MAKELPARAM(TRUE,0)); - // host by default - SendDlgItemMessage(hDlg, IDC_HOSTSESSION, BM_SETCHECK, 1, 0); - SendDlgItemMessage(hDlg, IDC_JOINSESSION, BM_SETCHECK, 0, 0); - gbIsHost = TRUE; - return(TRUE); - - case WM_COMMAND: - if (HIWORD(wParam) == BN_CLICKED) - switch (LOWORD(wParam)) - { - case IDC_HOSTSESSION: - if (SendDlgItemMessage(hDlg, IDC_HOSTSESSION, BM_GETCHECK, 1, 0) == 1) - { - gbIsHost = TRUE; - } - return(TRUE); - case IDC_JOINSESSION: - if (SendDlgItemMessage(hDlg, IDC_JOINSESSION, BM_GETCHECK, 1, 0) == 1) - { - gbIsHost = FALSE; - } - return(TRUE); - } - break; - } - return(FALSE); -} - -/* - * EnumPlayer - * - * EnumeratePlayer callback. Inserts player information into the passed in tree view control. - */ -BOOL WINAPI EnumPlayer(DPID pidID, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext) -{ - HWND hWnd = (HWND) lpContext; - HTREEITEM hItem; - -#ifdef UNICODE - hItem = AddItemToTree(hWnd, lpName->lpszShortName, 0, -1); -#else - hItem = AddItemToTree(hWnd, lpName->lpszShortNameA, 0, -1); -#endif - - return(TRUE); -} - -/* - * DlgProcJoinSession - * - * Dialog procedure for Join Session Dialog - */ -BOOL CALLBACK DlgProcJoinSession (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static NM_TREEVIEW nmtv; - static HWND hWndCtl; - static TCHAR tszPlayerName[MAX_PLAYERNAME+1]; - static HANDLE dphEvent = NULL; - TV_ITEM tvItem; - TCHAR tszSessionName[MAX_SESSIONNAME+1]; - WCHAR wszSPGuid[GUIDSTR_MAX+1]; - BYTE szSPGuid[GUIDSTR_MAX+1]; - DWORD dwPNameSize; - HRESULT hr; - HTREEITEM htiCur, htiNext; - LPGUID lpGuid; - - switch (msg) - { - case WM_NOTIFY: - switch (((NMHDR FAR *) lParam)->code) - { - case PSN_SETACTIVE: - if (hWndCtl) TreeView_DeleteAllItems(hWndCtl); - - // enum sessions and let dplay decide the timeout - DPlayEnumSessions(0, EnumSession, (LPVOID) hWndCtl, (DWORD)NULL); - - // enumerate players for all sessions - ghtiSession = TreeView_GetFirstVisible(hWndCtl); - - while (ghtiSession) - { - // delete previous players from display - if ((htiNext = htiCur = TreeView_GetChild(hWndCtl, ghtiSession)) - != (HTREEITEM)0) - { - do - { - htiNext = TreeView_GetNextSibling(hWndCtl, htiCur); - TreeView_DeleteItem(hWndCtl, htiCur); - htiCur = htiNext; - } while (htiNext); - } - - tvItem.hItem = ghtiSession; - tvItem.pszText = tszSessionName; - tvItem.cchTextMax = MAX_SESSIONNAME; - TreeView_GetItem(hWndCtl, &tvItem); - // enumerate players for selected session - DPlayEnumPlayers((LPGUID)tvItem.lParam, EnumPlayer, (LPVOID) hWndCtl, DPENUMPLAYERS_SESSION); - ghtiSession = TreeView_GetNextItem(hWndCtl, ghtiSession, TVGN_NEXTVISIBLE); - } - - // set Finish button highlite - if (GetDlgItemText(hDlg, IDC_JOIN_PLAYERNAME, tszPlayerName, MAX_PLAYERNAME) && - (htiCur = TreeView_GetSelection(hWndCtl))) - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH); - } - else - { - PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_BACK|PSWIZB_DISABLEDFINISH); - } - - SetFocus(hWndCtl); - return(TRUE); - - case PSN_WIZFINISH: - // add user selections to registry - if (ghDuelKey) - { - StringFromGUID(&gSPGuid, wszSPGuid); - WideToAnsi(szSPGuid, wszSPGuid, sizeof(wszSPGuid)); - RegSetA(TEXT("ServiceProvider"), szSPGuid, sizeof(szSPGuid)); - RegSet(TEXT("PlayerName"), (CONST BYTE *)tszPlayerName, - sizeof(tszPlayerName)); - } - - // get the session guid - if (nmtv.itemNew.lParam) - { - // user selected a session item, so just grab its lParam - lpGuid = (LPGUID)nmtv.itemNew.lParam; - } - else - { - // user selected a player item, so grab its parent's (session) lParam - htiCur = TreeView_GetParent(hWndCtl, nmtv.itemNew.hItem); - if (!htiCur) - { - // fail finish - ShowError(IDS_WIZARD_ERROR_GSG); - SetWindowLong(hDlg, DWL_MSGRESULT, -1); - return (TRUE); - } - - tvItem.hItem = htiCur; - tvItem.pszText = tszSessionName; - tvItem.cchTextMax = MAX_SESSIONNAME; - TreeView_GetItem(hWndCtl, &tvItem); - lpGuid = (LPGUID)tvItem.lParam; - } - - // open session - if ((hr = DPlayOpenSession(lpGuid)) != DP_OK) - { - // fail finish - ShowError(IDS_DPLAY_ERROR_JS); - SetWindowLong(hDlg, DWL_MSGRESULT, -1); - return (TRUE); - } - - // create player - if ((hr = DPlayCreatePlayer(&gOurID, tszPlayerName, NULL, NULL, 0)) != DP_OK) - { - // fail finish - ShowError(IDS_DPLAY_ERROR_CP); - SetWindowLong(hDlg, DWL_MSGRESULT, -1); - return (TRUE); - } - - // everything went well, release allocated memory and finish - ReleaseSessionData(hWndCtl); - ReleaseSPData(); - return(TRUE); - - case PSN_QUERYCANCEL: - ReleaseSPData(); - ReleaseSessionData(hWndCtl); - DPlayRelease(); - return(TRUE); - - case PSN_WIZBACK: - ReleaseSessionData(hWndCtl); - return(TRUE); - - case TVN_SELCHANGING: - nmtv = *((NM_TREEVIEW *) lParam); - - // set Finish button status - if (GetDlgItemText(hDlg, IDC_JOIN_PLAYERNAME, tszPlayerName, MAX_PLAYERNAME) && - (htiCur = TreeView_GetSelection(hWndCtl))) - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH); - } - else - { - PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_BACK|PSWIZB_DISABLEDFINISH); - } - return(FALSE); - - case NM_CLICK: - return(FALSE); - } - break; - case WM_INITDIALOG: - // setup title fonts - SendDlgItemMessage(hDlg, IDC_JOIN_SESSION_TITLE, WM_SETFONT, (WPARAM)ghHeadingFont, MAKELPARAM(TRUE,0)); - SendDlgItemMessage(hDlg, IDC_JOIN_PLAYER_TITLE, WM_SETFONT, (WPARAM)ghHeadingFont, MAKELPARAM(TRUE,0)); - - // setup user's previous data - dwPNameSize = MAX_PLAYERNAME+1; - tszPlayerName[0]=0; - if (ghDuelKey && (RegGet(TEXT("PlayerName"),(LPBYTE)tszPlayerName,&dwPNameSize) == ERROR_SUCCESS)) - SetDlgItemText(hDlg, IDC_JOIN_PLAYERNAME, tszPlayerName); - - hWndCtl = GetDlgItem(hDlg, IDC_JOIN_SESSION); - if (hWndCtl == NULL) return(TRUE); - InitTreeViewImageLists(hWndCtl); - return(TRUE); - - case WM_COMMAND: - - switch (LOWORD(wParam)) - { - case IDC_JOIN_PLAYERNAME: - if (HIWORD(wParam) == EN_CHANGE) - { - // set Finish button status - if (GetDlgItemText(hDlg, IDC_JOIN_PLAYERNAME, tszPlayerName, MAX_PLAYERNAME) && - (htiCur = TreeView_GetSelection(hWndCtl))) - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH); - } - else - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_DISABLEDFINISH); - } - } - break; - } - break; - } - return (FALSE); -} - -/* - * DlgProcHostSession - * - * Dialog proc for Host Session Dialog - */ -BOOL CALLBACK DlgProcHostSession(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static TCHAR tszSessionName[MAX_SESSIONNAME+1], tszPlayerName[MAX_PLAYERNAME+1]; - HRESULT hr; - WCHAR wszSPGuid[GUIDSTR_MAX+1]; - BYTE szSPGuid[GUIDSTR_MAX+1]; - DWORD dwPNameSize, dwSNameSize; - - switch (msg) { - case WM_NOTIFY: - switch (((NMHDR FAR *) lParam)->code) - { - case PSN_SETACTIVE: - if (GetDlgItemText(hDlg, IDC_HOST_SESSIONNAME, tszSessionName, MAX_SESSIONNAME) && - GetDlgItemText(hDlg, IDC_HOST_PLAYERNAME, tszPlayerName, MAX_PLAYERNAME)) - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH); - } - else - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_DISABLEDFINISH); - } - return(TRUE); - - case PSN_WIZFINISH: - // add user selections to registry - if (ghDuelKey) - { - StringFromGUID(&gSPGuid, wszSPGuid); - WideToAnsi(szSPGuid, wszSPGuid, sizeof(wszSPGuid)); - RegSetA(TEXT("ServiceProvider"), szSPGuid, sizeof(szSPGuid)); - RegSet(TEXT("PlayerName"), (CONST BYTE *)tszPlayerName, sizeof(tszPlayerName)); - RegSet(TEXT("SessionName"), (CONST BYTE *)tszSessionName, sizeof(tszSessionName)); - } - - // create session - if ((hr = DPlayCreateSession(tszSessionName)) != DP_OK) - { - // fail finish - ShowError(IDS_DPLAY_ERROR_CS); - SetWindowLong(hDlg, DWL_MSGRESULT, -1); - return (TRUE); - } - - // create player - if ((hr = DPlayCreatePlayer(&gOurID, tszPlayerName, NULL, NULL, 0)) != DP_OK) - { - ShowError(IDS_DPLAY_ERROR_CP); - SetWindowLong(hDlg, DWL_MSGRESULT, -1); - return (TRUE); - } - - // everything went well, release allocated memory and finish - ReleaseSPData(); - return(TRUE); - - case PSN_WIZBACK: - SetWindowLong(hDlg, DWL_MSGRESULT, IDD_GAMESETUP); - return(TRUE); - - case PSN_QUERYCANCEL: - // release allocated memory - ReleaseSPData(); - // release dplay - DPlayRelease(); - return(TRUE); - } - break; - case WM_INITDIALOG: - // setup title font - SendDlgItemMessage(hDlg, IDC_HOST_TITLE, WM_SETFONT, (WPARAM)ghTitleFont, MAKELPARAM(TRUE,0)); - SendDlgItemMessage(hDlg, IDC_HOST_SESSION_TITLE, WM_SETFONT, (WPARAM)ghHeadingFont, MAKELPARAM(TRUE,0)); - SendDlgItemMessage(hDlg, IDC_HOST_PLAYER_TITLE, WM_SETFONT, (WPARAM)ghHeadingFont, MAKELPARAM(TRUE,0)); - - dwPNameSize = MAX_PLAYERNAME+1; - dwSNameSize = MAX_SESSIONNAME+1; - tszPlayerName[0]=0; - tszSessionName[0]=0; - if (ghDuelKey) - { - if (RegGet(TEXT("PlayerName"), (LPBYTE)tszPlayerName, &dwPNameSize) == ERROR_SUCCESS) - SetDlgItemText(hDlg, IDC_HOST_PLAYERNAME, tszPlayerName); - if (RegGet(TEXT("SessionName"), (LPBYTE)tszSessionName, &dwSNameSize) == ERROR_SUCCESS) - SetDlgItemText(hDlg, IDC_HOST_SESSIONNAME, tszSessionName); - } - - return(TRUE); - - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDC_HOST_SESSIONNAME: - if (HIWORD(wParam) == EN_CHANGE) - { - if (GetDlgItemText(hDlg, IDC_HOST_SESSIONNAME, tszSessionName, MAX_SESSIONNAME) && - GetDlgItemText(hDlg, IDC_HOST_PLAYERNAME, tszPlayerName, MAX_PLAYERNAME)) - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH); - } - else - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_DISABLEDFINISH); - } - - return TRUE; - } - break; - - case IDC_HOST_PLAYERNAME: - if (HIWORD(wParam) == EN_CHANGE) - { - if (GetDlgItemText(hDlg, IDC_HOST_SESSIONNAME, tszSessionName, MAX_SESSIONNAME) && - GetDlgItemText(hDlg, IDC_HOST_PLAYERNAME, tszPlayerName, MAX_PLAYERNAME)) - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH); - } - else - { - PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_DISABLEDFINISH); - } - } - break; - } - break; - } - - return(FALSE); -} - -/* - * InitTreeViewImageLists - creates an image list, adds three bitmaps to - * it, and associates the image list with a tree-view control. - * Returns TRUE if successful or FALSE otherwise. - * hwndTV - handle of the tree-view control - * - * Global variables and constants - * gnSession, and gnPlayer - integer variables for - * indexes of the images - * CX_BITMAP and CY_BITMAP - width and height of an icon - * NUM_BITMAPS - number of bitmaps to add to the image list - */ -BOOL InitTreeViewImageLists(HWND hwndTV) -{ - HIMAGELIST himl; // handle of image list - HBITMAP hbmp; // handle of bitmap - - // Create the image list. - if ((himl = ImageList_Create(CX_BITMAP, CY_BITMAP, - FALSE, NUM_BITMAPS, 0)) == NULL) - return FALSE; - - // Add the session and player bitmaps. - hbmp = LoadBitmap(ghinst, MAKEINTRESOURCE(IDB_CLOSED_SESSION)); - gnSession = ImageList_Add(himl, hbmp, (HBITMAP) NULL); - DeleteObject(hbmp); - - hbmp = LoadBitmap(ghinst, MAKEINTRESOURCE(IDB_PLAYER)); - gnPlayer = ImageList_Add(himl, hbmp, (HBITMAP) NULL); - DeleteObject(hbmp); - - // Fail if not all of the images were added. - if (ImageList_GetImageCount(himl) < 2) - return FALSE; - - // Associate the image list with the tree-view control. - TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL); - - return TRUE; -} - - -/* - * AddItemToTree - adds items to a tree-view control. - * Returns the handle of the newly added item. - * hwndTV - handle of the tree-view control - * lpszItem - text of the item to add - * nLevel - level at which to add the item - */ -HTREEITEM AddItemToTree(HWND hwndTV, LPTSTR lptszItem, DWORD dwData, int nLevel) -{ - TV_ITEM tvi; - TV_INSERTSTRUCT tvins; - static HTREEITEM hPrev = (HTREEITEM) TVI_FIRST; - static HTREEITEM hPrevRootItem = NULL; - static HTREEITEM hPrevLev2Item = NULL; - - tvi.mask = TVIF_TEXT | TVIF_IMAGE - | TVIF_SELECTEDIMAGE | TVIF_PARAM; - - // Set the state - if (nLevel == 1) - { - tvi.mask |= TVIF_STATE; - tvi.state = TVIS_SELECTED; - } - - // Set the text of the item. - tvi.pszText = lptszItem; - - // Set the image - if (nLevel == 1) - { - tvi.iImage = gnSession; - tvi.iSelectedImage = gnSession; - } - else - { - tvi.iImage = gnPlayer; - tvi.iSelectedImage = gnPlayer; - } - - - // Save the heading level in the item's application-defined - // data area. - tvi.lParam = (LPARAM) dwData; - - tvins.item = tvi; - tvins.hInsertAfter = hPrev; - - // Set the parent item based on the specified level. - if (nLevel == -1) - tvins.hParent = ghtiSession; - else if (nLevel == 1) - tvins.hParent = TVI_ROOT; - else if (nLevel == 2) - tvins.hParent = hPrevRootItem; - else - tvins.hParent = hPrevLev2Item; - - // Add the item to the tree-view control. - hPrev = (HTREEITEM) SendMessage(hwndTV, TVM_INSERTITEM, 0, - (LPARAM) (LPTV_INSERTSTRUCT) &tvins); - - // Save the handle of the item. - if (nLevel == 1) - hPrevRootItem = hPrev; - else if (nLevel == 2) - hPrevLev2Item = hPrev; - - return hPrev; -} - -/* - * ReleaseSessionData - * - * Releases the memory allocated for session guids - */ -void ReleaseSessionData(HWND hWndCtl) -{ - HTREEITEM htiSession; - TV_ITEM tvItem; - TCHAR tszSessionName[MAX_SESSIONNAME+1]; - - - htiSession = TreeView_GetRoot(hWndCtl); - while (htiSession) - { - tvItem.hItem = htiSession; - tvItem.pszText = tszSessionName; - tvItem.cchTextMax = MAX_SESSIONNAME; - TreeView_GetItem(hWndCtl, &tvItem); - if (tvItem.lParam) free((LPVOID)tvItem.lParam); - htiSession = TreeView_GetNextSibling(hWndCtl, htiSession); - } -} - -/* - * ReleaseSPData - * - * Releases the memory allocated for service provider guids - * depends on global variable ghWndSPControl - */ -void ReleaseSPData(void) -{ - LPGUID lpGuid; - int count,index; - - if (ghWndSPCtl) - { - count = SendMessage(ghWndSPCtl, LB_GETCOUNT, 0, 0); - for (index = 0; index < count; index++) - { - lpGuid = (LPGUID) SendMessage(ghWndSPCtl, LB_GETITEMDATA, index, 0); - if (lpGuid) free(lpGuid); - } - } -} diff --git a/sdk/samples/duel/wizard.h b/sdk/samples/duel/wizard.h deleted file mode 100644 index 2b4a832..0000000 --- a/sdk/samples/duel/wizard.h +++ /dev/null @@ -1,49 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: wizard.h - * Content: user input routines include file - * - * - ***************************************************************************/ -#define IDIRECTPLAY2_OR_GREATER -#include -#include -#include "duel.h" - -void SetupFonts(HDC hDC); - -void CleanupFonts(void); - -LONG RegSet(LPCTSTR lptszName, CONST BYTE * lpData, DWORD dwSize); - -LONG RegSetA(LPCTSTR lptszName, CONST BYTE * lpData, DWORD dwSize); - -LONG RegGet(LPCTSTR lptszName, LPBYTE lpData, LPDWORD lpdwDataSize); - -DWORD WINAPI DoWizard(LPVOID pv); - -BOOL WINAPI EnumSP(LPGUID lpGuid, LPTSTR lpDesc, DWORD dwJamorVersion, - DWORD dwMinorVersion, LPVOID lpv); -BOOL CALLBACK DlgProcChooseProvider(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -BOOL WINAPI EnumSession(LPCDPSESSIONDESC2 lpDPSessionDesc, LPDWORD lpdwTimeOut, - DWORD dwFlags, LPVOID pContext); - -BOOL CALLBACK DlgProcGameSetup (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -BOOL WINAPI EnumPlayer(DPID pidID, DWORD dwPlayerType, LPCDPNAME lpName, - DWORD dwFlags, LPVOID lpContext); - -BOOL CALLBACK DlgProcJoinSession (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -BOOL CALLBACK DlgProcHostSession (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -BOOL InitTreeViewImageLists(HWND hwndTV); - -HTREEITEM AddItemToTree(HWND hwndTV, LPTSTR lpszItem, DWORD dwData, int nLevel); - -void ReleaseSessionData(HWND hWndCtl); - -void ReleaseSPData(void); diff --git a/sdk/samples/dxview/dxview.c b/sdk/samples/dxview/dxview.c deleted file mode 100644 index cbc1ff3..0000000 --- a/sdk/samples/dxview/dxview.c +++ /dev/null @@ -1,1855 +0,0 @@ -/**************************************************************************** - - Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - - PROGRAM: dxview.c - - PURPOSE: DirectX Device Viewer - - FUNCTIONS: - - COMMENTS: - -****************************************************************************/ -//#define DX_3D -#include -#include -#include -#include - -#define INITGUID -#include -#include - -#include -//#include -#include -#include -#ifdef DX_3D -#include -#endif -#include "dxview.h" - -/**************************************************************************** - ***************************************************************************/ - -HINSTANCE g_hInstance; -char g_szAppName[] = "DXView"; -char g_szClassName[] = "DXView"; -char g_szTitle[] = "DirectX Device Viewer"; -HWND g_hwndMain; - -HWND g_hwndLV; // List view -HWND g_hwndTV; // Tree view -HIMAGELIST g_hImageList; -HFONT g_hFont; -int g_xPaneSplit; -int g_xHalfSplitWidth; -BOOL g_bSplitMove; -DWORD g_dwViewState; -DWORD g_tmAveCharWidth; - -/**************************************************************************** - ***************************************************************************/ - -IDirectDraw *lpDD; // DirectDraw object -GUID * ddid; - -IDirectSound *lpDS; // DirectSound object -GUID * dsid; - -IDirectPlay *lpDP; // DirectPlay object -GUID * dpid; - -#ifdef DX_3D -IDirect3D *lp3D; // Direct3D object -GUID * d3did; - -IDirect3DDevice *lp3DDevice; -GUID *pid_for3D = 0; -#endif - -/**************************************************************************** - ***************************************************************************/ - -#define DDCAPDEF(name,val,flag) {name, FIELD_OFFSET(DDCAPS,val), flag} -#define DDVALDEF(name,val) {name, FIELD_OFFSET(DDCAPS,val), 0} -#define ROPDEF(name,rop) DDCAPDEF(name,dwRops[((rop>>16)&0xFF)/32],(1<<((rop>>16)&0xFF)%32)) - -#define DSCAPDEF(name,val,flag) {name, FIELD_OFFSET(DSCAPS,val), flag} -#define DSVALDEF(name,val) {name, FIELD_OFFSET(DSCAPS,val), 0} - -#define DPCAPDEF(name,val,flag) {name, FIELD_OFFSET(DPCAPS,val), flag} -#define DPVALDEF(name,val) {name, FIELD_OFFSET(DPCAPS,val), 0} - -#ifdef DX_3D -#define D3CAPDEF(name,val,flag) {name, FIELD_OFFSET(D3DDEVICEDESC,val), flag} -#define D3VALDEF(name,val) {name, FIELD_OFFSET(D3DDEVICEDESC,val), 0} -#endif - -#define SURFCAPDEF(name,val,flag) {name, FIELD_OFFSET(DDSURFACEDESC,val), flag} -#define SURFVALDEF(name,val) {name, FIELD_OFFSET(DDSURFACEDESC,val), 0} - -#define MAKEMODE(xres,yres,bpp) (((DWORD)xres << 20) | ((DWORD)yres << 8) | bpp) -#define GETXRES(mode) (int)((mode >> 20) & 0x0FFF) -#define GETYRES(mode) (int)((mode >> 8) & 0x0FFF) -#define GETCRES(mode) (int)((mode >> 0) & 0x00FF) - -/**************************************************************************** - ***************************************************************************/ -CAPDEF OtherInfoDefs[] = -{ - DDVALDEF("VidMemTotal", dwVidMemTotal), - DDVALDEF("VidMemFree", dwVidMemFree), - DDVALDEF("dwReserved1", dwReserved1), - DDVALDEF("dwReserved2", dwReserved2), - DDVALDEF("dwReserved3", dwReserved3), - DDVALDEF("AlphaBltConstBitDepths", dwAlphaBltConstBitDepths), - DDVALDEF("AlphaBltPixelBitDepths", dwAlphaBltPixelBitDepths), - DDVALDEF("AlphaBltSurfaceBitDepths", dwAlphaBltSurfaceBitDepths), - DDVALDEF("AlphaOverlayConstBitDepths", dwAlphaOverlayConstBitDepths), - DDVALDEF("AlphaOverlayPixelBitDepths", dwAlphaOverlayPixelBitDepths), - DDVALDEF("AlphaOverlaySurfaceBitDepths", dwAlphaOverlaySurfaceBitDepths), - DDVALDEF("ZBufferBitDepths", dwZBufferBitDepths), - DDVALDEF("MaxVisibleOverlays", dwMaxVisibleOverlays), - DDVALDEF("CurrVisibleOverlays", dwCurrVisibleOverlays), - DDVALDEF("NumFourCCCodes", dwNumFourCCCodes), - DDVALDEF("AlignBoundarySrc", dwAlignBoundarySrc), - DDVALDEF("AlignSizeSrc", dwAlignSizeSrc), - DDVALDEF("AlignBoundaryDest", dwAlignBoundaryDest), - DDVALDEF("AlignSizeDest", dwAlignSizeDest), - DDVALDEF("AlignStrideAlign", dwAlignStrideAlign), - DDVALDEF("MinOverlayStretch", dwMinOverlayStretch), - DDVALDEF("MaxOverlayStretch", dwMaxOverlayStretch), - DDVALDEF("MinLiveVideoStretch", dwMinLiveVideoStretch), - DDVALDEF("MaxLiveVideoStretch", dwMaxLiveVideoStretch), - DDVALDEF("MinHwCodecStretch", dwMinHwCodecStretch), - DDVALDEF("MaxHwCodecStretch", dwMaxHwCodecStretch), - { "", 0, 0 } -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF CapsDefs[] = -{ - DDCAPDEF("3D", dwCaps, DDCAPS_3D), - DDCAPDEF("ALIGNBOUNDARYDEST", dwCaps, DDCAPS_ALIGNBOUNDARYDEST), - DDCAPDEF("ALIGNSIZEDEST", dwCaps, DDCAPS_ALIGNSIZEDEST), - DDCAPDEF("ALIGNBOUNDARYSRC", dwCaps, DDCAPS_ALIGNBOUNDARYSRC), - DDCAPDEF("ALIGNSIZESRC", dwCaps, DDCAPS_ALIGNSIZESRC), - DDCAPDEF("ALIGNSTRIDE", dwCaps, DDCAPS_ALIGNSTRIDE), - DDCAPDEF("BLT", dwCaps, DDCAPS_BLT), - DDCAPDEF("BLTCOLORFILL", dwCaps, DDCAPS_BLTCOLORFILL), - DDCAPDEF("BLTDEPTHFILL", dwCaps, DDCAPS_BLTDEPTHFILL), - DDCAPDEF("BLTFOURCC", dwCaps, DDCAPS_BLTFOURCC), - DDCAPDEF("BLTSTRETCH", dwCaps, DDCAPS_BLTSTRETCH), - DDCAPDEF("BLTQUEUE", dwCaps, DDCAPS_BLTQUEUE), - DDCAPDEF("GDI", dwCaps, DDCAPS_GDI), - DDCAPDEF("OVERLAY", dwCaps, DDCAPS_OVERLAY), - DDCAPDEF("OVERLAYCANTCLIP", dwCaps, DDCAPS_OVERLAYCANTCLIP), - DDCAPDEF("OVERLAYFOURCC", dwCaps, DDCAPS_OVERLAYFOURCC), - DDCAPDEF("OVERLAYSTRETCH", dwCaps, DDCAPS_OVERLAYSTRETCH), - DDCAPDEF("PALETTE", dwCaps, DDCAPS_PALETTE), - DDCAPDEF("PALETTEVSYNC", dwCaps, DDCAPS_PALETTEVSYNC), - DDCAPDEF("READSCANLINE", dwCaps, DDCAPS_READSCANLINE), - DDCAPDEF("STEREOVIEW", dwCaps, DDCAPS_STEREOVIEW), - DDCAPDEF("VBI", dwCaps, DDCAPS_VBI), - DDCAPDEF("ZBLTS", dwCaps, DDCAPS_ZBLTS), - DDCAPDEF("ZOVERLAYS", dwCaps, DDCAPS_ZOVERLAYS), - DDCAPDEF("COLORKEY", dwCaps, DDCAPS_COLORKEY), - DDCAPDEF("ALPHA", dwCaps, DDCAPS_ALPHA), - DDCAPDEF("CKEYHWASSIST", dwCaps, DDCAPS_COLORKEYHWASSIST), - DDCAPDEF("NOHARDWARE", dwCaps, DDCAPS_NOHARDWARE), - DDCAPDEF("BANKSWITCHED", dwCaps, DDCAPS_BANKSWITCHED), - DDCAPDEF("CERTIFIED", dwCaps2,DDCAPS2_CERTIFIED), - DDCAPDEF("NO2DDURING3DSCENE", dwCaps2,DDCAPS2_NO2DDURING3DSCENE), - { "", 0, 0 } -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF CKeyCapsDefs[] = -{ - DDCAPDEF("DESTBLT", dwCKeyCaps, DDCKEYCAPS_DESTBLT), - DDCAPDEF("DESTBLTCLRSPACE", dwCKeyCaps, DDCKEYCAPS_DESTBLTCLRSPACE), - DDCAPDEF("DESTBLTCLRSPACEYUV", dwCKeyCaps, DDCKEYCAPS_DESTBLTCLRSPACEYUV), - DDCAPDEF("DESTBLTYUV", dwCKeyCaps, DDCKEYCAPS_DESTBLTYUV), - DDCAPDEF("DESTOVERLAY", dwCKeyCaps, DDCKEYCAPS_DESTOVERLAY), - DDCAPDEF("DESTOVERLAYCLRSPACE", dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYCLRSPACE), - DDCAPDEF("DESTOVERLAYCLRSPACEYUV", dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV), - DDCAPDEF("DESTOVERLAYONEACTIVE", dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYONEACTIVE), - DDCAPDEF("DESTOVERLAYYUV", dwCKeyCaps, DDCKEYCAPS_DESTOVERLAYYUV), - DDCAPDEF("SRCBLT", dwCKeyCaps, DDCKEYCAPS_SRCBLT), - DDCAPDEF("SRCBLTCLRSPACE", dwCKeyCaps, DDCKEYCAPS_SRCBLTCLRSPACE), - DDCAPDEF("SRCBLTCLRSPACEYUV", dwCKeyCaps, DDCKEYCAPS_SRCBLTCLRSPACEYUV), - DDCAPDEF("SRCBLTYUV", dwCKeyCaps, DDCKEYCAPS_SRCBLTYUV), - DDCAPDEF("SRCOVERLAY", dwCKeyCaps, DDCKEYCAPS_SRCOVERLAY), - DDCAPDEF("SRCOVERLAYCLRSPACE", dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYCLRSPACE), - DDCAPDEF("SRCOVERLAYCLRSPACEYUV", dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV), - DDCAPDEF("SRCOVERLAYONEACTIVE", dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYONEACTIVE), - DDCAPDEF("SRCOVERLAYYUV", dwCKeyCaps, DDCKEYCAPS_SRCOVERLAYYUV), - { "", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF FXCapsDefs[] = -{ - DDCAPDEF("BLTARITHSTRETCHY", dwFXCaps, DDFXCAPS_BLTARITHSTRETCHY), - DDCAPDEF("BLTARITHSTRETCHYN", dwFXCaps, DDFXCAPS_BLTARITHSTRETCHYN), - DDCAPDEF("BLTMIRRORLEFTRIGHT", dwFXCaps, DDFXCAPS_BLTMIRRORLEFTRIGHT), - DDCAPDEF("BLTMIRRORUPDOWN", dwFXCaps, DDFXCAPS_BLTMIRRORUPDOWN), - DDCAPDEF("BLTROTATION", dwFXCaps, DDFXCAPS_BLTROTATION), - DDCAPDEF("BLTROTATION90", dwFXCaps, DDFXCAPS_BLTROTATION90), - DDCAPDEF("BLTSHRINKX", dwFXCaps, DDFXCAPS_BLTSHRINKX), - DDCAPDEF("BLTSHRINKXN", dwFXCaps, DDFXCAPS_BLTSHRINKXN), - DDCAPDEF("BLTSHRINKY", dwFXCaps, DDFXCAPS_BLTSHRINKY), - DDCAPDEF("BLTSHRINKYN", dwFXCaps, DDFXCAPS_BLTSHRINKYN), - DDCAPDEF("BLTSTRETCHX", dwFXCaps, DDFXCAPS_BLTSTRETCHX), - DDCAPDEF("BLTSTRETCHXN", dwFXCaps, DDFXCAPS_BLTSTRETCHXN), - DDCAPDEF("BLTSTRETCHY", dwFXCaps, DDFXCAPS_BLTSTRETCHY), - DDCAPDEF("BLTSTRETCHYN", dwFXCaps, DDFXCAPS_BLTSTRETCHYN), - DDCAPDEF("OVERLAYARITHSTRETCHY", dwFXCaps, DDFXCAPS_OVERLAYARITHSTRETCHY), - DDCAPDEF("OVERLAYARITHSTRETCHYN", dwFXCaps, DDFXCAPS_OVERLAYARITHSTRETCHYN), - DDCAPDEF("OVERLAYSHRINKX", dwFXCaps, DDFXCAPS_OVERLAYSHRINKX), - DDCAPDEF("OVERLAYSHRINKXN", dwFXCaps, DDFXCAPS_OVERLAYSHRINKXN), - DDCAPDEF("OVERLAYSHRINKY", dwFXCaps, DDFXCAPS_OVERLAYSHRINKY), - DDCAPDEF("OVERLAYSHRINKYN", dwFXCaps, DDFXCAPS_OVERLAYSHRINKYN), - DDCAPDEF("OVERLAYSTRETCHX", dwFXCaps, DDFXCAPS_OVERLAYSTRETCHX), - DDCAPDEF("OVERLAYSTRETCHXN", dwFXCaps, DDFXCAPS_OVERLAYSTRETCHXN), - DDCAPDEF("OVERLAYSTRETCHY", dwFXCaps, DDFXCAPS_OVERLAYSTRETCHY), - DDCAPDEF("OVERLAYSTRETCHYN", dwFXCaps, DDFXCAPS_OVERLAYSTRETCHYN), - DDCAPDEF("OVERLAYMIRRORLEFTRIGHT", dwFXCaps, DDFXCAPS_OVERLAYMIRRORLEFTRIGHT), - DDCAPDEF("OVERLAYMIRRORUPDOWN", dwFXCaps, DDFXCAPS_OVERLAYMIRRORUPDOWN), - { "", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF PalCapsDefs[] = -{ - DDCAPDEF("4BIT", dwPalCaps, DDPCAPS_4BIT), - DDCAPDEF("8BITENTRIES", dwPalCaps, DDPCAPS_8BITENTRIES), - DDCAPDEF("8BIT", dwPalCaps, DDPCAPS_8BIT), - DDCAPDEF("INITIALIZE", dwPalCaps, DDPCAPS_INITIALIZE), - DDCAPDEF("PRIMARYSURFACE", dwPalCaps, DDPCAPS_PRIMARYSURFACE), - DDCAPDEF("PRIMARYSURFACELEFT",dwPalCaps, DDPCAPS_PRIMARYSURFACELEFT), - DDCAPDEF("VSYNC", dwPalCaps, DDPCAPS_VSYNC), - { "", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF SurfCapsDefs[] = -{ - DDCAPDEF( "3D", ddsCaps.dwCaps, DDSCAPS_3D), - DDCAPDEF( "3DDEVICE", ddsCaps.dwCaps, DDSCAPS_3DDEVICE), - DDCAPDEF( "ALPHA", ddsCaps.dwCaps, DDSCAPS_ALPHA), - DDCAPDEF( "BACKBUFFER", ddsCaps.dwCaps, DDSCAPS_BACKBUFFER), - DDCAPDEF( "COMPLEX", ddsCaps.dwCaps, DDSCAPS_COMPLEX), - DDCAPDEF( "FLIP", ddsCaps.dwCaps, DDSCAPS_FLIP), - DDCAPDEF( "FRONTBUFFER", ddsCaps.dwCaps, DDSCAPS_FRONTBUFFER), - DDCAPDEF( "MIPMAP", ddsCaps.dwCaps, DDSCAPS_MIPMAP), - DDCAPDEF( "OFFSCREENPLAIN", ddsCaps.dwCaps, DDSCAPS_OFFSCREENPLAIN), - DDCAPDEF( "OVERLAY", ddsCaps.dwCaps, DDSCAPS_OVERLAY), - DDCAPDEF( "PALETTE", ddsCaps.dwCaps, DDSCAPS_PALETTE), - DDCAPDEF( "PRIMARYSURFACE", ddsCaps.dwCaps, DDSCAPS_PRIMARYSURFACE), - DDCAPDEF( "PRIMARYSURFACELEFT", ddsCaps.dwCaps, DDSCAPS_PRIMARYSURFACELEFT), - DDCAPDEF( "SYSTEMMEMORY", ddsCaps.dwCaps, DDSCAPS_SYSTEMMEMORY), - DDCAPDEF( "TEXTURE", ddsCaps.dwCaps, DDSCAPS_TEXTURE), - DDCAPDEF( "VIDEOMEMORY", ddsCaps.dwCaps, DDSCAPS_VIDEOMEMORY), - DDCAPDEF( "VISIBLE", ddsCaps.dwCaps, DDSCAPS_VISIBLE), - DDCAPDEF( "WRITEONLY", ddsCaps.dwCaps, DDSCAPS_WRITEONLY), - DDCAPDEF( "ZBUFFER", ddsCaps.dwCaps, DDSCAPS_ZBUFFER), - DDCAPDEF( "OWNDC", ddsCaps.dwCaps, DDSCAPS_OWNDC), - DDCAPDEF( "LIVEVIDEO", ddsCaps.dwCaps, DDSCAPS_LIVEVIDEO), - DDCAPDEF( "HWCODEC", ddsCaps.dwCaps, DDSCAPS_HWCODEC), - DDCAPDEF( "MODEX", ddsCaps.dwCaps, DDSCAPS_MODEX), - { "", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF SVisionCapsDefs[] = -{ - DDCAPDEF( "ENIGMA", dwSVCaps, DDSVCAPS_ENIGMA), - DDCAPDEF( "FLICKER", dwSVCaps, DDSVCAPS_FLICKER), - DDCAPDEF( "REDBLUE", dwSVCaps, DDSVCAPS_REDBLUE), - DDCAPDEF( "SPLIT", dwSVCaps, DDSVCAPS_SPLIT), - { "", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF ROPCapsDefs[] = -{ - ROPDEF("SRCCOPY", SRCCOPY), - ROPDEF("SRCPAINT", SRCPAINT), - ROPDEF("SRCAND", SRCAND), - ROPDEF("SRCINVERT", SRCINVERT), - ROPDEF("SRCERASE", SRCERASE), - ROPDEF("NOTSRCCOPY", NOTSRCCOPY), - ROPDEF("NOTSRCERASE",NOTSRCERASE), - ROPDEF("MERGECOPY", MERGECOPY), - ROPDEF("MERGEPAINT", MERGEPAINT), - ROPDEF("PATCOPY", PATCOPY), - ROPDEF("PATPAINT", PATPAINT), - ROPDEF("PATINVERT", PATINVERT), - ROPDEF("DSTINVERT", DSTINVERT), - ROPDEF("BLACKNESS", BLACKNESS), - ROPDEF("WHITENESS", WHITENESS), - {"", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEFS DDCapDefs[] = -{ - {"", DDAddCaps, (LPARAM)OtherInfoDefs}, - {"General", DDAddCaps, (LPARAM)OtherInfoDefs}, - {"General Caps", DDAddCaps, (LPARAM)CapsDefs}, - {"Color Key Caps", DDAddCaps, (LPARAM)CKeyCapsDefs}, - {"FX Caps", DDAddCaps, (LPARAM)FXCapsDefs}, - {"Palette Caps", DDAddCaps, (LPARAM)PalCapsDefs}, - {"Surface Caps", DDAddCaps, (LPARAM)SurfCapsDefs}, - {"Stereo Vision Caps", DDAddCaps, (LPARAM)SVisionCapsDefs}, - {"ROPS", DDAddCaps, (LPARAM)ROPCapsDefs}, - {"Video Modes", DDAddVideoModes, (LPARAM)0}, - {"FourCCFormat", DDFourCCFormat, (LPARAM)0}, - { NULL, 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -#ifdef DX_3D -CAPDEF ValidFlags[] = -{ - D3CAPDEF("COLORMODEL", dwFlags, D3DDD_COLORMODEL), - D3CAPDEF("DEVCAPS", dwFlags, D3DDD_DEVCAPS), - D3CAPDEF("TRANSFORMCAPS", dwFlags, D3DDD_TRANSFORMCAPS), - D3CAPDEF("LIGHTINGCAPS", dwFlags, D3DDD_LIGHTINGCAPS), - D3CAPDEF("BCLIPPING", dwFlags, D3DDD_BCLIPPING), - D3CAPDEF("LINECAPS", dwFlags, D3DDD_LINECAPS), - D3CAPDEF("TRICAPS", dwFlags, D3DDD_TRICAPS), - D3CAPDEF("DEVICERENDERBITDEPTH", dwFlags, D3DDD_DEVICERENDERBITDEPTH), - D3CAPDEF("DEVICEZBUFFERBITDEPTH", dwFlags, D3DDD_DEVICEZBUFFERBITDEPTH), - D3CAPDEF("MAXBUFFERSIZE", dwFlags, D3DDD_MAXBUFFERSIZE), - D3CAPDEF("MAXVERTEXCOUNT", dwFlags, D3DDD_MAXVERTEXCOUNT), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF ColorModel[] = -{ - D3CAPDEF("D3DCOLOR_MONO", dcmColorModel, D3DCOLOR_MONO), - D3CAPDEF("D3DCOLOR_RGB", dcmColorModel, D3DCOLOR_RGB), - {"",0,0} - }; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF DevCaps[] = -{ - D3CAPDEF("SORTINCREASINGZ", dwDevCaps, D3DDEVCAPS_SORTINCREASINGZ), - D3CAPDEF("SORTDECREASINGZ", dwDevCaps, D3DDEVCAPS_SORTDECREASINGZ), - D3CAPDEF("SORTEXACT", dwDevCaps, D3DDEVCAPS_SORTEXACT), - D3CAPDEF("EXECUTESYSTEMMEMORY", dwDevCaps, D3DDEVCAPS_EXECUTESYSTEMMEMORY), - D3CAPDEF("EXECUTEVIDEOMEMORY", dwDevCaps, D3DDEVCAPS_EXECUTEVIDEOMEMORY), - D3CAPDEF("TLVERTEXSYSTEMEMORY", dwDevCaps, D3DDEVCAPS_TLVERTEXSYSTEMMEMORY), - D3CAPDEF("TLVERTEXVIDEOMEMORY", dwDevCaps, D3DDEVCAPS_TLVERTEXVIDEOMEMORY), - D3CAPDEF("TEXTURESYSTEMMEMORY", dwDevCaps, D3DDEVCAPS_TEXTURESYSTEMMEMORY), - D3CAPDEF("TEXTUREVIDEOMEMORY", dwDevCaps, D3DDEVCAPS_TEXTUREVIDEOMEMORY), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF TransformCaps[] = -{ - D3CAPDEF("CLIP", dtcTransformCaps.dwCaps, D3DTRANSFORMCAPS_CLIP), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF LightingCaps[] = -{ - D3CAPDEF("D3DLIGHTINGMODEL_RGB", dlcLightingCaps.dwLightingModel, D3DLIGHTINGMODEL_RGB), - D3CAPDEF("D3DLIGHTINGMODEL_MONO", dlcLightingCaps.dwLightingModel, D3DLIGHTINGMODEL_MONO), - - D3CAPDEF("D3DLIGHTCAPS_POINT", dlcLightingCaps.dwCaps, D3DLIGHTCAPS_POINT), - D3CAPDEF("D3DLIGHTCAPS_SPOT", dlcLightingCaps.dwCaps, D3DLIGHTCAPS_SPOT), - D3CAPDEF("D3DLIGHTCAPS_DIRECTIONAL", dlcLightingCaps.dwCaps, D3DLIGHTCAPS_DIRECTIONAL), - D3CAPDEF("D3DLIGHTCAPS_PARALLELPOINT", dlcLightingCaps.dwCaps, D3DLIGHTCAPS_PARALLELPOINT), - D3CAPDEF("D3DLIGHTCAPS_GLSPOT", dlcLightingCaps.dwCaps, D3DLIGHTCAPS_GLSPOT), - D3VALDEF("dwNumLights", dlcLightingCaps.dwNumLights), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF BClipping[] = -{ - D3CAPDEF("bClipping", bClipping, TRUE), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF LineCaps[] = -{ - D3CAPDEF("D3DPMISCCAPS_MASKPLANES", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_MASKPLANES), - D3CAPDEF("D3DPMISCCAPS_MASKZ", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_MASKZ), - D3CAPDEF("D3DPMISCCAPS_LINEPATTERNREP", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_LINEPATTERNREP), - D3CAPDEF("D3DPMISCCAPS_CONFORMANT", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_CONFORMANT), - D3CAPDEF("D3DPMISCCAPS_CULLNONE", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_CULLNONE), - D3CAPDEF("D3DPMISCCAPS_CULLCW", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_CULLCW), - D3CAPDEF("D3DPMISCCAPS_CULLCCW", dpcLineCaps.dwMiscCaps, D3DPMISCCAPS_CULLCCW), - - D3CAPDEF("D3DPRASTERCAPS_DITHER", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_DITHER), - D3CAPDEF("D3DPRASTERCAPS_ROP2", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_ROP2), - D3CAPDEF("D3DPRASTERCAPS_XOR", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_XOR), - D3CAPDEF("D3DPRASTERCAPS_PAT", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_PAT), - D3CAPDEF("D3DPRASTERCAPS_ZTEST", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_ZTEST), - D3CAPDEF("D3DPRASTERCAPS_SUBPIXEL", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_SUBPIXEL), - D3CAPDEF("D3DPRASTERCAPS_SUBPIXELX", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_SUBPIXELX), - D3CAPDEF("D3DPRASTERCAPS_FOGVERTEX", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_FOGVERTEX), - D3CAPDEF("D3DPRASTERCAPS_FOGTABLE", dpcLineCaps.dwRasterCaps, D3DPRASTERCAPS_FOGTABLE), - - D3CAPDEF("D3DPCMPCAPS_NEVER", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_NEVER ), - D3CAPDEF("D3DPCMPCAPS_LESS", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_LESS ), - D3CAPDEF("D3DPCMPCAPS_EQUAL", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_EQUAL ), - D3CAPDEF("D3DPCMPCAPS_LESSEQUAL", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_LESSEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATER", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_GREATER ), - D3CAPDEF("D3DPCMPCAPS_NOTEQUAL", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_NOTEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_GREATEREQUAL ), - D3CAPDEF("D3DPCMPCAPS_ALWAYS", dpcLineCaps.dwZCmpCaps, D3DPCMPCAPS_ALWAYS ), - - D3CAPDEF("D3DPBLENDCAPS_ZERO", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_ZERO ), - D3CAPDEF("D3DPBLENDCAPS_ONE", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_ONE ), - D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_SRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVSRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHA", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_SRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTALPHA", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_DESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVDESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_DESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVDESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_SRCALPHASAT ), - D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_BOTHSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA", dpcLineCaps.dwSrcBlendCaps, D3DPBLENDCAPS_BOTHINVSRCALPHA ), - - D3CAPDEF("D3DPBLENDCAPS_ZERO", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_ZERO ), - D3CAPDEF("D3DPBLENDCAPS_ONE", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_ONE ), - D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_SRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVSRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHA", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_SRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTALPHA", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_DESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVDESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_DESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVDESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_SRCALPHASAT ), - D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_BOTHSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA", dpcLineCaps.dwDestBlendCaps, D3DPBLENDCAPS_BOTHINVSRCALPHA ), - - D3CAPDEF("D3DPCMPCAPS_NEVER", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_NEVER ), - D3CAPDEF("D3DPCMPCAPS_LESS", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_LESS ), - D3CAPDEF("D3DPCMPCAPS_EQUAL", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_EQUAL ), - D3CAPDEF("D3DPCMPCAPS_LESSEQUAL", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_LESSEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATER", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_GREATER ), - D3CAPDEF("D3DPCMPCAPS_NOTEQUAL", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_NOTEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_GREATEREQUAL ), - D3CAPDEF("D3DPCMPCAPS_ALWAYS", dpcLineCaps.dwAlphaCmpCaps, D3DPCMPCAPS_ALWAYS ), - - D3CAPDEF("D3DPSHADECAPS_COLORFLATMONO", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_COLORFLATMONO ), - D3CAPDEF("D3DPSHADECAPS_COLORFLATRGB", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_COLORFLATRGB ), - D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDMONO", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_COLORGOURAUDMONO ), - D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDRGB", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_COLORGOURAUDRGB ), - D3CAPDEF("D3DPSHADECAPS_COLORPHONGMONO", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_COLORPHONGMONO ), - D3CAPDEF("D3DPSHADECAPS_COLORPHONGRGB", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_COLORPHONGRGB ), - - D3CAPDEF("D3DPSHADECAPS_SPECULARFLATMONO", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARFLATMONO ), - D3CAPDEF("D3DPSHADECAPS_SPECULARFLATRGB", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARFLATRGB ), - D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDMONO", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARGOURAUDMONO ), - D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDRGB", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARGOURAUDRGB ), - D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGMONO", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARPHONGMONO ), - D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGRGB", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARPHONGRGB ), - - D3CAPDEF("D3DPSHADECAPS_ALPHAFLATBLEND", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAFLATBLEND ), - D3CAPDEF("D3DPSHADECAPS_ALPHAFLATSTIPPLED", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAFLATSTIPPLED ), - D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDBLEND", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAGOURAUDBLEND ), - D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED), - D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGBLEND", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAPHONGBLEND ), - D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGSTIPPLED", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAPHONGSTIPPLED ), - - D3CAPDEF("D3DPSHADECAPS_FOGFLAT", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_FOGFLAT ), - D3CAPDEF("D3DPSHADECAPS_FOGGOURAUD", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_FOGGOURAUD ), - D3CAPDEF("D3DPSHADECAPS_FOGPHONG", dpcLineCaps.dwShadeCaps, D3DPSHADECAPS_FOGPHONG ), - - D3CAPDEF("D3DPTEXTURECAPS_PERSPECTIVE", dpcLineCaps.dwTextureCaps, D3DPTEXTURECAPS_PERSPECTIVE ), - D3CAPDEF("D3DPTEXTURECAPS_POW2", dpcLineCaps.dwTextureCaps, D3DPTEXTURECAPS_POW2 ), - D3CAPDEF("D3DPTEXTURECAPS_ALPHA", dpcLineCaps.dwTextureCaps, D3DPTEXTURECAPS_ALPHA ), - D3CAPDEF("D3DPTEXTURECAPS_TRANSPARENCY", dpcLineCaps.dwTextureCaps, D3DPTEXTURECAPS_TRANSPARENCY ), - D3CAPDEF("D3DPTEXTURECAPS_BORDER", dpcLineCaps.dwTextureCaps, D3DPTEXTURECAPS_BORDER ), - D3CAPDEF("D3DPTEXTURECAPS_SQUAREONLY", dpcLineCaps.dwTextureCaps, D3DPTEXTURECAPS_SQUAREONLY ), - - - D3CAPDEF("D3DPTFILTERCAPS_NEAREST", dpcLineCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_NEAREST ), - D3CAPDEF("D3DPTFILTERCAPS_LINEAR", dpcLineCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_LINEAR ), - D3CAPDEF("D3DPTFILTERCAPS_MIPNEAREST", dpcLineCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_MIPNEAREST ), - D3CAPDEF("D3DPTFILTERCAPS_MIPLINEAR", dpcLineCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_MIPLINEAR ), - D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPNEAREST", dpcLineCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_LINEARMIPNEAREST ), - D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPLINEAR", dpcLineCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_LINEARMIPLINEAR ), - - - D3CAPDEF("D3DPTBLENDCAPS_DECAL", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_DECAL ), - D3CAPDEF("D3DPTBLENDCAPS_MODULATE", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_MODULATE ), - D3CAPDEF("D3DPTBLENDCAPS_DECALALPHA", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_DECALALPHA ), - D3CAPDEF("D3DPTBLENDCAPS_MODULATEALPHA", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_MODULATEALPHA ), - D3CAPDEF("D3DPTBLENDCAPS_DECALMASK", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_DECALMASK ), - D3CAPDEF("D3DPTBLENDCAPS_MODULATEMASK", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_MODULATEMASK ), - D3CAPDEF("D3DPTBLENDCAPS_COPY", dpcLineCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_COPY ), - - D3CAPDEF("D3DPTADDRESSCAPS_WRAP", dpcLineCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_WRAP ), - D3CAPDEF("D3DPTADDRESSCAPS_MIRROR", dpcLineCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_MIRROR ), - D3CAPDEF("D3DPTADDRESSCAPS_CLAMP", dpcLineCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_CLAMP ), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF TriCaps[] = -{ - D3CAPDEF("D3DPMISCCAPS_MASKPLANES", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_MASKPLANES), - D3CAPDEF("D3DPMISCCAPS_MASKZ", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_MASKZ), - D3CAPDEF("D3DPMISCCAPS_LINEPATTERNREP", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_LINEPATTERNREP), - D3CAPDEF("D3DPMISCCAPS_CONFORMANT", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_CONFORMANT), - D3CAPDEF("D3DPMISCCAPS_CULLNONE", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_CULLNONE), - D3CAPDEF("D3DPMISCCAPS_CULLCW", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_CULLCW), - D3CAPDEF("D3DPMISCCAPS_CULLCCW", dpcTriCaps.dwMiscCaps, D3DPMISCCAPS_CULLCCW), - - D3CAPDEF("D3DPRASTERCAPS_DITHER", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_DITHER), - D3CAPDEF("D3DPRASTERCAPS_ROP2", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_ROP2), - D3CAPDEF("D3DPRASTERCAPS_XOR", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_XOR), - D3CAPDEF("D3DPRASTERCAPS_PAT", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_PAT), - D3CAPDEF("D3DPRASTERCAPS_ZTEST", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_ZTEST), - D3CAPDEF("D3DPRASTERCAPS_SUBPIXEL", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_SUBPIXEL), - D3CAPDEF("D3DPRASTERCAPS_SUBPIXELX", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_SUBPIXELX), - D3CAPDEF("D3DPRASTERCAPS_FOGVERTEX", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_FOGVERTEX), - D3CAPDEF("D3DPRASTERCAPS_FOGTABLE", dpcTriCaps.dwRasterCaps, D3DPRASTERCAPS_FOGTABLE), - - D3CAPDEF("D3DPCMPCAPS_NEVER", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_NEVER ), - D3CAPDEF("D3DPCMPCAPS_LESS", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_LESS ), - D3CAPDEF("D3DPCMPCAPS_EQUAL", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_EQUAL ), - D3CAPDEF("D3DPCMPCAPS_LESSEQUAL", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_LESSEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATER", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_GREATER ), - D3CAPDEF("D3DPCMPCAPS_NOTEQUAL", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_NOTEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_GREATEREQUAL ), - D3CAPDEF("D3DPCMPCAPS_ALWAYS", dpcTriCaps.dwZCmpCaps, D3DPCMPCAPS_ALWAYS ), - - D3CAPDEF("D3DPBLENDCAPS_ZERO", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_ZERO ), - D3CAPDEF("D3DPBLENDCAPS_ONE", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_ONE ), - D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_SRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVSRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHA", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_SRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTALPHA", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_DESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVDESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_DESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_INVDESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_SRCALPHASAT ), - D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_BOTHSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA", dpcTriCaps.dwSrcBlendCaps, D3DPBLENDCAPS_BOTHINVSRCALPHA ), - - D3CAPDEF("D3DPBLENDCAPS_ZERO", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_ZERO ), - D3CAPDEF("D3DPBLENDCAPS_ONE", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_ONE ), - D3CAPDEF("D3DPBLENDCAPS_SRCCOLOR", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_SRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCCOLOR", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVSRCCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHA", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_SRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVSRCALPHA", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTALPHA", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_DESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTALPHA", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVDESTALPHA ), - D3CAPDEF("D3DPBLENDCAPS_DESTCOLOR", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_DESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_INVDESTCOLOR", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_INVDESTCOLOR ), - D3CAPDEF("D3DPBLENDCAPS_SRCALPHASAT", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_SRCALPHASAT ), - D3CAPDEF("D3DPBLENDCAPS_BOTHSRCALPHA", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_BOTHSRCALPHA ), - D3CAPDEF("D3DPBLENDCAPS_BOTHINVSRCALPHA", dpcTriCaps.dwDestBlendCaps, D3DPBLENDCAPS_BOTHINVSRCALPHA ), - - D3CAPDEF("D3DPCMPCAPS_NEVER", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_NEVER ), - D3CAPDEF("D3DPCMPCAPS_LESS", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_LESS ), - D3CAPDEF("D3DPCMPCAPS_EQUAL", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_EQUAL ), - D3CAPDEF("D3DPCMPCAPS_LESSEQUAL", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_LESSEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATER", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_GREATER ), - D3CAPDEF("D3DPCMPCAPS_NOTEQUAL", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_NOTEQUAL ), - D3CAPDEF("D3DPCMPCAPS_GREATEREQUAL", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_GREATEREQUAL ), - D3CAPDEF("D3DPCMPCAPS_ALWAYS", dpcTriCaps.dwAlphaCmpCaps, D3DPCMPCAPS_ALWAYS ), - - D3CAPDEF("D3DPSHADECAPS_COLORFLATMONO", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_COLORFLATMONO ), - D3CAPDEF("D3DPSHADECAPS_COLORFLATRGB", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_COLORFLATRGB ), - D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDMONO", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_COLORGOURAUDMONO ), - D3CAPDEF("D3DPSHADECAPS_COLORGOURAUDRGB", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_COLORGOURAUDRGB ), - D3CAPDEF("D3DPSHADECAPS_COLORPHONGMONO", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_COLORPHONGMONO ), - D3CAPDEF("D3DPSHADECAPS_COLORPHONGRGB", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_COLORPHONGRGB ), - - D3CAPDEF("D3DPSHADECAPS_SPECULARFLATMONO", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARFLATMONO ), - D3CAPDEF("D3DPSHADECAPS_SPECULARFLATRGB", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARFLATRGB ), - D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDMONO", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARGOURAUDMONO ), - D3CAPDEF("D3DPSHADECAPS_SPECULARGOURAUDRGB", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARGOURAUDRGB ), - D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGMONO", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARPHONGMONO ), - D3CAPDEF("D3DPSHADECAPS_SPECULARPHONGRGB", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_SPECULARPHONGRGB ), - - D3CAPDEF("D3DPSHADECAPS_ALPHAFLATBLEND", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAFLATBLEND ), - D3CAPDEF("D3DPSHADECAPS_ALPHAFLATSTIPPLED", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAFLATSTIPPLED ), - D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDBLEND", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAGOURAUDBLEND ), - D3CAPDEF("D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED), - D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGBLEND", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAPHONGBLEND ), - D3CAPDEF("D3DPSHADECAPS_ALPHAPHONGSTIPPLED", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_ALPHAPHONGSTIPPLED ), - - D3CAPDEF("D3DPSHADECAPS_FOGFLAT", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_FOGFLAT ), - D3CAPDEF("D3DPSHADECAPS_FOGGOURAUD", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_FOGGOURAUD ), - D3CAPDEF("D3DPSHADECAPS_FOGPHONG", dpcTriCaps.dwShadeCaps, D3DPSHADECAPS_FOGPHONG ), - - D3CAPDEF("D3DPTEXTURECAPS_PERSPECTIVE", dpcTriCaps.dwTextureCaps, D3DPTEXTURECAPS_PERSPECTIVE ), - D3CAPDEF("D3DPTEXTURECAPS_POW2", dpcTriCaps.dwTextureCaps, D3DPTEXTURECAPS_POW2 ), - D3CAPDEF("D3DPTEXTURECAPS_ALPHA", dpcTriCaps.dwTextureCaps, D3DPTEXTURECAPS_ALPHA ), - D3CAPDEF("D3DPTEXTURECAPS_TRANSPARENCY", dpcTriCaps.dwTextureCaps, D3DPTEXTURECAPS_TRANSPARENCY ), - D3CAPDEF("D3DPTEXTURECAPS_BORDER", dpcTriCaps.dwTextureCaps, D3DPTEXTURECAPS_BORDER ), - D3CAPDEF("D3DPTEXTURECAPS_SQUAREONLY", dpcTriCaps.dwTextureCaps, D3DPTEXTURECAPS_SQUAREONLY ), - - - D3CAPDEF("D3DPTFILTERCAPS_NEAREST", dpcTriCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_NEAREST ), - D3CAPDEF("D3DPTFILTERCAPS_LINEAR", dpcTriCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_LINEAR ), - D3CAPDEF("D3DPTFILTERCAPS_MIPNEAREST", dpcTriCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_MIPNEAREST ), - D3CAPDEF("D3DPTFILTERCAPS_MIPLINEAR", dpcTriCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_MIPLINEAR ), - D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPNEAREST", dpcTriCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_LINEARMIPNEAREST ), - D3CAPDEF("D3DPTFILTERCAPS_LINEARMIPLINEAR", dpcTriCaps.dwTextureFilterCaps, D3DPTFILTERCAPS_LINEARMIPLINEAR ), - - - D3CAPDEF("D3DPTBLENDCAPS_DECAL", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_DECAL ), - D3CAPDEF("D3DPTBLENDCAPS_MODULATE", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_MODULATE ), - D3CAPDEF("D3DPTBLENDCAPS_DECALALPHA", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_DECALALPHA ), - D3CAPDEF("D3DPTBLENDCAPS_MODULATEALPHA", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_MODULATEALPHA ), - D3CAPDEF("D3DPTBLENDCAPS_DECALMASK", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_DECALMASK ), - D3CAPDEF("D3DPTBLENDCAPS_MODULATEMASK", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_MODULATEMASK ), - D3CAPDEF("D3DPTBLENDCAPS_COPY", dpcTriCaps.dwTextureBlendCaps, D3DPTBLENDCAPS_COPY ), - - D3CAPDEF("D3DPTADDRESSCAPS_WRAP", dpcTriCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_WRAP ), - D3CAPDEF("D3DPTADDRESSCAPS_MIRROR", dpcTriCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_MIRROR ), - D3CAPDEF("D3DPTADDRESSCAPS_CLAMP", dpcTriCaps.dwTextureAddressCaps, D3DPTADDRESSCAPS_CLAMP ), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF D3dMisc[] = -{ - D3VALDEF("MaxBufferSize", dwMaxBufferSize), - D3VALDEF("MaxVertexCount", dwMaxVertexCount), - D3VALDEF("DeviceRenderBitDepth", dwDeviceRenderBitDepth), - D3VALDEF("DeviceZBufferBitDepth", dwDeviceZBufferBitDepth), - {"",0,0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEFS D3CapDefs[] = -{ - {"", D3AddCaps, (LPARAM)ValidFlags}, - {"ColorModel", D3AddCaps, (LPARAM)ColorModel}, - {"DevCaps", D3AddCaps, (LPARAM)DevCaps}, - {"TransformCaps", D3AddCaps, (LPARAM)TransformCaps}, - {"LightingCaps", D3AddCaps, (LPARAM)LightingCaps}, - {"BClipping", D3AddCaps, (LPARAM)BClipping}, - {"LineCaps", D3AddCaps, (LPARAM)LineCaps}, - {"TriCaps", D3AddCaps, (LPARAM)TriCaps}, - {"Misc", D3AddCaps, (LPARAM)D3dMisc}, - {NULL, 0, 0} -}; -#endif - -/**************************************************************************** - ***************************************************************************/ -CAPDEF DSInfo[] = -{ - DSVALDEF("MinSecondarySampleRate", dwMinSecondarySampleRate), - DSVALDEF("MaxSecondarySampleRate", dwMaxSecondarySampleRate), - DSVALDEF("PrimaryBuffers", dwPrimaryBuffers), - DSVALDEF("MaxHwMixingAllBuffers", dwMaxHwMixingAllBuffers), - DSVALDEF("MaxHwMixingStaticBuffers", dwMaxHwMixingStaticBuffers), - DSVALDEF("MaxHwMixingStreamingBuffers", dwMaxHwMixingStreamingBuffers), - DSVALDEF("FreeHwMixingAllBuffers", dwFreeHwMixingAllBuffers), - DSVALDEF("FreeHwMixingStaticBuffers", dwFreeHwMixingStaticBuffers), - DSVALDEF("FreeHwMixingStreamingBuffers", dwFreeHwMixingStreamingBuffers), - DSVALDEF("MaxHw3DAllBuffers", dwMaxHw3DAllBuffers), - DSVALDEF("MaxHw3DStaticBuffers", dwMaxHw3DStaticBuffers), - DSVALDEF("MaxHw3DStreamingBuffers", dwMaxHw3DStreamingBuffers), - DSVALDEF("FreeHw3DAllBuffers", dwFreeHw3DAllBuffers), - DSVALDEF("FreeHw3DStaticBuffers", dwFreeHw3DStaticBuffers), - DSVALDEF("FreeHw3DStreamingBuffers", dwFreeHw3DStreamingBuffers), - DSVALDEF("TotalHwMemBytes", dwTotalHwMemBytes), - DSVALDEF("FreeHwMemBytes", dwFreeHwMemBytes), - DSVALDEF("MaxContigFreeHwMemBytes", dwMaxContigFreeHwMemBytes), - DSVALDEF("UnlockTransferRateHwBuffers", dwUnlockTransferRateHwBuffers), - DSVALDEF("PlayCpuOverheadSwBuffers", dwPlayCpuOverheadSwBuffers), - {"", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF DSGeneralCaps[] = -{ - DSCAPDEF("PRIMARYMONO", dwFlags, DSCAPS_PRIMARYMONO), - DSCAPDEF("PRIMARYSTEREO", dwFlags, DSCAPS_PRIMARYSTEREO), - DSCAPDEF("PRIMARY8BIT", dwFlags, DSCAPS_PRIMARY8BIT), - DSCAPDEF("PRIMARY16BIT", dwFlags, DSCAPS_PRIMARY16BIT), - DSCAPDEF("CONTINUOUSRATE", dwFlags, DSCAPS_CONTINUOUSRATE), - DSCAPDEF("EMULDRIVER", dwFlags, DSCAPS_EMULDRIVER), - DSCAPDEF("SECONDARYMONO", dwFlags, DSCAPS_SECONDARYMONO), - DSCAPDEF("SECONDARYSTEREO", dwFlags, DSCAPS_SECONDARYSTEREO), - DSCAPDEF("SECONDARY8BIT", dwFlags, DSCAPS_SECONDARY8BIT), - DSCAPDEF("SECONDARY16BIT", dwFlags, DSCAPS_SECONDARY16BIT), - {"", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEFS DSCapDefs[] = -{ - {"", DSAddCaps, (LPARAM)DSInfo}, - {"General", DSAddCaps, (LPARAM)DSInfo}, - {"General Caps", DSAddCaps, (LPARAM)DSGeneralCaps}, - {NULL, 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEF DPInfo[] = -{ - DPVALDEF("MaxBufferSize", dwMaxBufferSize), - DPVALDEF("MaxQueueSize", dwMaxQueueSize), - DPVALDEF("MaxPlayers", dwMaxPlayers), - DPVALDEF("HundredBaud", dwHundredBaud), - DPVALDEF("Latency", dwLatency), - {"", 0, 0} -}; - -/**************************************************************************** - ***************************************************************************/ -CAPDEFS DPCapDefs[] = -{ - {"", DPAddCaps, (LPARAM)DPInfo}, - {"General", DPAddCaps, (LPARAM)DPInfo}, - {"Sessions", DPAddSessions, (LPARAM)0}, - {NULL, 0, 0} -}; - -//================================================================ -// WinMain - entry point -//================================================================ -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - g_hInstance = hInstance; // Store instance handle in our global variable - - if (InitInstance(hInstance, lpCmdLine, nCmdShow, DXView_WIDTH, DXView_HEIGHT)) - { - while(GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - return(msg.wParam); -} - -//================================================================ -// InitInstance - create main window -//================================================================ -BOOL InitInstance(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow, int iWidth, int iHeight) -{ - WNDCLASS wc; - - wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s). - wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure - wc.cbClsExtra = 0; // No per-class extra data. - wc.cbWndExtra = 0; // No per-window extra data. - wc.hInstance = hInstance; // Owner of this class - wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DIRECTX)); // Icon name from .RC - wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SPLIT));// Cursor - wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); // Default color - wc.lpszMenuName = "Menu"; // Menu name from .RC - wc.lpszClassName = g_szClassName; // Name to register as - - if(!RegisterClass(&wc)) - { - return FALSE; - } - - // Create a main window for this application instance. - g_hwndMain = CreateWindowEx( - 0, - g_szClassName, // See RegisterClass() call. - g_szTitle, // Text for window title bar. - WS_OVERLAPPEDWINDOW,// Window style. - CW_USEDEFAULT, CW_USEDEFAULT, iWidth, iHeight, // Use default positioning - NULL, // Overlapped windows have no parent. - NULL, // Use the window class menu. - hInstance, // This instance owns this window. - NULL); - - // If window could not be created, return "failure" - if (!g_hwndMain) - { - return(FALSE); - } - - // Make the window visible; update its client area; and return "success" - ShowWindow(g_hwndMain, nCmdShow); // Show the window - - return(TRUE); // We succeeded... -} - -//================================================================ -// WndProc - main window proc -//================================================================ -LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_CREATE: - return DXView_OnCreate(hwnd); - - case WM_SIZE: - DXView_OnSize(hwnd); - break; - - case WM_LBUTTONDOWN: - g_bSplitMove = TRUE; - SetCapture(hwnd); - break; - - case WM_LBUTTONUP: - g_bSplitMove = FALSE; - ReleaseCapture(); - break; - - case WM_MOUSEMOVE: - if(g_bSplitMove) - { - g_xPaneSplit = (LOWORD(lParam) - g_xHalfSplitWidth); - DXView_OnSize(hwnd); - } - break; - - case WM_NOTIFY: - if (((NMHDR*)lParam)->hwndFrom == g_hwndTV) - { - if (((NMHDR*)lParam)->code == TVN_SELCHANGED) - DXView_OnTreeSelect(g_hwndTV, (NM_TREEVIEW*)lParam); - } - - if (((NMHDR*)lParam)->hwndFrom == g_hwndLV) - { - if (((NMHDR*)lParam)->code == NM_RDBLCLK) - DXView_OnListViewDblClick(g_hwndLV, (NM_LISTVIEW*)lParam); - } - - break; - - case WM_COMMAND: // message: command from application menu - DXView_OnCommand(hwnd, wParam); - break; - - case WM_CLOSE: - DestroyWindow(hwnd); - return 0; - - case WM_DESTROY: // message: window being destroyed - DXView_Cleanup(); // Free per item struct for all items - PostQuitMessage(0); - break; - } - - return(DefWindowProc(hwnd, message, wParam, lParam)); -} - -//================================================================ -//================================================================ -BOOL DXView_OnCreate(HWND hwnd) -{ - HDC hDC; - int PixelsPerInch; - TEXTMETRIC tm; - static TCHAR szBuf[MAX_PATH]; - - hDC = GetDC(hwnd); - PixelsPerInch = GetDeviceCaps(hDC, LOGPIXELSX); - g_hFont = GetStockObject(ANSI_FIXED_FONT); - SelectObject(hDC, g_hFont); - GetTextMetrics(hDC, &tm); - g_tmAveCharWidth = tm.tmAveCharWidth; - ReleaseDC(hwnd, hDC); - - // Initialize global data - g_dwViewState = IDM_VIEWAVAIL; - g_xPaneSplit = PixelsPerInch * 9 / 4; // 2.25 inches - g_xHalfSplitWidth = GetSystemMetrics(SM_CXSIZEFRAME) / 2; - - // Make sure that the common control library read to rock - InitCommonControls(); - - CheckMenuItem(GetMenu(hwnd), g_dwViewState, MF_BYCOMMAND | MF_CHECKED); - - // Create the list view window. - g_hwndLV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, "", - WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT, - 0, 0, 0, 0, hwnd, (HMENU)IDC_LV, g_hInstance, NULL); - - // create the tree view window. - g_hwndTV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "", - WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | - TVS_HASBUTTONS | TVS_LINESATROOT, - 0, 0, 0, 0, hwnd, (HMENU)IDC_TV, g_hInstance, NULL); - - // create our image list. - DXView_InitImageList(); - - // Initialize the tree view - DXView_FillTree(g_hwndTV); - - return(TRUE); -} - -//================================================================ -//================================================================ -IDirectDraw * DDCreate(GUID *pid) -{ - if (lpDD && pid == ddid) - return lpDD; - - if (lpDD) - { - IDirectDraw_Release(lpDD); - lpDD = NULL; - } - - // There is no need to create DirectDraw emulation-only just to get - // the HEL caps. In fact, this will fail if there is another DirectDraw - // app running and using the hardware. - if( pid == (GUID *)DDCREATE_EMULATIONONLY ) - { - pid = NULL; - } - if (DirectDrawCreate(pid, &lpDD, NULL) == DD_OK) - { - ddid = pid; - return lpDD; - } - - MessageBox(g_hwndMain, "DirectDrawCreate failed.", g_szAppName, MB_OK); - return NULL; -} - - -//================================================================ -//================================================================ -IDirectSound * DSCreate(GUID *pid) -{ - if (lpDS && pid == dsid) - return lpDS; - - if (lpDS) - IDirectSound_Release(lpDS); - - if (DirectSoundCreate(pid, &lpDS, NULL) == DD_OK) - { - dsid = pid; - return lpDS; - } - - MessageBox(g_hwndMain, "DirectSoundCreate failed.", g_szAppName, MB_OK); - return NULL; -} - -//================================================================ -//================================================================ -IDirectPlay * DPCreate(GUID *pid) -{ - if (lpDP && pid == dpid) - return lpDP; - - if (lpDP) - lpDP->lpVtbl->Release(lpDP); - - if (DirectPlayCreate(pid, &lpDP, NULL) == DD_OK) - { - dpid = pid; - return lpDP; - } - - MessageBox(g_hwndMain, "DirectPlayCreate failed.", g_szAppName, MB_OK); - return NULL; -} - -//================================================================ -//================================================================ -void AddCapsToTV(HTREEITEM hParent, CAPDEFS *pcds, LPARAM lParam1) -{ - HTREEITEM hTree; - BOOL f = TRUE; - - while (pcds->szName) - { - hTree = TVAddNode(hParent, pcds->szName, f, IDI_CAPS, - pcds->Callback, lParam1, pcds->lParam2); - - if (f) - { - hParent = hTree; - f = FALSE; - } - - pcds++; // Get next Cap bit definition - } -} - -//================================================================ -//================================================================ -char c_szYes[] = "Yes"; -char c_szNo[] = "No"; -char c_szCurrentMode[] = "Current Mode"; - -//================================================================ -//================================================================ -void AddCapsToLV(CAPDEF *pcd, LPVOID pv) -{ - DWORD dwValue; - - LVAddColumn(g_hwndLV, 0, "Name", 24); - LVAddColumn(g_hwndLV, 1, "Value", 10); - - while(pcd->szName && *pcd->szName) - { - dwValue = *(DWORD *)(((BYTE *)pv) + pcd->dwOffset); - - if (pcd->dwFlag) - { - if (pcd->dwFlag & dwValue) - { - LVAddText(g_hwndLV, 0, pcd->szName); - LVAddText(g_hwndLV, 1, c_szYes); - } - else if (g_dwViewState == IDM_VIEWALL) - { - LVAddText(g_hwndLV, 0, pcd->szName); - LVAddText(g_hwndLV, 1, c_szNo); - } - } - else - { - LVAddText(g_hwndLV, 0, pcd->szName, "test"); - LVAddText(g_hwndLV, 1, "%d", dwValue); - } - - pcd++; // Get next Cap bit definition - } -} - -//================================================================ -//================================================================ -void DDAddCaps(LPARAM lParam1, LPARAM lParam2) -{ - // lParam1 is the GUID for the driver we should open - // lParam2 is the CAPDEF table we should use - - if (DDCreate((GUID*)lParam1)) - { - DDCAPS ddcaps; - - ddcaps.dwSize = sizeof(ddcaps); - - if (lParam1 == DDCREATE_EMULATIONONLY) - IDirectDraw_GetCaps(lpDD, NULL, &ddcaps); - else - IDirectDraw_GetCaps(lpDD, &ddcaps, NULL); - - AddCapsToLV((CAPDEF *)lParam2, (LPVOID)&ddcaps); - } -} - -//================================================================ -//================================================================ -void DSAddCaps(LPARAM lParam1, LPARAM lParam2) -{ - // lParam1 is the GUID for the driver we should open - // lParam2 is the CAPDEF table we should use - - if (DSCreate((GUID*)lParam1)) - { - DSCAPS dscaps; - - dscaps.dwSize = sizeof(dscaps); - - IDirectSound_GetCaps(lpDS, &dscaps); - - AddCapsToLV((CAPDEF *)lParam2, (LPVOID)&dscaps); - } -} - -//================================================================ -//================================================================ -void DPAddCaps(LPARAM lParam1, LPARAM lParam2) -{ - // lParam1 is the GUID for the driver we should open - // lParam2 is the CAPDEF table we should use - - if (DPCreate((GUID*)lParam1)) - { - DPCAPS dpcaps; - - dpcaps.dwSize = sizeof(dpcaps); - lpDP->lpVtbl->GetCaps(lpDP, &dpcaps); - - AddCapsToLV((CAPDEF *)lParam2, (LPVOID)&dpcaps); - } -} - -//================================================================ -//================================================================ -#ifdef DX_3D -void D3AddCaps(LPARAM lParam1, LPARAM lParam2) -{ - // lParam1 is the CAP3DDEVICEDESC Struct - // lParam2 is the CAPDEF table we should use - - // Unlike other AddCaps function this info has been prethought for us - // so just print it out. - AddCapsToLV((CAPDEF *)lParam2, (LPVOID)lParam1); -} -#endif - -//================================================================ -// EnumSessionsCallback -//================================================================ -BOOL PASCAL EnumSessionsCallback -( -LPDPSESSIONDESC lpDesc, // Pointer to Session Description Struct -LPVOID lpUser, // User definable data passed in from EnumSessions() call. -LPDWORD lpdwTimeOut, // Used to extend the timeout if hosts aren't responding quickly enough. -DWORD dwFlags // Flags (used to notify us when we've timed out). -) -{ - if (dwFlags & DPESC_TIMEDOUT) - { - // We could reset lpdwTimeOut and return true to continue waiting - // NOTE: This does not tell DirectPlay to query again for hosts. - // This just gives potentially slow hosts more time to respond - // to our initial query. - return FALSE; // Stop waiting for hosts - } - - // Add session information to table - LVAddText(g_hwndLV, 0, lpDesc->szSessionName); - LVAddText(g_hwndLV, 1, "%d", lpDesc->dwSession); - LVAddText(g_hwndLV, 2, "%d", lpDesc->dwMaxPlayers); - LVAddText(g_hwndLV, 3, "%d", lpDesc->dwCurrentPlayers); - - return TRUE; -} - -//================================================================ -//================================================================ -void DPAddSessions(LPARAM lParam1, LPARAM lParam2) -{ - // lParam1 is the GUID for the driver we should open - // lParam2 is the CAPDEF table we should use - - DPSESSIONDESC dps; - HCURSOR hCur=NULL; - - dps.dwSize = sizeof(dps); - memset(&dps.guidSession, 0, sizeof(dps.guidSession)); - - hCur=SetCursor(LoadCursor(NULL, IDC_WAIT)); - if (DPCreate((GUID*)lParam1)) - { - LVAddColumn(g_hwndLV, 0, "Name", 24); - LVAddColumn(g_hwndLV, 1, "Session", 7); - LVAddColumn(g_hwndLV, 2, "MaxPlayers", 11); - LVAddColumn(g_hwndLV, 3, "CurrentPlayers", 14); - - lpDP->lpVtbl->EnumSessions(lpDP, &dps, 500, EnumSessionsCallback, NULL, DPENUMSESSIONS_ALL); - } - if (hCur) - SetCursor(hCur); - -} - -//================================================================ -//================================================================ -void DDFourCCFormat(LPARAM lParam1, LPARAM lParam2) -{ - HRESULT ddrval; - int iNumOfCodes,iCount; - DWORD *FourCC; - char szText[5]={0,0,0,0,0}; - - if(lpDD != NULL) - { - ddrval = IDirectDraw_GetFourCCCodes(lpDD,&iNumOfCodes, NULL); - LVAddColumn(g_hwndLV, 0, "Codes", 24); - LVAddColumn(g_hwndLV, 1, "", 24); - if( ddrval == DD_OK) - { - FourCC = GlobalAlloc(GPTR,(sizeof(DWORD)*iNumOfCodes)); - if(FourCC) - { - ddrval = IDirectDraw_GetFourCCCodes(lpDD,&iNumOfCodes, FourCC); - // Assume all FourCC values are ascii strings - for(iCount = 0;iCount < iNumOfCodes; iCount++) - { - memcpy(szText,&FourCC[iCount],4); - LVAddText(g_hwndLV, 0, "%s", szText); - } - } - } - } -} - -//================================================================ -//================================================================ -typedef struct LLMode -{ - DWORD x,y,bpp; - BOOL IsModeX; - struct LLMode *Next; -}LinkMode; - -static LinkMode *pModesHead = NULL; - -//================================================================ -// EnumDisplayModesCallback1 -//================================================================ -HRESULT CALLBACK EnumDisplayModesCallback1(LPDDSURFACEDESC pddsd, LPVOID Context) -{ - static LinkMode *pModesTail = NULL; - LinkMode *tmp=NULL; - - tmp = GlobalAlloc(GPTR,sizeof(LinkMode)); - if(tmp != NULL) - { - tmp->x = pddsd->dwWidth; - tmp->y = pddsd->dwHeight; - tmp->bpp = pddsd->ddpfPixelFormat.dwRGBBitCount; - tmp->IsModeX = TRUE; - tmp->Next = NULL; - if(pModesHead == NULL) - { - pModesHead = tmp; - pModesTail = tmp; - }else - { - pModesTail->Next = tmp; - pModesTail = tmp; - } - }//Hey if we out of memory silent failure - return DDENUMRET_OK; - -} /* EnumModesCallback */ - -//================================================================ -// EnumDisplayModesCallback2 -//================================================================ -HRESULT CALLBACK EnumDisplayModesCallback2(LPDDSURFACEDESC pddsd, LPVOID Context) -{ - LinkMode *tmp= NULL; - - tmp = pModesHead; - while(tmp != NULL) //cycle though all modes since unique modes don't always happen - { - if( tmp->x == pddsd->dwWidth && - tmp->y == pddsd->dwHeight && - tmp->bpp == pddsd->ddpfPixelFormat.dwRGBBitCount) - { - tmp->IsModeX = FALSE; - - } - tmp = tmp->Next; - } - - return DDENUMRET_OK; - -} /* EnumModesCallback */ - -//================================================================ -// EnumDisplayModesCallback2 -//================================================================ -void DisplayEnumModes() -{ - LinkMode *tmp= NULL; - - tmp = pModesHead; - while(tmp != NULL) //cycle though all modes since unique modes don't always happen - { - if(tmp->IsModeX) - { - LVAddText(g_hwndLV, 0, "%dx%dx%d (ModeX)", tmp->x, tmp->y, tmp->bpp); - }else - { - LVAddText(g_hwndLV, 0, "%dx%dx%d ", tmp->x, tmp->y, tmp->bpp); - } - tmp = tmp->Next; - } -} /* EnumModesCallback */ - -//================================================================ -// Should we hourglass the cursor? this takes a while -//================================================================ -void DDAddVideoModes(LPARAM lParam1, LPARAM lParam2) -{ - DWORD mode; - DDSURFACEDESC ddsd; - - LVAddColumn(g_hwndLV, 0, "Mode", 24); - LVAddColumn(g_hwndLV, 1, "", 24); - - // lParam1 is the GUID for the driver we should open - // lParam2 is not used - - if (DDCreate((GUID*)lParam1)) - { - // Get the current mode mode for this driver - ddsd.dwSize = sizeof(DDSURFACEDESC); - IDirectDraw_GetDisplayMode(lpDD, &ddsd); - - mode = MAKEMODE(ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount); - - // Find all mode for this driver and add them to the listview - //Erase previous list - { - LinkMode *tmp, *tmp1; - - tmp = pModesHead; - while(tmp != NULL) - { - tmp1 = tmp; - tmp = tmp->Next; - GlobalFree(tmp1); //Note We will exit with a list in place - } - pModesHead = NULL; - } - //Get Mode with ModeX - IDirectDraw_SetCooperativeLevel(lpDD, g_hwndMain, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX | DDSCL_NOWINDOWCHANGES); - IDirectDraw_EnumDisplayModes(lpDD, 0, NULL, (LPVOID)mode, EnumDisplayModesCallback1); - //Get Modes with out ModeX - IDirectDraw_SetCooperativeLevel(lpDD, g_hwndMain, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_NOWINDOWCHANGES); - IDirectDraw_EnumDisplayModes(lpDD, 0, NULL, (LPVOID)mode, EnumDisplayModesCallback2); - //Call Function to out stuff in listview - DisplayEnumModes(); - IDirectDraw_SetCooperativeLevel(lpDD, g_hwndMain, DDSCL_NORMAL); - } -} - -//================================================================ -//================================================================ -void DXView_OnTreeSelect(HWND hwndTV, NM_TREEVIEW *ptv) -{ - NODEINFO *pni; - - SendMessage(g_hwndLV, WM_SETREDRAW, FALSE, 0); - ListView_DeleteAllItems(g_hwndLV); - LVAddColumn(g_hwndLV, 0, "", 0); - - if (ptv == NULL) - { - TV_ITEM tvi; - // get lParam of current tree node - tvi.hItem = TreeView_GetSelection(g_hwndTV); - tvi.mask = TVIF_PARAM; - tvi.lParam = 0; - TreeView_GetItem(g_hwndTV, &tvi); - pni = (NODEINFO*)tvi.lParam; - } - else - { - pni = (NODEINFO*)ptv->itemNew.lParam; - } - - if (pni && pni->Callback) - { - pni->Callback(pni->lParam1, pni->lParam2); - } - - SendMessage(g_hwndLV, WM_SETREDRAW, TRUE, 0); - InvalidateRect(g_hwndLV, NULL, TRUE); -} - -//================================================================ -//================================================================ -void DXView_OnListViewDblClick(HWND hwndLV, NM_LISTVIEW *plv) -{ - LV_ITEM lvi; - - lvi.mask = LVIF_PARAM; - lvi.lParam = 0; - lvi.iItem = plv->iItem; - ListView_GetItem(hwndLV, &lvi); -} - - -//================================================================ -//================================================================ -void DXView_OnCommand(HWND hwnd, WPARAM wParam) -{ - HMENU hMenu; - - switch(LOWORD(wParam)) - { - case IDM_VIEWAVAIL: - case IDM_VIEWALL: - hMenu = GetMenu(hwnd); - CheckMenuItem(hMenu, g_dwViewState, MF_BYCOMMAND | MF_UNCHECKED); - g_dwViewState = LOWORD(wParam); - CheckMenuItem(hMenu, g_dwViewState, MF_BYCOMMAND | MF_CHECKED); - DXView_OnTreeSelect(g_hwndTV, NULL); - break; - - case IDM_ABOUT: - DialogBox(g_hInstance, "About", hwnd, (DLGPROC)About); - break; - - case IDM_EXIT: - PostMessage(hwnd, WM_CLOSE, 0, 0); - break; - } -} - -//================================================================ -//================================================================ -void DXView_Cleanup() -{ - if (lpDD) - IDirectDraw_Release(lpDD); - - if (lpDS) - IDirectSound_Release(lpDS); - - if (lpDP) - lpDP->lpVtbl->Release(lpDP); - - if(g_hImageList) - ImageList_Destroy(g_hImageList); -} - -//================================================================ -//================================================================ -BOOL DXView_InitImageList() -{ - int cxSmIcon; - int cySmIcon; - UINT Index; - HICON hIcon; - - if (g_hImageList) - return TRUE; - - cxSmIcon = GetSystemMetrics(SM_CXSMICON); - cySmIcon = GetSystemMetrics(SM_CYSMICON); - - // First, create the image list that is needed. - if((g_hImageList = ImageList_Create(cxSmIcon, cySmIcon, TRUE, IDI_LASTIMAGE - IDI_FIRSTIMAGE, 10)) == NULL) - return(FALSE); - - // - // Initialize the image list with all of the icons that we'll be using - // Once set, send its handle to all interested child windows. - // - for (Index = IDI_FIRSTIMAGE; Index <= IDI_LASTIMAGE; Index++) - { - hIcon = LoadImage(g_hInstance, MAKEINTRESOURCE(Index), IMAGE_ICON, cxSmIcon, cySmIcon, 0); - ImageList_AddIcon(g_hImageList, hIcon); - DestroyIcon(hIcon); - } - - TreeView_SetImageList(g_hwndTV, g_hImageList, TVSIL_NORMAL); - - return(TRUE); -} - -//================================================================ -//================================================================ -HRESULT CALLBACK DDEnumCallBack(GUID *pid, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext) -{ - HTREEITEM hParent = (HTREEITEM)lpContext; - TCHAR szText[256]; -#ifdef DX_3D - HRESULT ddrval; -#endif - - if (HIWORD(pid) != 0) - { - GUID temp = *pid; - pid = (GUID *)LocalAlloc(LPTR, sizeof(GUID)); - *pid = temp; - } - - // Add subnode to treeview - if (lpDriverName && *lpDriverName) - wsprintf(szText, "%s (%s)", lpDriverDesc, lpDriverName); - else - lstrcpy(szText, lpDriverDesc); -#ifdef DX_3D - { - DDCAPS DDCaps; - lpDD = DDCreate(pid); - DDCaps.dwSize = sizeof(DDCAPS); - ddrval = lpDD->lpVtbl->GetCaps(lpDD, &DDCaps,NULL); - if(ddrval == DD_OK) - if(DDCaps.dwSize != 0) - if(DDCaps.ddsCaps.dwCaps & DDSCAPS_3D != 0) - pid_for3D = pid; - } -#endif - DDCapDefs[0].szName = szText; - AddCapsToTV(hParent, DDCapDefs, (LPARAM)pid); - - return(DDENUMRET_OK); -} - -//================================================================ -//================================================================ -HRESULT CALLBACK DSEnumCallBack(const GUID *lpGUID, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext) -{ - HTREEITEM hParent = (HTREEITEM)lpContext; - TCHAR szText[256]; - LPGUID lpTemp = NULL; - - if( lpGUID != NULL ) - { - if(( lpTemp = LocalAlloc( LPTR, sizeof(GUID))) == NULL ) - return( TRUE ); - - memcpy( lpTemp, lpGUID, sizeof(GUID)); - } - - // Add subnode to treeview - if (lpDriverName && *lpDriverName) - wsprintf(szText, "%s (%s)", lpDriverDesc, lpDriverName); - else - lstrcpy(szText, lpDriverDesc); - - DSCapDefs[0].szName = szText; - AddCapsToTV(hParent, DSCapDefs, (LPARAM)lpTemp); - - return(DDENUMRET_OK); -} - -//================================================================ -//================================================================ -BOOL CALLBACK DPEnumCallback(GUID *pid, LPSTR szName, DWORD major_ver, DWORD minor_ver, LPVOID lpContext) -{ - HTREEITEM hParent = (HTREEITEM)lpContext; - TCHAR szText[256]; - - if (HIWORD(pid) != 0) - { - GUID temp = *pid; - pid = (GUID *)LocalAlloc(LPTR, sizeof(GUID)); - *pid = temp; - } - - wsprintf(szText, "%s %d.%d", szName, major_ver, minor_ver); - - DPCapDefs[0].szName = szText; - AddCapsToTV(hParent, DPCapDefs, (LPARAM)pid); - - return TRUE; -} - -//================================================================ -//================================================================ -#ifdef DX_3D -HRESULT CALLBACK D3EnumCallback( - LPGUID pid, - LPSTR lpDriverDesc, - LPSTR lpDriverName, - LPD3DDEVICEDESC lpD3DDeviceDesc1, - LPD3DDEVICEDESC lpD3DDeviceDesc2, - LPVOID lpContext) -{ - HTREEITEM hParent = (HTREEITEM)lpContext; - TCHAR szText[256]; - - //Store this info now is much easier than recreating it later. - CAP3DDEVICEDESC *temp; - if(lpD3DDeviceDesc1->dwFlags != 0) - { - temp = LocalAlloc(LPTR, sizeof(CAP3DDEVICEDESC)); - memcpy(temp,lpD3DDeviceDesc1,sizeof(CAP3DDEVICEDESC)); - }else - { - temp = LocalAlloc(LPTR, sizeof(CAP3DDEVICEDESC)); - memcpy(temp,lpD3DDeviceDesc2,sizeof(CAP3DDEVICEDESC)); - } - memcpy(&temp->guid,pid,sizeof(GUID)); - - // Add subnode to treeview - if (lpDriverName && *lpDriverName) - wsprintf(szText, "%s (%s)", lpDriverDesc, lpDriverName); - else - lstrcpy(szText, lpDriverDesc); - - D3CapDefs[0].szName = szText; - AddCapsToTV(hParent, D3CapDefs, (LPARAM)temp); - - return(DDENUMRET_OK); -} - -//================================================================ -//================================================================ -HRESULT Direct3DEnumerate(LPD3DENUMDEVICESCALLBACK lp3DEnumCallback, LPVOID lpVoid) -{ - TCHAR szText[256]; - HRESULT ddrval; - - if (lpDD) - { - IDirectDraw_Release(lpDD); - lpDD = NULL; - } - if((ddrval = DirectDrawCreate(pid_for3D, &lpDD, NULL)) != DD_OK) - { - wsprintf(szText, "Error %x",ddrval); - OutputDebugString(szText); - } - ddrval = IDirectDraw_QueryInterface(lpDD,&IID_IDirect3D,&lp3D); - if ((ddrval == DD_OK)&&(lp3D != NULL)) - { - IDirect3D_EnumDevices(lp3D, lp3DEnumCallback, lpVoid); - } - return(DDENUMRET_OK); - -} -#endif - -//================================================================ -//================================================================ -void DXView_FillTree(HWND hwndTV) -{ - HTREEITEM hTree; - - // Add direct draw devices - - hTree = TVAddNode(TVI_ROOT, "DirectDraw Devices", TRUE, - IDI_DIRECTX, NULL, 0, 0); - - // Add Display Driver node(s) and capability nodes to treeview - DirectDrawEnumerate(DDEnumCallBack, hTree); - - // Add Hardware Emulation Layer node to treeview - DDEnumCallBack((GUID *)DDCREATE_EMULATIONONLY, "Hardware Emulation Layer", NULL, (LPVOID)hTree); - - TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND); - TreeView_SelectItem(g_hwndTV, hTree); - - // Add direct sound devices - - hTree = TVAddNode(TVI_ROOT, "DirectSound Devices", TRUE, - IDI_DIRECTX, NULL, 0, 0); - - DirectSoundEnumerate(DSEnumCallBack, hTree); - - TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND); - - // Add direct play devices - - hTree = TVAddNode(TVI_ROOT, "DirectPlay Devices", TRUE, - IDI_DIRECTX, NULL, 0, 0); - - DirectPlayEnumerate(DPEnumCallback, hTree); - TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND); - - // Add direct 3D devices -#ifdef DX_3D - hTree = TVAddNode(TVI_ROOT, "Direct3D Devices", TRUE, - IDI_DIRECTX, NULL, 0, 0); - - Direct3DEnumerate(D3EnumCallback, hTree); //This is not a real 3D function - TreeView_Expand(g_hwndTV, hTree, TVE_EXPAND); -#endif - - -} - -//================================================================ -// About - process about box -//================================================================ -LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - return(TRUE); - - case WM_COMMAND: // message: received a command - if(LOWORD(wParam) == IDOK // "OK" box selected? - || LOWORD(wParam) == IDCANCEL) { // System menu close command? - EndDialog(hDlg, TRUE); // Exit the dialog - return(TRUE); - } - break; - } - return(FALSE); // Didn't process the message -} - -//================================================================ -//================================================================ -// DXView_OnSize -// -// DESCRIPTION: -// Called whenever the size of the app window has changed or the size -// of its child controls should be adjusted. -// -// PARAMETERS: -// hWnd, handle of app window. -// -//================================================================ -//================================================================ -void DXView_OnSize(HWND hWnd) -{ - HDWP hDWP; - RECT ClientRect; - int Height; - HWND hKeyTreeWnd; - HWND hValueListWnd; - int x; - int dx; - - if (IsIconic(hWnd)) - return; - - if ((hDWP = BeginDeferWindowPos(2)) != NULL) - { - // Data structure used when calling GetEffectiveClientRect (which takes into - // account space taken up by the toolbars/status bars). First half of the - // pair is zero when at the end of the list, second half is the control id. - int s_EffectiveClientRectData[] = { - 1, 0, // For the menu bar, but is unused - 0, 0 // First zero marks end of data - }; - - GetEffectiveClientRect(hWnd, &ClientRect, s_EffectiveClientRectData); - Height = ClientRect.bottom - ClientRect.top; - - hKeyTreeWnd = g_hwndTV; - - DeferWindowPos(hDWP, hKeyTreeWnd, NULL, 0, ClientRect.top, g_xPaneSplit, - Height, SWP_NOZORDER | SWP_NOACTIVATE); - - x = g_xPaneSplit + GetSystemMetrics(SM_CXSIZEFRAME); - dx = ClientRect.right - ClientRect.left - x; - - hValueListWnd = g_hwndLV; - - DeferWindowPos(hDWP, hValueListWnd, NULL, x, ClientRect.top, dx, Height, - SWP_NOZORDER | SWP_NOACTIVATE); - - EndDeferWindowPos(hDWP); - } -} -#ifdef _X86_ -#pragma optimize("", off) -#endif -/*----------------------------------------------------------------------------*\ -\*----------------------------------------------------------------------------*/ - -void LVAddColumn(HWND hwndLV, int i, char *name, int width) -{ - LV_COLUMN col; - - if (i == 0) - { - while(ListView_DeleteColumn(hwndLV, 0)) - ; - } - - col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; - col.fmt = LVCFMT_LEFT; - col.pszText = name; - col.cchTextMax = 0; - col.cx = width * g_tmAveCharWidth; - col.iSubItem = 0; - ListView_InsertColumn(hwndLV, i, &col); -} - -/*----------------------------------------------------------------------------*\ -\*----------------------------------------------------------------------------*/ -int LVAddText(HWND hwndLV, int col, char *sz, ...) -{ - LV_ITEM lvi; - char ach[80]; - va_list vl; - - va_start(vl, sz ); - wvsprintf(ach,sz, vl); - - lvi.mask = LVIF_TEXT; - lvi.iSubItem = 0; - lvi.state = 0; - lvi.stateMask = 0; - lvi.pszText = ach; - lvi.cchTextMax = 0; - lvi.iImage = 0; - lvi.lParam = 0; - - if (col == 0) - { - lvi.iItem = 0x7FFF; - lvi.iSubItem = 0; - return ListView_InsertItem(hwndLV, &lvi); - } - else - { - lvi.iItem = ListView_GetItemCount(hwndLV)-1; - lvi.iSubItem = col; - return ListView_SetItem(hwndLV, &lvi); - } - va_end(vl); -} - -/*----------------------------------------------------------------------------*\ -\*----------------------------------------------------------------------------*/ -HTREEITEM TVAddNode(HTREEITEM hParent, LPSTR szText, BOOL fKids, int iImage, SELCALLBACK Callback, LPARAM lParam1, LPARAM lParam2) -{ - TV_INSERTSTRUCT tvi; - NODEINFO *pni; - - pni = (NODEINFO *)LocalAlloc(LPTR, sizeof(NODEINFO)); - - if (pni == NULL) - return NULL; - - pni->lParam1 = lParam1; - pni->lParam2 = lParam2; - pni->Callback = Callback; - - // Add Node to treeview - tvi.hParent = hParent; - tvi.hInsertAfter = TVI_LAST; - tvi.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_CHILDREN; - tvi.item.iImage = iImage - IDI_FIRSTIMAGE; - tvi.item.iSelectedImage = iImage - IDI_FIRSTIMAGE; - tvi.item.lParam = (LPARAM)pni; - tvi.item.cChildren = fKids; - tvi.item.pszText = szText; - - return TreeView_InsertItem(g_hwndTV, &tvi); -} -#ifdef _X86_ -#pragma optimize("", on) -#endif - diff --git a/sdk/samples/dxview/dxview.h b/sdk/samples/dxview/dxview.h deleted file mode 100644 index 6371c3b..0000000 --- a/sdk/samples/dxview/dxview.h +++ /dev/null @@ -1,101 +0,0 @@ -//================================================================ -// Defines -//================================================================ - -// Window Width and Height -#define DXView_WIDTH 640 -#define DXView_HEIGHT 300 - -// Child controls -#define IDC_LV 0x2000 -#define IDC_TV 0x2003 - -// Imagelist first and last icons -#define IDI_FIRSTIMAGE IDI_DIRECTX -#define IDI_LASTIMAGE IDI_CAPSOPEN - -#define IDC_SPLIT 100 - -#define IDM_EXIT 40001 -#define IDM_ABOUT 40002 -#define IDM_VIEWAVAIL 40003 -#define IDM_VIEWALL 40004 - -#define IDI_DIRECTX 100 -#define IDI_CAPS 101 -#define IDI_CAPSOPEN 102 - -//================================================================ -// Typedefs -//================================================================ - -typedef void (*SELCALLBACK)(LPARAM lParam1, LPARAM lParam2); - -typedef struct -{ - SELCALLBACK Callback; - LPARAM lParam1; - LPARAM lParam2; -} NODEINFO; - -typedef struct -{ - char * szName; // name of cap - DWORD dwOffset; // offset to cap - DWORD dwFlag; // bit flag for cal -} CAPDEF; - -typedef struct -{ - char *szName; // name of cap - SELCALLBACK Callback; - LPARAM lParam2; -} CAPDEFS; - -#ifdef DX_3D -typedef struct -{ - D3DDEVICEDESC d3dDeviceDesc; - GUID guid; -} CAP3DDEVICEDESC; -#endif - -//================================================================ -// Function prototypes -//================================================================ - -LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - -BOOL InitInstance(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow, int iWidth, int iHeight); - -BOOL DXView_OnCreate(HWND hwnd); -void DXView_OnCommand(HWND hwnd, WPARAM wParam); -void DXView_OnSize(HWND hwnd); -void DXView_OnTreeSelect(HWND hwndTV, NM_TREEVIEW *ptv); -void DXView_OnListViewDblClick(HWND hwndLV, NM_LISTVIEW *plv); -void DXView_Cleanup(void); -void DXView_FillTree(HWND hwndTV); -BOOL DXView_InitImageList(void); - -void LVAddColumn(HWND hwndLV, int i, char *name, int width); -int LVAddText(HWND hwndLV, int col, char *sz, ...); -HTREEITEM TVAddNode(HTREEITEM hParent, char *szText, BOOL fKids, int iImage, SELCALLBACK Callback, LPARAM lParam1, LPARAM lParam2); - -void DDAddCaps(LPARAM lParam1, LPARAM lParam2); -void DSAddCaps(LPARAM lParam1, LPARAM lParam2); -void DPAddCaps(LPARAM lParam1, LPARAM lParam2); -void D3AddCaps(LPARAM lParam1, LPARAM lParam2); -void DDAddVideoModes(LPARAM lParam1, LPARAM lParam2); -void DPAddSessions(LPARAM lParam1, LPARAM lParam2); -void DDFourCCFormat(LPARAM lParam1, LPARAM lParam2); - -#ifdef DX_3D -HRESULT CALLBACK D3EnumCallback( - LPGUID pid, - LPSTR lpDriverDesc, - LPSTR lpDriverName, - LPD3DDEVICEDESC lpD3DDeviceDesc1, - LPD3DDEVICEDESC lpD3DDeviceDesc2, - LPVOID lpContext); -#endif diff --git a/sdk/samples/dxview/dxview.ico b/sdk/samples/dxview/dxview.ico deleted file mode 100644 index 8812c61..0000000 Binary files a/sdk/samples/dxview/dxview.ico and /dev/null differ diff --git a/sdk/samples/dxview/dxview.rc b/sdk/samples/dxview/dxview.rc deleted file mode 100644 index 3040ada..0000000 --- a/sdk/samples/dxview/dxview.rc +++ /dev/null @@ -1,58 +0,0 @@ - -#include -#include "dxview.h" - - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// -Menu MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&About", IDM_ABOUT - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_EXIT - END - POPUP "&View" - BEGIN - MENUITEM "A&vailable", IDM_VIEWAVAIL - MENUITEM "&All", IDM_VIEWALL - END -END - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// -IDI_DIRECTX ICON DISCARDABLE "dxview.ico" -IDI_CAPS ICON DISCARDABLE "folder.ico" -IDI_CAPSOPEN ICON DISCARDABLE "folderop.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// -About DIALOG DISCARDABLE 0, 0, 191, 103 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 10, "Times New Roman" -BEGIN - DEFPUSHBUTTON "OK",IDOK,132,58,50,14 - PUSHBUTTON "Cancel",IDCANCEL,132,74,50,14 - LTEXT "Direct Draw Device Capability Editor",-1,15,14, - 115,8 - LTEXT "Copyright Microsoft Corporation 1995-1996",-1,15,28, - 117,8 - LTEXT "Version",-1,15,41,24,8 - LTEXT "1.0",-1,40,42,66,8 - LTEXT "Written by: Vince Roggero",-1,16,54,98,8 -END - -///////////////////////////////////////////////////////////////////////////// -// -// Cursor -// -IDC_SPLIT CURSOR DISCARDABLE "Split.cur" diff --git a/sdk/samples/dxview/folder.ico b/sdk/samples/dxview/folder.ico deleted file mode 100644 index f463e67..0000000 Binary files a/sdk/samples/dxview/folder.ico and /dev/null differ diff --git a/sdk/samples/dxview/folderop.ico b/sdk/samples/dxview/folderop.ico deleted file mode 100644 index b2ec4fc..0000000 Binary files a/sdk/samples/dxview/folderop.ico and /dev/null differ diff --git a/sdk/samples/dxview/makefile b/sdk/samples/dxview/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/dxview/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/dxview/msvc.mk b/sdk/samples/dxview/msvc.mk deleted file mode 100644 index bd8e73c..0000000 --- a/sdk/samples/dxview/msvc.mk +++ /dev/null @@ -1,41 +0,0 @@ -NAME = dxview -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib comctl32.lib \ - ddraw.lib dsound.lib dplayx.lib - -OBJS = dxview.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/dxview/readme.txt b/sdk/samples/dxview/readme.txt deleted file mode 100644 index 9469f26..0000000 --- a/sdk/samples/dxview/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -DirectX Capability Viewer - -Displays capabilities for DirectDraw, DirectSound and DirectPlay. diff --git a/sdk/samples/dxview/split.cur b/sdk/samples/dxview/split.cur deleted file mode 100644 index 41d65e3..0000000 Binary files a/sdk/samples/dxview/split.cur and /dev/null differ diff --git a/sdk/samples/egg/egg.c b/sdk/samples/egg/egg.c deleted file mode 100644 index c9426a9..0000000 --- a/sdk/samples/egg/egg.c +++ /dev/null @@ -1,105 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: egg.c - * - ***************************************************************************/ - -#include "rmdemo.h" - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMFRAME lights = NULL; - LPDIRECT3DRMMESHBUILDER egg_builder = NULL; - LPDIRECT3DRMFRAME egg = NULL; - LPDIRECT3DRMLIGHT light1 = NULL; - LPDIRECT3DRMLIGHT light2 = NULL; - HRESULT rval; - - view = view; /* not used */ - - /* - * initialize the lights in the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(5), D3DVAL(5), - -D3DVAL(1)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(0.9), - D3DVAL(0.8), D3DVAL(0.7), &light1))) - goto generic_error; - if (FAILED(lights->lpVtbl->AddLight(lights, light1))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetRotation(lights, scene, D3DVAL(0), D3DVAL(1), D3DVAL(1), - D3DVAL(-0.02)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &light2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, light2))) - goto generic_error; - - /* - * load mesh file - */ - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &egg_builder))) - goto generic_error; - rval = egg_builder->lpVtbl->Load(egg_builder, "egg.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load egg.x\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - - /* - * create an egg frame within the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &egg))) - goto generic_error; - - /* - * add the loaded mesh into the frame - */ - if (FAILED(egg->lpVtbl->AddVisual(egg, (LPDIRECT3DRMVISUAL)egg_builder))) - goto generic_error; - - /* - * set up the frames position, orientation and rotation - */ - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(10)))) - goto generic_error; - if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0), D3DVAL(0), D3DVAL(1), D3DVAL(0), - D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(egg->lpVtbl->SetRotation(egg, scene, D3DVAL(0), D3DVAL(1), D3DVAL(1), - D3DVAL(0.02)))) - goto generic_error; - - RELEASE(egg); - RELEASE(lights); - RELEASE(egg_builder); - RELEASE(light1); - RELEASE(light2); - return TRUE; - -generic_error: - Msg("A failure occured while building the scene.\n"); -ret_with_error: - RELEASE(egg); - RELEASE(lights); - RELEASE(egg_builder); - RELEASE(light1); - RELEASE(light2); - return FALSE; -} - -void -OverrideDefaults(Defaults *defaults) -{ - defaults->bNoTextures = TRUE; - lstrcpy(defaults->Name, "Egg Direct3DRM Example"); -} diff --git a/sdk/samples/egg/egg.def b/sdk/samples/egg/egg.def deleted file mode 100644 index 3586a50..0000000 --- a/sdk/samples/egg/egg.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME egg.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/egg/makefile b/sdk/samples/egg/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/egg/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/egg/msvc.mk b/sdk/samples/egg/msvc.mk deleted file mode 100644 index 6954664..0000000 --- a/sdk/samples/egg/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = egg -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = egg.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT = -DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/egg/readme.txt b/sdk/samples/egg/readme.txt deleted file mode 100644 index d7b2b3d..0000000 --- a/sdk/samples/egg/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Egg -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Loading a simple XOF of a single mesh object. diff --git a/sdk/samples/faces/faces.c b/sdk/samples/faces/faces.c deleted file mode 100644 index 54254ad..0000000 --- a/sdk/samples/faces/faces.c +++ /dev/null @@ -1,374 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: faces.c - * - ***************************************************************************/ - -/* - * Example program to demonstrate MeshAddFaces - */ - -#include "rmdemo.h" - -D3DVECTOR cube_vertices[] = {-D3DVAL(0.5), -D3DVAL(0.5), -D3DVAL(0.5), - -D3DVAL(0.5), -D3DVAL(0.5), D3DVAL(0.5), - -D3DVAL(0.5), D3DVAL(0.5), -D3DVAL(0.5), - -D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5), - D3DVAL(0.5), -D3DVAL(0.5), -D3DVAL(0.5), - D3DVAL(0.5), -D3DVAL(0.5), D3DVAL(0.5), - D3DVAL(0.5), D3DVAL(0.5), -D3DVAL(0.5), - D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5) -}; - -/* - * face_data is a vertex count followed by the vertex reference in the - * vertices list. If normal_count > 0, then pairs of vectors are - * referenced: first the vertex and secondly the normal reference. the - * list is terminated by a 0 (vertex count to a face) - */ - - -BOOL -build_face1(LPDIRECT3DRMMESHBUILDER msh) -{ - /* - * add a single face to a mesh. - */ - - /* - * Single face with all normals pointing in the same direction. - */ - - int vertex_count = 4; - D3DVECTOR vertices[4] = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0) - }; - int normal_count = 4; - D3DVECTOR normals[4] = {D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - }; - int face_data[] = {4, 0, 0, 1, 1, 2, 2, 3, 3, 0}; - - if (FAILED(msh->lpVtbl->AddFaces(msh, vertex_count, vertices, normal_count, - normals, face_data, NULL))) - return FALSE; - return TRUE; -} - -BOOL -build_face2(LPDIRECT3DRMMESHBUILDER msh) -{ - /* - * Single face with normals pointing in different directions to - * approximate a curved surface. - */ - int vertex_count = 4; - D3DVECTOR vertices[4] = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0) - }; - int normal_count = 4; - D3DVECTOR normals[4] = { - D3DVAL(0.5), D3DVAL(0.7), D3DVAL(0.5), - D3DVAL(0.5), D3DVAL(0.7), -D3DVAL(0.5), - -D3DVAL(0.5), D3DVAL(0.7), -D3DVAL(0.5), - -D3DVAL(0.5), D3DVAL(0.7), D3DVAL(0.5) - }; - int face_data[] = {4, 0, 0, 1, 1, 2, 2, 3, 3, 0}; - - if (FAILED(msh->lpVtbl->AddFaces(msh, vertex_count, vertices, normal_count, - normals, face_data, NULL))) - return FALSE; - return TRUE; -} - -BOOL -build_cube1(LPDIRECT3DRMMESHBUILDER msh) -{ - /* - * cube 1 has planar faces, one normal is shared by all vertices of a - * face - */ - int face1_data[] = { - 4, 1, 0, 5, 1, 7, 2, 3, 3, - 4, 2, 4, 3, 5, 7, 6, 6, 7, - 4, 5, 8, 4, 9, 6, 10, 7, 11, - 4, 0, 12, 2, 13, 6, 14, 4, 15, - 4, 0, 16, 4, 17, 5, 18, 1, 19, - 4, 0, 20, 1, 21, 3, 22, 2, 23, - 0}; - - D3DVECTOR cube1_normals[] = { - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0), - D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0), - -D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0) - - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0) - - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0) - - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0) - }; - - if (FAILED(msh->lpVtbl->AddFaces(msh, 8, cube_vertices, 6 * 4, cube1_normals, - face1_data, NULL))) - return FALSE; - return TRUE; -} - -BOOL -build_cube2(LPDIRECT3DRMMESHBUILDER msh) -{ - /* - * cube 2 has rounded faces, the normals radiate out at each vertex, - * one normal to each vertex - */ - - int face2_data[] = { - 4, 1, 1, 5, 5, 7, 7, 3, 3, - 4, 2, 2, 3, 3, 7, 7, 6, 6, - 4, 5, 5, 4, 4, 6, 6, 7, 7, - 4, 0, 0, 2, 2, 6, 6, 4, 4, - 4, 0, 0, 4, 4, 5, 5, 1, 1, - 4, 0, 0, 1, 1, 3, 3, 2, 2, - 0}; - - D3DVECTOR cube2_normals[] = { - -D3DVAL(1.0), -D3DVAL(1.0), -D3DVAL(1.0), - -D3DVAL(1.0), -D3DVAL(1.0), D3DVAL(1.0), - -D3DVAL(1.0), D3DVAL(1.0), -D3DVAL(1.0), - -D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(1.0), -D3DVAL(1.0), -D3DVAL(1.0), - D3DVAL(1.0), -D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(1.0), D3DVAL(1.0), -D3DVAL(1.0), - D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0) - }; - if (FAILED(msh->lpVtbl->AddFaces(msh, 8, cube_vertices, 8, cube2_normals, - face2_data, NULL))) - return FALSE; - return TRUE; -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - D3DRMRENDERQUALITY quality = D3DRMRENDER_GOURAUD; - LPDIRECT3DRMMESHBUILDER light_builder, face1_builder, face2_builder; - LPDIRECT3DRMMESHBUILDER cube1_builder, cube2_builder; - LPDIRECT3DRMMESH light_mesh, face1_mesh, face2_mesh, cube1_mesh, cube2_mesh; - LPDIRECT3DRMFRAME frame1, frame2, face_frame1, face_frame2, light_frame; - LPDIRECT3DRMFRAME lights; - LPDIRECT3DRMLIGHT light1, light2; - HRESULT rval; - - view = view; /* not used */ - light_builder = NULL; face1_builder = NULL; face2_builder = NULL; - cube1_builder = NULL; cube2_builder = NULL; - light_mesh = NULL; face1_mesh = NULL; face2_mesh = NULL; - cube1_mesh = NULL; cube2_mesh = NULL; - frame1 = NULL; frame2 = NULL; face_frame1 = NULL; face_frame2 = NULL; - light_frame = NULL; lights = NULL; light1 = NULL; light2 = NULL; - - /* - * This Demo shows the construction of planar faces\n"); with vertex - * normals for realistic modelling of\n"); flat and curved surfaces by - * polygonal approximation.\n"); - */ - - if (FAILED(dev->lpVtbl->SetQuality(dev, quality))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &face_frame1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &face_frame2))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame2))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &light_frame))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, light_frame, &lights))) - goto generic_error; - - if (FAILED(lights->lpVtbl->SetPosition(lights, light_frame, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(2.2)))) - goto generic_error; - if (FAILED(light_frame->lpVtbl->SetPosition(light_frame, scene, D3DVAL(0.0), D3DVAL(0.4), D3DVAL(0.0)))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9), - D3DVAL(0.8), D3DVAL(0.7), &light1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.02), - D3DVAL(0.01), D3DVAL(0.01), &light2))) - goto generic_error; - if (FAILED(lights->lpVtbl->AddLight(lights, light1))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, light2))) - goto generic_error; - RELEASE(light1); - RELEASE(light2); - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &face1_builder))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &face2_builder))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube1_builder))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube2_builder))) - goto generic_error; - - if (!build_face1(face1_builder)) - goto generic_error; - if (!build_face2(face2_builder)) - goto generic_error; - if (!build_cube1(cube1_builder)) - goto generic_error; - if (!build_cube2(cube2_builder)) - goto generic_error; - - if (FAILED(face1_builder->lpVtbl->CreateMesh(face1_builder, &face1_mesh))) - goto generic_error; - if (FAILED(face2_builder->lpVtbl->CreateMesh(face2_builder, &face2_mesh))) - goto generic_error; - if (FAILED(cube1_builder->lpVtbl->CreateMesh(cube1_builder, &cube1_mesh))) - goto generic_error; - if (FAILED(cube2_builder->lpVtbl->CreateMesh(cube2_builder, &cube2_mesh))) - goto generic_error; - - RELEASE(face1_builder); - RELEASE(face2_builder); - RELEASE(cube1_builder); - RELEASE(cube2_builder); - - if (FAILED(face_frame1->lpVtbl->AddVisual(face_frame1, (LPDIRECT3DRMVISUAL) face1_mesh))) - goto generic_error; - if (FAILED(face_frame2->lpVtbl->AddVisual(face_frame2, (LPDIRECT3DRMVISUAL) face2_mesh))) - goto generic_error; - if (FAILED(frame1->lpVtbl->AddVisual(frame1, (LPDIRECT3DRMVISUAL) cube1_mesh))) - goto generic_error; - if (FAILED(frame2->lpVtbl->AddVisual(frame2, (LPDIRECT3DRMVISUAL) cube2_mesh))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &light_builder))) - goto generic_error; - rval = light_builder->lpVtbl->Load(light_builder, "sphere0.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere0.x\n"); - goto ret_with_error; - } - if (FAILED(light_builder->lpVtbl->SetColorRGB(light_builder, D3DVAL(1), D3DVAL(1), - D3DVAL(1)))) - goto generic_error; - if (FAILED(light_builder->lpVtbl->Scale(light_builder, D3DVAL(0.1), D3DVAL(0.1), - D3DVAL(0.1)))) - goto generic_error; - if (FAILED(light_builder->lpVtbl->SetQuality(light_builder, D3DRMRENDER_UNLITFLAT))) - goto generic_error; - if (FAILED(light_builder->lpVtbl->CreateMesh(light_builder, &light_mesh))) - goto generic_error; - RELEASE(light_builder); - - if (FAILED(lights->lpVtbl->AddVisual(lights, (LPDIRECT3DRMVISUAL) light_mesh))) - goto generic_error; - - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0.0), D3DVAL(2), -D3DVAL(5)))) - goto generic_error; - if (FAILED(face_frame1->lpVtbl->SetPosition(face_frame1, scene, -D3DVAL(0.5), - D3DVAL(0.5), D3DVAL(2)))) - goto generic_error; - if (FAILED(face_frame2->lpVtbl->SetPosition(face_frame2, scene, -D3DVAL(0.5), - -D3DVAL(1.5), D3DVAL(2)))) - goto generic_error; - if (FAILED(frame1->lpVtbl->SetPosition(frame1, scene, -D3DVAL(2.0), D3DVAL(0.0), D3DVAL(2)))) - goto generic_error; - if (FAILED(frame2->lpVtbl->SetPosition(frame2, scene, D3DVAL(1.5), D3DVAL(0.0), D3DVAL(2)))) - goto generic_error; - - if (FAILED(face_frame1->lpVtbl->SetOrientation(face_frame1, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1)))) - goto generic_error; - if (FAILED(face_frame2->lpVtbl->SetOrientation(face_frame2, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1)))) - goto generic_error; - if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0.0), -D3DVAL(0.2), D3DVAL(1), - D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0)))) - goto generic_error; - if (FAILED(frame1->lpVtbl->SetRotation(frame1, scene, D3DVAL(1), D3DVAL(0.0), D3DVAL(1), - -D3DVAL(0.005)))) - goto generic_error; - if (FAILED(frame2->lpVtbl->SetRotation(frame2, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(1), - -D3DVAL(0.005)))) - goto generic_error; - if (FAILED(light_frame->lpVtbl->SetRotation(light_frame, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0), - -D3DVAL(0.02)))) - goto generic_error; - - RELEASE(light_mesh); - RELEASE(face1_mesh); - RELEASE(face2_mesh); - RELEASE(cube1_mesh); - RELEASE(cube2_mesh); - - RELEASE(frame1); - RELEASE(frame2); - RELEASE(face_frame1); - RELEASE(face_frame2); - RELEASE(light_frame); - RELEASE(lights); - return TRUE; -generic_error: - Msg("An error has occurred while building the scene.\n"); -ret_with_error: - RELEASE(light_builder); - RELEASE(face1_builder); - RELEASE(face2_builder); - RELEASE(cube1_builder); - RELEASE(cube2_builder); - RELEASE(light_mesh); - RELEASE(face1_mesh); - RELEASE(face2_mesh); - RELEASE(cube1_mesh); - RELEASE(cube2_mesh); - RELEASE(frame1); - RELEASE(frame2); - RELEASE(face_frame1); - RELEASE(face_frame2); - RELEASE(light_frame); - RELEASE(lights); - RELEASE(light1); - RELEASE(light2); - return FALSE; -} - -void -OverrideDefaults(Defaults *defaults) -{ - defaults->bNoTextures = TRUE; - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Faces Direct3DRM Example"); -} diff --git a/sdk/samples/faces/faces.def b/sdk/samples/faces/faces.def deleted file mode 100644 index e473765..0000000 --- a/sdk/samples/faces/faces.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME faces.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/faces/makefile b/sdk/samples/faces/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/faces/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/faces/msvc.mk b/sdk/samples/faces/msvc.mk deleted file mode 100644 index aacf21a..0000000 --- a/sdk/samples/faces/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = faces -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = faces.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/faces/readme.txt b/sdk/samples/faces/readme.txt deleted file mode 100644 index 9641568..0000000 --- a/sdk/samples/faces/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Faces -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Creation of mesh objects one face at a time. diff --git a/sdk/samples/fastfile/fastfile.c b/sdk/samples/fastfile/fastfile.c deleted file mode 100644 index 8d50f2c..0000000 --- a/sdk/samples/fastfile/fastfile.c +++ /dev/null @@ -1,360 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: fastfile.c - * Content: Fast file I/O for large numbers of files. - * Uses a single file built using FFCREATE.EXE; this file - * contains a directory + all the files. - * - * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, - * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED - * WARRANTIES OF MERCHANTBILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. - * - ***************************************************************************/ -#include -#include -#include -#include -#include -#include "fastfile.h" -#include "ffent.h" - -#ifdef DEBUG -#define ODS( a ) OutputDebugString( a ) -#else -#define ODS( a ) -#endif - -#ifdef __WATCOMC__ -#define _stricmp stricmp -#endif - -typedef struct { - BOOL inuse; - LONG pos; - LONG size; - LPFILEENTRY pfe; -} FILEHANDLE, FAR *LPFILEHANDLE; - -static int LockCount; -static HANDLE hFile; -static HANDLE hFileMapping; -static LPFILEENTRY pFE; -static LPBYTE pBase; -static DWORD dwFECnt; -static LPFILEHANDLE lpFH; -static DWORD dwFHCnt; -static long lFileEnd; - -/* - * Compare - * - * bsearch comparison routine - */ -int __cdecl Compare( LPFILEENTRY p1, LPFILEENTRY p2 ) -{ - return( _stricmp( (p1)->name,(p2)->name ) ); - -} /* Compare */ - -/* - * FastFileInit - * - * Initialize for fast file access. The master file and maximum number - * of open "files" are specified. - */ -BOOL FastFileInit( LPSTR fname, int max_handles ) -{ - HRSRC h; - - LockCount = 0; - FastFileFini(); - - /* - * get a file handle array - */ - lpFH = LocalAlloc( LPTR, max_handles * sizeof( FILEHANDLE ) ); - if( lpFH == NULL ) { - return FALSE; - } - dwFHCnt = max_handles; - - /* - * try our resourse file first - */ - if (h = FindResource(NULL, fname, RT_RCDATA)) - { - pBase = LockResource(LoadResource(NULL, h)); - - if (pBase == NULL) - { - ODS( "FastFileInit: unable to lock resource\r\n" ); - FastFileFini(); - return FALSE; - } - - ODS( "FastFileInit: opened resource: "); ODS(fname); ODS("\r\n"); - } - else - { - - /* - * create a memory mapped file for the master file - */ - hFile = CreateFile( fname, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0 ); - - if( hFile == NULL || hFile == (HANDLE)HFILE_ERROR ) - { - ODS( "FastFileInit: CreateFile(" ); ODS( fname ); ODS( ")\r\n" ); - hFile = NULL; - FastFileFini(); - return FALSE; - } - hFileMapping = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL ); - if( hFileMapping == NULL ) { - ODS( "FastFileInit: CreateFileMapping Failed\r\n" ); - FastFileFini(); - return FALSE; - } - pBase = MapViewOfFile( hFileMapping, FILE_MAP_READ, 0, 0, 0 ); - if( pBase == NULL ) { - ODS( "FastFileInit: MapViewOfFile Failed\r\n" ); - FastFileFini(); - return FALSE; - } - } - - /* - * get initial data from the memory mapped file - */ - dwFECnt = *((DWORD *) pBase); - pFE = (LPFILEENTRY) (pBase + 4); - lFileEnd = pFE[dwFECnt-1].offset; - - return TRUE; - -} /* FastFileInit */ - -/* - * FastFileFini - * - * Clean up resources - */ -void FastFileFini( void ) -{ - // - // dont unmap things if we have locks out standing - // - if (LockCount != 0) - return; - - if( hFileMapping != NULL && pBase ) { - UnmapViewOfFile( pBase ); - } - if( hFileMapping != NULL ) { - CloseHandle( hFileMapping ); - hFileMapping = NULL; - } - if( hFile != NULL ) { - CloseHandle( hFile ); - hFile = NULL; - } - if( lpFH != NULL ) { - LocalFree( lpFH ); - lpFH = NULL; - } - dwFHCnt = 0; - pBase = NULL; - dwFECnt = 0; - pFE = NULL; - -} /* FastFileFini */ - -/* - * FastFileOpen - * - * Search the directory for the file, and return a file handle if found. - */ -HFASTFILE FastFileOpen( LPSTR name ) -{ - FILEENTRY fe; - LPFILEENTRY pfe; - - if( pFE == NULL ) { - ODS( "FastFileOpen: not initialized\r\n" ); - return NULL; - } - if( name == NULL || name[0] == 0 ) { - ODS( "FastFileOpen: invalid name\r\n" ); - return NULL; - } - - strcpy( fe.name, name ); - pfe = bsearch( &fe, pFE, dwFECnt, sizeof( FILEENTRY ), (LPVOID) Compare ); - if( pfe != NULL ) { - DWORD i; - for( i=0;ioffset; - lpFH[i].size = (pfe+1)->offset - pfe->offset; - lpFH[i].pfe = pfe; - return &lpFH[i]; - } - } - ODS( "FastFileOpen: Out of file handles\r\n" ); - } else { - ODS( "FastFileOpen: File \"" ); ODS( name ); ODS( "\" not found\r\n" ); - } - - return NULL; - -} /* FastFileOpen */ - -/* - * FastFileClose - * - * Mark a fast file handle as closed - */ -BOOL FastFileClose( LPFILEHANDLE pfh ) -{ - if( pfh == NULL || pfh->inuse != TRUE ) { - ODS( "FastFileClose: invalid handle\r\n" ); - return FALSE; - } - pfh->inuse = FALSE; - return TRUE; - -} /* FastFileClose */ - -/* - * FastFileLock - * - * return a memory pointer into a fast file - */ -LPVOID FastFileLock( LPFILEHANDLE pfh, int pos, int size ) -{ - if( pfh == NULL || pfh->inuse != TRUE ) { - ODS( "FastFileLock: invalid handle\r\n" ); - return NULL; - } - if( size < 0 ) { - ODS( "FastFileLock: invalid size\r\n" ); - return NULL; - } - if( (pos + size) > ((pfh->pfe)+1)->offset ) { - ODS( "FastFileLock: read past end of file\r\n" ); - return NULL; - } - LockCount++; - return pBase + pfh->pos + pos; - -} /* FastFileLock */ - -/* - * FastFileUnlock - * - */ -BOOL FastFileUnlock( LPFILEHANDLE pfh, int pos, int size ) -{ - if( pfh == NULL || pfh->inuse != TRUE ) { - ODS( "FastFileUnlock: invalid handle\r\n" ); - return FALSE; - } - if( size < 0 ) { - ODS( "FastFileUnlock: invalid size\r\n" ); - return FALSE; - } - if( (pos + size) > ((pfh->pfe)+1)->offset ) { - ODS( "FastFileUnlock: read past end of file\r\n" ); - return FALSE; - } - - LockCount--; - return TRUE; - -} /* FastFileUnlock */ - -/* - * FastFileRead - * - * read from a fast file (memcpy!) - */ -BOOL FastFileRead( LPFILEHANDLE pfh, LPVOID ptr, int size ) -{ - if( pfh == NULL || pfh->inuse != TRUE ) { - ODS( "FastFileRead: invalid handle\r\n" ); - return FALSE; - } - if( size < 0 ) { - ODS( "FastFileRead: invalid size\r\n" ); - return FALSE; - } - if( (pfh->pos + size) > ((pfh->pfe)+1)->offset ) { - ODS( "FastFileRead: read past end of file\r\n" ); - return FALSE; - } - memcpy( ptr, pBase + pfh->pos, size ); - pfh->pos += size; - return TRUE; - -} /* FastFileRead */ - -/* - * FastFileSeek - * - * Set to a new position in a fast file. Uses standard SEEK_SET, SEEK_CUR, - * SEEK_END definitions. - */ -BOOL FastFileSeek( LPFILEHANDLE pfh, int off, int how ) -{ - LPFILEENTRY pfe; - - if( pfh == NULL || pfh->inuse != TRUE ) { - ODS( "FastFileSeek: invalid handle\r\n" ); - return FALSE; - } - pfe = pfh->pfe; - if( how == SEEK_SET ) { - if( off < 0 || off >= pfh->size ) { - ODS( "FastFileSeek: Invalid offset\r\n" ); - return FALSE; - } - off += pfe->offset; - } else if( how == SEEK_END ) { - if( off < 0 || off >= pfh->size ) { - ODS( "FastFileSeek: Invalid offset\r\n" ); - return FALSE; - } - off = (pfe+1)->offset - off; - } else if( how == SEEK_CUR ) { - off = pfh->pos + off; - if( off < pfe->offset || off >= (pfe+1)->offset ) { - ODS( "FastFileSeek: Invalid offset\r\n" ); - return FALSE; - } - } else { - ODS( "FastFileSeek: Invalid 'how' field\r\n" ); - return FALSE; - } - pfh->pos = off; - return TRUE; - -} /* FastFileSeek */ - -/* - * FastFileTell - * - * Get the current position in a fast file - */ -long FastFileTell( LPFILEHANDLE pfh ) -{ - if( pfh == NULL || pfh->inuse != TRUE ) { - ODS( "FastFileTell: invalid handle\r\n" ); - return -1; - } - return pfh->pos - pfh->pfe->offset; - -} /* FastFileTell */ diff --git a/sdk/samples/fastfile/fastfile.h b/sdk/samples/fastfile/fastfile.h deleted file mode 100644 index 84f49fe..0000000 --- a/sdk/samples/fastfile/fastfile.h +++ /dev/null @@ -1,24 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: fastfile.h - * Content: Definitions for fastfile access. - * - * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, - * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED - * WARRANTIES OF MERCHANTBILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. - * - ***************************************************************************/ - -typedef LPVOID HFASTFILE; - -extern BOOL FastFileInit( LPSTR fname, int max_handles ); -extern void FastFileFini( void ); -extern HFASTFILE FastFileOpen( LPSTR name ); -extern BOOL FastFileClose( HFASTFILE pfe ); -extern BOOL FastFileRead( HFASTFILE pfh, LPVOID ptr, int size ); -extern BOOL FastFileSeek( HFASTFILE pfe, int off, int how ); -extern long FastFileTell( HFASTFILE pfe ); -extern LPVOID FastFileLock( HFASTFILE pfe, int off, int len ); -extern BOOL FastFileUnlock( HFASTFILE pfe, int off, int len ); diff --git a/sdk/samples/fastfile/fastfile.vc b/sdk/samples/fastfile/fastfile.vc deleted file mode 100644 index 8aa4533..0000000 --- a/sdk/samples/fastfile/fastfile.vc +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME = ffmsvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/fastfile/ffcreate.c b/sdk/samples/fastfile/ffcreate.c deleted file mode 100644 index 101fbc5..0000000 --- a/sdk/samples/fastfile/ffcreate.c +++ /dev/null @@ -1,249 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ffcreate.c - * Content: Fast file I/O for large numbers of files. - * Turns all files in a directory into a single file. - * This single file contains a directory + all the files. - * - * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, - * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED - * WARRANTIES OF MERCHANTBILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. - * - ***************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __WATCOMC__ -#define _open open -#define _close close -#define _lseek lseek -#define _read read -#define _write write -#define _stricmp stricmp -#define _S_IREAD S_IREAD -#define _S_IWRITE S_IWRITE -#endif - -#include "ffent.h" - -#define BLOCK_SIZE 16*1024 - -/* - * Compare - * - * quicksort comparison routine - */ -int Compare( const LPFILEENTRY p1, const LPFILEENTRY p2 ) -{ - return( _stricmp( (p1)->name,(p2)->name ) ); -} - -/* - * main - */ -main( int argc, char *argv[] ) -{ - HANDLE dir; - WIN32_FIND_DATA fd; - int out; - int in; - unsigned long cnt; - unsigned long tmp; - LPFILEENTRY pfe; - int i; - int bytes; - int outbytes; - char *buff; - char *fname; - char *dename; - long pos; - - /* - * get i/o buffer - */ - buff = malloc( BLOCK_SIZE ); - if( buff == NULL ) { - printf( "Out of memory!\n" ); - exit( 1 ); - } - - /* - * get fastfile name, open file - */ - if( argc < 2 ) { - fname = "\\result.ff"; - } else { - fname = argv[1]; - } - printf( "Creating FastFile \"%s\"\n", fname ); - out = _open( fname, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY, - _S_IREAD | _S_IWRITE ); - if( out < 0 ) { - printf( "Could not open file \"%s\"", fname ); - exit( 1 ); - } - - /* - * build a header - */ - cnt = 0; - printf( "Pass 1: building header\n" ); - dir = FindFirstFile( "*.*", &fd ); - if( dir == NULL ) { - printf( "Could not open current directory\n" ); - _close( out ); - exit( 1 ); - } - pfe = NULL; - while( 1 ) { - if( !(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { - cnt++; - pfe = realloc( pfe, (cnt+1) * sizeof( FILEENTRY ) ); - memset( &pfe[cnt-1], 0, sizeof( FILEENTRY )*2 ); - if( pfe == NULL ) { - printf( "Out of memory!\n" ); - _close( out ); - exit( 1 ); - } - dename = fd.cAlternateFileName; - if( dename[0] == 0 ) { - dename = fd.cFileName; - } - printf( "File %d: %s \r", cnt, dename ); - pfe[cnt-1].offset = 0; - strcpy( pfe[cnt-1].name, dename ); - } - if( !FindNextFile( dir, &fd ) ) { - break; - } - } - FindClose( dir ); - - if( cnt == 0 ) { - printf( "No files found!\n" ); - exit( 0 ); - } - - /* - * sort the directory - */ - qsort( pfe, cnt, sizeof( FILEENTRY ), (LPVOID) Compare ); - - /* - * write the number of directory entries + the directory - */ - tmp = cnt+1; - bytes = _write( out, &tmp, sizeof( tmp ) ); - if( bytes != sizeof( tmp ) ) { - printf( "Error writing output file\n" ); - _close( out ); - exit( 1 ); - } - bytes = _write( out, pfe, tmp * sizeof( FILEENTRY ) ); - if( bytes != (int) (tmp * sizeof( FILEENTRY )) ) { - printf( "Error writing output file\n" ); - _close( out ); - exit( 1 ); - } - - /* - * now read all of the files one by one and add them to the fastfile - */ - printf( "Pass 2: adding data files \n" ); - for( i=0;i<(int)cnt;i++ ) { - /* - * save current file position - */ - pfe[i].offset = _lseek( out, 0, SEEK_CUR ); - if( pfe[i].offset < 0 ) { - printf( "\nSeek error on output file\n" ); - _close( out ); - exit( 1 ); - } - - /* - * open next file to add - */ - in = _open( pfe[i].name, O_RDONLY | O_BINARY, 0 ); - printf( "File %d: \"%s\", offset=%ld \r", - i+1, pfe[i].name, pfe[i].offset ); - if( in < 0 ) { - printf( "\nError opening file %s\n", pfe[i].name ); - _close( out ); - exit( 1 ); - } - - /* - * copy the data in the file - */ - while( 1 ) { - bytes = _read( in, buff, BLOCK_SIZE ); - if( bytes == 0 ) { - break; - } - if( bytes < 0 ) { - printf( "\nError reading file %s\n", pfe[i].name ); - _close( in ); - _close( out ); - exit( 1 ); - } - outbytes = _write( out, buff, bytes ); - if( bytes != outbytes ) { - printf( "\nError writing output file\n" ); - _close( in ); - _close( out ); - exit( 1 ); - } - if( bytes < BLOCK_SIZE ) { - break; - } - } - _close( in ); - } - - /* - * get position of file end - */ - pfe[i].offset = _lseek( out, 0, SEEK_CUR ); - - /* - * seek to the start of the directory (right after the # of entries) - */ - pos = _lseek( out, sizeof( tmp ), SEEK_SET ); - if( pos != sizeof( tmp ) ) { - printf( "Seek error on output file\n" ); - _close( out ); - exit( 1 ); - } - - /* - * re-write the directory with the offsets setup - */ - bytes = _write( out, pfe, tmp * sizeof( FILEENTRY ) ); - if( bytes != (int) (tmp * sizeof( FILEENTRY )) ) { - printf( "Error writing output file\n" ); - _close( out ); - exit( 1 ); - } - - /* - * all done - */ - printf( "FastFile \"%s\" created: \n", fname ); - printf( " %ld files\n", tmp ); - printf( " %ld total file size\n", pfe[i].offset ); - - _close( out ); - return 0; - -} /* main */ diff --git a/sdk/samples/fastfile/ffcreate.def b/sdk/samples/fastfile/ffcreate.def deleted file mode 100644 index 235abc8..0000000 --- a/sdk/samples/fastfile/ffcreate.def +++ /dev/null @@ -1,9 +0,0 @@ -NAME FFCREATE - -DESCRIPTION 'FastFile create program (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE diff --git a/sdk/samples/fastfile/ffcreate.vc b/sdk/samples/fastfile/ffcreate.vc deleted file mode 100644 index ec982a8..0000000 --- a/sdk/samples/fastfile/ffcreate.vc +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME = ffcrmsvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/fastfile/ffcrmsvc.mk b/sdk/samples/fastfile/ffcrmsvc.mk deleted file mode 100644 index 21f0e6e..0000000 --- a/sdk/samples/fastfile/ffcrmsvc.mk +++ /dev/null @@ -1,36 +0,0 @@ -NAME = ffcreate -EXT = exe - -IS_32 = 1 - -GOALS = $(NAME).$(EXT) - -LIBS = libc.lib kernel32.lib - -OBJS = ffcreate.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -!else -COPT =-YX -LOPT =-debug:none -!endif -DEF = $(NAME).def - -CFLAGS =$(COPT) -Oxs -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --def:..\$(NAME).def --machine:i386 --subsystem:console -$(LIBS) -$(OBJS) -<< diff --git a/sdk/samples/fastfile/ffent.h b/sdk/samples/fastfile/ffent.h deleted file mode 100644 index 012f514..0000000 --- a/sdk/samples/fastfile/ffent.h +++ /dev/null @@ -1,19 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ffent.h - * Content: FastFile entry definition (internal) - * - * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, - * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED - * WARRANTIES OF MERCHANTBILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. - * - ***************************************************************************/ - -#pragma pack(1) -typedef struct { - long offset; - char name[13]; -} FILEENTRY, *LPFILEENTRY; -#pragma pack() diff --git a/sdk/samples/fastfile/ffmsvc.mk b/sdk/samples/fastfile/ffmsvc.mk deleted file mode 100644 index f4efc17..0000000 --- a/sdk/samples/fastfile/ffmsvc.mk +++ /dev/null @@ -1,26 +0,0 @@ -NAME = fastfile -EXT = lib - -IS_32 = 1 - -GOALS = $(NAME).$(EXT) - -OBJS = fastfile.obj - -!if ("$(DEBUG)" == "debug") -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -!else -COPT =-YX -!endif -DEF = $(NAME).def - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): $(OBJS) - @$(LIBEXE) @<< --name:$(NAME).$(EXT) -$(OBJS) -<< diff --git a/sdk/samples/fastfile/makefile b/sdk/samples/fastfile/makefile deleted file mode 100644 index 9f62278..0000000 --- a/sdk/samples/fastfile/makefile +++ /dev/null @@ -1,15 +0,0 @@ -all: debug - -debug : debug.mak -retail : retail.mak -clean : clean.mak - -debug.mak retail.mak clean.mak: - @echo ****************************** - @echo *** Building fastfile.lib *** - @echo ****************************** - @nmake /nologo /f fastfile.vc $(@B) - @echo ************************************ - @echo *** Building ffcreate.exe *** - @echo ************************************ - @nmake /nologo /f ffcreate.vc $(@B) diff --git a/sdk/samples/fastfile/readme.txt b/sdk/samples/fastfile/readme.txt deleted file mode 100644 index 6337108..0000000 --- a/sdk/samples/fastfile/readme.txt +++ /dev/null @@ -1,54 +0,0 @@ -FastFile --------- -FastFile provides a way to create a very fast way to access large numbers -of files. - -You use FFCREATE.EXE to create a single flat file. Just run FFCREATE in -the directory that contains all of the files you wish to access. A file -will be created at the root (RESULT.FF) that is the FastFile. (you can -specify a filename on the command line to override the default of RESULT.FF; -if you do so, make sure that the result file is NOT generated in the -current directory). - -Once you have created your FastFile, you can use the FastFile routines to -access it: - -BOOL FastFileInit( LPSTR fname, int max_handles ): -Call to initialize access to a FastFile. - fname : name of FastFile - max_handles: maximum number of file handles you want to have open at the - same time. - returns TRUE if succeeds, FALSE otherwise - -void FastFileFini( void ): -Call when you are finished accessing your FastFile - -HFASTFILE FastFileOpen( LPSTR name ): -Call to open an individual file in a FastFile (read-only access is supported) - name: name if individual file - returns a handle, or NULL if fail - -BOOL FastFileClose( HFASTFILE hff ): -Call to close an individual file - hff: handle to an individual file - returns TRUE if succeeded, FALSE otherwise - -BOOL FastFileRead( HFASTFILE hff, LPVOID ptr, int size ) -Call to read from an individual file - hff: handle to an individual file - ptr: buffer to copy data - size: size of data to copy - returns TRUE if succeeded, FALSE otherwise - -BOOL FastFileSeek( HFASTFILE hff, int off, int type ) -Call to seek to an offset in an individual file - hff: handle to an individual file - off: offset to seek to - type: seek type: SEEK_SET (from start), SEEK_CUR (from current pos), - or SEEK_END (from end) - returns TRUE if succeeded, FALSE otherwise - -long FastFileTell( HFASTFILE hff ) -Call to get the current position in an individual file - hff: handle to an individual file - returns current position if succeeded, -1 otherwise diff --git a/sdk/samples/fdfilter/debug.c b/sdk/samples/fdfilter/debug.c deleted file mode 100644 index 9dce2f3..0000000 --- a/sdk/samples/fdfilter/debug.c +++ /dev/null @@ -1,424 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.c - * Content: debug code - * - ***************************************************************************/ - -#include -#include -#include -#include -#include "debug.h" - -#if defined(DEBUG) || defined(_DEBUG) - - -// -// since we don't UNICODE our debugging messages, use the ASCII entry -// points regardless of how we are compiled. -// -#ifdef _WIN32 - #include -#else - #define lstrcatA lstrcat - #define lstrlenA lstrlen - #define GetProfileIntA GetProfileInt - #define OutputDebugStringA OutputDebugString - #define wsprintfA wsprintf - #define MessageBoxA MessageBox -#endif - -// -// -// -BOOL __gfDbgEnabled = TRUE; // master enable -UINT __guDbgLevel = 0; // current debug level - - -//--------------------------------------------------------------------------; -// -// void DbgVPrintF -// -// Description: -// -// -// Arguments: -// LPSTR szFormat: -// -// va_list va: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL DbgVPrintF -( - LPSTR szFormat, - va_list va -) -{ - char ach[DEBUG_MAX_LINE_LEN]; - BOOL fDebugBreak = FALSE; - BOOL fPrefix = TRUE; - BOOL fCRLF = TRUE; - - ach[0] = '\0'; - - for (;;) - { - switch (*szFormat) - { - case '!': - fDebugBreak = TRUE; - szFormat++; - continue; - - case '`': - fPrefix = FALSE; - szFormat++; - continue; - - case '~': - fCRLF = FALSE; - szFormat++; - continue; - } - - break; - } - - if (fDebugBreak) - { - ach[0] = '\007'; - ach[1] = '\0'; - } - - if (fPrefix) - { - lstrcatA(ach, DEBUG_MODULE_NAME ": "); - } - -#ifdef _WIN32 - wvsprintfA(ach + lstrlenA(ach), szFormat, va); -#else - wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va); -#endif - - if (fCRLF) - { - lstrcatA(ach, "\r\n"); - } - - OutputDebugStringA(ach); - - if (fDebugBreak) - { - DebugBreak(); - } -} // DbgVPrintF() - - -//--------------------------------------------------------------------------; -// -// void dprintf -// -// Description: -// dprintf() is called by the DPF() macro if DEBUG is defined at compile -// time. It is recommended that you only use the DPF() macro to call -// this function--so you don't have to put #ifdef DEBUG around all -// of your code. -// -// Arguments: -// UINT uDbgLevel: -// -// LPSTR szFormat: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL dprintf -( - UINT uDbgLevel, - LPSTR szFormat, - ... -) -{ - va_list va; - - if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel)) - return; - - va_start(va, szFormat); - DbgVPrintF(szFormat, va); - va_end(va); -} // dprintf() - - -//--------------------------------------------------------------------------; -// -// BOOL DbgEnable -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (BOOL): -// Returns the previous debugging state. -// -//--------------------------------------------------------------------------; - -BOOL WINAPI DbgEnable -( - BOOL fEnable -) -{ - BOOL fOldState; - - fOldState = __gfDbgEnabled; - __gfDbgEnabled = fEnable; - - return (fOldState); -} // DbgEnable() - - -//--------------------------------------------------------------------------; -// -// UINT DbgSetLevel -// -// Description: -// -// -// Arguments: -// UINT uLevel: -// -// Return (UINT): -// Returns the previous debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgSetLevel -( - UINT uLevel -) -{ - UINT uOldLevel; - - uOldLevel = __guDbgLevel; - __guDbgLevel = uLevel; - - return (uOldLevel); -} // DbgSetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgGetLevel -// -// Description: -// -// -// Arguments: -// None. -// -// Return (UINT): -// Returns the current debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgGetLevel -( - void -) -{ - return (__guDbgLevel); -} // DbgGetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgInitialize -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (UINT): -// Returns the debugging level that was set. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgInitialize -( - BOOL fEnable -) -{ - UINT uLevel; - - uLevel = GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, (UINT)-1); - if ((UINT)-1 == uLevel) - { - // - // if the debug key is not present, then force debug output to - // be disabled. this way running a debug version of a component - // on a non-debugging machine will not generate output unless - // the debug key exists. - // - uLevel = 0; - fEnable = FALSE; - } - - DbgSetLevel(uLevel); - DbgEnable(fEnable); - - return (__guDbgLevel); -} // DbgInitialize() - - -void WINAPI DbgDumpWFX( int nLevel, PWAVEFORMATEX pwfx ) - { - DPF( nLevel, "Dumping WAVEFORMATEX at 0x%08lX", pwfx ); - DPF( nLevel, "wFormatTag = %u, nChannels = %u, nSamplesPerSec = %lu", - pwfx->wFormatTag, pwfx->nChannels, pwfx->nSamplesPerSec ); - DPF( nLevel, "nAvgBytesPerSec = %lu, nBlockAlign = %u, wBitsPerSample = %lu", - pwfx->nAvgBytesPerSec, pwfx->nBlockAlign, pwfx->wBitsPerSample ); - DPF( nLevel, "cbSize = %u",pwfx->cbSize ); - } - - -//--------------------------------------------------------------------------; -// -// void _Assert -// -// Description: -// This routine is called if the ASSERT macro (defined in debug.h) -// tests and expression that evaluates to FALSE. This routine -// displays an "assertion failed" message box allowing the user to -// abort the program, enter the debugger (the "retry" button), or -// ignore the assertion and continue executing. The message box -// displays the file name and line number of the _Assert() call. -// -// Arguments: -// char * szFile: Filename where assertion occurred. -// int iLine: Line number of assertion. -// -//--------------------------------------------------------------------------; - -#ifndef _WIN32 -#pragma warning(disable:4704) -#endif - -void WINAPI _Assert -( - char * szFile, - int iLine -) -{ - static char ach[300]; // debug output (avoid stack overflow) - int id; -#ifndef _WIN32 - int iExitCode; -#endif - - wsprintfA(ach, "Assertion failed in file %s, line %d. [Press RETRY to debug.]", (LPSTR)szFile, iLine); - - id = MessageBoxA(NULL, ach, "Assertion Failed", - MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE ); - - switch (id) - { - - case IDABORT: // Kill the application. -#ifndef _WIN32 - iExitCode = 0; - _asm - { - mov ah, 4Ch - mov al, BYTE PTR iExitCode - int 21h - } -#else - FatalAppExit(0, TEXT("Good Bye")); -#endif // WIN16 - break; - - case IDRETRY: // Break into the debugger. - DebugBreak(); - break; - - case IDIGNORE: // Ignore assertion, continue executing. - break; - } -} // _Assert - -#ifndef _WIN32 -#pragma warning(default:4704) -#endif - -#endif // #if defined(DEBUG) || defined(_DEBUG) - -// Silly little function gives meaningful error messages from HRESULT's -LPSTR TranslateDSError( HRESULT hr ) - { - switch( hr ) - { - case DSERR_ALLOCATED: - return "DSERR_ALLOCATED"; - - case DSERR_CONTROLUNAVAIL: - return "DSERR_CONTROLUNAVAIL"; - - case DSERR_INVALIDPARAM: - return "DSERR_INVALIDPARAM"; - - case DSERR_INVALIDCALL: - return "DSERR_INVALIDCALL"; - - case DSERR_GENERIC: - return "DSERR_GENERIC"; - - case DSERR_PRIOLEVELNEEDED: - return "DSERR_PRIOLEVELNEEDED"; - - case DSERR_OUTOFMEMORY: - return "DSERR_OUTOFMEMORY"; - - case DSERR_BADFORMAT: - return "DSERR_BADFORMAT"; - - case DSERR_UNSUPPORTED: - return "DSERR_UNSUPPORTED"; - - case DSERR_NODRIVER: - return "DSERR_NODRIVER"; - - case DSERR_ALREADYINITIALIZED: - return "DSERR_ALREADYINITIALIZED"; - - case DSERR_NOAGGREGATION: - return "DSERR_NOAGGREGATION"; - - case DSERR_BUFFERLOST: - return "DSERR_BUFFERLOST"; - - case DSERR_OTHERAPPHASPRIO: - return "DSERR_OTHERAPPHASPRIO"; - - case DSERR_UNINITIALIZED: - return "DSERR_UNINITIALIZED"; - - default: - return "Unknown HRESULT"; - } - } - - diff --git a/sdk/samples/fdfilter/debug.h b/sdk/samples/fdfilter/debug.h deleted file mode 100644 index ccff6a7..0000000 --- a/sdk/samples/fdfilter/debug.h +++ /dev/null @@ -1,93 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.h - * Content: debug header - * - ***************************************************************************/ -#ifndef __DEBUG_INCLUDED__ -#define __DEBUG_INCLUDED__ -#ifdef __cplusplus -extern "C" -{ -#endif - -LPSTR TranslateDSError( HRESULT ); - -// -// -// -// -#if defined(DEBUG) || defined(_DEBUG) - #define DEBUG_SECTION "Debug" // section name for - #define DEBUG_MODULE_NAME "FDFILTER" // key name and prefix for output - #define DEBUG_MAX_LINE_LEN 255 // max line length (bytes!) -#endif - - -// -// based code makes since only in win 16 (to try and keep stuff out of -// [fixed] data segments, etc)... -// -#ifndef BCODE -#ifdef _WIN32 - #define BCODE -#else - #define BCODE _based(_segname("_CODE")) -#endif -#endif - - - - -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; -// -// -// -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - -#if defined(DEBUG) || defined(_DEBUG) - BOOL WINAPI DbgEnable(BOOL fEnable); - UINT WINAPI DbgGetLevel(void); - UINT WINAPI DbgSetLevel(UINT uLevel); - UINT WINAPI DbgInitialize(BOOL fEnable); - void WINAPI _Assert( char * szFile, int iLine ); - void WINAPI DbgDumpWFX( int, PWAVEFORMATEX ); - - void FAR CDECL dprintf(UINT uDbgLevel, LPSTR szFmt, ...); - - #define D(x) {x;} - #define DPF dprintf - #define DPI(sz) {static char BCODE ach[] = sz; OutputDebugStr(ach);} - #define DPWFX DbgDumpWFX - #define ASSERT(x) if( !(x) ) _Assert( __FILE__, __LINE__) -#else - #define DbgEnable(x) FALSE - #define DbgGetLevel() 0 - #define DbgSetLevel(x) 0 - #define DbgInitialize(x) 0 - #define DbgDumpWFX(x,y) 0 - - #ifdef _MSC_VER - #pragma warning(disable:4002) - #endif - - #define D(x) - #define DPF() - #define DPI(sz) - #define DPWFX() - #define ASSERT(x) -#endif - -#if defined(DEBUG) || defined(_DEBUG) -#define ASSERT_HWND( h ) ASSERT( IsWindow((h)) ) -#else -#define ASSERT_HWND( h ) ASSERT( NULL != (h) ) -#endif - -#ifdef __cplusplus -} -#endif -#endif // __DEBUG_INCLUDED__ - diff --git a/sdk/samples/fdfilter/fdaudio.cpp b/sdk/samples/fdfilter/fdaudio.cpp deleted file mode 100644 index 6b12ed3..0000000 --- a/sdk/samples/fdfilter/fdaudio.cpp +++ /dev/null @@ -1,858 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// File: FDAUDIO.CPP -// Contents: Audio related routines for full-duplex device usage -// -// Description: This file includes functionality for enumerating devices & -// formats, initializing devices and buffers, and the CALLBACK -// procedures for dealing with full duplex. -// - -#include "fdfilter.h" -#include "fdaudio.h" -#include "filter.h" - -static BOOL IsWaveDeviceInList( UINT, WAVEINCAPS * ); -static BOOL IsDSDeviceInList( LPGUID ); - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL InitSoundDevices( BOOL fAllowFormatCancel ) - { - if( NULL == gpwfxOutput ) - { - gpwfxOutput = new WAVEFORMATEX; - if( NULL == gpwfxOutput ) - goto ISD_Fail; - ZeroMemory( gpwfxOutput, sizeof(WAVEFORMATEX)); - gpwfxOutput->wFormatTag = WAVE_FORMAT_PCM; - DPF( 3, "Created gpwfxOutput" ); - DPWFX( 3, gpwfxOutput ); - } - - if( NULL == gpwfxInput ) - { - gpwfxInput = new WAVEFORMATEX; - if( NULL == gpwfxInput ) - goto ISD_Fail; - ZeroMemory( gpwfxInput, sizeof(WAVEFORMATEX)); - gpwfxInput->wFormatTag = WAVE_FORMAT_PCM; - DPF( 3, "Created gpwfxInput" ); - DPWFX( 3, gpwfxInput ); - } - - EnumDSDevices(); - if( NULL == gpdsddOutputDevices ) - { - MessageBox( ghMainWnd, "No DirectSound devices are available!", gszAppName, MB_OK ); - goto ISD_Fail; - } - - EnumWaveDevices(); - if( NULL == gpwddInputDevices ) - { - MessageBox( ghMainWnd, "No waveIn devices are available!", gszAppName, MB_OK ); - goto ISD_Fail; - } - - if( !DialogBox( ghInst, MAKEINTRESOURCE(IDD_DEVICES), - ghMainWnd, (DLGPROC)SelectDevicesDlgProc )) - goto ISD_Fail; - - if( !InitPrimarySoundBuffer()) - goto ISD_Fail; - - if( !DialogBoxParam( ghInst, MAKEINTRESOURCE(IDD_FORMATS), - ghMainWnd, (DLGPROC)SelectFormatsDlgProc, - (LPARAM)fAllowFormatCancel )) - goto ISD_Fail; - - return TRUE; - -ISD_Fail: - return FALSE; - } - - -BOOL ReOpenSoundDevices( BOOL fAllowFormatCancel ) - { - if( NULL == gpwfxOutput ) - { - gpwfxOutput = new WAVEFORMATEX; - if( NULL == gpwfxOutput ) - goto ROSD_Fail; - ZeroMemory( gpwfxOutput, sizeof(WAVEFORMATEX)); - gpwfxOutput->wFormatTag = WAVE_FORMAT_PCM; - DPF( 3, "Created gpwfxOutput" ); - DPWFX( 3, gpwfxOutput ); - } - - if( NULL == gpwfxInput ) - { - gpwfxInput = new WAVEFORMATEX; - if( NULL == gpwfxInput ) - goto ROSD_Fail; - ZeroMemory( gpwfxInput, sizeof(WAVEFORMATEX)); - gpwfxInput->wFormatTag = WAVE_FORMAT_PCM; - DPF( 3, "Created gpwfxInput" ); - DPWFX( 3, gpwfxInput ); - } - - EnumDSDevices(); - if( NULL == gpdsddOutputDevices ) - { - MessageBox( ghMainWnd, "No DirectSound devices are available!", gszAppName, MB_OK ); - goto ROSD_Fail; - } - - EnumWaveDevices(); - if( NULL == gpwddInputDevices ) - { - MessageBox( ghMainWnd, "No waveIn devices are available!", gszAppName, MB_OK ); - goto ROSD_Fail; - } - - if( !DialogBox( ghInst, MAKEINTRESOURCE(IDD_DEVICES), - ghMainWnd, (DLGPROC)SelectDevicesDlgProc )) - goto ROSD_Fail; - - StopBuffers(); - CloseWaveDevice(); - DestroyBuffers(); - CloseDSDevice(); - - if( !InitPrimarySoundBuffer()) - goto ROSD_Fail; - - if( !DialogBoxParam( ghInst, MAKEINTRESOURCE(IDD_FORMATS), - ghMainWnd, (DLGPROC)SelectFormatsDlgProc, - (LPARAM)fAllowFormatCancel )) - goto ROSD_Fail; - - return TRUE; - -ROSD_Fail: - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL IsWaveDeviceInList( UINT iDev, WAVEINCAPS *pwic ) - { - PWAVEDEVICEDESC pwdd = gpwddInputDevices; - - while( pwdd ) - { - if( pwdd->uID == iDev && pwdd->dwFormats == pwic->dwFormats - && pwdd->nChannels == pwic->wChannels - && !lstrcmp(pwdd->szDeviceDesc, pwic->szPname)) - return TRUE; - - pwdd = pwdd->pNext; - } - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL IsDSDeviceInList( LPGUID lpguDevice ) - { - PDSDEVICEDESC pdsdd = gpdsddOutputDevices; - - while( pdsdd ) - { - // This works because operator== is overloaded for GUIDS - if( NULL == lpguDevice ) - { - if( pdsdd->guDevice == GUID_NULL ) - return TRUE; - } - else if( pdsdd->guDevice == *lpguDevice ) - return TRUE; - - pdsdd = pdsdd->pNext; - } - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// EnumDSDevices() -// -// Enumerates the DirectSound devices with the help of DirectSoundEnumerate -// and DSEnumProc. Adds entries to a global list about each device. -// -BOOL EnumDSDevices( void ) - { - DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc, NULL ); - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// EnumWaveDevices() -// -// This function enumerates the waveIn devices and builds a list of them. -// -BOOL EnumWaveDevices( void ) - { - UINT nDevices, iDev; - PWAVEDEVICEDESC pwddNew; - WAVEINCAPS wiCaps; - - nDevices = waveInGetNumDevs(); - if( !nDevices ) - return FALSE; - - for( iDev = 0; iDev < nDevices; iDev++ ) - { - if( MMSYSERR_NOERROR != waveInGetDevCaps( iDev, &wiCaps, sizeof(wiCaps))) - continue; - - if( !IsWaveDeviceInList( iDev, &wiCaps )) - { - if(( pwddNew = new WAVEDEVICEDESC ) == NULL ) - continue; - pwddNew->uID = iDev; - pwddNew->dwFormats = wiCaps.dwFormats; - pwddNew->nChannels = wiCaps.wChannels; - lstrcpy( pwddNew->szDeviceDesc, wiCaps.szPname ); - - pwddNew->pNext = gpwddInputDevices; - gpwddInputDevices = pwddNew; - } - } - - if( NULL == gpwddInputDevices ) - return FALSE; - - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// InitPrimarySoundBuffer() -// -// Creates and initializes the primary sound buffer for the application. -// We need the primary buffer in order to get the 3D listener interface and -// also to select output format type. -// -BOOL InitPrimarySoundBuffer( void ) - { - HRESULT dsrval; - DSBUFFERDESC dsbd; - - ZeroMemory( &dsbd, sizeof(DSBUFFERDESC)); - - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; - - if( FAILED( dsrval = DirectSoundCreate( &gpdsddOut->guDevice, &gpds, NULL ))) - { - DPF( 0, "Couldn't open DirectSound device (%s)", TranslateDSError(dsrval)); - goto IPSB_ExitError; - } - - if( FAILED( dsrval = gpds->SetCooperativeLevel( ghMainWnd, DSSCL_PRIORITY ))) - { - DPF( 0, "Couldn't get PRIORITY cooperative level (%s)", TranslateDSError(dsrval)); - goto IPSB_ExitError; - } - - if( FAILED( dsrval = gpds->CreateSoundBuffer( &dsbd, &gpdsbPrimary, NULL ))) - { - DPF( 0, "Couldn't create primary buffer (%s)", TranslateDSError(dsrval)); - goto IPSB_ExitError; - } - - return TRUE; - -IPSB_ExitError: - if( NULL != gpdsbPrimary ) - { - DPF( 1, "Releasing Primary in InitPrimarySoundBuffer() error cleanup" ); - gpdsbPrimary->Release(); - gpdsbPrimary = NULL; - } - if( NULL != gpds ) - { - DPF( 1, "Releasing DSound object in InitPrimarySoundBuffer() error cleanup" ); - gpds->Release(); - gpds= NULL; - } - - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// DSEnumProc() -// -// DirectSoundEnumerate() callback procedure which fills the DSDEVICEDESC list -// with data about available devices. -// -BOOL CALLBACK DSEnumProc( LPGUID lpguDevice, LPSTR lpszDesc, - LPSTR lpszDrvName, LPVOID lpContext ) - { - PDSDEVICEDESC pdsddNew; - - if( !IsDSDeviceInList( lpguDevice )) - { - if(( pdsddNew = new DSDEVICEDESC ) == NULL ) - { - return TRUE; - } - - ZeroMemory( pdsddNew, sizeof(DSDEVICEDESC)); - - if( NULL != lpguDevice ) - pdsddNew->guDevice = *lpguDevice; - else - pdsddNew->guDevice = GUID_NULL; - - if(( pdsddNew->pszDeviceDesc = new char[lstrlen(lpszDesc)+1]) == NULL ) - { - delete pdsddNew; - return TRUE; - } - lstrcpy( pdsddNew->pszDeviceDesc, lpszDesc ); - - pdsddNew->pNext = gpdsddOutputDevices; - gpdsddOutputDevices = pdsddNew; - } - - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ClearDSDeviceList( void ) - { - PDSDEVICEDESC pdsddCur, pdsddTemp; - - pdsddCur = gpdsddOutputDevices; - - while( pdsddCur ) - { - if( NULL != pdsddCur->pszDeviceDesc ) - delete[] pdsddCur->pszDeviceDesc; - - pdsddTemp = pdsddCur->pNext; - delete pdsddCur; - pdsddCur = pdsddTemp; - } - gpdsddOutputDevices = NULL; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ClearWaveDeviceList( void ) - { - PWAVEDEVICEDESC pwddCur, pwddTemp; - - pwddCur = gpwddInputDevices; - - while( pwddCur ) - { - pwddTemp = pwddCur->pNext; - delete pwddCur; - pwddCur = pwddTemp; - } - gpwddInputDevices = NULL; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FillInputDeviceCombo( HWND hCombo ) - { - PWAVEDEVICEDESC pwdd = gpwddInputDevices; - int idx; - - if( NULL == hCombo ) - return; - - while( pwdd ) - { - idx = ComboBox_InsertString( hCombo, -1, pwdd->szDeviceDesc ); - ComboBox_SetItemData( hCombo, idx, pwdd ); - pwdd = pwdd->pNext; - } - if( NULL != gpwddInputDevices ) - ComboBox_SetCurSel( hCombo, 0 ); - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void FillOutputDeviceCombo( HWND hCombo ) - { - PDSDEVICEDESC pdsdd = gpdsddOutputDevices; - int idx; - - if( NULL == hCombo ) - return; - - while( pdsdd ) - { - idx = ComboBox_InsertString( hCombo, -1, pdsdd->pszDeviceDesc ); - ComboBox_SetItemData( hCombo, idx, pdsdd ); - pdsdd = pdsdd->pNext; - } - if( NULL != gpdsddOutputDevices ) - ComboBox_SetCurSel( hCombo, 0 ); - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ScanAvailableDSFormats( void ) - { - WAVEFORMATEX wfx; - HRESULT dsrval; - HCURSOR hCursor; - int i; - - DPF( 3, "Scanning %u DirectSound formats for availability", NUM_FORMATCODES ); - if( NULL == gpds || NULL == gpdsbPrimary ) - { - for( i = 0; i < NUM_FORMATCODES; i++ ) - aOutputFormats[i].fEnabled = FALSE; - return; - } - - // This might take a second or two, so throw up the hourglass - hCursor = GetCursor(); - SetCursor( LoadCursor( NULL, IDC_WAIT )); - - ZeroMemory( &wfx, sizeof(wfx)); - wfx.wFormatTag = WAVE_FORMAT_PCM; - - for( i = 0; i < NUM_FORMATCODES; i++ ) - { - FormatCodeToWFX( aOutputFormats[i].dwCode, &wfx ); - - if( FAILED( dsrval = gpdsbPrimary->SetFormat( &wfx ))) - { - DPF( 5, "Failed with SetFormat() for %u format", aOutputFormats[i].dwCode ); - aOutputFormats[i].fEnabled = FALSE; - } - else - { - DPF( 5, "Succeeded with SetFormat() for %u format", aOutputFormats[i].dwCode ); - aOutputFormats[i].fEnabled = TRUE; - } - } - SetCursor( hCursor ); - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void ScanAvailableWaveFormats( void ) - { - WAVEFORMATEX wfx; - HCURSOR hCursor; - MMRESULT mmrval; - int i; - - DPF( 3, "Scanning %u waveIn formats for availability", NUM_FORMATCODES ); - - // This might take a second or two, so throw up the hourglass - hCursor = GetCursor(); - SetCursor( LoadCursor( NULL, IDC_WAIT )); - - for( i = 0; i < NUM_FORMATCODES; i++ ) - aOutputFormats[i].fEnabled = FALSE; - - ZeroMemory( &wfx, sizeof(wfx)); - wfx.wFormatTag = WAVE_FORMAT_PCM; - - for( i = 0; i < NUM_FORMATCODES; i++ ) - { - FormatCodeToWFX( aInputFormats[i].dwCode, &wfx ); - - if(( mmrval = waveInOpen( &ghWaveIn, gpwddIn->uID, &wfx, - (DWORD)WaveInCallback, - 0, CALLBACK_FUNCTION )) != MMSYSERR_NOERROR ) - { - DPF( 5, "Failed with waveInOpen() for %u format", aInputFormats[i].dwCode ); - aInputFormats[i].fEnabled = FALSE; - } - else - { - DPF( 5, "Succeeded with waveInOpen() for %u format", aInputFormats[i].dwCode ); - aInputFormats[i].fEnabled = TRUE; - waveInClose( ghWaveIn ); - } - } - - SetCursor( hCursor ); - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void CloseDSDevice( void ) - { - if( NULL != gpdsbOutput ) - { - gpdsbOutput->Release(); - gpdsbOutput = NULL; - } - if( NULL != gpdsbPrimary ) - { - gpdsbPrimary->Release(); - gpdsbPrimary = NULL; - } - if( NULL != gpds ) - { - gpds->Release(); - gpds = NULL; - } - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void CloseWaveDevice( void ) - { - if( NULL == ghWaveIn ) - return; - - waveInReset( ghWaveIn ); - EnterCriticalSection( &gcsBufferData ); - if( gnBuffersOut ) - WaitForSingleObject( ghCallbackFinished, INFINITE ); - LeaveCriticalSection( &gcsBufferData ); - waveInClose( ghWaveIn ); - ghWaveIn = NULL; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL InitBuffers( void ) - { - HRESULT dsrval; - int i; - - if( gfBuffersInitialized ) - return TRUE; - if( NULL == ghWaveIn ) - return FALSE; - - EnterCriticalSection( &gcsBufferData ); - if( NULL == gawhHeaders ) - { - if(( gawhHeaders = new WAVEHDR[NUM_BUFFERS] ) == NULL ) - goto Abort_InitBuffers; - ASSERT( NULL == gpbBufferData ); - } - if( NULL == gpbBufferData ) - { - gcbBufferSize = max( 4096, gpwfxInput->nAvgBytesPerSec / 8 ); - gcbBufferSize -= gcbBufferSize % gpwfxInput->nBlockAlign; - DPF( 1, "Set input buffer size to %lu bytes", gcbBufferSize ); - - if(( gpbBufferData = new BYTE[NUM_BUFFERS*gcbBufferSize] ) == NULL ) - goto Abort_InitBuffers; - } - - ZeroMemory( gawhHeaders, sizeof(WAVEHDR)*NUM_BUFFERS ); - for( i = 0; i < NUM_BUFFERS; i++ ) - { - gawhHeaders[i].dwBufferLength = gcbBufferSize; - gawhHeaders[i].lpData = (LPSTR)gpbBufferData + i*gcbBufferSize; - gawhHeaders[i].dwUser = i; - if( MMSYSERR_NOERROR != waveInPrepareHeader( ghWaveIn, - &gawhHeaders[i], sizeof(WAVEHDR))) - goto Abort_InitBuffers; - if( MMSYSERR_NOERROR != waveInAddBuffer( ghWaveIn, - &gawhHeaders[i], sizeof(WAVEHDR))) - goto Abort_InitBuffers; - gnBuffersOut++; - } - - ZeroMemory( &gdsbdOutput, sizeof(gdsbdOutput)); - gdsbdOutput.dwSize = sizeof(gdsbdOutput); - gdsbdOutput.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS; - gdsbdOutput.dwBufferBytes = NUM_BUFFERS * gcbBufferSize / 2; - // We want the format of this secondary to match the format of the input - // data. This lets us blindly copy the data out and DSound worries about - // matching the bits and channels to our desired primary buffer format. - gdsbdOutput.lpwfxFormat = gpwfxInput; - - if( FAILED( dsrval = gpds->CreateSoundBuffer( &gdsbdOutput, &gpdsbOutput, NULL ))) - { - DPF( 0, "Unable to create sound buffer for output (%s)", TranslateDSError(dsrval)); - goto Abort_InitBuffers; - } - - InterlockedExchange( &gfBuffersInitialized, TRUE ); - LeaveCriticalSection( &gcsBufferData ); - return TRUE; - -Abort_InitBuffers: - // TODO: If there were any buffers put out, we must Reset to get them back - ASSERT( DestroyBuffers()); - LeaveCriticalSection( &gcsBufferData ); - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL StartBuffers( void ) - { - if( NULL == ghWaveIn || NULL == gpdsbOutput ) - return FALSE; - - waveInStart( ghWaveIn ); - - // Rewind the output buffer, fill it with silence, and play it - gpdsbOutput->SetCurrentPosition( 0 ); - WriteSilenceToOutput( 0, gdsbdOutput.dwBufferBytes ); - gpdsbOutput->Play( 0, 0, DSBPLAY_LOOPING ); - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL StopBuffers( void ) - { - if( NULL == ghWaveIn || NULL == gpdsbOutput ) - return FALSE; - - waveInStop( ghWaveIn ); - gpdsbOutput->Stop(); - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL DestroyBuffers( void ) - { - if( NULL != ghWaveIn ) - return FALSE; - - if( NULL != gawhHeaders ) - { - delete[] gawhHeaders; - gawhHeaders = NULL; - } - if( NULL != gpbBufferData ) - { - delete[] gpbBufferData; - gpbBufferData = NULL; - } - if( NULL != gpdsbOutput ) - { - gpdsbOutput->Release(); - gpdsbOutput = NULL; - } - InterlockedExchange( &gfBuffersInitialized, FALSE ); - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -BOOL WriteSilenceToOutput( DWORD dwStart, DWORD cbLength ) - { - PBYTE pb1, pb2; - DWORD cb1, cb2; - - if(( !dwStart && !cbLength ) || NULL == gpdsbOutput - || NULL == gdsbdOutput.lpwfxFormat ) - return FALSE; - - if( SUCCEEDED( gpdsbOutput->Lock( dwStart, cbLength, &pb1, &cb1, &pb2, &cb2, 0 ))) - { - FillMemory( pb1, cb1, (gdsbdOutput.lpwfxFormat->wBitsPerSample == 8) ? 128 : 0 ); - if( NULL != pb2 && cb2 ) - FillMemory( pb2, cb2, (gdsbdOutput.lpwfxFormat->wBitsPerSample == 8) ? 128 : 0 ); - - gpdsbOutput->Unlock( pb1, cb1, pb2, cb2 ); - return TRUE; - } - - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -void CALLBACK WaveInCallback( HWAVEIN hwi, UINT uMsg, DWORD dwInstance, - DWORD dwParam1, DWORD dwParam2 ) - { - static DWORD dwWritePosition = 0xFFFFFFFF; - PWAVEHDR pwhBuffer; - HRESULT dsrval; - - switch( uMsg ) - { - case WIM_DATA: - pwhBuffer = (PWAVEHDR)dwParam1; - // If there's no data in the buffer, we must be getting it back - // so we can shutdown - EnterCriticalSection( &gcsBufferData ); - - if( pwhBuffer->dwBytesRecorded == 0 ) - { - waveInUnprepareHeader( ghWaveIn, pwhBuffer, sizeof(WAVEHDR)); - // Don't delete the buffer space or the WAVEHDR, because we - // have allocated them all in an array and will delete them - // when all buffers are returned and the device is closed - if( !--gnBuffersOut ) - { - SetEvent( ghCallbackFinished ); - dwWritePosition = 0xFFFFFFFF; - } - } - else - { - PBYTE pb1, pb2; - DWORD cb1, cb2; - BOOL fRestoredBuffer = FALSE; - - // TODO: Send the data to the filter - - // TODO: Copy the data into the DirectSound buffer - if( NULL != gpdsbOutput ) - { - DWORD dwStatus; - if( FAILED( dsrval = gpdsbOutput->GetStatus( &dwStatus ))) - { - DPF( 0, "Unable to get buffer status. (%s)", TranslateDSError(dsrval)); - goto WIC_SkipDataProcessing; - } - if( dwStatus & DSBSTATUS_BUFFERLOST ) - { - if( FAILED( dsrval = gpdsbOutput->Restore())) - { - DPF( 0, "Couldn't Restore output buffer. (%s)", TranslateDSError(dsrval)); - goto WIC_SkipDataProcessing; - } - dwWritePosition = 0; - fRestoredBuffer = TRUE; - } - else - { - if( dwWritePosition == 0xFFFFFFFF ) - { - DWORD dwPlay, dwWrite; - - gpdsbOutput->GetCurrentPosition( &dwPlay, &dwWrite ); - // For our safety, put the write position twice as far ahead as - // what DirectSound says is safe -// dwWritePosition = 3 * dwWrite - dwPlay; -// dwWritePosition = dwWrite + gcbBufferSize; - dwWritePosition = gdsbdOutput.dwBufferBytes + dwPlay - gcbBufferSize; - while( dwWritePosition >= gdsbdOutput.dwBufferBytes ) - dwWritePosition -= gdsbdOutput.dwBufferBytes; - } - } - - if( pwhBuffer->dwBytesRecorded > gcbBufferSize ) - DPF( 1, "Unexpectedly large buffer -- %lu bytes (gcbBufferSize = %lu)", - pwhBuffer->dwBytesRecorded, gcbBufferSize ); - - if( SUCCEEDED( gpdsbOutput->Lock( dwWritePosition, - pwhBuffer->dwBytesRecorded, - &pb1, &cb1, &pb2, &cb2, 0 ))) - { - if( NULL != pb1 && NULL != gpFilter ) - { - gpFilter->Transform( (PBYTE)pwhBuffer->lpData, cb1, pb1 ); - } - if( cb2 && NULL != pb2 && NULL != gpFilter ) - { - gpFilter->Transform( (PBYTE)pwhBuffer->lpData + cb1, - pwhBuffer->dwBytesRecorded - cb1, pb2 ); - } - gpdsbOutput->Unlock( pb1, cb1, pb2, - pwhBuffer->dwBytesRecorded - cb1 ); - dwWritePosition += pwhBuffer->dwBytesRecorded; - while( dwWritePosition >= gdsbdOutput.dwBufferBytes ) - dwWritePosition -= gdsbdOutput.dwBufferBytes; - } - if( fRestoredBuffer ) - { - gpdsbOutput->SetCurrentPosition( 0 ); - if( FAILED( dsrval = gpdsbOutput->Play( 0, 0, DSBPLAY_LOOPING ))) - DPF( 0, "Unable to restart restored buffer. (%s)", TranslateDSError(dsrval)); - dwWritePosition = 0xFFFFFFFF; - } - } -WIC_SkipDataProcessing: - // Spit the buffer back out - pwhBuffer->dwBytesRecorded = 0; - waveInAddBuffer( ghWaveIn, pwhBuffer, sizeof(WAVEHDR)); - } - LeaveCriticalSection( &gcsBufferData ); - - break; - } - } - - - diff --git a/sdk/samples/fdfilter/fdaudio.h b/sdk/samples/fdfilter/fdaudio.h deleted file mode 100644 index 7c4f5c1..0000000 --- a/sdk/samples/fdfilter/fdaudio.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __AUDIO_H__ -#define __AUDIO_H__ - - -BOOL InitPrimarySoundBuffer( void ); -BOOL InitSoundDevices( BOOL ); -BOOL ReOpenSoundDevices( BOOL ); -BOOL EnumDSDevices( void ); -BOOL EnumWaveDevices( void ); -BOOL FormatCodeToText( DWORD, LPSTR, int ); -BOOL FormatCodeToWFX( DWORD, PWAVEFORMATEX ); -void DisableFormatCode( PFORMATDATA, DWORD ); -BOOL WriteSilenceToOutput( DWORD, DWORD ); - -void FillInputDeviceCombo( HWND ); -void FillOutputDeviceCombo( HWND ); - -void ClearDSDeviceList( void ); -void ClearWaveDeviceList( void ); - -void ScanAvailableDSFormats( void ); -void ScanAvailableWaveFormats( void ); -void CloseWaveDevice( void ); -void CloseDSDevice( void ); - -BOOL InitBuffers( void ); -BOOL DestroyBuffers( void ); -BOOL StartBuffers( void ); -BOOL StopBuffers( void ); - -BOOL CALLBACK DSEnumProc( LPGUID, LPSTR, LPSTR, LPVOID ); -void CALLBACK WaveInCallback( HWAVEIN, UINT, DWORD, DWORD, DWORD ); - -#endif - - diff --git a/sdk/samples/fdfilter/fdfilter.cpp b/sdk/samples/fdfilter/fdfilter.cpp deleted file mode 100644 index aafabb8..0000000 --- a/sdk/samples/fdfilter/fdfilter.cpp +++ /dev/null @@ -1,671 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// File: FDFILTER.CPP -// Contents: General routines related to the Full-Duplex Filter Sample -// -// Description: This file includes the window procedures and initialization -// and destruction code. -// - -#define __DEFINE_GLOBAL_VARIABLES__ -#include "fdfilter.h" -#undef __DEFINE_GLOBAL_VARIABLES__ -#include "fdaudio.h" -#include "filter.h" - -#include - -static BOOL InitInstance( HINSTANCE, HINSTANCE, LPSTR, int ); - -static void DestroyInstance( void ); - - -/////////////////////////////////////////////////////////////////////////////// -// DestroyInstance() -// -// Does all of the cleanup for an instance of the application. -// -void DestroyInstance( void ) - { - if( NULL != ghWaveIn ) - { - CloseWaveDevice(); - ASSERT( NULL == ghWaveIn ); - // Deallocate the input buffers - DestroyBuffers(); - } - if( NULL != gpdsbPrimary ) - { - gpdsbPrimary->Release(); - gpdsbPrimary = NULL; - } - if( NULL != gpds ) - { - gpds->Release(); - gpds = NULL; - } - if( NULL != gpwfxOutput ) - { - delete gpwfxOutput; - gpwfxOutput = NULL; - } - if( NULL != ghCallbackFinished ) - { - CloseHandle( ghCallbackFinished ); - ghCallbackFinished = NULL; - } - if( NULL != gpFilter ) - { - delete gpFilter; - gpFilter = NULL; - } - // Get rid of the critical section object - DeleteCriticalSection( &gcsBufferData ); - } - - -////////////////////////////////////////////////////////////////////////////// -// InitInstance() -// -// This function is responsible for all initialization that must occur -// when a new instance of our application is started. -// -BOOL InitInstance( HINSTANCE hInstance, LPSTR lpszCommandLine, int cmdShow ) - { - // Used to protect buffer data from multi-threaded access - InitializeCriticalSection( &gcsBufferData ); - - if(( ghMainWnd = CreateDialog( ghInst, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)MainDlgProc )) == NULL ) - return FALSE; - - HMENU hSysMenu = GetSystemMenu( ghMainWnd, FALSE ); - EnableMenuItem( hSysMenu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( hSysMenu, SC_SIZE, MF_BYCOMMAND | MF_GRAYED ); - - if(( ghCallbackFinished = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL ) - goto II_ExitError; - - /* Continue doing other initialization stuff */ - if( !InitSoundDevices( TRUE )) - { - DPF( 0, "Call to InitSoundDevices() failed." ); - goto II_ExitError; - } - - ShowWindow( ghMainWnd, cmdShow ); - UpdateWindow( ghMainWnd ); - - return TRUE; // TRUE indicates success - -II_ExitError: - if( NULL != ghMainWnd ) - { - DestroyWindow( ghMainWnd ); - ghMainWnd = NULL; - } - - return FALSE; // FALSE indicates failure on initialization - } // InitInstance() - - -////////////////////////////////////////////////////////////////////////////// -// WinMain() -// -// Main entry point for this program's execution. Everything starts here. -// -int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, int cmdShow) - { - MSG msg; - - DbgInitialize( TRUE ); - - InitCommonControls(); - - // Save instance handle - ghInst = hInstance; - - if (!InitInstance(hInstance, lpszCmdLine, cmdShow)) - return 0; - - /* Polling messages from event queue */ - while (GetMessage((LPMSG)&msg, NULL, 0, 0)) - { - // Only Translate and Dispatch the message if it's not going - // to one of our many modeless dialog windows - if( !IsDialogMessage( ghMainWnd, &msg )) - { - TranslateMessage((LPMSG)&msg); - DispatchMessage((LPMSG)&msg); - } - } - - return (int)msg.wParam; - } // WinMain() - - -////////////////////////////////////////////////////////////////////////////// -// MainDlgProc() -// -// This the equivalent of a main window procedure, except our main window -// is really a dialog box. -// -BOOL CALLBACK MainDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - static HWND hInputDeviceText, hInputFormatText, hEnableCheck, hFilterCombo; - static HWND hOutputDeviceText, hPrimaryFormatText, hSecondaryFormatText; - - DWORD dwCode; - int ndx; - - switch( message ) - { - case WM_INITDIALOG: - hInputDeviceText = GetDlgItem( hDlg, IDC_MAIN_INPUTDEVICE_TEXT ); - hInputFormatText = GetDlgItem( hDlg, IDC_MAIN_INPUTFORMAT_TEXT ); - hOutputDeviceText = GetDlgItem( hDlg, IDC_MAIN_OUTPUTDEVICE_TEXT ); - hPrimaryFormatText = GetDlgItem( hDlg, IDC_MAIN_PRIMARYFORMAT_TEXT ); - hSecondaryFormatText = GetDlgItem( hDlg, IDC_MAIN_SECONDARYFORMAT_TEXT ); - hFilterCombo = GetDlgItem( hDlg, IDC_MAIN_FILTER_COMBO ); - hEnableCheck = GetDlgItem( hDlg, IDC_MAIN_ENABLEFILTER_CHECK ); - - ndx = ComboBox_AddString( hFilterCombo, "None (pass-through)" ); - ComboBox_SetItemData( hFilterCombo, ndx, 0 ); - - ComboBox_SetCurSel( hFilterCombo, ndx ); - - ndx = ComboBox_AddString( hFilterCombo, "Gargle" ); - ComboBox_SetItemData( hFilterCombo, ndx, 1 ); - - - EnterCriticalSection( &gcsBufferData ); - if( NULL != gpFilter ) - delete gpFilter; - gpFilter = new CFilter; - LeaveCriticalSection( &gcsBufferData ); - break; - - case WM_PAINT: - { - PAINTSTRUCT ps; - char szFormat[64]; - - BeginPaint( hDlg, &ps ); - if( NULL != gpwddIn ) - Static_SetText( hInputDeviceText, gpwddIn->szDeviceDesc ); - if( NULL != gpdsddOut ) - Static_SetText( hOutputDeviceText, gpdsddOut->pszDeviceDesc ); - - FormatCodeToText( gdwInputFormat, szFormat, sizeof(szFormat)); - Static_SetText( hInputFormatText, szFormat ); - - FormatCodeToText( gdwOutputFormat, szFormat, sizeof(szFormat)); - Static_SetText( hPrimaryFormatText, szFormat ); - - FormatCodeToText( gdwInputFormat, szFormat, sizeof(szFormat)); - Static_SetText( hSecondaryFormatText, szFormat ); - - EndPaint( hDlg, &ps ); - } - break; - - case WM_COMMAND: - switch( LOWORD(wParam)) - { - case IDC_MAIN_FILTER_COMBO: - if( HIWORD( wParam ) == CBN_SELCHANGE ) - { - if(( ndx = ComboBox_GetCurSel( hFilterCombo )) == -1 ) - break; - dwCode = ComboBox_GetItemData( hFilterCombo, ndx ); - if( 0 == dwCode ) - { - EnterCriticalSection( &gcsBufferData ); - if( NULL != gpFilter ) - delete gpFilter; - gpFilter = new CFilter; - LeaveCriticalSection( &gcsBufferData ); - } - if( 1 == dwCode ) - { - EnterCriticalSection( &gcsBufferData ); - if( NULL != gpFilter ) - delete gpFilter; - gpFilter = (CFilter *)new CGargle( gpwfxInput->nSamplesPerSec, - gpwfxInput->nChannels, - gpwfxInput->wBitsPerSample / 8 ); - LeaveCriticalSection( &gcsBufferData ); - } - } - break; - - case IDC_MAIN_ENABLEFILTER_CHECK: - // Don't do anything if we don't have a driver - if( NULL == ghWaveIn ) - break; - if( Button_GetCheck( hEnableCheck )) - { - // Put our hands over our eyes and hold our breaths, - // here comes the data! - if( !gfBuffersInitialized ) - InitBuffers(); - StartBuffers(); - } - else - { - StopBuffers(); - } - break; - - case ID_SETTINGS_DEVICES: - if( FAILED( ReOpenSoundDevices( FALSE ))) - break; - - Button_SetCheck( hEnableCheck, FALSE ); - - EnterCriticalSection( &gcsBufferData ); - if( gpFilter ) - gpFilter->SetFormat( gpwfxInput ); - LeaveCriticalSection( &gcsBufferData ); - InvalidateRect( hDlg, NULL, FALSE ); - UpdateWindow( hDlg ); - break; - - case ID_SETTINGS_FORMATS: - if( Button_GetCheck( hEnableCheck )) - { - Button_SetCheck( hEnableCheck, FALSE ); - StopBuffers(); - } - CloseWaveDevice(); - DestroyBuffers(); - - DialogBoxParam( ghInst, MAKEINTRESOURCE(IDD_FORMATS), - ghMainWnd, (DLGPROC)SelectFormatsDlgProc, 0L ); - InvalidateRect( hDlg, NULL, FALSE ); - UpdateWindow( hDlg ); - - EnterCriticalSection( &gcsBufferData ); - if( gpFilter ) - gpFilter->SetFormat( gpwfxInput ); - LeaveCriticalSection( &gcsBufferData ); - break; - - case ID_HELP_ABOUT: - DialogBox( ghInst, MAKEINTRESOURCE(IDD_ABOUT), - ghMainWnd, (DLGPROC)AboutDlgProc ); - break; - - case ID_FILE_EXIT: - case IDCANCEL: - // Be sure to stop the buffers when we're done - StopBuffers(); - DestroyWindow( hDlg ); - break; - - default: - return FALSE; - } - break; - - case WM_DESTROY: - DestroyInstance(); - PostQuitMessage(0); - break; - - default: - return FALSE; - } - - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// AboutDlgProc() -// -// Small dialog procedure for the About Box. -// -BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - if( message == WM_COMMAND && LOWORD(wParam) == IDOK ) - { - EndDialog( hDlg, FALSE ); - return TRUE; - } - else - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// CancelWarningDlgProc() -// -// Small dialog procedure for the Formats DLG's cancel warning box. -// -BOOL CALLBACK CancelWarningDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) - { - if( message == WM_COMMAND && LOWORD(wParam) == IDOK ) - { - EndDialog( hDlg, TRUE ); - return TRUE; - } - else if( message == WM_COMMAND && LOWORD(wParam) == IDCANCEL ) - { - EndDialog( hDlg, FALSE ); - return TRUE; - } - else - return FALSE; - } - - -////////////////////////////////////////////////////////////////////////////// -// FormatCodeToText() -// -// This function reads format codes and puts out a text string for them. -// It does not check for invalid codes. FALSE return means the buffer was -// invalid in some way, TRUE means success. -// -BOOL FormatCodeToText( DWORD dwFormat, LPSTR lpszBuf, int nBufSize ) - { - DWORD dwFreq; - - // The longest string we'll ever put in is 21 characters (including NULL) - if( NULL == lpszBuf || nBufSize < 21 ) - return FALSE; - - // Extract the sample rate - dwFreq = FC_GETFREQCODE(dwFormat); - dwFreq = ( dwFreq == 8 ? 8000 : (dwFreq / 11) * 11025); - - wsprintf( lpszBuf, "%u Hz, %u-bit %s", dwFreq, FC_GETBITS(dwFormat), - FC_GETCHANNELS(dwFormat) == 1 ? "Mono" : "Stereo" ); - - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// FormatCodeToWFX() -// -// This function reads format codes and fills most of the fields of a -// WAVEFORMATEX structure based on the values read. It does not fill the -// wFormatTag or cbSize members. -// -BOOL FormatCodeToWFX( DWORD dwFormat, PWAVEFORMATEX pwfx ) - { - DWORD dwFreq; - - if( NULL == pwfx ) - return FALSE; - - // Extract the sample rate - dwFreq = FC_GETFREQCODE(dwFormat); - pwfx->nSamplesPerSec = ( dwFreq == 8 ? 8000 : (dwFreq / 11) * 11025); - - pwfx->wBitsPerSample = (WORD)FC_GETBITS(dwFormat); - pwfx->nChannels = (WORD)FC_GETCHANNELS(dwFormat); - - // The nBlockAlign calculation below only works for whole-byte samples - ASSERT( pwfx->wBitsPerSample % 8 == 0 ); - - pwfx->nBlockAlign = pwfx->nChannels * (pwfx->wBitsPerSample / 8); - pwfx->nAvgBytesPerSec = pwfx->nBlockAlign * pwfx->nSamplesPerSec; - - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// DisableFormatCode() -// -// Disables the given format code -// -void DisableFormatCode( PFORMATDATA pfd, DWORD dwCode ) - { - int i; - - for( i = 0; i < NUM_FORMATCODES; i++ ) - { - if( pfd[i].dwCode == dwCode ) - { - pfd[i].fEnabled = FALSE; - break; - } - } - } - - -////////////////////////////////////////////////////////////////////////////// -// FillFormatListBox() -// -// This little helper function takes an array FORMATDATA structures and -// fills the given ListBox with text/data entries that represent all the -// formats. -// -void FillFormatListBox( PFORMATDATA pfd, HWND hList ) - { - char szFormat[64]; - - for( int i = 0; i < NUM_FORMATCODES; i++ ) - { - if( pfd[i].fEnabled ) - { - FormatCodeToText( pfd[i].dwCode, szFormat, sizeof(szFormat)); - ListBox_SetItemData( hList, ListBox_AddString( hList, szFormat), - pfd[i].dwCode ); - } - } - } - - -////////////////////////////////////////////////////////////////////////////// -// SelectDevicesDlgProc() -// -// Procedure for the dialog which queries the user for device selection. -// -BOOL CALLBACK SelectDevicesDlgProc( HWND hDlg, UINT message, - WPARAM wParam, LPARAM lParam ) - { - static HWND hWaveInCombo, hDirectSoundCombo; - - switch( message ) - { - case WM_INITDIALOG: - hWaveInCombo = GetDlgItem( hDlg, IDC_DEVICES_WAVEIN_COMBO ); - hDirectSoundCombo = GetDlgItem( hDlg, IDC_DEVICES_DIRECTSOUND_COMBO ); - - FillInputDeviceCombo( hWaveInCombo ); - FillOutputDeviceCombo( hDirectSoundCombo ); - break; - - case WM_COMMAND: - switch( LOWORD(wParam)) - { - case IDOK: - gpwddIn = (PWAVEDEVICEDESC)ComboBox_GetItemData( hWaveInCombo, - ComboBox_GetCurSel(hWaveInCombo)); - gpdsddOut = (PDSDEVICEDESC)ComboBox_GetItemData( hDirectSoundCombo, - ComboBox_GetCurSel(hDirectSoundCombo)); - EndDialog( hDlg, TRUE ); - break; - case IDCANCEL: - EndDialog( hDlg, FALSE ); - break; - default: - return FALSE; - } - break; - - default: - return FALSE; - } - return TRUE; - } - - -////////////////////////////////////////////////////////////////////////////// -// SelectFormatsDlgProc() -// -// Procedure the format selection dialog. -// -BOOL CALLBACK SelectFormatsDlgProc( HWND hDlg, UINT message, - WPARAM wParam, LPARAM lParam ) - { - static HWND hOutputList, hInputList, hOK; - static BOOL fAllowFormatCancel = FALSE; - HRESULT dsrval; - MMRESULT mmrval; - DWORD dwOutFormat, dwInFormat; - int ndx; - - switch( message ) - { - case WM_INITDIALOG: - hOutputList = GetDlgItem( hDlg, IDC_FORMATS_OUTPUT_LISTBOX ); - hInputList = GetDlgItem( hDlg, IDC_FORMATS_INPUT_LISTBOX ); - hOK = GetDlgItem( hDlg, IDOK ); - - if( NULL == gpds || NULL == gpdsbPrimary ) - { - EndDialog( hDlg, FALSE ); - return FALSE; - } - ScanAvailableDSFormats(); - FillFormatListBox( aOutputFormats, hOutputList ); - if( !ListBox_GetCount( hOutputList )) - { - MessageBox( ghMainWnd, "Warning: no output formats available", - gszAppName, MB_OK ); - EndDialog( hDlg, FALSE ); - return FALSE; - } - // lParam is a BOOL flag, which is TRUE if cancel is "allowed". If - // the app is running and the devices are selected, the user clearly - // must select a set of formats or else end the application. - fAllowFormatCancel = (BOOL)lParam; - - break; - - case WM_COMMAND: - switch( LOWORD(wParam)) - { - case IDC_FORMATS_INPUT_LISTBOX: - if( ListBox_GetCurSel( hOutputList ) != -1 && - ListBox_GetCurSel( hInputList ) != -1 ) - Button_Enable( hOK, TRUE ); - else - Button_Enable( hOK, FALSE ); - break; - - case IDC_FORMATS_OUTPUT_LISTBOX: - if( HIWORD(wParam) == LBN_SELCHANGE ) - { - dwOutFormat = ListBox_GetItemData( hOutputList, - ListBox_GetCurSel( hOutputList )); - FormatCodeToWFX( dwOutFormat, gpwfxOutput ); - DPF( 3, "Formats DLG: Setting gpwfxOutput" ); - DPWFX( 3, gpwfxOutput ); - if( FAILED( dsrval = gpdsbPrimary->SetFormat( gpwfxOutput ))) - { - DPF( 1, "Formats DLG: Failed to set DSound primary to %lu (%s)", - dwOutFormat, TranslateDSError(dsrval)); - FormatCodeToWFX( gdwOutputFormat, gpwfxOutput ); - DPF( 1, "Formats DLG: Attempting to reset gpwfxOutput" ); - DPWFX( 1, gpwfxOutput ); - if( FAILED( dsrval = gpdsbPrimary->SetFormat( gpwfxOutput ))) - { - DPF( 0, "Formats DLG: Failed to set OLD format (%lu) on primary (%s)", - gdwOutputFormat, gpwfxOutput ); - // TODO: Finish this handler - } - ndx = ListBox_FindItemData( hOutputList, -1, gdwOutputFormat ); - ListBox_SetCurSel( hOutputList, ndx ); - // TODO: Find the item corresponding to the old format - // and select it back? (without re-entering this code) - } - else - { - gdwOutputFormat = dwOutFormat; - - ScanAvailableWaveFormats(); - ListBox_ResetContent( hInputList ); - FillFormatListBox( aInputFormats, hInputList ); - } - Button_Enable( hOK, FALSE ); - } - break; - - case IDOK: - ndx = ListBox_GetCurSel( hOutputList ); - // OK button should be disabled unless there's a selection - // in both listboxes - ASSERT( ndx != -1 ); - - dwOutFormat = ListBox_GetItemData( hOutputList, ndx ); - FormatCodeToWFX( dwOutFormat, gpwfxOutput ); - // We shouldn't get to this dialog if there's no output - ASSERT( NULL != gpds && NULL != gpdsbPrimary ); - if(( dsrval = gpdsbPrimary->SetFormat( gpwfxOutput ))) - { - DPF( 0, "Can't set format %lu (%s)", - dwOutFormat, TranslateDSError(dsrval)); - goto Abort_OK; - } - else - { - gdwOutputFormat = dwOutFormat; - } - - ndx = ListBox_GetCurSel( hInputList ); - // OK button should be disabled unless there's a selection - // in both listboxes - ASSERT( ndx != -1 ); - - dwInFormat = ListBox_GetItemData( hInputList, ndx ); - FormatCodeToWFX( dwInFormat, gpwfxInput ); - - if(( mmrval = waveInOpen( &ghWaveIn, gpwddIn->uID, gpwfxInput, - (DWORD)WaveInCallback, - 0, CALLBACK_FUNCTION )) != MMSYSERR_NOERROR ) - { - DPF( 0, "Unable to open selected input device! format = %lu, mmrval = %lu", dwInFormat, mmrval ); - goto Abort_OK; - } - else - { - gdwInputFormat = dwInFormat; - } - - EndDialog( hDlg, TRUE ); - Abort_OK: - break; - case IDCANCEL: - if( fAllowFormatCancel ) - EndDialog( hDlg, FALSE ); - else - { - if( !DialogBox( ghInst, - MAKEINTRESOURCE(IDD_CANCELWARNING), - ghMainWnd, (DLGPROC)CancelWarningDlgProc )) - { - EndDialog( hDlg, FALSE ); - PostMessage( ghMainWnd, WM_DESTROY, 0, 0 ); - return FALSE; - } - } - break; - - default: - return FALSE; - } - break; - - default: - return FALSE; - } - return TRUE; - } - - diff --git a/sdk/samples/fdfilter/fdfilter.def b/sdk/samples/fdfilter/fdfilter.def deleted file mode 100644 index ce14dd7..0000000 --- a/sdk/samples/fdfilter/fdfilter.def +++ /dev/null @@ -1,14 +0,0 @@ -;===========================================================================; -; -; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -; KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -; IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -; PURPOSE. -; -; Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved. -; -;===========================================================================; - -NAME FDFILTER -DESCRIPTION 'Microsoft Full-Duplex Filter Sample' - diff --git a/sdk/samples/fdfilter/fdfilter.h b/sdk/samples/fdfilter/fdfilter.h deleted file mode 100644 index f51a1c9..0000000 --- a/sdk/samples/fdfilter/fdfilter.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef __FDFILTER_H__ -#define __FDFILTER_H__ - - -#include -#include -#include -#include -#include - -#include "debug.h" -#include "resource.h" - -class CFilter; -class CGargle; - -#define REG_SETTINGS_KEY TEXT("\\Software\\Microsoft\\DFilter") -#define REG_SETTING_INPUTDEVICE TEXT("InputDevice"); -#define REG_SETTING_OUTPUTDEVICE TEXT("OutputDevice"); -#define REG_SETTING_INFORMAT TEXT("InputFormat"); -#define REG_SETTING_OUTFORMAT TEXT("OutputFormat"); - -typedef struct tag_dsdevdesc -{ - GUID guDevice; // Device GUID - PSTR pszDeviceDesc; // Description string - struct tag_dsdevdesc *pNext; -} DSDEVICEDESC, *PDSDEVICEDESC; - - -typedef struct tag_wavedevdesc -{ - UINT uID; // Device ID - char szDeviceDesc[MAXPNAMELEN]; // Description string - DWORD dwFormats; - WORD nChannels; - struct tag_wavedevdesc *pNext; -} WAVEDEVICEDESC, *PWAVEDEVICEDESC; - -typedef struct tag_fd -{ - DWORD dwCode; - BOOL fEnabled; -} FORMATDATA, *PFORMATDATA; - -#define NUM_FORMATCODES (16) - -#define FC_GETFREQCODE(fc) ((fc) / 1000) -#define FC_GETBITS(fc) ((fc) % 100) -#define FC_GETCHANNELS(fc) (((fc) % 1000) / 100) - -#define NUM_BUFFERS (16) - - -#ifdef __DEFINE_GLOBAL_VARIABLES__ - -FORMATDATA aInputFormats[NUM_FORMATCODES] = {{ 8108, TRUE }, { 8208, TRUE }, - { 8116, TRUE }, { 8216, TRUE }, - { 11108, TRUE }, { 11208, TRUE }, - { 11116, TRUE }, { 11216, TRUE }, - { 22108, TRUE }, { 22208, TRUE }, - { 22116, TRUE }, { 22216, TRUE }, - { 44108, TRUE }, { 44208, TRUE }, - { 44116, TRUE }, { 44216, TRUE }}; - -FORMATDATA aOutputFormats[NUM_FORMATCODES] = {{ 8108, TRUE }, { 8208, TRUE }, - { 8116, TRUE }, { 8216, TRUE }, - { 11108, TRUE }, { 11208, TRUE }, - { 11116, TRUE }, { 11216, TRUE }, - { 22108, TRUE }, { 22208, TRUE }, - { 22116, TRUE }, { 22216, TRUE }, - { 44108, TRUE }, { 44208, TRUE }, - { 44116, TRUE }, { 44216, TRUE }}; - -LPDIRECTSOUND gpds; -LPDIRECTSOUNDBUFFER gpdsbPrimary; -LPWAVEFORMATEX gpwfxInput, gpwfxOutput; - - -char gszAppName[] = "FDFilter"; -char gszAppDescription[] = "Full-Duplex Filter Sample"; -HINSTANCE ghInst; -HWND ghMainWnd; -HWAVEIN ghWaveIn; -HANDLE ghCallbackFinished; - -DWORD gdwOutputFormat, gdwInputFormat, gcbBufferSize; -PWAVEDEVICEDESC gpwddInputDevices, gpwddIn; -PDSDEVICEDESC gpdsddOutputDevices, gpdsddOut; - -CRITICAL_SECTION gcsBufferData; -int gnBuffersOut; -PWAVEHDR gawhHeaders; -PBYTE gpbBufferData; -LONG gfBuffersInitialized; -LPDIRECTSOUNDBUFFER gpdsbOutput; -DSBUFFERDESC gdsbdOutput; -CFilter * gpFilter; - -#else - -extern FORMATDATA aInputFormats[], aOutputFormats[]; -extern LPDIRECTSOUND gpds; -extern LPDIRECTSOUNDBUFFER gpdsbPrimary; -extern LPWAVEFORMATEX gpwfxInput, gpwfxOutput; - - -extern char gszAppName[]; -extern char gszAppDescription[]; -extern HINSTANCE ghInst; -extern HWND ghMainWnd; -extern HWAVEIN ghWaveIn; -extern HANDLE ghCallbackFinished; - -extern DWORD gdwOutputFormat, gdwInputFormat, gcbBufferSize; -extern PWAVEDEVICEDESC gpwddInputDevices, gpwddIn; -extern PDSDEVICEDESC gpdsddOutputDevices, gpdsddOut; - -extern CRITICAL_SECTION gcsBufferData; -extern int gnBuffersOut; -extern PWAVEHDR gawhHeaders; -extern PBYTE gpbBufferData; -extern LONG gfBuffersInitialized; -extern LPDIRECTSOUNDBUFFER gpdsbOutput; -extern DSBUFFERDESC gdsbdOutput; -extern CFilter * gpFilter; - -#endif - - - -int PASCAL WinMain( HINSTANCE, HINSTANCE, LPSTR, int ); -BOOL CALLBACK MainDlgProc( HWND, UINT, WPARAM, LPARAM ); -BOOL CALLBACK AboutDlgProc( HWND, UINT, WPARAM, LPARAM ); -BOOL CALLBACK CancelWarningDlgProc( HWND, UINT, WPARAM, LPARAM ); -BOOL CALLBACK SelectDevicesDlgProc( HWND, UINT, WPARAM, LPARAM ); -BOOL CALLBACK SelectFormatsDlgProc( HWND, UINT, WPARAM, LPARAM ); - - -void FillFormatListBox( PFORMATDATA, HWND ); - -#endif // __FDFILTER_H__ - - diff --git a/sdk/samples/fdfilter/fdfilter.rc b/sdk/samples/fdfilter/fdfilter.rc deleted file mode 100644 index 1be1ef9..0000000 --- a/sdk/samples/fdfilter/fdfilter.rc +++ /dev/null @@ -1,241 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "reshead.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAIN DIALOG DISCARDABLE 0, 0, 200, 102 -STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Full-Duplex Filter Sample" -MENU IDM_MAIN -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Device:",IDC_STATIC,10,14,26,8 - LTEXT "Format:",IDC_STATIC,10,24,26,8 - LTEXT "",IDC_MAIN_INPUTDEVICE_TEXT,38,14,152,8 - LTEXT "",IDC_MAIN_INPUTFORMAT_TEXT,38,24,152,8 - COMBOBOX IDC_MAIN_FILTER_COMBO,44,83,112,52,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Filter Effect:",IDC_STATIC,4,85,40,8 - GROUPBOX "Input",IDC_STATIC,4,5,190,30 - LTEXT "Device:",IDC_STATIC,10,47,26,8 - LTEXT "Primary Format:",IDC_STATIC,10,57,50,8 - LTEXT "",IDC_MAIN_OUTPUTDEVICE_TEXT,38,47,152,8 - LTEXT "",IDC_MAIN_PRIMARYFORMAT_TEXT,62,57,128,8 - GROUPBOX "Output",IDC_STATIC,4,38,190,40 - CONTROL "&Enable",IDC_MAIN_ENABLEFILTER_CHECK,"Button", - BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,158,83,36,13 - LTEXT "Secondary Format:",IDC_STATIC,10,67,60,8 - LTEXT "",IDC_MAIN_SECONDARYFORMAT_TEXT,72,67,118,8 -END - -IDD_ABOUT DIALOG DISCARDABLE 0, 0, 196, 95 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About DFilter" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,75,74,50,14 - LTEXT "FDFILTER Sample Application",IDC_STATIC,50,8,107,8 - LTEXT "Illustrates full-duplex audio using waveIn",IDC_STATIC, - 50,24,137,8 - LTEXT "audio input and DirectSound output",IDC_STATIC,50,32, - 137,8 - LTEXT "Copyright (c) 1996, Microsoft Corporation.",IDC_STATIC, - 50,52,135,8 - ICON IDI_MAIN,IDC_STATIC,8,8,18,20 -END - -IDD_DEVICES DIALOG DISCARDABLE 0, 0, 178, 95 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select Devices" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_DEVICES_WAVEIN_COMBO,6,30,166,46,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_DEVICES_DIRECTSOUND_COMBO,6,56,166,46, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "OK",IDOK,35,74,50,14 - PUSHBUTTON "Cancel",IDCANCEL,93,74,50,14 - LTEXT "Please select your preferred wave devices.",IDC_STATIC, - 6,6,140,8 - LTEXT "waveIn Devices:",IDC_STATIC,6,20,68,8 - LTEXT "DirectSound Devices:",IDC_STATIC,6,46,99,8 -END - -IDD_FORMATS DIALOG DISCARDABLE 0, 0, 258, 101 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select Formats" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,75,80,50,14,WS_DISABLED - PUSHBUTTON "Cancel",IDCANCEL,133,80,50,14 - LISTBOX IDC_FORMATS_OUTPUT_LISTBOX,6,15,90,59, - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LISTBOX IDC_FORMATS_INPUT_LISTBOX,161,15,90,59, - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - LTEXT "Output Format:",IDC_STATIC,6,6,50,8 - LTEXT "Input Format:",IDC_STATIC,161,6,50,8 - CTEXT "Choose an output format, and then select from the available input formats. Click OK to accept the combination.", - IDC_STATIC,100,15,56,59 -END - -IDD_CANCELWARNING DIALOG DISCARDABLE 0, 0, 186, 89 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Unable to Cancel" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Continue",IDOK,35,68,50,14 - PUSHBUTTON "Exit",IDCANCEL,101,68,50,14 - CTEXT "In order to continue opening new devices, you must select new formats. Since the old devices have been closed, it is not possible to cancel this operation successfully. To end this application, click the Exit button.", - IDC_STATIC,6,6,173,42 - CTEXT "To continue and select new formats, click Continue.", - IDC_STATIC,6,48,173,11 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 193 - TOPMARGIN, 7 - BOTTOMMARGIN, 95 - END - - IDD_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 189 - TOPMARGIN, 7 - BOTTOMMARGIN, 88 - END - - IDD_DEVICES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 171 - TOPMARGIN, 7 - BOTTOMMARGIN, 88 - END - - IDD_FORMATS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 251 - TOPMARGIN, 7 - BOTTOMMARGIN, 94 - END - - IDD_CANCELWARNING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 82 - END -END -#endif // APSTUDIO_INVOKED - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""reshead.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDM_MAIN MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", ID_FILE_EXIT - END - POPUP "&Settings" - BEGIN - MENUITEM "&Devices...", ID_SETTINGS_DEVICES - MENUITEM "&Formats...", ID_SETTINGS_FORMATS - END - POPUP "&Help" - BEGIN - MENUITEM "&About...", ID_HELP_ABOUT - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_MAIN ICON DISCARDABLE "icon1.ico" -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/fdfilter/filter.cpp b/sdk/samples/fdfilter/filter.cpp deleted file mode 100644 index 11b02a3..0000000 --- a/sdk/samples/fdfilter/filter.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "fdfilter.h" -#include "filter.h" - -HRESULT CFilter::Transform( PBYTE pbIn, int cbLength, PBYTE pbOut ) - { - if( NULL == pbIn || NULL == pbOut ) - return ResultFromScode( E_POINTER ); - if( 0 == cbLength ) - return NOERROR; - - CopyMemory( pbOut, pbIn, cbLength ); - return NOERROR; - } - - -// Merely stubbed out for this simple filter -- we have no need for the -// extra information -HRESULT CFilter::SetFormat( PWAVEFORMATEX pwfx ) - { - if( NULL == pwfx ) - return ResultFromScode( E_POINTER ); - - return NOERROR; - } - - diff --git a/sdk/samples/fdfilter/filter.h b/sdk/samples/fdfilter/filter.h deleted file mode 100644 index 28f3eb9..0000000 --- a/sdk/samples/fdfilter/filter.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __FILTER_H__ -#define __FILTER_H__ - - - -class CFilter - { - public: - virtual HRESULT Transform( PBYTE, int, PBYTE ); - virtual HRESULT SetFormat( PWAVEFORMATEX ); - }; - - -class CGargle : public CFilter - { - public: - CGargle( int nFreq = 0, int nChannels = 0, int nBytesPerSample = 0 ); - virtual HRESULT Transform( PBYTE, int, PBYTE ); - virtual HRESULT SetFormat( PWAVEFORMATEX ); - - protected: - enum Shape { SHAPE_TRIANGLE, SHAPE_SQUARE }; - - int m_nPhase, m_nGargleRate; - int m_nBytesPerSample, m_nSamplesPerSec, m_nChannels; - - Shape m_Shape; - - void MessItAbout( PBYTE, DWORD, PBYTE ); - }; - - -class C3DPosition : public CFilter - { - public: - virtual HRESULT Transform( PWAVEHDR ); - - protected: -// GetPosition( D3DVECTOR * ); - }; - - -#endif //__FILTER_H__ - - diff --git a/sdk/samples/fdfilter/gargle.cpp b/sdk/samples/fdfilter/gargle.cpp deleted file mode 100644 index a3f0fb1..0000000 --- a/sdk/samples/fdfilter/gargle.cpp +++ /dev/null @@ -1,141 +0,0 @@ -#include "fdfilter.h" -#include "filter.h" - -CGargle::CGargle( int nFreq, int nChannels, int nBytesPerSample ) - { - m_nPhase = 0; - m_Shape = SHAPE_TRIANGLE; - m_nGargleRate = 10; - m_nBytesPerSample = nBytesPerSample; - m_nSamplesPerSec = nFreq; - m_nChannels = nChannels; - } - - -CGargle::~CGargle() - { - } - - -// Copy the required information about the new format for the buffer -HRESULT CGargle::SetFormat( PWAVEFORMATEX pwfx ) - { - if( NULL == pwfx ) - return ResultFromScode( E_POINTER ); - - m_nSamplesPerSec = pwfx->nSamplesPerSec; - m_nChannels = pwfx->nChannels; - m_nBytesPerSample = pwfx->wBitsPerSample / 8; - - return NOERROR; - } - - -// -// MessItAbout -// -// Mess the sound about by modulating it with a waveform. -// We know the frequency of the modulation (from the slider setting -// which we were told through our internal interface, IGargle, and -// which we stored in m_GargleRate). At the end of the call we -// record what part of the waveform we finished at in m_Phase and -// we resume at that point next time. -// Uses and updates m_Phase -// Uses m_SamplesPerSec, m_Channels, m_GargleRate, m_Shape -// -void CGargle::MessItAbout( PBYTE pbIn, DWORD cb, PBYTE pbOut ) -{ - // We know how many samples per sec and how - // many channels so we can calculate the modulation period in samples. - // - - int Period = (m_nSamplesPerSec * m_nChannels) / m_nGargleRate; - - while( cb > 0 ) { - --cb; - - // If m_Shape is 0 (triangle) then we multiply by a triangular waveform - // that runs 0..Period/2..0..Period/2..0... else by a square one that - // is either 0 or Period/2 (same maximum as the triangle) or zero. - // - { - // m_Phase is the number of samples from the start of the period. - // We keep this running from one call to the next, - // but if the period changes so as to make this more - // than Period then we reset to 0 with a bang. This may cause - // an audible click or pop (but, hey! it's only a sample!) - // - ++m_nPhase; - if( m_nPhase > Period ) - m_nPhase = 0; - - int M = m_nPhase; // m is what we modulate with - - if( m_Shape == SHAPE_TRIANGLE ) { // Triangle - if( M > Period / 2 ) - M = Period - M; // handle downslope - } else if( m_Shape == SHAPE_TRIANGLE ) { // Square wave - if( M <= Period / 2 ) - M = Period / 2; - else M = 0; - } - - if( m_nBytesPerSample == 1 ) { - // 8 bit sound uses 0..255 representing -128..127 - // Any overflow, even by 1, would sound very bad. - // so we clip paranoically after modulating. - // I think it should never clip by more than 1 - // - int i = *pbIn - 128; // sound sample, zero based - i = (i * M * 2) / Period; // modulate - if(i > 127) // clip - i = 127; - if(i < -128) - i = -128; - - *pbOut = (unsigned char)(i + 128); // reset zero offset to 128 - - } else if( m_nBytesPerSample == 2 ) { - // 16 bit sound uses 16 bits properly (0 means 0) - // We still clip paranoically - // - short int *psi = (short int *)pbOut; - int i = *((short int *)pbIn); // in a register, we might hope - i = (i*M*2)/Period; // modulate - if(i > 32767) - i = 32767; // clip - if(i < -32768) - i = -32768; - *psi = (short)i; - ++pbIn; // nudge it on another 8 bits here to get a 16 bit step - ++pbOut; - --cb; // and nudge the count too. - } else { -// DbgBreak("Too many bytes per sample"); - // just leave it alone! - } - } - ++pbIn; // move on 8 bits to next sound sample - ++pbOut; - } -} // MessItAbout - - -// -// Transform -// -// -HRESULT CGargle::Transform( PBYTE pbIn, int cbWrite, PBYTE pbOut ) -{ - // Actually transform the data - // - if( m_nSamplesPerSec && m_nChannels && m_nBytesPerSample ) - MessItAbout( pbIn, cbWrite, pbOut ); - - return NOERROR; - -} // Transform - - - - diff --git a/sdk/samples/fdfilter/icon1.ico b/sdk/samples/fdfilter/icon1.ico deleted file mode 100644 index 76add32..0000000 Binary files a/sdk/samples/fdfilter/icon1.ico and /dev/null differ diff --git a/sdk/samples/fdfilter/makefile b/sdk/samples/fdfilter/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/fdfilter/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/fdfilter/makefile.wat b/sdk/samples/fdfilter/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/fdfilter/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/fdfilter/msvc.mk b/sdk/samples/fdfilter/msvc.mk deleted file mode 100644 index 1d97e5f..0000000 --- a/sdk/samples/fdfilter/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = FDFilter -EXT = EXE - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib dsound.lib shell32.lib \ - comdlg32.lib gdi32.lib winmm.lib msacm32.lib libc.lib uuid.lib ole32.lib comctl32.lib - -OBJS = debug.obj fdaudio.obj fdfilter.obj gargle.obj filter.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/fdfilter/reshead.h b/sdk/samples/fdfilter/reshead.h deleted file mode 100644 index 6820a22..0000000 --- a/sdk/samples/fdfilter/reshead.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifdef APSTUDIO_INVOKED // Built from inside VC -#include "afxres.h" - -#else // Built from the command-line (some command-lines don't have MFC headers) - -#undef RC_INVOKED -#define RC_INVOKED - -#undef IDC_STATIC -#define IDC_STATIC -1 - -#include "windows.h" -#include "commctrl.h" - -#endif diff --git a/sdk/samples/fdfilter/resource.h b/sdk/samples/fdfilter/resource.h deleted file mode 100644 index 89d70b4..0000000 --- a/sdk/samples/fdfilter/resource.h +++ /dev/null @@ -1,44 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by fdfilter.rc -// -#define IDD_MAIN 101 -#define IDM_MAIN 102 -#define IDD_ABOUT 103 -#define IDI_MAIN 104 -#define IDD_DEVICES 106 -#define IDD_FORMATS 107 -#define IDD_CANCELWARNING 108 -#define IDC_MAIN_INPUT_LISTBOX 1000 -#define IDC_MAIN_OUTPUT_LISTBOX 1001 -#define IDC_MAIN_WAVEOUT_RADIO 1002 -#define IDC_MAIN_DIRECTSOUND_RADIO 1003 -#define IDC_MAIN_3DPOSITION_RADIO 1004 -#define IDC_MAIN_GARGLE_RADIO 1005 -#define IDC_MAIN_ECHO_RADIO 1006 -#define IDC_DEVICES_WAVEIN_COMBO 1009 -#define IDC_DEVICES_DIRECTSOUND_COMBO 1010 -#define IDC_FORMATS_OUTPUT_LISTBOX 1010 -#define IDC_FORMATS_INPUT_LISTBOX 1011 -#define IDC_MAIN_INPUTDEVICE_TEXT 1012 -#define IDC_MAIN_INPUTFORMAT_TEXT 1013 -#define IDC_MAIN_OUTPUTDEVICE_TEXT 1014 -#define IDC_MAIN_PRIMARYFORMAT_TEXT 1015 -#define IDC_MAIN_FILTER_COMBO 1016 -#define IDC_MAIN_ENABLEFILTER_CHECK 1017 -#define IDC_MAIN_SECONDARYFORMAT_TEXT 1018 -#define ID_FILE_EXIT 40001 -#define ID_HELP_ABOUT 40002 -#define ID_SETTINGS_DEVICES 40003 -#define ID_SETTINGS_FORMATS 40004 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 109 -#define _APS_NEXT_COMMAND_VALUE 40005 -#define _APS_NEXT_CONTROL_VALUE 1018 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/fdfilter/watcom.mk b/sdk/samples/fdfilter/watcom.mk deleted file mode 100644 index d4480bc..0000000 --- a/sdk/samples/fdfilter/watcom.mk +++ /dev/null @@ -1,43 +0,0 @@ -NAME = FDFilter -EXT = EXE - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib ..\..\..\lib\dsound.lib uuid.lib ole32.lib comctl32.lib - -OBJS = debug.obj fdfilter.obj fdaudio.obj gargle.obj filter.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) tmp.lib $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) library tmp.lib @$(NAME).lnk - $(RC) $(RES) - -# -# need this because Watcom's libs don't have the ACM entries and the IMPORT -# statement on the linker doesn't work the way we want -# -tmp.lib : tmp.lbc - @wlib -q tmp.lib @tmp.lbc > NUL - -tmp.lbc : ..\$(MAKENAME) - @%write tmp.lbc ++_acmMetrics.'MSACM32.DLL'._acmMetrics.acmMetrics diff --git a/sdk/samples/flip2d/dumb3d.cpp b/sdk/samples/flip2d/dumb3d.cpp deleted file mode 100644 index b0a35f6..0000000 --- a/sdk/samples/flip2d/dumb3d.cpp +++ /dev/null @@ -1,301 +0,0 @@ -/************************************************************************** - dumb3d.cpp - A simple linear algebra library for 3D. - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#include -#include -#include"dumb3d.h" - -/*-------------------------------------------------------------------------- - -matrix multiplication. - -*/ - -matrix_4x4 operator*( matrix_4x4 const &Multiplicand, - matrix_4x4 const &Multiplier ) -{ - matrix_4x4 ReturnMatrix; - - for(int i = 0;i < 4;i++) - { - for(int j = 0;j < 4;j++) - { - real Value = 0; - - for(int k = 0;k < 4;k++) - { - Value += Multiplicand.GetElement(i,k) * - Multiplier.GetElement(k,j); - } - - ReturnMatrix.SetElement(i,j,Value); - } - } - - return ReturnMatrix; -} - -vector_4 operator*( matrix_4x4 const &Multiplicand, - vector_4 const &Multiplier ) -{ - vector_4 ReturnPoint; - - for(int i = 0;i < 4;i++) - { - real Value = 0; - - for(int k = 0;k < 4;k++) - { - Value += Multiplicand.GetElement(i,k) * - Multiplier.GetElement(k); - } - - ReturnPoint.SetElement(i,Value); - } - - return ReturnPoint; -} - -point_4 operator*( matrix_4x4 const &Multiplicand, - point_4 const &Multiplier ) -{ - point_4 ReturnPoint; - - for(int i = 0;i < 4;i++) - { - real Value = 0; - - for(int k = 0;k < 4;k++) - { - Value += Multiplicand.GetElement(i,k) * - Multiplier.GetElement(k); - } - - ReturnPoint.SetElement(i,Value); - } - - return ReturnPoint; -} - - -/*-------------------------------------------------------------------------- - -constructor. - -*/ - -matrix_4x4::matrix_4x4( void ) -{ - for(int Counter = 0;Counter < 16;Counter++) - { - aElements[0][Counter] = 0; - } - - aElements[0][0] = aElements[1][1] = aElements[2][2] = aElements[3][3] = 1; -} - - -/*-------------------------------------------------------------------------- - -Rotations. - -*/ - -matrix_4x4 &matrix_4x4::ConcatenateXRotation( real Degrees ) -{ - real Temp01, Temp11, Temp21, Temp31; - real Temp02, Temp12, Temp22, Temp32; - - real Radians = (Degrees/360) * M_PI * 2; - - real Sin = sin(Radians), Cos = cos(Radians); - - Temp01 = aElements[0][1] * Cos + aElements[0][2] * Sin; - Temp11 = aElements[1][1] * Cos + aElements[1][2] * Sin; - Temp21 = aElements[2][1] * Cos + aElements[2][2] * Sin; - Temp31 = aElements[3][1] * Cos + aElements[3][2] * Sin; - - Temp02 = aElements[0][1] * -Sin + aElements[0][2] * Cos; - Temp12 = aElements[1][1] * -Sin + aElements[1][2] * Cos; - Temp22 = aElements[2][1] * -Sin + aElements[2][2] * Cos; - Temp32 = aElements[3][1] * -Sin + aElements[3][2] * Cos; - - aElements[0][1] = Temp01; - aElements[1][1] = Temp11; - aElements[2][1] = Temp21; - aElements[3][1] = Temp31; - aElements[0][2] = Temp02; - aElements[1][2] = Temp12; - aElements[2][2] = Temp22; - aElements[3][2] = Temp32; - - return *this; -} - -matrix_4x4 &matrix_4x4::ConcatenateYRotation( real Degrees ) -{ - real Temp00, Temp10, Temp20, Temp30; - real Temp02, Temp12, Temp22, Temp32; - - real Radians = (Degrees/360) * M_PI * 2; - - real Sin = sin(Radians), Cos = cos(Radians); - - Temp00 = aElements[0][0] * Cos + aElements[0][2] * -Sin; - Temp10 = aElements[1][0] * Cos + aElements[1][2] * -Sin; - Temp20 = aElements[2][0] * Cos + aElements[2][2] * -Sin; - Temp30 = aElements[3][0] * Cos + aElements[3][2] * -Sin; - - Temp02 = aElements[0][0] * Sin + aElements[0][2] * Cos; - Temp12 = aElements[1][0] * Sin + aElements[1][2] * Cos; - Temp22 = aElements[2][0] * Sin + aElements[2][2] * Cos; - Temp32 = aElements[3][0] * Sin + aElements[3][2] * Cos; - - aElements[0][0] = Temp00; - aElements[1][0] = Temp10; - aElements[2][0] = Temp20; - aElements[3][0] = Temp30; - aElements[0][2] = Temp02; - aElements[1][2] = Temp12; - aElements[2][2] = Temp22; - aElements[3][2] = Temp32; - - return *this; -} - -matrix_4x4 &matrix_4x4::ConcatenateZRotation( real Degrees ) -{ - real Temp00, Temp10, Temp20, Temp30; - real Temp01, Temp11, Temp21, Temp31; - - real Radians = (Degrees/360) * M_PI * 2; - - real Sin = sin(Radians), Cos = cos(Radians); - - Temp00 = aElements[0][0] * Cos + aElements[0][1] * Sin; - Temp10 = aElements[1][0] * Cos + aElements[1][1] * Sin; - Temp20 = aElements[2][0] * Cos + aElements[2][1] * Sin; - Temp30 = aElements[3][0] * Cos + aElements[3][1] * Sin; - - Temp01 = aElements[0][0] * -Sin + aElements[0][1] * Cos; - Temp11 = aElements[1][0] * -Sin + aElements[1][1] * Cos; - Temp21 = aElements[2][0] * -Sin + aElements[2][1] * Cos; - Temp31 = aElements[3][0] * -Sin + aElements[3][1] * Cos; - - aElements[0][0] = Temp00; - aElements[1][0] = Temp10; - aElements[2][0] = Temp20; - aElements[3][0] = Temp30; - aElements[0][1] = Temp01; - aElements[1][1] = Temp11; - aElements[2][1] = Temp21; - aElements[3][1] = Temp31; - - return *this; -} - -/*-------------------------------------------------------------------------- - -Translations. - -*/ - -matrix_4x4 &matrix_4x4::ConcatenateXTranslation( real Distance ) -{ - aElements[0][3] = aElements[0][0] * Distance + aElements[0][3]; - aElements[1][3] = aElements[1][0] * Distance + aElements[1][3]; - aElements[2][3] = aElements[2][0] * Distance + aElements[2][3]; - aElements[3][3] = aElements[3][0] * Distance + aElements[3][3]; - - return *this; -} - -matrix_4x4 &matrix_4x4::ConcatenateYTranslation( real Distance ) -{ - aElements[0][3] = aElements[0][1] * Distance + aElements[0][3]; - aElements[1][3] = aElements[1][1] * Distance + aElements[1][3]; - aElements[2][3] = aElements[2][1] * Distance + aElements[2][3]; - aElements[3][3] = aElements[3][1] * Distance + aElements[3][3]; - - return *this; -} - -matrix_4x4 &matrix_4x4::ConcatenateZTranslation( real Distance ) -{ - aElements[0][3] = aElements[0][2] * Distance + aElements[0][3]; - aElements[1][3] = aElements[1][2] * Distance + aElements[1][3]; - aElements[2][3] = aElements[2][2] * Distance + aElements[2][3]; - aElements[3][3] = aElements[3][2] * Distance + aElements[3][3]; - - return *this; -} - -/*-------------------------------------------------------------------------- - -vector normalize. - -*/ - -vector_4 &vector_4::Normalize( void ) -{ - real Length = sqrt(GetX()*GetX() + GetY()*GetY() + GetZ()*GetZ()); - - SetX(GetX() / Length); - SetY(GetY() / Length); - SetZ(GetZ() / Length); - - return *this; -} - -/*-------------------------------------------------------------------------- - -view transform ctor. - -*/ - -view_transform::view_transform( point_4 const &Viewpoint, - vector_4 const &ViewDirection, vector_4 const &Up ) -{ - // translate the viewpoint to the origin - - this->ConcatenateXTranslation(-Viewpoint.GetX()); - this->ConcatenateYTranslation(-Viewpoint.GetY()); - this->ConcatenateZTranslation(-Viewpoint.GetZ()); - - // get view vectors set up - - vector_4 Right = -CrossProduct(ViewDirection,Up); - vector_4 ReallyUp = CrossProduct(Right,ViewDirection); - - matrix_4x4 LookDownZ; - - for(int Counter = 0;Counter < 3;Counter++) - { - LookDownZ.SetElement(0,Counter,Right.GetElement(Counter)); - } - - for(Counter = 0;Counter < 3;Counter++) - { - LookDownZ.SetElement(1,Counter,ReallyUp.GetElement(Counter)); - } - - for(Counter = 0;Counter < 3;Counter++) - { - LookDownZ.SetElement(2,Counter,ViewDirection.GetElement(Counter)); - } - - this->matrix_4x4::operator=(LookDownZ * *this); -} diff --git a/sdk/samples/flip2d/dumb3d.h b/sdk/samples/flip2d/dumb3d.h deleted file mode 100644 index e85515a..0000000 --- a/sdk/samples/flip2d/dumb3d.h +++ /dev/null @@ -1,437 +0,0 @@ -/************************************************************************** - dumb3d.h - A simple linear algebra library for 3D. - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#if !defined(DUMB3D_HPP) -#define DUMB3D_HPP - -/*---------------------------------------------------------------------------- - -This header contains the declarations for the dumb3d functions. - -*/ - - -// real type - -typedef double real; - - -#define M_PI 3.14159265358979323846 - - -// forward declarations - -class point_4; -class vector_4; -class matrix_4x4; - -/*---------------------------------------------------------------------------- - -globally useful functions. - -*/ - -inline vector_4 operator-( point_4 const &Operand1, point_4 const &Operand2 ); - -inline vector_4 operator+( vector_4 const &Operand1, - vector_4 const &Operand2 ); - -inline vector_4 operator-( vector_4 const &Operand1, - vector_4 const &Operand2 ); - -inline vector_4 operator*( vector_4 const &Multiplicand, - real const &Multiplier ); - -inline vector_4 operator*( real const &Multiplier, - vector_4 const &Multiplicand ); - -inline point_4 operator+( point_4 const &Operand1, vector_4 const &Operand2 ); -inline point_4 operator-( point_4 const &Operand1, vector_4 const &Operand2 ); -inline point_4 operator+( vector_4 const &Operand2, point_4 const &Operand1 ); - -inline vector_4 operator-( vector_4 const &Operand1 ); - -inline vector_4 CrossProduct( vector_4 const &Operand1, - vector_4 const &Operand2 ); - -inline real DotProduct( vector_4 const &Operand1, vector_4 const &Operand2 ); - -matrix_4x4 operator*( matrix_4x4 const &Multiplicand, - matrix_4x4 const &Multiplier ); - -vector_4 operator*( matrix_4x4 const &Multiplicand, - vector_4 const &Multiplier ); - -point_4 operator*( matrix_4x4 const &Multiplicand, - point_4 const &Multiplier ); - - - - -/*---------------------------------------------------------------------------- - -quadruple. Base class for homogeneous vectors and points. - -*/ - -class quadruple -{ -public: - - inline real GetElement( int Row ) const; - - inline real GetX( void ) const; - inline real GetY( void ) const; - inline real GetZ( void ) const; - inline real GetW( void ) const; - - inline void SetElement( int Row, real Value ); - - inline void SetX( real Value ); - inline void SetY( real Value ); - inline void SetZ( real Value ); - inline void SetW( real Value ); - - -protected: - - inline quadruple( void ); - inline quadruple( real X, real Y, real Z, real W ); - inline quadruple( quadruple const & ); - inline quadruple &operator=( quadruple const & ); - - real aElements[4]; -}; - - -/*---------------------------------------------------------------------------- - -point_4. This class represents a homogeneous 3D point. - -*/ - -class point_4 : - public quadruple -{ -public: - - inline point_4( void ); - inline point_4( real X, real Y, real Z ); - - inline void Homogenize( void ); -}; - -/*---------------------------------------------------------------------------- - -vector_4. This class represents a homogeneous 3D vector. - -*/ - -class vector_4 : - public quadruple -{ -public: - - inline vector_4( void ); - inline vector_4( real X, real Y, real Z ); - - vector_4 &Normalize( void ); -}; - - - -/*---------------------------------------------------------------------------- - -matrix_4x4. This class represents row major 4x4 homogeneous matrices. - -*/ - -class matrix_4x4 -{ -public: - - matrix_4x4( void ); - - matrix_4x4 &ConcatenateXRotation( real Degrees ); - matrix_4x4 &ConcatenateYRotation( real Degrees ); - matrix_4x4 &ConcatenateZRotation( real Degrees ); - - matrix_4x4 &ConcatenateXTranslation( real Distance ); - matrix_4x4 &ConcatenateYTranslation( real Distance ); - matrix_4x4 &ConcatenateZTranslation( real Distance ); - - inline real GetElement( int Row, int Column ) const; - inline matrix_4x4 &SetElement( int Row, int Column, real Value ); - inline matrix_4x4 & operator=(matrix_4x4 const & m); - -protected: - - enum do_not_initialize { DoNotInitialize }; - - inline matrix_4x4( do_not_initialize ); - - real aElements[4][4]; -}; - -/*---------------------------------------------------------------------------- - -view transform. - -*/ - -class view_transform : - public matrix_4x4 -{ -public: - - view_transform( point_4 const &Viewpoint, vector_4 const &ViewDirection, - vector_4 const &Up ); -}; - - -/*---------------------------------------------------------------------------- - -inline function definitions. - -*/ - - -inline vector_4 operator-( point_4 const &Operand1, point_4 const &Operand2 ) -{ - return vector_4(Operand1.GetX() - Operand2.GetX(), - Operand1.GetY() - Operand2.GetY(), - Operand1.GetZ() - Operand2.GetZ()); -} - -inline vector_4 operator+( vector_4 const &Operand1, - vector_4 const &Operand2 ) -{ - return vector_4(Operand1.GetX() + Operand2.GetX(), - Operand1.GetY() + Operand2.GetY(), - Operand1.GetZ() + Operand2.GetZ()); -} - -inline vector_4 operator-( vector_4 const &Operand1, - vector_4 const &Operand2 ) -{ - return vector_4(Operand1.GetX() - Operand2.GetX(), - Operand1.GetY() - Operand2.GetY(), - Operand1.GetZ() - Operand2.GetZ()); -} - -inline vector_4 operator-( vector_4 const &Operand1 ) -{ - return vector_4(-Operand1.GetX(),-Operand1.GetY(),-Operand1.GetZ()); -} - -inline vector_4 operator*( vector_4 const &Multiplicand, - real const &Multiplier ) -{ - return vector_4(Multiplicand.GetX() * Multiplier, - Multiplicand.GetY() * Multiplier, - Multiplicand.GetZ() * Multiplier); -} - -inline vector_4 operator*( real const &Multiplier, - vector_4 const &Multiplicand ) -{ - return vector_4(Multiplicand.GetX() * Multiplier, - Multiplicand.GetY() * Multiplier, - Multiplicand.GetZ() * Multiplier); -} - -inline point_4 operator+( point_4 const &Operand1, vector_4 const &Operand2 ) -{ - return point_4(Operand1.GetX() + Operand2.GetX(), - Operand1.GetY() + Operand2.GetY(), - Operand1.GetZ() + Operand2.GetZ()); -} - -inline point_4 operator-( point_4 const &Operand1, vector_4 const &Operand2 ) -{ - return point_4(Operand1.GetX() - Operand2.GetX(), - Operand1.GetY() - Operand2.GetY(), - Operand1.GetZ() - Operand2.GetZ()); -} - -inline point_4 operator+( vector_4 const &Operand1, point_4 const &Operand2 ) -{ - return Operand2 + Operand1; -} - -inline vector_4 CrossProduct( vector_4 const &Operand1, - vector_4 const &Operand2 ) -{ - real X = Operand1.GetY() * Operand2.GetZ() - - Operand1.GetZ() * Operand2.GetY(); - real Y = Operand1.GetZ() * Operand2.GetX() - - Operand1.GetX() * Operand2.GetZ(); - real Z = Operand1.GetX() * Operand2.GetY() - - Operand1.GetY() * Operand2.GetX(); - - return vector_4(X,Y,Z); -} - -inline real DotProduct( vector_4 const &Operand1, vector_4 const &Operand2 ) -{ - return Operand1.GetX() * Operand2.GetX() + - Operand1.GetY() * Operand2.GetY() + - Operand1.GetZ() * Operand2.GetZ(); -} - - -inline real quadruple::GetElement( int Row ) const -{ - return aElements[Row]; -} - -inline real quadruple::GetX( void ) const -{ - return aElements[0]; -} - -inline real quadruple::GetY( void ) const -{ - return aElements[1]; -} - -inline real quadruple::GetZ( void ) const -{ - return aElements[2]; -} - -inline real quadruple::GetW( void ) const -{ - return aElements[3]; -} - -inline void quadruple::SetElement( int Row, real Value ) -{ - aElements[Row] = Value; -} - -inline void quadruple::SetX( real Value ) -{ - aElements[0] = Value; -} - -inline void quadruple::SetY( real Value ) -{ - aElements[1] = Value; -} - -inline void quadruple::SetZ( real Value ) -{ - aElements[2] = Value; -} - -inline void quadruple::SetW( real Value ) -{ - aElements[3] = Value; -} - -inline void point_4::Homogenize( void ) -{ - aElements[0] = aElements[0] / aElements[3]; - aElements[1] = aElements[1] / aElements[3]; - aElements[2] = aElements[2] / aElements[3]; -} - -inline quadruple::quadruple( void ) -{ - aElements[0] = aElements[1] = aElements[2] = aElements[3] = 0; -} - -inline quadruple::quadruple( real X, real Y, real Z, real W ) -{ - aElements[0] = X; - aElements[1] = Y; - aElements[2] = Z; - aElements[3] = W; -} - -inline quadruple::quadruple( quadruple const &Source ) -{ - aElements[0] = Source.aElements[0]; - aElements[1] = Source.aElements[1]; - aElements[2] = Source.aElements[2]; - aElements[3] = Source.aElements[3]; -} - -inline quadruple &quadruple::operator=( quadruple const &Source ) -{ - aElements[0] = Source.aElements[0]; - aElements[1] = Source.aElements[1]; - aElements[2] = Source.aElements[2]; - aElements[3] = Source.aElements[3]; - - return *this; -} - -inline point_4::point_4( void ) : - quadruple(0,0,0,1) -{ - -} - -inline point_4::point_4( real X, real Y, real Z ) : - quadruple(X,Y,Z,1) -{ -#if 0 - char aBuffer[100]; - sprintf(aBuffer,"X: %f Y: %f Z: %f",X,Y,Z); - MessageBox(0,aBuffer,"foobar",MB_OK); - sprintf(aBuffer,"X: %f Y: %f Z: %f W:%f",aElements[0],aElements[1], - aElements[2],aElements[3]); - MessageBox(0,aBuffer,"foobar",MB_OK); -#endif -} - -inline vector_4::vector_4( void ) : - quadruple(0,0,0,0) -{ - -} - -inline vector_4::vector_4( real X, real Y, real Z ) : - quadruple(X,Y,Z,0) -{ - -} - -inline real matrix_4x4::GetElement( int Row, int Column ) const -{ - return aElements[Row][Column]; -} - -inline matrix_4x4 &matrix_4x4::SetElement( int Row, int Column, real Value ) -{ - aElements[Row][Column] = Value; - - return *this; -} - -inline matrix_4x4::matrix_4x4( do_not_initialize ) -{ - -} - -inline matrix_4x4 & matrix_4x4::operator=(matrix_4x4 const & m) -{ - memcpy((void *) aElements, (void *) m.aElements,sizeof(aElements)); - return *this; -} -#endif diff --git a/sdk/samples/flip2d/fixed.h b/sdk/samples/flip2d/fixed.h deleted file mode 100644 index 9d05b7b..0000000 --- a/sdk/samples/flip2d/fixed.h +++ /dev/null @@ -1,42 +0,0 @@ -/************************************************************************** - - Fixed.h - 16.16 Fixed point class - - **************************************************************************/ - -inline long fixed_mul(long a, long b) {return MulDiv(a, b, 65536);} -inline long fixed_div(long a, long b) {return MulDiv(a, 65536, b);} - -class Fixed { - private: - long fx; - public: - Fixed() {} - ~Fixed() {} - - Fixed(long l) {fx = l<<16;} - Fixed(int i) {fx = (long)i<<16;} - Fixed(double d) {fx = (long)(d * 65536.0);} - - int Int() {return (int)(fx >> 16);} - int Frac() {return (int)(fx & 0xFFFF);} - - operator int() {return (int)(fx >> 16);} - operator double() {return (double)fx / 65536.0;} - - Fixed operator +(Fixed a) {Fixed c; c.fx = fx + a.fx; return c;} - Fixed operator -(Fixed a) {Fixed c; c.fx = fx - a.fx; return c;} - Fixed operator *(Fixed a) {Fixed c; c.fx = fixed_mul(fx,a.fx); return c;} - Fixed operator /(Fixed a) {Fixed c; c.fx = fixed_div(fx,a.fx); return c;} - - int operator <(Fixed a) {return fx < a.fx;} - int operator >(Fixed a) {return fx > a.fx;} - int operator ==(Fixed a) {return fx == a.fx;} - int operator !=(Fixed a) {return fx != a.fx;} - -// Fixed& operator =(Fixed a) {fx = a.fx; return *this;} - Fixed& operator +=(Fixed a) {fx += a.fx; return *this;} - Fixed& operator -=(Fixed a) {fx -= a.fx; return *this;} - Fixed& operator *=(Fixed a) {fx = fixed_mul(fx,a.fx); return *this;} - Fixed& operator /=(Fixed a) {fx = fixed_div(fx,a.fx); return *this;} -}; diff --git a/sdk/samples/flip2d/flipcube.cpp b/sdk/samples/flip2d/flipcube.cpp deleted file mode 100644 index 41b0850..0000000 --- a/sdk/samples/flip2d/flipcube.cpp +++ /dev/null @@ -1,1144 +0,0 @@ -/************************************************************************** - - FLIPCUBE.CPP - A spinning cube demo for DirectDraw - - basic page fliping app, just render to the back buffer and flip - that is all I do. - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#define INITGUID - -#include -#include -#include -#include -#include -#include - -#include "flipcube.h" -#include "dumb3d.h" - -// code is in tri.cpp -extern void Triangle8(BYTE *p, int next_scan, POINT P0, POINT P1, POINT P2, DWORD c); - -/************************************************************************** - Global Variables - **************************************************************************/ - -static char szAppName[]="DirectDraw Spinning Cube"; - -static HINSTANCE hInstApp; -static BOOL fAppActive; -static BOOL fAppPaused; -static HWND hwndApp; -static HACCEL hAccelApp; -static HFONT AppFont; -static SIZE ScreenSize; -static BOOL fDrawWithGDI; - -/************************************************************************** - DirectDraw Globals - **************************************************************************/ - -IDirectDraw *dd; -IDirectDrawSurface *FrontBuffer; -IDirectDrawSurface *BackBuffer; -IDirectDrawPalette *Palette; - -/************************************************************************** - DirectInput Globals - **************************************************************************/ -LPDIRECTINPUT lpdi; -LPDIRECTINPUTDEVICE lpdiZoom; // Used for zooming -LPDIRECTINPUTDEVICE lpdiRot; // Use for rotation -BOOL fMouseAcquired = FALSE; // Acquired for rot'n - -/************************************************************************** - dumb 3D Globals - **************************************************************************/ - -//*** Cube vertices, normals, shades, and modeling transform -static point_4 CubeVertices[8] = -{ - point_4( -10, 10, -10 ), - point_4( -10, 10, 10 ), - point_4( 10, 10, 10 ), - point_4( 10, 10, -10 ), - point_4( 10, -10, -10 ), - point_4( 10, -10, 10 ), - point_4( -10, -10, 10 ), - point_4( -10, -10, -10 ) -}; -static vector_4 CubeSurfaceNormals[6]; -static real CubeSurfaceShades[6]; -static matrix_4x4 CubeTransform; - -//*** Cube edges - ordered indices into the vertex array -const int CubeFaces[6][4] = -{ - 0, 1, 2, 3, - 2, 1, 6, 5, - 3, 2, 5, 4, - 0, 3, 4, 7, - 1, 0, 7, 6, - 4, 5, 6, 7 -}; - -//*** Cube colors - one RGB color per surface -const unsigned char CubeColors[6][3] = -{ - 240, 20, 20, // Unsaturated Red - 20, 240, 20, // Unsaturated Green - 20, 20, 240, // Unsaturated Blue - 128, 64, 0, // Brown - 240, 20, 240, // Unsaturated Magenta - 240, 240, 20 // Unsaturated Yellow -}; - -//*** Lighting -vector_4 LightSourceDirection; -const real AmbientLight = 0.2; - -//*** Viewing and perspective -static matrix_4x4 ViewPerspective; -static point_4 Viewpoint(60, 60, 60); -static vector_4 Up(0, 1, 0); -static point_4 Origin; - -/************************************************************************** - Internal function declarations - **************************************************************************/ - -LONG CALLBACK AppWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); -BOOL InitDInput(void); -BOOL AppIdle(void); -void RenderFrame(void); - -void TransformCube(matrix_4x4 const &Transform); -BOOL ProjectAndDrawCube(HDC hdc, int XOffset, int YOffset); -BOOL ProjectAndDrawCube(IDirectDrawSurface *pdds, int XOffset, int YOffset); - -/************************************************************************** - AppAbout - - Description: - This function handles messages belonging to the "About" dialog box. - The only message that it looks for is WM_COMMAND, indicating the user - has pressed the "OK" button. - **************************************************************************/ - -BOOL FAR PASCAL AppAbout(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) -{ - switch (msg) - { - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) - EndDialog(hwnd, TRUE); - break; - - case WM_INITDIALOG: - return TRUE; - } - return FALSE; -} - -/************************************************************************** - DDInit - - Description: - initialize all the DirectDraw specific stuff - **************************************************************************/ - -BOOL DDInit() -{ - HRESULT err; - - err = DirectDrawCreate(NULL, &dd, NULL); - - if (err != DD_OK) - return FALSE; - - err = dd->SetCooperativeLevel(hwndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX); - - if (err != DD_OK) - return FALSE; - - // NEWNEW init DirectInput iff DDraw inits ok - if(!InitDInput()) - return FALSE; - - return TRUE; -} - -/************************************************************************** - CreateMouse - **************************************************************************/ - -BOOL CreateMouse(GUID &guid, LPDIRECTINPUTDEVICE& lpdiMouse, DWORD dwAccess) -{ - HRESULT err; - - err = lpdi->CreateDevice(guid, &lpdiMouse, NULL); - - if(err != DI_OK) - { - MessageBox(NULL, "Unable to Create DirectInput Mouse Device", - "DirectDraw Spinning Cube", MB_OK); - goto fail; - } - - // Tell DirectInput that we want to receive data in mouse format - err = lpdiMouse->SetDataFormat(&c_dfDIMouse); - - if(err != DI_OK) - { - MessageBox(NULL, "Unable to Access DirectInput Device as a mouse", - "DirectDraw Spinning Cube", MB_OK); - goto fail; - } - - // set desired access mode - err = lpdiMouse->SetCooperativeLevel(hwndApp, dwAccess); - if(err != DI_OK) - { - MessageBox(NULL, "Unable to set cooperativity level", - "DirectDraw Spinning Cube", MB_OK); - goto fail; - } - - return TRUE; - -fail:; - if (lpdiMouse) lpdiMouse->Release(), lpdiMouse = 0; - return FALSE; -} - -/************************************************************************** - InitDInput - **************************************************************************/ -BOOL InitDInput(void) -{ - HRESULT err; - GUID guid = GUID_SysMouse; - - err = DirectInputCreate(hInstApp, DIRECTINPUT_VERSION, &lpdi, NULL); - - if(err != DI_OK) - { - MessageBox(NULL, "Unable to Create DirectInput Object", - "DirectDraw Spinning Cube", MB_OK); - return FALSE; - } - - // Create a mouse for zooming. Zooming is done non-exclusively. - if (!CreateMouse(guid, lpdiZoom, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)) - { - goto fail; - } - - if (fAppActive) lpdiZoom->Acquire(); - - // Create a mouse for rotation. Rotation is done exclusively. - if (!CreateMouse(guid, lpdiRot, DISCL_EXCLUSIVE | DISCL_FOREGROUND)) - { - goto fail; - } - - // if we get here, all DirectInput objects were created ok - return TRUE; - -fail: - if (lpdiZoom) lpdiZoom->Release(), lpdiZoom = NULL; - if (lpdiRot) lpdiRot ->Release(), lpdiRot = NULL; - if (lpdi) lpdi ->Release(), lpdi = NULL; - return FALSE; - -} - - -/************************************************************************** - DDSetMode - **************************************************************************/ - -BOOL DDSetMode(int width, int height, int bpp) -{ - HRESULT err; - - err = dd->SetDisplayMode(width, height, bpp); - - if (err != DD_OK) - return FALSE; - - ScreenSize.cx = width; - ScreenSize.cy = height; - - // get rid of any previous surfaces. - if (BackBuffer) BackBuffer->Release(), BackBuffer = NULL; - if (FrontBuffer) FrontBuffer->Release(), FrontBuffer = NULL; - if (Palette) Palette->Release(), Palette = NULL; - - // - // Create surfaces - // - // what we want is a tripple buffered surface in video memory - // so we try to create this first. - // - // if we cant get a triple buffered surface, we try again - // for a double buffered surface (still must be in video memory) - // - // if we cant get a double buffered surface, we try for a double - // buffered surface not being specific about video memory, we will - // get back a main-memory surface, that work use HW page flipping - // but at least we run. - // - // NOTE you need to recreate the surfaces for a new display mode - // they wont work when/if the mode is changed. - // - DDSURFACEDESC ddsd; - - ZeroMemory(&ddsd, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 2; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX | - DDSCAPS_VIDEOMEMORY; - - // try to get a triple buffered video memory surface. - err = dd->CreateSurface(&ddsd, &FrontBuffer, NULL); - - if (err != DD_OK) - { - // try to get a double buffered video memory surface. - ddsd.dwBackBufferCount = 1; - err = dd->CreateSurface(&ddsd, &FrontBuffer, NULL); - } - - if (err != DD_OK) - { - // settle for a main memory surface. - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - err = dd->CreateSurface(&ddsd, &FrontBuffer, NULL); - } - - if (err != DD_OK) - return FALSE; - - // get a pointer to the back buffer - DDSCAPS caps; - caps.dwCaps = DDSCAPS_BACKBUFFER; - err = FrontBuffer->GetAttachedSurface(&caps, &BackBuffer); - - if (err != DD_OK) - return FALSE; - - // create a palette if we are in a paletized display mode. - // - // NOTE because we want to be able to show dialog boxs and - // use our menu, we leave the windows reserved colors as is - // so things dont look ugly. - // - // palette is setup like so: - // - // 10 windows system colors - // 64 red wash - // 64 grn wash - // 64 blu wash - // - PALETTEENTRY ape[256]; - HDC hdc = GetDC(NULL); - if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) - { - // get the current windows colors. - GetSystemPaletteEntries(hdc, 0, 256, ape); - - // make a red, grn, and blu wash for our cube. - for (int i=0; i<64; i++) - { - ape[10+64*0+i].peRed = i * 255/63; - ape[10+64*0+i].peGreen = 0; - ape[10+64*0+i].peBlue = 0; - - ape[10+64*1+i].peRed = 0; - ape[10+64*1+i].peGreen = i * 255/63; - ape[10+64*1+i].peBlue = 0; - - ape[10+64*2+i].peRed = 0; - ape[10+64*2+i].peGreen = 0; - ape[10+64*2+i].peBlue = i * 255/63; - } - - // create the palette. - err = dd->CreatePalette(DDPCAPS_8BIT, ape, &Palette, NULL); - - if (err == DD_OK) - { - FrontBuffer->SetPalette(Palette); - } - } - ReleaseDC(NULL, hdc); - - if (AppFont) - DeleteObject(AppFont); - - AppFont = CreateFont(width < 640 ? 24 : 48, - 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, - ANSI_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - NONANTIALIASED_QUALITY, - VARIABLE_PITCH, - "Comic Sans MS"); - - return TRUE; -} - - -/************************************************************************** - DDTerm - **************************************************************************/ - -void DDTerm() -{ - if (BackBuffer) BackBuffer->Release(), BackBuffer = NULL; - if (FrontBuffer) FrontBuffer->Release(), FrontBuffer = NULL; - if (Palette) Palette->Release(), Palette = NULL; - if (dd) dd->Release(), dd = NULL; - if (lpdi) lpdi->Release(), lpdi = NULL; -} - -/************************************************************************** - ModeCallback - **************************************************************************/ - -HRESULT CALLBACK ModeCallback(LPDDSURFACEDESC pdds, LPVOID lParam) -{ - HMENU hmenu = (HMENU)lParam; - char ach[80]; - int n; - int width = pdds->dwWidth; - int height = pdds->dwHeight; - int bpp = pdds->ddpfPixelFormat.dwRGBBitCount; - - n = GetMenuItemCount(hmenu); - wsprintf(ach,"%dx%dx%d",width,height,bpp); - AppendMenu(hmenu,MF_STRING,MENU_MODE+n,ach); - - MENUITEMINFO mii; - - // pack the mode info into a DWORD and set the extra item data. - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_DATA; - mii.dwItemData = width | (height << 12) | (bpp << 24); - SetMenuItemInfo(hmenu, MENU_MODE+n, MF_BYCOMMAND, &mii); - - //return S_TRUE to stop enuming modes, S_FALSE to continue - return S_FALSE; -} - -/************************************************************************** - AppInit - - Description: - This is called when the application is first loaded. It initializes - all variables, registers the window class, and creates the main app - window. - **************************************************************************/ - -BOOL AppInit(HINSTANCE hInst,HINSTANCE hPrev,int sw,LPSTR szCmdLine) -{ - WNDCLASS cls; - - /* Save instance handle for DialogBoxes */ - hInstApp = hInst; - - if (!hPrev) - { - //*** Register a class for the main application window - cls.hCursor = LoadCursor(0,IDC_ARROW); - - //*** Just for fun, we'll draw our own spinning cube icon. - cls.hIcon = LoadIcon(hInst, "AppIcon"); - cls.lpszMenuName = "AppMenu"; - cls.lpszClassName = szAppName; - cls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - cls.hInstance = hInst; - cls.style = CS_VREDRAW | CS_HREDRAW; - cls.lpfnWndProc = (WNDPROC)AppWndProc; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - - if (!RegisterClass(&cls)) - return FALSE; - } - - hAccelApp = LoadAccelerators(hInst, "AppAccel"); - - //*** Set and normalize the light source - LightSourceDirection = vector_4(50, 30, -15); - LightSourceDirection.Normalize(); - - //*** Distance to view plane: - ViewPerspective.SetElement(3, 2, 1/300.0); - ViewPerspective.SetElement(3, 3, 0); - - //*** Viewport scaling - some arbitrary number like 3.5 will do - ViewPerspective.SetElement(0, 0, 3.5); - ViewPerspective.SetElement(1, 1, 3.5); - - //*** Calculate the initial normals and shades - TransformCube(CubeTransform); - - //*** Then generate an interesting rotation for the spin - CubeTransform.ConcatenateYRotation(6.0); - CubeTransform.ConcatenateXRotation(3.5); - CubeTransform.ConcatenateZRotation(2.0); - - hwndApp = CreateWindowEx( - WS_EX_APPWINDOW, - szAppName, // Class name - szAppName, // Caption - WS_POPUP | - WS_SYSMENU | - WS_CAPTION, - 0, 0, // Position - 640,480, // Size - 0, // Parent window (no parent) - 0, // use class menu - hInst, // handle to window instance - 0 // no params to pass on - ); - ShowWindow(hwndApp,sw); - UpdateWindow(hwndApp); - - if (!DDInit()) - return FALSE; - - // Enumerate all posible display modes, and stick them in our menu. - // we use the extra item DWORD of a menu item to store the mode info - HMENU hmenu = CreatePopupMenu(); - dd->EnumDisplayModes(0,NULL,(LPVOID)hmenu,ModeCallback); - AppendMenu(GetMenu(hwndApp),MF_POPUP,(UINT)hmenu,"Modes"); - - if (!DDSetMode(640,480,8) && - !DDSetMode(640,480,16)) - return FALSE; - - return TRUE; -} - -/************************************************************************** - WinMain - - Description: - The main procedure for the App. After initializing, it just goes - into a message-processing loop until it gets a WM_QUIT message. - **************************************************************************/ - -int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) -{ - MSG msg; - - //*** Call initialization procedure - if (!AppInit(hInst,hPrev,sw,szCmdLine)) - return FALSE; - - //*** Polling messages from event queue until quit - for (;;) - { - if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - break; - - if (!hwndApp || !TranslateAccelerator(hwndApp, hAccelApp, &msg)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - else - { - if (AppIdle()) - WaitMessage(); - } - } - - DDTerm(); - return msg.wParam; -} - -/************************************************************************** - AppPause - - **************************************************************************/ - -void AppPause(BOOL f) -{ - if (f) - { - DDSCAPS caps; - FrontBuffer->GetCaps(&caps); - - // if we are in ModeX go back to a windows mode - // so we can see the menu or dialog box. - - if (caps.dwCaps & DDSCAPS_MODEX) - { - DDSetMode(640,480,8); - } - - // turn off rotation while paused - if (lpdiRot) lpdiRot->Unacquire(); - fMouseAcquired = FALSE; - - fAppPaused = TRUE; - dd->FlipToGDISurface(); - DrawMenuBar(hwndApp); - RedrawWindow(hwndApp, NULL, NULL, RDW_FRAME); - } - else - { - fAppPaused = FALSE; - - } -} - -/************************************************************************** - MagnifyCube - - Description: - Magnify the cube the indicated number of times. A negative number - makes it smaller. - **************************************************************************/ - -void MagnifyCube(double times) -{ - matrix_4x4 m; - double factor = pow(1.5, times); - m.SetElement(0,0,factor); - m.SetElement(1,1,factor); - m.SetElement(2,2,factor); - TransformCube(m); -} - -/************************************************************************** - AppIdle - - return TRUE if the app is idle - return FALSE if the app is not idle. - - Description: - **************************************************************************/ - -BOOL AppIdle() -{ - DIMOUSESTATE dims; - - //*** Spin while the app is active, lbutton is up, and spinning is on. - - //*** Spin while the app is iconized. - if (fAppActive && !fAppPaused) - { - //*** If the app is active, spin the cube and redraw - - // See if any zooming needs to be done. - if(lpdiZoom->GetDeviceState(sizeof(DIMOUSESTATE), &dims) == DI_OK) { - // 240 units of motion in the Z-axis equals one unit of - // magnification / shrinkage. - if(dims.lZ) { - MagnifyCube(dims.lZ / 240.0); - } - } - - if(fMouseAcquired) - { - //** If we have the mouse acquired... - - // user spins cube if GetDeviceState succeeds and if the left button (button 0) is held - if(lpdiRot->GetDeviceState(sizeof(DIMOUSESTATE), &dims) == DI_OK) - { - if(dims.rgbButtons[0] & 0x80) - { - if(dims.lX || dims.lY) - { - matrix_4x4 Movement; - Movement.ConcatenateYRotation(dims.lX); - Movement.ConcatenateXRotation(dims.lY); - TransformCube(Movement); - } - - } - else - { - // unacquire the mouse - lpdiRot->Unacquire(); - fMouseAcquired = FALSE; - } - } - } - else - { - TransformCube(CubeTransform); - } - RenderFrame(); - return FALSE; - } - else - { - //*** Don't do anything when not the active app - return TRUE; - } -} - -/************************************************************************** - RenderFrame - - render the frame into the back buffer and do a page flip. - - things to NOTE: - - we use the blter to clear the backbuffer, this usualy is a big - win blters are real fast. - - we use GDI to draw the frame rate, and info text - - we either use GDI to draw the faces of the cube, or our own code - based on the fDrawWithGDI global variable. - - **************************************************************************/ - -int FrameRate; -int FrameCount; -int FrameCount0; -DWORD FrameTime; -DWORD FrameTime0; - -void RenderFrame() -{ - HDC hdc; - - //*** always need to handle DDERR_SURFACELOST, this will happen - //*** when we get switched away from. - - if (FrontBuffer->IsLost() == DDERR_SURFACELOST) - FrontBuffer->Restore(); - - //*** use the blter to do a color fill to clear the back buffer - - DDBLTFX ddbltfx; - ddbltfx.dwSize = sizeof(ddbltfx); - ddbltfx.dwFillColor = 0; - BackBuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx); - - //*** based on the fDrawWithGDI global variable, we either - //*** render the polygons ourself or let GDI do it - - BOOL fGDI = fDrawWithGDI; - - //*** render the cube with our own code. - //*** we need to do this outside of the GetDC, because we cant - //*** lock a buffer while we have a DC on it. - //*** if ProjectAndDrawCube returns FALSE it did not want to - //*** draw for some reason, so go ahead and use GDI - - if (!fGDI) - fGDI = !ProjectAndDrawCube(BackBuffer, ScreenSize.cx/2, ScreenSize.cy/2); - - if (BackBuffer->GetDC(&hdc) == DD_OK) - { - //*** use GDI to draw the cube. - if (fGDI) - ProjectAndDrawCube(hdc, ScreenSize.cx/2, ScreenSize.cy/2); - - //*** draw stats, like frame number and frame rate - - char ach[128]; - int len; - static char szHelp[] = "F10=Menu F7=Smaller F8=Larger"; - - SetBkMode(hdc, TRANSPARENT); - SelectObject(hdc, AppFont); - - len = wsprintf(ach, "FPS %02d Frame %05d", FrameRate, FrameCount); - - SetTextColor(hdc, RGB(255, 255, 0)); - TextOut(hdc, 0, 0, ach, len); - TextOut(hdc, 0, ScreenSize.cy-(ScreenSize.cx<640 ? 24:48),szHelp,sizeof(szHelp)-1); - - BackBuffer->ReleaseDC(hdc); - } - - //*** we have rendered the backbuffer, call flip so we can see it - FrontBuffer->Flip(NULL, DDFLIP_WAIT); - - FrameCount++; - FrameTime = timeGetTime(); - - if (FrameTime - FrameTime0 > 1000) - { - FrameRate = (FrameCount - FrameCount0) * 1000 / (FrameTime - FrameTime0); - FrameTime0 = FrameTime; - FrameCount0 = FrameCount; - } -} - -/************************************************************************** - AppWndProc - - Description: - Main window proc. Standard Windows fare. - **************************************************************************/ - -LONG CALLBACK AppWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) -{ - RECT Rect; - - switch (msg) - { - case WM_CREATE: - break; - - case WM_ACTIVATEAPP: - //*** Keep track of whether or not the app is in the foreground - fAppActive = (BOOL)wParam; - // re-acquire the zooming controller when we are activated - if (fAppActive) { - if (lpdiZoom) lpdiZoom->Acquire(); - } else{ // unacquire everything if app is not active - if (lpdiZoom) lpdiZoom->Unacquire(); - if (lpdiRot) lpdiRot->Unacquire(); - fMouseAcquired = FALSE; - } - break; - - case WM_SETCURSOR: - if (fAppActive && !fAppPaused) - { - SetCursor(NULL); - return 1; - } - break; - - case WM_ENTERMENULOOP: - AppPause(TRUE); - break; - - case WM_EXITMENULOOP: - AppPause(FALSE); - break; - - case WM_INITMENUPOPUP: - CheckMenuItem((HMENU)wParam, MENU_GDI, fDrawWithGDI ? MF_CHECKED : MF_UNCHECKED); - break; - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case MENU_ABOUT: - AppPause(TRUE); - DialogBox(hInstApp, "AppAbout", hwnd, (DLGPROC)AppAbout); - AppPause(FALSE); - break; - - case MENU_EXIT: - PostMessage(hwnd, WM_CLOSE, 0, 0L); - break; - - case MENU_LARGER: - MagnifyCube(+1.0); - break; - - case MENU_SMALLER: - MagnifyCube(-1.0); - break; - - case MENU_GDI: - fDrawWithGDI = !fDrawWithGDI; - break; - } - if (LOWORD(wParam) >= MENU_MODE && LOWORD(wParam) < MENU_MODE+100) - { - MENUITEMINFO mii; - - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_DATA; - GetMenuItemInfo(GetMenu(hwnd), LOWORD(wParam), MF_BYCOMMAND, &mii); - - DDSetMode( - (mii.dwItemData >> 0) & 0xFFF, - (mii.dwItemData >> 12) & 0xFFF, - (mii.dwItemData >> 24) & 0x0FF); - } - return 0L; - - case WM_DESTROY: - // clean up DirectInput objects - if (fMouseAcquired) lpdiRot->Unacquire(); - if (lpdiZoom) lpdiZoom->Release(), lpdiZoom = NULL; - if (lpdiRot) lpdiRot ->Release(), lpdiRot = NULL; - if (lpdi) lpdi ->Release(), lpdi = NULL; - - hwndApp = NULL; - PostQuitMessage(0); - break; - - case WM_PAINT: - break; - - case WM_MOVE: - case WM_SIZE: - case WM_DISPLAYCHANGE: - if (fAppActive && !IsIconic(hwnd)) - { - SetRect(&Rect, 0, GetSystemMetrics(SM_CYCAPTION), GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); - AdjustWindowRectEx(&Rect, WS_POPUP | WS_CAPTION, FALSE, 0); - SetWindowPos(hwnd, NULL, Rect.left, Rect.top, Rect.right-Rect.left, Rect.bottom-Rect.top, SWP_NOACTIVATE | SWP_NOZORDER); - } - break; - - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - if(lpdiRot->Acquire() == DI_OK) - { - fMouseAcquired = TRUE; - } - else - { - // not acquired, mouse will not do anything - } - break; - - } - - return DefWindowProc(hwnd,msg,wParam,lParam); -} - -/************************************************************************** - TransformCube - - Description: - Transforms the cube vertices by the current rotation matrix. - Recalculates normals and flat shade values for the - directional light source. - **************************************************************************/ - -void TransformCube(matrix_4x4 const &Transform) -{ - int i; - - //*** Transform the cube by the matrix - for (i = 0; i < 8; ++i) - CubeVertices[i] = Transform * CubeVertices[i]; - - //*** Recalculate normals and shades - for (i = 0; i < 6; ++i) - { - //*** Normals are perpendicular to two edges of the cube - vector_4 Edge1, Edge2; - Edge1 = CubeVertices[CubeFaces[i][1]] - CubeVertices[CubeFaces[i][0]]; - Edge2 = CubeVertices[CubeFaces[i][3]] - CubeVertices[CubeFaces[i][0]]; - CubeSurfaceNormals[i] = CrossProduct(Edge1, Edge2); - CubeSurfaceNormals[i].Normalize(); - - //*** Cosine shading based on the surface normal, clamped to [0, 1] - real Shade = DotProduct(CubeSurfaceNormals[i], LightSourceDirection); - Shade = Shade + AmbientLight; - if (Shade < 0) Shade = 0; - else if (Shade > 1.0) Shade = 1.0; - CubeSurfaceShades[i] = Shade; - } -} - -/************************************************************************** - ProjectAndDrawCube - - Description: - Projects the cube vertices for the current viewpoint then culls - in screen space and draws into the DC via GDI. - **************************************************************************/ - -BOOL ProjectAndDrawCube(HDC hdc, int XOffset, int YOffset) -{ - //*** Create a viewing transform for the current eye position - vector_4 ViewDirection = Origin - Viewpoint; - ViewDirection.Normalize(); - view_transform View(Viewpoint, ViewDirection, Up); - - //*** Transform and project the vertices into screen space - int i; - POINT aScreenVertices[8]; - for (i = 0; i < 8; ++i) - { - point_4 Temp = View * CubeVertices[i]; - Temp = ViewPerspective * Temp; - Temp.Homogenize(); - - aScreenVertices[i].x = (int)Temp.GetX() + XOffset; - aScreenVertices[i].y = (int)Temp.GetY() + YOffset; - } - - SelectPen(hdc, GetStockPen(NULL_PEN)); - - for (i = 0; i < 6; ++i) - { - //*** Standard culling operation based on the z value of the - //*** cross product of the edges: are the vertices oriented in the - //*** counterclockwise or clockwise direction? - real v1 = aScreenVertices[ CubeFaces[i][2] ].x - - aScreenVertices[ CubeFaces[i][1] ].x; - real w1 = aScreenVertices[ CubeFaces[i][0] ].x - - aScreenVertices[ CubeFaces[i][1] ].x; - real v2 = aScreenVertices[ CubeFaces[i][2] ].y - - aScreenVertices[ CubeFaces[i][1] ].y; - real w2 = aScreenVertices[ CubeFaces[i][0] ].y - - aScreenVertices[ CubeFaces[i][1] ].y; - if ((v1*w2 - v2*w1) <= 0) - continue; - - //*** Create a brush for the shaded face color using the selected dither - - HBRUSH hbr; - - //*** Get the shading colors - - int Red, Green, Blue; - - Red = (int)(CubeColors[i][0] * CubeSurfaceShades[i]); - Green = (int)(CubeColors[i][1] * CubeSurfaceShades[i]); - Blue = (int)(CubeColors[i][2] * CubeSurfaceShades[i]); - - //*** Create the dithered or PALETTERGB brush - - COLORREF cr; - - cr = RGB(Red, Green, Blue); - hbr = CreateSolidBrush(cr); - - //*** Collect the correct points in an array - POINT aQuadVertices[4]; - for (int j = 0; j < 4; ++j) - aQuadVertices[j] = aScreenVertices[ CubeFaces[i][j] ]; - - //*** Use GDI to draw the face - hbr = SelectBrush(hdc, hbr); - Polygon(hdc, aQuadVertices, 4); - hbr = SelectBrush(hdc, hbr); - DeleteObject(hbr); - } - - return TRUE; -} - -/************************************************************************** - ProjectAndDrawCube - - Description: - Projects the cube vertices for the current viewpoint then culls - in screen space and draws them into a DirectDrawSurface via custom code - **************************************************************************/ - -BOOL ProjectAndDrawCube(IDirectDrawSurface *pdds, int XOffset, int YOffset) -{ - //*** Lock the DirectDraw surface - DDSURFACEDESC ddsd; - ddsd.dwSize = sizeof(ddsd); - - if (pdds->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) - return FALSE; - - //*** This code only works for 8bpp - if (ddsd.ddpfPixelFormat.dwRGBBitCount != 8) - { - pdds->Unlock(NULL); - return FALSE; - } - - //*** Create a viewing transform for the current eye position - vector_4 ViewDirection = Origin - Viewpoint; - ViewDirection.Normalize(); - view_transform View(Viewpoint, ViewDirection, Up); - - //*** Transform and project the vertices into screen space - int i; - POINT aScreenVertices[8]; - for (i = 0; i < 8; ++i) - { - point_4 Temp = View * CubeVertices[i]; - Temp = ViewPerspective * Temp; - Temp.Homogenize(); - - aScreenVertices[i].x = (int)Temp.GetX() + XOffset; - aScreenVertices[i].y = (int)Temp.GetY() + YOffset; - - //*** !!! OUR CODE DOES NOT CLIP, SO FAIL IF WE NEED CLIPPING - if (aScreenVertices[i].x < 0 || aScreenVertices[i].x >= ScreenSize.cx || - aScreenVertices[i].y < 0 || aScreenVertices[i].y >= ScreenSize.cy) - { - pdds->Unlock(NULL); - return FALSE; - } - } - - for (i = 0; i < 6; ++i) - { - //*** Standard culling operation based on the z value of the - //*** cross product of the edges: are the vertices oriented in the - //*** counterclockwise or clockwise direction? - real v1 = aScreenVertices[ CubeFaces[i][2] ].x - - aScreenVertices[ CubeFaces[i][1] ].x; - real w1 = aScreenVertices[ CubeFaces[i][0] ].x - - aScreenVertices[ CubeFaces[i][1] ].x; - real v2 = aScreenVertices[ CubeFaces[i][2] ].y - - aScreenVertices[ CubeFaces[i][1] ].y; - real w2 = aScreenVertices[ CubeFaces[i][0] ].y - - aScreenVertices[ CubeFaces[i][1] ].y; - if ((v1*w2 - v2*w1) <= 0) - continue; - - //*** Get the shading color, palette is setup like so: - //*** 10 system, 64 red, 64 green, 64 blue - - BYTE color; - - if (CubeColors[i][0] >= 128) - color = (BYTE)(10 + 0*64 + (63 * CubeSurfaceShades[i])); - else if (CubeColors[i][1] >= 128) - color = (BYTE)(10 + 1*64 + (63 * CubeSurfaceShades[i])); - else - color = (BYTE)(10 + 2*64 + (63 * CubeSurfaceShades[i])); - - //*** Use code in tri.cpp draw the face - - Triangle8((BYTE*)ddsd.lpSurface, ddsd.lPitch, - aScreenVertices[CubeFaces[i][0]], - aScreenVertices[CubeFaces[i][1]], - aScreenVertices[CubeFaces[i][2]], - color); - - Triangle8((BYTE*)ddsd.lpSurface, ddsd.lPitch, - aScreenVertices[CubeFaces[i][2]], - aScreenVertices[CubeFaces[i][3]], - aScreenVertices[CubeFaces[i][0]], - color); - } - - //*** Never ever forget to unlock! - pdds->Unlock(NULL); - return TRUE; -} diff --git a/sdk/samples/flip2d/flipcube.h b/sdk/samples/flip2d/flipcube.h deleted file mode 100644 index 4ab19cb..0000000 --- a/sdk/samples/flip2d/flipcube.h +++ /dev/null @@ -1,26 +0,0 @@ -/************************************************************************** - - FLIPCUBE.H - A spinning cube demo for WinG - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -/* Menu Items */ -#define MENU_ABOUT 1 -#define MENU_EXIT 2 -#define MENU_SPIN 3 -#define MENU_LARGER 4 -#define MENU_SMALLER 5 -#define MENU_GDI 6 - -#define MENU_MODE 100 diff --git a/sdk/samples/flip2d/flipcube.ico b/sdk/samples/flip2d/flipcube.ico deleted file mode 100644 index e7735fd..0000000 Binary files a/sdk/samples/flip2d/flipcube.ico and /dev/null differ diff --git a/sdk/samples/flip2d/flipcube.rc b/sdk/samples/flip2d/flipcube.rc deleted file mode 100644 index ca265a7..0000000 --- a/sdk/samples/flip2d/flipcube.rc +++ /dev/null @@ -1,54 +0,0 @@ -/************************************************************************** - - FLIPCUBE.RC - A spinning cube demo for DirectDraw - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#include -#include "flipcube.h" - -AppIcon ICON flipcube.ico - -AppAccel ACCELERATORS DISCARDABLE -BEGIN - VK_ESCAPE, MENU_EXIT, VIRTKEY,NOINVERT - VK_F12, MENU_EXIT, VIRTKEY,NOINVERT - VK_F1, MENU_ABOUT, VIRTKEY,NOINVERT - VK_F3, MENU_SPIN, VIRTKEY,NOINVERT - VK_F7, MENU_SMALLER, VIRTKEY,NOINVERT - VK_F8, MENU_LARGER, VIRTKEY,NOINVERT - VK_F9, MENU_GDI, VIRTKEY,NOINVERT -END - -AppAbout DIALOG DISCARDABLE 22, 17, 144, 75 -STYLE DS_MODALFRAME | WS_POPUP -BEGIN - CTEXT "DirectDraw Spinning Cube Demo",-1,25,6,93,8 - CTEXT "Copyright (c) 1995-1996 Microsoft Corp.",-1,5,47,132,9 - ICON "AppIcon",-1,62,20,18,20 - DEFPUSHBUTTON "OK",IDOK,55,59,32,14,WS_GROUP -END - -AppMenu menu -begin - POPUP "&Cube" - begin - MENUITEM "&Larger\tF7", MENU_LARGER - MENUITEM "&Smaller\tF8", MENU_SMALLER - MENUITEM "Draw with &GDI\tF9", MENU_GDI - MENUITEM SEPARATOR - MENUITEM "&About...\tF1", MENU_ABOUT - MENUITEM "E&xit\tF12", MENU_EXIT - end -end diff --git a/sdk/samples/flip2d/makefile b/sdk/samples/flip2d/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/flip2d/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/flip2d/msvc.mk b/sdk/samples/flip2d/msvc.mk deleted file mode 100644 index dd25d6d..0000000 --- a/sdk/samples/flip2d/msvc.mk +++ /dev/null @@ -1,41 +0,0 @@ -NAME = Flipcube -TARGET = Flip2D -EXT = exe - -GOALS = $(TARGET).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib dinput.lib - -OBJS = flipcube.obj dumb3d.obj tri.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(TARGET).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(TARGET).$(EXT) --map:$(TARGET).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/flip2d/readme.txt b/sdk/samples/flip2d/readme.txt deleted file mode 100644 index fe08131..0000000 --- a/sdk/samples/flip2d/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -Basic demonstration of DirectDraw page flipping. Renders a spinning cube -to the back buffer, then flips. - diff --git a/sdk/samples/flip2d/tri.cpp b/sdk/samples/flip2d/tri.cpp deleted file mode 100644 index b0fc22c..0000000 --- a/sdk/samples/flip2d/tri.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/************************************************************************** - - TRI.CPP - Simple triangle rasterizer - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#include -#include "Fixed.h" - -#define SWAP(x,y) ((x)^=(y)^=(x)^=(y)) -//SWAP has a compiler generated problem on alpha.... do it the old fashioned way: -#define SWAPPT(a,b) {POINT p; p=a;a=b;b=p;} //(SWAP(a.y,b.y), SWAP(a.x,b.x)) - -/************************************************************************** - - FillScan8 - - fill a scan from x0 to x1 (inclusive) with color c - - does optimal DWORD writes, making sure to stay aligned so - it is safe for video memory. - - **************************************************************************/ -inline void FillScan8(BYTE *p, int x0, int x1, DWORD c) -{ - int dx; - int z; - - dx = x1-x0+1; - p += x0; - - if (dx > 4) - { - if (z = (DWORD)p & 0x03) - { - while (z++ < 4) - { - *p++ = (BYTE)c; - dx--; - } - } - - while (dx >= 4) - { - *((DWORD*)p) = c; - p += 4; - dx -= 4; - } - } - - while (dx-- > 0) - { - *p++ = (BYTE)c; - } -} - -/************************************************************************** - - Triangle8 - - rasterize a solid color triangle into a 8bpp memory buffer. - - NOTE this code does no clipping you better pass - - rasterizes a solid color triangle into a memory buffer with any pitch - also is careful to always write DWORD aligned, so it is safe to be - used on video memory (and faster too...) - - **************************************************************************/ - -void Triangle8(BYTE *p, int next_scan, POINT P0, POINT P1, POINT P2, DWORD c) -{ - Fixed d,d0; - Fixed x,x0; - int y; - - // - // expand the color to a DWORD - // - c |= c<<8; - c |= c<<16; - - // - // sort points so P0.y <= P1.y <= P2.y - // - if (P0.y > P1.y) SWAPPT(P0,P1); - if (P1.y > P2.y) SWAPPT(P1,P2); - if (P0.y > P1.y) SWAPPT(P0,P1); - - // - // check for quick out? - // - if (P2.y - P0.y == 0) - { - return; - } - - // - // compute "long" side walk from P0 to P2 - // - d = (Fixed)(P2.x - P0.x) / (Fixed)(P2.y - P0.y); - - x = P0.x; - y = P0.y; - p += P0.y * next_scan; // point p to correct scan. - - // - // do the top - // - if (P0.y < P1.y) - { - d0 = (Fixed)(P1.x - P0.x) / (Fixed)(P1.y - P0.y); - x0 = P0.x; - - // - // check for left or right fill - // - if (d < d0) - { - while (y < P1.y) - { - FillScan8(p, x, x0, c); - y++; - p += next_scan; - x += d; - x0 += d0; - } - } - else - { - while (y < P1.y) - { - FillScan8(p, x0, x, c); - y++; - p += next_scan; - x += d; - x0 += d0; - } - } - } - - // - // do the bottom. - // - - if (P2.y - P1.y == 0) - { - return; - } - - d0 = (Fixed)(P2.x - P1.x) / (Fixed)(P2.y - P1.y); - x0 = P1.x; - - // - // check for left or right fill - // - if (x < x0) - { - while (y < P2.y) - { - FillScan8(p, x, x0, c); - y++; - p += next_scan; - x += d; - x0 += d0; - } - } - else - { - while (y < P2.y) - { - FillScan8(p, x0, x, c); - y++; - p += next_scan; - x += d; - x0 += d0; - } - } -} diff --git a/sdk/samples/flipcube/flipcube.c b/sdk/samples/flipcube/flipcube.c deleted file mode 100644 index 3d39963..0000000 --- a/sdk/samples/flipcube/flipcube.c +++ /dev/null @@ -1,587 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: flipcube.c - * - * Mouse controls: Left-click stops cube rotating. Holding down left mouse - * button and moving mouse moves cube. Right-click resumes rotating. - * - ***************************************************************************/ - -#include -#include -#include -#include -#include "d3ddemo.h" - -BOOL KeyboardHandler(UINT message, WPARAM wParam, LPARAM lParam); -BOOL MouseHandler(UINT message, WPARAM wParam, LPARAM lParam); -void ConcatenateXRotation(LPD3DMATRIX lpM, float Degrees ); -void ConcatenateYRotation(LPD3DMATRIX lpM, float Degrees ); -void ConcatenateZRotation(LPD3DMATRIX lpM, float Degrees ); - -//*** Cube colors - one RGB color per material -const D3DCOLOR MaterialColors[6][2] = -{ - RGBA_MAKE(240, 20, 20, 255), // Unsaturated Red - RGB_MAKE (240, 20, 20), // Unsaturated Red - RGBA_MAKE( 20, 240, 20, 255), // Unsaturated Green - RGB_MAKE ( 20, 240, 20), // Unsaturated Green - RGBA_MAKE( 20, 20, 240, 255), // Unsaturated Blue - RGB_MAKE ( 20, 20, 240), // Unsaturated Blue - RGBA_MAKE(128, 64, 0, 255), // Brown - RGB_MAKE (128, 64, 0), // Brown - RGBA_MAKE(240, 20, 240, 255), // Unsaturated Magenta - RGB_MAKE (240, 20, 240), // Unsaturated Magenta - RGBA_MAKE(240, 240, 20, 255), // Unsaturated Yellow - RGB_MAKE (240, 240, 20), // Unsaturated Yellow -}; - -//*** Lighting -const D3DCOLOR AmbientColor = RGBA_MAKE(20, 20, 20, 20); -LPDIRECT3DLIGHT lpD3DLight; - -//*** Viewing and perspective -D3DMATRIXHANDLE hProj, hView, hWorld; -D3DMATRIX proj = { - D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0) -}; -D3DMATRIX view = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0), D3DVAL(1.0) -}; -D3DMATRIX identity = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; -D3DMATRIX world, spin; - -//*** Execute buffer -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -static D3DEXECUTEBUFFERDESC debDesc; - -//*** Interaction -static POINT Move; -static POINT Last; - -/* - * A structure which holds the object's data - */ - -LPDIRECT3DMATERIAL lpBackgroundMaterial; -LPDIRECT3DMATERIAL lpD3DMaterial[6]; -D3DMATERIALHANDLE D3DMaterialHandle[6]; -/* Cube vertices, normals, shades, and modeling transform */ -int NumVertices = 24; -static D3DVERTEX CubeVertices[] = { - {D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0) }, - {D3DVAL(1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(1.0) }, - {D3DVAL(1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0) }, - {D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0) }, - - {D3DVAL(1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0) }, - {D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(1.0) }, - {D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(1.0) }, - {D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0) }, - - {D3DVAL(1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0) }, - {D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(1.0) }, - {D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0) }, - {D3DVAL(1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0) }, - - {D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0) }, - {D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(1.0) }, - {D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(1.0) }, - {D3DVAL(1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(0.0) }, - - {D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0) }, - {D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(1.0) }, - {D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0) }, - {D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0) }, - - {D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(1.0) }, - {D3DVAL(1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(1.0) }, - {D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(1.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(0.0),D3DVAL(0.0) }, - {D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(-1.0),D3DVAL(0.0),D3DVAL(1.0),D3DVAL(0.0) } -}; - -//*** Cube edges - ordered indices into the vertex array -const int NumTri = 12; -const int CubeTri[] = { - 0, 1, 2, 0, 2, 3, - 4, 5, 6, 4, 6, 7, - 8, 9, 10, 8, 10, 11, - 12, 13, 14, 12, 14, 15, - 16, 17, 18, 16, 18, 19, - 20, 21, 22, 20, 22, 23 -}; - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Flipcube D3D Example"); - defaults->rs.ShadeMode = D3DSHADE_FLAT; - defaults->rs.bZBufferOn = FALSE; - defaults->bTexturesDisabled = TRUE; -} - -BOOL -TickScene() -{ - if (GetAsyncKeyState(VK_LBUTTON) < 0) { - if(Move.x || Move.y) { - D3DMATRIX Movement; - Movement = identity; - ConcatenateYRotation(&Movement, (float)Move.x); - ConcatenateXRotation(&Movement, (float)Move.y); - Move.x = Move.y = 0; - MultiplyD3DMATRIX(&world, &world, &Movement); - } - } else { - MultiplyD3DMATRIX(&world, &spin, &world); - } - return TRUE; -} - -/* - * Each frame, renders the scene and calls mod_buffer to modify the object - * for the next frame. - */ -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - /* - * Execute the instruction buffer - */ - if (lpDev->lpVtbl->SetMatrix(lpDev, hWorld, &world) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, - lpView, D3DEXECUTE_CLIPPED) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData)!= D3D_OK) - return FALSE; - *lpExtent = d3dExData.dsStatus.drExtent; - if (!(TickScene())) - return FALSE; - return TRUE; -} - -void -InitSpin(void) -{ - spin = identity; - ConcatenateYRotation(&spin, D3DVAL(6.0)); - ConcatenateXRotation(&spin, D3DVAL(3.5)); - ConcatenateZRotation(&spin, D3DVAL(2.0)); -} - -BOOL -InitScene(void) -{ - world = identity; - InitSpin(); - if (!(SetKeyboardCallback(KeyboardHandler))) - return FALSE; - if (!(SetMouseCallback(MouseHandler))) - return FALSE; - return TRUE; -} - -void -ReleaseScene(void) -{ - -} - -/* - * Release the memory allocated for the scene and all D3D objects created. - */ -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - int i; - if (lpView) - lpView->lpVtbl->DeleteLight(lpView, lpD3DLight); - RELEASE(lpD3DLight); - RELEASE(lpD3DExBuf); - - RELEASE(lpBackgroundMaterial); - for (i = 0; i < 6; i++) { - RELEASE(lpD3DMaterial[i]); - } -} - -/* - * Builds the scene and initializes the execute buffer for rendering. Returns 0 on failure. - */ -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - D3DMATERIAL MaterialDesc; - D3DMATERIALHANDLE BackgroundHandle; - D3DLIGHT LightDesc; - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf; - LPVOID lpBufStart, lpInsStart, lpPointer; - DWORD size; - int i; - - for (i = 0; i < 6; i++) { - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpD3DMaterial[i], NULL) != D3D_OK) - return FALSE; - memset(&MaterialDesc, 0, sizeof(D3DMATERIAL)); - MaterialDesc.dwSize = sizeof(D3DMATERIAL); - MaterialDesc.diffuse.r = (D3DVALUE)(RGBA_GETRED(MaterialColors[i][0]) / 255.0); - MaterialDesc.diffuse.g = (D3DVALUE)(RGBA_GETGREEN(MaterialColors[i][0]) / 255.0); - MaterialDesc.diffuse.b = (D3DVALUE)(RGBA_GETBLUE(MaterialColors[i][0]) / 255.0); - MaterialDesc.diffuse.a = (D3DVALUE)(RGBA_GETALPHA(MaterialColors[i][0]) / 255.0); - MaterialDesc.ambient.r = (D3DVALUE)(RGBA_GETALPHA(MaterialColors[i][1]) / 255.0); - MaterialDesc.ambient.g = (D3DVALUE)(RGBA_GETALPHA(MaterialColors[i][1]) / 255.0); - MaterialDesc.ambient.b = (D3DVALUE)(RGBA_GETALPHA(MaterialColors[i][1]) / 255.0); - MaterialDesc.ambient.a = (D3DVALUE)(RGBA_GETALPHA(MaterialColors[i][1]) / 255.0); - MaterialDesc.specular.r = (D3DVALUE)1.0; - MaterialDesc.specular.g = (D3DVALUE)1.0; - MaterialDesc.specular.b = (D3DVALUE)1.0; - MaterialDesc.power = (float)20.0; - MaterialDesc.dwRampSize = 16; - MaterialDesc.hTexture = TextureHandle[1]; - lpD3DMaterial[i]->lpVtbl->SetMaterial(lpD3DMaterial[i], &MaterialDesc); - lpD3DMaterial[i]->lpVtbl->GetHandle(lpD3DMaterial[i], lpDev, - &D3DMaterialHandle[i]); - } - /* - * Set background to black material - */ - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpBackgroundMaterial, NULL) != D3D_OK) - return FALSE; - memset(&MaterialDesc, 0, sizeof(D3DMATERIAL)); - MaterialDesc.dwSize = sizeof(D3DMATERIAL); - MaterialDesc.dwRampSize = 1; - lpBackgroundMaterial->lpVtbl->SetMaterial(lpBackgroundMaterial, &MaterialDesc); - lpBackgroundMaterial->lpVtbl->GetHandle(lpBackgroundMaterial, lpDev, - &BackgroundHandle); - lpView->lpVtbl->SetBackground(lpView, BackgroundHandle); - /* - * Add one directional light. - */ - memset(&LightDesc, 0, sizeof(D3DLIGHT)); - LightDesc.dwSize = sizeof(D3DLIGHT); - LightDesc.dltType = D3DLIGHT_POINT; - LightDesc.dcvColor.r = D3DVAL(0.9); - LightDesc.dcvColor.g = D3DVAL(0.9); - LightDesc.dcvColor.b = D3DVAL(0.9); - LightDesc.dcvColor.a = D3DVAL(1.0); - LightDesc.dvPosition.x = D3DVALP(0.0, 12); - LightDesc.dvPosition.y = D3DVALP(0.0, 12); - LightDesc.dvPosition.z = D3DVALP(-12.0, 12); - LightDesc.dvAttenuation0 = D3DVAL(1.0); - LightDesc.dvAttenuation1 = D3DVAL(0.0); - LightDesc.dvAttenuation2 = D3DVAL(0.0); - -// LightDesc.type = D3DLIGHT_DIRECTIONAL; - LightDesc.dvDirection.x = D3DVALP(0.0, 12); - LightDesc.dvDirection.y = D3DVALP(0.0, 12); - LightDesc.dvDirection.z = D3DVALP(1.0, 12); - - if (lpD3D->lpVtbl->CreateLight(lpD3D, &lpD3DLight, NULL) != D3D_OK) - return FALSE; - if (lpD3DLight->lpVtbl->SetLight(lpD3DLight, &LightDesc) != D3D_OK) - return FALSE; - if (lpView->lpVtbl->AddLight(lpView, lpD3DLight) != D3D_OK) - return FALSE; - - /* - * Set the view, world and projection matrices - * Create a buffer for matrix set commands etc. - */ - MAKE_MATRIX(lpDev, hView, view); - MAKE_MATRIX(lpDev, hProj, proj); - MAKE_MATRIX(lpDev, hWorld, world); - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 4; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExCmdBuf, - NULL) != D3D_OK) - return FALSE; - - /* - * lock it so it can be filled - */ - if (lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - lpInsStart = lpPointer; - OP_STATE_TRANSFORM(3, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_PROJECTION, hProj, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_VIEW, hView, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_AMBIENT, AmbientColor, lpPointer); - OP_EXIT(lpPointer); - - /* - * Setup the execute data describing the buffer - */ - lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char*)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - lpDev->lpVtbl->BeginScene(lpDev); - lpDev->lpVtbl->Execute(lpDev, lpD3DExCmdBuf, lpView, D3DEXECUTE_UNCLIPPED); - lpDev->lpVtbl->EndScene(lpDev); - - /* - * We are done with the command buffer. - */ - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - /* - * Create an execute buffer - */ - // calculate the size of the buffer - size = sizeof(D3DVERTEX) * NumVertices; - size += sizeof(D3DSTATUS) * 1; - size += sizeof(D3DPROCESSVERTICES) * 6; - size += sizeof(D3DINSTRUCTION) * 17; - size += sizeof(D3DSTATE) * 9; - size += sizeof(D3DTRIANGLE) * NumTri; - // Create an execute buffer - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, NULL) - != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - VERTEX_DATA(&CubeVertices[0], NumVertices, lpPointer); - - lpInsStart = lpPointer; - OP_SET_STATUS(D3DSETSTATUS_ALL, D3DSTATUS_DEFAULT, 2048, 2048, 0, 0, lpPointer); - for (i = 0; i < 6; i++) { - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, D3DMaterialHandle[i], lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, i * 4, 4, lpPointer); - } - OP_STATE_RENDER(3, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, TextureHandle[1], lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPU, FALSE, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPV, FALSE, lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(NumTri, lpPointer); - for (i = 0; i < NumTri; i++) { - ((LPD3DTRIANGLE)lpPointer)->v1 = CubeTri[i*3]; - ((LPD3DTRIANGLE)lpPointer)->v2 = CubeTri[i*3 + 1]; - ((LPD3DTRIANGLE)lpPointer)->v3 = CubeTri[i*3 + 2]; - ((LPD3DTRIANGLE)lpPointer)->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - ((LPD3DTRIANGLE)lpPointer)++; - } - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = NumVertices; - d3dExData.dwInstructionOffset = (ULONG)((char*)lpInsStart - (char*)lpBufStart); - d3dExData.dwInstructionLength = (ULONG)((char*)lpPointer - (char*)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - - return TRUE; -} - -/**************************************************************************** - Keyboard and mouse handlers - ****************************************************************************/ - -BOOL CDECL -KeyboardHandler(UINT message, WPARAM wParam, LPARAM lParam) { - D3DMATRIX m; - if (message == WM_KEYDOWN) { - if ((int)wParam == VK_F11) { - m = identity; - m._11 = D3DVAL(1.5); - m._22 = D3DVAL(1.5); - m._33 = D3DVAL(1.5); - MultiplyD3DMATRIX(&world, &world, &m); - return TRUE; - } else if ((int)wParam == VK_F12) { - m = identity; - m._11 = D3DVAL(0.9); - m._22 = D3DVAL(0.9); - m._33 = D3DVAL(0.9); - MultiplyD3DMATRIX(&world, &world, &m); - return TRUE; - } - } - return FALSE; -} - -BOOL CDECL -MouseHandler(UINT message, WPARAM wParam, LPARAM lParam) { - if (message == WM_LBUTTONDOWN) { - /* Get the start location for mouse rotations */ - spin = identity; - Last.x = LOWORD(lParam); - Last.y = HIWORD(lParam); - return TRUE; - } else if (message == WM_RBUTTONDOWN) { - /* start spinning again */ - InitSpin(); - return TRUE; - } else if (message == WM_MOUSEMOVE) { - /* While the mouse button is down, keep track of movement - * to update the eye position - */ - if(GetKeyState(VK_LBUTTON) < 0) { - Move.x = (int)LOWORD(lParam) - Last.x; - Move.y = (int)HIWORD(lParam) - Last.y; - Last.x = LOWORD(lParam); - Last.y = HIWORD(lParam); - return TRUE; - } - } - return FALSE; -} - -/************************************************************************** - TransformCube - - Description: - Multiplies the world matrix by the given transform matrix - **************************************************************************/ - -/***************************************************************************** - Rotatations - *****************************************************************************/ -#define M_PI 3.14159265358979323846 -void -ConcatenateXRotation(LPD3DMATRIX lpM, float Degrees ) -{ - float Temp01, Temp11, Temp21, Temp31; - float Temp02, Temp12, Temp22, Temp32; - float aElements[4][4]; - - float Radians = (float)((Degrees/360) * M_PI * 2.0); - - float Sin = (float)sin(Radians), Cos = (float)cos(Radians); - - memcpy(aElements, lpM, sizeof(D3DMATRIX)); - Temp01 = aElements[0][1] * Cos + aElements[0][2] * Sin; - Temp11 = aElements[1][1] * Cos + aElements[1][2] * Sin; - Temp21 = aElements[2][1] * Cos + aElements[2][2] * Sin; - Temp31 = aElements[3][1] * Cos + aElements[3][2] * Sin; - - Temp02 = aElements[0][1] * -Sin + aElements[0][2] * Cos; - Temp12 = aElements[1][1] * -Sin + aElements[1][2] * Cos; - Temp22 = aElements[2][1] * -Sin + aElements[2][2] * Cos; - Temp32 = aElements[3][1] * -Sin + aElements[3][2] * Cos; - - lpM->_12 = Temp01; - lpM->_22 = Temp11; - lpM->_32 = Temp21; - lpM->_42 = Temp31; - lpM->_13 = Temp02; - lpM->_23 = Temp12; - lpM->_33 = Temp22; - lpM->_43 = Temp32; -} - -void -ConcatenateYRotation(LPD3DMATRIX lpM, float Degrees ) -{ - float Temp00, Temp10, Temp20, Temp30; - float Temp02, Temp12, Temp22, Temp32; - float aElements[4][4]; - - float Radians = (float)((Degrees/360) * M_PI * 2); - - float Sin = (float)sin(Radians), Cos = (float)cos(Radians); - - memcpy(aElements, lpM, sizeof(D3DMATRIX)); - Temp00 = aElements[0][0] * Cos + aElements[0][2] * -Sin; - Temp10 = aElements[1][0] * Cos + aElements[1][2] * -Sin; - Temp20 = aElements[2][0] * Cos + aElements[2][2] * -Sin; - Temp30 = aElements[3][0] * Cos + aElements[3][2] * -Sin; - - Temp02 = aElements[0][0] * Sin + aElements[0][2] * Cos; - Temp12 = aElements[1][0] * Sin + aElements[1][2] * Cos; - Temp22 = aElements[2][0] * Sin + aElements[2][2] * Cos; - Temp32 = aElements[3][0] * Sin + aElements[3][2] * Cos; - - lpM->_11 = Temp00; - lpM->_21 = Temp10; - lpM->_31 = Temp20; - lpM->_41 = Temp30; - lpM->_13 = Temp02; - lpM->_23 = Temp12; - lpM->_33 = Temp22; - lpM->_43 = Temp32; -} - -void -ConcatenateZRotation(LPD3DMATRIX lpM, float Degrees ) -{ - float Temp00, Temp10, Temp20, Temp30; - float Temp01, Temp11, Temp21, Temp31; - float aElements[4][4]; - - float Radians = (float)((Degrees/360) * M_PI * 2); - - float Sin = (float)sin(Radians), Cos = (float)cos(Radians); - - memcpy(aElements, lpM, sizeof(D3DMATRIX)); - Temp00 = aElements[0][0] * Cos + aElements[0][1] * Sin; - Temp10 = aElements[1][0] * Cos + aElements[1][1] * Sin; - Temp20 = aElements[2][0] * Cos + aElements[2][1] * Sin; - Temp30 = aElements[3][0] * Cos + aElements[3][1] * Sin; - - Temp01 = aElements[0][0] * -Sin + aElements[0][1] * Cos; - Temp11 = aElements[1][0] * -Sin + aElements[1][1] * Cos; - Temp21 = aElements[2][0] * -Sin + aElements[2][1] * Cos; - Temp31 = aElements[3][0] * -Sin + aElements[3][1] * Cos; - - lpM->_11 = Temp00; - lpM->_21 = Temp10; - lpM->_31 = Temp20; - lpM->_41 = Temp30; - lpM->_12 = Temp01; - lpM->_22 = Temp11; - lpM->_32 = Temp21; - lpM->_42 = Temp31; -} diff --git a/sdk/samples/flipcube/flipcube.def b/sdk/samples/flipcube/flipcube.def deleted file mode 100644 index b964ebd..0000000 --- a/sdk/samples/flipcube/flipcube.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME flipcube.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/flipcube/makefile b/sdk/samples/flipcube/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/flipcube/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/flipcube/msvc.mk b/sdk/samples/flipcube/msvc.mk deleted file mode 100644 index f7aa2ed..0000000 --- a/sdk/samples/flipcube/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = flipcube -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = flipcube.obj d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj d3dmain.obj stats.obj d3dmath.obj lclib.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT = -DD3DDEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/flipcube/readme.txt b/sdk/samples/flipcube/readme.txt deleted file mode 100644 index def0b8d..0000000 --- a/sdk/samples/flipcube/readme.txt +++ /dev/null @@ -1,17 +0,0 @@ -Flipcube -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -A cube is created and spun through mouse and keyboard input. The -world matrix is changed in response to mouse and keyboard input and -set before rendering each frame. Keyboard and mouse cues: - - F11 - closer - F12 - further - left-mouse drag - spin with mouse movement - right-mouse click - resume spinning - -Vertices are not shared because the normals are different for each -side. Each side is covered by a separate material. -DLIGHTSTATE_MATERIAL must be set and D3DPROCESSVERTICES_TRANSFORMLIGHT -must be called for each side of the cube. diff --git a/sdk/samples/fly/fly.c b/sdk/samples/fly/fly.c deleted file mode 100644 index f865545..0000000 --- a/sdk/samples/fly/fly.c +++ /dev/null @@ -1,374 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: fly.c - * - ***************************************************************************/ - -/* - * landscape fly by - */ - -#include -#include -#include "rmdemo.h" - -typedef struct PATHINFO { - D3DVALUE t; - LPDIRECT3DRMFRAME chase; - LPDIRECT3DRMFRAME plane_frame; - LPDIRECT3DRMANIMATION flight_path; -} pathInfo; - -#define NUM_SMOKE 7 -int smoke_num = 0; -int done_all = 0; - -LPDIRECT3DRMFRAME smoke[NUM_SMOKE]; - -static void CDECL cleanupObjects(LPDIRECT3DRMOBJECT obj, void* arg) -{ - pathInfo *info = (pathInfo*) arg; - int i; - - for (i = 0; i < NUM_SMOKE; i++) - smoke[i]->lpVtbl->Release(smoke[i]); - info->chase->lpVtbl->Release(info->chase); - info->plane_frame->lpVtbl->Release(info->plane_frame); - info->flight_path->lpVtbl->Release(info->flight_path); -} - -static void CDECL moveCamera(LPDIRECT3DRMFRAME camera, void *arg, D3DVALUE delta) -{ - D3DVECTOR dir, up; - D3DVECTOR dirCam, upCam; - struct PATHINFO *info; - LPDIRECT3DRMFRAME scene; - D3DVALUE a_bit; - - info = (struct PATHINFO *) arg; - camera->lpVtbl->GetScene(camera, &scene); - info->t += D3DVAL(0.04); - info->flight_path->lpVtbl->SetFrame(info->flight_path, camera); - info->flight_path->lpVtbl->SetTime(info->flight_path, info->t); - - info->flight_path->lpVtbl->SetFrame(info->flight_path, info->plane_frame); - info->flight_path->lpVtbl->SetTime(info->flight_path, info->t + D3DVAL(0.5)); - - info->flight_path->lpVtbl->SetFrame(info->flight_path, info->chase); - info->flight_path->lpVtbl->SetTime(info->flight_path, info->t + D3DVAL(1.0)); - - camera->lpVtbl->LookAt(camera, info->plane_frame, scene, D3DRMCONSTRAIN_Z); - info->plane_frame->lpVtbl->LookAt(info->plane_frame, info->chase,scene, - D3DRMCONSTRAIN_Y); - camera->lpVtbl->GetOrientation(camera, scene, &dirCam, &upCam); - info->plane_frame->lpVtbl->GetOrientation(info->plane_frame, scene, - &dir, &up); - up.x = dir.x - dirCam.x; - up.y = dir.y - dirCam.y + D3DVAL(1.0); - up.z = dir.z - dirCam.z; - - info->plane_frame->lpVtbl->SetOrientation(info->plane_frame, scene, - dir.x, dir.y, dir.z, - up.x, up.y, up.z); - - if (done_all < NUM_SMOKE) { - scene->lpVtbl->AddVisual(scene, (LPDIRECT3DRMVISUAL) smoke[smoke_num]); - done_all++; - } else { - if (smoke_num == NUM_SMOKE) { - smoke_num = 0; - } - } - a_bit = D3DDivide(D3DDivide(D3DVAL(smoke_num), D3DVAL(NUM_SMOKE)), - D3DVAL(10.0)); - info->flight_path->lpVtbl->SetFrame(info->flight_path, smoke[smoke_num]); - info->flight_path->lpVtbl->SetTime(info->flight_path, - info->t + D3DVAL(0.4) - a_bit); - smoke[smoke_num]->lpVtbl->SetOrientation(smoke[smoke_num], scene, - dir.x, dir.y, dir.z, - up.x, up.y, up.z); - smoke_num++; - scene->lpVtbl->Release(scene); -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMFRAME lights = NULL; - D3DRMBOX box; - LPDIRECT3DRMMESHBUILDER plane_builder = NULL; - LPDIRECT3DRMMESHBUILDER mesh_builder = NULL; - LPDIRECT3DRMMESHBUILDER smoke_builder = NULL; - LPDIRECT3DRMMESH plane = NULL; - LPDIRECT3DRMMESH mesh = NULL; - LPDIRECT3DRMMESH smokemesh = NULL; - LPDIRECT3DRMLIGHT ambient = NULL; - LPDIRECT3DRMLIGHT parallel = NULL; - D3DCOLOR smokec; - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMFRAME sl = NULL; - LPDIRECT3DRMFRAME sr = NULL; - HRESULT rval; - int i; - int numPts = 11; - D3DVECTOR path[] = { - -D3DVAL(8.0), D3DVAL(3.0), -D3DVAL(12.0), - -D3DVAL(4.0), D3DVAL(2.0), -D3DVAL(8.0), - -D3DVAL(2.0), D3DVAL(0.0), -D3DVAL(4.0), - D3DVAL(9.0), -D3DVAL(1.0), D3DVAL(7.0), - D3DVAL(4.0), D3DVAL(6.0), D3DVAL(10.0), - -D3DVAL(4.0), D3DVAL(5.0), D3DVAL(9.0), - D3DVAL(5.5), D3DVAL(3.5), -D3DVAL(6.5), - D3DVAL(2.0), D3DVAL(5.0), -D3DVAL(10.0), - D3DVAL(0.0), D3DVAL(4.0), -D3DVAL(15.0), - -D3DVAL(5.0), D3DVAL(4.0), -D3DVAL(15.0), - -D3DVAL(8.0), D3DVAL(3.0), -D3DVAL(12.0) - }; - D3DVALUE path_t[] = { - D3DVAL(0), D3DVAL(1), D3DVAL(2), D3DVAL(3), D3DVAL(4), D3DVAL(5), D3DVAL(6), D3DVAL(7), D3DVAL(8), D3DVAL(9), D3DVAL(10) - }; - static pathInfo info; - - if (FAILED(view->lpVtbl->SetField(view, D3DVAL(0.8)))) - goto generic_error; - if (FAILED(dev->lpVtbl->SetQuality(dev, D3DRMRENDER_GOURAUD))) - goto generic_error; -#ifdef FOG - if (FAILED(dev->lpVtbl->SetDither(dev, TRUE))) - goto generic_error; - if (FAILED(scene->lpVtbl->SetFogEnable(scene, TRUE))) - goto generic_error; - if (FAILED(scene->lpVtbl->SetFogParams(scene, 1, 30, 1))) - goto generic_error; -#endif - - /* - * This Demo flies a plane through a small landscape, followed by a - * camera. The paths are spline curves. - */ - - /* - * Initialise smoke trail - */ - smokec = D3DRMCreateColorRGBA(D3DVAL(0.6), D3DVAL(0.6), D3DVAL(0.6), - D3DVAL(0.5)); - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &smoke_builder))) - goto generic_error; - rval = smoke_builder->lpVtbl->Load(smoke_builder, "sphere0.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere0.x.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(smoke_builder->lpVtbl->Scale(smoke_builder, D3DVAL(0.015), D3DVAL(0.015), - D3DVAL(0.015)))) - goto generic_error; - - if (FAILED(smoke_builder->lpVtbl->CreateMesh(smoke_builder, &smokemesh))) - goto generic_error; - for (i = 0; i < NUM_SMOKE; i++) { - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &smoke[i]))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, smoke[i], &sl))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, smoke[i], &sr))) - goto generic_error; - - if (FAILED(sl->lpVtbl->AddVisual(sl, (LPDIRECT3DRMVISUAL) smokemesh))) - goto generic_error; - if (FAILED(sr->lpVtbl->AddVisual(sr, (LPDIRECT3DRMVISUAL) smokemesh))) - goto generic_error; - if (FAILED(sr->lpVtbl->SetPosition(sr, smoke[i], D3DVAL(-0.1), D3DVAL(0.0), - D3DVAL(0.0)))) - goto generic_error; - if (FAILED(smoke[i]->lpVtbl->SetMaterialMode(smoke[i], D3DRMMATERIAL_FROMFRAME))) - goto generic_error; - if (FAILED(smoke[i]->lpVtbl->SetColor(smoke[i], smokec))) - goto generic_error; - if (FAILED(sl->lpVtbl->SetMaterialMode(sl, D3DRMMATERIAL_FROMPARENT))) - goto generic_error; - if (FAILED(sr->lpVtbl->SetMaterialMode(sr, D3DRMMATERIAL_FROMPARENT))) - goto generic_error; - RELEASE(sl); - RELEASE(sr); - } - /* - * initialize the lights in the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(5.0), D3DVAL(5.0), - -D3DVAL(5.0)))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_PARALLELPOINT, D3DVAL(0.8), - D3DVAL(0.6), D3DVAL(0.7), ¶llel))) - goto generic_error; - - if (FAILED(lights->lpVtbl->AddLight(lights, parallel))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &ambient))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, ambient))) - goto generic_error; - - /* - * load mesh file - */ - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &mesh_builder))) - goto generic_error; - if (FAILED(mesh_builder->lpVtbl->Load(mesh_builder, "land4.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL))) - goto generic_error; - if (FAILED(mesh_builder->lpVtbl->Scale(mesh_builder, D3DVAL(10.0), D3DVAL(8.0), - D3DVAL(10.0)))) - goto generic_error; - if (FAILED(mesh_builder->lpVtbl->GetBox(mesh_builder, &box))) - goto generic_error; - - /* - * Color the landscape's faces. - */ - if (mesh_builder) { - LPDIRECT3DRMFACEARRAY faces; - LPDIRECT3DRMFACE this_face; - int face_count, vertex_count; - int j; - D3DVALUE range, height; - D3DVECTOR *coords; - - if (FAILED(mesh_builder->lpVtbl->GetFaces(mesh_builder, &faces))) - goto generic_error; - face_count = faces->lpVtbl->GetSize(faces); - - range = box.max.y - box.min.y; - - /* - * color the faces according to the height - */ - for (i = 0; i < face_count; i++) { - faces->lpVtbl->GetElement(faces, i, &this_face); - vertex_count = this_face->lpVtbl->GetVertexCount(this_face); - coords = (LPD3DVECTOR) malloc(vertex_count * sizeof(D3DVECTOR)); - this_face->lpVtbl->GetVertices(this_face, &vertex_count, - coords, NULL); - if (vertex_count) { - /* - * find maximum height of the face - */ - height = coords[0].y; - for (j = 1; j < vertex_count; j++) { - if (coords[j].y > height) - height = coords[j].y; - } - height = D3DDivide((height - box.min.y), range); - - if (height < D3DVAL(0.03)) /* water */ - this_face->lpVtbl->SetColorRGB(this_face, - D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.5)); - else if (height < D3DVAL(0.3)) /* greenery */ - this_face->lpVtbl->SetColorRGB(this_face, - D3DVAL(0.1), D3DVAL(0.8), D3DVAL(0.1)); - else if (height < D3DVAL(0.5)) /* rocks */ - this_face->lpVtbl->SetColorRGB(this_face, D3DVAL(0.6), - D3DVAL(0.3),D3DVAL(0.3)); - else if (height < D3DVAL(0.7)) /* dirty snow */ - this_face->lpVtbl->SetColorRGB(this_face, D3DVAL(0.8), - D3DVAL(0.65), - D3DVAL(0.65)); - else /* snow */ - this_face->lpVtbl->SetColorRGB(this_face, D3DVAL(1.0), - D3DVAL(1.0),D3DVAL(1.0)); - } - free(coords); - RELEASE(this_face); - } - RELEASE(faces); - } - if (FAILED(mesh_builder->lpVtbl->CreateMesh(mesh_builder, &mesh))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddVisual(frame, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &plane_builder))) - goto generic_error; - rval = plane_builder->lpVtbl->Load(plane_builder, "dropship.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load dropship.x.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(plane_builder->lpVtbl->Scale(plane_builder, D3DVAL(0.015), - D3DVAL(0.008), D3DVAL(0.015)))) - goto generic_error; - if (FAILED(plane_builder->lpVtbl->CreateMesh(plane_builder, &plane))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateAnimation(lpD3DRM, &info.flight_path))) - goto generic_error; - info.flight_path->lpVtbl->SetOptions(info.flight_path, D3DRMANIMATION_CLOSED - | D3DRMANIMATION_SPLINEPOSITION - | D3DRMANIMATION_POSITION); - for (i = 0; i < numPts; i++) - info.flight_path->lpVtbl->AddPositionKey(info.flight_path, path_t[i], - path[i].x, - path[i].y, path[i].z); - - info.t = D3DVAL(0.0); - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &info.chase))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &info.plane_frame))) - goto generic_error; - if (FAILED(info.plane_frame->lpVtbl->AddVisual(info.plane_frame, - (LPDIRECT3DRMVISUAL) plane))) - goto generic_error; - - if (FAILED(camera->lpVtbl->AddMoveCallback(camera, moveCamera, (void *) &info))) - goto generic_error; - if (FAILED(camera->lpVtbl->AddDestroyCallback(camera, cleanupObjects, &info))) - goto generic_error; - - RELEASE(lights); - RELEASE(plane_builder); - RELEASE(mesh_builder); - RELEASE(smoke_builder); - RELEASE(plane); - RELEASE(mesh); - RELEASE(smokemesh); - RELEASE(ambient); - RELEASE(parallel); - RELEASE(frame); - return TRUE; - -generic_error: - Msg("A failure has occurred while building the scene.\n"); -ret_with_error: - RELEASE(lights); - RELEASE(plane_builder); - RELEASE(mesh_builder); - RELEASE(smoke_builder); - RELEASE(plane); - RELEASE(mesh); - RELEASE(smokemesh); - RELEASE(ambient); - RELEASE(parallel); - RELEASE(frame); - RELEASE(sl); - RELEASE(sr); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bNoTextures = TRUE; - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Fly Direct3DRM Example"); -} diff --git a/sdk/samples/fly/fly.def b/sdk/samples/fly/fly.def deleted file mode 100644 index a98c848..0000000 --- a/sdk/samples/fly/fly.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME fly.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/fly/makefile b/sdk/samples/fly/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/fly/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/fly/msvc.mk b/sdk/samples/fly/msvc.mk deleted file mode 100644 index aac1beb..0000000 --- a/sdk/samples/fly/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = fly -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = fly.obj rmfull.obj rmstats.obj d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj lclib.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmfull.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/fly/readme.txt b/sdk/samples/fly/readme.txt deleted file mode 100644 index 537585d..0000000 --- a/sdk/samples/fly/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -Fly -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Using animations to set the position of a spaceship along a curved -path. diff --git a/sdk/samples/foxbear/backlist.dat b/sdk/samples/foxbear/backlist.dat deleted file mode 100644 index 0432733..0000000 --- a/sdk/samples/foxbear/backlist.dat +++ /dev/null @@ -1,15 +0,0 @@ -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 123 118 118 118 118 119 120 118 118 118 118 118 118 118 118 118 121 122 118 118 118 118 -118 118 118 118 118 121 122 118 118 118 118 118 118 118 118 118 119 120 118 118 118 118 123 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 -118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/sdk/samples/foxbear/bmp.c b/sdk/samples/foxbear/bmp.c deleted file mode 100644 index e7a861f..0000000 --- a/sdk/samples/foxbear/bmp.c +++ /dev/null @@ -1,135 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: bmp.c - * Content: Bitmap reader - * - ***************************************************************************/ -#include "foxbear.h" - -/* - * gfxLoadBitmap - */ -GFX_HBM gfxLoadBitmap(LPSTR szFileName) -{ - HFASTFILE pfile; - BITMAPFILEHEADER UNALIGNED *pbf; - BITMAPINFOHEADER UNALIGNED *pbi; - GFX_HBM hbm; - BOOL trans = FALSE; - - pfile = FastFileOpen( szFileName ); - - if( pfile == NULL ) - { - return NULL; - } - - pbf = (BITMAPFILEHEADER *)FastFileLock(pfile, 0, 0); - pbi = (BITMAPINFOHEADER *)(pbf+1); - - if (pbf->bfType != 0x4d42 || - pbi->biSize != sizeof(BITMAPINFOHEADER)) - { - Msg("Failed to load"); - Msg(szFileName); - FastFileClose( pfile ); - return NULL; - } - - /* - * TOTAL HACK for FoxBear, FoxBear does not use any masks, it draws - * sprites with transparent colors, but the code still loads the masks - * if a mask exists the sprite is transparent, else it is not, so - * you cant get rid of the masks or nothing will be transparent!! - * - * if the code tries to load a mask, just return a non-zero value. - */ - - if( pbi->biBitCount == 1 ) - { - Msg("some code is still using masks, stop that!"); - FastFileClose( pfile ); - return NULL; - } - - /* - * ANOTHER TOTAL HACK for FoxBear, some of the bitmaps in FoxBear - * are a solid color, detect these and dont waste VRAM on them. - */ - if( !bTransDest && pbi->biBitCount == 8 ) - { - int x,y; - BYTE c; - BYTE UNALIGNED *pb = (LPBYTE)pbi + pbi->biSize + 256 * sizeof(COLORREF); - RGBQUAD UNALIGNED *prgb = (RGBQUAD *)((LPBYTE)pbi + pbi->biSize); - COLORREF rgb; - - c = *pb; - - for(y=0; y<(int)pbi->biHeight; y++ ) - { - for( x=0; x<(int)pbi->biWidth; x++ ) - { - if (c != *pb++) - goto not_solid; - } - pb += ((pbi->biWidth + 3) & ~3) - pbi->biWidth; - } - - rgb = RGB(prgb[c].rgbRed,prgb[c].rgbGreen,prgb[c].rgbBlue); - hbm = gfxCreateSolidColorBitmap(rgb); - - FastFileClose( pfile ); - return hbm; - } -not_solid: - - /* - * figure out iff the bitmap has the transparent color in it. - */ - if( pbi->biBitCount == 8 ) - { - int x,y; - BYTE UNALIGNED *pb = (LPBYTE)pbi + pbi->biSize + 256 * sizeof(COLORREF); - DWORD UNALIGNED *prgb = (DWORD *)((LPBYTE)pbi + pbi->biSize); - - for(y=0; y<(int)pbi->biHeight && !trans; y++ ) - { - for( x=0; x<(int)pbi->biWidth && !trans; x++ ) - { - if (prgb[*pb++] == 0x00FFFFFF) - trans=TRUE; - } - pb += ((pbi->biWidth + 3) & ~3) - pbi->biWidth; - } - } - - hbm = gfxCreateVramBitmap(pbi, trans); - - if( hbm == NULL ) - { - FastFileClose( pfile ); - return GFX_FALSE; - } - -#if 0 - { - DDSCAPS ddscaps; - - IDirectDrawSurface_GetCaps(((GFX_BITMAP *)hbm)->lpSurface, &ddscaps); - - if( !(ddscaps.dwCaps & DDSCAPS_VIDEOMEMORY) ) - { - Msg( "%s is in system memory", szFileName ); - } - } -#endif - - FastFileClose( pfile ); - - return hbm; - -} /* gfxLoadBitmap */ diff --git a/sdk/samples/foxbear/ddraw.c b/sdk/samples/foxbear/ddraw.c deleted file mode 100644 index 34af64e..0000000 --- a/sdk/samples/foxbear/ddraw.c +++ /dev/null @@ -1,844 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: ddraw.c - * Content: Misc. Direct Draw access routines - * - ***************************************************************************/ -#include "foxbear.h" - -BOOL bUseEmulation; -BOOL bUseSysMem; -int nBufferCount; -int CmdLineBufferCount; -BOOL bTransDest; -BOOL bColorFill; - -HRESULT CALLBACK EnumDisplayModesCallback(LPDDSURFACEDESC pddsd, LPVOID Context); - -/* - * DDEnable - */ -BOOL DDEnable( void ) -{ - LPDIRECTDRAW lpdd; - DDCAPS ddcaps; - HRESULT ddrval; - BOOL use_dest; - - nBufferCount = GetProfileInt( "FoxBear", "buffers", CmdLineBufferCount); - bUseEmulation = GetProfileInt( "FoxBear", "use_emulation", bUseEmulation); - bUseSysMem = GetProfileInt( "FoxBear", "sysmem", 0); - use_dest = GetProfileInt( "FoxBear", "use_dest", 0 ); - - if (lpDD == NULL) - { - if( bUseEmulation ) - { - ddrval = DirectDrawCreate( (LPVOID) DDCREATE_EMULATIONONLY, &lpdd, NULL ); - } - else - { - ddrval = DirectDrawCreate( NULL, &lpdd, NULL ); - } - } - else - { - lpdd = lpDD; - ddrval = DD_OK; - } - - if( ddrval != DD_OK ) - { - Msg("DirectDrawCreate failed err=%d", ddrval); - goto error; - } - - /* - * grab exclusive mode if we are going to run as fullscreen - * otherwise grab normal mode. - */ - if (lpDD == NULL) - { - NumModes = 0; - - if (bFullscreen) - { - ddrval = IDirectDraw_SetCooperativeLevel( lpdd, hWndMain, - DDSCL_ALLOWMODEX | - DDSCL_EXCLUSIVE | - DDSCL_FULLSCREEN ); - - // in fullscreen mode, enumeratte the available modes - IDirectDraw_EnumDisplayModes(lpdd, 0, NULL, 0, EnumDisplayModesCallback); - } - else - { - ddrval = IDirectDraw_SetCooperativeLevel( lpdd, hWndMain, - DDSCL_NORMAL ); - - // in normal windowed mode, just add some "stock" window - // sizes - - ModeList[NumModes].w = 320; - ModeList[NumModes].h = 200; - NumModes++; - - ModeList[NumModes].w = 320; - ModeList[NumModes].h = 240; - NumModes++; - - ModeList[NumModes].w = 512; - ModeList[NumModes].h = 384; - NumModes++; - - ModeList[NumModes].w = 640; - ModeList[NumModes].h = 400; - NumModes++; - - ModeList[NumModes].w = 640; - ModeList[NumModes].h = 480; - NumModes++; - } - - if( ddrval != DD_OK ) - { - Msg("SetCooperativeLevel failed err=%d", ddrval); - goto error; - } - } - - if (bFullscreen) - { - Msg("SetDisplayMode %d %d %d",GameMode.cx,GameMode.cy, GameBPP); - ddrval = IDirectDraw_SetDisplayMode( lpdd, - GameMode.cx, GameMode.cy, GameBPP); - - if (ddrval != DD_OK && (GameMode.cx != 640 || GameMode.cy != 480)) - { - Msg( "cant set mode trying 640x480" ); - - GameMode.cx = 640; - GameMode.cy = 480; - GameSize = GameMode; - - ddrval = IDirectDraw_SetDisplayMode( lpdd, - GameMode.cx, GameMode.cy, GameBPP); - } - - if (ddrval != DD_OK && GameBPP != 8) - { - Msg( "cant set mode trying 640x480x8" ); - - GameBPP = 8; - - ddrval = IDirectDraw_SetDisplayMode( lpdd, - GameMode.cx, GameMode.cy, GameBPP); - } - - if (ddrval != DD_OK && GameBPP != 16) - { - Msg( "cant set mode trying 640x480x16" ); - - GameBPP = 16; - - ddrval = IDirectDraw_SetDisplayMode( lpdd, - GameMode.cx, GameMode.cy, GameBPP); - } - - if( ddrval != DD_OK ) - { - Msg("SetMode failed err=%d", ddrval); - goto error; - } - } - else - { - RECT rcWork; - RECT rc; - HDC hdc; - DWORD dwStyle; - - // - // when in rome (I mean when in windows) we should use the - // current mode - // - hdc = GetDC(NULL); - GameBPP = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(NULL, hdc); - - // - // if we are still a WS_POPUP window we should convert to a - // normal app window so we look like a windows app. - // - dwStyle = GetWindowStyle(hWndMain); - dwStyle &= ~WS_POPUP; - dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX; - SetWindowLong(hWndMain, GWL_STYLE, dwStyle); - - if (bStretch) - SetRect(&rc, 0, 0, GameMode.cx*2, GameMode.cy*2); - else - SetRect(&rc, 0, 0, GameMode.cx, GameMode.cy); - - AdjustWindowRectEx(&rc, - GetWindowStyle(hWndMain), - GetMenu(hWndMain) != NULL, - GetWindowExStyle(hWndMain)); - - SetWindowPos(hWndMain, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - - SetWindowPos(hWndMain, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); - - // - // make sure our window does not hang outside of the work area - // this will make people who have the tray on the top or left - // happy. - // - SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0); - GetWindowRect(hWndMain, &rc); - if (rc.left < rcWork.left) rc.left = rcWork.left; - if (rc.top < rcWork.top) rc.top = rcWork.top; - SetWindowPos(hWndMain, NULL, rc.left, rc.top, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - } - - /* - * check capabilites - */ - ddcaps.dwSize = sizeof( ddcaps ); - ddrval = IDirectDraw_GetCaps( lpdd, &ddcaps, NULL ); - - if( ddrval != DD_OK ) - { - Msg("GetCaps failed err=%d", ddrval); - goto error; - } - - if( ddcaps.dwCaps & DDCAPS_NOHARDWARE ) - { - Msg( "No hardware support at all" ); - } - - if( ddcaps.dwCaps & DDCAPS_BLTCOLORFILL ) - { - bColorFill = TRUE; - Msg( "Device supports color fill" ); - } - else - { - bColorFill = FALSE; - Msg( "Device does not support color fill" ); - } - - /* - * default to double buffered on 1mb, triple buffered - * on > 1mb - */ - if (nBufferCount == 0) - { - if( ddcaps.dwVidMemTotal <= 1024L*1024L*(GameBPP/8) || - GameMode.cx > 640 ) - { - Msg("double buffering (not enough memory)"); - nBufferCount = 2; - } - else - { - Msg("triple buffering"); - nBufferCount = 3; - } - } - - if( ddcaps.dwCaps & DDCAPS_COLORKEY ) - { - if( ddcaps.dwCKeyCaps & DDCKEYCAPS_SRCBLT ) - { - Msg( "Can do Src colorkey in hardware" ); - } - - if( ddcaps.dwCKeyCaps & DDCKEYCAPS_DESTBLT ) - { - Msg( "Can do Dest colorkey in hardware" ); - if( use_dest || !(ddcaps.dwCKeyCaps & DDCKEYCAPS_SRCBLT) ) - { - /* - * since direct draw doesn't support - * destination color key in emulation, only - * use it if there is enough vram ... - */ - if( ddcaps.dwVidMemTotal >= 2 * 1024L*1024L*(GameBPP/8) ) - { - Msg( "Using destination color key" ); - bTransDest = TRUE; - } - } - } - } - else - { - Msg( "Can't do color key in hardware!" ); - } - - lpDD = lpdd; - return TRUE; - -error: - return FALSE; - -} /* DDEnable */ - -/* - * DDDisable - */ -BOOL DDDisable( BOOL fFinal ) -{ - if( lpClipper ) - { - IDirectDrawClipper_Release(lpClipper); - lpClipper = NULL; - } - - if( lpBackBuffer ) - { - IDirectDrawSurface_Release(lpBackBuffer); - lpBackBuffer = NULL; - } - - if( lpFrontBuffer ) - { - IDirectDrawSurface_Release(lpFrontBuffer); - lpFrontBuffer = NULL; - } - - if( lpStretchBuffer ) - { - IDirectDrawSurface_Release(lpStretchBuffer); - lpStretchBuffer = NULL; - } - - // - // fFinal is TRUE when the app is exiting, FALSE if we are - // just seting a new game size.. - // - if ( fFinal ) - { - if( lpDD != NULL ) - { - IDirectDraw_Release( lpDD ); - lpDD = NULL; - } - } - - return TRUE; -} - -/* - * DDClear - * - * clear the front buffer and all backbuffers. - */ -BOOL DDClear( void ) -{ - DDBLTFX ddbltfx; - int i; - HRESULT ddrval; - - UpdateWindow(hWndMain); - - ddbltfx.dwSize = sizeof( ddbltfx ); - ddbltfx.dwFillColor = DDColorMatch(lpBackBuffer, RGB(0, 0, 200)); - - if (bFullscreen) - { - /* - * do it for all buffers, we either have 1 or 2 back buffers - * make sure we get them all, 4 is plenty! - */ - for( i=0; i<4; i++ ) - { - ddrval = IDirectDrawSurface_Blt( - lpBackBuffer, // dest surface - NULL, // dest rect - NULL, // src surface - NULL, // src rect - DDBLT_COLORFILL | DDBLT_WAIT, - &ddbltfx); - - if( ddrval != DD_OK ) - { - Msg("Fill failed ddrval =0x%08lX", ddrval); - return FALSE; - } - - ddrval = IDirectDrawSurface_Flip(lpFrontBuffer, NULL, DDFLIP_WAIT); - - if( ddrval != DD_OK ) - { - Msg("Flip failed ddrval =0x%08lX", ddrval ); - return FALSE; - } - } - } - else - { - ddrval = IDirectDrawSurface_Blt( - lpFrontBuffer, // dest surface - &rcWindow, // dest rect - NULL, // src surface - NULL, // src rect - DDBLT_COLORFILL | DDBLT_WAIT, - &ddbltfx); - - if( ddrval != DD_OK ) - { - Msg("Fill failed ddrval =0x%08lX", ddrval); - return FALSE; - } - } - - return TRUE; - -} /* DDClear */ - -/* - * DDCreateFlippingSurface - * - * create a FrontBuffer and a BackBuffer(s) - * - */ -BOOL DDCreateFlippingSurface( void ) -{ - DDPIXELFORMAT ddpf; - DDSURFACEDESC ddsd; - HRESULT ddrval; - DDSCAPS ddscaps; - DDCAPS ddcaps; - - ddcaps.dwSize = sizeof( ddcaps ); - - if( IDirectDraw_GetCaps( lpDD, &ddcaps, NULL ) != DD_OK ) - return FALSE; - - /* - * fill in surface desc: - * want a primary surface with 2 back buffers - */ - ZeroMemory( &ddsd, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - - if (bFullscreen && nBufferCount > 1) - { - // - // fullscreen case, create a primary (ie front) and - // either 1 or 2 back buffers - // - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = nBufferCount-1; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | DDSCAPS_COMPLEX; - - OutputDebugString("Creating multiple backbuffer primary\n\r"); - ddrval = IDirectDraw_CreateSurface( lpDD, &ddsd, &lpFrontBuffer, NULL ); - - if( ddrval != DD_OK ) - { - Msg( "CreateSurface FAILED! %08lx", ddrval ); - return FALSE; - } - - /* - * go find the back buffer - */ - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - ddrval = IDirectDrawSurface_GetAttachedSurface( - lpFrontBuffer, - &ddscaps, - &lpBackBuffer ); - - if( ddrval != DD_OK ) - { - Msg( "GetAttachedSurface failed! err=%d",ddrval ); - return FALSE; - } - - /* - * if we are stretching create a buffer to stretch into - * - * NOTE we always make this buffer in system memory because - * we render to the backbuffer (in VRAM) at half the size - * now we need to stretch into the backbuffer. we could just - * do a VRAM->VRAM stretch, but this is REAL REAL REAL slow on - * some cards (banked cards..) - */ - if( bStretch && (ddcaps.dwCaps & DDCAPS_BANKSWITCHED) ) - { - Msg( "On bank switched hardware, creating stretch buffer" ); - lpStretchBuffer = DDCreateSurface( GameSize.cx, GameSize.cy, - TRUE, FALSE ); - } - } - else if (bFullscreen && nBufferCount == 1) - { - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - OutputDebugString("Creating no backbuffer primary\n\r"); - ddrval = IDirectDraw_CreateSurface( lpDD, &ddsd, &lpFrontBuffer, NULL ); - - if( ddrval != DD_OK ) - { - Msg( "CreateSurface FAILED! %08lx", ddrval ); - return FALSE; - } - - IDirectDrawSurface_AddRef(lpFrontBuffer); - lpBackBuffer = lpFrontBuffer; - } - else - { - // - // window case, create the primary surface - // and create a backbuffer in offscreen memory. - // - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - ddrval = IDirectDraw_CreateSurface( lpDD, &ddsd, &lpFrontBuffer, NULL ); - - if( ddrval != DD_OK ) - { - Msg( "CreateSurface FAILED! %08lx", ddrval ); - return FALSE; - } - - lpBackBuffer = DDCreateSurface( GameSize.cx, GameSize.cy, FALSE, FALSE ); - - if( lpBackBuffer == NULL ) - { - Msg( "Cant create the backbuffer" ); - return FALSE; - } - - // - // now create a DirectDrawClipper object. - // - ddrval = IDirectDraw_CreateClipper(lpDD, 0, &lpClipper, NULL); - - if( ddrval != DD_OK ) - { - Msg("Cant create clipper"); - return FALSE; - } - - ddrval = IDirectDrawClipper_SetHWnd(lpClipper, 0, hWndMain); - - if( ddrval != DD_OK ) - { - Msg("Cant set clipper window handle"); - return FALSE; - } - - ddrval = IDirectDrawSurface_SetClipper(lpFrontBuffer, lpClipper); - - if( ddrval != DD_OK ) - { - Msg("Cant attach clipper to front buffer"); - return FALSE; - } - } - - /* - * init the color key - */ - ddpf.dwSize = sizeof(ddpf); - IDirectDrawSurface_GetPixelFormat(lpFrontBuffer, &ddpf); - - /* - * we use white as the color key, if we are in a 8bpp mode, we know - * what white is (because we use a 332 palette) if we are not in a - * a 8bpp mode we dont know what white is and we need to figure it - * out from the device (remember 16bpp comes in two common flavors - * 555 and 565). if we wanted to any random color as the color key - * we would call DDColorMatch (see below) to convert a RGB into a - * physical color. - */ - if (ddpf.dwRGBBitCount == 8) - dwColorKey = 0xff; - else - dwColorKey = ddpf.dwRBitMask | ddpf.dwGBitMask | ddpf.dwBBitMask; - - Msg("dwColorKey = 0x%08lX", dwColorKey); - - if( bTransDest ) - { - DDCOLORKEY ddck; - ddck.dwColorSpaceLowValue = dwColorKey; - ddck.dwColorSpaceHighValue = dwColorKey; - IDirectDrawSurface_SetColorKey( lpBackBuffer, DDCKEY_DESTBLT, &ddck); - } - - return TRUE; - -} /* DDCreateFlippingSurface */ - -/* - * DDCreateSurface - */ -LPDIRECTDRAWSURFACE DDCreateSurface( - DWORD width, - DWORD height, - BOOL sysmem, - BOOL trans ) -{ - DDSURFACEDESC ddsd; - HRESULT ddrval; - DDCOLORKEY ddck; - LPDIRECTDRAWSURFACE psurf; - - - /* - * fill in surface desc - */ - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - if( sysmem || bUseSysMem ) - { - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } - - ddsd.dwHeight = height; - ddsd.dwWidth = width; - - ddrval = IDirectDraw_CreateSurface( lpDD, &ddsd, &psurf, NULL ); - - /* - * set the color key for this bitmap - */ - if( ddrval == DD_OK ) - { - if( trans && !bTransDest ) - { - ddck.dwColorSpaceLowValue = dwColorKey; - ddck.dwColorSpaceHighValue = dwColorKey; - IDirectDrawSurface_SetColorKey( psurf, DDCKEY_SRCBLT, &ddck); - } - } - else - { - Msg( "CreateSurface FAILED, rc = %ld", (DWORD) LOWORD( ddrval ) ); - psurf = NULL; - } - - return psurf; - -} /* DDCreateSurface */ - -DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb) -{ - COLORREF rgbT; - HDC hdc; - DWORD dw = CLR_INVALID; - DDSURFACEDESC ddsd; - HRESULT hres; - - if (IDirectDrawSurface_GetDC(pdds, &hdc) == DD_OK) - { - rgbT = GetPixel(hdc, 0, 0); - SetPixel(hdc, 0, 0, rgb); - IDirectDrawSurface_ReleaseDC(pdds, hdc); - } - - ddsd.dwSize = sizeof(ddsd); - hres = IDirectDrawSurface_Lock( - pdds, NULL, &ddsd, DDLOCK_WAIT, NULL); - - if (hres == DD_OK) - { - dw = *(DWORD *)ddsd.lpSurface; - if(ddsd.ddpfPixelFormat.dwRGBBitCount != 32) - dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1; - IDirectDrawSurface_Unlock(pdds, NULL); - } - else - { - IDirectDrawSurface_GetSurfaceDesc(pdds,&ddsd); - if(ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - Msg("Failed to lock Primary Surface!"); - else - Msg("Failed to lock NON-PRIMARY Surface!"); - } - - if (IDirectDrawSurface_GetDC(pdds, &hdc) == DD_OK) - { - SetPixel(hdc, 0, 0, rgbT); - IDirectDrawSurface_ReleaseDC(pdds, hdc); - } - - return dw; -} - -/* - * ReadPalFile - * - * Create a DirectDrawPalette from a palette file - * - * if the palette files cant be found, make a default 332 palette - */ -LPDIRECTDRAWPALETTE ReadPalFile( char *fname ) -{ - int i; - int fh; - HRESULT ddrval; - IDirectDrawPalette *ppal; - - struct { - DWORD dwRiff; - DWORD dwFileSize; - DWORD dwPal; - DWORD dwData; - DWORD dwDataSize; - WORD palVersion; - WORD palNumEntries; - PALETTEENTRY ape[256]; - } pal; - - pal.dwRiff = 0; - - if (fname) - { - fh = _lopen( fname, OF_READ); - - if (fh != -1) - { - _lread(fh, &pal, sizeof(pal)); - _lclose(fh); - } - } - - /* - * if the file is not a palette file, or does not exist - * default to a 332 palette - */ - if (pal.dwRiff != 0x46464952 || // 'RIFF' - pal.dwPal != 0x204C4150 || // 'PAL ' - pal.dwData != 0x61746164 || // 'data' - pal.palVersion != 0x0300 || - pal.palNumEntries > 256 || - pal.palNumEntries < 1) - { - Msg("Can't open palette file, using default 332."); - - for( i=0; i<256; i++ ) - { - pal.ape[i].peRed = (BYTE)(((i >> 5) & 0x07) * 255 / 7); - pal.ape[i].peGreen = (BYTE)(((i >> 2) & 0x07) * 255 / 7); - pal.ape[i].peBlue = (BYTE)(((i >> 0) & 0x03) * 255 / 3); - pal.ape[i].peFlags = (BYTE)0; - } - } - - ddrval = IDirectDraw_CreatePalette( - lpDD, - DDPCAPS_8BIT, - pal.ape, - &ppal, - NULL ); - return ppal; - -} /* ReadPalFile */ - - -/* - * Splash - * - * Draw a splash screen during startup - * NOTE the screen has been cleared in DDCreateFlippingSurface - */ -void Splash( void ) -{ - HDC hdc; - HRESULT err; - - DDClear(); - - if ((err = IDirectDrawSurface_GetDC(lpFrontBuffer, &hdc)) == DD_OK) - { - char *szMsg = "FoxBear is loading.......please wait."; - SetTextColor(hdc, RGB(255,255,255)); - SetBkMode(hdc, TRANSPARENT); - TextOut(hdc, rcWindow.left, rcWindow.top, szMsg, lstrlen(szMsg)); - IDirectDrawSurface_ReleaseDC(lpFrontBuffer, hdc); - } - else - { - Msg("GetDC failed! 0x%x",err); - } - -} /* Splash */ - -/* - * MEMORY ALLOCATION ROUTINES... - */ - -/* - * MemAlloc - */ -LPVOID MemAlloc( UINT size ) -{ - LPVOID ptr; - - ptr = LocalAlloc( LPTR, size ); - return ptr; - -} /* MemAlloc */ - -/* - * CMemAlloc - */ -LPVOID CMemAlloc( UINT cnt, UINT isize ) -{ - DWORD size; - LPVOID ptr; - - size = cnt * isize; - ptr = LocalAlloc( LPTR, size ); - return ptr; - -} /* CMemAlloc */ - -/* - * MemFree - */ -void MemFree( LPVOID ptr ) -{ - if( ptr != NULL ) - { - LocalFree( ptr ); - } - -} /* MemFree */ - -HRESULT CALLBACK EnumDisplayModesCallback(LPDDSURFACEDESC pddsd, LPVOID Context) -{ - Msg("Mode: %dx%dx%d", pddsd->dwWidth, pddsd->dwHeight,pddsd->ddpfPixelFormat.dwRGBBitCount); - if( - (ModeList[NumModes-1].w == (int)pddsd->dwWidth)&& - (ModeList[NumModes-1].h == (int)pddsd->dwHeight)&& - (ModeList[NumModes-1].bpp == (int)pddsd->ddpfPixelFormat.dwRGBBitCount) - ) - return DDENUMRET_OK; - ModeList[NumModes].w = pddsd->dwWidth; - ModeList[NumModes].h = pddsd->dwHeight; - ModeList[NumModes].bpp = pddsd->ddpfPixelFormat.dwRGBBitCount; - NumModes++; - - return DDENUMRET_OK; -} diff --git a/sdk/samples/foxbear/fbsound.c b/sdk/samples/foxbear/fbsound.c deleted file mode 100644 index 5751b79..0000000 --- a/sdk/samples/foxbear/fbsound.c +++ /dev/null @@ -1,287 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: fbsound.c - * Content: Game sound effect routines - * - ***************************************************************************/ -#include "foxbear.h" - -/* - * Array of pointers to our sound effects - */ -LPDIRECTSOUND lpDS; -LPDIRECTSOUNDBUFFER lpSoundEffects[NUM_SOUND_EFFECTS]; - -char szSoundEffects[NUM_SOUND_EFFECTS][MAX_PATH] = -{ - "STOP", - "THROW", - "JUMP", - "STUNNED", - "STRIKE02", - "MISS02" -}; - -/* - * DSEnable - * - * Figures out whether or not to use DirectSound, based on an entry - * in WIN.INI. Sets a module-level flag and goes about creating the - * DirectSound object if necessary. Returns TRUE if successful. - */ -BOOL DSEnable( HWND hwnd ) -{ - HRESULT dsrval; - BOOL bUseDSound; - - bUseDSound = GetProfileInt("FoxBear", "use_dsound", bWantSound); - - if (!bUseDSound) - { - lpDS = NULL; - return TRUE; - } - - if (lpDS != NULL) - { - Msg( "DSEnable, already enabled" ); - return TRUE; - } - - dsrval = DirectSoundCreate(NULL, &lpDS, NULL); - - if (dsrval != DS_OK) - { - Msg("DirectSoundCreate FAILED"); - return FALSE; - } - - - dsrval = IDirectSound_SetCooperativeLevel(lpDS, hwnd, DSSCL_NORMAL); - - if (dsrval != DS_OK) - { - DSDisable(); - Msg("SetCooperativeLevel FAILED"); - return FALSE; - } - - return TRUE; - -} /* DSEnable */ - - -/* - * DSDisable - * - * Turn off DirectSound - */ -BOOL DSDisable( void ) -{ - if (lpDS == NULL) - { - return TRUE; - } - - IDirectSound_Release(lpDS); - lpDS = NULL; - - return TRUE; - -} /* DSDisable */ - -/* - * InitSound - * - * Sets up the DirectSound object and loads all sounds into secondary - * DirectSound buffers. Returns FALSE on error, or TRUE if successful - */ -BOOL InitSound( HWND hwndOwner ) -{ - int idx; - DSBUFFERDESC dsBD; - IDirectSoundBuffer *lpPrimary; - - DSEnable(hwndOwner); - - if (lpDS == NULL) - return TRUE; - - /* - * Load all sounds -- any that can't load for some reason will have NULL - * pointers instead of valid SOUNDEFFECT data, and we will know not to - * play them later on. - */ - for( idx = 0; idx < NUM_SOUND_EFFECTS; idx++ ) - { - if (SoundLoadEffect((EFFECT)idx)) - { - DSBCAPS caps; - - caps.dwSize = sizeof(caps); - IDirectSoundBuffer_GetCaps(lpSoundEffects[idx], &caps); - - if (caps.dwFlags & DSBCAPS_LOCHARDWARE) - Msg( "Sound effect %s in hardware", szSoundEffects[idx]); - else - Msg( "Sound effect %s in software", szSoundEffects[idx]); - } - else - { - Msg( "cant load sound effect %s", szSoundEffects[idx]); - } - } - - /* - * get the primary buffer and start it playing - * - * by playing the primary buffer, DirectSound knows to keep the - * mixer active, even though we are not making any noise. - */ - - ZeroMemory( &dsBD, sizeof(DSBUFFERDESC) ); - dsBD.dwSize = sizeof(dsBD); - dsBD.dwFlags = DSBCAPS_PRIMARYBUFFER; - - if (SUCCEEDED(IDirectSound_CreateSoundBuffer(lpDS, &dsBD, &lpPrimary, NULL))) - { - if (!SUCCEEDED(IDirectSoundBuffer_Play(lpPrimary, 0, 0, DSBPLAY_LOOPING))) - { - Msg("Unable to play Primary sound buffer"); - } - - IDirectSoundBuffer_Release(lpPrimary); - } - else - { - Msg("Unable to create Primary sound buffer"); - } - - return TRUE; - -} /* InitSound */ - -/* - * DestroySound - * - * Undoes everything that was done in a InitSound call - */ -BOOL DestroySound( void ) -{ - DWORD idxKill; - - for( idxKill = 0; idxKill < NUM_SOUND_EFFECTS; idxKill++ ) - { - SoundDestroyEffect( (EFFECT)idxKill ); - } - - DSDisable(); - return TRUE; - -} /* DestroySound */ - -/* - * SoundDestroyEffect - * - * Frees up resources associated with a sound effect - */ -BOOL SoundDestroyEffect( EFFECT sfx ) -{ - if(lpSoundEffects[sfx]) - { - IDirectSoundBuffer_Release(lpSoundEffects[sfx]); - lpSoundEffects[sfx] = NULL; - } - return TRUE; - -} /* SoundDestryEffect */ - -/* - * SoundLoadEffect - * - * Initializes a sound effect by loading the WAV file from a resource - */ -BOOL SoundLoadEffect( EFFECT sfx ) -{ - if (lpDS && lpSoundEffects[sfx] == NULL && *szSoundEffects[sfx]) - { - // - // use DSLoadSoundBuffer (in ..\misc\dsutil.c) to load - // a sound from a resource. - // - lpSoundEffects[sfx] = DSLoadSoundBuffer(lpDS, szSoundEffects[sfx]); - } - - return lpSoundEffects[sfx] != NULL; - -} /* SoundLoadEffect */ - -/* - * SoundPlayEffect - * - * Plays the sound effect specified. - * Returns TRUE if succeeded. - */ -BOOL SoundPlayEffect( EFFECT sfx ) -{ - HRESULT dsrval; - IDirectSoundBuffer *pdsb = lpSoundEffects[sfx]; - - if( !lpDS || !pdsb ) - { - return FALSE; - } - - /* - * Rewind the play cursor to the start of the effect, and play - */ - IDirectSoundBuffer_SetCurrentPosition(pdsb, 0); - dsrval = IDirectSoundBuffer_Play(pdsb, 0, 0, 0); - - if (dsrval == DSERR_BUFFERLOST) - { - Msg("** %s needs restored", szSoundEffects[sfx]); - - dsrval = IDirectSoundBuffer_Restore(pdsb); - - if (dsrval == DS_OK) - { - if (DSReloadSoundBuffer(pdsb, szSoundEffects[sfx])) - { - Msg("** %s has been restored", szSoundEffects[sfx]); - IDirectSoundBuffer_SetCurrentPosition(pdsb, 0); - dsrval = IDirectSoundBuffer_Play(pdsb, 0, 0, 0); - } - else - { - dsrval = E_FAIL; - } - } - } - - return (dsrval == DS_OK); - -} /* SoundPlayEffect */ - -/* - * SoundStopEffect - * - * Stops the sound effect specified. - * Returns TRUE if succeeded. - */ -BOOL SoundStopEffect( EFFECT sfx ) -{ - HRESULT dsrval; - - if( !lpDS || !lpSoundEffects[sfx] ) - { - return FALSE; - } - - dsrval = IDirectSoundBuffer_Stop(lpSoundEffects[sfx]); - - return SUCCEEDED(dsrval); - -} /* SoundStopEffect */ diff --git a/sdk/samples/foxbear/fbsound.h b/sdk/samples/foxbear/fbsound.h deleted file mode 100644 index ea24eec..0000000 --- a/sdk/samples/foxbear/fbsound.h +++ /dev/null @@ -1,39 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: fbsound.h - * Content: Includes for FoxBear DirectSound support - * - ***************************************************************************/ -#ifndef __FBSOUND_INCLUDED__ -#define __FBSOUND_INCLUDED__ - -/* - * types of sound effects - */ -typedef enum enum_EFFECT -{ - SOUND_STOP = 0, - SOUND_THROW, - SOUND_JUMP, - SOUND_STUNNED, - SOUND_BEARSTRIKE, - SOUND_BEARMISS, -} EFFECT; - -#define NUM_SOUND_EFFECTS 6 - -/* - * fn prototypes - */ -BOOL InitSound( HWND ); -BOOL DestroySound( void ); -BOOL DSDisable( void ); -BOOL DSEnable( HWND ); -BOOL SoundLoadEffect( EFFECT ); -BOOL SoundPlayEffect( EFFECT ); -BOOL SoundStopEffect( EFFECT ); -BOOL SoundDestroyEffect( EFFECT ); - -#endif diff --git a/sdk/samples/foxbear/forelist.dat b/sdk/samples/foxbear/forelist.dat deleted file mode 100644 index e449c3e..0000000 --- a/sdk/samples/foxbear/forelist.dat +++ /dev/null @@ -1,15 +0,0 @@ - 27 44 44 44 44 44 44 44 44 43 44 44 44 38 0 0 0 0 0 0 0 27 44 44 44 44 44 41 44 44 44 44 44 44 38 0 0 0 0 0 27 44 44 44 44 44 44 44 44 43 44 44 44 38 0 0 0 0 0 0 0 27 44 44 44 44 44 41 44 44 44 44 44 44 38 0 0 0 0 0 - 26 44 44 41 44 44 42 44 44 44 44 44 36 37 0 0 0 0 0 0 0 26 44 44 40 44 44 44 44 44 44 43 44 36 37 0 0 0 0 0 26 44 44 41 44 44 42 44 44 44 44 44 36 37 0 0 0 0 0 0 0 26 44 44 40 44 44 44 44 44 44 43 44 36 37 0 0 0 0 0 - 25 24 44 44 44 44 44 44 44 30 31 34 35 0 0 0 0 0 0 0 0 25 24 44 44 44 39 44 44 44 30 31 34 35 0 0 0 0 0 0 25 24 44 44 44 44 44 44 44 30 31 34 35 0 0 0 0 0 0 0 0 25 24 44 44 44 39 44 44 44 30 31 34 35 0 0 0 0 0 0 - 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 0 0 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 0 0 0 23 22 21 20 19 17 18 28 29 32 33 0 0 0 0 0 0 0 - 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 16 0 0 0 0 0 0 0 0 0 0 0 - 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 8 7 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 3 4 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 51 52 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 51 52 0 0 0 0 0 0 0 9 10 0 0 0 0 0 0 0 0 0 0 0 - 49 0 0 0 0 0 1 2 0 0 45 46 47 48 0 0 0 0 54 53 0 0 0 0 0 0 0 1 2 0 0 57 58 0 0 55 56 0 0 0 49 0 0 0 0 0 1 2 0 0 45 46 47 48 0 0 0 0 54 53 0 0 0 0 0 0 0 1 2 0 0 57 58 0 0 55 56 0 0 0 - 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 - 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 61 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 diff --git a/sdk/samples/foxbear/fox.ico b/sdk/samples/foxbear/fox.ico deleted file mode 100644 index 2e2b890..0000000 Binary files a/sdk/samples/foxbear/fox.ico and /dev/null differ diff --git a/sdk/samples/foxbear/foxbear.art b/sdk/samples/foxbear/foxbear.art deleted file mode 100644 index efe82d4..0000000 Binary files a/sdk/samples/foxbear/foxbear.art and /dev/null differ diff --git a/sdk/samples/foxbear/foxbear.c b/sdk/samples/foxbear/foxbear.c deleted file mode 100644 index f8cf58b..0000000 --- a/sdk/samples/foxbear/foxbear.c +++ /dev/null @@ -1,1031 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: winfox.c - * Content: Windows fox sample game - * - ***************************************************************************/ -#include "foxbear.h" -#include "rcids.h" // for FOX_ICON - -LPDIRECTDRAWSURFACE lpFrontBuffer; -LPDIRECTDRAWSURFACE lpBackBuffer; -LPDIRECTDRAWCLIPPER lpClipper; -LPDIRECTDRAWSURFACE lpStretchBuffer; -LPDIRECTDRAWSURFACE lpFrameRate; -LPDIRECTDRAWSURFACE lpInfo; -LPDIRECTDRAWPALETTE lpPalette; -LPDIRECTDRAW lpDD; -SHORT lastInput = 0; -HWND hWndMain; -RECT rcWindow; -BOOL bShowFrameCount=TRUE; -BOOL bIsActive; -BOOL bPaused; - -BOOL bStretch; -BOOL bFullscreen=TRUE; -BOOL bStress=FALSE; // just keep running if true -BOOL bHelp=FALSE; // help requested -RECT GameRect; // game rect -SIZE GameSize; // game is this size -SIZE GameMode; // display mode size -UINT GameBPP; // the bpp we want -DWORD dwColorKey; // our color key -DWORD AveFrameRate; -DWORD AveFrameRateCount; -BOOL bWantSound = TRUE; - - -#define OUR_APP_NAME "Win Fox Application" - -#define ODS OutputDebugString - -BOOL InitGame(void); -void ExitGame(void); -void initNumSurface(void); - - -/* - * PauseGame() - */ -void PauseGame() -{ - Msg("**** PAUSE"); - bPaused = TRUE; - InvalidateRect(hWndMain, NULL, TRUE); -} - -/* - * UnPauseGame() - */ -void UnPauseGame() -{ - if (GetForegroundWindow() == hWndMain) - { - Msg("**** UNPAUSE"); - bPaused = FALSE; - } -} - -/* - * RestoreGame() - */ -BOOL RestoreGame() -{ - if (lpFrontBuffer == NULL || IDirectDrawSurface_Restore(lpFrontBuffer) != DD_OK) - { - Msg("***** cant restore FrontBuffer"); - return FALSE; - } - - if (!bFullscreen) - { - if (lpBackBuffer == NULL || IDirectDrawSurface_Restore(lpBackBuffer) != DD_OK) - { - Msg("***** cant restore BackBuffer"); - return FALSE; - } - } - - if (lpStretchBuffer && IDirectDrawSurface_Restore(lpStretchBuffer) != DD_OK) - { - Msg("***** cant restore StretchBuffer"); - return FALSE; - } - - if (lpFrameRate == NULL || lpInfo == NULL || - IDirectDrawSurface_Restore(lpFrameRate) != DD_OK || - IDirectDrawSurface_Restore(lpInfo) != DD_OK) - { - Msg("***** cant restore frame rate stuff"); - return FALSE; - } - initNumSurface(); - - if (!gfxRestoreAll()) - { - Msg("***** cant restore art"); - return FALSE; - } - - return TRUE; -} - -/* - * ProcessFox - */ -BOOL ProcessFox(SHORT sInput) -{ - if ((lpFrontBuffer && IDirectDrawSurface_IsLost(lpFrontBuffer) == DDERR_SURFACELOST) || - (lpBackBuffer && IDirectDrawSurface_IsLost(lpBackBuffer) == DDERR_SURFACELOST)) - { - if (!RestoreGame()) - { - PauseGame(); - return FALSE; - } - } - - - ProcessInput(sInput); - NewGameFrame(); - return TRUE; - -} /* ProcessFox */ - -static HFONT hFont; - -DWORD dwFrameCount; -DWORD dwFrameTime; -DWORD dwFrames; -DWORD dwFramesLast; -SIZE sizeFPS; -SIZE sizeINFO; -int FrameRateX; -char szFPS[] = "FPS %02d"; -char szINFO[] = "%dx%dx%d%s F6=mode F8=x2 ALT+ENTER=Window"; -char szINFOW[] = "%dx%dx%d%s F6=mode F8=x2 ALT+ENTER=Fullscreen"; - -char szFrameRate[128]; -char szInfo[128]; - -COLORREF InfoColor = RGB(0,152,245); -COLORREF FrameRateColor = RGB(255,255,0); -COLORREF BackColor = RGB(255,255,255); - -/* - * initNumSurface - */ -void initNumSurface( void ) -{ - HDC hdc; - RECT rc; - int len; - - dwFramesLast = 0; - - len = wsprintf(szFrameRate, szFPS, 0, 0); - - if( lpFrameRate && IDirectDrawSurface_GetDC(lpFrameRate, &hdc ) == DD_OK ) - { - SelectObject(hdc, hFont); - SetTextColor(hdc, FrameRateColor); - SetBkColor(hdc, BackColor); - SetBkMode(hdc, OPAQUE); - SetRect(&rc, 0, 0, 10000, 10000); - ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, szFrameRate, len, NULL); - GetTextExtentPoint(hdc, szFrameRate, 4, &sizeFPS); - FrameRateX = sizeFPS.cx; - GetTextExtentPoint(hdc, szFrameRate, len, &sizeFPS); - - IDirectDrawSurface_ReleaseDC(lpFrameRate, hdc); - } - - if (bFullscreen) - len = wsprintf(szInfo, szINFO, - GameSize.cx, GameSize.cy, GameBPP,bStretch ? " x2" : ""); - else - len = wsprintf(szInfo, szINFOW, - GameSize.cx, GameSize.cy, GameBPP,bStretch ? " x2" : ""); - - if( lpInfo && IDirectDrawSurface_GetDC(lpInfo, &hdc ) == DD_OK ) - { - SelectObject(hdc, hFont); - SetTextColor(hdc, InfoColor); - SetBkColor(hdc, BackColor); - SetBkMode(hdc, OPAQUE); - SetRect(&rc, 0, 0, 10000, 10000); - ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, szInfo, len, NULL); - GetTextExtentPoint(hdc, szInfo, len, &sizeINFO); - - IDirectDrawSurface_ReleaseDC(lpInfo, hdc); - } - -} /* initNumSurface */ - -/* - * makeFontStuff - */ -static BOOL makeFontStuff( void ) -{ - DDCOLORKEY ddck; - HDC hdc; - - if (hFont != NULL) - { - DeleteObject(hFont); - } - - hFont = CreateFont( - GameSize.cx <= 512 ? 12 : 24, - 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, - ANSI_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - NONANTIALIASED_QUALITY, // DEFAULT_QUALITY, - VARIABLE_PITCH, - "Arial" ); - - /* - * make a sample string so we can measure it with the current font. - */ - initNumSurface(); - - hdc = GetDC(NULL); - SelectObject(hdc, hFont); - GetTextExtentPoint(hdc, szFrameRate, lstrlen(szFrameRate), &sizeFPS); - GetTextExtentPoint(hdc, szInfo, lstrlen(szInfo), &sizeINFO); - ReleaseDC(NULL, hdc); - - /* - * Create a surface to copy our bits to. - */ - lpFrameRate = DDCreateSurface(sizeFPS.cx, sizeFPS.cy, FALSE,TRUE); - lpInfo = DDCreateSurface(sizeINFO.cx, sizeINFO.cy, FALSE,TRUE); - - if( lpFrameRate == NULL || lpInfo == NULL ) - { - return FALSE; - } - - /* - * now set the color key, we use a totaly different color than - * the rest of the app, just to be different so drivers dont always - * get white or black as the color key... - * - * dont forget when running on a dest colorkey device, we need - * to use the same color key as the rest of the app. - */ - if( bTransDest ) - BackColor = RGB(255,255,255); - else - BackColor = RGB(128,64,255); - - ddck.dwColorSpaceLowValue = DDColorMatch(lpInfo, BackColor); - ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue; - - IDirectDrawSurface_SetColorKey( lpInfo, DDCKEY_SRCBLT, &ddck); - IDirectDrawSurface_SetColorKey( lpFrameRate, DDCKEY_SRCBLT, &ddck); - - /* - * now draw the text for real - */ - initNumSurface(); - - return TRUE; -} - -/* - * DisplayFrameRate - */ -void DisplayFrameRate( void ) -{ - DWORD time2; - char buff[256]; - HDC hdc; - HRESULT ddrval; - RECT rc; - DWORD dw; - - if( !bShowFrameCount ) - { - return; - } - - dwFrameCount++; - time2 = timeGetTime() - dwFrameTime; - if( time2 > 1000 ) - { - dwFrames = (dwFrameCount*1000)/time2; - dwFrameTime = timeGetTime(); - dwFrameCount = 0; - - AveFrameRate += dwFrames; - AveFrameRateCount++; - } - - if( dwFrames == 0 ) - { - return; - } - - if( dwFrames != dwFramesLast ) - { - dwFramesLast = dwFrames; - - if( IDirectDrawSurface_GetDC(lpFrameRate, &hdc ) == DD_OK ) - { - buff[0] = (char)((dwFrames / 10) + '0'); - buff[1] = (char)((dwFrames % 10) + '0'); - - SelectObject(hdc, hFont); - SetTextColor(hdc, FrameRateColor); - SetBkColor(hdc, BackColor); - TextOut(hdc, FrameRateX, 0, buff, 2); - - IDirectDrawSurface_ReleaseDC(lpFrameRate, hdc); - } - } - - /* - * put the text on the back buffer. - */ - if (bTransDest) - dw = DDBLTFAST_DESTCOLORKEY | DDBLTFAST_WAIT; - else - dw = DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT; - - SetRect(&rc, 0, 0, sizeFPS.cx, sizeFPS.cy); - ddrval = IDirectDrawSurface_BltFast(lpBackBuffer, - GameRect.left + (GameSize.cx - sizeFPS.cx)/2, GameRect.top + 20, - lpFrameRate, &rc, dw); - - SetRect(&rc, 0, 0, sizeINFO.cx, sizeINFO.cy); - ddrval = IDirectDrawSurface_BltFast(lpBackBuffer, - GameRect.left + 10, GameRect.bottom - sizeINFO.cy - 10, - lpInfo, &rc, dw); - -} /* DisplayFrameRate */ - -/* - * MainWndProc - * - * Callback for all Windows messages - */ -long FAR PASCAL MainWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - int i; - - switch( message ) - { - case WM_SIZE: - case WM_MOVE: - if (IsIconic(hWnd)) - { - Msg("FoxBear is minimized, pausing"); - PauseGame(); - } - - if (bFullscreen) - { - SetRect(&rcWindow, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); - } - else - { - GetClientRect(hWnd, &rcWindow); - ClientToScreen(hWnd, (LPPOINT)&rcWindow); - ClientToScreen(hWnd, (LPPOINT)&rcWindow+1); - } - Msg("WINDOW RECT: [%d,%d,%d,%d]", rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom); - break; - - case WM_ACTIVATEAPP: - bIsActive = (BOOL)wParam && GetForegroundWindow() == hWnd; - - if (bIsActive) - Msg("FoxBear is active"); - else - Msg("FoxBear is not active"); - - // - // while we were not-active something bad happened that caused us - // to pause, like a surface restore failing or we got a palette - // changed, now that we are active try to fix things - // - if (bPaused && bIsActive) - { - if (RestoreGame()) - { - UnPauseGame(); - } - else - { - if (GetForegroundWindow() == hWnd) - { - // - // we are unable to restore, this can happen when - // the screen resolution or bitdepth has changed - // we just reload all the art again and re-create - // the front and back buffers. this is a little - // overkill we could handle a screen res change by - // just recreating the front and back buffers we dont - // need to redo the art, but this is way easier. - // - if (InitGame()) - { - UnPauseGame(); - } - } - } - } - break; - - case WM_QUERYNEWPALETTE: - // - // we are getting the palette focus, select our palette - // - if (!bFullscreen && lpPalette && lpFrontBuffer) - { - HRESULT ddrval; - - ddrval = IDirectDrawSurface_SetPalette(lpFrontBuffer,lpPalette); - if( ddrval == DDERR_SURFACELOST ) - { - IDirectDrawSurface_Restore( lpFrontBuffer ); - - ddrval= IDirectDrawSurface_SetPalette(lpFrontBuffer,lpPalette); - if( ddrval == DDERR_SURFACELOST ) - { - Msg(" Failed to restore palette after second try"); - } - } - - // - // Restore normal title if palette is ours - // - - if( ddrval == DD_OK ) - { - SetWindowText( hWnd, OUR_APP_NAME ); - } - } - break; - - case WM_PALETTECHANGED: - // - // if another app changed the palette we dont have full control - // of the palette. NOTE this only applies for FoxBear in a window - // when we are fullscreen we get all the palette all of the time. - // - if ((HWND)wParam != hWnd) - { - if( !bFullscreen ) - { - if( !bStress ) - { - Msg("***** PALETTE CHANGED, PAUSING GAME"); - PauseGame(); - } - else - { - Msg("Lost palette but continuing"); - SetWindowText( hWnd, OUR_APP_NAME - " - palette changed COLORS PROBABLY WRONG" ); - } - } - } - break; - - case WM_DISPLAYCHANGE: - break; - - case WM_CREATE: - break; - - case WM_SETCURSOR: - if (bFullscreen && bIsActive) - { - SetCursor(NULL); - return TRUE; - } - break; - - case WM_SYSKEYUP: - switch( wParam ) - { - // handle ALT+ENTER (fullscreen) - case VK_RETURN: - bFullscreen = !bFullscreen; - ExitGame(); - DDDisable(TRUE); // destroy DirectDraw object - InitGame(); - break; - } - break; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_NUMPAD5: - lastInput=KEY_STOP; - break; - case VK_DOWN: - case VK_NUMPAD2: - lastInput=KEY_DOWN; - break; - case VK_LEFT: - case VK_NUMPAD4: - lastInput=KEY_LEFT; - break; - case VK_RIGHT: - case VK_NUMPAD6: - lastInput=KEY_RIGHT; - break; - case VK_UP: - case VK_NUMPAD8: - lastInput=KEY_UP; - break; - case VK_HOME: - case VK_NUMPAD7: - lastInput=KEY_JUMP; - break; - case VK_NUMPAD3: - lastInput=KEY_THROW; - break; - case VK_F5: - bShowFrameCount = !bShowFrameCount; - if( bShowFrameCount ) - { - dwFrameCount = 0; - dwFrameTime = timeGetTime(); - } - break; - - case VK_F6: - // - // find our current mode in the mode list - // - if(bFullscreen) - { - for (i=0; i= NumModes) - i = 0; -Msg("ModeList %d %d",i,NumModes); - GameMode.cx = ModeList[i].w; - GameMode.cy = ModeList[i].h; - GameBPP = ModeList[i].bpp; - bStretch = FALSE; - InitGame(); - break; - - case VK_F7: - GameBPP = GameBPP == 8 ? 16 : 8; - InitGame(); - break; - - case VK_F8: - if (bFullscreen) - { - bStretch = !bStretch; - InitGame(); - } - else - { - RECT rc; - - GetClientRect(hWnd, &rc); - - bStretch = (rc.right != GameSize.cx) || - (rc.bottom != GameSize.cy); - - if (bStretch = !bStretch) - SetRect(&rc, 0, 0, GameMode.cx*2, GameMode.cy*2); - else - SetRect(&rc, 0, 0, GameMode.cx, GameMode.cy); - - AdjustWindowRectEx(&rc, - GetWindowStyle(hWnd), - GetMenu(hWnd) != NULL, - GetWindowExStyle(hWnd)); - - SetWindowPos(hWnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - } - break; - - case VK_F4: - // treat F4 like ALT+ENTER (fullscreen) - PostMessage(hWnd, WM_SYSKEYUP, VK_RETURN, 0); - break; - - case VK_F3: - bPaused = !bPaused; - break; - - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd, WM_CLOSE, 0, 0); - return 0; - } - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - if (bPaused) - { - char *sz = "Game is paused, this is not a bug."; - TextOut(ps.hdc, 0, 0, sz, lstrlen(sz)); - } - EndPaint( hWnd, &ps ); - return 1; - - case WM_DESTROY: - hWndMain = NULL; - lastInput=0; - DestroyGame(); // end of game - DDDisable(TRUE); // destroy DirectDraw object - PostQuitMessage( 0 ); - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndProc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static BOOL initApplication( HINSTANCE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - BOOL rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, MAKEINTATOM(FOX_ICON)); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinFoxClass"; - rc = RegisterClass( &wc ); - if( !rc ) - { - return FALSE; - } - - - hWndMain = CreateWindowEx( - WS_EX_APPWINDOW, - "WinFoxClass", - OUR_APP_NAME, - WS_VISIBLE | // so we dont have to call ShowWindow - WS_SYSMENU | // so we get a icon in in our tray button - WS_POPUP, - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - hInstance, - NULL ); - - if( !hWndMain ) - { - return FALSE; - } - - UpdateWindow( hWndMain ); - SetFocus( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * ExitGame - * - * Exiting current game, clean up - */ -void ExitGame( void ) -{ - if( lpFrameRate ) - { - IDirectDrawSurface_Release(lpFrameRate); - lpFrameRate = NULL; - } - - if( lpInfo ) - { - IDirectDrawSurface_Release(lpInfo); - lpInfo = NULL; - } - - if( lpPalette ) - { - IDirectDrawSurface_Release(lpPalette); - lpPalette = NULL; - } - - DestroyGame(); - -} /* ExitGame */ - -/* - * InitGame - * - * Initializing current game - */ -BOOL InitGame( void ) -{ - ExitGame(); - - GameSize = GameMode; - - /* - * initialize sound - */ - InitSound( hWndMain ); - - /* - * init DirectDraw, set mode, ... - * NOTE GameMode might be set to 640x480 if we cant get the asked for mode. - */ - if( !PreInitializeGame() ) - { - return FALSE; - } - - if (bStretch && bFullscreen) - { - GameSize.cx = GameMode.cx / 2; - GameSize.cy = GameMode.cy / 2; - GameRect.left = GameMode.cx - GameSize.cx; - GameRect.top = GameMode.cy - GameSize.cy; - GameRect.right = GameMode.cx; - GameRect.bottom = GameMode.cy; - - if (lpStretchBuffer) - Msg("Stretching using a system-memory stretch buffer"); - else - Msg("Stretching using a VRAM->VRAM blt"); - } - else - { - GameRect.left = (GameMode.cx - GameSize.cx) / 2; - GameRect.top = (GameMode.cy - GameSize.cy) / 2; - GameRect.right = GameRect.left + GameSize.cx; - GameRect.bottom = GameRect.top + GameSize.cy; - } - - /* - * setup our palette - */ - if( GameBPP == 8 ) - { - lpPalette = ReadPalFile( NULL ); // create a 332 palette - - if( lpPalette == NULL ) - { - Msg( "Palette create failed" ); - return FALSE; - } - - IDirectDrawSurface_SetPalette( lpFrontBuffer, lpPalette ); - } - - /* - * load all the art and things. - */ - if( !InitializeGame() ) - { - return FALSE; - } - - /* - * init our code to draw the FPS - */ - makeFontStuff(); - - /* - * spew some stats - */ - { - DDCAPS ddcaps; - ddcaps.dwSize = sizeof( ddcaps ); - IDirectDraw_GetCaps( lpDD, &ddcaps, NULL ); - Msg( "Total=%ld, Free VRAM=%ld", ddcaps.dwVidMemTotal, ddcaps.dwVidMemFree ); - Msg( "Used = %ld", ddcaps.dwVidMemTotal- ddcaps.dwVidMemFree ); - } - - return TRUE; - -} /* InitGame */ - -#define IS_NUM(c) ((c) >= '0' && (c) <= '9') -#define IS_SPACE(c) ((c) == ' ' || (c) == '\r' || (c) == '\n' || (c) == '\t' || (c) == 'x') - -int getint(char**p, int def) -{ - int i=0; - - while (IS_SPACE(**p)) - (*p)++; - - if (!IS_NUM(**p)) - return def; - - while (IS_NUM(**p)) - i = i*10 + *(*p)++ - '0'; - - while (IS_SPACE(**p)) - (*p)++; - - return i; -} - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow ) -{ - MSG msg; - - while( lpCmdLine[0] == '-' ) - { - lpCmdLine++; - - switch (*lpCmdLine++) - { - case 'e': - bUseEmulation = TRUE; - break; - case 'w': - bFullscreen = FALSE; - break; - case 'f': - bFullscreen = TRUE; - break; - case '1': - CmdLineBufferCount = 1; - break; - case '2': - case 'd': - CmdLineBufferCount = 2; - break; - case '3': - CmdLineBufferCount = 3; - break; - case 's': - bStretch = TRUE; - break; - case 'S': - bWantSound = FALSE; - break; - case 'x': - bStress= TRUE; - break; - case '?': - bHelp= TRUE; - bFullscreen= FALSE; // give help in windowed mode - break; - } - - while( IS_SPACE(*lpCmdLine) ) - { - lpCmdLine++; - } - } - - GameMode.cx = getint(&lpCmdLine, 640); - GameMode.cy = getint(&lpCmdLine, 480); - GameBPP = getint(&lpCmdLine, 8); - - /* - * create window and other windows things - */ - if( !initApplication(hInstance, nCmdShow) ) - { - return FALSE; - } - - /* - * Give user help if asked for - * - * This is ugly for now because the whole screen is black - * except for the popup box. This could be fixed with some - * work to get the window size right when it was created instead - * of delaying that work. see ddraw.c - * - */ - - if( bHelp ) - { - MessageBox(hWndMain, - "F12 - Quit\n" - "NUMPAD 2 - crouch\n" - "NUMPAD 3 - apple\n" - "NUMPAD 4 - right\n" - "NUMPAD 5 - stop\n" - "NUMPAD 6 - left\n" - "NUMPAD 7 - jump\n" - "\n" - "Command line parameters\n" - "\n" - "-e Use emulator\n" - "-S No Sound\n" - "-1 No backbuffer\n" - "-2 One backbuffer\n" - "-4 Three backbuffers\n" - "-s Use stretch\n" - "-x Demo or stress mode\n", - OUR_APP_NAME, MB_OK ); - } - - /* - * initialize for game play - */ - if( !InitGame() ) - { - return FALSE; - } - - dwFrameTime = timeGetTime(); - - while( 1 ) - { - if (PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE)) - { - if (!GetMessage( &msg, NULL, 0, 0)) - { - break; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else if (!bPaused && (bIsActive || !bFullscreen)) - { - ProcessFox(lastInput); - lastInput=0; - } - else - { - WaitMessage(); - } - } - - if (AveFrameRateCount) - { - AveFrameRate = AveFrameRate / AveFrameRateCount; - Msg("Average frame rate: %d", AveFrameRate); - } - - return msg.wParam; - -} /* WinMain */ - -#ifdef DEBUG - -/* - * Msg - */ -void __cdecl Msg( LPSTR fmt, ... ) -{ - char buff[256]; - va_list va; - - va_start(va, fmt); - - // - // format message with header - // - - lstrcpy( buff, "FOXBEAR:" ); - wvsprintf( &buff[lstrlen(buff)], fmt, va ); - lstrcat( buff, "\r\n" ); - - // - // To the debugger unless we need to be quiet - // - - if( !bStress ) - { - OutputDebugString( buff ); - } - -} /* Msg */ - -#endif diff --git a/sdk/samples/foxbear/foxbear.def b/sdk/samples/foxbear/foxbear.def deleted file mode 100644 index 67ea40c..0000000 --- a/sdk/samples/foxbear/foxbear.def +++ /dev/null @@ -1,3 +0,0 @@ -NAME FOXBEAR - -DESCRIPTION 'Fox & Bear Sample Game' diff --git a/sdk/samples/foxbear/foxbear.h b/sdk/samples/foxbear/foxbear.h deleted file mode 100644 index c2ebcef..0000000 --- a/sdk/samples/foxbear/foxbear.h +++ /dev/null @@ -1,119 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: foxbear.h - * Content: main include file - * - ***************************************************************************/ -#ifndef __FOXBEAR_INCLUDED__ -#define __FOXBEAR_INCLUDED__ - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include "gfx.h" -#include "fbsound.h" -#include "gameproc.h" -#include "fastfile.h" -#include "dsutil.h" - -int getint(char**p, int def); - -#define QUOTE(x) #x -#define QQUOTE(y) QUOTE(y) -#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) "):" str - -/* - * keyboard commands - */ -enum -{ - KEY_STOP = 1, - KEY_DOWN, - KEY_LEFT, - KEY_RIGHT, - KEY_UP, - KEY_JUMP, - KEY_THROW -}; - -/* - * global data - */ -extern LPDIRECTDRAW lpDD; -extern LPDIRECTDRAWSURFACE lpFrontBuffer; -extern LPDIRECTDRAWSURFACE lpBackBuffer; -extern LPDIRECTDRAWSURFACE lpStretchBuffer; -extern LPDIRECTDRAWCLIPPER lpClipper; -extern DWORD lastKey; -extern BOOL bModeX; // we are in a modex mode -extern BOOL bColorFill; // device supports color fill -extern BOOL bTransDest; // we should use dest color key -extern BOOL bColorFill; // device supports color fill -extern int nBufferCount; // buffer count -extern int CmdLineBufferCount; // buffer count -extern BOOL bStretch; // stretch -extern BOOL bFullscreen; // run in fullscreen mode -extern BOOL bStress; // just keep running -extern BOOL bUseEmulation; // dont use HW use SW -extern RECT GameRect; // game is here -extern SIZE GameSize; // game is this size -extern SIZE GameMode; // display mode size -extern UINT GameBPP; // the bpp we want -extern DWORD dwColorKey; // the color key -extern HWND hWndMain; // the foxbear window -extern RECT rcWindow; // where the FoxBear window is. -extern BOOL bIsActive; // we are the active app. -extern BOOL bPaused; // -extern BOOL bWantSound; // Set the default action in DSEnable - -/* - * list of display modes - */ -struct {int w, h, bpp;} ModeList[100]; -int NumModes; - -/* - * map a point that assumes 640x480 to the current game size. - */ -#define MapDX(x) (((x) * GameSize.cx) / C_SCREEN_W) -#define MapDY(y) (((y) * GameSize.cy) / C_SCREEN_H) -#define MapX(x) (GameRect.left + MapDX(x)) -#define MapY(y) (GameRect.top + MapDY(y)) -#define MapRX(x) ((GameSize.cx == C_SCREEN_W) ? x : MapDX(x)+1) -#define MapRY(y) ((GameSize.cy == C_SCREEN_H) ? y : MapDY(y)+1) - -void PauseGame(void); -void UnPauseGame(void); - - -/* - * fn prototypes - */ -/* ddraw.c */ -extern BOOL DDEnable( void ); -extern BOOL DDDisable( BOOL ); -extern LPDIRECTDRAWSURFACE DDCreateSurface( DWORD width, DWORD height, BOOL sysmem, BOOL trans ); -extern BOOL DDCreateFlippingSurface( void ); -extern BOOL DDClear( void ); -extern DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb); -extern void Splash( void ); - -extern LPVOID CMemAlloc( UINT cnt, UINT isize ); -extern LPVOID MemAlloc( UINT size ); -extern void MemFree( LPVOID ptr ); - -#ifdef DEBUG -extern void __cdecl Msg( LPSTR fmt, ... ); -#else -#define Msg ; / ## / -#endif - -LPDIRECTDRAWPALETTE ReadPalFile( char *fname ); - -#endif diff --git a/sdk/samples/foxbear/foxbear.rc b/sdk/samples/foxbear/foxbear.rc deleted file mode 100644 index 83c7920..0000000 --- a/sdk/samples/foxbear/foxbear.rc +++ /dev/null @@ -1,17 +0,0 @@ -#include "rcids.h" - -FOX_ICON ICON FOX.ICO - -FORELIST RCDATA FORELIST.DAT -MIDLIST RCDATA MIDLIST.DAT -SURFLIST RCDATA SURFLIST.DAT -BACKLIST RCDATA BACKLIST.DAT - -MISS01 WAV MISS01.WAV -JUMP WAV JUMP.WAV -MISS02 WAV MISS02.WAV -STOP WAV STOP.WAV -STRIKE02 WAV STRIKE02.WAV -STUNNED WAV STUNNED.WAV -THROW WAV THROW.WAV -STRIKE01 WAV STRIKE01.WAV diff --git a/sdk/samples/foxbear/gameproc.c b/sdk/samples/foxbear/gameproc.c deleted file mode 100644 index 5a78c2c..0000000 --- a/sdk/samples/foxbear/gameproc.c +++ /dev/null @@ -1,1370 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: gameproc.c - * Content: Game processing routines - * - ***************************************************************************/ -#include "foxbear.h" - -GFX_HBM hBuffer; -HBITMAPLIST *hBitmapList; -HBITMAPLIST *hTileList; -HPOSLIST *hForePosList; -HPOSLIST *hMidPosList; -HPOSLIST *hBackPosList; -HSURFACELIST *hSurfaceList; -HPLANE *hForeground; -HPLANE *hMidground; -HPLANE *hBackground; -HSPRITE *hFox; -HSPRITE *hBear; -HSPRITE *hApple; -USHORT chewCount; -LONG chewDif; - -/* - * ErrorMessage - */ -void ErrorMessage( CHAR *pText ) -{ - char ach[128]; - - wsprintf( ach, "FOXBEAR FATAL ERROR: %s\r\n", pText ); - OutputDebugString(ach); - gfxEnd( hBuffer ); - exit( 0 ); - -} /* ErrorMessage */ - -/* - * InitBuffer - */ -BOOL InitBuffer( GFX_HBM *hBuffer ) -{ - *hBuffer = gfxBegin(); - - if( *hBuffer == NULL ) - { - ErrorMessage( "gfxBegin failed" ); - return FALSE; - } - return TRUE; - -} /* InitBuffer */ - -/* - * DestroyBuffer - */ -void DestroyBuffer ( GFX_HBM hBuffer ) -{ - if( gfxEnd( hBuffer ) == FALSE ) - { - ErrorMessage( "gfxEnd in DestroyBuffer" ); - } - -} /* DestroyBuffer */ - -/* - * LoadBitmaps - */ -HBITMAPLIST *LoadBitmaps( void ) -{ - HBITMAPLIST *hBitmapList; - CHAR fileName[32]; - USHORT i; - USHORT n; - - if( !FastFileInit( "foxbear.art", 5 ) ) - { - Msg( "Could not load art file err=%08lX" , GetLastError()); - return NULL; - } - hBitmapList = CMemAlloc( C_TILETOTAL + C_FBT + C_BBT, sizeof (HBITMAPLIST) ); - - Msg( "Loading tiles" ); - for( i = 0; i < C_TILETOTAL; ++i ) - { - wsprintf( fileName, "%03u.BMP", i + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n = C_TILETOTAL; - - Msg( "Loading FoxWalk" ); - for( i = n; i < n + C_FOXWALK; ++i ) - { - wsprintf( fileName, "FW%02uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXWALK; - - Msg( "Loading FoxWalk2" ); - for( i = n; i < n + C_FOXWALK; ++i ) - { - wsprintf( fileName, "FW%02uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXWALK; - - Msg( "Loading FoxRun" ); - for( i = n; i < n + C_FOXRUN; ++i ) - { - wsprintf( fileName, "FR%02uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXRUN; - - Msg( "Loading FoxRun2" ); - for( i = n; i < n + C_FOXRUN; ++i ) - { - wsprintf( fileName, "FR%02uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXRUN; - - Msg( "Loading FoxStill" ); - for( i = n; i < n + C_FOXSTILL; ++i ) - { - wsprintf( fileName, "FS%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXSTILL; - - Msg( "Loading FoxStill2" ); - for( i = n; i < n + C_FOXSTILL; ++i ) - { - wsprintf( fileName, "FS%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXSTILL; - - Msg( "Loading FoxStunned" ); - for( i = n; i < n + C_FOXSTUNNED; ++i ) - { - wsprintf( fileName, "FK%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXSTUNNED; - - Msg( "Loading FoxStunned2" ); - for( i = n; i < n + C_FOXSTUNNED; ++i ) - { - wsprintf( fileName, "FK%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXSTUNNED; - - Msg( "Loading FoxCrouch" ); - for( i = n; i < n + C_FOXCROUCH; ++i ) - { - wsprintf( fileName, "FC%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXCROUCH; - - Msg( "Loading FoxCrouch2" ); - for( i = n; i < n + C_FOXCROUCH; ++i ) - { - wsprintf( fileName, "FC%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXCROUCH; - - Msg( "Loading FoxStop" ); - for( i = n; i < n + C_FOXSTOP; ++i ) - { - wsprintf( fileName, "FCD%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXSTOP; - - Msg( "Loading FoxStop2" ); - for( i = n; i < n + C_FOXSTOP; ++i ) - { - wsprintf( fileName, "FCD%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXSTOP; - - Msg( "Loading FoxThrow" ); - for( i = n; i < n + C_FOXTHROW; ++i ) - { - wsprintf( fileName, "FT%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXTHROW; - - Msg( "Loading FoxThrow2" ); - for( i = n; i < n + C_FOXTHROW; ++i ) - { - wsprintf( fileName, "FT%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXTHROW; - - Msg( "Loading FoxJumpThrow" ); - for( i = n; i < n + C_FOXJUMPTHROW; ++i ) - { - wsprintf( fileName, "FJT%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXJUMPTHROW; - - Msg( "Loading FoxJumpThrow2" ); - for( i = n; i < n + C_FOXJUMPTHROW; ++i ) - { - wsprintf( fileName, "FJT%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXJUMPTHROW; - - Msg( "Loading FoxJump" ); - for( i = n; i < n + C_FOXJUMP; ++i ) - { - wsprintf( fileName, "FJ%1uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXJUMP; - - Msg( "Loading FoxJump2" ); - for( i = n; i < n + C_FOXJUMP; ++i ) - { - wsprintf( fileName, "FJ%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXJUMP; - - Msg( "Loading FoxCrouchWalk" ); - for( i = n; i < n + C_FOXCROUCHWALK; ++i ) - { - wsprintf( fileName, "FCW%02uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXCROUCHWALK; - - Msg( "Loading FoxCrouchWalk2" ); - for( i = n; i < n + C_FOXCROUCHWALK; ++i ) - { - wsprintf( fileName, "FCW%02uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXCROUCHWALK; - - Msg( "Loading FoxBlurr" ); - for( i = n; i < n + C_FOXBLURR; ++i ) - { - wsprintf( fileName, "FB%02uR.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXBLURR; - - Msg( "Loading FoxBlurr2" ); - for( i = n; i < n + C_FOXBLURR; ++i ) - { - wsprintf( fileName, "FB%02uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_FOXBLURR; - - Msg( "Loading BearMiss" ); - for( i = n; i < n + C_BEARMISS; ++i ) - { - wsprintf( fileName, "BM%1uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_BEARMISS; - - Msg( "Loading BearStrike" ); - for( i = n; i < n + C_BEARSTRIKE; ++i ) - { - wsprintf( fileName, "BS%02uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_BEARSTRIKE; - - Msg( "Loading BearWalk" ); - for( i = n; i < n + C_BEARWALK; ++i ) - { - wsprintf( fileName, "BW%02uL.BMP", i - n + 1 ); - hBitmapList[i].hBM = gfxLoadBitmap( fileName ); - } - n += C_BEARWALK; - - FastFileFini(); - - return hBitmapList; - -} /* LoadBitmaps */ - -/* - * InitTiles - */ -void InitTiles( - HBITMAPLIST **hTileList, - HBITMAPLIST *hBitmapList, - USHORT tileCount ) -{ - *hTileList = CreateTiles( hBitmapList, tileCount ); - -} /* InitTiles */ - -/* - * InitPlane - */ -void InitPlane( - HPLANE **hPlane, - HPOSLIST **hPosList, - LPSTR szFileName, - USHORT width, - USHORT height, - USHORT denom ) -{ - *hPlane = CreatePlane( width, height, denom ); - *hPosList = CreatePosList( szFileName, width, height ); - -} /* InitPlane */ - -/* - * InitSurface - */ -void InitSurface( - HSURFACELIST **pphSurfaceList, - CHAR *szFileName, - USHORT width, - USHORT height ) -{ - *pphSurfaceList = CreateSurfaceList( szFileName, width, height ); - -} /* InitSurface */ - -/* - * InitFox - */ -void InitFox ( HSPRITE **pphFox, HBITMAPLIST *phBitmapList ) -{ - GFX_HBM hBM; - GFX_HBM hBM_src; - ACTION action; - DIRECTION direction; - USHORT i; - - LONG startX = C_FOX_STARTX; - LONG startY = C_FOX_STARTY; - USHORT boundW = 108; - USHORT boundH = 105; - LONG as = 6; - SHORT x[C_FBT] = { 7, 15, 18, 11, 6, 3, 7, 15, 17, 11, 6, 3, - 7, 15, 18, 11, 6, 3, 7, 15, 17, 11, 6, 3, - 10, 3, 5, 16, 9, 13, 31, 24, 9, 3, 5, 16, 10, 13, 33, 23, - 10, 3, 5, 16, 9, 13, 31, 24, 9, 3, 5, 16, 10, 13, 33, 23, - 11, 11, 31, 31, 7, 7, 27, 27, 8, 10, 8, 10, - 26, 6, 26, 6, 17, 21, 21, 24, 17, 21, 21, 24, - 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, - 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, - 2, 2, -1, 0, 2, 2, -1, 0 }; - SHORT y[C_FBT] = { 20, 24, 26, 25, 27, 19, 20, 25, 26, 25, 29, 21, - 20, 24, 26, 25, 27, 19, 20, 25, 26, 25, 29, 21, - 42, 42, 31, 19, 13, 11, 20, 33, 40, 43, 31, 19, 14, 12, 20, 33, - 42, 42, 31, 19, 13, 11, 20, 33, 40, 43, 31, 19, 14, 12, 20, 33, - 14, 14, 20, 20, 58, 58, 26, 26, 20, 24, 20, 24, - 0, 9, 0, 9, 20, 11, 10, 9, 20, 11, 10, 9, - 61, 61, 61, 61, 60, 60, 61, 61, 61, 61, 60, 60, - 61, 61, 61, 61, 60, 60, 61, 61, 61, 61, 60, 60, - 45, 45, 45, 45, 45, 45, 45, 45 }; - USHORT w[C_FBT] = { 75, 73, 73, 82, 92, 84, 74, 74, 73, 81, 91, 84, - 75, 73, 73, 82, 92, 84, 74, 74, 73, 81, 91, 84, - 88, 92, 88, 78, 80, 78, 70, 84, 88, 92, 88, 78, 79, 79, 68, 85, - 88, 92, 88, 78, 80, 78, 70, 84, 88, 92, 88, 78, 79, 79, 68, 85, - 65, 65, 61, 61, 88, 88, 72, 72, 57, 86, 57, 86, - 54, 92, 54, 92, 59, 57, 57, 52, 59, 57, 57, 52, - 98, 99, 99, 99,100,100, 98,101,100, 99,100, 98, - 98, 99, 99, 99,100,100, 98,101,100, 99,100, 98, - 94, 94, 97, 96, 94, 94, 97, 96 }; - USHORT h[C_FBT] = { 78, 74, 72, 73, 71, 79, 78, 73, 72, 73, 69, 77, - 78, 74, 72, 73, 71, 79, 78, 73, 72, 73, 69, 77, - 56, 56, 67, 79, 85, 87, 78, 65, 58, 55, 67, 79, 84, 86, 78, 65, - 56, 56, 67, 79, 85, 87, 78, 65, 58, 55, 67, 79, 84, 86, 78, 65, - 84, 84, 85, 85, 40, 40, 72, 72, 78, 74, 78, 74, - 88, 82, 88, 82, 84, 87, 86, 85, 84, 87, 86, 85, - 37, 37, 37, 37, 38, 38, 37, 37, 37, 37, 38, 38, - 37, 37, 37, 37, 38, 38, 37, 37, 37, 37, 38, 38, - 54, 53, 51, 54, 54, 53, 51, 54 }; - - *pphFox = CreateSprite( C_FBT, startX, startY, boundW, boundH, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, (SHORT) as, TRUE ); - - for( i = 0; i < C_FBT; ++i ) - { - hBM_src = phBitmapList[i + C_TILETOTAL].hBM; - - if( i < 12 ) - { - action = WALK; - direction = RIGHT; - } - else if( (i >= 12) && (i < 24) ) - { - action = WALK; - direction = LEFT; - } - else if( (i >= 24) && (i < 40) ) - { - action = RUN; - direction = RIGHT; - } - else if( (i >= 40) && (i < 56) ) - { - action = RUN; - direction = LEFT; - } - else if( i == 56 ) - { - action = STILL; - direction = RIGHT; - } - else if( i == 57 ) - { - action = STILL; - direction = LEFT; - } - else if( i == 58 ) - { - action = STUNNED; - direction = RIGHT; - } - else if( i == 59 ) - { - action = STUNNED; - direction = LEFT; - } - else if( i == 60 ) - { - action = CROUCH; - direction = RIGHT; - } - else if( i == 61 ) - { - action = CROUCH; - direction = LEFT; - } - else if( i == 62 ) - { - action = STOP; - direction = RIGHT; - } - else if( i == 63 ) - { - action = STOP; - direction = LEFT; - } - else if( (i >= 64) && (i < 66) ) - { - action = THROW; - direction = RIGHT; - } - else if( (i >= 66) && (i < 68) ) - { - action = THROW; - direction = LEFT; - } - else if( (i >= 68) && (i < 70) ) - { - action = JUMPTHROW; - direction = RIGHT; - } - else if( (i >= 70) && (i < 72) ) - { - action = JUMPTHROW; - direction = LEFT; - } - else if( (i >= 72) && (i < 76) ) - { - action = JUMP; - direction = RIGHT; - } - else if( (i >= 76) && (i < 80) ) - { - action = JUMP; - direction = LEFT; - } - else if( (i >= 80) && (i < 92) ) - { - action = CROUCHWALK; - direction = RIGHT; - } - else if( (i >= 92) && (i < 104) ) - { - action = CROUCHWALK; - direction = LEFT; - } - else if( (i >= 104) && (i < 108) ) - { - action = BLURR; - direction = RIGHT; - } - else if( (i >= 108) && (i < 112) ) - { - action = BLURR; - direction = LEFT; - } - - hBM = hBM_src; - - BitBltSprite( - *pphFox, - hBM, - action, - direction, - x[i], - y[i], - w[i], - h[i] ); - } - SetSpriteAction( *pphFox, STILL, RIGHT ); - -} /* InitFox */ - -/* - * InitBear - */ -void InitBear( HSPRITE **pphBear, HBITMAPLIST *phBitmapList ) -{ - GFX_HBM hBM_src; - ACTION action; - DIRECTION direction; - USHORT i; - - LONG startX = C_BEAR_STARTX; - LONG startY = C_BEAR_STARTY; - USHORT boundW = 196; - USHORT boundH = 88; - LONG as = 6; - USHORT x[C_BBT] = { 14, 10, - 8, 12, 13, 14, 10, 10, 9, 9, 9, 9, 8, 9, - 11, 6, 1, 0, 3, 13, 11, 7, 1, 1, 3, 14 }; - USHORT y[C_BBT] = { 7, 7, - 3, 8, 9, 7, 7, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 2, 2, 3, 1, 0, 1, 1, 2, 3, 2 }; - USHORT w[C_BBT] = {127,129, - 127,153,183,153,129,138,146,150,152,151,143,139, - 131,136,140,141,136,125,131,135,140,140,136,126 }; - USHORT h[C_BBT] = { 80, 80, - 84, 79, 78, 80, 80, 84, 84, 84, 84, 84, 84, 84, - 86, 86, 86, 85, 84, 86, 87, 86, 87, 85, 84, 86 }; - - *pphBear = CreateSprite( C_BBT, startX, startY, boundW, boundH, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, (SHORT) as, TRUE ); - - for( i = 0; i < C_BBT; ++i ) - { - hBM_src = phBitmapList[i + C_TILETOTAL + C_FBT].hBM; - - if( i < 2 ) - { - action = MISS; - direction = LEFT; - } - else if( (i >= 2) && (i < 8) ) - { - action = STRIKE; - direction = LEFT; - } - else if( (i >= 8) && (i < 14) ) - { - action = CHEW; - direction = LEFT; - } - else if( (i >= 14) && (i < 26) ) - { - action = WALK; - direction = LEFT; - } - - BitBltSprite ( - *pphBear, - hBM_src, - action, - direction, - x[i], - y[i], - w[i], - h[i] ); - } - - SetSpriteAction( *pphBear, WALK, LEFT ); - SetSpriteVelX( *pphBear, -C_BEAR_WALKMOVE, P_ABSOLUTE ); - SetSpriteSwitch( *pphBear, C_BEAR_WALKSWITCH, P_ABSOLUTE ); - -} /* InitBear */ - -/* - * InitApple - */ -VOID InitApple ( HSPRITE **pphApple, HBITMAPLIST *phBitmapList ) -{ - *pphApple = CreateSprite( 1, 50 * C_UNIT, 390 * C_UNIT, 32, 32, C_FORE_W * C_TILE_W, C_FORE_H * C_TILE_H, 0, FALSE ); - - BitBltSprite( *pphApple, phBitmapList[61].hBM, NONE, RIGHT, 0, 0, 32, 32 ); - - SetSpriteAction( *pphApple, NONE, RIGHT ); - -} /* InitApple */ - - -/* - * PreInitializeGame - */ -BOOL PreInitializeGame( void ) -{ - return InitBuffer( &hBuffer); - -} /* PreInitializeGame */ - - -/* - * InitializeGame - */ -BOOL InitializeGame ( void ) -{ - Splash(); - - hBitmapList = LoadBitmaps(); - if( hBitmapList == NULL ) - { - return FALSE; - } - - InitTiles( &hTileList, hBitmapList, C_TILETOTAL ); - - InitPlane( &hForeground, &hForePosList, "FORELIST", C_FORE_W, C_FORE_H, C_FORE_DENOM ); - TilePlane( hForeground, hTileList, hForePosList ); - - InitPlane( &hMidground, &hMidPosList, "MIDLIST", C_MID_W, C_MID_H, C_MID_DENOM ); - TilePlane( hMidground, hTileList, hMidPosList ); - - InitPlane( &hBackground, &hBackPosList, "BACKLIST", C_BACK_W, C_BACK_H, C_BACK_DENOM ); - TilePlane( hBackground, hTileList, hBackPosList ); - - InitSurface( &hSurfaceList, "SURFLIST", C_FORE_W, C_FORE_H ); - SurfacePlane( hForeground, hSurfaceList ); - - InitFox( &hFox, hBitmapList ); - InitBear( &hBear, hBitmapList ); - InitApple( &hApple, hBitmapList ); - - DDClear(); // clear all the backbuffers. - - return TRUE; - -} /* InitializeGame */ - -extern void DisplayFrameRate( void ); - -/* - * NewGameFrame - */ -int NewGameFrame( void ) -{ - - SetSpriteX( hFox, 0, P_AUTOMATIC ); - SetSpriteY( hFox, 0, P_AUTOMATIC ); - - SetPlaneVelX( hBackground, GetSpriteVelX(hFox), P_ABSOLUTE ); - SetPlaneVelX( hMidground, GetSpriteVelX(hFox), P_ABSOLUTE ); - SetPlaneVelX( hForeground, GetSpriteVelX(hFox), P_ABSOLUTE ); - - SetPlaneX( hBackground, 0, P_AUTOMATIC ); - SetPlaneX( hMidground, 0, P_AUTOMATIC ); - SetPlaneX( hForeground, 0, P_AUTOMATIC ); - - SetSpriteX( hBear, 0, P_AUTOMATIC ); - SetSpriteX( hApple, 0, P_AUTOMATIC ); - SetSpriteY( hApple, 0, P_AUTOMATIC ); - - /* - * once all sprites are processed, display them - * - * If we are using destination transparency instead of source - * transparency, we need to paint the background with the color key - * and then paint our sprites and planes in reverse order. - * - * Since destination transparency will allow you to only write pixels - * on the destination if the transparent color is present, reversing - * the order (so that the topmost bitmaps are drawn first instead of - * list) causes everything to come out ok. - */ - if( bTransDest ) - { - gfxFillBack( dwColorKey ); - - DisplayFrameRate(); - - DisplaySprite( hBuffer, hApple, GetPlaneX(hForeground) ); - DisplaySprite( hBuffer, hBear, GetPlaneX(hForeground) ); - DisplaySprite( hBuffer, hFox, GetPlaneX(hForeground) ); - - DisplayPlane( hBuffer, hForeground ); - DisplayPlane( hBuffer, hMidground ); - DisplayPlane( hBuffer, hBackground ); - } - else - { - DisplayPlane( hBuffer, hBackground ); - DisplayPlane( hBuffer, hMidground ); - DisplayPlane( hBuffer, hForeground ); - - DisplaySprite( hBuffer, hFox, GetPlaneX(hForeground) ); - DisplaySprite( hBuffer, hBear, GetPlaneX(hForeground) ); - DisplaySprite( hBuffer, hApple, GetPlaneX(hForeground) ); - - DisplayFrameRate(); - } - - gfxSwapBuffers(); - - return 0; - -} /* NewGameFrame */ - -/* - * DestroyGame - */ -void DestroyGame() -{ - if (hBuffer) - { - DestroyTiles( hTileList ); - DestroyPlane( hForeground ); - DestroyPlane( hMidground ); - DestroyPlane( hBackground ); - DestroyBuffer( hBuffer ); - DestroySound(); - - hTileList = NULL; - hForeground = NULL; - hMidground = NULL; - hBackground = NULL; - hBuffer = NULL; - } - -} /* DestroyGame */ - -/* - * ProcessInput - */ -BOOL ProcessInput( SHORT input ) -{ - static BOOL fBearPlaying = FALSE; - LONG foxSpeedX; - LONG foxSpeedY; - LONG foxX; - LONG foxY; - LONG bearX; - LONG bearY; - LONG appleX; - LONG appleY; - ACTION foxAction; - DIRECTION foxDir; - BOOL cont = TRUE; - - foxSpeedX = GetSpriteVelX( hFox ); - foxAction = GetSpriteAction( hFox ); - foxDir = GetSpriteDirection( hFox ); - - if( (GetSpriteActive(hFox) == FALSE) && (input != 4209) ) - { - input = 0; - } - switch( input ) - { - case KEY_DOWN: - if( foxAction == STOP ) - { - break; - } - else if( foxAction == STILL ) - { - SetSpriteAction( hFox, CROUCH, SAME ); - } - else if( foxAction == WALK ) - { - SetSpriteAction( hFox, CROUCHWALK, SAME ); - } - break; - - case KEY_LEFT: - if( foxAction == STOP ) - { - break; - } - else if( foxSpeedX == 0 ) - { - if( foxAction == STILL ) - { - if( foxDir == RIGHT ) - { - ChangeSpriteDirection( hFox ); - SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE ); - } - else - { - SetSpriteAction( hFox, WALK, LEFT ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE ); - } - } - else if( foxAction == CROUCH ) - { - if( foxDir == RIGHT ) - { - ChangeSpriteDirection( hFox ); - SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE ); - } - else - { - SetSpriteAction( hFox, CROUCHWALK, LEFT ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE ); - } - } - else - { - SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE ); - } - } else { - SetSpriteVelX( hFox, -C_FOX_XMOVE, P_RELATIVE ); - } - break; - - case KEY_RIGHT: - if( foxAction == STOP ) - { - break; - } - else if( foxSpeedX == 0 ) - { - if( foxAction == STILL ) - { - if( foxDir == LEFT ) - { - ChangeSpriteDirection( hFox ); - SetPlaneSlideX( hForeground, C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hMidground, C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hBackground, C_BOUNDDIF, P_RELATIVE ); - SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE ); - } - else - { - SetSpriteAction( hFox, WALK, RIGHT ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE ); - } - } - else if( foxAction == CROUCH ) - { - if( foxDir == LEFT ) - { - ChangeSpriteDirection( hFox ); - SetPlaneSlideX( hForeground, C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hMidground, C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hBackground, C_BOUNDDIF, P_RELATIVE ); - SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE ); - } - else - { - SetSpriteAction( hFox, CROUCHWALK, RIGHT ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE ); - } - } - else - { - SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE ); - } - } - else - { - SetSpriteVelX( hFox, C_FOX_XMOVE, P_RELATIVE ); - } - break; - - case KEY_STOP: - if( foxAction == STOP ) - { - break; - } - else if( (foxAction == RUN) || (foxAction == BLURR) ) - { - SetSpriteAction( hFox, STOP, SAME ); - SetSpriteAccX( hFox, -foxSpeedX / 25, P_ABSOLUTE ); - SoundPlayEffect( SOUND_STOP ); - } else { - SetSpriteVelX( hFox, 0, P_ABSOLUTE ); - } - break; - - case KEY_UP: - if( foxAction == STOP ) - { - break; - } - else if( foxAction == CROUCH ) - { - SetSpriteAction( hFox, STILL, SAME ); - } - else if( foxAction == CROUCHWALK ) - { - SetSpriteAction( hFox, WALK, SAME ); - } - break; - - case KEY_JUMP: - if( foxAction == STOP ) - { - break; - } - else - if( (foxAction == STILL) || (foxAction == WALK) || - (foxAction == RUN) || (foxAction == CROUCH) || - (foxAction == CROUCHWALK) ) - { - SetSpriteAction( hFox, JUMP, SAME ); - SetSpriteSwitchType( hFox, TIME ); - SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE ); - SetSpriteVelY( hFox, -C_FOX_JUMPMOVE, P_ABSOLUTE ); - SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE ); - SoundPlayEffect( SOUND_JUMP ); - } - break; - - case KEY_THROW: - if( foxAction == STOP ) - { - break; - } - else if( (foxAction == STILL) || (foxAction == WALK) || - (foxAction == RUN) || (foxAction == CROUCH) || - (foxAction == CROUCHWALK) ) - { - SetSpriteAction( hFox, THROW, SAME ); - SetSpriteSwitch( hFox, C_FOX_THROWSWITCH, P_ABSOLUTE ); - SetSpriteVelX( hFox, 0, P_ABSOLUTE ); - SetSpriteSwitchType( hFox, TIME ); - } - else if( foxAction == JUMP ) - { - SetSpriteAccY( hFox, 0, P_ABSOLUTE ); - SetSpriteSwitch( hFox, C_FOX_THROWSWITCH, P_ABSOLUTE ); - SetSpriteAction( hFox, JUMPTHROW, SAME ); - SetSpriteVelY( hFox, 0, P_ABSOLUTE ); - SetSpriteSwitchDone( hFox, FALSE ); - SetSpriteSwitchForward( hFox, TRUE ); - } - break; - - default: - break; - } - - /* - * Fox actions follow... - */ - if( GetSpriteActive(hFox) == FALSE ) - { - goto bearActions; - } - - if( abs(GetSpriteVelX( hFox )) < C_FOX_XMOVE ) - { - SetSpriteVelX( hFox, 0, P_ABSOLUTE ); - } - - foxAction = GetSpriteAction( hFox ); - - if( GetSpriteVelY(hFox) == 0 ) - { - if( GetSurface( hForeground, hFox ) == FALSE ) - { - if( (foxAction == WALK) || (foxAction == RUN) || - (foxAction == CROUCHWALK) ) - { - SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE ); - } - else if( foxAction == STOP ) - { - SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE ); - SetSpriteAccX( hFox, 0, P_ABSOLUTE ); - } - } - } - else if( GetSpriteVelY(hFox) > 2 * C_UNIT ) - { - if( (foxAction == WALK) || (foxAction == RUN) || - (foxAction == CROUCHWALK) ) - { - SetSpriteSwitchForward( hFox, FALSE ); - SetSpriteAction( hFox, JUMP, SAME ); - SetSpriteSwitchType( hFox, TIME ); - SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE ); - } - if( foxAction == STOP ) - { - SetSpriteAction( hFox, STUNNED, SAME ); - SetSpriteAccX( hFox, -GetSpriteVelX(hFox) / 25, P_ABSOLUTE ); - SoundPlayEffect( SOUND_STUNNED ); - } - } - - foxSpeedX = GetSpriteVelX( hFox ); - foxSpeedY = GetSpriteVelY( hFox ); - foxAction = GetSpriteAction( hFox ); - foxDir = GetSpriteDirection( hFox ); - - switch( foxAction ) { - case STUNNED: - if( (GetSpriteVelY(hFox) >= 0) && - (!GetSurface( hForeground, hFox ) == FALSE) ) - { - SetSpriteAccY( hFox, 0, P_ABSOLUTE ); - SetSpriteAction( hFox, STOP, SAME ); - SetSpriteVelY( hFox, 0, P_ABSOLUTE ); - SetSpriteAccX( hFox, -foxSpeedX / 25, P_ABSOLUTE ); - // SetSurface( hForeground, hFox ); - SoundPlayEffect( SOUND_STOP ); - } - break; - - case CROUCHWALK: - if( foxSpeedX == 0 ) - { - SetSpriteAction( hFox, CROUCH, SAME ); - } - else if( foxSpeedX > C_FOX_WALKMOVE ) - { - SetSpriteVelX( hFox, C_FOX_WALKMOVE, P_ABSOLUTE ); - } - else if( foxSpeedX < -C_FOX_WALKMOVE ) - { - SetSpriteVelX( hFox, -C_FOX_WALKMOVE, P_ABSOLUTE ); - } - break; - - case STOP: - if( foxSpeedX == 0 ) - { - SetSpriteAction( hFox, STILL, SAME ); - SetSpriteAccX( hFox, 0, P_ABSOLUTE ); - } - break; - - case RUN: - if( (foxSpeedX < C_FOX_WALKTORUN ) && (foxSpeedX > 0) ) - { - SetSpriteAction( hFox, WALK, RIGHT ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - } - else if( foxSpeedX > C_FOX_RUNTOBLURR ) - { - SetSpriteAction( hFox, BLURR, RIGHT ); - SetSpriteSwitch( hFox, C_FOX_BLURRSWITCH, P_ABSOLUTE ); - } - else if( (foxSpeedX > -C_FOX_WALKTORUN ) && (foxSpeedX < 0) ) - { - SetSpriteAction( hFox, WALK, LEFT ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - } - else if( foxSpeedX < -C_FOX_RUNTOBLURR ) - { - SetSpriteAction( hFox, BLURR, LEFT ); - SetSpriteSwitch( hFox, C_FOX_BLURRSWITCH, P_ABSOLUTE ); - } - break; - - case WALK: - if( foxSpeedX == 0 ) - { - SetSpriteAction( hFox, STILL, SAME ); - } - else if( foxSpeedX > C_FOX_WALKTORUN ) - { - SetSpriteAction( hFox, RUN, RIGHT ); - SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE ); - } - else if( foxSpeedX < -C_FOX_WALKTORUN ) - { - SetSpriteAction( hFox, RUN, LEFT ); - SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE ); - } - break; - - case BLURR: - if( (foxSpeedX < C_FOX_RUNTOBLURR ) && (foxSpeedX > C_FOX_WALKTORUN) ) - { - SetSpriteAction( hFox, RUN, RIGHT ); - SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE ); - } - else if( (foxSpeedX > -C_FOX_RUNTOBLURR ) && (foxSpeedX < -C_FOX_WALKTORUN) ) - { - SetSpriteAction( hFox, RUN, LEFT ); - SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE ); - } - break; - - case JUMPTHROW: - if( !GetSpriteSwitchDone(hFox) == FALSE ) - { - SetSpriteSwitchForward( hFox, FALSE ); - SetSpriteAction( hFox, JUMP, SAME ); - SetSpriteSwitch( hFox, C_FOX_JUMPSWITCH, P_ABSOLUTE ); - SetSpriteSwitchDone( hFox, FALSE ); - SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE ); - SoundPlayEffect( SOUND_THROW ); - } - else - if( (GetSpriteBitmap(hFox) == 1) && - (GetSpriteDirection(hFox) == RIGHT) ) - { - SetSpriteActive( hApple, TRUE ); - SetSpriteX( hApple, GetSpriteX(hFox) + 60 * C_UNIT, P_ABSOLUTE ); - SetSpriteY( hApple, GetSpriteY(hFox) + 30 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelX( hApple, 8 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE ); - SetSpriteAccX( hApple, 0, P_ABSOLUTE ); - SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE ); - } - else if( (GetSpriteBitmap(hFox) == 1) && - (GetSpriteDirection(hFox) == LEFT) ) - { - SetSpriteActive( hApple, TRUE ); - SetSpriteX( hApple, GetSpriteX(hFox) + 15 * C_UNIT, P_ABSOLUTE ); - SetSpriteY( hApple, GetSpriteY(hFox) + 30 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelX( hApple, -8 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE ); - SetSpriteAccX( hApple, 0, P_ABSOLUTE ); - SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE ); - } - break; - - case THROW: - if( !GetSpriteSwitchDone(hFox) == FALSE ) - { - SetSpriteAction( hFox, STILL, SAME ); - SetSpriteSwitchType( hFox, HOR ); - SetSpriteSwitch( hFox, 0, P_ABSOLUTE ); - SetSpriteSwitchDone( hFox, FALSE ); - SoundPlayEffect( SOUND_THROW ); - } - else if( (GetSpriteBitmap(hFox) == 1) && - (GetSpriteDirection(hFox) == RIGHT) ) - { - SetSpriteActive( hApple, TRUE ); - SetSpriteX( hApple, GetSpriteX(hFox) + 60 * C_UNIT, P_ABSOLUTE ); - SetSpriteY( hApple, GetSpriteY(hFox) + 50 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelX( hApple, 8 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE ); - SetSpriteAccX( hApple, 0, P_ABSOLUTE ); - SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE ); - } - else if( (GetSpriteBitmap(hFox) == 1) && - (GetSpriteDirection(hFox) == LEFT) ) - { - SetSpriteActive( hApple, TRUE ); - SetSpriteX( hApple, GetSpriteX(hFox) + 20 * C_UNIT, P_ABSOLUTE ); - SetSpriteY( hApple, GetSpriteY(hFox) + 50 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelX( hApple, -8 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelY( hApple, -4 * C_UNIT, P_ABSOLUTE ); - SetSpriteAccX( hApple, 0, P_ABSOLUTE ); - SetSpriteAccY( hApple, C_UNIT / 4, P_ABSOLUTE ); - } - break; - - case JUMP: - if( (foxSpeedY >= 0) && (!GetSpriteSwitchForward( hFox ) == FALSE) ) - { - SetSpriteSwitchForward( hFox, FALSE ); - } - else if( GetSpriteSwitchForward( hFox ) == FALSE ) - { - if( (!GetSurface( hForeground, hFox ) == FALSE) || - (!GetSurface( hForeground, hFox ) == FALSE) ) - { - if( foxSpeedX >= C_FOX_RUNMOVE ) - { - SetSpriteAction( hFox, RUN, SAME ); - SetSpriteSwitch( hFox, C_FOX_RUNSWITCH, P_ABSOLUTE ); - } - else if( foxSpeedX == 0 ) - { - SetSpriteAction( hFox, STILL, SAME ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - } - else - { - SetSpriteAction( hFox, WALK, SAME ); - SetSpriteSwitch( hFox, C_FOX_WALKSWITCH, P_ABSOLUTE ); - } - - SetSpriteAccY( hFox, 0, P_ABSOLUTE ); - SetSpriteVelY( hFox, 0, P_ABSOLUTE ); - SetSpriteSwitchType( hFox, HOR ); - SetSpriteSwitchForward( hFox, TRUE ); -// SetSurface( hForeground, hFox ); - SetSpriteSwitchDone( hFox, FALSE ); - } - } - break; - - } - - /* - * Bear Actions - */ - bearActions: - - foxX = GetSpriteX( hFox ); - foxY = GetSpriteY( hFox ); - bearX = GetSpriteX( hBear ); - bearY = GetSpriteY( hBear ); - appleX = GetSpriteX( hApple ); - appleY = GetSpriteY( hApple ); - - switch( GetSpriteAction( hBear ) ) { - case STRIKE: - if( GetSpriteBitmap( hBear ) == 2 ) - { - if( (bearX > foxX - C_UNIT * 30) && (bearX < foxX + C_UNIT * 40) && - (bearY < foxY + C_UNIT * 60) ) - { - SetSpriteActive( hFox, FALSE ); - if( !fBearPlaying ) - { - SoundPlayEffect( SOUND_BEARSTRIKE ); - fBearPlaying = TRUE; - } - } - else - { - SetSpriteAction( hBear, MISS, SAME ); - SetSpriteSwitch( hBear, C_BEAR_MISSSWITCH, P_ABSOLUTE ); - SetSpriteSwitchDone( hBear, FALSE ); - } - } - else if( !GetSpriteSwitchDone( hBear ) == FALSE ) - { - SetSpriteAction( hBear, CHEW, SAME ); - SetSpriteSwitchDone( hBear, FALSE ); - chewCount = 0; - fBearPlaying = FALSE; - } - break; - - case MISS: - if( !fBearPlaying ) - { - SoundPlayEffect( SOUND_BEARMISS ); - fBearPlaying = TRUE; - } - if( !GetSpriteSwitchDone( hBear ) == FALSE ) - { - SetSpriteAction( hBear, WALK, SAME ); - SetSpriteVelX( hBear, -C_BEAR_WALKMOVE, P_ABSOLUTE ); - SetSpriteSwitch( hBear, C_BEAR_WALKSWITCH, P_ABSOLUTE ); - SetSpriteSwitchType( hBear, HOR ); - fBearPlaying = FALSE; - } - break; - - case WALK: - if( (!GetSpriteActive(hApple) == FALSE) && (appleX > bearX) && - (appleX > bearX + 80 * C_UNIT) && (appleY > bearY + 30 * C_UNIT) ) - { - SetSpriteAction( hBear, STRIKE, SAME ); - SetSpriteVelX( hBear, 0, P_ABSOLUTE ); - SetSpriteSwitchType( hBear, TIME ); - SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE ); - SetSpriteSwitchDone( hBear, FALSE ); - } - else if( (bearX > foxX - C_UNIT * 30) && - (bearX < foxX + C_UNIT * 30) && - (bearY < foxY + C_UNIT * 60) ) - { - SetSpriteAction( hBear, STRIKE, SAME ); - SetSpriteVelX( hBear, 0, P_ABSOLUTE ); - SetSpriteSwitchType( hBear, TIME ); - SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE ); - SetSpriteSwitchDone( hBear, FALSE ); - } - break; - - case CHEW: - ++chewCount; - if( chewCount >= 200 ) - { - SetSpriteAction( hBear, STRIKE, SAME ); - SetSpriteSwitch( hBear, C_BEAR_STRIKESWITCH, P_ABSOLUTE ); - SetSpriteVelX( hBear, 0, P_ABSOLUTE ); - SetSpriteSwitchDone( hBear, FALSE ); - - if( GetSpriteDirection(hFox) == RIGHT ) - { - SetPlaneSlideX( hForeground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hMidground, -C_BOUNDDIF, P_RELATIVE ); - SetPlaneSlideX( hBackground, -C_BOUNDDIF, P_RELATIVE ); - } - - chewDif = GetSpriteX(hFox); - - SetSpriteActive( hFox, TRUE ); - SetSpriteAction( hFox, STUNNED, LEFT ); - SetSpriteX( hFox, GetSpriteX(hBear), P_ABSOLUTE ); - SetSpriteY( hFox, GetSpriteY(hBear), P_ABSOLUTE ); - SetSpriteAccX( hFox, 0, P_ABSOLUTE ); - SetSpriteAccY( hFox, C_UNIT / 2, P_ABSOLUTE ); - SetSpriteVelX( hFox, -8 * C_UNIT, P_ABSOLUTE ); - SetSpriteVelY( hFox, -10 * C_UNIT, P_ABSOLUTE ); - SetSpriteSwitch( hFox, 0, P_ABSOLUTE ); - SoundPlayEffect( SOUND_STUNNED ); - - chewDif -= GetSpriteX(hFox); - - SetPlaneSlideX( hForeground, -chewDif, P_RELATIVE ); - SetPlaneSlideX( hMidground, -chewDif, P_RELATIVE ); - SetPlaneSlideX( hBackground, -chewDif, P_RELATIVE ); - SetPlaneIncremX( hForeground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hMidground, C_BOUNDINCREM, P_ABSOLUTE ); - SetPlaneIncremX( hBackground, C_BOUNDINCREM, P_ABSOLUTE ); - } - break; - } - - /* - * Apple actions... - */ - if( (GetSpriteVelY(hApple) != 0) && (GetSpriteY(hApple) >= 420 * C_UNIT) ) - { - SetSpriteX( hApple, 0, P_ABSOLUTE ); - SetSpriteY( hApple, 0, P_ABSOLUTE ); - SetSpriteAccX( hApple, 0, P_ABSOLUTE ); - SetSpriteAccY( hApple, 0, P_ABSOLUTE ); - SetSpriteVelX( hApple, 0, P_ABSOLUTE ); - SetSpriteVelY( hApple, 0, P_ABSOLUTE ); - SetSpriteActive( hApple, FALSE ); - } - - return cont; - -} /* ProcessInput */ diff --git a/sdk/samples/foxbear/gameproc.h b/sdk/samples/foxbear/gameproc.h deleted file mode 100644 index 78b1f1e..0000000 --- a/sdk/samples/foxbear/gameproc.h +++ /dev/null @@ -1,197 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: gameproc.h - * Content: include file for game processing info - * - ***************************************************************************/ -#ifndef __GAMEPROC_INCLUDED__ -#define __GAMEPROC_INCLUDED__ - -typedef enum enum_POSITION { - P_ABSOLUTE, - P_RELATIVE, - P_AUTOMATIC -} POSITION; - -typedef enum enum_SWITCHING { - HOR, - VER, - TIME -} SWITCHING; - -typedef enum enum_DIRECTION { - SAME, - RIGHT, - LEFT -} DIRECTION; - -typedef enum enum_ACTION { - NONE, - STILL, - WALK, - RUN, - JUMP, - THROW, - CROUCH, - STOP, - STUNNED, - JUMPTHROW, - CROUCHWALK, - BLURR, - STRIKE, - MISS, - CHEW, -} ACTION; - -typedef SHORT HPOSLIST; -typedef BOOL HSURFACELIST; - -typedef struct struct_HPLANE { - GFX_HBM *hBM; - BOOL *surface; - LONG x; - LONG y; - USHORT width; - USHORT height; - LONG xv; - LONG xslide; - LONG xincrem; - USHORT denom; -} HPLANE, FAR *LPHPLANE; - -typedef struct struct_HSPRITE_BM { - GFX_HBM hBM; - ACTION action; - DIRECTION direction; - SHORT x; - SHORT y; - USHORT width; - USHORT height; -} HSPRITE_BM; - -typedef struct struct_HSPRITE { - HSPRITE_BM *hSBM; - USHORT bitmapCount; - ACTION currentAction; - DIRECTION currentDirection; - USHORT currentBitmap; - BOOL active; - LONG x; - LONG y; - USHORT width; - USHORT height; - LONG xv; - LONG yv; - LONG xa; - LONG ya; - SHORT xmax; - SHORT ymax; - LONG absSwitch; - LONG relSwitch; - SWITCHING switchType; - BOOL switchForward; - BOOL switchDone; -} HSPRITE, FAR *LPHSPRITE, FAR * FAR *LPLPHSPRITE; - -typedef struct struct_HBITMAPLIST -{ - GFX_HBM *hBM; -} HBITMAPLIST, FAR *LPHBITMAPLIST; - - -#include "tile.h" -#include "plane.h" -#include "sprite.h" - -#define C_UNIT (LONG) 65536 - -#define C_TILE_W 32 -#define C_TILE_H 32 -#define C_SCREEN_W 640 -#define C_SCREEN_H 480 - -#define C_FORE_W 80 -#define C_FORE_H 15 -#define C_MID_W 40 -#define C_MID_H 15 -#define C_BACK_W 25 -#define C_BACK_H 15 -#define C_WORLD_W 20 -#define C_WORLD_H 15 - -#define C_BACK_DENOM 12 -#define C_MID_DENOM 3 -#define C_FORE_DENOM 1 - -#define C_TILETOTAL 123 // TILE BITMAP TOTAL -#define C_FBT 112 // FOX BITMAP TOTAL -#define C_BBT 26 // BEAR BITMAP TOTAL - -#define C_FOXSTILL 1 // NUMBER OF BITMAPS -#define C_FOXWALK 12 -#define C_FOXRUN 16 -#define C_FOXJUMP 4 -#define C_FOXTHROW 2 -#define C_FOXCROUCH 1 -#define C_FOXSTOP 1 -#define C_FOXSTUNNED 1 -#define C_FOXJUMPTHROW 2 -#define C_FOXCROUCHWALK 12 -#define C_FOXBLURR 4 - -#define C_BEARMISS 2 -#define C_BEARWALK 12 -#define C_BEARSTRIKE 12 - - -#define C_FOX_XMOVE (LONG) C_UNIT / 4 - -#define C_BOUNDINCREM (LONG) 5 * C_UNIT -#define C_BOUNDDIF (LONG) 240 * C_UNIT - -#define C_FOX_STARTX (LONG) 150 * C_UNIT -#define C_FOX_STARTY (LONG) 318 * C_UNIT - -#define C_FOX_WALKMOVE (LONG) 6 * C_UNIT -#define C_FOX_RUNMOVE (LONG) 18 * C_UNIT -#define C_FOX_JUMPMOVE (LONG) 9 * C_UNIT - -#define C_FOX_WALKSWITCH (LONG) 6 * C_UNIT -#define C_FOX_JUMPSWITCH (LONG) 9 * C_UNIT -#define C_FOX_THROWSWITCH (LONG) 15 * C_UNIT -#define C_FOX_RUNSWITCH (LONG) 18 * C_UNIT -#define C_FOX_BLURRSWITCH (LONG) 18 * C_UNIT - -#define C_FOX_WALKTORUN (LONG) 4 * C_UNIT -#define C_FOX_RUNTOBLURR (LONG) 14 * C_UNIT - -#define C_BEAR_STARTX (LONG) 600 * C_UNIT -#define C_BEAR_STARTY (LONG) 329 * C_UNIT - -#define C_BEAR_WALKMOVE (LONG) 1 * C_UNIT - -#define C_BEAR_WALKSWITCH (LONG) 6 * C_UNIT -#define C_BEAR_STRIKESWITCH (LONG) 8 * C_UNIT -#define C_BEAR_MISSSWITCH (LONG) 10 * C_UNIT - - -extern void ErrorMessage( LPSTR ); -extern BOOL InitBuffer( GFX_HBM* ); -extern void DestroyBuffer( GFX_HBM ); -extern HBITMAPLIST *LoadBitmaps( void ); -extern void InitTiles( HBITMAPLIST**, HBITMAPLIST*, USHORT ); -extern void InitPlane( HPLANE**, HPOSLIST**, CHAR*, USHORT, USHORT, USHORT ); -extern void InitSurface( HSURFACELIST**, CHAR*, USHORT, USHORT ); -extern void InitFox( HSPRITE**, HBITMAPLIST* ); -extern void InitBear( HSPRITE**, HBITMAPLIST* ); -extern void InitApple( HSPRITE**, HBITMAPLIST* ); -extern BOOL PreInitializeGame( void ); -extern BOOL InitializeGame( void ); -extern BOOL GetInput( void ); -extern BOOL ProcessInput ( SHORT input ); -extern int NewGameFrame( void ); -extern void DestroyGame( void ); -#endif diff --git a/sdk/samples/foxbear/gfx.c b/sdk/samples/foxbear/gfx.c deleted file mode 100644 index 7628b67..0000000 --- a/sdk/samples/foxbear/gfx.c +++ /dev/null @@ -1,602 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: gfx.c - * Content: graphics API - * - ***************************************************************************/ -#include "foxbear.h" - -GFX_BITMAP *lpVRAM; - -static BOOL fForceRestore = FALSE; - -/* - * gfxBlt - */ -BOOL gfxBlt(RECT *dst, GFX_HBM bm, POINT *src) -{ - GFX_BITMAP* pbm = (GFX_BITMAP*)bm; - HRESULT ddrval; - DWORD bltflags; - RECT rc; - int x,y,dx,dy; - - if( GameSize.cy == C_SCREEN_H ) - { - x = dst->left; - y = dst->top; - dx = dst->right - dst->left; - dy = dst->bottom - dst->top; - rc.left = src->x; - rc.top = src->y; - rc.right = rc.left + dx; - rc.bottom = rc.top + dy; - } - else - { - x = MapX(dst->left); - y = MapY(dst->top); - dx = MapX(dst->right) - x; - dy = MapY(dst->bottom) - y; - rc.left = MapDX(src->x); - rc.top = MapDY(src->y); - rc.right = rc.left + dx; - rc.bottom = rc.top + dy; - } - - if( dx == 0 || dy == 0 ) - { - return TRUE; - } - - if (pbm->lpSurface) - { - if( pbm->bTrans ) - bltflags = bTransDest ? DDBLTFAST_DESTCOLORKEY : DDBLTFAST_SRCCOLORKEY; - else - bltflags = bTransDest ? DDBLTFAST_DESTCOLORKEY : DDBLTFAST_NOCOLORKEY; - - ddrval = IDirectDrawSurface_BltFast( - lpBackBuffer, x, y, - pbm->lpSurface, &rc, bltflags | DDBLTFAST_WAIT); - - if (ddrval != DD_OK) - { - Msg("BltFast failed err=%d", ddrval); - } - } - else - { - DDBLTFX ddbltfx; - - rc.left = x; - rc.top = y; - rc.right = rc.left + dx; - rc.bottom = rc.top + dy; - - ddbltfx.dwSize = sizeof( ddbltfx ); - ddbltfx.dwFillColor = pbm->dwColor; - - ddrval = IDirectDrawSurface_Blt( - lpBackBuffer, // dest surface - &rc, // dest rect - NULL, // src surface - NULL, // src rect - DDBLT_COLORFILL | DDBLT_WAIT, - &ddbltfx); - } - - return TRUE; - -} /* gfxBlt */ - -/* - * gfxCreateSolidColorBitmap - */ -GFX_HBM gfxCreateSolidColorBitmap(COLORREF rgb) -{ - GFX_BITMAP *pvram; - - pvram = MemAlloc( sizeof( *pvram ) ); - - if( pvram == NULL ) - { - return NULL; - } - - pvram->dwColor = DDColorMatch(lpBackBuffer, rgb); - pvram->lpSurface = NULL; - pvram->lpbi = NULL; - pvram->bTrans = FALSE; - - pvram->link = lpVRAM; - lpVRAM = pvram; - - return (GFX_HBM) pvram; - -} /* gfxCreateSolidColorBitmap */ - -/* - * gfxCreateBitmap - */ -GFX_HBM gfxCreateVramBitmap(BITMAPINFOHEADER UNALIGNED *lpbi,BOOL bTrans) -{ - GFX_BITMAP *pvram; - - pvram = MemAlloc( sizeof( *pvram ) ); - - if( pvram == NULL ) - { - return NULL; - } - pvram->lpSurface = DDCreateSurface(MapRX(lpbi->biWidth), - MapRY(lpbi->biHeight), FALSE, TRUE); - pvram->lpbi = lpbi; - pvram->dwColor = 0; - pvram->bTrans = bTrans; - - if( pvram->lpSurface == NULL ) - { - return NULL; - } - - pvram->link = lpVRAM; - lpVRAM = pvram; - gfxRestore((GFX_HBM) pvram); - - return (GFX_HBM) pvram; - -} /* gfxCreateVramBitmap */ - -/* - * gfxDestroyBitmap - */ -BOOL gfxDestroyBitmap ( GFX_HBM hbm ) -{ - GFX_BITMAP *p = (GFX_BITMAP *)hbm; - - if (hbm == NULL || hbm == GFX_TRUE) - { - return FALSE; - } - - if (p->lpSurface) - { - IDirectDrawSurface_Release(p->lpSurface); - p->lpSurface = NULL; - } - - if (p->lpbi) - { - p->lpbi = NULL; - } - - MemFree((VOID *)p); - - return TRUE; - -} /* gfxDestroyBitmap */ - -/* - * gfxStretchBackBuffer() - */ -BOOL gfxStretchBackbuffer() -{ - if (lpStretchBuffer) - { - IDirectDrawSurface_Blt( - lpStretchBuffer, // dest surface - NULL, // dest rect (all of it) - lpBackBuffer, // src surface - &GameRect, // src rect - DDBLT_WAIT, - NULL); - - IDirectDrawSurface_Blt( - lpBackBuffer, // dest surface - NULL, // dest rect (all of it) - lpStretchBuffer, // src surface - NULL, // src rect - DDBLT_WAIT, - NULL); - } - else - { - IDirectDrawSurface_Blt( - lpBackBuffer, // dest surface - NULL, // dest rect (all of it) - lpBackBuffer, // src surface - &GameRect, // src rect - DDBLT_WAIT, - NULL); - } - - return TRUE; - -} /* gfxStretchBackbuffer */ - -/* - * gfxFlip - */ -BOOL gfxFlip( void ) -{ - HRESULT ddrval; - - ddrval = IDirectDrawSurface_Flip( lpFrontBuffer, NULL, DDFLIP_WAIT ); - if( ddrval != DD_OK ) - { - Msg( "Flip FAILED, rc=%08lx", ddrval ); - return FALSE; - } - return TRUE; - -} /* gfxFlip */ - -/* - * gfxUpdateWindow - */ -BOOL gfxUpdateWindow() -{ - HRESULT ddrval; - - ddrval = IDirectDrawSurface_Blt( - lpFrontBuffer, // dest surface - &rcWindow, // dest rect - lpBackBuffer, // src surface - NULL, // src rect (all of it) - DDBLT_WAIT, - NULL); - - return ddrval == DD_OK; - -} /* gfxUpdateWindow */ - -/* - * gfxSwapBuffers - * - * this is called when the game loop has rendered a frame into - * the backbuffer, its goal is to display something for the user to see. - * - * there are four cases... - * - * Fullscreen: - * we just call IDirectDrawSurface::Flip(lpFrontBuffer) - * being careful to handle return code right. - * - * Fullscreen (stretched): - * the game loop has rendered a frame 1/2 the display - * size, we do a Blt to stretch the frame to the backbuffer - * the we just call IDirectDrawSurface::Flip(lpFrontBuffer) - * - * Window mode (foreground palette): - * in this case we call IDirectDrawSurface::Blt to copy - * the back buffer to the window. - * - * Window mode (background palette): - * in this case we are in a window, but we dont own the - * palette. all our art was loaded to a specific palette - * IDirectDrawSurface::Blt does not do color translation - * we have a few options in this case... - * - * reload or remap the art to the the current palette - * (we can do this easily with a GetDC, StetchDIBits) - * FoxBear has *alot* of art, so this would be too slow. - * - * use GDI to draw the backbuffer, GDI will handle - * the color conversion so things will look correct. - * - * pause the game (this is what we do so this function - * will never be called) - * - */ -BOOL gfxSwapBuffers( void ) -{ - if( bFullscreen ) - { - if( bStretch ) - { - gfxStretchBackbuffer(); - } - - if (nBufferCount > 1) - return gfxFlip(); - else - return TRUE; - } - else - { - return gfxUpdateWindow(); - } - -} /* gfxSwapBuffers */ - -/* - * gfxBegin - */ -GFX_HBM gfxBegin( void ) -{ - if( !DDEnable() ) - { - return NULL; - } - - if( !DDCreateFlippingSurface() ) - { - DDDisable(TRUE); - return NULL; - } - Splash(); - - return GFX_TRUE; - -} /* gfxBegin */ - -/* - * gfxEnd - */ -BOOL gfxEnd ( GFX_HBM hbm ) -{ - GFX_BITMAP *curr; - GFX_BITMAP *next; - - for( curr = lpVRAM; curr; curr=next ) - { - next = curr->link; - gfxDestroyBitmap ((GFX_HBM)curr); - } - - lpVRAM = NULL; - - return DDDisable(FALSE); - - return TRUE; - -} /* gfxEnd */ - -/* - * gfxRestore - * - * restore the art when one or more surfaces are lost - */ -BOOL gfxRestore(GFX_HBM bm) -{ - GFX_BITMAP *pbm = (GFX_BITMAP*)bm; - HRESULT ddrval; - HDC hdc; - LPVOID lpBits; - RGBQUAD *prgb; - int i,w,h; - RECT rc; - - struct { - BITMAPINFOHEADER bi; - RGBQUAD ct[256]; - } dib; - - IDirectDrawSurface *pdds = pbm->lpSurface; - BITMAPINFOHEADER UNALIGNED *pbi = pbm->lpbi; - - if (pdds == NULL) - return TRUE; - - if (IDirectDrawSurface_Restore(pdds) != DD_OK) - return FALSE; - - if (pbi == NULL) - return TRUE; - - // - // in 8bbp mode if we get switched away from while loading - // (and palette mapping) our art, the colors will not be correct - // because some app may have changed the system palette. - // - // if we are in stress mode, just keep going. It is more important - // to make progress than to get the colors right. - // - - if (!bFullscreen && - GameBPP == 8 && - GetForegroundWindow() != hWndMain && - !bStress ) - { - Msg("gfxRestore: **** foreground window changed while loading art!"); - fForceRestore = TRUE; - PauseGame(); - return FALSE; - } - - dib.bi = *pbi; - - prgb = (RGBQUAD *)((LPBYTE)pbi + pbi->biSize); - lpBits = (LPBYTE)(prgb + pbi->biClrUsed); - - if( pbi->biClrUsed == 0 && pbi->biBitCount <= 8 ) - { - lpBits = (LPBYTE)(prgb + (1<biBitCount)); - } - - w = MapRX(pbi->biWidth); - h = MapRY(pbi->biHeight); - /* - * hack to make sure fox off-white doesn't become - * pure white (which is transparent) - */ - for( i=0; i<256; i++ ) - { - dib.ct[i] = prgb[i]; - - if( dib.ct[i].rgbRed == 0xff && - dib.ct[i].rgbGreen == 0xff && - dib.ct[i].rgbBlue == 224 ) - { - dib.ct[i].rgbBlue = 0x80; - } - else - if( dib.ct[i].rgbRed == 251 && - dib.ct[i].rgbGreen == 243 && - dib.ct[i].rgbBlue == 234 ) - { - dib.ct[i].rgbBlue = 0x80; - } - } - - /* - * if we are in 8bit mode we know the palette is 332 we can - * do the mapping our self. - * - * NOTE we can only do this in fullscreen mode - * in windowed mode, we have to share the palette with - * the window manager and we dont get all of the colors - * in the order we assume. - * - */ - if (bFullscreen && GameBPP == pbi->biBitCount && GameBPP == 8 ) - { - BYTE xlat332[256]; - DDSURFACEDESC ddsd; - int x,y,dib_pitch; - BYTE *src, *dst; - BOOL stretch; - IDirectDrawSurface *pdds1; - HDC hdc1; - - stretch = w != pbi->biWidth || h != pbi->biHeight; - - for( i=0;i<256;i++ ) - { - xlat332[i] = - ((dib.ct[i].rgbRed >> 0) & 0xE0 ) | - ((dib.ct[i].rgbGreen >> 3) & 0x1C ) | - ((dib.ct[i].rgbBlue >> 6) & 0x03 ); - } - - /* - * if we are stretching copy into the back buffer - * then use GDI to stretch later. - */ - if( stretch ) - { - pdds1 = lpBackBuffer; - } - else - { - pdds1 = pdds; - } - - ddsd.dwSize = sizeof(ddsd); - ddrval = IDirectDrawSurface_Lock( - pdds1, NULL, &ddsd, DDLOCK_WAIT, NULL); - - if( ddrval == DD_OK ) - { - dib_pitch = (pbi->biWidth+3)&~3; - src = (BYTE *)lpBits + dib_pitch * (pbi->biHeight-1); - dst = (BYTE *)ddsd.lpSurface; - for( y=0; y<(int)pbi->biHeight; y++ ) - { - for( x=0; x<(int)pbi->biWidth; x++ ) - { - dst[x] = xlat332[src[x]]; - } - dst += ddsd.lPitch; - src -= dib_pitch; - } - IDirectDrawSurface_Unlock(pdds1, NULL); - } - else - { - Msg("Lock failed err=%d", ddrval); - return FALSE; - } - - if( stretch ) - { - if( IDirectDrawSurface_GetDC(pdds,&hdc) == DD_OK ) - { - if( IDirectDrawSurface_GetDC(pdds1,&hdc1) == DD_OK ) - { - SetStretchBltMode(hdc, COLORONCOLOR); - StretchBlt(hdc, 0, 0, w, h, - hdc1, 0, 0, pbi->biWidth, pbi->biHeight, SRCCOPY); - IDirectDrawSurface_ReleaseDC(pdds1,hdc1); - } - IDirectDrawSurface_ReleaseDC(pdds,hdc); - } - } - } - else if( IDirectDrawSurface_GetDC(pdds,&hdc) == DD_OK ) - { - SetStretchBltMode(hdc, COLORONCOLOR); - StretchDIBits(hdc, 0, 0, w, h, - 0, 0, pbi->biWidth, pbi->biHeight, - lpBits, (BITMAPINFO *)&dib.bi, DIB_RGB_COLORS, SRCCOPY); - - IDirectDrawSurface_ReleaseDC(pdds,hdc); - } - - /* - * show the art while loading... - */ - rc.left = rcWindow.left, - rc.top = rcWindow.top + 20; - rc.right = rc.left + w; - rc.bottom = rc.top + h; - IDirectDrawSurface_Blt(lpFrontBuffer, &rc, pdds, NULL, DDBLT_WAIT, NULL); - - return TRUE; - -} /* gfxRestore */ - -/* - * gfxRestoreAll - * - * restore the art when one or more surfaces are lost - */ -BOOL gfxRestoreAll() -{ - GFX_BITMAP *curr; - HWND hwndF = GetForegroundWindow(); - - Splash(); - - for( curr = lpVRAM; curr != NULL; curr = curr->link) - { - if (curr->lpSurface && - (fForceRestore || IDirectDrawSurface_IsLost(curr->lpSurface) == DDERR_SURFACELOST)) - { - if( !gfxRestore(curr) ) - { - Msg( "gfxRestoreAll: ************ Restore FAILED!" ); - return FALSE; - } - } - } - - DDClear(); - fForceRestore = FALSE; - return TRUE; - -} /* gfxRestoreAll */ - -/* - * gfxFillBack - */ -void gfxFillBack( DWORD dwColor ) -{ - DDBLTFX ddbltfx; - - ddbltfx.dwSize = sizeof( ddbltfx ); - ddbltfx.dwFillColor = dwColor; - - IDirectDrawSurface_Blt( - lpBackBuffer, // dest surface - NULL, // dest rect - NULL, // src surface - NULL, // src rect - DDBLT_COLORFILL | DDBLT_WAIT, - &ddbltfx); - -} /* gfxFillBack */ diff --git a/sdk/samples/foxbear/gfx.h b/sdk/samples/foxbear/gfx.h deleted file mode 100644 index 95c2873..0000000 --- a/sdk/samples/foxbear/gfx.h +++ /dev/null @@ -1,45 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: gfx.h - * Content: graphics routines include file - * - ***************************************************************************/ -#ifndef __GFX_INCLUDED__ -#define __GFX_INCLUDED__ - -#define GFX_FALSE ((GFX_HBM)0) -#define GFX_TRUE ((GFX_HBM)1) - -typedef struct _GFX_BITMAP -{ - struct _GFX_BITMAP *link; // linked in a chain for restore. - DWORD dwColor; // solid fill color - BOOL bTrans; // transparent? - LPDIRECTDRAWSURFACE lpSurface; // the DirectDrawSurface. - LPBITMAPINFOHEADER lpbi; // the DIB to restore from. - -} GFX_BITMAP; - -typedef VOID *GFX_HBM; - - -// -// Prototypes -// - -GFX_HBM gfxLoadBitmap(LPSTR); -GFX_HBM gfxCreateVramBitmap(BITMAPINFOHEADER UNALIGNED * ,BOOL); -GFX_HBM gfxCreateSolidColorBitmap(COLORREF rgb); -BOOL gfxDestroyBitmap(GFX_HBM); -BOOL gfxSwapBuffers(void); -GFX_HBM gfxBegin(VOID); -BOOL gfxEnd(GFX_HBM); -void gfxFillBack( DWORD dwColor ); -BOOL gfxBlt(RECT *dst, GFX_HBM bm, POINT *src); -BOOL gfxRestore(GFX_HBM bm); -BOOL gfxRestoreAll(void); - -#endif diff --git a/sdk/samples/foxbear/jump.wav b/sdk/samples/foxbear/jump.wav deleted file mode 100644 index 134cd88..0000000 Binary files a/sdk/samples/foxbear/jump.wav and /dev/null differ diff --git a/sdk/samples/foxbear/makefile b/sdk/samples/foxbear/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/foxbear/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/foxbear/midlist.dat b/sdk/samples/foxbear/midlist.dat deleted file mode 100644 index e3674b6..0000000 --- a/sdk/samples/foxbear/midlist.dat +++ /dev/null @@ -1,15 +0,0 @@ - 0 110 117 117 117 117 117 114 117 117 117 117 111 0 110 117 117 117 117 117 114 117 117 117 117 111 0 110 117 117 117 117 117 114 117 117 117 117 111 0 - 0 99 117 112 117 117 117 117 117 117 117 117 109 0 99 117 112 117 117 117 117 117 117 117 117 109 0 99 117 112 117 117 117 117 117 117 117 117 109 0 - 0 98 117 117 117 117 117 117 117 115 117 108 107 0 98 117 117 117 117 117 117 117 115 117 108 107 0 98 117 117 117 117 117 117 117 115 117 108 107 0 - 0 97 117 117 117 113 117 117 117 117 117 105 106 0 97 117 117 117 113 117 117 117 117 117 105 106 0 97 117 117 117 113 117 117 117 117 117 105 106 0 - 0 96 95 117 117 117 117 117 117 117 117 104 0 0 96 95 117 117 117 117 117 117 117 117 104 0 0 96 95 117 117 117 117 117 117 117 117 104 0 0 - 0 0 94 93 92 91 89 90 100 101 102 103 0 0 0 94 93 92 91 89 90 100 101 102 103 0 0 0 94 93 92 91 89 90 100 101 102 103 0 0 - 0 0 84 83 0 0 87 88 0 0 0 0 0 0 0 84 83 0 0 87 88 0 0 0 0 0 0 0 84 83 0 0 87 88 0 0 0 0 0 0 - 0 86 85 82 81 80 78 79 0 0 0 0 0 0 86 85 82 81 80 78 79 0 0 0 0 0 0 86 85 82 81 80 78 79 0 0 0 0 0 0 - 0 0 0 0 0 0 76 77 72 73 74 75 0 0 0 0 0 0 0 76 77 72 73 74 75 0 0 0 0 0 0 0 76 77 72 73 74 75 0 0 - 0 0 0 0 0 0 69 70 71 0 0 0 0 0 0 0 0 0 0 69 70 71 0 0 0 0 0 0 0 0 0 0 69 70 71 0 0 0 0 0 - 0 0 0 0 0 0 67 68 0 0 0 0 0 0 0 0 0 0 0 67 68 0 0 0 0 0 0 0 0 0 0 0 67 68 0 0 0 0 0 0 - 0 0 0 0 0 0 65 66 0 0 0 0 0 0 0 0 0 0 0 65 66 0 0 0 0 0 0 0 0 0 0 0 65 66 0 0 0 0 0 0 - 0 0 0 0 0 0 63 64 0 0 0 0 0 0 0 0 0 0 0 63 64 0 0 0 0 0 0 0 0 0 0 0 63 64 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/sdk/samples/foxbear/miss01.wav b/sdk/samples/foxbear/miss01.wav deleted file mode 100644 index 8300b78..0000000 Binary files a/sdk/samples/foxbear/miss01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/miss02.wav b/sdk/samples/foxbear/miss02.wav deleted file mode 100644 index 8e5e9da..0000000 Binary files a/sdk/samples/foxbear/miss02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/msvc.mk b/sdk/samples/foxbear/msvc.mk deleted file mode 100644 index 6fbc862..0000000 --- a/sdk/samples/foxbear/msvc.mk +++ /dev/null @@ -1,43 +0,0 @@ -NAME = foxbear -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib fastfile.lib libc.lib dsound.lib - -OBJS = foxbear.obj gameproc.obj tile.obj plane.obj sprite.obj gfx.obj \ - bmp.obj ddraw.obj fbsound.obj dsutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/foxbear/plane.c b/sdk/samples/foxbear/plane.c deleted file mode 100644 index 3488c8b..0000000 --- a/sdk/samples/foxbear/plane.c +++ /dev/null @@ -1,423 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: plane.c - * Content: plane manipulation functions - * - ***************************************************************************/ -#include "foxbear.h" - -/* - * CreatePlane - */ -HPLANE *CreatePlane ( USHORT width, USHORT height, USHORT denom ) -{ - HPLANE *hPlane; - USHORT num_elems; - USHORT elem_size; - - num_elems = width * height; - elem_size = sizeof (GFX_HBM); - - hPlane = MemAlloc( sizeof (HPLANE) ); - if( hPlane == NULL ) - { - ErrorMessage( "hPlane in CreatePlane" ); - } - - hPlane->hBM = CMemAlloc( num_elems, elem_size ); - hPlane->surface = CMemAlloc( num_elems, sizeof hPlane->surface ); - hPlane->x = 0; - hPlane->y = 0; - hPlane->width = width; - hPlane->height = height; - hPlane->denom = denom; - hPlane->xslide = 0; - hPlane->xincrem = 0; - hPlane->xv = 0; - - if( hPlane->hBM == NULL ) - { - MemFree( hPlane ); - ErrorMessage( "hPlane->hBM in CreatePlane" ); - } - - return hPlane; - -} /* CreatePlane */ - - -/* - * TilePlane - */ -BOOL TilePlane( HPLANE *hPlane, HBITMAPLIST *hTileList, HPOSLIST *posList ) -{ - USHORT i; - - for( i = 0; i < hPlane->width * hPlane->height; ++i ) - { - hPlane->surface[i] = FALSE; - - if( posList[i] >= 0 ) - { - hPlane->hBM[i] = hTileList[ posList[i] ].hBM; - } - else - { - hPlane->hBM[i] = NULL; - } - } - - return TRUE; - -} /* TilePlane */ - -/* - * SurfacePlane - */ -BOOL SurfacePlane( HPLANE *hPlane, HSURFACELIST *hSurfaceList ) -{ - USHORT i; - - for( i = 0; i < hPlane->width * hPlane->height; ++i ) - { - if( hSurfaceList[i] == FALSE ) - { - hPlane->surface[i] = FALSE; - } - else - { - hPlane->surface[i] = TRUE; - } - } - - return TRUE; - -} /* SurfacePlane */ - -/* - * SetSurface - */ -BOOL SetSurface( HPLANE *hPlane, HSPRITE *hSprite ) -{ - SHORT c; - SHORT n; - SHORT x; - SHORT y; - - c = hSprite->currentBitmap; - x = (hSprite->x >> 16) / C_TILE_W; - y = (SHORT) hSprite->y >> 16; - - y += hSprite->hSBM[c].y + hSprite->hSBM[c].height; - y /= C_TILE_H; - - n = (x % hPlane->width) + y * hPlane->width; - - if( hPlane->surface[n] == FALSE ) - { - if( !hPlane->surface[n + hPlane->width] == FALSE ) - { - y += 1; - } - if( !hPlane->surface[n - hPlane->width] == FALSE ) - { - y -= 1; - } - } - - y *= C_TILE_H; - y -= hSprite->hSBM[c].y + hSprite->hSBM[c].height; - - SetSpriteY( hSprite, y << 16, P_ABSOLUTE ); - - return TRUE; - -} /* SetSurface */ - -/* - * GetSurface - */ -BOOL GetSurface( HPLANE *hPlane, HSPRITE *hSprite ) -{ - SHORT c; - SHORT x; - SHORT y; - - c = hSprite->currentBitmap; - x = ((hSprite->x >> 16) + hSprite->width / 2) / C_TILE_H; - y = ((hSprite->y >> 16) + hSprite->hSBM[c].y + hSprite->hSBM[c].height) / C_TILE_W; - - return hPlane->surface[(x % hPlane->width) + y * hPlane->width]; - -} /* GetSurface */ - -/* - * SetPlaneX - */ -BOOL SetPlaneX( HPLANE *hPlane, LONG x, POSITION position ) -{ - LONG xincrem; - - if( position == P_ABSOLUTE ) - { - hPlane->x = x; - } - else if( position == P_RELATIVE ) - { - hPlane->x += x; - } - else if( position == P_AUTOMATIC ) - { - if( hPlane->xslide > 0 ) - { - xincrem = hPlane->xincrem; - } - else if( hPlane->xslide < 0 ) - { - xincrem = -hPlane->xincrem; - } - else - { - xincrem = 0; - } - - hPlane->x += (hPlane->xv + xincrem) / hPlane->denom; - hPlane->xslide -= xincrem; - hPlane->xv = 0; - - if( abs(hPlane->xslide) < hPlane->xincrem ) - { - hPlane->x += hPlane->xslide / hPlane->denom; - hPlane->xslide = 0; - hPlane->xincrem = 0; - } - } - - if( hPlane->x < 0 ) - { - hPlane->x += (hPlane->width * C_TILE_W) << 16; - } - else if( hPlane->x >= (hPlane->width * C_TILE_W) << 16 ) - { - hPlane->x -= (hPlane->width * C_TILE_W) << 16; - } - - return TRUE; - -} /* SetPlaneX */ - -/* - * GetPlaneX - */ -LONG GetPlaneX( HPLANE *hPlane ) -{ - return hPlane->x; - -} /* GetPlaneX */ - -/* - * SetPlaneY - */ -BOOL SetPlaneY( HPLANE *hPlane, LONG y, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hPlane->y = y; - } - else - { - hPlane->y += y; - } - - if( hPlane->y < 0 ) - { - hPlane->y += (hPlane->height * C_TILE_H) << 16; - } - else if( hPlane->y >= (hPlane->height * C_TILE_H) << 16 ) - { - hPlane->y -= (hPlane->height * C_TILE_H) << 16; - } - - return TRUE; - -} /* SetPlaneY */ - -/* - * GetPlaneY - */ -LONG GetPlaneY( HPLANE *hPlane ) -{ - return hPlane->y; - -} /* GetPlaneY */ - -/* - * SetPlaneSlideX - */ -BOOL SetPlaneSlideX( HPLANE *hPlane, LONG xslide, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hPlane->xslide = xslide; - } - else if( position == P_RELATIVE ) - { - hPlane->xslide += xslide; - } - return TRUE; - -} /* SetPlaneSlideX */ - -/* - * SetPlaneVelX - */ -BOOL SetPlaneVelX( HPLANE *hPlane, LONG xv, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hPlane->xv = xv; - } - else if( position == P_RELATIVE ) - { - hPlane->xv += xv; - } - - return TRUE; -} /* SetPlaneVelX */ - -/* - * SetPlaneIncremX - */ -BOOL SetPlaneIncremX( HPLANE *hPlane, LONG xincrem, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hPlane->xincrem = xincrem; - } - else if( position == P_RELATIVE ) - { - hPlane->xincrem += xincrem; - } - - return TRUE; - -} /* SetPlaneIncremX */ - -/* - * ScrollPlane - */ -BOOL ScrollPlane( HSPRITE *hSprite ) -{ - if( (GetSpriteX(hSprite) <= C_FOX_STARTX) && (GetSpriteVelX(hSprite) < 0) ) - { - return TRUE; - } - - if( (GetSpriteX(hSprite) >= C_FOX_STARTX) && (GetSpriteVelX(hSprite) > 0) ) - { - return TRUE; - } - return FALSE; - -} /* ScrollPlane */ - - -/* - * DisplayPlane - */ -BOOL DisplayPlane ( GFX_HBM hBuffer, HPLANE *hPlane ) -{ - USHORT n; - USHORT i; - USHORT j; - USHORT x1; - USHORT y1; - USHORT x2; - USHORT y2; - USHORT xmod; - USHORT ymod; - POINT src; - RECT dst; - - - x1 = (hPlane->x >> 16) / C_TILE_W; - y1 = (hPlane->y >> 16) / C_TILE_H; - x2 = x1 + C_SCREEN_W / C_TILE_W; - y2 = y1 + C_SCREEN_H / C_TILE_H; - xmod = (hPlane->x >> 16) % C_TILE_W; - ymod = (hPlane->y >> 16) % C_TILE_H; - - for( j = y1; j < y2; ++j ) - { - for( i = x1; i <= x2; ++i ) - { - n = (i % hPlane->width) + j * hPlane->width; - if( hPlane->hBM[n] != NULL ) - { - if( i == x1 ) - { - dst.left = 0; - dst.right = dst.left + C_TILE_W - xmod; - src.x = xmod; - } - else if( i == x2 ) - { - dst.left = (i - x1) * C_TILE_W - xmod; - dst.right = dst.left + xmod; - src.x = 0; - } else { - dst.left = (i - x1) * C_TILE_W - xmod; - dst.right = dst.left + C_TILE_W; - src.x = 0; - } - - if( j == y1 ) - { - dst.top = 0; - dst.bottom = dst.top + C_TILE_H - ymod; - src.y = ymod; - } - else if( j == y2 ) - { - dst.top = (j - y1) * C_TILE_H - ymod; - dst.bottom = dst.top + ymod; - src.y = 0; - } else { - dst.top = (j - y1) * C_TILE_H - ymod; - dst.bottom = dst.top + C_TILE_H; - src.y = 0; - } - - gfxBlt(&dst,hPlane->hBM[n],&src); - } - } - } - - return TRUE; - -} /* DisplayPlane */ - -/* - * DestroyPlane - */ -BOOL DestroyPlane ( HPLANE *hPlane ) -{ - if( hPlane == NULL ) - { - ErrorMessage( "hPlane in DestroyPlane" ); - } - - if( hPlane->hBM == NULL ) - { - ErrorMessage( "hPlane->hBM in DestroyPlane" ); - } - - MemFree( hPlane->hBM ); - MemFree( hPlane ); - - return TRUE; - -} /* DestroyPlane */ diff --git a/sdk/samples/foxbear/plane.h b/sdk/samples/foxbear/plane.h deleted file mode 100644 index 8448087..0000000 --- a/sdk/samples/foxbear/plane.h +++ /dev/null @@ -1,29 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: plane.h - * Content: planes include file - * - ***************************************************************************/ -#ifndef __PLANE_INCLUDED__ -#define __PLANE_INCLUDED__ - -HPLANE *CreatePlane( USHORT, USHORT, USHORT ); -BOOL TilePlane( HPLANE*, HBITMAPLIST*, HPOSLIST* ); -BOOL SurfacePlane( HPLANE*, HSURFACELIST* ); -BOOL SetSurface( HPLANE*, HSPRITE* ); -BOOL GetSurface( HPLANE*, HSPRITE* ); -BOOL SetPlaneX( HPLANE*, LONG, POSITION ); -LONG GetPlaneX( HPLANE* ); -BOOL SetPlaneY( HPLANE*, LONG, POSITION ); -LONG GetPlaneY( HPLANE* ); -BOOL SetPlaneSlideX( HPLANE*, LONG, POSITION ); -BOOL SetPlaneVelX( HPLANE*, LONG, POSITION ); -BOOL SetPlaneIncremX( HPLANE*, LONG, POSITION ); -BOOL ScrollPlane( HSPRITE* ); -BOOL DisplayPlane( GFX_HBM, HPLANE* ); -BOOL DestroyPlane( HPLANE* ); - -#endif diff --git a/sdk/samples/foxbear/rcids.h b/sdk/samples/foxbear/rcids.h deleted file mode 100644 index 4adbff6..0000000 --- a/sdk/samples/foxbear/rcids.h +++ /dev/null @@ -1 +0,0 @@ -#define FOX_ICON 101 diff --git a/sdk/samples/foxbear/readme.txt b/sdk/samples/foxbear/readme.txt deleted file mode 100644 index 620d980..0000000 --- a/sdk/samples/foxbear/readme.txt +++ /dev/null @@ -1,36 +0,0 @@ -The Fox & The Bear Sample -------------------------- - -You need to run FOXBEAR from the FOXBEAR directory for it to find all of -its files. - - -Commands for using Foxbear: - - F12 - quit - NUMPAD 2 - crouch - NUMPAD 3 - throw an apple - NUMPAD 4 - move right (hold down to run faster) - NUMPAD 5 - stop - NUMPAD 6 - move left (hold down to run faster) - NUMPAD 7 - jump - - -Options for running foxbear: - -WIN.INI Command line - -use_emulation=0 Use hardware acceleration -use_emulation=1 -e Use emulation, not hardware -use_dsound=0 -S Do not use Direct Sound -use_dsound=1 Use Direct Sound -buffers=0 Double or trible buffer vram size dependent -buffers=1 -1 Use no back buffer -buffers=2 -2 Double buffer - -d Double buffer -buffers=4 -4 Use 3 back buffers - -s Use stretch -sysmem=1 Use system memory when creating surfaces - -x Demo or stress mode (keeps running) - -command line dash parameters may be followed by x-resolution y-resolution color-depth diff --git a/sdk/samples/foxbear/rgb332.pal b/sdk/samples/foxbear/rgb332.pal deleted file mode 100644 index 189199b..0000000 Binary files a/sdk/samples/foxbear/rgb332.pal and /dev/null differ diff --git a/sdk/samples/foxbear/sprite.c b/sdk/samples/foxbear/sprite.c deleted file mode 100644 index c753339..0000000 --- a/sdk/samples/foxbear/sprite.c +++ /dev/null @@ -1,792 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: sprite.c - * Content: sprite manipulation functions - * - ***************************************************************************/ -#include "foxbear.h" - -/* - * CreateSprite - */ -HSPRITE *CreateSprite ( - USHORT bitmapCount, - LONG x, - LONG y, - USHORT width, - USHORT height, - USHORT xmax, - USHORT ymax, - SHORT as, - BOOL active ) -{ - HSPRITE *hSprite; - USHORT i; - - hSprite = MemAlloc( sizeof (HSPRITE) ); - if( hSprite == NULL ) - { - ErrorMessage( "hSprite in CreateSprite" ); - } - - hSprite->hSBM = CMemAlloc( bitmapCount, sizeof (HSPRITE_BM) ); - if( hSprite->hSBM == NULL ) - { - MemFree( hSprite ); - ErrorMessage( "hSprite->hSBM in CreateSprite" ); - } - - hSprite->active = active; - hSprite->bitmapCount = bitmapCount; - hSprite->x = x; - hSprite->y = y; - hSprite->width = width; - hSprite->height = height; - hSprite->xv = 0; - hSprite->yv = 0; - hSprite->xa = 0; - hSprite->ya = 0; - hSprite->xmax = xmax; - hSprite->ymax = ymax; - hSprite->absSwitch = as; - hSprite->relSwitch = 0; - hSprite->switchType = HOR; - hSprite->switchForward = TRUE; - hSprite->switchDone = FALSE; - - for( i = 0; i < bitmapCount; ++i ) - { - hSprite->hSBM[i].hBM = NULL; - } - - return hSprite; - -} /* CreateSprite */ - -/* - * BitBltSprite - */ -BOOL BitBltSprite ( - HSPRITE *hSprite, - GFX_HBM hBM, - ACTION action, - DIRECTION direction, - SHORT x, - SHORT y, - USHORT w, - USHORT h ) -{ - USHORT count; - - if( hSprite == NULL ) - { - ErrorMessage( "hSprite in BitBltSprite" ); - } - - if( hBM == NULL ) - { - ErrorMessage( "hBM in BitBltSprite" ); - } - - if( (x >= hSprite->width) || (y >= hSprite->height) ) - { - ErrorMessage( "x or y in BitBltSprite" ); - } - - count = 0; - while( hSprite->hSBM[count].hBM != NULL ) - { - count++; - if( count >= hSprite->bitmapCount ) - { - ErrorMessage( "Bitmap overflow in BitBltSprite" ); - } - } - - hSprite->hSBM[count].hBM = hBM; - hSprite->hSBM[count].action = action; - hSprite->hSBM[count].direction = direction; - hSprite->hSBM[count].x = x; - hSprite->hSBM[count].y = y; - hSprite->hSBM[count].width = w; - hSprite->hSBM[count].height = h; - - return TRUE; - -} /* BitBltSprite */ - -/* - * SetSpriteAction - */ -BOOL SetSpriteAction ( HSPRITE *hSprite, ACTION action, DIRECTION direction ) -{ - USHORT c; - - c = 0; - - if( direction == SAME ) - { - direction = hSprite->currentDirection; - } - - while( (hSprite->hSBM[c].action != action) || (hSprite->hSBM[c].direction != direction) ) - { - ++c; - } - - hSprite->currentAction = action; - hSprite->currentDirection = direction; - hSprite->currentBitmap = c; - hSprite->relSwitch = 0; - - return TRUE; - -} /* SetSpriteAction */ - -/* - * ChangeSpriteDirection - */ -BOOL ChangeSpriteDirection( HSPRITE *hSprite ) -{ - DIRECTION direction; - - if( hSprite->currentDirection == RIGHT ) - { - direction = LEFT; - } - else - { - direction = RIGHT; - } - - SetSpriteAction( hSprite, hSprite->currentAction, direction ); - - return TRUE; - -} /* ChangeSpriteDirection */ - -/* - * GetSpriteAction - */ -ACTION GetSpriteAction( HSPRITE *hSprite ) -{ - return hSprite->currentAction; - -} /* GetSpriteAction */ - - -/* - * GetSpriteDirection - */ -DIRECTION GetSpriteDirection( HSPRITE *hSprite ) -{ - return hSprite->currentDirection; - -} /* GetSpriteDirection */ - -/* - * SetSpriteActive - */ -BOOL SetSpriteActive( HSPRITE *hSprite, BOOL active ) -{ - hSprite->active = active; - - if( active == FALSE ) - { - hSprite->xv = 0; - hSprite->yv = 0; - hSprite->xa = 0; - hSprite->ya = 0; - } - - return TRUE; - -} /* SetSpriteActive */ - -/* - * GetSpriteActive - */ -BOOL GetSpriteActive( HSPRITE *hSprite ) -{ - return hSprite->active; - -} /* GetSpriteActive */ - -/* - * SetSpriteVelX - */ -BOOL SetSpriteVelX( HSPRITE *hSprite, LONG xv, POSITION position ) -{ - if( hSprite->active == FALSE ) - { - return FALSE; - } - - if( position == P_ABSOLUTE ) - { - hSprite->xv = xv; - } - else if( position == P_RELATIVE ) - { - hSprite->xv += xv; - } - - return TRUE; - -} /* SetSpriteVelX */ - -/* - * GetSpriteVelX - */ -LONG GetSpriteVelX( HSPRITE *hSprite ) -{ - return hSprite->xv; - -} /* GetSpriteVelX */ - -/* - * SetSpriteVelY - */ -BOOL SetSpriteVelY( HSPRITE *hSprite, LONG yv, POSITION position ) -{ - if( hSprite->active == FALSE ) - { - return FALSE; - } - - if( position == P_ABSOLUTE ) - { - hSprite->yv = yv; - } - else if( position == P_RELATIVE ) - { - hSprite->yv += yv; - } - - return TRUE; - -} /* SetSpriteVelY */ - -/* - * GetSpriteVelY - */ -LONG GetSpriteVelY( HSPRITE *hSprite ) -{ - return hSprite->yv; - -} /* GetSpriteVelY */ - -/* - * SetSpriteAccX - */ -BOOL SetSpriteAccX ( HSPRITE *hSprite, LONG xa, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hSprite->xa = xa; - } - else if( position == P_RELATIVE ) - { - hSprite->xa += xa; - } - return TRUE; - -} /* SetSpriteAccX */ - -/* - * GetSpriteAccX - */ -LONG GetSpriteAccX( HSPRITE *hSprite ) -{ - return hSprite->xa; - -} /* GetSpriteAccX */ - -/* - * SetSpriteAccY - */ -BOOL SetSpriteAccY ( HSPRITE *hSprite, LONG ya, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hSprite->ya = ya; - } - else if( position == P_RELATIVE ) - { - hSprite->ya += ya; - } - return TRUE; - -} /* SetSpriteAccY */ - -/* - * GetSpriteAccY - */ -LONG GetSpriteAccY( HSPRITE *hSprite ) -{ - return hSprite->ya; - -} /* GetSpriteAccY */ - -/* - * SetSpriteX - */ -BOOL SetSpriteX( HSPRITE *hSprite, LONG x, POSITION position ) -{ - if( hSprite->active == FALSE ) - { - return FALSE; - } - - if( position == P_AUTOMATIC ) - { - hSprite->xv += hSprite->xa; - hSprite->x += hSprite->xv; - } - else if( position == P_ABSOLUTE ) - { - hSprite->x = x; - } - else if( position == P_RELATIVE ) - { - hSprite->x += x; - } - - if( hSprite->x < 0 ) - { - hSprite->x += hSprite->xmax << 16; - } - else if( hSprite->x >= hSprite->xmax << 16 ) - { - hSprite->x -= hSprite->xmax << 16; - } - return TRUE; - -} /* SetSpriteX */ - -/* - * GetSpriteX - */ -LONG GetSpriteX( HSPRITE *hSprite ) -{ - return hSprite->x; - -} /* GetSpriteX */ - -/* - * SetSpriteY - */ -BOOL SetSpriteY ( HSPRITE *hSprite, LONG y, POSITION position ) -{ - if( hSprite->active == FALSE ) - { - return FALSE; - } - - if( position == P_AUTOMATIC ) - { - hSprite->yv += hSprite->ya; - hSprite->y += hSprite->yv; - } - else if( position == P_ABSOLUTE ) - { - hSprite->y = y; - } - else if( position == P_RELATIVE ) - { - hSprite->y += y; - } - - if( hSprite->y < 0 ) - { - hSprite->y += hSprite->ymax << 16; - } - else if( hSprite->y >= hSprite->ymax << 16 ) - { - hSprite->y -= hSprite->ymax << 16; - } - - return TRUE; - -} /* SetSpriteY */ - -/* - * GetSpriteY - */ -LONG GetSpriteY( HSPRITE *hSprite ) -{ - return hSprite->y; - -} /* GetSpriteY */ - -/* - * SetSpriteSwitch - */ -BOOL SetSpriteSwitch ( HSPRITE *hSprite, LONG absSwitch, POSITION position ) -{ - if( position == P_ABSOLUTE ) - { - hSprite->absSwitch = absSwitch; - } - else if( position == P_RELATIVE ) - { - hSprite->absSwitch += absSwitch; - } - return TRUE; - -} /* SetSpriteSwitch */ - - -/* - * IncrementSpriteSwitch - */ -BOOL IncrementSpriteSwitch ( HSPRITE *hSprite, LONG n ) -{ - hSprite->relSwitch += n; - return TRUE; - -} /* IncrementSpriteSwitch */ - -/* - * SetSpriteSwitchType - */ -BOOL SetSpriteSwitchType( HSPRITE *hSprite, SWITCHING switchType ) -{ - hSprite->switchType = switchType; - hSprite->relSwitch = 0; - return TRUE; - -} /* SetSpriteSwitchType */ - - -/* - * GetSpriteSwitchType - */ -SWITCHING GetSpriteSwitchType ( HSPRITE *hSprite ) -{ - return hSprite->switchType; - -} /* GetSpriteSwitchType */ - -/* - * SetSpriteSwitchForward - */ -BOOL SetSpriteSwitchForward( HSPRITE *hSprite, BOOL switchForward ) -{ - hSprite->switchForward = switchForward; - - return TRUE; - -} /* SetSpriteSwitchForward */ - -/* - * GetSpriteSwitchForward - */ -BOOL GetSpriteSwitchForward( HSPRITE *hSprite ) -{ - return hSprite->switchForward; - -} /* GetSpriteSwitchForward */ - -/* - * SetSpriteSwitchDone - */ -BOOL SetSpriteSwitchDone( HSPRITE *hSprite, BOOL switchDone ) -{ - hSprite->switchDone = switchDone; - return TRUE; - -} /* SetSpriteSwitchDone */ - - -/* - * GetSpriteSwitchDone - */ -BOOL GetSpriteSwitchDone( HSPRITE *hSprite ) -{ - return hSprite->switchDone; - -} /* GetSpriteSwitchDone */ - -/* - * SetSpriteBitmap - */ -BOOL SetSpriteBitmap ( HSPRITE *hSprite, USHORT currentBitmap ) -{ - USHORT c; - - c = 0; - while( (hSprite->currentAction != hSprite->hSBM[c].action) || - (hSprite->currentDirection != hSprite->hSBM[c].direction) ) - { - ++c; - } - hSprite->currentBitmap = c + currentBitmap; - return TRUE; - -} /* SetSpriteBitmap */ - -/* - * GetSpriteBitmap - */ -USHORT GetSpriteBitmap( HSPRITE *hSprite ) -{ - USHORT count; - - count = 0; - while( (hSprite->currentAction != hSprite->hSBM[count].action) || - (hSprite->currentDirection != hSprite->hSBM[count].direction) ) - { - ++count; - } - return hSprite->currentBitmap - count; - -} /* GetSpriteBitmap */ - -/* - * advanceSpriteBitmap - */ -static BOOL advanceSpriteBitmap( HSPRITE *hSprite ) -{ - SHORT c; - SHORT n; - ACTION curAct; - ACTION act; - DIRECTION curDir; - DIRECTION dir; - - curAct = hSprite->currentAction; - curDir = hSprite->currentDirection; - - // - // See if we're cycling forward or backward though the images. - // - if( hSprite->switchForward ) // Are we cycling forward? - { - c = hSprite->currentBitmap + 1; - - // Does the next image exceed the number of images we have? - if( c >= hSprite->bitmapCount ) - { - // if the next image is past the end of the list, - // we need to set it to the start of the series. - SetSpriteBitmap( hSprite, 0 ); - c = hSprite->currentBitmap; - } - else - { - act = hSprite->hSBM[c].action; - dir = hSprite->hSBM[c].direction; - - // By examining the action and direction fields we can tell - // if we've past the current series of images and entered - // another series. - if( (curAct != act) || (curDir != dir) ) - { - SetSpriteBitmap( hSprite, 0 ); - } - else // We're still in the series, use the next image. - { - hSprite->currentBitmap = c; - } - } - } - else //cycling backwards - { - c = hSprite->currentBitmap - 1; - - if( c < 0 ) // Is the next image past the beginning of the list? - { - n = 0; - - // Find the last bitmap in the series - while( (n <= hSprite->bitmapCount) && - (curAct == hSprite->hSBM[n].action) && - (curDir == hSprite->hSBM[n].direction) ) - { - ++n; - } - - hSprite->currentBitmap = n - 1; - } - - else - { - act = hSprite->hSBM[c].action; - dir = hSprite->hSBM[c].direction; - // Is the next image past the of the series - if( (curAct != act) || (curDir != dir) ) - { - n = c + 1; - while( (n <= hSprite->bitmapCount) && - (curAct == hSprite->hSBM[n].action) && - (curDir == hSprite->hSBM[n].direction) ) - { - ++n; - } - - hSprite->currentBitmap = n - 1; - } - else // The next image is fine, use it. - { - hSprite->currentBitmap = c; - } - } - } - return TRUE; - -} /* advanceSpriteBitmap */ - -/* - * DisplaySprite - */ -BOOL DisplaySprite ( GFX_HBM hBuffer, HSPRITE *hSprite, LONG xPlane ) -{ - USHORT count; - SHORT left; - SHORT right; - SHORT shortx; - SHORT shorty; - SHORT planex; - POINT src; - RECT dst; - - if( hSprite->active == FALSE ) - { - return FALSE; - } - - count = hSprite->currentBitmap; - shortx = (SHORT) (hSprite->x >> 16); - shorty = (SHORT) (hSprite->y >> 16); - planex = (SHORT) (xPlane >> 16); - src.x = 0; - src.y = 0; - - if( shortx < planex - C_SCREEN_W ) - { - shortx += hSprite->xmax; - } - else if( shortx >= planex + C_SCREEN_W ) - { - shortx -= hSprite->xmax; - } - - left = shortx - planex; - - if( hSprite->currentDirection == RIGHT ) - { - left += hSprite->hSBM[count].x; - } - else - { - left += hSprite->width - hSprite->hSBM[count].x - hSprite->hSBM[count].width; - } - - right = left + hSprite->hSBM[count].width; - - if( left > C_SCREEN_W ) - { - left = C_SCREEN_W; - } - else if( left < 0 ) - { - src.x = -left; - left = 0; - } - - if( right > C_SCREEN_W ) - { - right = C_SCREEN_W; - } - else if( right < 0 ) - { - right = 0; - } - - dst.left = left; - dst.right = right; - dst.top = shorty + hSprite->hSBM[count].y; - dst.bottom = dst.top + hSprite->hSBM[count].height; - - gfxBlt(&dst,hSprite->hSBM[count].hBM,&src); - - if( hSprite->switchType == HOR ) - { - hSprite->relSwitch += abs(hSprite->xv); - - if( hSprite->relSwitch >= hSprite->absSwitch ) - { - hSprite->relSwitch = 0; - advanceSpriteBitmap( hSprite ); - } - } - else if( hSprite->switchType == VER ) - { - hSprite->relSwitch += abs(hSprite->yv); - - if( hSprite->relSwitch >= hSprite->absSwitch ) - { - hSprite->relSwitch = 0; - advanceSpriteBitmap( hSprite ); - - if( GetSpriteBitmap( hSprite ) == 0 ) - { - SetSpriteSwitchDone( hSprite, TRUE ); - } - } - } - else if( hSprite->switchType == TIME ) - { - hSprite->relSwitch += C_UNIT; - - if( hSprite->relSwitch >= hSprite->absSwitch ) - { - hSprite->relSwitch = 0; - advanceSpriteBitmap( hSprite ); - - if( GetSpriteBitmap( hSprite ) == 0 ) - { - SetSpriteSwitchDone( hSprite, TRUE ); - } - } - } - - return TRUE; - -} /* DisplaySprite */ - -/* - * DestroySprite - */ -BOOL DestroySprite ( HSPRITE *hSprite ) -{ - USHORT i; - - if( hSprite == NULL ) - { - ErrorMessage( "hSprite in DestroySprite" ); - } - - if( hSprite->hSBM == NULL ) - { - ErrorMessage( "hSprite->hSBM in DestroySprite" ); - } - - for( i = 0; i < hSprite->bitmapCount; ++i ) - { - if( !gfxDestroyBitmap( hSprite->hSBM[i].hBM ) ) - { - ErrorMessage( "gfxDestroyBitmap (hBM) in DestroySprite" ); - } - } - - MemFree( hSprite->hSBM ); - MemFree( hSprite ); - - return TRUE; - -} /* DestroySprite */ diff --git a/sdk/samples/foxbear/sprite.h b/sdk/samples/foxbear/sprite.h deleted file mode 100644 index 1723f98..0000000 --- a/sdk/samples/foxbear/sprite.h +++ /dev/null @@ -1,45 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: sprite.h - * Content: sprite include file - * - ***************************************************************************/ -#ifndef __SPRITE_INCLUDED__ -#define __SPRITE_INCLUDED__ - -HSPRITE *CreateSprite( USHORT, LONG, LONG, USHORT, USHORT, USHORT, USHORT, SHORT, BOOL ); -BOOL BitBltSprite( HSPRITE*, GFX_HBM, ACTION, DIRECTION, SHORT, SHORT, USHORT, USHORT ); -BOOL SetSpriteAction( HSPRITE*, ACTION, DIRECTION ); -ACTION GetSpriteAction( HSPRITE* ); -BOOL ChangeSpriteDirection( HSPRITE* ); -DIRECTION GetSpriteDirection( HSPRITE* ); -BOOL SetSpriteBitmap( HSPRITE*, USHORT ); -USHORT GetSpriteBitmap( HSPRITE* ); -BOOL SetSpriteActive( HSPRITE*, BOOL ); -BOOL GetSpriteActive( HSPRITE* ); -BOOL SetSpriteVelX( HSPRITE*, LONG, POSITION ); -LONG GetSpriteVelX( HSPRITE* ); -BOOL SetSpriteVelY( HSPRITE*, LONG, POSITION ); -LONG GetSpriteVelY( HSPRITE* ); -BOOL SetSpriteAccX( HSPRITE*, LONG, POSITION ); -LONG GetSpriteAccX( HSPRITE* ); -BOOL SetSpriteAccY( HSPRITE*, LONG, POSITION ); -LONG GetSpriteAccY( HSPRITE* ); -BOOL SetSpriteX( HSPRITE*, LONG, POSITION ); -LONG GetSpriteX( HSPRITE* ); -BOOL SetSpriteY( HSPRITE*, LONG, POSITION ); -LONG GetSpriteY( HSPRITE* ); -BOOL SetSpriteSwitch( HSPRITE*, LONG, POSITION ); -BOOL IncrementSpriteSwitch( HSPRITE*, LONG ); -BOOL SetSpriteSwitchType( HSPRITE*, SWITCHING ); -SWITCHING GetSpriteSwitchType( HSPRITE* ); -BOOL SetSpriteSwitchForward( HSPRITE*, BOOL ); -BOOL GetSpriteSwitchForward( HSPRITE* ); -BOOL SetSpriteSwitchDone( HSPRITE*, BOOL ); -BOOL GetSpriteSwitchDone( HSPRITE* ); -BOOL DisplaySprite( GFX_HBM, HSPRITE*, LONG ); -BOOL DestroySprite( HSPRITE* ); -#endif diff --git a/sdk/samples/foxbear/stop.wav b/sdk/samples/foxbear/stop.wav deleted file mode 100644 index 834b1ee..0000000 Binary files a/sdk/samples/foxbear/stop.wav and /dev/null differ diff --git a/sdk/samples/foxbear/strike01.wav b/sdk/samples/foxbear/strike01.wav deleted file mode 100644 index 0615e4a..0000000 Binary files a/sdk/samples/foxbear/strike01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/strike02.wav b/sdk/samples/foxbear/strike02.wav deleted file mode 100644 index 513c0a8..0000000 Binary files a/sdk/samples/foxbear/strike02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/stunned.wav b/sdk/samples/foxbear/stunned.wav deleted file mode 100644 index 3950a8c..0000000 Binary files a/sdk/samples/foxbear/stunned.wav and /dev/null differ diff --git a/sdk/samples/foxbear/surflist.dat b/sdk/samples/foxbear/surflist.dat deleted file mode 100644 index 90c984f..0000000 --- a/sdk/samples/foxbear/surflist.dat +++ /dev/null @@ -1,15 +0,0 @@ - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/sdk/samples/foxbear/throw.wav b/sdk/samples/foxbear/throw.wav deleted file mode 100644 index 87cd36d..0000000 Binary files a/sdk/samples/foxbear/throw.wav and /dev/null differ diff --git a/sdk/samples/foxbear/tile.c b/sdk/samples/foxbear/tile.c deleted file mode 100644 index 3816cb8..0000000 --- a/sdk/samples/foxbear/tile.c +++ /dev/null @@ -1,152 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: tile.c - * Content: tile loading and initialization functions - * - ***************************************************************************/ -#include "foxbear.h" - -/* - * CreateTiles - */ -HBITMAPLIST *CreateTiles( HBITMAPLIST *phBitmapList, USHORT n ) -{ - HBITMAPLIST *hTileList; - USHORT i; - - hTileList = CMemAlloc( n, sizeof (HBITMAPLIST) ); - - if( hTileList == NULL ) - { - ErrorMessage( "hTileList in CreateTiles" ); - } - - for( i = 0; i < n; ++i ) - { - hTileList[i].hBM = phBitmapList[i].hBM; - } - return hTileList; - -} /* CreateTiles */ - -/* - * DestroyTiles - */ -BOOL DestroyTiles( HBITMAPLIST *phTileList ) -{ - MemFree( phTileList ); - - return TRUE; - -} /* DestroyTiles */ - -/* - * getData - */ -LPSTR getData(LPSTR fileName) -{ - LPSTR p = NULL; - HRSRC hRes; - - hRes = FindResource(NULL, fileName, RT_RCDATA); - - if( hRes != NULL ) - { - p = LockResource(LoadResource(NULL, hRes)); - } - - return p; - -} /* getData */ - -/* - * CreatePosList - */ -HPOSLIST *CreatePosList( LPSTR fileName, USHORT width, USHORT height ) -{ - HPOSLIST *hPosList; - USHORT pos; - LPSTR p; - - p = getData( fileName ); - - if( p == NULL ) - { - ErrorMessage( "p in CreatePosList" ); - } - - hPosList = CMemAlloc( width * height, sizeof (USHORT) ); - - if( hPosList == NULL ) - { - ErrorMessage( "posList in CreatePosList" ); - } - - for( pos = 0; pos < width * height; ++pos ) - { - hPosList[pos] = (USHORT) getint(&p, 0) - 1; - } - - return hPosList; - -} /* CreatePosList */ - -/* - * CreateSurfaceList - */ -HSURFACELIST *CreateSurfaceList( LPSTR fileName, USHORT width, USHORT height ) -{ - HSURFACELIST *hSurfaceList; - USHORT pos; - USHORT value; - LPSTR p; - - p = getData( fileName ); - - if( p == NULL ) - { - ErrorMessage( "p in CreateSurfaceList" ); - } - - hSurfaceList = CMemAlloc( width * height, sizeof (HSURFACELIST) ); - - if( hSurfaceList == NULL ) - { - ErrorMessage( "posList in CreateSurfaceList" ); - } - - for( pos = 0; pos < width * height; ++pos ) - { - value = (USHORT) getint(&p, 0); - - if( value == 0 ) - { - hSurfaceList[pos] = FALSE; - } - else - { - hSurfaceList[pos] = TRUE; - } - } - - return hSurfaceList; - -} /* CreateSurfaceList */ - -/* - * DestoryPosList - */ -BOOL DestroyPosList ( HPOSLIST *posList ) -{ - if( posList == NULL ) - { - ErrorMessage( "posList in DestroyPosList" ); - } - - MemFree( posList ); - return TRUE; - -} /* DestroyPosList */ diff --git a/sdk/samples/foxbear/tile.h b/sdk/samples/foxbear/tile.h deleted file mode 100644 index c89ba32..0000000 --- a/sdk/samples/foxbear/tile.h +++ /dev/null @@ -1,20 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved. - * - * File: tile.h - * Content: tile include file - * - ***************************************************************************/ -#ifndef TILE__H__ -#define TILE__H__ - -HBITMAPLIST *CreateTiles( HBITMAPLIST*, USHORT ); -void ReloadTiles( HBITMAPLIST*, USHORT ); -BOOL DestroyTiles( HBITMAPLIST* ); -HPOSLIST *CreatePosList( CHAR*, USHORT, USHORT ); -HSURFACELIST *CreateSurfaceList( CHAR*, USHORT, USHORT ); -BOOL DestroyPosList( HPOSLIST* ); - -#endif diff --git a/sdk/samples/foxbear/wavdata/16-22/jump.wav b/sdk/samples/foxbear/wavdata/16-22/jump.wav deleted file mode 100644 index 134cd88..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/jump.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/miss01.wav b/sdk/samples/foxbear/wavdata/16-22/miss01.wav deleted file mode 100644 index 8300b78..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/miss01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/miss02.wav b/sdk/samples/foxbear/wavdata/16-22/miss02.wav deleted file mode 100644 index 8e5e9da..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/miss02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/stop.wav b/sdk/samples/foxbear/wavdata/16-22/stop.wav deleted file mode 100644 index 834b1ee..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/stop.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/strike01.wav b/sdk/samples/foxbear/wavdata/16-22/strike01.wav deleted file mode 100644 index 0615e4a..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/strike01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/strike02.wav b/sdk/samples/foxbear/wavdata/16-22/strike02.wav deleted file mode 100644 index 513c0a8..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/strike02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/stunned.wav b/sdk/samples/foxbear/wavdata/16-22/stunned.wav deleted file mode 100644 index 3950a8c..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/stunned.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-22/throw.wav b/sdk/samples/foxbear/wavdata/16-22/throw.wav deleted file mode 100644 index 87cd36d..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-22/throw.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/jump.wav b/sdk/samples/foxbear/wavdata/16-44/jump.wav deleted file mode 100644 index 5c0b8bd..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/jump.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/miss01.wav b/sdk/samples/foxbear/wavdata/16-44/miss01.wav deleted file mode 100644 index 15b38be..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/miss01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/miss02.wav b/sdk/samples/foxbear/wavdata/16-44/miss02.wav deleted file mode 100644 index 1a15f40..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/miss02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/stop.wav b/sdk/samples/foxbear/wavdata/16-44/stop.wav deleted file mode 100644 index 7becea5..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/stop.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/strike01.wav b/sdk/samples/foxbear/wavdata/16-44/strike01.wav deleted file mode 100644 index 1654965..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/strike01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/strike02.wav b/sdk/samples/foxbear/wavdata/16-44/strike02.wav deleted file mode 100644 index 5826391..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/strike02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/stunned.wav b/sdk/samples/foxbear/wavdata/16-44/stunned.wav deleted file mode 100644 index ad75538..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/stunned.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/16-44/throw.wav b/sdk/samples/foxbear/wavdata/16-44/throw.wav deleted file mode 100644 index a7f9e8a..0000000 Binary files a/sdk/samples/foxbear/wavdata/16-44/throw.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/jump.wav b/sdk/samples/foxbear/wavdata/8-11/jump.wav deleted file mode 100644 index 232381b..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/jump.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/miss01.wav b/sdk/samples/foxbear/wavdata/8-11/miss01.wav deleted file mode 100644 index a2d84db..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/miss01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/miss02.wav b/sdk/samples/foxbear/wavdata/8-11/miss02.wav deleted file mode 100644 index 27f2373..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/miss02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/stop.wav b/sdk/samples/foxbear/wavdata/8-11/stop.wav deleted file mode 100644 index c5eeaba..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/stop.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/strike01.wav b/sdk/samples/foxbear/wavdata/8-11/strike01.wav deleted file mode 100644 index 300c5e0..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/strike01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/strike02.wav b/sdk/samples/foxbear/wavdata/8-11/strike02.wav deleted file mode 100644 index 68e1213..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/strike02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/stunned.wav b/sdk/samples/foxbear/wavdata/8-11/stunned.wav deleted file mode 100644 index 8fa5a5f..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/stunned.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-11/throw.wav b/sdk/samples/foxbear/wavdata/8-11/throw.wav deleted file mode 100644 index c187ba6..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-11/throw.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/jump.wav b/sdk/samples/foxbear/wavdata/8-22/jump.wav deleted file mode 100644 index dd9b2a4..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/jump.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/miss01.wav b/sdk/samples/foxbear/wavdata/8-22/miss01.wav deleted file mode 100644 index 9b96d94..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/miss01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/miss02.wav b/sdk/samples/foxbear/wavdata/8-22/miss02.wav deleted file mode 100644 index 7ec24c1..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/miss02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/stop.wav b/sdk/samples/foxbear/wavdata/8-22/stop.wav deleted file mode 100644 index cebe334..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/stop.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/strike01.wav b/sdk/samples/foxbear/wavdata/8-22/strike01.wav deleted file mode 100644 index ef2cb56..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/strike01.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/strike02.wav b/sdk/samples/foxbear/wavdata/8-22/strike02.wav deleted file mode 100644 index 06de180..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/strike02.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/stunned.wav b/sdk/samples/foxbear/wavdata/8-22/stunned.wav deleted file mode 100644 index 2a1a5d4..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/stunned.wav and /dev/null differ diff --git a/sdk/samples/foxbear/wavdata/8-22/throw.wav b/sdk/samples/foxbear/wavdata/8-22/throw.wav deleted file mode 100644 index da2a301..0000000 Binary files a/sdk/samples/foxbear/wavdata/8-22/throw.wav and /dev/null differ diff --git a/sdk/samples/globe/globe.c b/sdk/samples/globe/globe.c deleted file mode 100644 index bc32ade..0000000 --- a/sdk/samples/globe/globe.c +++ /dev/null @@ -1,225 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: globe.c - * - ***************************************************************************/ - -#include "rmdemo.h" - -D3DRMRENDERQUALITY quality = D3DRMRENDER_GOURAUD; - -LPDIRECT3DRMANIMATION anim; -int motion_points = 17; - -D3DVECTOR motion[17] = -{{-D3DVAL(14), D3DVAL(4), D3DVAL(45)}, -{D3DVAL(9), -D3DVAL(3), D3DVAL(36)}, -{D3DVAL(5), D3DVAL(0), D3DVAL(5)}, -{-D3DVAL(5), D3DVAL(8), D3DVAL(25)}, -{D3DVAL(0), D3DVAL(3), D3DVAL(20)}, -{-D3DVAL(3), -D3DVAL(4), D3DVAL(10)}, -{D3DVAL(8), D3DVAL(10), D3DVAL(15)}, -{D3DVAL(16), D3DVAL(0), D3DVAL(30)}, -{D3DVAL(10), -D3DVAL(4), D3DVAL(42)}, -{-D3DVAL(15), D3DVAL(0), D3DVAL(37)}, -{-D3DVAL(5), -D3DVAL(7), D3DVAL(15)}, -{D3DVAL(5), D3DVAL(5), D3DVAL(20)}, -{D3DVAL(5), D3DVAL(10), D3DVAL(30)}, -{D3DVAL(13), D3DVAL(8), D3DVAL(50)}, -{D3DVAL(0), D3DVAL(8), D3DVAL(25)}, -{D3DVAL(0), D3DVAL(0), D3DVAL(20)}, -{-D3DVAL(14), D3DVAL(4), D3DVAL(45)} -}; - -static void CDECL cleanupPath(LPDIRECT3DRMOBJECT obj, void* arg) -{ - anim->lpVtbl->Release(anim); -} - -static void CDECL moveCamera(LPDIRECT3DRMFRAME frame, void *arg, D3DVALUE delta) -{ - static D3DVALUE t = D3DVAL(0.0); - LPDIRECT3DRMFRAME world_frame = (LPDIRECT3DRMFRAME) arg; - LPDIRECT3DRMFRAME scene; - - frame->lpVtbl->GetScene(frame, &scene); - - t += D3DVAL(0.08); - anim->lpVtbl->SetFrame(anim, frame); - anim->lpVtbl->SetTime(anim, t); - - frame->lpVtbl->LookAt(frame, world_frame, scene, D3DRMCONSTRAIN_Z); - - scene->lpVtbl->Release(scene); -} - -/* - * world_scene - */ -BOOL -run_world_scene(LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMFRAME light1 = NULL; - LPDIRECT3DRMFRAME world_frame = NULL; - LPDIRECT3DRMLIGHT l1 = NULL; - LPDIRECT3DRMLIGHT l2 = NULL; - LPDIRECT3DRMTEXTURE tex = NULL; - LPDIRECT3DRMWRAP wrap = NULL; - LPDIRECT3DRMMESHBUILDER sphere3_builder = NULL; - LPDIRECT3DRMMATERIAL mat = NULL; - HRESULT rval; - D3DRMBOX box; - D3DVALUE miny, maxy, height; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &light1))) - goto generic_error; - if (FAILED(light1->lpVtbl->SetPosition(light1, scene, D3DVAL(2), D3DVAL(0.0), D3DVAL(22)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(0.9), - D3DVAL(0.9), D3DVAL(0.9), &l1))) - goto generic_error; - if (FAILED(light1->lpVtbl->AddLight(light1, l1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &l2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, l2))) - goto generic_error; - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)))) - goto generic_error; - if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0), - D3DVAL(1), D3DVAL(0.0)))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &world_frame))) - goto generic_error; - if (FAILED(world_frame->lpVtbl->SetPosition(world_frame, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(30)))) - goto generic_error; - if (FAILED(world_frame->lpVtbl->SetOrientation(world_frame, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1), - D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0)))) - goto generic_error; - if (FAILED(world_frame->lpVtbl->SetRotation(world_frame, scene, D3DVAL(0.03), - D3DVAL(0.1), D3DVAL(0.0), D3DVAL(0.1)))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &sphere3_builder))) - goto generic_error; - rval = sphere3_builder->lpVtbl->Load(sphere3_builder, "sphere3.x", - NULL, D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere3.x.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(lpD3DRM->lpVtbl->CreateMaterial(lpD3DRM, D3DVAL(20.0), &mat))) - goto generic_error; - if (FAILED(sphere3_builder->lpVtbl->SetMaterial(sphere3_builder, mat))) - goto generic_error; - mat->lpVtbl->Release(mat); mat = NULL; - if (FAILED(sphere3_builder->lpVtbl->Scale(sphere3_builder, - D3DVAL(2), D3DVAL(2), D3DVAL(2)))) - goto generic_error; - - if (FAILED(sphere3_builder->lpVtbl->SetColorRGB(sphere3_builder, D3DVAL(1), D3DVAL(1), D3DVAL(1)))) - goto generic_error; - if (FAILED(sphere3_builder->lpVtbl->GetBox(sphere3_builder, &box))) - goto generic_error; - maxy = box.max.y; - miny = box.min.y; - height = maxy - miny; - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap - (lpD3DRM, D3DRMWRAP_CYLINDER, NULL, - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DDivide(miny, height), - D3DVAL(1.0), D3DDivide(-D3DVAL(1.0), height), - &wrap - ))) - goto generic_error; - if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT) sphere3_builder))) - goto generic_error; - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex1.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load tex1.ppm\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(tex->lpVtbl->SetShades(tex, 32))) - goto generic_error; - if (FAILED(sphere3_builder->lpVtbl->SetTexture(sphere3_builder, tex))) - goto generic_error; - - if (FAILED(world_frame->lpVtbl->AddVisual(world_frame, (LPDIRECT3DRMVISUAL) sphere3_builder))) - goto generic_error; - - if (FAILED(camera->lpVtbl->AddMoveCallback(camera, moveCamera, - (void *) world_frame))) - goto generic_error; - if (FAILED(camera->lpVtbl->AddDestroyCallback(camera, cleanupPath, NULL))) - goto generic_error; - - RELEASE(light1); - RELEASE(world_frame); - RELEASE(sphere3_builder); - RELEASE(l1); - RELEASE(l2); - RELEASE(tex); - RELEASE(wrap); - return TRUE; -generic_error: - Msg("An error occurred while building the scene.\n"); -ret_with_error: - RELEASE(light1); - RELEASE(world_frame); - RELEASE(l1); - RELEASE(l2); - RELEASE(tex); - RELEASE(wrap); - RELEASE(sphere3_builder); - RELEASE(mat); - return FALSE; -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - int i; - - view = view; /* not used */ - - /* - * This example flys a camera around a globe. The path taken is - * defined by a spline curve. - */ - - - if (FAILED(dev->lpVtbl->SetQuality(dev, quality))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateAnimation(lpD3DRM, &anim))) - goto generic_error; - if (FAILED(anim->lpVtbl->SetOptions(anim, D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION | D3DRMANIMATION_POSITION))) - goto generic_error; - for (i = 0; i < motion_points; i++) { - if (FAILED(anim->lpVtbl->AddPositionKey(anim, D3DVAL(i), motion[i].x, motion[i].y, - motion[i].z/2))) - goto generic_error; - } - if (!run_world_scene(scene, camera)) - goto ret_with_error; - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Globe Direct3DRM Example"); -} diff --git a/sdk/samples/globe/globe.def b/sdk/samples/globe/globe.def deleted file mode 100644 index 6866888..0000000 --- a/sdk/samples/globe/globe.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME globe.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/globe/makefile b/sdk/samples/globe/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/globe/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/globe/msvc.mk b/sdk/samples/globe/msvc.mk deleted file mode 100644 index 1f5b5c8..0000000 --- a/sdk/samples/globe/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = globe -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = globe.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/globe/readme.txt b/sdk/samples/globe/readme.txt deleted file mode 100644 index a9ad11e..0000000 --- a/sdk/samples/globe/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Globe -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Loading a simple XOF of a single mesh object with textures. diff --git a/sdk/samples/hier1/hier1.c b/sdk/samples/hier1/hier1.c deleted file mode 100644 index 5a4190d..0000000 --- a/sdk/samples/hier1/hier1.c +++ /dev/null @@ -1,199 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: hier1.c - * - ***************************************************************************/ - -/* - * RL Tutorial program 2 frame hierarchy - */ - -#include "rmdemo.h" - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT; - LPDIRECT3DRMFRAME lights = NULL; - LPDIRECT3DRMFRAME axis = NULL; - LPDIRECT3DRMMESH torus_mesh = NULL; - LPDIRECT3DRMMESH sphere_mesh = NULL; - LPDIRECT3DRMFRAME torus = NULL; - LPDIRECT3DRMFRAME sphere = NULL; - LPDIRECT3DRMLIGHT lp = NULL; - LPDIRECT3DRMLIGHT la = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - HRESULT rval; - - view = view; /* not used */ - - /* - * This Demo shows a simple hierarchy of frames - */ - - if (FAILED(dev->lpVtbl->SetQuality(dev, quality))) - goto generic_error; - - /* - * initialize the lights in the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(5), D3DVAL(5), - -D3DVAL(9)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9), - D3DVAL(0.8), D3DVAL(0.7), &lp))) - goto generic_error; - if (FAILED(lights->lpVtbl->AddLight(lights, lp))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &la))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, la))) - goto generic_error; - - - /* - * load mesh files - */ - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "torus.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load torus.x\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->CreateMesh(builder, &torus_mesh))) - goto generic_error; - RELEASE(builder); - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "sphere2.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere2.x\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->CreateMesh(builder, &sphere_mesh))) - goto generic_error; - RELEASE(builder); - - if (FAILED(torus_mesh->lpVtbl->SetGroupColorRGB(torus_mesh, -1, D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0)))) - goto generic_error; - - /* - * create a torus frame within the scene create axis frame within - * frame of sphere create torus frame within frame of axis - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &sphere))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, sphere, &axis))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, axis, &torus))) - goto generic_error; - - { - /* - * load a texture and wrap it onto the sphere - */ - LPDIRECT3DRMTEXTURE tex; - LPDIRECT3DRMWRAP wrap; - D3DVALUE height; - - D3DRMBOX box; - D3DVALUE miny, maxy; - if (FAILED(sphere_mesh->lpVtbl->GetBox(sphere_mesh, &box))) - goto generic_error; - maxy = box.max.y; - miny = box.min.y; - height = maxy - miny; - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_CYLINDER, NULL, D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DDivide(maxy, height), D3DVAL(1.0), - D3DDivide(D3DVAL(1), height), &wrap))) - goto generic_error; - if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT)sphere_mesh))) - goto generic_error; - RELEASE(wrap); - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex2.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load tex2.ppm\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(tex->lpVtbl->SetColors(tex, 16))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetShades(tex, 8))) - goto generic_error; - if (FAILED(sphere_mesh->lpVtbl->SetGroupTexture(sphere_mesh, -1, tex))) - goto generic_error; - RELEASE(tex); - } - /* - * add the loaded mesh into the frame - */ - if (FAILED(torus->lpVtbl->AddVisual(torus, (LPDIRECT3DRMVISUAL) torus_mesh))) - goto generic_error; - if (FAILED(sphere->lpVtbl->AddVisual(sphere, (LPDIRECT3DRMVISUAL) sphere_mesh))) - goto generic_error; - - /* - * set up the frames position, orientation and rotation - */ - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(10)))) - goto generic_error; - if (FAILED(sphere->lpVtbl->SetPosition(sphere, scene, D3DVAL(0), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(axis->lpVtbl->SetPosition(axis, sphere, D3DVAL(2), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(torus->lpVtbl->SetPosition(torus, axis, D3DVAL(1.0), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - - if (FAILED(sphere->lpVtbl->SetRotation(sphere, scene, D3DVAL(0), D3DVAL(1.0), D3DVAL(0.5),D3DVAL(0.05)))) - goto generic_error; - if (FAILED(axis->lpVtbl->SetRotation(axis, sphere, D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0.01)))) - goto generic_error; - if (FAILED(torus->lpVtbl->SetRotation(torus, axis, D3DVAL(0), D3DVAL(0), D3DVAL(1), -D3DVAL(0.05)))) - goto generic_error; - - RELEASE(lights); - RELEASE(axis); - RELEASE(torus_mesh); - RELEASE(sphere_mesh); - RELEASE(torus); - RELEASE(sphere); - RELEASE(lp); - RELEASE(la); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(lights); - RELEASE(axis); - RELEASE(torus_mesh); - RELEASE(sphere_mesh); - RELEASE(torus); - RELEASE(sphere); - RELEASE(lp); - RELEASE(la); - RELEASE(builder); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Frame Hierarchy D3D RM Example"); -} diff --git a/sdk/samples/hier1/hier1.def b/sdk/samples/hier1/hier1.def deleted file mode 100644 index 02e0970..0000000 --- a/sdk/samples/hier1/hier1.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME hier1.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/hier1/makefile b/sdk/samples/hier1/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/hier1/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/hier1/msvc.mk b/sdk/samples/hier1/msvc.mk deleted file mode 100644 index 9379aa4..0000000 --- a/sdk/samples/hier1/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = hier1 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = hier1.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/hier1/readme.txt b/sdk/samples/hier1/readme.txt deleted file mode 100644 index 20ed73e..0000000 --- a/sdk/samples/hier1/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Hier1 -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -A simple hierarchy of two meshes demonstrating the concept of frames. diff --git a/sdk/samples/hier2/hier2.c b/sdk/samples/hier2/hier2.c deleted file mode 100644 index 577a64a..0000000 --- a/sdk/samples/hier2/hier2.c +++ /dev/null @@ -1,224 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: hier2.c - * - ***************************************************************************/ - -/* - * D3D RM Tutorial program frame hierarchy 2 - */ - -#include "rmdemo.h" - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT; - LPDIRECT3DRMLIGHT l1 = NULL; - LPDIRECT3DRMLIGHT l2 = NULL; - LPDIRECT3DRMFRAME lights = NULL; - LPDIRECT3DRMMESHBUILDER torus_builder = NULL; - LPDIRECT3DRMMESHBUILDER sphere_builder = NULL; - LPDIRECT3DRMMESHBUILDER cube1_builder = NULL; - LPDIRECT3DRMMESHBUILDER cube2_builder = NULL; - LPDIRECT3DRMMESH cube1_mesh = NULL; - LPDIRECT3DRMMESH cube2_mesh = NULL; - LPDIRECT3DRMMESH torus_mesh = NULL; - LPDIRECT3DRMMESH sphere_mesh = NULL; - LPDIRECT3DRMFRAME torus = NULL; - LPDIRECT3DRMFRAME sphere = NULL; - LPDIRECT3DRMFRAME cube1 = NULL; - LPDIRECT3DRMFRAME cube2 = NULL; - HRESULT rval; - view = view; /* not used */ - - /* - * This Demo shows a more complex hierarchy of frames - */ - - if (FAILED(dev->lpVtbl->SetQuality(dev, quality))) - goto generic_error; - if (FAILED(dev->lpVtbl->SetShades(dev, 16))) - goto generic_error; - - /* - * initialize the lights in the scene - */ - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(5), D3DVAL(5), - -D3DVAL(5)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9), - D3DVAL(0.8), D3DVAL(0.7), &l1))) - goto generic_error; - if (FAILED(lights->lpVtbl->AddLight(lights, l1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &l2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, l2))) - goto generic_error; - /* - * load mesh files - */ - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &torus_builder))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &sphere_builder))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube1_builder))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube2_builder))) - goto generic_error; - rval = torus_builder->lpVtbl->Load(torus_builder, "torus.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load torus.x.\n"); - goto ret_with_error; - } - rval = sphere_builder->lpVtbl->Load(sphere_builder, "sphere4.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere4.x.\n"); - goto ret_with_error; - } - rval = cube1_builder->lpVtbl->Load(cube1_builder, "cube.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load cube.x.\n"); - goto ret_with_error; - } - rval = cube2_builder->lpVtbl->Load(cube2_builder, "cube.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load cube.x.\n"); - goto ret_with_error; - } - - if (FAILED(cube1_builder->lpVtbl->Scale(cube1_builder, D3DVAL(0.25), D3DVAL(0.5), - D3DVAL(1.0)))) - goto generic_error; - if (FAILED(cube2_builder->lpVtbl->Scale(cube2_builder, D3DVAL(0.5), D3DVAL(1.5), - D3DVAL(1.0)))) - goto generic_error; - - if (FAILED(cube1_builder->lpVtbl->SetColorRGB(cube1_builder, D3DVAL(0.7), - D3DVAL(0.0), D3DVAL(0.8)))) - goto generic_error; - if (FAILED(cube2_builder->lpVtbl->SetColorRGB(cube2_builder, D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.5)))) - goto generic_error; - if (FAILED(torus_builder->lpVtbl->SetColorRGB(torus_builder, D3DVAL(0.2), - D3DVAL(1.0), D3DVAL(0.8)))) - goto generic_error; - - if (FAILED(torus_builder->lpVtbl->CreateMesh(torus_builder, &torus_mesh))) - goto generic_error; - if (FAILED(sphere_builder->lpVtbl->CreateMesh(sphere_builder, &sphere_mesh))) - goto generic_error; - if (FAILED(cube1_builder->lpVtbl->CreateMesh(cube1_builder, &cube1_mesh))) - goto generic_error; - if (FAILED(cube2_builder->lpVtbl->CreateMesh(cube2_builder, &cube2_mesh))) - goto generic_error; - RELEASE(torus_builder); - RELEASE(sphere_builder); - RELEASE(cube1_builder); - RELEASE(cube2_builder); - - /* - * create a torus frame within the scene create torus frame within - * frame of sphere cube frame within frame of torus - */ - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &sphere))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, sphere, &torus))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, torus, &cube1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, torus, &cube2))) - goto generic_error; - - /* - * add the loaded mesh into the frame - */ - - if (FAILED(torus->lpVtbl->AddVisual(torus, (LPDIRECT3DRMVISUAL) torus_mesh))) - goto generic_error; - if (FAILED(sphere->lpVtbl->AddVisual(sphere, (LPDIRECT3DRMVISUAL) sphere_mesh))) - goto generic_error; - if (FAILED(cube1->lpVtbl->AddVisual(cube1, (LPDIRECT3DRMVISUAL) cube1_mesh))) - goto generic_error; - if (FAILED(cube2->lpVtbl->AddVisual(cube2, (LPDIRECT3DRMVISUAL) cube2_mesh))) - goto generic_error; - - /* - * set up the frames position, orientation and rotations - */ - - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(25)))) - goto generic_error; - if (FAILED(sphere->lpVtbl->SetPosition(sphere, scene, D3DVAL(0), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(torus->lpVtbl->SetPosition(torus, sphere, D3DVAL(6), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(cube1->lpVtbl->SetPosition(cube1, torus, D3DVAL(0), D3DVAL(4), D3DVAL(0)))) - goto generic_error; - if (FAILED(cube2->lpVtbl->SetPosition(cube2, torus, D3DVAL(0), -D3DVAL(4), D3DVAL(0)))) - goto generic_error; - - if (FAILED(sphere->lpVtbl->SetRotation(sphere, scene, D3DVAL(0), D3DVAL(0), D3DVAL(1),D3DVAL(0.01)))) - goto generic_error; - if (FAILED(torus->lpVtbl->SetRotation(torus, sphere, D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0.02)))) - goto generic_error; - if (FAILED(cube1->lpVtbl->SetRotation(cube1, torus, D3DVAL(0.1), D3DVAL(0.2), - D3DVAL(0.7), D3DVAL(0.03)))) - goto generic_error; - if (FAILED(cube2->lpVtbl->SetRotation(cube2, torus, D3DVAL(0.7), D3DVAL(0.1), - D3DVAL(0.2), D3DVAL(0.03)))) - goto generic_error; - - RELEASE(lights); - RELEASE(torus_mesh); - RELEASE(sphere_mesh); - RELEASE(cube1_mesh); - RELEASE(cube2_mesh); - RELEASE(torus); - RELEASE(sphere); - RELEASE(cube1); - RELEASE(cube2); - RELEASE(l1); - RELEASE(l2); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(l1); - RELEASE(l2); - RELEASE(lights); - RELEASE(torus_builder); - RELEASE(sphere_builder); - RELEASE(cube1_builder); - RELEASE(cube2_builder); - RELEASE(cube1_mesh); - RELEASE(cube2_mesh); - RELEASE(torus_mesh); - RELEASE(sphere_mesh); - RELEASE(torus); - RELEASE(sphere); - RELEASE(cube1); - RELEASE(cube2); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bNoTextures = TRUE; - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Frame Hierarchy II D3D RM Example"); -} diff --git a/sdk/samples/hier2/hier2.def b/sdk/samples/hier2/hier2.def deleted file mode 100644 index bf5f81b..0000000 --- a/sdk/samples/hier2/hier2.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME hier2.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/hier2/makefile b/sdk/samples/hier2/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/hier2/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/hier2/msvc.mk b/sdk/samples/hier2/msvc.mk deleted file mode 100644 index 04d88fa..0000000 --- a/sdk/samples/hier2/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = hier2 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = hier2.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/hier2/readme.txt b/sdk/samples/hier2/readme.txt deleted file mode 100644 index b01d61b..0000000 --- a/sdk/samples/hier2/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Hier2 -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Another simple hierarchy of four meshes. diff --git a/sdk/samples/iklowns/cgaction.cpp b/sdk/samples/iklowns/cgaction.cpp deleted file mode 100644 index 2cb64b7..0000000 --- a/sdk/samples/iklowns/cgaction.cpp +++ /dev/null @@ -1,352 +0,0 @@ -/*===========================================================================*\ -| -| File: cgaction.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - - -#include -#include -#ifdef __WATCOMC__ -#include -#endif -#include "cgglobl.h" -#include "cgdebug.h" -#include "cgsprite.h" -#include "strrec.h" -#include "cgaction.h" -#include "cgimage.h" - -/*---------------------------------------------------------------------------*\ -| -| Class CGameAction -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameAction::CGameAction( - char* pFileName, - char* pActionName, - DWORD objID - ) : mpSequence( NULL ) -{ - // get the sequence info - char sequenceBuf[256]; - char fileBuf[256]; - char defSequence[] = ""; // no default sequence names - int frameRate; - - GetPrivateProfileString( - pActionName, - "SequenceName", - defSequence, - sequenceBuf, - sizeof( sequenceBuf ), - pFileName - ); - - GetPrivateProfileString( - pActionName, - "SequenceFile", - defSequence, - fileBuf, - sizeof( fileBuf ), - pFileName - ); - - frameRate = GetPrivateProfileInt( - pActionName, - "Rate", - 30, - pFileName - ); - - // should we keep a mirror? - BOOL mirrorHorz = (int) GetPrivateProfileInt( - pActionName, - "MirrorHorizontal", - FALSE, - pFileName - ); - - BOOL mirrorVert = (int) GetPrivateProfileInt( - pActionName, - "MirrorVertical", - FALSE, - pFileName - - ); - - char dirBuf[256]; - mpSequence = new CGameSpriteSequence( fileBuf, sequenceBuf, frameRate, mirrorHorz, mirrorVert ); - - // See if there is a sound associated with this action - GetPrivateProfileString ( - pActionName, - "Sound", - "", - dirBuf, - sizeof( dirBuf ), - pFileName - ); - - if (dirBuf[0] != '\0') - { - CStringRecord fields( dirBuf, "," ); - BOOL fLoop=FALSE; - - // See if the sound is to be looped when it is played - if ((fields.GetNumFields() > 2) && (toupper(*fields[2]) == 'L')) - { - fLoop = TRUE; - } - - // Create sound effect object based on WAV file - pSoundEffect = new CSoundEffect(fields[0], objID, fLoop, gSoundMode); - - // If a volume was specified and sound got created ok, - // set the defaul volume - if ((pSoundEffect != NULL) && (fields.GetNumFields() > 1)) - { - defaultVolume = atoi(fields[1]); - pSoundEffect->SetVolume(defaultVolume); - } - } else { - pSoundEffect = NULL; - } - // See if there is an ending sound associated with this action - GetPrivateProfileString ( - pActionName, - "SoundEnd", - "", - dirBuf, - sizeof( dirBuf ), - pFileName - ); - - if (dirBuf[0] != '\0') - { - CStringRecord fields( dirBuf, "," ); - - // Create sound effect object based on WAV file - pEndSoundEffect = new CSoundEffect(fields[0], objID, FALSE, gSoundMode); - - // If a volume was specified and sound got created ok, - // set the defaul volume - if ((pEndSoundEffect != NULL) && (fields.GetNumFields() > 1)) - { - defaultVolume = atoi(fields[1]); - pEndSoundEffect->SetVolume(defaultVolume); - } - } else { - pEndSoundEffect = NULL; - } -} - -CGameAction::CGameAction( - char* pFileName, - CGameCharSequenceInfo *pSequence, - DWORD objID - ) : mpSequence( NULL ) -{ - // get the sequence info - char sequenceBuf[256]; - char fileBuf[256]; - char defSequence[] = ""; // no default sequence names - int frameRate; - lstrcpy(sequenceBuf, pSequence->SequenceName); - - lstrcpy(fileBuf, pSequence->SequenceFile); - - frameRate = pSequence->Rate; - - // should we keep a mirror? - BOOL mirrorHorz = FALSE; - BOOL mirrorVert = FALSE; - - mpSequence = new CGameSpriteSequence( fileBuf, sequenceBuf, frameRate, mirrorHorz, mirrorVert ); - - if (pSequence->Sound.Sound != NULL) - { - BOOL fLoop=FALSE; - - fLoop = pSequence->Sound.Loop; - - // Create sound effect object based on WAV file - pSoundEffect = new CSoundEffect(pSequence->Sound.Sound - , objID, fLoop, gSoundMode); - - // If a volume was specified and sound got created ok, - // set the defaul volume - if ((pSoundEffect != NULL)) - { - defaultVolume = pSequence->Sound.Rate; //atoi(fields[1]); - pSoundEffect->SetVolume(defaultVolume); - } - } else { - pSoundEffect = NULL; - } - - if (pSequence->Sound.SoundEnd != NULL) - { - - // Create sound effect object based on WAV file - pEndSoundEffect = new CSoundEffect(pSequence->Sound.SoundEnd - , objID, FALSE, gSoundMode); - - // If a volume was specified and sound got created ok, - // set the defaul volume - if (pEndSoundEffect != NULL) - { - defaultVolume = pSequence->Sound.Rate; - pEndSoundEffect->SetVolume(defaultVolume); - } - } else { - pEndSoundEffect = NULL; - } -} - - -CGameAction::~CGameAction() -{ - if (pSoundEffect != NULL) - delete pSoundEffect; - if (pEndSoundEffect != NULL) - delete pEndSoundEffect; - delete mpSequence; -} - -BOOL // return TRUE if more sprites to go after this one -CGameAction::Activate() -{ - if (pSoundEffect != NULL) - pSoundEffect->Play(); - return(TRUE); -} - -BOOL // return TRUE if more sprites to go after this one -CGameAction::DeActivate() -{ - // reset the current sequence to 0 - mpSequence->SetCurSprite( 0 ); - if (pSoundEffect != NULL) - pSoundEffect->Stop(); - if (pEndSoundEffect != NULL) - pEndSoundEffect->Play(); - return TRUE; -} - -BOOL -GetStereoValues( - int screenX, - int &vol, - int &pan -) -{ - BOOL fOffScreen = FALSE; - - if (vol == 0) - return FALSE; - - // Determine if object making sound is off screen to the - // left... - if (screenX < 0) - { - fOffScreen = TRUE; - pan = 0; // place off left speaker - } - - // or to the right... - else if (screenX > SCREEN_WIDTH) - { - fOffScreen = TRUE; - pan = 127; // place off right speaker - - // or somewhere on screen - } else { - pan = (screenX * 127) / SCREEN_WIDTH; - } - - - // If it is off screen, lower the volume accordingly - if (fOffScreen) - { - int howFarX; - - // Figure out how far to the left or right the object is - // off screen. - howFarX = (screenX > 0) ? screenX-SCREEN_WIDTH : -screenX; - - // Adjust the volume proportionally so that it is full - // volume when it reaches the screen and zero volume when - // it is a full screen widths away. - vol = vol - (howFarX * vol / SCREEN_WIDTH); - - if (vol < 0) - vol = 0; - } - - // return TRUE if a sound should be made - return (vol != 0); -} - - -BOOL // return TRUE if more sprites to go after this one -CGameAction::Update(int screenX) -{ - int PanVal; - int curVolume = defaultVolume; - - if (pSoundEffect != NULL) - { - // Place sound in accordance with objects position in the world! - if (GetStereoValues(screenX, curVolume, PanVal)) - { - pSoundEffect->SetVolume(curVolume); - pSoundEffect->SetPan(PanVal); - pSoundEffect->SetMute(FALSE); // make sure it is playing - } else { - pSoundEffect->SetMute(TRUE); // make sure it is stopped - } - } - - return mpSequence->Frame(); -} - -void -CGameAction::Render( - CGameScreen* pScreen, - int x, - int y, - BOOL revX, - BOOL revY, - LPRECT pDirty - ) -{ - mpSequence->Render( pScreen, x, y, revX, revY, pDirty ); -} diff --git a/sdk/samples/iklowns/cgaction.h b/sdk/samples/iklowns/cgaction.h deleted file mode 100644 index 8736c45..0000000 --- a/sdk/samples/iklowns/cgaction.h +++ /dev/null @@ -1,72 +0,0 @@ -/*===========================================================================*\ -| -| File: cgaction.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGACTION_H -#define CGACTION_H - -#include "cgsprite.h" -#include "cgsound.h" -#include "cgchdll.h" - -class CGameScreen; - -class CGameAction -{ -public: - CGameAction(char* pFileName, char* pActionName, DWORD objID=0); - CGameAction(char* pFileName, CGameCharSequenceInfo *pSequence, DWORD objID=0); - virtual ~CGameAction(); - - virtual BOOL Activate(); - virtual BOOL DeActivate(); - virtual BOOL Update(int x); // change to next sprite in sequence - virtual void Render(CGameScreen* pScreen, int x, int y, BOOL revX, BOOL revY, LPRECT pDirty); - - virtual int GetCurWidth() - { - return(mpSequence->GetCurWidth()); - } - virtual int GetCurHeight() - { - return(mpSequence->GetCurHeight()); - } - virtual int NextSprite(int time, BOOL wrap = TRUE) - { - return(mpSequence->NextSprite(time, wrap)); - } - -protected: - CGameSpriteSequence* mpSequence; - CSoundEffect *pSoundEffect; - CSoundEffect *pEndSoundEffect; - BOOL fSoundOnlyWhenVisable; - int defaultVolume; -}; - -#endif // CGACTION_H diff --git a/sdk/samples/iklowns/cgbitbuf.cpp b/sdk/samples/iklowns/cgbitbuf.cpp deleted file mode 100644 index 5e895c5..0000000 --- a/sdk/samples/iklowns/cgbitbuf.cpp +++ /dev/null @@ -1,1471 +0,0 @@ -/*===========================================================================*\ -| -| File: cgbitbuf.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - - -//#ifndef __WATCOMC__ -#define WIN32_LEAN_AND_MEAN -//#endif -#include -#include "cgdebug.h" -#include "cgdib.h" -#include "cgbitbuf.h" -#include "cgimage.h" -#include "cgglobl.h" - -/*---------------------------------------------------------------------------*\ -| -| Class CGameBitBuffer -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -CGameBitBuffer::CGameBitBuffer( - CGameDIB* pDIB, - int width, - int height, - COLORREF transColor - ) : mhPalette( NULL ), - mTransColor( transColor ) -{ -} - -CGameBitBuffer::CGameBitBuffer( - int width, - int height, - HPALETTE hPal, - COLORREF transColor - ) : mhPalette( NULL ), - mTransColor( transColor ) -{ -} - -CGameBitBuffer::~CGameBitBuffer() -{ - if (mhPalette) - { - DeleteObject( mhPalette ); - } -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDDrawBitBuffer -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -// static members -LPDIRECTDRAW CGameDDrawBitBuffer::mpDDrawDriver = NULL; -int CGameDDrawBitBuffer::mInstanceCount = 0; // for allocating/freeing mpDDrawDriver - -// construct a buffer from existing DIB, optionally stretching to fit new size -CGameDDrawBitBuffer::CGameDDrawBitBuffer( - CGameDIB* pDIB, - int width, // 0 (default) means use DIB's width - int height, // 0 (default) means use DIB's height - COLORREF transColor - ) : CGameBitBuffer(pDIB, width, height, transColor), - mpSurface( NULL ), - mIsAttached( FALSE ), - mIsValid( FALSE ), - mpFileName( NULL ) -{ - if (width == 0) - width = pDIB->GetWidth(); - - if (height == 0) - height = pDIB->GetHeight(); - - // we need to copy the dib's filename so we can reload later if necessary - char* pFileName = (char*) pDIB->GetNamePtr(); - - if (pFileName) - { - mpFileName = new char[lstrlen(pFileName)+1]; - lstrcpy( mpFileName, pFileName ); - } - - InitDDraw(); - CreateSurface( width, height ); - - if (mIsValid) - { - SetBits( pDIB ); // copy DIB bits onto surface - - mhPalette = pDIB->CreatePalette(); - } - } - -// construct an "empty" buffer with given size -CGameDDrawBitBuffer::CGameDDrawBitBuffer( - int width, - int height, - HPALETTE hPal, - COLORREF transColor - ) : CGameBitBuffer(width, height, hPal, transColor), - mpSurface( NULL ), - mIsAttached( FALSE ), - mIsValid( FALSE ), - mpFileName( NULL ) -{ - InitDDraw(); - CreateSurface( width, height ); -} - -void -CGameDDrawBitBuffer::InitDDraw( - ) -{ - HRESULT result; - - // do we need to get the Direct Draw driver? - if (mpDDrawDriver == NULL) - { - result = DirectDrawCreate( NULL, &mpDDrawDriver, NULL ); - } - - ++mInstanceCount; // keep count so we know when to release driver -} - -void -CGameDDrawBitBuffer::CreateSurface( - int width, - int height - ) -{ - if (mpDDrawDriver) - { - DDSURFACEDESC surfDesc; - - memset( &surfDesc, 0, sizeof( surfDesc ) ); - - surfDesc.dwSize = sizeof( surfDesc ); - surfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - surfDesc.dwFlags |= DDSD_HEIGHT | DDSD_WIDTH; - surfDesc.dwHeight = height; - surfDesc.dwWidth = width; - - surfDesc.dwFlags |= DDSD_CAPS; - - surfDesc.ddckCKSrcBlt.dwColorSpaceLowValue = 1; - surfDesc.ddckCKSrcBlt.dwColorSpaceHighValue = 1; - - // ask driver for the surface - HRESULT result; - if ((result = mpDDrawDriver->CreateSurface(&surfDesc, - &mpSurface, NULL )) == DD_OK) - { - // have to call SetColorKey - result = mpSurface->SetColorKey( DDCKEY_SRCBLT, &surfDesc.ddckCKSrcBlt ); - - mIsValid = TRUE; - } - } -} - -void -CGameDDrawBitBuffer::SetBits( - CGameDIB* pSource - ) -{ - HRESULT ddrawrval; - DDSURFACEDESC dsd; - LPBYTE lpdest; - DWORD y; - DWORD bytes_scanline; - LPBYTE lpdib_bits; - - /* - * get surface description - */ - mSurfD.dwSize = sizeof( mSurfD ); - ddrawrval = mpSurface->GetSurfaceDesc( &mSurfD ); - if( ddrawrval != DD_OK ) - { - DB_LOG( DB_PROBLEM, "Could not get surface description!" ); - return; - } - - if( !(mSurfD.ddpfPixelFormat.dwFlags & DDPF_RGB) ) - { - DB_LOG( DB_PROBLEM, "Can only copy to RGB surfaces for now" ); - return; - } - - bytes_scanline = pSource->BytesPerScanline(); - - /* - * access the surface - */ - dsd.dwSize = sizeof( dsd ); - do { - ddrawrval = mpSurface->Lock( NULL, &dsd, DDLOCK_SURFACEMEMORYPTR, NULL ); - if( ddrawrval != DD_OK && ddrawrval != DDERR_WASSTILLDRAWING ) - { - DB_LOG( DB_PROBLEM, "Lock failed in creating DDBitBuffer" ); - return; - } - } - while( ddrawrval == DDERR_WASSTILLDRAWING ); - - lpdest = (LPBYTE) dsd.lpSurface; - mPitch = mSurfD.lPitch; - - // NOTE: we only work with 8bpp; need different code for different bitdepths - // this code just assumes 8 bits - for( y=0;yGetPixelAddress(0,y); - memcpy( lpdest, lpdib_bits, bytes_scanline ); - lpdest += (DWORD) mSurfD.lPitch; - } - - /* - * release the surface and go home... - */ - mpSurface->Unlock( NULL ); -} - -CGameDDrawBitBuffer::~CGameDDrawBitBuffer() -{ - if (mpSurface && !mIsAttached) - { - mpSurface->Release( ); - } - - if (--mInstanceCount == 0) - { - if (mpDDrawDriver) - { - mpDDrawDriver->Release( ); - mpDDrawDriver = NULL; - } - } - - delete mpFileName; -} - -// call this to re-create the surface if it was lost -// this can happen if we've switched modes & switch back -void -CGameDDrawBitBuffer::ReCreate( - ) -{ - int width = mSurfD.dwWidth; - int height = mSurfD.dwHeight; - - HRESULT result = mpSurface->Restore(); - - if (result == DD_OK) - mIsValid = TRUE; - - if (mIsValid && mpFileName) - { - // reload the file - CGameDIB dib( mpFileName ); - SetBits( &dib ); // copy DIB bits onto surface - } -} - - -// generic blt call to this buffer from another DDraw surface -void -CGameDDrawBitBuffer::Blt( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ) -{ - HRESULT result; - DDBLTFX dbf; - BOOL useFX = FALSE; - - // negative width or height means mirror the blt - RECT destRect = - { - xDest, - yDest, - xDest+((wDest<0) ? -wDest : wDest), - yDest+((hDest<0) ? -hDest : hDest) - }; - - RECT srcRect = - { - xSrc, - ySrc, - xSrc+((wDest<0) ? -wDest : wDest), - ySrc+((hDest<0) ? -hDest : hDest) - }; - - - if ((wDest < 0) || (hDest < 0)) - { - useFX = TRUE; - memset( &dbf, 0, sizeof( dbf ) ); - - dbf.dwSize = sizeof(dbf); - dbf.dwDDFX = (wDest<0) ? DDBLTFX_MIRRORLEFTRIGHT : 0; - dbf.dwDDFX |= (hDest<0) ? DDBLTFX_MIRRORUPDOWN : 0; - } - - result = mpSurface->Blt( - &destRect, // dest rect - ((CGameDDrawBitBuffer*)pSrcBuffer)->mpSurface, // src surf - &srcRect, // src rect - useFX ? DDBLT_DDFX : 0,// flags - useFX ? &dbf : NULL ); // bltfx - -} - -// generic blt call -- determine type of destination buffer -void -CGameDDrawBitBuffer::Blt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ) -{ - switch (pDestBuffer->TypeID()) - { - case BB_DDraw: - Blt( - (CGameDDrawBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - rop - ); - break; - case BB_DS: - Blt( - (CGameDSBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - rop - ); - break; - default: - DB_BREAK(); - break; - } -} - -// generic transblt call -- determine type of source buffer -void -CGameDDrawBitBuffer::TransBlt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ) -{ - switch (pDestBuffer->TypeID()) - { - case BB_DDraw: - TransBlt( - (CGameDDrawBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - transColor - ); - break; - case BB_DS: - TransBlt( - (CGameDSBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - transColor - ); - break; - default: - DB_BREAK(); - break; - } -} - -// specific blt call for another DDraw surface -void -CGameDDrawBitBuffer::BltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ) -{ - HRESULT result; - DDBLTFX dbf; - BOOL useFX = FALSE; - - // negative width or height means mirror the blt - RECT destRect = - { - xDest, - yDest, - xDest+((wDest<0) ? -wDest : wDest), - yDest+((hDest<0) ? -hDest : hDest) - }; - - RECT srcRect = - { - xSrc, - ySrc, - xSrc+((wDest<0) ? -wDest : wDest), - ySrc+((hDest<0) ? -hDest : hDest) - }; - - if ((wDest < 0) || (hDest < 0)) - { - useFX = TRUE; - memset( &dbf, 0, sizeof( dbf ) ); - - dbf.dwSize = sizeof(dbf); - dbf.dwDDFX = (wDest<0) ? DDBLTFX_MIRRORLEFTRIGHT : 0; - dbf.dwDDFX |= (hDest<0) ? DDBLTFX_MIRRORUPDOWN : 0; - } - - // force a stop if we never succeed - int stopCount = DDRAW_RETRY; - - do - { - result = pDestBuffer->mpSurface->BltFast( - destRect.left, - destRect.top, - mpSurface, // src surf - &srcRect, // src rect - FALSE // transparent - ); - - // surface may have been lost due to mode switch - if (result == DDERR_SURFACELOST) - { - mIsValid = FALSE; - // re-create our surface - ReCreate(); - } - } - while( (result != DD_OK) && (--stopCount > 0)); -} - -// specific transblt call for another DDraw buffer -void -CGameDDrawBitBuffer::TransBltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ) -{ - HRESULT result; - - RECT destRect = - { - xDest, yDest, xDest+wDest, yDest+hDest - }; - - RECT srcRect = - { - xSrc, ySrc, xSrc+wDest, ySrc+hDest - }; - - // force a stop if we never succeed - int stopCount = DDRAW_RETRY; - - do - { - result = pDestBuffer->mpSurface->BltFast( - destRect.left, - destRect.top, - mpSurface, // src surf - &srcRect, // src rect - TRUE // transparent - ); - - // surface may have been lost due to mode switch - if (result == DDERR_SURFACELOST) - { - mIsValid = FALSE; - // re-create our surface - ReCreate(); - } - } - while( (result != DD_OK) && (--stopCount > 0)); -} - -// specific blt call for a dibsection destination buffer -void -CGameDDrawBitBuffer::BltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ) -{ - LPBYTE pSrc = GetLockedAddress( xSrc, ySrc ); - - if (pSrc) - { - int scanDest = -(pDestBuffer->mpDIB->BytesPerScanline()); - int scanSrc = mPitch; - - CopyDIBBits( - pDestBuffer->mpDIB->GetPixelAddress( xDest, yDest ), - pSrc, - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc - ); - - } - Unlock(); -} - -// specific transblt call for a ds buffer -void -CGameDDrawBitBuffer::TransBltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ) -{ - LPBYTE pSrc = GetLockedAddress( xSrc, ySrc ); - - if (pSrc) - { - int scanDest = -(pDestBuffer->mpDIB->BytesPerScanline()); - int scanSrc = mPitch; - - TransCopyDIBBits( - pDestBuffer->mpDIB->GetPixelAddress( xDest, yDest ), - pSrc, - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc, - transColor - ); - - } - Unlock(); -} - -void -CGameDDrawBitBuffer::SetPalette( HPALETTE hPal ) -{ -} - -LPBYTE // return address to given pixel in locked surface -CGameDDrawBitBuffer::GetLockedAddress( - int x, - int y - ) -{ - HRESULT ddrawrval; - DDSURFACEDESC dsd; - /* - * access the surface - */ - dsd.dwSize = sizeof( dsd ); - - int stopCount = DDRAW_RETRY; - - do - { - ddrawrval = mpSurface->Lock( NULL, &dsd, DDLOCK_SURFACEMEMORYPTR, NULL ); - - // surface may have been lost due to mode switch - if (ddrawrval == DDERR_SURFACELOST) - { - mIsValid = FALSE; - // re-create our surface - ReCreate(); - } - } - while( (ddrawrval != DD_OK) && (--stopCount > 0) ); - - if (ddrawrval == DD_OK) - { - mPitch = dsd.lPitch; - - return (LPBYTE) dsd.lpSurface + x + (y * mPitch); - } - else - { - DB_BREAK(); - return NULL; - } -} - -void -CGameDDrawBitBuffer::Unlock() -{ - mpSurface->Unlock( NULL ); -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDDrawScreenBuffer -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -// construct the screen's primary surface -CGameDDrawScreenBuffer::CGameDDrawScreenBuffer( - ) : CGameDDrawBitBuffer(), - mpPalette( NULL ), - mpOldPalette( NULL ) -{ - InitDDraw(); - - // call our create surface to create the primary surface - CreateSurface( 0,0 ); -} - -// create an attached-buffer object from given primary surface -CGameDDrawScreenBuffer::CGameDDrawScreenBuffer( - CGameDDrawScreenBuffer* pFront - ) : CGameDDrawBitBuffer(), - mpPalette( NULL ), - mpOldPalette( NULL ) -{ - HRESULT result; - DDSCAPS caps; - - memset(&caps, 0, sizeof(caps)); - caps.dwCaps = DDSCAPS_BACKBUFFER; - - result = pFront->mpSurface->GetAttachedSurface( - &caps, - &mpSurface); - - mSurfD.dwSize = sizeof( mSurfD ); - pFront->mpSurface->GetSurfaceDesc( - &mSurfD - ); - - mPitch = mSurfD.lPitch; - - if (mpSurface) - mIsValid = TRUE; - - // flag this as an attached surface so we won't release it - mIsAttached = TRUE; - ++mInstanceCount; // keep count so we know when to release driver -} - -void -CGameDDrawScreenBuffer::CreateSurface( - int width, - int height - ) -{ - HRESULT result; - - result = mpDDrawDriver->SetCooperativeLevel( ghMainWnd, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - if( result != DD_OK ) - { - return; - } - - // first, force display into our 640x480, 8bpp mode - result = mpDDrawDriver->SetDisplayMode( - SCREEN_WIDTH, - SCREEN_HEIGHT, - 8 - ); - if( result != DD_OK ) - { - return; - } - - memset( &mSurfD, 0, sizeof( mSurfD ) ); - - mSurfD.dwSize = sizeof( mSurfD ); - mSurfD.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; - - mSurfD.dwFlags |= DDSD_BACKBUFFERCOUNT | DDSD_CAPS; - if( gDoubleBuffer ) - { - mSurfD.dwBackBufferCount = 1; - } - else - { - mSurfD.dwBackBufferCount = 2; - } - - // ask DirectDraw for the surface - if ((result = mpDDrawDriver->CreateSurface(&mSurfD, &mpSurface, - NULL)) == DD_OK) - { - mPitch = mSurfD.lPitch; - mIsValid = TRUE; - } -} - -CGameDDrawScreenBuffer::~CGameDDrawScreenBuffer() -{ - // free up palette - DeleteDDPalette(); -} - -void -CGameDDrawScreenBuffer::SetMode( - int width, - int height, - int bits - ) -{ - mpDDrawDriver->SetDisplayMode( - width, - height, - bits - ); -} - -void -CGameDDrawScreenBuffer::RestoreMode() -{ - mpDDrawDriver->FlipToGDISurface(); - mpDDrawDriver->RestoreDisplayMode(); -} - -void -CGameDDrawScreenBuffer::ShowGDIPage() -{ - mpDDrawDriver->FlipToGDISurface(); -} - -void -CGameDDrawScreenBuffer::SetPalette( - LPPALETTEENTRY pPal - ) -{ - // grab current palette if we don't already have it - if (mpOldPalette == NULL) - { - mpSurface->GetPalette( &mpOldPalette ); - } - - // free up current palette - if (mpPalette) - { - DeleteDDPalette(); - } - - if ((mpDDrawDriver->CreatePalette( - DDPCAPS_8BIT, - pPal, - &mpPalette, - NULL - ) == DD_OK) && mpSurface) - { - mpSurface->SetPalette( mpPalette ); - } - -} - -void -CGameDDrawScreenBuffer::DeleteDDPalette() -{ - if (mpPalette) - { - // reset to old palette if we have it - if (mpOldPalette && mpSurface) - { - mpSurface->SetPalette( mpOldPalette ); - } - - if (mpPalette->Release() == DD_OK) - mpPalette = NULL; - } -} - -int -CGameDDrawScreenBuffer::GetVideoMemory() -{ - DDCAPS caps; - - caps.dwSize = sizeof(DDCAPS); - if ((mpDDrawDriver != NULL) && (mpDDrawDriver->GetCaps(&caps,NULL) == DD_OK)) - { - return caps.dwVidMemTotal; - } - - return 0; -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDSBitBuffer -| -| DESCRIPTION: -| Use Win32's CreateDIBSection for a non-Direct Draw bitbuffer -| -| -\*---------------------------------------------------------------------------*/ -// construct a buffer from existing DIB, optionally stretching to fit new size -CGameDSBitBuffer::CGameDSBitBuffer( - CGameDIB* pDIB, - int width, // 0 (default) means use DIB's width - int height, // 0 (default) means use DIB's height - COLORREF transColor - ) : CGameBitBuffer(pDIB, width, height, transColor), - mpBitmapInfo( NULL ), - mpDIB( NULL ), - mpBits( NULL ), - mIsValid( FALSE ) -{ - if (width == 0) - width = pDIB->GetWidth(); - - if (height == 0) - height = pDIB->GetHeight(); - - mhPalette = pDIB->CreatePalette(); - - // create our empty DIBSection - mpDIB = new CGameDIB( width, height, mhPalette ); - SetBits( pDIB ); // copy DIB bits onto surface - - // cache important ptrs for blting - mpBits = mpDIB->GetBits(); - mpBitmapInfo = mpDIB->GetBitmapInfo(); - mIsValid = TRUE; -} - -// construct an "empty" buffer with given size -CGameDSBitBuffer::CGameDSBitBuffer( - int width, - int height, - HPALETTE hPal, - COLORREF transColor - ) : CGameBitBuffer(width, height, hPal, transColor), - mpBitmapInfo( NULL ), - mpDIB( NULL ), - mpBits( NULL ), - mIsValid( FALSE ) -{ - mpDIB = new CGameDIB( width, height, hPal ); - - // cache important ptrs for blting - mpBits = mpDIB->GetBits(); - mpBitmapInfo = mpDIB->GetBitmapInfo(); - mIsValid = TRUE; -} - -void -CGameDSBitBuffer::SetBits( - CGameDIB* pSource - ) -{ - LPBYTE lpdest; - DWORD bytes_scanline; - LPBYTE lpdib_bits; - - bytes_scanline = pSource->BytesPerScanline(); - - for( int y=0;yGetHeight();y++ ) - { - lpdib_bits = pSource->GetPixelAddress(0,y); - lpdest = mpDIB->GetPixelAddress(0,y); - CopyMemory( lpdest, lpdib_bits, bytes_scanline ); - } -} - -CGameDSBitBuffer::~CGameDSBitBuffer() -{ - delete mpDIB; -} - -// specific blt call to this buffer from another DS buffer -void CGameDSBitBuffer::Blt( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ) -{ - int scanDest = -(mpDIB->BytesPerScanline()); - int scanSrc = -(((CGameDSBitBuffer*)pSrcBuffer)->mpDIB->BytesPerScanline()); - - CopyDIBBits( - mpDIB->GetPixelAddress( xDest, yDest ), - ((CGameDSBitBuffer*)pSrcBuffer)->mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc - ); -} - -// generic dest blt call -- determine type of source buffer -void -CGameDSBitBuffer::Blt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ) -{ - switch (pDestBuffer->TypeID()) - { - case BB_DDraw: - Blt( - (CGameDDrawBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - rop - ); - break; - case BB_DS: - Blt( - (CGameDSBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - rop - ); - break; - default: - DB_BREAK(); - break; - } -} - -// generic transblt call -- determine type of dest buffer -void -CGameDSBitBuffer::TransBlt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ) -{ - switch (pDestBuffer->TypeID()) - { - case BB_DDraw: - TransBlt( - (CGameDDrawBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - transColor - ); - break; - case BB_DS: - TransBlt( - (CGameDSBitBuffer*)pDestBuffer, - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - transColor - ); - break; - default: - DB_BREAK(); - break; - } -} - -// specific blt call for a DS buffer -void CGameDSBitBuffer::BltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ) -{ - int scanDest = -(pDestBuffer->mpDIB->BytesPerScanline()); - int scanSrc = -(mpDIB->BytesPerScanline()); - - CopyDIBBits( - pDestBuffer->mpDIB->GetPixelAddress( xDest, yDest ), - mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc - ); -} - -// specific transblt call for a DDraw buffer -void -CGameDSBitBuffer::TransBltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ) -{ - int scanDest = -(pDestBuffer->mpDIB->BytesPerScanline()); - int scanSrc = -(mpDIB->BytesPerScanline()); - - TransCopyDIBBits( - pDestBuffer->mpDIB->GetPixelAddress( xDest, yDest ), - mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc, - transColor - ); -} - -// specific blt call for a DDraw buffer -void CGameDSBitBuffer::BltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ) -{ - LPBYTE lpdest; - - lpdest = pDestBuffer->GetLockedAddress( xDest, yDest ); - - if (lpdest) - { - int scanDest = pDestBuffer->mPitch; - int scanSrc = -(mpDIB->BytesPerScanline()); - - CopyDIBBits( - lpdest, - mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc - ); - - } - pDestBuffer->Unlock(); -} - -// specific transblt call for a DDraw buffer -void -CGameDSBitBuffer::TransBltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ) -{ - LPBYTE lpdest = pDestBuffer->GetLockedAddress( xDest, yDest ); - - if (lpdest) - { - int scanDest = pDestBuffer->mPitch; - int scanSrc = -(mpDIB->BytesPerScanline()); - - TransCopyDIBBits( - lpdest, - mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) scanDest, - (DWORD) scanSrc, - transColor - ); - - } - pDestBuffer->Unlock(); -} - -void -CGameDSBitBuffer::SetPalette( HPALETTE hPal ) -{ -} - -#if !(defined(__BORLANDC__) || defined(__WATCOMC__)) -void -TransCopyDIBBits( - LPBYTE pDest, // destination - LPBYTE pSource, // ; source pointer - DWORD dwWidth, // ; width pixels - DWORD dwHeight, // ; height pixels - DWORD dwScanD, // ; width bytes dest - DWORD dwScanS, // ; width bytes source - BYTE bTranClr // ; transparent color - ) -{ - _asm - { - push ds - push esi - push edi - - mov ecx, dwWidth - or ecx,ecx - jz tcdb_nomore ; test for silly case - - mov edx, dwHeight ; EDX is line counter - mov bl, bTranClr ; BL has transparency color - - mov esi, pSource ; DS:[ESI] point to source - - mov edi, pDest - - or edi, edi ; check NULL ptrs - jz tcdb_nomore - - or esi, esi ; check NULL ptrs - jz tcdb_nomore - - sub dwScanD,ecx ; bias these - sub dwScanS,ecx - - push ecx - - align 4 - -tcdb_morelines: - pop ecx - push ecx - - shr ecx,2 - jz short tcdb_nextscan - -// ; -// ; The idea here is to not branch very often so we unroll the loop by four -// ; and try to not branch when a whole run of pixels is either transparent -// ; or not transparent. -// ; -// ; There are two loops. One loop is for a run of pixels equal to the -// ; transparent color, the other is for runs of pixels we need to store. -// ; -// ; When we detect a "bad" pixel we jump to the same position in the -// ; other loop. -// ; -// ; Here is the loop we will stay in as long as we encounter a "transparent" -// ; pixel in the source. -// ; - - align 4 - -tcdb_same: - mov eax, ds:[esi] - cmp al, bl - jne short tcdb_diff0 - -tcdb_same0: - cmp ah, bl - jne short tcdb_diff1 - -tcdb_same1: - shr eax, 16 - cmp al, bl - jne short tcdb_diff2 - -tcdb_same2: - cmp ah, bl - jne short tcdb_diff3 - -tcdb_same3: - add edi,4 - add esi,4 - dec ecx - jnz short tcdb_same - jz short tcdb_nextscan - -// ; -// ; Here is the loop we will stay in as long as -// ; we encounter a "non transparent" pixel in the source. -// ; - - align 4 - -tcdb_diff: - mov eax, ds:[esi] - cmp al, bl - je short tcdb_same0 - -tcdb_diff0: - mov es:[edi],al - cmp ah, bl - je short tcdb_same1 - -tcdb_diff1: - mov es:[edi+1],ah - - shr eax, 16 - cmp al, bl - je short tcdb_same2 - -tcdb_diff2: - mov es:[edi+2],al - cmp ah, bl - je short tcdb_same3 - -tcdb_diff3: - mov es:[edi+3],ah - - add edi,4 - add esi,4 - dec ecx - jnz short tcdb_diff - jz short tcdb_nextscan - -// ; -// ; We are at the end of a scan, check for odd leftover pixels to do -// ; and go to the next scan. -// ; - - align 4 - -tcdb_nextscan: - pop ecx - push ecx - - and ecx,11b - jnz short tcdb_oddstuff - // ; move on to the start of the next line - -tcdb_nextscan1: - add esi, dwScanS - add edi, dwScanD - - dec edx // ; line counter - jnz short tcdb_morelines - jz short tcdb_nomore - -// ; -// ; If the width is not a multiple of 4 we will come here to clean up -// ; the last few pixels -// ; - -tcdb_oddstuff: - inc ecx -tcdb_oddloop: - dec ecx - jz short tcdb_nextscan1 - mov al, ds:[esi] - inc esi - inc edi - cmp al, bl - je short tcdb_oddloop - mov es:[edi-1],al - jmp short tcdb_oddloop - -tcdb_nomore: - pop ecx - - pop edi - pop esi - pop ds - } -} - -void -CopyDIBBits( - LPBYTE pDest, // ; dest pointer - LPBYTE pSource, // ; source pointer - DWORD dwWidth, // ; width pixels - DWORD dwHeight, // ; height pixels - DWORD dwScanD, // ; width bytes dest - DWORD dwScanS // ; width bytes source - ) -{ - _asm - { - push esi - push edi - - ; load scanline width into EBX, image height into EDX - mov ebx, [dwWidth] - or ebx, ebx - jz silly_case ; width is 0 - mov edx, [dwHeight] - or edx, edx - jz silly_case ; height is 0 - - ; bias offsets - sub [dwScanD], ebx - sub [dwScanS], ebx - - ; load ESI - mov esi, [pSource] - - ; load EDI and guarantee it is aligned on a DWORD boundary - mov edi, [pDest] - - or edi, edi ; check NULL ptrs - jz silly_case - - or esi, esi ; check NULL ptrs - jz silly_case - - ;; NOTE: this assumes that the scanwidth will always be a multiple - ;; of DWORDs, so that the misalignment will be the same for all - ;; scanlines. This allows us to calculate it once outside the loop - - mov ecx, edi - and ecx, 11b ; deal with non-aligned case - - mov eax, 100b - sub eax, ecx ; eax now contains aligment offset - - cmp eax, ebx ; do we really have that many to do? - jb next_scanline ; if not, we're all set to blast - - mov eax, ebx ; put actual width into offset - - - ALIGN 4 -next_scanline: - - ; adjust_alignment - mov ecx, eax ; eax == alignment offset - rep movsb ; move bytewise to make EDI aligned properly - - mov ecx, ebx ; total count per scanline - sub ecx, eax ; residue left over: misaligned amount! - - ; at this point, ECX is number of BYTES to transfer, ESI and EDI point to source and dest - push eax - - mov eax, ecx - shr ecx, 2 ; div 4 to get number of DWORDS to transfer - rep movsd ; move by DWORDS as much as possible - - and eax, 11b ; number of *bytes* to transfer (if any) - mov ecx, eax - rep movsb ; move remaining bytes (may be zero) - - pop eax - - ; now adjust ESI and EDI for next scanline and jump to it! - add esi, [dwScanS] - add edi, [dwScanD] - dec edx ; if more scanlines, process them - jnz next_scanline - -silly_case: - pop edi - pop esi - - } - -} -#endif diff --git a/sdk/samples/iklowns/cgbitbuf.h b/sdk/samples/iklowns/cgbitbuf.h deleted file mode 100644 index 8b17670..0000000 --- a/sdk/samples/iklowns/cgbitbuf.h +++ /dev/null @@ -1,508 +0,0 @@ -/*===========================================================================*\ -| -| File: cgbitbuf.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGBITBUF_H -#define CGBITBUF_H - -#include -#include -#include "cgdib.h" - -// We use this value to time out on waiting for Direct Draw so we don't infinite loop -// It should be very big to keep us from timing out too soon & tearing -#define DDRAW_RETRY 40000 -#if defined(__BORLANDC__) || defined(__WATCOMC__) -extern "C" { -#endif -void -#if defined(__WATCOMC__) -_cdecl -#endif -TransCopyDIBBits( - LPBYTE pDest, // destination - LPBYTE pSource, // ; source pointer - DWORD dwWidth, // ; width pixels - DWORD dwHeight, // ; height pixels - DWORD dwScanD, // ; width bytes dest - DWORD dwScanS, // ; width bytes source - BYTE bTranClr // ; transparent color - ); - -void -#if defined(__WATCOMC__) -_cdecl -#endif -CopyDIBBits( - LPBYTE pDest, // ; dest pointer - LPBYTE pSource, // ; source pointer - DWORD dwWidth, // ; width pixels - DWORD dwHeight, // ; height pixels - DWORD dwScanD, // ; width bytes dest - DWORD dwScanS // ; width bytes source - ); -#if defined(__BORLANDC__) || defined(__WATCOMC__) -} -#endif - -class CGameDSBitBuffer; -class CGameDDrawBitBuffer; -enum BB_TYPE -{ - BB_ROOT, // CGameBitBuffer -- abstract base class - BB_DDraw, // CGameDDrawBitBuffer -- Direct Draw surfaces - BB_DS // CGameDSBitBuffer -- DIBSections -}; - -class CGameBitBuffer -{ -public: - // construct a buffer from existing DIB, optionally stretching to fit new size - CGameBitBuffer(CGameDIB* pDIB, int width=0, int height=0, COLORREF trans=PALETTEINDEX(1)); - - // construct an "empty" buffer with given size - CGameBitBuffer(int width, int height, HPALETTE hPal = NULL, COLORREF trans=PALETTEINDEX(1)); - - // blt to this buffer from pSrcBuffer - virtual void Blt( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - )=0; - - // blt to pDestBuffer from this buffer - virtual void Blt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - )=0; - - // transparent blt to pSrcBuffer from this buffer - virtual void TransBlt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - )=0; - - // specific blit for a DDraw buffer - virtual void BltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - )=0; - - virtual void TransBltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - )=0; - - // specific blit for a dibsection buffer - virtual void BltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - )=0; - - virtual void TransBltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - )=0; - - virtual ~CGameBitBuffer(); - - // returns mhPalette -- the hpalette we created - virtual HPALETTE GetHPalette() - { - return mhPalette; - } - - // destroys mhPalette & sets current palette leaving mhPalette NULL - virtual void SetPalette( HPALETTE )= 0; - - virtual COLORREF GetTransColor() - { - return mTransColor; - } - - // report whether this object is a valid bitbuffer - virtual BOOL IsValid() - { - return FALSE; // default objects are not valid - } - - // report this object's type - virtual BB_TYPE TypeID() - { - return BB_ROOT; - } - -protected: - HPALETTE mhPalette; - COLORREF mTransColor; // transparency color - CGameBitBuffer() : - mhPalette( NULL ) - { - } -}; - -class CGameDDrawBitBuffer : public CGameBitBuffer -{ -public: - // construct a buffer from existing DIB, optionally stretching to fit new size - CGameDDrawBitBuffer(CGameDIB* pDIB, int width=0, int height=0, COLORREF trans=PALETTEINDEX(1)); - - // construct an "empty" buffer with given size - CGameDDrawBitBuffer(int width, int height, HPALETTE hPal = NULL, COLORREF trans=PALETTEINDEX(1)); - - virtual ~CGameDDrawBitBuffer(); - - // blt to this buffer - virtual void Blt( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ); - - // generic dest blitting calls can handle any type of bitbuffer - virtual void Blt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ); - - virtual void TransBlt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ); - - // specific blit for another DDraw buffer - virtual void BltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ); - - virtual void TransBltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ); - - // specific blit for a dibsection buffer - virtual void BltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ); - - virtual void TransBltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ); - - virtual void SetPalette( HPALETTE ); - - // report whether this object is a valid bitbuffer - virtual BOOL IsValid() - { - return mIsValid; - } - - // report this object's type - virtual BB_TYPE TypeID() - { - return BB_DDraw; - } - -protected: - // we keep a single ptr around to access DDraw - static LPDIRECTDRAW mpDDrawDriver; - static int mInstanceCount; // for allocating/freeing mpDDrawDriver - BOOL mIsAttached; // flag whether this is backbuffer - BOOL mIsValid; - long mPitch; - - LPDIRECTDRAWSURFACE mpSurface; // ptr to our DDraw surface - DDSURFACEDESC mSurfD; // cache the surface description - - char* mpFileName; // we need to keep dib's filename around - // in case we need to reload - - friend class CGameDDrawScreen; - friend class CGameDSBitBuffer; - - friend DWORD CALLBACK EnumCallback(LPVOID lpContext, LPDDSURFACEDESC lpDDrawSurfaceInfo); - - void InitDDraw(); - - CGameDDrawBitBuffer() : - mpSurface( NULL ), - mIsAttached( FALSE ), - mIsValid( FALSE ) - { - }; - - // create this DDraw surface - virtual void CreateSurface(int width, int height); - // if surface is lost (e.g. from mode switch), call this to recreate it - virtual void ReCreate(); - - void SetBits( CGameDIB* pSource ); - - virtual LPBYTE GetLockedAddress( int x, int y ); - virtual void Unlock(); -}; - -class CGameDDrawScreenBuffer : public CGameDDrawBitBuffer -{ -public: - CGameDDrawScreenBuffer(); - - // create an attached-buffer object from given primary surface - CGameDDrawScreenBuffer( CGameDDrawScreenBuffer* pFront ); - virtual void SetMode( int width, int height, int bits ); - virtual void ShowGDIPage(); - virtual void RestoreMode(); - virtual void SetPalette( LPPALETTEENTRY ); - virtual void DeleteDDPalette(); - - int GetVideoMemory(); - - virtual ~CGameDDrawScreenBuffer(); - -protected: - // create the screen's primary surface - virtual void CreateSurface(int width, int height); - // if surface is lost (e.g. from mode switch), call this to recreate it -// virtual void ReCreate(); - LPDIRECTDRAWPALETTE mpPalette; - LPDIRECTDRAWPALETTE mpOldPalette; -}; - -class CGameDSBitBuffer : public CGameBitBuffer -{ -public: - // construct a buffer from existing DIB, optionally stretching to fit new size - CGameDSBitBuffer(CGameDIB* pDIB, int width=0, int height=0, COLORREF trans=PALETTEINDEX(1)); - - // construct an "empty" buffer with given size - CGameDSBitBuffer(int width, int height, HPALETTE hPal = NULL, COLORREF trans=PALETTEINDEX(1)); - - virtual ~CGameDSBitBuffer(); - - // blt to this buffer - virtual void Blt( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ); - - // generic dest blitting calls can handle any type of bitbuffer - virtual void Blt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ); - - virtual void TransBlt( - CGameBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ); - - // specific blit for a DDraw buffer - virtual void BltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ); - - virtual void TransBltDDraw( - CGameDDrawBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ); - - // specific blit for a dibsection buffer - virtual void BltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - DWORD rop - ); - - virtual void TransBltDS( - CGameDSBitBuffer* pDestBuffer, - int xDest, - int yDest, - int wDest, - int hDest, - int xSrc, - int ySrc, - int transColor - ); - - virtual void SetPalette( HPALETTE ); - - virtual HBITMAP GetHBitmap() - { - return mpDIB ? mpDIB->GetHBitmap() : NULL; - } - - virtual LPBYTE GetBits() - { - return mpBits; - } - - // report whether this object is a valid bitbuffer - virtual BOOL IsValid() - { - return mIsValid; - } - - // report this object's type - virtual BB_TYPE TypeID() - { - return BB_DS; - } - -protected: - friend class CGameDSScreen; - friend class CGameDDrawBitBuffer; - LPBITMAPINFO mpBitmapInfo; - LPBYTE mpBits; - CGameDIB* mpDIB; - BOOL mIsValid; - - void SetBits( CGameDIB* pSource ); -}; - -#endif // CGBITBUF_H diff --git a/sdk/samples/iklowns/cgchar.cpp b/sdk/samples/iklowns/cgchar.cpp deleted file mode 100644 index 55cab8b..0000000 --- a/sdk/samples/iklowns/cgchar.cpp +++ /dev/null @@ -1,352 +0,0 @@ -/*===========================================================================*\ -| -| File: cgchar.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#ifdef __WATCOMC__ -#include -#else -#include -#endif -#include "cgdebug.h" -#include "cgglobl.h" -#include "cgtimer.h" -#include "cginput.h" -#include "cgchar.h" -#include "cgchdll.h" -#include "cgchrint.h" -#include "cgload.h" -#include "cgremote.h" -#include "strrec.h" - -extern void dbgprintf(char *, ...); -extern CLoadingScreen *gLoadingScreen; - -static int DefaultCharacterAction (CGameCharacter *me, CGameLevel *level) -{ - // move to next sprite sequence... - me->NextSprite(level->GetFrameTime()); - - // always stays in state 0 ... - return(0); -} - -static int DefaultCharacterCollide (CGameCharacter *me, CGameCharacter *other, CGameLevel *level) -{ - // what to do if we collided???? - return(ACTION_COMPLETED); -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameCharacter -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameCharacter::CGameCharacter( - char* pFileName, - char* pCharName, - char* pGraphicKey, - CGameLevel *pLevel, - int minz, - int maxz, - int startx, - int starty, - void *pNewObjID, - char *pRemoteName - ) : CGameGraphic( minz ), - mpActions( NULL ), - mpName( NULL ), - mNumActions( 0 ), - mpCurAction( NULL ), - mCurSubX( 0 ), - mCurSubY( 0 ), - mVelocityX( 0 ), - mVelocityY( 0 ), - mLastTime( -1 ) -{ - static DWORD gObjInstance=0; - // hook into the character DLL (or built-in) functionality, if present - // note: if nothing is found, then we'll use *default* actions! - mpLevel = pLevel; - mpName = new char[lstrlen( pCharName ) + 1]; - lstrcpy( mpName, pCharName ); - - mpCharInfo = FindCharInfo(pCharName); - if (mpCharInfo) - { - mpCharInfo->Create(this, pLevel); - pCollideFunc = mpCharInfo->Collide; - mNumActions = mpCharInfo->NumSequences; - } - else - { - pActFunc = DefaultCharacterAction; - pCollideFunc = DefaultCharacterCollide; - mNumActions = 1; - } - - // now that we know how many actions there are, allocate our array - mpActions = new CGameAction *[mNumActions]; - - char *actionBuf; - char defAction[] = ""; // no default action names - - if (mpCharInfo) - { - int ix = 0; - for ( ix = 0; ix < mNumActions ; ix++ ) - { - if (gLoadingScreen != NULL) - gLoadingScreen->Update(); - - mpActions[ix] = new CGameAction( pFileName, &(mpCharInfo->Sequences[ix]) - , (DWORD)this ); - } - } - else - { - actionBuf = new char [32 * mNumActions]; - GetPrivateProfileString( - pCharName, - NULL, // grab all the key names - defAction, - actionBuf, - 32 * mNumActions, - pFileName - ); - - int ix = 0; - for ( char *pAction = actionBuf; *pAction && ( ix < mNumActions ); pAction++, ix++ ) { - if (gLoadingScreen != NULL) - gLoadingScreen->Update(); - mpActions[ix] = new CGameAction( pFileName, pAction - , (DWORD)this ); - pAction += lstrlen( pAction ); // move beyond terminator - } - - delete [] actionBuf; - } - - // Initialize remote stuff - pObjID = (REMOTE_OBJECT *)pNewObjID; - pActionQueue = NULL; - fRemote = FALSE; - if (mpCharInfo) - { - if (pObjID != NULL) - { - fRemote = TRUE; - pActFunc = mpCharInfo->RemoteAction; - - // Create an action queue - pActionQueue = CreateRemoteObjectQueue(pObjID, (void *)this); - - } else { - if (mpCharInfo->RemoteAction != NULL) - { - if (pRemoteName == NULL) - pRemoteName = pCharName; - - pObjID = CreateRemotePeers(pRemoteName, gObjInstance++); - } - pActFunc = mpCharInfo->Action; - } - } - - mMaxZ = maxz; - mMinZ = minz; - mCurZ = (mMaxZ+mMinZ)/2; - - mpCurAction = mpActions[0]; - curState = -1; - MoveTo(startx, starty); -} - -CGameCharacter::~CGameCharacter() -{ - if (fRemote) - { - // Get rid of the action queue - DestroyRemoteObjectQueue(pObjID); - } - else - { - DestroyRemotePeer(pObjID); - } - - // delete all the action objects - for ( ; mNumActions > 0; mNumActions-- ) - { - delete mpActions[mNumActions - 1]; - } - - delete[] mpActions; - delete[] mpName; -} - -void CGameCharacter::Update( - CGameLevel* pLevel, - CGameUpdateList* pList // we add to this if we move - ) -{ - if (mpNext) - mpNext->Update(pLevel, pList); - - CGameAction* mpPrevAction = mpCurAction; - - int newState = (pActFunc)(this, pLevel); - - // set new state - if (newState != -1) - { - // don't change state if out of bounds! - if (newState >= mNumActions) - { - newState = curState; - } - - if (newState >= 0) - mpCurAction = mpActions[newState]; - } - - // See if this is a new action we've entered into. - if (newState != curState) - { - mpPrevAction->DeActivate(); - curState = newState; - if (curState != -1 && curState != -2) - { - mpCurAction->Activate(); - } - } - - //if (mpCurAction != NULL) - mpCurAction->Update(pLevel->World2ScreenX(SUB2WORLD(mCurSubX), mXParallax)); - - if (newState == -1) - { - // kill me - Destroy(this, pLevel); - pLevel->Remove(this); - } -} - -// display the character in its position on given screen with given screen offset -void -CGameCharacter::Render( - CGameLevel* pLevel, - CGameScreen* pScreen, - CGameUpdateList* pList - ) -{ - if (mpNext) - { - // recurse down the list to get background filled in - mpNext->Render(pLevel, pScreen, pList); - } - - RECT update; - - // only draw if we're in the invalid list: - if (IntersectRect( &update, pList->GetDirtyRect(), &mRect)) - { - mpCurAction->Render( - pScreen, - pLevel->World2ScreenX(SUB2WORLD(mCurSubX), mXParallax), - pLevel->World2ScreenY(SUB2WORLD(mCurSubY), mYParallax), - FALSE, // don't ever reverse the image - FALSE, - pList->GetDirtyRect() - ); - } -} - -void -CGameCharacter::MoveTo( int worldX, int worldY ) -{ - mpLevel->AddInvalidRect(&mRect); - - mCurSubX = WORLD2SUB(worldX); - mCurSubY = WORLD2SUB(worldY); - - mRect.left = mpLevel->World2ScreenX(worldX, mXParallax); - mRect.top = mpLevel->World2ScreenY(worldY, mYParallax); - mRect.right = mRect.left + GetCurWidth() - 1; - mRect.bottom = mRect.top + GetCurHeight() - 1; - - mpLevel->AddInvalidRect(&mRect); -} - -int -CGameCharacter::NextSprite( - int time, // current game time - BOOL wrap // should sequence wrap around? - ) -{ - mpLevel->AddInvalidRect(&mRect); - int result = mpCurAction->NextSprite(time, wrap); - - // need to recalculate screen position in case screen moved - mRect.left = mpLevel->World2ScreenX(SUB2WORLD(mCurSubX), mXParallax); - mRect.top = mpLevel->World2ScreenY(SUB2WORLD(mCurSubY), mYParallax); - mRect.right = mRect.left + GetCurWidth() - 1; - mRect.bottom = mRect.top + GetCurHeight() - 1; - - mpLevel->AddInvalidRect(&mRect); - - return result; -} - -int CGameCharacter::GetRemoteAction( - void *&Data, - DWORD &DataSize -) -{ - return(GetNextRemoteAction(pActionQueue, Data, DataSize)); -} - -int CGameCharacter::TransmitRemoteAction( - int action, - void *Data, - DWORD DataSize -) -{ - SendRemoteAction(pObjID, action, Data, DataSize); - return(0); -} - -void CGameCharacter::ReleaseRemoteAction( - void *Data -) -{ - ReleaseRemoteData(Data); -} diff --git a/sdk/samples/iklowns/cgchar.h b/sdk/samples/iklowns/cgchar.h deleted file mode 100644 index 93cb085..0000000 --- a/sdk/samples/iklowns/cgchar.h +++ /dev/null @@ -1,201 +0,0 @@ -/*===========================================================================*\ -| -| File: cgchar.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGCHAR_H -#define CGCHAR_H - -#include "cgupdate.h" -#include "cgaction.h" -#include "cggraph.h" -#include "cgchdll.h" -#include "cgremote.h" - -// maximum number of actions per character -#define MAX_ACTIONS 32 - -// NOTE: our internal mCurSubX values are in 256 sub-pixel units -// externally, they are pixels -- these macro convert between the 2 -#define SUB2WORLD( x ) ( x >> 8 ) -#define WORLD2SUB( x ) ( x << 8 ) - -class CGameCharacter : public CGameGraphic -{ -public: - CGameCharacter( char* pFileName, - char* pCharName, - char* pGraphicKey, - CGameLevel * pLevel, - int minz, - int maxz, - int startx=0, - int starty=0, - void *pNewObjID=NULL, - char *pRemoteName=NULL); - virtual ~CGameCharacter(); - // 'instance' data so characters can keep private data if needed - void * mpPrivateData; - - // NOTE: our internal mCurSubX values are pixels * 256! - // externally, they are pixels - virtual void MoveTo( int worldX, int worldY ); - - virtual void GetXY( int *worldX, int * worldY ) - { - *worldX = SUB2WORLD(mCurSubX); - *worldY = SUB2WORLD(mCurSubY); - } - - virtual void SetVelocity( int vX, int vY ) - { - mVelocityX = vX; - mVelocityY = vY; - } - - virtual void GetVelocity( int* pvX, int* pvY ) - { - *pvX = mVelocityX; - *pvY = mVelocityY; - } - - virtual void Update(CGameLevel* pLevel, CGameUpdateList* pUpdate); - virtual void Render(CGameLevel* pLevel, CGameScreen* pScreen, CGameUpdateList* pUpdate); - - virtual HPALETTE GetHPalette() - { - return NULL; // characters can't return palettes - } - - virtual int GetCurWidth() { return mpCurAction?mpCurAction->GetCurWidth():0; } - virtual int GetCurHeight() { return mpCurAction?mpCurAction->GetCurHeight():0; } - virtual int NextSprite(int time, BOOL wrap = TRUE); - - virtual int GetMinZ() - { - return mMinZ; - } - - virtual int GetMaxZ() - { - return mMaxZ; - } - - virtual int GetXParallax() - { - return mXParallax; - } - - virtual int GetYParallax() - { - return mYParallax; - } - - virtual void SetCurrentZ( int newZ ) - { - mCurZ = newZ; - mpLevel->ReSort(); - } - - // Remote interaction methods - virtual int GetRemoteAction(void *&Data, DWORD &DataSize); - virtual int TransmitRemoteAction(int action, void *Data, DWORD DataSize); - virtual void ReleaseRemoteAction(void *); - BOOL IsRemoteControlled() - { - return fRemote; - } - - int mLastTime; // last time (in Timer units) we updated position - - virtual int Collided (CGameCharacter *other) - { - if (pCollideFunc) - return (*pCollideFunc)( this, other, mpLevel); - else - return 0; - } - - virtual char * GetName() - { - return mpName; - } - - virtual void Destroy (CGameCharacter *me, CGameLevel *lev) - { - if (mpCharInfo) - mpCharInfo->Destroy(me,lev); - } - - // NOTE: our internal mCurSubX values are pixels * 256! - // externally, they are pixels -- this allows the DLL - // functions to get & set the actual values as well as move - virtual void SetAndMove( int subX, int subY ) - { - MoveTo( SUB2WORLD(subX), SUB2WORLD(subY) ); // this sets curworld - mCurSubX = subX; // so we reset - mCurSubY = subY; - } - - virtual void GetSubXY( int *subX, int * subY ) - { - *subX = mCurSubX; - *subY = mCurSubY; - } - - // to allow DLL's to easily override our default behavior: - CGameCharInfo * mpCharInfo; - -protected: - // for Z ordering.... - int mMinZ, mMaxZ; - - char* mpName; - - CGameAction** mpActions; // array of action ptrs - int mNumActions; - CGameAction* mpCurAction; // our current action - - int curState; - - // NOTE: our internal mCurSubX values are pixels * 256! - // externally, they are pixels - int mCurSubX; // current position in world coordinates * 256 - int mCurSubY; // current position in world coordinates * 256 - - int mVelocityX; // current velocity ((pixels/256)/ms) in X dimension (sign == direction) - int mVelocityY; // current velocity ((pixels/256)/ms) in Y dimension (sign == direction) - - pActionFunction pActFunc; - pCollideFunction pCollideFunc; - BOOL fRemote; // TRUE -> controlled remotely - REMOTE_OBJECT *pObjID; // unique object ID across all peers - CLinkedList *pActionQueue; // actions received from remotes - CGameLevel * mpLevel; -}; - -#endif // CGCHAR_H diff --git a/sdk/samples/iklowns/cgchdll.h b/sdk/samples/iklowns/cgchdll.h deleted file mode 100644 index 54c983e..0000000 --- a/sdk/samples/iklowns/cgchdll.h +++ /dev/null @@ -1,96 +0,0 @@ -/*===========================================================================*\ -| -| File: cgchdll.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGCHDLL_H -#define CGCHDLL_H -// version number in CGameVersionIdent structure returned by Ident() -#define RELEASE1_0 0x00010000 -#define GAMEID 0x6b455749 // 'Game' - -struct CGameVersionIdent { - long version; - long id; // must be == GAMEID -}; - -// ordinal numbers in DLL: -#define EXPORTED_IDENT 1 -#define EXPORTED_INFO 2 - -#define ACTION_COMPLETED 0 -#define ACTION_KILLME -1 - -class CGameCharacter; -class CGameLevel; -typedef int (*pActionFunction)(CGameCharacter *mythis, CGameLevel *mylevel); -typedef int (*pCollideFunction)(CGameCharacter *mythis, CGameCharacter * otherthis, CGameLevel *mylevel); - -struct CGameCharSoundInfo { - char * Sound; - char * SoundEnd; - int Rate; - int Loop; -}; - -struct CGameCharSequenceInfo { - char * SequenceFile; - char * SequenceName; - int Rate; - CGameCharSoundInfo Sound; -}; - -struct CGameCharInfo { - char *name ; - int NumSequences; - CGameCharSequenceInfo * Sequences; - - pActionFunction Create; - pActionFunction Action; - pActionFunction Destroy; - pActionFunction RemoteAction; - pCollideFunction Collide; -}; - -struct CGameInfo { - int numcharacters; - CGameCharInfo **characters; -}; - -// functions exported by each character DLL -// exported as EXPORTED_IDENT: -#if defined(__BORLANDC__) || defined(__WATCOMC__) -extern "C" void CALLBACK Ident (CGameVersionIdent *); - -// exported as EXPORTED_INFO: -extern "C" void CALLBACK Info (CGameInfo *); -#else -void CALLBACK Ident (CGameVersionIdent *); - -// exported as EXPORTED_INFO: -void CALLBACK Info (CGameInfo *); -#endif -#endif diff --git a/sdk/samples/iklowns/cgchrint.cpp b/sdk/samples/iklowns/cgchrint.cpp deleted file mode 100644 index 09cc70d..0000000 --- a/sdk/samples/iklowns/cgchrint.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/*===========================================================================*\ -| -| File: cgchrint.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#ifdef __WATCOMC__ -#include "mem.h" -#else -#include "memory.h" -#endif -#include "cgchdll.h" -#include "cglevel.h" -#include "cgchar.h" -#include "cgchrint.h" -#include "cginput.h" - -// for now, only allow up to 9 DLLs (plus the internal list) -#define GAME_INFO_MAX 10 -static int gameInfoCount = 0; // none loaded yet -static CGameInfo gameInfo[GAME_INFO_MAX]; - -static CGameInfo gInternalCharInfo = -{ - 0, - NULL -}; - -void LoadCharInfo( CGameInfo * info ) -{ - if ( gameInfoCount == GAME_INFO_MAX ) - return; - - // scans 'info' for chars; adds them to our internal list of love - if ( info == NULL ) { - // NULL means load internal characters - info = &gInternalCharInfo; - } - // add the info ptr to our internal table - gameInfo[gameInfoCount] = *info; - ++gameInfoCount; -} - -CGameCharInfo *FindCharInfo( char *name ) -{ - static CGameCharInfo *lastFound = NULL; - - CGameCharInfo *result = NULL; - int x, - y; - int found = 0; - - // first off - is this the same as the last one? - if (lastFound && (lstrcmpi(name, lastFound->name)==0)) - { - result = lastFound; - ++found; - } - else - { - // scan to find a character in the list(s) - for ( x = 0; x < gameInfoCount; x++ ) { - for ( y = 0; y < gameInfo[x].numcharacters; y++ ) { - result = gameInfo[x].characters[y]; - if ( lstrcmpi( result->name, name ) == 0) - { - ++ found; - lastFound = result; - break; - } - } - if (found) break; - } - } - - if ( !found ) - result = NULL; - - return ( result ); -} - -void LoadMyDLL( char *path, char *name ) -{ - char *p; - char thename[260]; - CGameVersionIdent ident; - CGameInfo info; - int (CALLBACK *fpIdent ) ( CGameVersionIdent * ); - int (CALLBACK *fpInfo ) ( CGameInfo * ); - - lstrcpy( thename, path ); - p = strrchr( thename, '/' ); - if ( p == NULL ) - p = strrchr( thename, '\\' ); - if ( p == NULL ) - lstrcat( thename, "\\" ); - else - *( p + 1 ) = 0; - - lstrcat( thename, name ); - - HINSTANCE hlib = LoadLibrary( thename ); - - if ( hlib != NULL ) { - fpIdent = ( int (CALLBACK * ) ( CGameVersionIdent * ) ) GetProcAddress( hlib, MAKEINTRESOURCE( EXPORTED_IDENT ) ); - if ( fpIdent != NULL ) { - ( *fpIdent ) ( &ident ); - if ( ( ident.version == RELEASE1_0 ) && ( ident.id == GAMEID ) ) { - fpInfo = ( int ( CALLBACK * ) ( CGameInfo * ) ) GetProcAddress( hlib, MAKEINTRESOURCE( EXPORTED_INFO ) ); - if ( fpInfo != NULL ) { - ( *fpInfo ) ( &info ); - LoadCharInfo( &info ); - } - } - } - } -} diff --git a/sdk/samples/iklowns/cgchrint.h b/sdk/samples/iklowns/cgchrint.h deleted file mode 100644 index 94ecacf..0000000 --- a/sdk/samples/iklowns/cgchrint.h +++ /dev/null @@ -1,31 +0,0 @@ -/*===========================================================================*\ -| -| File: cgchrint.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -void LoadCharInfo( CGameInfo * info ); -CGameCharInfo *FindCharInfo( char *name ); -void LoadMyDLL( char *path, char *name ); diff --git a/sdk/samples/iklowns/cgdib.cpp b/sdk/samples/iklowns/cgdib.cpp deleted file mode 100644 index ac6e193..0000000 --- a/sdk/samples/iklowns/cgdib.cpp +++ /dev/null @@ -1,901 +0,0 @@ -/*===========================================================================*\ -| -| File: cgdib.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - - -#ifdef __WATCOMC__ -#include -#endif -#include -#include "cgglobl.h" -#include "cgrsrce.h" -#include "cgscreen.h" -#include "cgexcpt.h" -#include "cgdebug.h" -#include "cgdib.h" - -/* Macro to determine to round off the given value to the closest byte */ -#define WIDTHBYTES(i) ((i+31)/32*4) - -#define BFT_BITMAP 0x4d42 /* 'BM' */ - -/* macro to determine if resource is a DIB */ -#define ISDIB(bft) ((bft) == BFT_BITMAP) - -/* Macros to display/remove hourglass cursor for lengthy operations */ -#define StartWait() hcurSave = SetCursor(hCursor=LoadCursor(NULL,IDC_WAIT)); -#define EndWait() SetCursor(hCursor=hcurSave) - -#define PALVERSION 0x300 -#define MAXPALETTE 256 /* max. # supported palette entries */ - -WORD PaletteSize (VOID FAR * pv); -WORD DibNumColors (VOID FAR * pv); -HPALETTE CreateDibPalette (HANDLE hdib); -HPALETTE CreateBIPalette (LPBITMAPINFOHEADER lpbi); -HANDLE DibFromBitmap (HBITMAP hbm, DWORD biStyle, WORD biBits, HPALETTE hpal); -HBITMAP BitmapFromDib (HANDLE hdib, HPALETTE hpal); -BOOL DibInfo (HANDLE hdib,LPBITMAPINFOHEADER lpbi); -HANDLE ReadDibBitmapInfo (int fh); -VOID ReadBitMapFileHeaderandConvertToDwordAlign(HFILE fh, LPBITMAPFILEHEADER pbf, LPDWORD lpdwoff); - -static HCURSOR hCursor; -static HCURSOR hcurSave; - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDIB -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameDIB::CGameDIB( - ) : mImageValid( FALSE ), - mpBitmapInfo( NULL ), - mpBits( NULL ), - mpFileName( NULL ), - mhBitmap( NULL ) -{ -} - -CGameDIB::CGameDIB( - LPSTR pFileName - ) : mImageValid( FALSE ), - mpBitmapInfo( NULL ), - mpBits( NULL ), - mpFileName( NULL ), - mhBitmap( NULL ) -{ - if (pFileName) - { - mpFileName = new char[lstrlen(pFileName)+1]; - lstrcpy( mpFileName, pFileName ); - - // Load the DIB into memory. - OpenDIB(pFileName); - - // Set the flag to indicate that we now have a valid image in memory. - // NOTE: OpenDIB will throw exception if there's a problem, so we can - // assume here that image is valid. - mImageValid = TRUE; - } -} - -// construct a new DIB section in memory of given size, palette -CGameDIB::CGameDIB( - int width, - int height, - HPALETTE hPal - ) : mImageValid( FALSE ), - mpBitmapInfo( NULL ), - mpBits( NULL ), - mpFileName( NULL ), - mhBitmap( NULL ) -{ - PALETTEENTRY entries[256]; - LPBITMAPINFO pBI = (LPBITMAPINFO) GlobalAllocPtr( GHND, sizeof( BITMAPINFO ) ); - - if (!pBI) - throw CGameResourceError(); - - // !!!NOTE: we're assuming 8 BPP - pBI->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - pBI->bmiHeader.biWidth = width; - pBI->bmiHeader.biHeight = height; // make it top-down - pBI->bmiHeader.biPlanes = 1; - pBI->bmiHeader.biBitCount = 8; - - pBI->bmiHeader.biCompression = BI_RGB; - pBI->bmiHeader.biXPelsPerMeter = 0; - pBI->bmiHeader.biYPelsPerMeter = 0; - pBI->bmiHeader.biClrUsed = 256; - pBI->bmiHeader.biClrImportant = 256; - - pBI->bmiHeader.biSizeImage = WIDTHBYTES(width*8) * height; - - /* Calculate the memory needed to hold the DIB */ - DWORD dwBits = pBI->bmiHeader.biSizeImage; - DWORD dwLen = pBI->bmiHeader.biSize + (DWORD)PaletteSize (pBI); - - /* Try to increase the size of the bitmap info. buffer to hold the DIB */ - pBI = (LPBITMAPINFO) GlobalReAllocPtr(pBI, dwLen, GHND); - if (!pBI) - { - throw CGameResourceError(); - } - - mpBitmapInfo = pBI; - - HDC hdc = GetDC( HWND_DESKTOP ); - - if (hdc) - { - // now create the color table from given palette - HPALETTE hOldPal = NULL; - - if (hPal == NULL) - hPal = (HPALETTE)GetCurrentObject( hdc, OBJ_PAL ); - else - { - hOldPal = SelectPalette( hdc, hPal, FALSE ); - RealizePalette( hdc ); - } - - UINT numColors = GetSystemPaletteEntries( - hdc, - 0, // start index - MAXPALETTE, // num to get - entries - ); - - - - for (UINT i=0; ibmiColors[i].rgbRed = entries[i].peRed; - pBI->bmiColors[i].rgbGreen = entries[i].peGreen; - pBI->bmiColors[i].rgbBlue = entries[i].peBlue; - } - - mhBitmap = CreateDIBSection( - hdc, - mpBitmapInfo, - DIB_RGB_COLORS, - (void**) &mpBits, - NULL, - 0 - ); - - mImageValid = (mhBitmap != NULL); - - if (hOldPal) - { - SelectPalette( hdc, hOldPal, FALSE ); - RealizePalette( hdc ); - } - - ReleaseDC( HWND_DESKTOP, hdc ); - } -} - -/*---------------------------------------------------------------------------*\ -| ~CGameDIB -\*---------------------------------------------------------------------------*/ -CGameDIB::~CGameDIB() -{ - delete[] mpFileName; - - if (mhBitmap) - { - DeleteObject( mhBitmap ); - } - - if (mpBitmapInfo) - { - GlobalFreePtr( mpBitmapInfo ); - } -} - -/*---------------------------------------------------------------------------*\ -| GetWidth() -\*---------------------------------------------------------------------------*/ -int -CGameDIB::GetWidth() -{ - if (mpBitmapInfo) - return mpBitmapInfo->bmiHeader.biWidth; - - return 0; -} - -/*---------------------------------------------------------------------------*\ -| GetHeight() -\*---------------------------------------------------------------------------*/ -int -CGameDIB::GetHeight() -{ - if (mpBitmapInfo) - return mpBitmapInfo->bmiHeader.biHeight; - - return 0; -} - -/*---------------------------------------------------------------------------*\ -| CreatePalette -\*---------------------------------------------------------------------------*/ -HPALETTE -CGameDIB::CreatePalette() -{ - return CreateBIPalette( (PBITMAPINFOHEADER) mpBitmapInfo ); -} - -/*---------------------------------------------------------------------------*\ -| OpenDIB -\*---------------------------------------------------------------------------*/ -void -CGameDIB::OpenDIB (char* pFileName) -{ - HFILE fh; - BITMAPINFOHEADER bi; - LPBITMAPINFOHEADER lpbi; - DWORD dwLen = 0; - DWORD dwBits; - HANDLE hdib; - HANDLE h; - OFSTRUCT of; - - if (!pFileName) - return; - - /* Open the file and read the DIB information */ - fh = OpenFile(pFileName, &of, (UINT)OF_READ); - if (fh == -1) - { - DB_LOG(DB_PROBLEM, "DEBUG: OpenFile failed in OpenDIB"); - throw CGameException( - IDS_INVALID_FILE - ); - } - - hdib = ReadDibBitmapInfo(fh); - - DWORD offset = SetFilePointer( (HANDLE) fh, 0, NULL, FILE_CURRENT ); - - if (!hdib) - { - DB_LOG(DB_PROBLEM, "DEBUG: Invalid DIB file in OpenDIB"); - throw CGameException( - IDS_INVALID_FILE - ); - } - - DibInfo(hdib,&bi); - -#ifdef ConvertToPaletteRelative - /* Convert the DIB color table to palette relative indexes, so - * SetDIBits() and SetDIBitsToDevice() can avoid color matching. - * We can do this because the palette we realize is identical - * to the color table of the bitmap, ie the indexes match 1 to 1 - * - * Now that the DIB color table is palette indexes not RGB values - * we must use DIB_PAL_COLORS as the wUsage parameter to SetDIBits() - */ - lpbi = (VOID FAR *) GlobalLock(hbiCurrent); - if (lpbi->biBitCount != 24) { - fPalColors = TRUE; - - pw = (WORD FAR *) ((LPSTR) lpbi + lpbi->biSize); - - for (i = 0; i < (int) lpbi->biClrUsed; i++) - *pw++ = (WORD) i; - } - GlobalUnlock(hbiCurrent); -#endif - - /* Calculate the memory needed to hold the DIB */ - dwBits = bi.biSizeImage; - dwLen = bi.biSize + (DWORD)PaletteSize (&bi); - - /* Try to increase the size of the bitmap info. buffer to hold the DIB */ - h = GlobalReAlloc(hdib, dwLen, GHND); - if (!h) - { - GlobalFree(hdib); - hdib = NULL; - throw CGameResourceError(); - } - else - hdib = h; - - /* Read in the bits */ - if (hdib) - { - lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib); - mpBitmapInfo = (LPBITMAPINFO) lpbi; - - HDC hdc = GetDC( HWND_DESKTOP ); - - if (hdc) - { - mhBitmap = CreateDIBSection( - hdc, - mpBitmapInfo, - DIB_RGB_COLORS, - (void**) &mpBits, - NULL, - 0 - ); - - ReadFile( - (HANDLE)fh, - mpBits, - dwBits, - &dwLen, - NULL - ); - - ReleaseDC( HWND_DESKTOP, hdc ); - } - } - - CloseHandle((HANDLE)fh); -} - -/*---------------------------------------------------------------------------*\ -| GetPixelAddress() -\*---------------------------------------------------------------------------*/ -LPBYTE // return address of the pixel -- NULL if out of range -CGameDIB::GetPixelAddress( - int x, - int y - ) -{ - long width; - - // check params - if (( x < 0 ) || ( y < 0 ) || ( x >= GetWidth() ) || ( y >= GetHeight() )) - { - return NULL; - } - - // round up to DWORD boundary - width = (GetWidth() + 3) & ~3; - return mpBits + (long)(GetHeight()-y-1) * width + (long)x; -} - -/*---------------------------------------------------------------------------*\ -| GetPixelAddress() -\*---------------------------------------------------------------------------*/ -COLORREF -CGameDIB::GetPixelColor( - int x, - int y - ) -{ - LPBYTE pPixel = GetPixelAddress( x, y ); - - if (pPixel) - { - RGBQUAD quad = mpBitmapInfo->bmiColors[*pPixel]; - - return PALETTERGB( quad.rgbRed, quad.rgbGreen, quad.rgbBlue ); - } - - // else - return 0; // invalid params -} - -/*---------------------------------------------------------------------------*\ -| GetColorTable() -\*---------------------------------------------------------------------------*/ -UINT // return the number of entries copied -CGameDIB::GetColorTable(UINT start, UINT count, RGBQUAD* pArray) -{ - UINT result = 0; - - if (mpBitmapInfo) - { - for (int i=start; ( i < DibNumColors(mpBitmapInfo)) && (result < count); i++) - { - pArray[result] = mpBitmapInfo->bmiColors[i]; - ++result; - } - } - - return result; -} - -/**************************************************************************** - * * - * FUNCTION : DibInfo(HANDLE hbi,LPBITMAPINFOHEADER lpbi) * - * * - * PURPOSE : Retrieves the DIB info associated with a CF_DIB * - * format memory block. * - * * - * RETURNS : TRUE - if successful. * - * FALSE - otherwise * - * * - ****************************************************************************/ -BOOL DibInfo ( - HANDLE hbi, - LPBITMAPINFOHEADER lpbi) -{ - if (hbi) - { - *lpbi = *(LPBITMAPINFOHEADER)GlobalLock (hbi); - - /* fill in the default fields */ - if (lpbi->biSize != sizeof (BITMAPCOREHEADER)) - { - if (lpbi->biSizeImage == 0L) - lpbi->biSizeImage = WIDTHBYTES(lpbi->biWidth*lpbi->biBitCount) * lpbi->biHeight; - - if (lpbi->biClrUsed == 0L) - lpbi->biClrUsed = DibNumColors (lpbi); - } - GlobalUnlock (hbi); - return TRUE; - } - return FALSE; -} - -/**************************************************************************** - * * - * FUNCTION : CreateBIPalette(LPBITMAPINFOHEADER lpbi) * - * * - * PURPOSE : Given a Pointer to a BITMAPINFO struct will create a * - * a GDI palette object from the color table. * - * * - * RETURNS : A handle to the palette. * - * * - ****************************************************************************/ -HPALETTE CreateBIPalette (LPBITMAPINFOHEADER lpbi) -{ - LOGPALETTE *pPal; - HPALETTE hpal = NULL; - WORD nNumColors; - BYTE red; - BYTE green; - BYTE blue; - WORD i; - RGBQUAD FAR *pRgb; - - if (!lpbi) - return NULL; - - if (lpbi->biSize != sizeof(BITMAPINFOHEADER)) - return NULL; - - /* Get a pointer to the color table and the number of colors in it */ - pRgb = (RGBQUAD FAR *)((LPSTR)lpbi + (WORD)lpbi->biSize); - nNumColors = DibNumColors(lpbi); - - if (nNumColors) - { - /* Allocate for the logical palette structure */ - pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + nNumColors * sizeof(PALETTEENTRY)); - if (!pPal) - return NULL; - - pPal->palNumEntries = nNumColors; - pPal->palVersion = PALVERSION; - - /* Fill in the palette entries from the DIB color table and - * create a logical color palette. - */ - - // keep index 0 black, index 255 white to keep Windows happy - pPal->palPalEntry[0].peRed = 0; - pPal->palPalEntry[0].peGreen = 0; - pPal->palPalEntry[0].peBlue = 0; - pPal->palPalEntry[0].peFlags = PC_EXPLICIT; - - for (i = 1; i < (nNumColors-1); i++) - { - pPal->palPalEntry[i].peRed = pRgb[i].rgbRed; - pPal->palPalEntry[i].peGreen = pRgb[i].rgbGreen; - pPal->palPalEntry[i].peBlue = pRgb[i].rgbBlue; - pPal->palPalEntry[i].peFlags = PC_NOCOLLAPSE; - } - - if (nNumColors == 256) - { - pPal->palPalEntry[255].peRed = 255; // PC_EXPLICIT treats number as a long - pPal->palPalEntry[255].peGreen = 0; - pPal->palPalEntry[255].peBlue = 0; - pPal->palPalEntry[255].peFlags = PC_EXPLICIT; - } - - hpal = CreatePalette(pPal); - LocalFree((HANDLE)pPal); - } - else if (lpbi->biBitCount == 24) - { - /* A 24 bitcount DIB has no color table entries so, set the number of - * to the maximum value (256). - */ - nNumColors = MAXPALETTE; - pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + nNumColors * sizeof(PALETTEENTRY)); - if (!pPal) - return NULL; - - pPal->palNumEntries = nNumColors; - pPal->palVersion = PALVERSION; - - red = green = blue = 0; - - /* Generate 256 (= 8*8*4) RGB combinations to fill the palette - * entries. - */ - for (i = 0; i < pPal->palNumEntries; i++) - { - pPal->palPalEntry[i].peRed = red; - pPal->palPalEntry[i].peGreen = green; - pPal->palPalEntry[i].peBlue = blue; - pPal->palPalEntry[i].peFlags = (BYTE)0; - - if (!(red += 32)) - if (!(green += 32)) - blue += 64; - } - hpal = CreatePalette(pPal); - LocalFree((HANDLE)pPal); - } - return hpal; -} - -/**************************************************************************** - * * - * FUNCTION : CreateDibPalette(HANDLE hbi) * - * * - * PURPOSE : Given a Global HANDLE to a BITMAPINFO Struct * - * will create a GDI palette object from the color table. * - * (BITMAPINFOHEADER format DIBs only) * - * * - * RETURNS : A handle to the palette. * - * * - ****************************************************************************/ -HPALETTE CreateDibPalette (HANDLE hbi) -{ - HPALETTE hpal; - - if (!hbi) - return NULL; - hpal = CreateBIPalette((LPBITMAPINFOHEADER)GlobalLock(hbi)); - GlobalUnlock(hbi); - return hpal; -} - -/**************************************************************************** - * * - * FUNCTION : ReadDibBitmapInfo(int fh) * - * * - * PURPOSE : Will read a file in DIB format and return a global HANDLE * - * to it's BITMAPINFO. This function will work with both * - * "old" (BITMAPCOREHEADER) and "new" (BITMAPINFOHEADER) * - * bitmap formats, but will always return a "new" BITMAPINFO * - * * - * RETURNS : A handle to the BITMAPINFO of the DIB in the file. * - * * - ****************************************************************************/ -HANDLE ReadDibBitmapInfo (INT fh) -{ - DWORD off; - HANDLE hbi = NULL; - INT size; - INT i; - WORD nNumColors; - - RGBQUAD FAR *pRgb; - BITMAPINFOHEADER bi; - BITMAPCOREHEADER bc; - LPBITMAPINFOHEADER lpbi; - BITMAPFILEHEADER bf; - DWORD dwWidth = 0; - DWORD dwHeight = 0; - WORD wPlanes, wBitCount; - - if (fh == -1) - return NULL; -#ifdef FIXDWORDALIGNMENT - /* Reset file pointer and read file header */ - off = _llseek(fh, 0L, (UINT)SEEK_CUR); - if ((SIZEOF_BITMAPFILEHEADER_PACKED) != _lread(fh, (LPSTR)&bf, (UINT)sizeof (SIZEOF_BITMAPFILEHEADER_PACKED))) - return FALSE; -#else - ReadBitMapFileHeaderandConvertToDwordAlign(fh, &bf, &off); - /* at this point we have read the file into bf*/ -#endif - - /* Do we have a RC HEADER? */ - if (!ISDIB (bf.bfType)) - { - bf.bfOffBits = 0L; - SetFilePointer((HANDLE)fh, off, NULL, FILE_BEGIN); /*seek back to beginning of file*/ - } - if (!ReadFile((HANDLE)fh, (LPSTR)&bi, (UINT)sizeof(bi), &dwWidth, NULL) || - sizeof (bi) != dwWidth) - return FALSE; - - nNumColors = DibNumColors (&bi); - - /* Check the nature (BITMAPINFO or BITMAPCORE) of the info. block - * and extract the field information accordingly. If a BITMAPCOREHEADER, - * transfer it's field information to a BITMAPINFOHEADER-style block - */ - switch (size = (INT)bi.biSize) - { - case sizeof (BITMAPINFOHEADER): - break; - - case sizeof (BITMAPCOREHEADER): - bc = *(BITMAPCOREHEADER*)&bi; - - dwWidth = (DWORD)bc.bcWidth; - dwHeight = (DWORD)bc.bcHeight; - wPlanes = bc.bcPlanes; - wBitCount = bc.bcBitCount; - - bi.biSize = sizeof(BITMAPINFOHEADER); - bi.biWidth = dwWidth; - bi.biHeight = dwHeight; - bi.biPlanes = wPlanes; - bi.biBitCount = wBitCount; - - bi.biCompression = BI_RGB; - bi.biSizeImage = 0; - bi.biXPelsPerMeter = 0; - bi.biYPelsPerMeter = 0; - bi.biClrUsed = nNumColors; - bi.biClrImportant = nNumColors; - - _llseek(fh, (LONG)sizeof (BITMAPCOREHEADER) - sizeof (BITMAPINFOHEADER), (UINT)SEEK_CUR); - break; - - default: - /* Not a DIB! */ - return NULL; - } - - /* Fill in some default values if they are zero */ - if (bi.biSizeImage == 0) - { - bi.biSizeImage = WIDTHBYTES ((DWORD)bi.biWidth * bi.biBitCount) - * bi.biHeight; - } - if (bi.biClrUsed == 0) - bi.biClrUsed = DibNumColors(&bi); - - /* Allocate for the BITMAPINFO structure and the color table. */ - hbi = GlobalAlloc (GHND, (LONG)bi.biSize + nNumColors * sizeof(RGBQUAD)); - if (!hbi) - return NULL; - lpbi = (LPBITMAPINFOHEADER)GlobalLock (hbi); - *lpbi = bi; - - /* Get a pointer to the color table */ - pRgb = (RGBQUAD FAR *)((LPSTR)lpbi + bi.biSize); - if (nNumColors) - { - DWORD bytesRead; - - if (size == sizeof(BITMAPCOREHEADER)) - { - /* Convert a old color table (3 byte RGBTRIPLEs) to a new - * color table (4 byte RGBQUADs) - */ - ReadFile((HANDLE)fh, (LPSTR)pRgb, (UINT)nNumColors * sizeof(RGBTRIPLE), &bytesRead, NULL); - - for (i = nNumColors - 1; i >= 0; i--) - { - RGBQUAD rgb; - - rgb.rgbRed = ((RGBTRIPLE FAR *)pRgb)[i].rgbtRed; - rgb.rgbBlue = ((RGBTRIPLE FAR *)pRgb)[i].rgbtBlue; - rgb.rgbGreen = ((RGBTRIPLE FAR *)pRgb)[i].rgbtGreen; - rgb.rgbReserved = (BYTE)0; - - pRgb[i] = rgb; - } - } - else - ReadFile((HANDLE)fh, (LPSTR)pRgb, (UINT)nNumColors * sizeof(RGBQUAD), &bytesRead, NULL); - } - - if (bf.bfOffBits != 0L) - { - SetFilePointer((HANDLE)fh, off + bf.bfOffBits, NULL, FILE_BEGIN); - } - GlobalUnlock(hbi); - return hbi; -} - -/**************************************************************************** - * * - * FUNCTION : PaletteSize(VOID FAR * pv) * - * * - * PURPOSE : Calculates the palette size in bytes. If the info. block * - * is of the BITMAPCOREHEADER type, the number of colors is * - * multiplied by 3 to give the palette size, otherwise the * - * number of colors is multiplied by 4. * - * * - * RETURNS : Palette size in number of bytes. * - * * - ****************************************************************************/ -WORD PaletteSize (VOID FAR * pv) -{ - LPBITMAPINFOHEADER lpbi; - WORD NumColors; - - lpbi = (LPBITMAPINFOHEADER)pv; - NumColors = DibNumColors(lpbi); - - if (lpbi->biSize == sizeof(BITMAPCOREHEADER)) - return (WORD)(NumColors * sizeof(RGBTRIPLE)); - else - return (WORD)(NumColors * sizeof(RGBQUAD)); -} - -/**************************************************************************** - * * - * FUNCTION : DibNumColors(VOID FAR * pv) * - * * - * PURPOSE : Determines the number of colors in the DIB by looking at * - * the BitCount filed in the info block. * - * * - * RETURNS : The number of colors in the DIB. * - * * - ****************************************************************************/ -WORD DibNumColors (VOID FAR * pv) -{ - INT bits; - LPBITMAPINFOHEADER lpbi; - LPBITMAPCOREHEADER lpbc; - - lpbi = ((LPBITMAPINFOHEADER)pv); - lpbc = ((LPBITMAPCOREHEADER)pv); - - /* With the BITMAPINFO format headers, the size of the palette - * is in biClrUsed, whereas in the BITMAPCORE - style headers, it - * is dependent on the bits per pixel ( = 2 raised to the power of - * bits/pixel). - */ - if (lpbi->biSize != sizeof(BITMAPCOREHEADER)) - { - if (lpbi->biClrUsed != 0) - return (WORD)lpbi->biClrUsed; - bits = lpbi->biBitCount; - } - else - bits = lpbc->bcBitCount; - - switch (bits) - { - case 1: - return 2; - case 4: - return 16; - case 8: - return 256; - default: - /* A 24 bitcount DIB has no color table */ - return 0; - } -} - -/**************************************************************************** - * * - * FUNCTION : BitmapFromDib(HANDLE hdib, HPALETTE hpal) * - * * - * PURPOSE : Will create a DDB (Device Dependent Bitmap) given a global * - * handle to a memory block in CF_DIB format * - * * - * RETURNS : A handle to the DDB. * - * * - ****************************************************************************/ - -HBITMAP BitmapFromDib ( - HANDLE hdib, - HPALETTE hpal) -{ - LPBITMAPINFOHEADER lpbi; - HPALETTE hpalT; - HDC hdc; - HBITMAP hbm; - - StartWait(); - - if (!hdib) - return NULL; - - lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib); - - if (!lpbi) - return NULL; - - hdc = GetDC(NULL); - - if (hpal) - { - hpalT = SelectPalette(hdc,hpal,FALSE); - RealizePalette(hdc); // GDI Bug...???? - } - - hbm = CreateDIBitmap(hdc, - (LPBITMAPINFOHEADER)lpbi, - (LONG)CBM_INIT, - (LPBYTE)lpbi + lpbi->biSize + PaletteSize(lpbi), //cast changed for C++ - (LPBITMAPINFO)lpbi, - DIB_RGB_COLORS ); - - if (hpal) - SelectPalette(hdc,hpalT,FALSE); - - ReleaseDC(NULL,hdc); - GlobalUnlock(hdib); - - EndWait(); - - return hbm; -} - -/**************************************************************************** - * * - * FUNCTION : ReadBitMapFileHeaderandConvertToDwordAlign(HFILE fh, LPBITMAPFILEHEADER pbf) - * * - * PURPOSE : read file header (which is packed) and convert into unpacked BITMAPFILEHEADER strucutre - * * - * RETURNS : VOID - * * - ****************************************************************************/ - -VOID ReadBitMapFileHeaderandConvertToDwordAlign(HFILE fh, LPBITMAPFILEHEADER pbf, LPDWORD lpdwoff) -{ - DWORD off; - - off = SetFilePointer((HANDLE)fh, 0L, NULL, FILE_CURRENT); - *lpdwoff = off; - -/* BITMAPFILEHEADER STRUCUTURE is as follows - * BITMAPFILEHEADER - * WORD bfType - > .... < add WORD if packed here! - * DWORD bfSize - * WORD bfReserved1 - * WORD bfReserved2 - * DWORD bfOffBits - * This is the packed format, unpacked adds a WORD after bfType - */ - - /* read in bfType*/ - ReadFile((HANDLE)fh, (LPSTR) &pbf->bfType, sizeof(WORD), &off, NULL); - /* read in last 3 dwords*/ - ReadFile((HANDLE)fh, (LPSTR) &pbf->bfSize, sizeof(DWORD) * 3, &off, NULL); -} diff --git a/sdk/samples/iklowns/cgdlist.cpp b/sdk/samples/iklowns/cgdlist.cpp deleted file mode 100644 index cb8a69c..0000000 --- a/sdk/samples/iklowns/cgdlist.cpp +++ /dev/null @@ -1,346 +0,0 @@ -/*===========================================================================*\ -| -| File: cgdlist.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgrsrce.h" -#include "cgexcpt.h" -#include "strrec.h" -#include "cgdebug.h" -#include "cgchar.h" -#include "cgimage.h" -#include "cgload.h" -#include "cgdlist.h" - -#define CGG_CHARACTER 0 -#define CGG_TILEDIMAGE 1 -#define CGG_SKYIMAGE 2 -char* graphicTypes[] = -{ - "Character", // type 0 - "TiledImage", // type 1 - "Sky", // type 2 - NULL -}; - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDisplayList -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -extern void dbgprintf(char *, ...); -extern CLoadingScreen *gLoadingScreen; - -CGameDisplayList::CGameDisplayList( - char* pFileName, - char* pLevelName, - CGameLevel* pLevel - ) : mpHead( NULL ) -{ - char nameBuf[256]; - char dataBuf[256]; - - // load the graphic objects - GetPrivateProfileString( - pLevelName, - NULL, - "", // no default - nameBuf, - sizeof( nameBuf ), - pFileName - ); - - - for (char *pChar = nameBuf; *pChar; pChar++) - { - CGameGraphic* pGraphic; - - if (gLoadingScreen != NULL) - gLoadingScreen->Update(); - - GetPrivateProfileString( - pLevelName, - pChar, - "", - dataBuf, - sizeof( dataBuf ), - pFileName - ); - - // parse the data string into fields - CStringRecord fields( dataBuf, "," ); - - for (int i=0; graphicTypes[i]; i++) - { - if (lstrcmpi(fields[0], graphicTypes[i]) == 0) - { - break; // we found it - } - } - - switch (i) - { - case CGG_CHARACTER: - - if (atoi(fields[6]) == 1) - { - char *pRemoteName=NULL; - if (fields.GetNumFields() > 7) - pRemoteName = fields[7]; - - pGraphic = new CGameCharacter( - pFileName, - pChar, - pLevelName, - pLevel, - atoi(fields[1]), - atoi(fields[2]), - atoi(fields[3]), - atoi(fields[4]), - NULL, - pRemoteName); - if (lstrcmpi(pChar, "Klown") == 0) - { - pLevel->mMainKlown = (CGameCharacter *) pGraphic; - } - - } - else { - pChar += lstrlen( pChar ); // move beyond terminator - continue; - } - - break; - - case CGG_TILEDIMAGE: - { - pGraphic = new CGameTiledImage(pChar, atoi(fields[1]), atoi(fields[2]), atoi(fields[3])); - break; - } - - - case CGG_SKYIMAGE: - pGraphic = new CGameSkyImage(pChar); - break; - - default: - pGraphic = NULL; - break; - } - - if (pGraphic) - { - Insert( pGraphic ); - } - - pChar += lstrlen( pChar ); // move beyond terminator - -#if 1 - // NOTE: if we don't grab messages, we see a white flash while we're - // loading (!?!?). We can't allow switching away until we've - // finished loading, however, because we'll lose the surfaces - // we've already created, so we just drop the messages on the floor. - MSG msg; - if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE | PM_NOYIELD ) ) { - } -#endif - } -} - -CGameDisplayList::~CGameDisplayList() -{ - CGameGraphic* pNext = NULL; - - for (CGameGraphic* pGraphic = mpHead; - pGraphic; - pGraphic = pNext - ) - { - pNext = pGraphic->GetNext(); - delete pGraphic; - pGraphic = NULL; - } -} - -void -CGameDisplayList::Update(CGameLevel* pLevel, CGameUpdateList* pUpdate) -{ - if (mpHead) - { - mpHead->Update(pLevel, pUpdate); - // see if we've collided... - int testZ; - CGameCharacter *pCur, *pNext; - pCur = (CGameCharacter *) mpHead; - pNext = (CGameCharacter *) mpHead->GetNext(); - - while (pCur && pNext) - { - RECT temprect; - LPRECT pMyRect = pCur->GetRect(); - testZ = pCur->GetCurrentZ(); - - // look at all chars in the Z order for conflicts... - - while (pNext && (testZ == pNext->GetCurrentZ())) - { - if (IntersectRect(&temprect, pMyRect, pNext->GetRect())) - { - int removeme = pCur->Collided(pNext); - int removeother = pNext->Collided(pCur); - } - - pNext = (CGameCharacter *) pNext->GetNext(); - } - - pCur = (CGameCharacter *) pCur->GetNext(); - pNext = (CGameCharacter *) pCur->GetNext(); - } - } -} - -void -CGameDisplayList::Render(CGameLevel* pLevel, CGameScreen* pScreen, CGameUpdateList* pUpdate) -{ - if (mpHead) - mpHead->Render(pLevel, pScreen, pUpdate); -} - -void -CGameDisplayList::Insert( CGameGraphic* pGraphic ) -{ - if (mpHead) - { - CGameGraphic* pNode = mpHead; - int lookZ = pGraphic->GetMinZ(); - - if (lookZ < pNode->GetMinZ()) - { - pGraphic->SetNext(pNode); - mpHead = pGraphic; - } - else - { - while (pNode->GetNext() && (pNode->GetNext()->GetMinZ() < lookZ)) - { - pNode = pNode->GetNext(); - } - - pNode->Add( pGraphic ); // put this graphic after (or in) this node - } - } - else - { - mpHead = pGraphic; - } -} - -void -CGameDisplayList::Remove( CGameGraphic* pGraphic ) -{ - - CGameGraphic* pNode = mpHead; - CGameGraphic* pNextNode; - - while (pNode) - { - pNextNode = pNode->GetNext(); - if (pNode == pGraphic) - { - // must be head of list; - mpHead = pNextNode; - break; - } - else - { - if (pNextNode == pGraphic) - { - // normal case; - pNode->SetNext( pNextNode->GetNext()); - break; - } - } - pNode = pNextNode; - } - delete pGraphic; -} - -void CGameDisplayList::ReSort() -{ - // traverse the list; resort based on Z order. - // Naively assume only one mismatch for now. - CGameGraphic* pNode = mpHead; - CGameGraphic* pLastNode = mpHead; - CGameGraphic* pNextNode; - - // find bad node (if any!) - while (pNode) - { - pNextNode = pNode->GetNext(); - if (pNextNode) - { - if (pNode->GetCurrentZ() > pNextNode->GetCurrentZ()) - { - // found a "bad" one!. Remove from list - if (pLastNode == pNode) // head of list - { - mpHead = pNextNode; - } - else - { - pLastNode->SetNext(pNextNode); - } - // this node *must* go somewhere *after* pNextNode, so start searching from there - pLastNode = pNextNode; - while (pNextNode) - { - if (pNode->GetCurrentZ() <= pNextNode->GetCurrentZ()) - { - // insert here... - pLastNode->SetNext(pNode); - pNode->SetNext(pNextNode); - return; - } - pLastNode = pNextNode; - pNextNode = pNextNode->GetNext(); - } - - // if here, pNextNode must be NULL.... - pLastNode->SetNext(pNode); - pNode->SetNext(NULL); - return; - } - } - pLastNode = pNode; - pNode = pNextNode; - } -} diff --git a/sdk/samples/iklowns/cgdlist.h b/sdk/samples/iklowns/cgdlist.h deleted file mode 100644 index 9c0111a..0000000 --- a/sdk/samples/iklowns/cgdlist.h +++ /dev/null @@ -1,61 +0,0 @@ -/*===========================================================================*\ -| -| File: cgdlist.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGDLIST_H -#define CGDLIST_H - -#include "cgupdate.h" - -class CGameLevel; -class CGameGraphic; -class CGameScreen; - -class CGameDisplayList -{ -public: - CGameDisplayList(char* pFileName, char* pLevelName, CGameLevel* pLevel); - virtual ~CGameDisplayList(); - - virtual void Update(CGameLevel* pLevel, CGameUpdateList* pUpdate); - virtual void Render(CGameLevel* pLevel, CGameScreen* pScreen, CGameUpdateList* pUpdate); - - virtual void Insert( CGameGraphic* pGraphic ); - virtual void Remove( CGameGraphic* pGraphic ); - virtual void ReSort(); - - virtual CGameGraphic * First() - { - return mpHead; - } - -protected: - CGameGraphic* mpHead; // ptr to head of our linked list -}; - -#endif // CGDLIST_H diff --git a/sdk/samples/iklowns/cgexcpt.cpp b/sdk/samples/iklowns/cgexcpt.cpp deleted file mode 100644 index 6125fa5..0000000 --- a/sdk/samples/iklowns/cgexcpt.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*===========================================================================*\ -| -| File: cgexcpt.cpp -| -| Description: -| Exception handling code for sample games -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#include "cgres.h" -#include "cgexcpt.h" - -/*---------------------------------------------------------------------------*\ -| -| Class CGameException -| -| DESCRIPTION: -| Container class for most exceptions. -| -| -\*---------------------------------------------------------------------------*/ - -CGameException::CGameException( - int resID // resource ID of information string; 0 == no message - ) : mResID( resID ) -{ - // !!! does nothing for now -} - -CGameException::~CGameException() -{ - -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameStartupError -| -| DESCRIPTION: -| Handles exceptions which prevent app from running -| -| -\*---------------------------------------------------------------------------*/ - -CGameStartupError::CGameStartupError( - int resID // resource ID of information string; 0 == no message - ) : CGameException(resID) -{ - // !!! does nothing for now -} - -CGameStartupError::~CGameStartupError() -{ - -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameResourceError -| -| DESCRIPTION: -| Handles general out-of-resource exceptions -| -| -\*---------------------------------------------------------------------------*/ - -CGameResourceError::CGameResourceError( - // may want to add a resource type parameter - ) : CGameException(0) -{ - // !!! may want to dump a memory ballast or some such -} - -CGameResourceError::~CGameResourceError() -{ - -} - diff --git a/sdk/samples/iklowns/cgglobl.cpp b/sdk/samples/iklowns/cgglobl.cpp deleted file mode 100644 index 330cb3c..0000000 --- a/sdk/samples/iklowns/cgglobl.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/*===========================================================================*\ -| -| File: cgglobl.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include "cgglobl.h" - -HINSTANCE ghInst = NULL; -HWND ghMainWnd = NULL; -BOOL gDoubleBuffer = 1; -BOOL gUse_DDraw = 1; -int gSoundMode=1; -BOOL gMusicOn=1; -BOOL gActive=0; -MACHINE_CAPS gMachineCaps; - -char gDataPath[MAX_PATH]; diff --git a/sdk/samples/iklowns/cgglobl.h b/sdk/samples/iklowns/cgglobl.h deleted file mode 100644 index e8a61e8..0000000 --- a/sdk/samples/iklowns/cgglobl.h +++ /dev/null @@ -1,89 +0,0 @@ -/*===========================================================================*\ -| -| File: cgglobl.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGGLOBL_H -#define CGGLOBL_H - -#include - -// NOTE: these scalar values are used in iklowns.gam & cglevel.cpp -typedef enum -{ - MCP_UNKNOWN = 0, - MCP_386 = 1, - MCP_486 = 2, - MCP_PENTIUM = 3 -} MC_PROCESSOR; - -typedef enum -{ - MCB_UNKNOWN = 0, - MCB_ISA = 1, - MCB_EISA = 2, - MCB_PCI = 3 -} MC_BUSTYPE; - -typedef enum -{ - MCV_UNKNOWN = 0, - MCV_DDRAW = 1 -} MC_VIDSYS; - -typedef struct _MACHINE_CAPS -{ - MC_PROCESSOR processor; - MC_BUSTYPE bus; - DWORD sysMemory; - DWORD vidMemory; - MC_VIDSYS vidSystem; -} MACHINE_CAPS; - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern HINSTANCE ghInst; -extern HWND ghMainWnd; -extern BOOL gUse_DDraw; -extern BOOL gDoubleBuffer; - -extern int gSoundMode; -extern BOOL gMusicOn; -extern BOOL gActive; - -extern char gDataPath[]; - -extern MACHINE_CAPS gMachineCaps; - -#ifdef __cplusplus -} -#endif - -#endif // CGGLOBL_H diff --git a/sdk/samples/iklowns/cggraph.cpp b/sdk/samples/iklowns/cggraph.cpp deleted file mode 100644 index ff26b5b..0000000 --- a/sdk/samples/iklowns/cggraph.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/*===========================================================================*\ -| -| File: cggraph.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include "cggraph.h" - -/*---------------------------------------------------------------------------*\ -| -| CGameGraphic() -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -CGameGraphic::CGameGraphic( - int curz - ) : mIsValid(FALSE), - mXParallax(1), - mYParallax(1), - mpNext( NULL ) -{ - mRect.top = mRect.bottom = mRect.left = mRect.right = 0; - - // set parallax factor as zposition / 16 - mXParallax = curz >> 4; - mYParallax = curz >> 4; -} - -CGameGraphic::~CGameGraphic() -{ -} diff --git a/sdk/samples/iklowns/cggraph.h b/sdk/samples/iklowns/cggraph.h deleted file mode 100644 index 925151d..0000000 --- a/sdk/samples/iklowns/cggraph.h +++ /dev/null @@ -1,120 +0,0 @@ -/*===========================================================================*\ -| -| File: cggraph.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGGRAPH_H -#define CGGRAPH_H - -#include -#include "cglevel.h" -#include "cgscreen.h" -#include "cgupdate.h" - -class CGameGraphic -{ -public: - CGameGraphic( - int curz = 0 - ); - - virtual ~CGameGraphic(); - - virtual void Update(CGameLevel* pLevel, CGameUpdateList* pUpdate) = 0; - virtual void Render(CGameLevel* pLevel, CGameScreen* pScreen, CGameUpdateList* pUpdate) = 0; - virtual void MoveTo( int worldX, int worldY ) {}; - - virtual HPALETTE GetHPalette() = 0; - - // return this graphic's current z position - virtual int GetCurrentZ() - { - return mCurZ; - } - - virtual int GetMinZ() - { - return mCurZ; // generic graphics cannot have range - } - - virtual int GetMaxZ() - { - return mCurZ; // generic graphics cannot have range - } - - virtual int GetWidth() - { - return mWidth; - } - - virtual int GetHeight() - { - return mHeight; - } - - virtual CGameGraphic* GetNext() - { - return mpNext; - } - - virtual void SetNext( CGameGraphic * next) - { - mpNext = next; - } - - // insert given graphic into the list after us - virtual void Add( CGameGraphic* pGraphic ) - { - // simple insertion into the list - pGraphic->mpNext = mpNext; - mpNext = pGraphic; - } - - virtual RECT * GetRect() { return &mRect; }; - virtual void SetRect(RECT *rect) { - mRect.top = rect->top; - mRect.left = rect->left; - mRect.bottom = rect->bottom; - mRect.right = rect->right; - }; - -protected: - RECT mRect; - BOOL mIsValid; // flag whether this graphic object is valid - int mXpos; - int mYpos; - int mWidth; // width in pixels - int mHeight; // height in pixels - - int mCurZ; // our current Z position - int mXParallax; - int mYParallax; - - CGameGraphic* mpNext; // we're in a linked list of CGameGraphic -}; - -#endif // CGGRAPH diff --git a/sdk/samples/iklowns/cgimage.cpp b/sdk/samples/iklowns/cgimage.cpp deleted file mode 100644 index aef8f50..0000000 --- a/sdk/samples/iklowns/cgimage.cpp +++ /dev/null @@ -1,360 +0,0 @@ -/*===========================================================================*\ -| -| File: cgimage.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgrsrce.h" -#include "cgexcpt.h" -#include "cgdebug.h" -#include "cgglobl.h" -#include "cgscreen.h" -#include "cglevel.h" -#include "cgupdate.h" -#include "cgimage.h" - -#define LIMIT(x, low, high) (max(low, min(x, high))) - -/*---------------------------------------------------------------------------*\ -| -| Class CGameSkyImage -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -// in our palette, entry 13 is a good sky blue -#define SKY_COLOR ( 13 ) -// force to background -#define SKY_Z ( 32760 ) - -CGameSkyImage::CGameSkyImage( - char* pFileName - ) : CGameImage( pFileName, SKY_Z ) -{ - mCurZ = SKY_Z; -} - -CGameSkyImage::~CGameSkyImage() -{ -} - -void -CGameSkyImage::Update( - CGameLevel* pLevel, - CGameUpdateList* pUpdate - ) -{ -} - -void -CGameSkyImage::Render( - CGameLevel* pLevel, - CGameScreen* pScreen, - CGameUpdateList* pUpdate - ) -{ - pScreen->ColorFill( - pUpdate->GetDirtyRect(), - SKY_COLOR - ); -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameTiledImage -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -static char tleExt[] = ".tle"; - -CGameTiledImage::CGameTiledImage( - char* pFileBase, // file base name - int curz, - int curx, - int cury - ) : CGameImage( pFileBase, curz ), - mpDIBBuffer( NULL ), - mTileArray( NULL ) -{ - HANDLE hFile; - - if (!pFileBase) - return; - - char* pFileName = new char[lstrlen(pFileBase) + lstrlen(tleExt) + 1]; - - lstrcpy( pFileName, pFileBase ); - lstrcat( pFileName, tleExt ); - - // open the .tle file - hFile = CreateFile( - pFileName, - GENERIC_READ, - 0, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL - ); - - delete[] pFileName; - - if (hFile == INVALID_HANDLE_VALUE) - { - DB_LOG(DB_PROBLEM, "DEBUG: CreateFile failed in CGameTiledImage"); - throw CGameException( - IDS_INVALID_FILE - ); - } - - TileMapStamp stamp; - - DWORD bytesRead; - - // file begins with our stamp - ReadFile( - hFile, - &stamp, - sizeof( stamp ), - &bytesRead, - NULL - ); - - // verify file is valid tile map - if ((stamp.signature != TILE_MAP_SIGNATURE) || - (stamp.version != TILE_MAP_VERSION) || - (stamp.tileSize != TILE_SIZE) - ) - { - DB_LOG(DB_PROBLEM, "DEBUG: invalid file stamp in CGameTiledImage"); - throw CGameException( - IDS_INVALID_FILE - ); - } - - // allocate for dib filename (length includes terminator) - pFileName = new char[stamp.nameLength]; - - // followed by the tile DIB filename - ReadFile( - hFile, - pFileName, - stamp.nameLength, - &bytesRead, - NULL - ); - - // allocate our tile array - mNumCols = stamp.columns; - mTileArray = new WORD*[mNumCols]; - mWidth = mNumCols * stamp.tileSize; - mHeight = stamp.rows * stamp.tileSize; - - mXpos = curx; - mYpos = cury; - - // read in the tile map - for (int col = 0; col < mNumCols; col++) - { - mTileArray[col] = new WORD[stamp.rows]; - for (int row = 0; row < stamp.rows; row++) - { - ReadFile( - hFile, - &mTileArray[col][row], - sizeof(WORD), - &bytesRead, - NULL - ); - } - } - - CloseHandle( hFile ); - - // now create a bit buffer for our DIB - CGameDIB theDib( pFileName ); - - delete[] pFileName; - - if (gUse_DDraw) - { - mpDIBBuffer = new CGameDDrawBitBuffer( &theDib ); - if (!mpDIBBuffer->IsValid()) - { - // we didn't get video memory, so delete that buffer - delete mpDIBBuffer; - // & create a system memory one - mpDIBBuffer = new CGameDSBitBuffer( &theDib ); - } - } - else - { - mpDIBBuffer = new CGameDSBitBuffer( - &theDib, - theDib.GetWidth(), - theDib.GetHeight(), - theDib.GetPixelColor(0,0) - ); - } - - mCurZ = curz; -} - -CGameTiledImage::~CGameTiledImage() -{ - if (mTileArray) - { - for (; mNumCols>0; mNumCols--) - { - delete[] mTileArray[mNumCols-1]; - } - delete[] mTileArray; - } - - delete mpDIBBuffer; -} - -void -CGameTiledImage::Update( - CGameLevel* pLevel, - CGameUpdateList* pUpdate - ) -{ - if (mpNext) - mpNext->Update(pLevel, pUpdate); -} - -void -CGameTiledImage::Render( - CGameLevel* pLevel, - CGameScreen* pScreen, - CGameUpdateList* pUpdate - ) -{ - if (mpNext) - { - // recurse down the list to get background filled in - mpNext->Render(pLevel, pScreen, pUpdate); - } - - LPRECT pDirty = pUpdate->GetDirtyRect(); - - int width = pDirty->right - pDirty->left + 1; - int height = pDirty->bottom - pDirty->top + 1; - - RECT worldUpdate; - - worldUpdate.left = pLevel->Screen2WorldX( pDirty->left, mXParallax ); - worldUpdate.top = pLevel->Screen2WorldY( pDirty->top, mYParallax ); - worldUpdate.right = worldUpdate.left + width - 1; - worldUpdate.bottom = worldUpdate.top + height - 1; - - RECT image; - - image.left = mXpos; - image.top = mYpos; - image.right = mXpos + mWidth - 1; - image.bottom = mYpos + mHeight - 1; - - RECT realImage; - - if (IntersectRect( &realImage, &image, &worldUpdate )) - { - int offsetX = realImage.left>mXpos?(realImage.left-mXpos) % TILE_SIZE :0; - int tileWidth = TILE_SIZE - offsetX; - - for ( - int worldPixelX = realImage.left; - worldPixelX <= realImage.right; - worldPixelX += tileWidth, tileWidth = TILE_SIZE - ) - { - int colIndex = (worldPixelX - mXpos) / TILE_SIZE; - int screenX = pLevel->World2ScreenX( worldPixelX, mXParallax ); - - int offsetY = realImage.top>mYpos? (realImage.top-mYpos) % TILE_SIZE:0; - int tileHeight = TILE_SIZE - offsetY; - - for ( - int worldPixelY = realImage.top; - worldPixelY <= realImage.bottom; - worldPixelY += tileHeight, tileHeight = TILE_SIZE - ) - { - int rowIndex = (worldPixelY - mYpos) / TILE_SIZE; - int screenY = pLevel->World2ScreenY( worldPixelY, mYParallax ); - - WORD tileNum = mTileArray[colIndex][rowIndex]; - - if (!IS_TRANSPARENT(tileNum)) - { -// int srcX = (TILE_INDEX(tileNum) * TILE_SIZE) + offsetX; - int srcX = TILE_SRC_X(tileNum) + offsetX; -// int srcY = offsetY; - int srcY = TILE_SRC_Y(tileNum) + offsetY; - - if (HAS_TRANSPARENCY(tileNum)) - { - pScreen->TransRender( - screenX, - screenY, - min(tileWidth, realImage.right - worldPixelX + 1), - min(tileHeight, realImage.bottom - worldPixelY + 1), - mpDIBBuffer, - srcX, - srcY - ); - } - else - { - pScreen->Render( - screenX, - screenY, - min(tileWidth, realImage.right - worldPixelX + 1), - min(tileHeight, realImage.bottom - worldPixelY + 1), - mpDIBBuffer, - srcX, - srcY, - SRCCOPY - ); - } - } - - offsetY = 0; - } - - offsetX = 0; - } - } -} diff --git a/sdk/samples/iklowns/cgimage.h b/sdk/samples/iklowns/cgimage.h deleted file mode 100644 index 1d885c1..0000000 --- a/sdk/samples/iklowns/cgimage.h +++ /dev/null @@ -1,151 +0,0 @@ -/*===========================================================================*\ -| -| File: cgimage.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGIMAGE_H -#define CGIMAGE_H - -#include "cggraph.h" - -#define TRANSPARENT_TILE ((WORD)-1) -#define MARK_TRANSPARENT(tile) ((WORD) tile | 0x8000) - -// we use palette index 1 for transparency -#define TRANSPARENCY_INDEX ((BYTE)1) - -#define HAS_TRANSPARENCY( num ) ((WORD) num & 0x8000) -#define IS_TRANSPARENT( num ) (num == TRANSPARENT_TILE) - -#define TILE_INDEX( num ) ((WORD)IS_TRANSPARENT(num)?0:num & ~0x8000) - -// maximum width we can allow for our tile source bitmaps -#define MAX_TILE_SRC_WIDTH 640 -#define MAX_TILE_COLUMNS 20 - -// convert a tile number into x or y from source bitmap -#define TILE_SRC_X( num ) ((WORD) (TILE_INDEX(num) % MAX_TILE_COLUMNS) * TILE_SIZE) -#define TILE_SRC_Y( num ) ((WORD) (TILE_INDEX(num) / MAX_TILE_COLUMNS) * TILE_SIZE) - -//#define TILE_MAP_SIGNATURE 'TLMP' -#define TILE_MAP_SIGNATURE 0x544c4d50 -#define TILE_MAP_VERSION 0x0012 - -#define TILE_SIZE 32 - -#define TILE_TO_TX(tile) (tile * TILE_SIZE) -#define TILE_TO_TY(tile) (0) - -#define WX_TO_INDEX(wx) (wx % TILE_SIZE) -#define WY_TO_INDEX(wy) (wy / TILE_SIZE) - -struct TileMapStamp -{ - DWORD signature; - DWORD version; - WORD columns; - WORD rows; - WORD tileSize; - WORD nameLength; // length of following filename including terminator - - // this is followed by the DIB name, then the WORD array[col][row] of tile numbers -}; - -#define CG_DEFAULT_TILE_SIZE 16 - -// maximum number of tiles in an image -#define CG_TILE_LIMIT ((WORD)0xffff) - -typedef WORD CG_TILE_INDEX; - -class CGameImage : public CGameGraphic -{ -public: - CGameImage(char* pFileName, int curz) : CGameGraphic(curz){}; // load existing image file - virtual ~CGameImage(){}; - - virtual HPALETTE GetHPalette() = 0; -protected: -}; - -class CGameSkyImage : public CGameImage -{ -public: - CGameSkyImage(char* pFileName); // load existing image file - virtual ~CGameSkyImage(); - - virtual HPALETTE GetHPalette() - { - return NULL; - } - - virtual void Update(CGameLevel* pLevel, CGameUpdateList* pUpdate); - virtual void Render(CGameLevel* pLevel, CGameScreen* pScreen, CGameUpdateList* pUpdate); - -protected: -}; - -#define SCREEN_WIDTH 640 -#define SCREEN_HEIGHT 480 -#define SCREEN_COLS (SCREEN_WIDTH / TILE_SIZE) -#define SCREEN_ROWS (SCREEN_HEIGHT / TILE_SIZE) - -#define BUFFER_COLS (SCREEN_COLS+2) -#define BUFFER_ROWS (SCREEN_ROWS+2) - -#define BUFFER_WIDTH (BUFFER_COLS * TILE_SIZE) -#define BUFFER_HEIGHT (BUFFER_ROWS * TILE_SIZE) - -#define EXTRA_WIDTH (TILE_SIZE * 2) -#define EXTRA_HEIGHT (TILE_SIZE * 2) - -// the "read-only" tiled image (for use in games) -class CGameTiledImage : public CGameImage -{ -public: - CGameTiledImage(char* pFileName, int curz, - int curx=0, int cury=0 ); // load existing image file - - virtual ~CGameTiledImage(); - - virtual void Update(CGameLevel* pLevel, CGameUpdateList* pUpdate); - virtual void Render(CGameLevel* pLevel, CGameScreen* pScreen, CGameUpdateList* pUpdate); - - virtual HPALETTE GetHPalette() - { - return mpDIBBuffer ? mpDIBBuffer->GetHPalette() : NULL; - } - -protected: - int mNumCols; - - CG_TILE_INDEX** mTileArray; // array[row][column] of tile #s describing image - - CGameBitBuffer* mpDIBBuffer; // holds the image's DIB tiles -}; - -#endif // CGIMAGE_H diff --git a/sdk/samples/iklowns/cginput.cpp b/sdk/samples/iklowns/cginput.cpp deleted file mode 100644 index b83f5fc..0000000 --- a/sdk/samples/iklowns/cginput.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/*===========================================================================*\ -| -| File: cginput.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include -#ifdef __WATCOMC__ -#include -#else -#include -#endif - -#include "cginput.h" - -CGameInput::CGameInput (void) -{ - JOYINFO joypos; - memset(&caps, 0, sizeof(JOYCAPS) * 16); - memset(&joyThere, 0, sizeof(int) * 16); - - for (int x=0; x= 16) || (joynum <= 0) || !joyThere[joynum-1]) - return(0); - - memcpy(joypos, &(cached_joyinfo[joynum-1]), sizeof(JOYINFO)); - - // normalize the joypos to -100,0,100 scale.... - joypos->wXpos = normalize(joypos->wXpos, caps[joynum-1].wXmin, caps[joynum-1].wXmax); - joypos->wYpos = normalize(joypos->wYpos, caps[joynum-1].wYmin, caps[joynum-1].wYmax); - joypos->wZpos = normalize(joypos->wZpos, caps[joynum-1].wZmin, caps[joynum-1].wZmax); - - return(1); -} diff --git a/sdk/samples/iklowns/cginput.h b/sdk/samples/iklowns/cginput.h deleted file mode 100644 index 4c2c5b7..0000000 --- a/sdk/samples/iklowns/cginput.h +++ /dev/null @@ -1,74 +0,0 @@ -/*===========================================================================*\ -| -| File: cginput.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -/* - The CGameInput class serves as an abstraction layer on top of the - various input devices which may be attached to the machine. -*/ - -#define MOUSE_BUTTON_1 1 -#define MOUSE_BUTTON_2 2 - -class CGameInput { -private: - int joyThere[16]; // 1 if joystick is plugged in, 0 otherwise - JOYCAPS caps [16]; - JOYINFO cached_joyinfo[16]; - -public: - /* - Constructor/destructor. Allocate any threads or other resources - required by the object: - */ - CGameInput(void); - ~CGameInput(void); - - void Flush(void); // remove input (clean up...) - - /* - HW Query functions: determine whether or not a device exists. - Return 0 if no such device, > 0 (depending on device) if it does. - */ - int QKeyboard(void); // 0= no keyboard, 1= exists - int QMouse(void); // 0=no, otherwise num buttons on mouse - int QJoystick(void); // 0=none, else number of joysticks - - /* - Input functions: anyone wishing for input needs to call these: - */ - int GetKeyboard(int yourkey); // ret: 0=no key available - // pass number of keys to check, then array of VKEY codes for keys - // to check. If any key is *not* depressed, returns 0; else 1 - int QKeyDepressed(int numkeys, int *keyarray); - // buttons is bitmap of MOUSE_... returns 0 if no mouse input avail - int GetMouse(int &xpos, int& ypos, int& buttons); - // joystick needs number of joystick to query - int GetJoystick(int joynum, JOYINFO *joypos); - void UpdateJoystick(void); -}; diff --git a/sdk/samples/iklowns/cgkrusty.cpp b/sdk/samples/iklowns/cgkrusty.cpp deleted file mode 100644 index cfea3f6..0000000 --- a/sdk/samples/iklowns/cgkrusty.cpp +++ /dev/null @@ -1,1476 +0,0 @@ -/*===========================================================================*\ -| -| File: cgkrusty.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include -#include -#include -#ifdef __WATCOMC__ -#include -#else -#include -#endif -#include "cgchdll.h" -#include "cgchar.h" -#include "cgtimer.h" -#include "cginput.h" - -char inifile [260]; -int gFastKlown; -int gFastVel; -int gDebugOut; -int gPieSpeed; -int gPieRange; -int gKlownHits; -int gAgression; -int gMobility; -int SENSITIVITY = 33; -int RUN_THRESHOLD = 66; - -static DWORD gTimeout=30000; -static DWORD gUpdateInterval=1000; - -#define MIN_MOUSE_MOVE 3 -#define BIG_MOUSE_MOVE 30 -#define CenterX 320 -#define CenterY 240 - -#define BREAK_IF(x) if (x) _asm int 3; - -#define WALK_VELOCITY 60 -#define RUN_VELOCITY 180 - -#define rand timeGetTime -// klown states: -typedef enum eKLOWN_STATES -{ - STAND_RIGHT, STAND_LEFT, //0,1 - WALK_RIGHT, WALK_LEFT, //2 - RUN_RIGHT, RUN_LEFT, //4 - R2L_TURN, L2R_TURN, //6 - THROW_RIGHT, THROW_LEFT, //8 - THROW_RIGHT_WALK, THROW_LEFT_WALK, //10 - THROW_RIGHT_RUN, THROW_LEFT_RUN, //12 - IN_RIGHT, IN_LEFT, //14 - OUT_RIGHT, OUT_LEFT, //16 - DUCK_RIGHT, DUCK_LEFT, //18 - BLOCK_RIGHT, BLOCK_LEFT, //20 - POKE_RIGHT, POKE_LEFT, //22 - HIT_FACE_L, HIT_FACE_R, //24 - HIT_BACK_L, HIT_BACK_R, //26 - POKED_L, POKED_R, //28 - IS_DEAD, //30 - GAME_OVER, //31 - // insert new states here, before next NUM_STATES: - - NUM_STATES, - -// INTERNAL USE ONLY: don't use these for things which will have sequences, -// and DONT!!! return them to the level object: - INT_THROW_RIGHT, - INT_THROW_LEFT, - INT_THROW_RIGHT_WALK, - INT_THROW_LEFT_WALK, - INT_THROW_RIGHT_RUN, - INT_THROW_LEFT_RUN, - INT_COLLIDED_ON_LEFT, - INT_COLLIDED_ON_RIGHT, - - INT_NUM_STATES -} -#ifdef __WATCOMC__ -xx1 -#endif -; - -typedef enum eKLOWN_SEQ -{ - EOS, NOTHING, DUCK, THROW, BLOCK, POKE, GO_IN, GO_OUT, - WALK_L, WALK_R, RUN_L, RUN_R, GOT_HIT_L, GOT_HIT_R, - GOT_POKED_L, GOT_POKED_R -} -#ifdef __WATCOMC__ -xx2 -#endif -; - -typedef struct -{ - int start; - int end; - int transition; -} STATE; - -// -// klown info - flag if sequence needs to run till finished or not... -#define MUST_FINISH 1 -int klown_state_flags[NUM_STATES] = -{ - 0, //STAND_RIGHT, - 0, // STAND_LEFT, - 0, // WALK_RIGHT, - 0, //WALK_LEFT, - 0, //RUN_RIGHT, - 0, //RUN_LEFT, - MUST_FINISH, //R2L_TURN, - MUST_FINISH, //L2R_TURN, - MUST_FINISH, //THROW_RIGHT, - MUST_FINISH, //THROW_LEFT, - MUST_FINISH, //THROW_RIGHT_WALK, - MUST_FINISH, //THROW_LEFT_WALK, - MUST_FINISH, //THROW_RIGHT_RUN, - MUST_FINISH, //THROW_LEFT_RUN, - 0, //IN_RIGHT, - 0, //IN_LEFT, - 0, //OUT_RIGHT, - 0, //OUT_LEFT, - MUST_FINISH, //DUCK_RIGHT, - MUST_FINISH, //DUCK_LEFT, - MUST_FINISH, //BLOCK_RIGHT, - MUST_FINISH, //BLOCK_LEFT, - MUST_FINISH, //POKE_RIGHT, - MUST_FINISH, //POKE_LEFT, - MUST_FINISH, //HIT_FACE_L, - MUST_FINISH, //HIT_FACE_R, - MUST_FINISH, //HIT_BACK_L, - MUST_FINISH, //HIT_BACK_R, - MUST_FINISH, //POKED_L, - MUST_FINISH, //POKED_R, - MUST_FINISH, //IS_DEAD - MUST_FINISH // GAME_OVER -}; - -int klown_states_index [INT_NUM_STATES]; -// klown state machine - triplets describing all possible transitions: -STATE klown_states[] = -{ - { STAND_RIGHT, WALK_RIGHT, WALK_R }, - { STAND_RIGHT, RUN_RIGHT, RUN_R }, - { STAND_RIGHT, BLOCK_RIGHT, BLOCK }, - { STAND_RIGHT, POKE_RIGHT, POKE }, - { STAND_RIGHT, DUCK_RIGHT, DUCK }, - { STAND_RIGHT, IN_RIGHT, GO_IN }, - { STAND_RIGHT, OUT_RIGHT, GO_OUT }, - { STAND_RIGHT, THROW_RIGHT, THROW }, - { STAND_RIGHT, R2L_TURN, WALK_L }, - { STAND_RIGHT, R2L_TURN, RUN_L }, - { STAND_RIGHT, HIT_FACE_R, GOT_HIT_R }, - { STAND_RIGHT, HIT_BACK_R, GOT_HIT_L }, - { STAND_RIGHT, POKED_R, GOT_POKED_R }, - - { STAND_LEFT, WALK_LEFT, WALK_L }, - { STAND_LEFT, RUN_LEFT, RUN_L }, - { STAND_LEFT, BLOCK_LEFT, BLOCK }, - { STAND_LEFT, POKE_LEFT, POKE }, - { STAND_LEFT, DUCK_LEFT, DUCK }, - { STAND_LEFT, IN_LEFT, GO_IN }, - { STAND_LEFT, OUT_LEFT, GO_OUT }, - { STAND_LEFT, THROW_LEFT, THROW }, - { STAND_LEFT, L2R_TURN, WALK_R }, - { STAND_LEFT, L2R_TURN, RUN_R }, - { STAND_LEFT, HIT_FACE_L, GOT_HIT_L }, - { STAND_LEFT, HIT_BACK_L, GOT_HIT_R }, - { STAND_LEFT, POKED_L, GOT_POKED_L }, - - { WALK_RIGHT, WALK_RIGHT, WALK_R }, - { WALK_RIGHT, RUN_RIGHT, RUN_R }, - { WALK_RIGHT, THROW_RIGHT_WALK, THROW }, - { WALK_RIGHT, R2L_TURN, RUN_L }, - { WALK_RIGHT, R2L_TURN, WALK_L }, - { WALK_RIGHT, IN_RIGHT, GO_IN }, - { WALK_RIGHT, OUT_RIGHT, GO_OUT }, - { WALK_RIGHT, STAND_RIGHT, NOTHING }, - - { WALK_LEFT, WALK_LEFT, WALK_L }, - { WALK_LEFT, RUN_LEFT, RUN_L }, - { WALK_LEFT, THROW_LEFT_WALK, THROW }, - { WALK_LEFT, L2R_TURN, RUN_R }, - { WALK_LEFT, L2R_TURN, WALK_R }, - { WALK_LEFT, IN_LEFT, GO_IN }, - { WALK_LEFT, OUT_LEFT, GO_OUT }, - { WALK_LEFT, STAND_LEFT, NOTHING }, - - { RUN_RIGHT, RUN_RIGHT, RUN_R }, - { RUN_RIGHT, WALK_RIGHT, WALK_R }, - { RUN_RIGHT, THROW_RIGHT_RUN, THROW }, - { RUN_RIGHT, R2L_TURN, RUN_L }, - { RUN_RIGHT, R2L_TURN, WALK_L }, - { RUN_RIGHT, IN_RIGHT, GO_IN }, - { RUN_RIGHT, OUT_RIGHT, GO_OUT }, - { RUN_RIGHT, STAND_RIGHT, NOTHING }, - - { RUN_LEFT, RUN_LEFT, RUN_L }, - { RUN_LEFT, WALK_LEFT, WALK_L }, - { RUN_LEFT, THROW_LEFT_RUN, THROW }, - { RUN_LEFT, L2R_TURN, RUN_R }, - { RUN_LEFT, L2R_TURN, WALK_R }, - { RUN_LEFT, IN_LEFT, GO_IN }, - { RUN_LEFT, OUT_LEFT, GO_OUT }, - { RUN_LEFT, STAND_LEFT, NOTHING }, - - { R2L_TURN, STAND_LEFT, EOS }, - - { L2R_TURN, STAND_RIGHT, EOS }, - - { DUCK_RIGHT, STAND_RIGHT, EOS }, - - { DUCK_LEFT, STAND_LEFT, EOS }, - - { BLOCK_RIGHT, STAND_RIGHT, EOS }, - - { BLOCK_LEFT, STAND_LEFT, EOS }, - - { POKE_RIGHT, STAND_RIGHT, EOS }, - - { POKE_LEFT, STAND_LEFT, EOS }, - - { IN_RIGHT, WALK_RIGHT, WALK_R }, - { IN_RIGHT, R2L_TURN, WALK_L }, - { IN_RIGHT, OUT_RIGHT, GO_OUT }, - { IN_RIGHT, STAND_RIGHT, EOS }, - { IN_RIGHT, STAND_RIGHT, NOTHING }, - - { IN_LEFT, WALK_LEFT, WALK_L }, - { IN_LEFT, L2R_TURN, WALK_R }, - { IN_LEFT, OUT_LEFT, GO_OUT }, - { IN_LEFT, STAND_LEFT, EOS }, - { IN_LEFT, STAND_LEFT, NOTHING }, - - { OUT_RIGHT, WALK_RIGHT, WALK_R }, - { OUT_RIGHT, R2L_TURN, WALK_L }, - { OUT_RIGHT, IN_RIGHT, GO_IN }, - { OUT_RIGHT, STAND_RIGHT, EOS }, - { OUT_RIGHT, STAND_RIGHT, NOTHING}, - - { OUT_LEFT, WALK_LEFT, WALK_L }, - { OUT_LEFT, L2R_TURN, WALK_R }, - { OUT_LEFT, IN_LEFT, GO_IN }, - { OUT_LEFT, STAND_LEFT, EOS }, - { OUT_LEFT, STAND_LEFT, NOTHING }, - - { HIT_FACE_L, STAND_LEFT, EOS }, - - { HIT_FACE_R, STAND_RIGHT, EOS }, - - { HIT_BACK_L, STAND_LEFT, EOS }, - - { HIT_BACK_R, STAND_RIGHT, EOS }, - - { POKED_L, STAND_LEFT, EOS }, - - { POKED_R, STAND_RIGHT, EOS }, - - { THROW_RIGHT, INT_THROW_RIGHT, EOS }, - { THROW_LEFT, INT_THROW_LEFT, EOS }, - { THROW_RIGHT_WALK, INT_THROW_RIGHT_WALK, EOS }, - { THROW_LEFT_WALK, INT_THROW_LEFT_WALK, EOS }, - { THROW_RIGHT_RUN, INT_THROW_RIGHT_RUN, EOS }, - { THROW_LEFT_RUN, INT_THROW_LEFT_RUN, EOS }, - - { IS_DEAD, GAME_OVER, EOS }, - -// HEY! PAY ATTENTION! States listed here on out MUST NOT be returned -// to the level object... they are for internal use only, and since they -// don't have sprite sequences defined for them ,the game will die horribly -// if they are returned! I warned you... - { INT_THROW_RIGHT, STAND_RIGHT, EOS }, - { INT_THROW_LEFT, STAND_LEFT, EOS }, - { INT_THROW_RIGHT_WALK, WALK_RIGHT, EOS }, - { INT_THROW_LEFT_WALK, WALK_LEFT, EOS }, - { INT_THROW_RIGHT_RUN, RUN_RIGHT, EOS }, - { INT_THROW_LEFT_RUN, RUN_LEFT, EOS }, - - { -1,-1,-1 } // end of states. don't change! -}; - -typedef signed char SCHAR; - -typedef struct -{ - LONG posx; - LONG posy; - SCHAR state; - SCHAR velx; - SCHAR vely; - SCHAR curZ; -} GENERIC_CHAR_INFO; - -typedef struct -{ - int curState; - int LastMouseX; - int LastMouseY; - DWORD timeLastUpdate; - int HitsLeft; - int pushedState; - CGameCharacter * myPie; - int type; // 0 = main; 1=computer; 2= second; - int IGotKilled; - DWORD Timeout; - DWORD UpdateInterval; -} KLOWN_DATA; - - -#define KLOWN_MOVE 1 -#define KLOWN_PIE 2 - -HINSTANCE hInst = NULL; // our library instance -// This is returned by the 'Ident' function, but isn't used internally at all -CGameVersionIdent version = -{ - RELEASE1_0, - GAMEID -}; - -// prototypes so we can fill in the action arrays -int PieCreate( CGameCharacter *, CGameLevel * ); -int PieAction( CGameCharacter *, CGameLevel * ); -int PieDestroy( CGameCharacter *, CGameLevel * ); -int PieCollide( CGameCharacter *, CGameCharacter *, CGameLevel * ); -int KlownCreate( CGameCharacter *, CGameLevel * ); -int KlownAction( CGameCharacter *, CGameLevel * ); -int KlownDestroy( CGameCharacter *, CGameLevel * ); -int KlownRemoteAction( CGameCharacter *, CGameLevel * ); -int KlownCollide( CGameCharacter *, CGameCharacter *, CGameLevel * ); - -CGameCharSequenceInfo char1seq[2] = -{ - // sequence 0: ThrownLeft - {"piefly.spr", "FlyLeft", 30, {"throw.wav", NULL, 100, 0}}, - // sequence 1: ThrownRight - {"piefly.spr", "FlyRight", 30, {"throw.wav", NULL, 100, 0}} -}; - -// NOTE: the klown sequences below are all the same. They are included -// separately to permit possible future changes in behaviour for different klowns. -CGameCharSequenceInfo klown1seq[32] = -{ - {"c1stand.spr", "StandRight", 30, {NULL, NULL, 0, 0}}, // STAND_RIGHT - {"c1stand.spr", "StandLeft", 30, {NULL, NULL, 0, 0}}, // STAND_LEFT - {"c1walk.spr", "WalkRight", 30, {"walk.wav", NULL, 40, 1}}, // WALK_RIGHT - {"c1walk.spr", "WalkLeft", 30, {"walk.wav", NULL, 40, 1}}, // WALK_LEFT - {"c1run.spr", "RunRight", 30, {"run.wav", NULL, 60, 1}}, // RUN_RIGHT - {"c1run.spr", "RunLeft", 30, {"run.wav", NULL, 60, 1}}, // RUN_LEFT - {"c1turn.spr", "Right2Left", 30, {NULL, NULL, 80, 1}}, // R2L_TURN - {"c1turn.spr", "Left2Right", 30, {NULL, NULL, 80, 1}}, // L2R_TURN - {"c1throw.spr", "ThrowRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT - {"c1throw.spr", "ThrowLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT - {"c1stand.spr", "StandRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT_WALK - {"c1stand.spr", "StandLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT_WALK - {"c1stand.spr", "StandRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT_RUN - {"c1stand.spr", "StandLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT_RUN - {"c1walk45.spr", "InRight", 30, {"walk.wav", NULL, 40, 1}}, // IN_RIGHT - {"c1walk45.spr", "InLeft", 30, {"walk.wav", NULL, 40, 1}}, // IN_LEFT - {"c1walk45.spr", "OutRight", 30, {"walk.wav", NULL, 40, 1}}, // OUT_RIGHT - {"c1walk45.spr", "OutLeft", 30, {"walk.wav", NULL, 40, 1}}, // OUT_LEFT - {"c1duck.spr", "DuckRight", 30, {NULL, NULL, 40, 1}}, // DUCK_RIGHT - {"c1duck.spr", "DuckLeft", 30, {NULL, NULL, 40, 1}}, // DUCK_LEFT - {"c1block.spr", "BlockRight", 30, {NULL, NULL, 40, 1}}, // BLOCK_RIGHT - {"c1block.spr", "BlockLeft", 30, {NULL, NULL, 40, 1}}, // BLOCK_LEFT - {"c1poke.spr", "PokeRight", 30, {"nyuk.wav", NULL, 63, 0}}, // POKE_RIGHT - {"c1poke.spr", "PokeLeft", 30, {"nyuk.wav", NULL, 63, 0}}, // POKE_LEFT - {"c1piefac.spr", "PieFaceLeft", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_FACE_L - {"c1piefac.spr", "PieFaceRight", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_FACE_R - {"c1piehed.spr", "PieHeadLeft", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_BACK_L - {"c1piehed.spr", "PieHeadRight", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_BACK_R - {"c1stand.spr", "StandLeft", 30, {"woob.wav", NULL, 63, 0}}, // POKED_L - {"c1stand.spr", "StandRight", 30, {"woob.wav", NULL, 63, 0}}, // POKED_R - {"c1sad.spr", "C1SadLeft", 10, {"sad.wav", NULL, 100, 0}}, // IS_DEAD - {"c1sad.spr", "C1SadDone", 10, {NULL, NULL, 100, 0}} // GAME_OVER -}; - -CGameCharSequenceInfo klown2seq[32] = -{ - {"c2stand.spr", "C2StandRight", 30, {NULL, NULL, 0, 0}}, // STAND_RIGHT - {"c2stand.spr", "C2StandLeft", 30, {NULL, NULL, 0, 0}}, // STAND_LEFT - {"c2walk.spr", "C2WalkRight", 30, {"walk.wav", NULL, 40, 1}}, // WALK_RIGHT - {"c2walk.spr", "C2WalkLeft", 30, {"walk.wav", NULL, 40, 1}}, // WALK_LEFT - {"c2run.spr", "C2RunRight", 30, {"run.wav", NULL, 60, 1}}, // RUN_RIGHT - {"c2run.spr", "C2RunLeft", 30, {"run.wav", NULL, 60, 1}}, // RUN_LEFT - {"c2turn.spr", "C2Right2Left", 30, {NULL, NULL, 80, 1}}, // R2L_TURN - {"c2turn.spr", "C2Left2Right", 30, {NULL, NULL, 80, 1}}, // L2R_TURN - {"c2throw.spr", "C2ThrowRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT - {"c2throw.spr", "C2ThrowLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT - {"c2stand.spr", "C2StandRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT_WALK - {"c2stand.spr", "C2StandLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT_WALK - {"c2stand.spr", "C2StandRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT_RUN - {"c2stand.spr", "C2StandLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT_RUN - {"c2walk45.spr", "C2InRight", 30, {"walk.wav", NULL, 40, 1}}, // IN_RIGHT - {"c2walk45.spr", "C2InLeft", 30, {"walk.wav", NULL, 40, 1}}, // IN_LEFT - {"c2walk45.spr", "C2OutRight", 30, {"walk.wav", NULL, 40, 1}}, // OUT_RIGHT - {"c2walk45.spr", "C2OutLeft", 30, {"walk.wav", NULL, 40, 1}}, // OUT_LEFT - {"c2duck.spr", "C2DuckRight", 30, {NULL, NULL, 40, 1}}, // DUCK_RIGHT - {"c2duck.spr", "C2DuckLeft", 30, {NULL, NULL, 40, 1}}, // DUCK_LEFT - {"c2block.spr", "C2BlockRight", 30, {NULL, NULL, 40, 1}}, // BLOCK_RIGHT - {"c2block.spr", "C2BlockLeft", 30, {NULL, NULL, 40, 1}}, // BLOCK_LEFT - {"c2poke.spr", "C2PokeRight", 30, {"nyuk.wav", NULL, 63, 0}}, // POKE_RIGHT - {"c2poke.spr", "C2PokeLeft", 30, {"nyuk.wav", NULL, 63, 0}}, // POKE_LEFT - {"c2piefac.spr", "C2PieFaceLeft", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_FACE_L - {"c2piefac.spr", "C2PieFaceRight", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_FACE_R - {"c2piehed.spr", "C2PieHeadLeft", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_BACK_L - {"c2piehed.spr", "C2PieHeadRight", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_BACK_R - {"c2stand.spr", "C2StandLeft", 30, {"woob.wav", NULL, 63, 0}}, // POKED_L - {"c2stand.spr", "C2StandRight", 30, {"woob.wav", NULL, 63, 0}}, // POKED_R - {"c2sad.spr", "c2SadLeft", 10, {"sad.wav", NULL, 100, 0}}, // IS_DEAD - {"c2sad.spr", "c2SadDone", 10, {NULL, NULL, 100, 0}} // GAME_OVER -}; - -#if 0 // !!! don't have all the bitmaps yet - -CGameCharSequenceInfo klown3seq[32] = -{ - {"C3stand.spr", "C3StandRight", 30, {NULL, NULL, 0, 0}}, // STAND_RIGHT - {"C3stand.spr", "C3StandLeft", 30, {NULL, NULL, 0, 0}}, // STAND_LEFT - {"C3walk.spr", "C3WalkRight", 30, {"walk.wav", NULL, 40, 1}}, // WALK_RIGHT - {"C3walk.spr", "C3WalkLeft", 30, {"walk.wav", NULL, 40, 1}}, // WALK_LEFT - {"C3run.spr", "C3RunRight", 30, {"run.wav", NULL, 60, 1}}, // RUN_RIGHT - {"C3run.spr", "C3RunLeft", 30, {"run.wav", NULL, 60, 1}}, // RUN_LEFT - {"C3turn.spr", "C3Right2Left", 30, {NULL, NULL, 80, 1}}, // R2L_TURN - {"C3turn.spr", "C3Left2Right", 30, {NULL, NULL, 80, 1}}, // L2R_TURN - {"C3throw.spr", "C3ThrowRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT - {"C3throw.spr", "C3ThrowLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT - {"C3stand.spr", "C3StandRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT_WALK - {"C3stand.spr", "C3StandLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT_WALK - {"C3stand.spr", "C3StandRight", 30, {NULL, NULL, 80, 1}}, // THROW_RIGHT_RUN - {"C3stand.spr", "C3StandLeft", 30, {NULL, NULL, 80, 1}}, // THROW_LEFT_RUN - {"C3walk45.spr", "C3InRight", 30, {"walk.wav", NULL, 40, 1}}, // IN_RIGHT - {"C3walk45.spr", "C3InLeft", 30, {"walk.wav", NULL, 40, 1}}, // IN_LEFT - {"C3walk45.spr", "C3OutRight", 30, {"walk.wav", NULL, 40, 1}}, // OUT_RIGHT - {"C3walk45.spr", "C3OutLeft", 30, {"walk.wav", NULL, 40, 1}}, // OUT_LEFT - {"C3duck.spr", "C3DuckRight", 30, {NULL, NULL, 40, 1}}, // DUCK_RIGHT - {"C3duck.spr", "C3DuckLeft", 30, {NULL, NULL, 40, 1}}, // DUCK_LEFT - {"C3block.spr", "C3BlockRight", 30, {NULL, NULL, 40, 1}}, // BLOCK_RIGHT - {"C3block.spr", "C3BlockLeft", 30, {NULL, NULL, 40, 1}}, // BLOCK_LEFT - {"C3poke.spr", "C3PokeRight", 30, {"nyuk.wav", NULL, 63, 0}}, // POKE_RIGHT - {"C3poke.spr", "C3PokeLeft", 30, {"nyuk.wav", NULL, 63, 0}}, // POKE_LEFT - {"C3piefac.spr", "C3PieFaceLeft", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_FACE_L - {"C3piefac.spr", "C3PieFaceRight", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_FACE_R - {"C3piehed.spr", "C3PieHeadLeft", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_BACK_L - {"C3piehed.spr", "C3PieHeadRight", 30, {NULL, "piehit2.wav", 100, 0}}, // HIT_BACK_R - {"C3stand.spr", "C3StandLeft", 30, {"woob.wav", NULL, 63, 0}}, // POKED_L - {"C3stand.spr", "C3StandRight", 30, {"woob.wav", NULL, 63, 0}}, // POKED_R - {"C3sad.spr", "C3SadLeft", 10, {"sad.wav", NULL, 100, 0}}, // IS_DEAD - {"C3sad.spr", "C3SadDone", 10, {NULL, NULL, 100, 0}} // GAME_OVER -}; -#endif - -// number of klown sequence sets above -1 for main klown -//#define NUM_AUTO_KLOWNS 2 -#define NUM_AUTO_KLOWNS 1 - -// table of sequence tables for allocating non-main klowns -CGameCharSequenceInfo* klownSeqTable[NUM_AUTO_KLOWNS] = -{ - klown2seq //, -// klown3seq -}; - -// returned by 'Info' function, and isn't used either (internally) -CGameCharInfo character1 = -{ - "Pie", - 2, - &char1seq[0], - - PieCreate, - PieAction, - PieDestroy, - NULL, - PieCollide -}; - -// returned by 'Info' function, and isn't used either (internally) -static CGameCharInfo character2 = -{ - "Klown", - 32, - &klown1seq[0], - - KlownCreate, - KlownAction, - KlownDestroy, - KlownRemoteAction, - KlownCollide -}; - -// returned by 'Info' function, and isn't used either (internally) -// Klown2 uses the klown2 - klownN sequences above, allocated 1 at a time -static CGameCharInfo character3 = -{ - "Klown2", - 32, - &klown2seq[0], // modified at create time - - KlownCreate, - KlownAction, - KlownDestroy, - KlownRemoteAction, - KlownCollide -}; - -// This array allows the caller to get our information directly -CGameCharInfo *characters[] = -{ - &character1, - &character2, - &character3 -}; - -CGameInfo dllinfo = -{ - 3, // number of characters implemented in - // this DLL - characters // array of CGameCharInfo pointers -}; - -void InitStateIndex(STATE *states, int *index, int indexsize); -// EXPORTED as ordinal #1: -#if defined(__BORLANDC__) || defined(__WATCOMC__) -extern "C" void CALLBACK Ident( CGameVersionIdent * id ) -#else -void CALLBACK Ident( CGameVersionIdent * id ) -#endif -{ - GetModuleFileName(NULL, inifile, 259); - char *p = strrchr(inifile, '.'); - if (p) - lstrcpy(p+1, "GAM"); - - gFastKlown = GetPrivateProfileInt("KRUSTY.DLL", "fastklown", 0, inifile); - gFastVel = GetPrivateProfileInt("KRUSTY.DLL", "fastvel", 20, inifile); - gDebugOut = GetPrivateProfileInt("KRUSTY.DLL", "debugout", 0, inifile); - gPieSpeed = GetPrivateProfileInt("KRUSTY.DLL", "piespeed", 5, inifile); - gPieRange = GetPrivateProfileInt("KRUSTY.DLL", "pierange", 500, inifile); - gKlownHits = GetPrivateProfileInt("KRUSTY.DLL", "hits", 10, inifile); - SENSITIVITY = GetPrivateProfileInt("KRUSTY.DLL", "JoystickSensitivity", 33, inifile); - RUN_THRESHOLD = GetPrivateProfileInt("KRUSTY.DLL", "RunThreshold", 66, inifile); - gAgression = GetPrivateProfileInt("KRUSTY.DLL", "aggression", 10, inifile); - gMobility = GetPrivateProfileInt("KRUSTY.DLL", "mobility", 3, inifile); - gTimeout = (DWORD)GetPrivateProfileInt("KRUSTY.DLL", "RemoteTimeout", 30, inifile) - * 1000; - gUpdateInterval = (DWORD)GetPrivateProfileInt("KRUSTY.DLL", "RemoteUpdateInterval", 100, inifile); - - memcpy( id, &version, sizeof( CGameVersionIdent ) ); - - InitStateIndex(klown_states, &klown_states_index[0], INT_NUM_STATES); -} - -// EXPORTED as ordinal #2: -#if defined(__BORLANDC__) || defined(__WATCOMC__) -extern "C" void CALLBACK Info( CGameInfo * info ) -#else -void CALLBACK Info( CGameInfo * info ) -#endif -{ - memcpy( info, &dllinfo, sizeof( dllinfo ) ); -} - -void InitStateIndex(STATE *states, int *index, int indexsize) -{ - int ix; - - // set index to unused - memset(index, -1, indexsize * sizeof(int)); - - // iterate through states, putting correct index into 'index' - ix = 0; - int laststate = -2; - while (states[ix].start != -1) - { - if (states[ix].start != laststate) - { - if (states[ix].start < indexsize) - index[states[ix].start] = ix; - - laststate = states[ix].start; - } - ++ix; - } -} - -int ChangeState ( STATE * states, - int *index, - int curstate, - int transition, - CGameCharacter * me, - int time) -{ - /* - The STATEs are grouped by state; they are "clumped" together, so - that once we find the 'curstate' in the array, we can look at all - the possible transitions out of 'curstate'. - - The last state in the array of allowable states is "-1". - */ - - - // first off: does this state care about any transitions? - if (klown_state_flags[curstate] & MUST_FINISH) - { - // must finish this sequence; ignore transition! - if (me->NextSprite(time, FALSE) == 0) - { - // end of sequence; - transition = EOS; - } - else - { - // not end; just return - return(curstate); - } - } - else - { - // do the next sprite - me->NextSprite(time, TRUE); - } - - int ix = index[curstate]; - while (states[ix].start == curstate) - { - if (states[ix].transition == transition) - { - return(states[ix].end); - } - ++ix; - } - // didn't find our transition, so don't change state - return(curstate); -} - -int PieCreate( CGameCharacter *me, CGameLevel *level ) -{ - // use private data as plain old integer... - me->mpPrivateData = (void *) level->GetFrameTime(); - - return ( ACTION_COMPLETED ); -} - -int PieAction( CGameCharacter *me, CGameLevel *level ) -{ - int posx, posy, velx, vely; - int time = level->GetFrameTime(); - int slices = (me->mLastTime == -1) ? 1 : time - me->mLastTime; - me->mLastTime = time; - - me->GetVelocity(&velx, &vely); - - // remember to use sub-pixels! - me->GetSubXY(&posx, &posy); - posx += SUBPIXEL_DELTA(velx, slices); - posy += SUBPIXEL_DELTA(vely, slices); - - if (time > ((int) me->mpPrivateData + gPieRange)) - { - posy = -100000; - me->mpPrivateData = (void *)-1; - me->SetAndMove(posx, posy); - me->NextSprite(level->GetTimer()->Time, FALSE); - return(-2); - } - else - { - me->SetAndMove(posx, posy); - me->NextSprite(level->GetTimer()->Time, FALSE); - - if (velx < 0) - return(0); - else - return(1); - } - -} - -int PieDestroy( CGameCharacter *me, CGameLevel *level ) -{ - me->mpPrivateData = (void *)-1; - return ( ACTION_COMPLETED ); -} - -int PieCollide( CGameCharacter *me, CGameCharacter *other, CGameLevel *level ) -{ - int posx, posy; - me->GetSubXY(&posx, &posy); - - //move off the visible world, so we "disappear" - posy = -100000; - me->SetAndMove(posx, posy); - me->mpPrivateData = (void *)-1; - return(0); -} - -static int curKlown = 0; - -static int KlownCreate( CGameCharacter *me, CGameLevel *level ) -{ - KLOWN_DATA *pKlown = new KLOWN_DATA; - int x,y,buttons; -// srand(0); - memset(pKlown, 0, sizeof(KLOWN_DATA)); - me->mpPrivateData = (void *) pKlown; - if (level->GetInput()->GetMouse(x, y, buttons)) - { - pKlown->LastMouseX = x; - pKlown->LastMouseY = y; - } - - pKlown->curState = STAND_RIGHT; - pKlown->pushedState = -1; - pKlown->HitsLeft = gKlownHits; - pKlown->timeLastUpdate = level->GetFrameTime(); - pKlown->IGotKilled = 0; - - pKlown->Timeout = gTimeout; - pKlown->UpdateInterval = gUpdateInterval; - - BOOL isMain = (lstrcmpi(me->GetName(), "klown") == 0); - - if (isMain && gFastKlown) - { - pKlown->curState = RUN_RIGHT; - me->SetVelocity(gFastVel,0); - } - else - { - pKlown->myPie = level->Add("Pie",me->GetCurrentZ(),0,-100000); - } - - if (!isMain) - { - // set sequence set for non-main klowns using counter to allocate - // NOTE: this will change our global copy, so be careful! - me->mpCharInfo->Sequences = klownSeqTable[curKlown++ % NUM_AUTO_KLOWNS]; - } - - return ( ACTION_COMPLETED ); -} - -static void FirePie ( - int posx, - int posy, - int velx, - int vely, - CGameCharacter *me, - CGameLevel *level, - BOOL fRemote -) -{ - KLOWN_DATA *pKlown = (KLOWN_DATA *) me->mpPrivateData; - char chBuffer[128]; - - if (pKlown->myPie == NULL) - { - pKlown->myPie = level->Add("Pie",me->GetCurrentZ(),0,0); - } - - PieCreate(pKlown->myPie, level); - - pKlown->myPie->SetCurrentZ(me->GetCurrentZ()); - if (velx > 0) - { - pKlown->myPie->MoveTo(posx + me->GetCurWidth(), posy); - } - else - { - pKlown->myPie->MoveTo(posx - 32, posy); - } - - pKlown->myPie->SetVelocity(velx, vely); - if (!fRemote) - { - GENERIC_CHAR_INFO ci; - - ci.state = 0; - ci.posx = posx; - ci.posy = posy; - ci.velx = (velx > 0) ? 1 : -1; - ci.vely = (vely > 0) ? 1 : -1; - wsprintf( chBuffer, "Pie %d %d %d %d\r\n", - velx, vely, ci.velx, ci.vely); - OutputDebugString(chBuffer); - ci.curZ = me->GetCurrentZ(); - me->TransmitRemoteAction(KLOWN_PIE, &ci, sizeof(ci)); - } -} - -int AddWithLimit(int base, int howmuch, int lowerlimit, int upperlimit) -{ - base += howmuch; - if (base > upperlimit) - base = upperlimit; - if (base < lowerlimit) - base = lowerlimit; - return(base); -} - -int AdjustedY(int base, int curz, int newz, int minz, int maxz) -{ - int y_shift = 0; - int old_shift = 0; - - y_shift = (newz - (maxz - minz)) << 3; - old_shift = (curz - (maxz - minz)) << 3; - base += (old_shift << 8); - base -= (y_shift << 8); - return(base); -} - -// returns the new state ("action") -static int KlownAction( CGameCharacter *me, CGameLevel *level ) -{ - int time = level->GetFrameTime(); - int slices = (me->mLastTime == -1) ? 1 : time - me->mLastTime; - me->mLastTime = time; - - int velx, vely, zchange; - int posx, posy; - KLOWN_DATA *pKlown = (KLOWN_DATA *) me->mpPrivateData; - - int oldstate = pKlown->curState; - int newstate = oldstate; - int transition = NOTHING; - - JOYINFO joy; - int x, y, buttons; - - zchange = 0; - - me->GetVelocity(&velx, &vely); - - // remember to use sub-pixels! - me->GetSubXY(&posx, &posy); - - CGameInput * Input = level->GetInput(); - if ((pKlown->type == 0) && (gFastKlown != (int) level->mFastKlown)) - { - gFastKlown = (int) level->mFastKlown; - if (gFastKlown) - { - pKlown->curState = RUN_RIGHT; - velx = gFastVel; - vely = 0; - me->SetVelocity(velx,vely); - newstate = oldstate = RUN_RIGHT; - } - else - { - pKlown->curState = STAND_RIGHT; - me->SetVelocity( 0,0 ); - newstate = oldstate = STAND_RIGHT; - } - } - - if (gFastKlown && (pKlown->type == 0)) - { - me->NextSprite(time); - newstate = oldstate; - - if (SUB2WORLD(posx) <= (-level->GetMaxX())) - { - velx = -velx; - newstate = RUN_RIGHT; - } - else if (SUB2WORLD(posx) >= (level->GetMaxX() - me->GetCurWidth() )) - { - newstate = RUN_LEFT; - velx = -velx; - } - } - else - { - // step 1: Grab input and figure out what the command is: - velx=vely=zchange=0; - - int alt, ctrl, shift; - int right, left, up, down; - - alt = ctrl = shift = right = left = up = down = 0; - - switch (pKlown->type) - { - case 0: // "normal" - alt = Input->GetKeyboard(VK_MENU); - ctrl = Input->GetKeyboard(VK_CONTROL); - shift=Input->GetKeyboard(VK_SHIFT); - right = (Input->GetKeyboard(VK_RIGHT) != 0) || - (Input->GetKeyboard(VK_NUMPAD6) != 0); - left = (Input->GetKeyboard(VK_LEFT) != 0) || - (Input->GetKeyboard(VK_NUMPAD4) != 0); - up = (Input->GetKeyboard(VK_UP) != 0) || - (Input->GetKeyboard(VK_NUMPAD8) != 0); - down = (Input->GetKeyboard(VK_DOWN) != 0) || - (Input->GetKeyboard(VK_NUMPAD2) != 0); - - if (! (up || down || left || right || shift)) - { - - if (Input->GetMouse(x, y, buttons)) - { - int deltaX = x - pKlown->LastMouseX; - int deltaY = y - pKlown->LastMouseY; - - right = (deltaX > MIN_MOUSE_MOVE); - left = (deltaX < -MIN_MOUSE_MOVE); - if ((deltaX > BIG_MOUSE_MOVE) || (deltaX < -BIG_MOUSE_MOVE)) - { - ctrl = TRUE; - } - down = (deltaY > 5*MIN_MOUSE_MOVE); - up = (deltaY < -5*MIN_MOUSE_MOVE); - - shift = shift || (buttons & 1); - alt = buttons & 2; - - x = CenterX; - y = CenterY; - - pKlown->LastMouseX = x; - pKlown->LastMouseY = y; - SetCursorPos(x, y); - } - } - - if (! (up || down || left || right || shift)) - { - - // grab joystick input... - if (Input->GetJoystick(1, &joy)) - { - // motion left ,right, up or down; button 1=fire pie. button2=flip - int vel; - vel = joy.wXpos; - if (vel >= SENSITIVITY) - { - // moved right: - right = 1; - if (vel >= RUN_THRESHOLD) - ctrl = 1; - } - else if (vel <= -SENSITIVITY) - { - // moved left: - left = 1; - if (vel <= -RUN_THRESHOLD) - ctrl = 1; - } - - vel = joy.wYpos; - if (vel >= SENSITIVITY) - down = 1; - else if (vel <= -SENSITIVITY) - up = 1; - - if (joy.wButtons & JOY_BUTTON1) - shift = 1; - if (joy.wButtons & JOY_BUTTON2) - alt = 1; - } - } - break; - - case 1: // "robo" - // where is the main klown, relative to us? - if (level->mMainKlown && (level->mMainKlown != me)) - { - // get its rectangle - PRECT pMainRect = level->mMainKlown->GetRect(); - PRECT pMyRect = me->GetRect(); - - // first: if we were walking, we should keep on walking! - if (oldstate == WALK_LEFT || oldstate == WALK_RIGHT) - { - if (rand() % 10) - { - if (oldstate == WALK_LEFT) - ++left; - else - ++right; - goto no_change; - - } - - } - - if ((int)(rand() % 100) <= gMobility) - { - if (rand() % 5) - { - if (pMainRect->left < pMyRect->left) - ++left; - else - ++right; - } - else - { - int z = level->mMainKlown->GetCurrentZ(); - if ((z > me->GetCurrentZ()) || gFastKlown) - { - // increase our z - ++up; - } - else if (z < me->GetCurrentZ()) - { - // decrease our z - ++down; - } - } - -no_change: - // nothing - ; - } - else if ((int)(rand() % 100) <= gAgression) - ++shift; - } - - break; - - case 2: // "second" always uses second joystick - if (Input->GetJoystick(2, &joy)) - { - // motion left ,right, up or down; button 1=fire pie. button2=flip - int vel; - vel = joy.wXpos; - if (vel >= SENSITIVITY) - { - // moved right: - right = 1; - if (vel >= RUN_THRESHOLD) - ctrl = 1; - } - else if (vel <= -SENSITIVITY) - { - // moved left: - left = 1; - if (vel <= -RUN_THRESHOLD) - ctrl = 1; - } - - vel = joy.wYpos; - if (vel >= SENSITIVITY) - down = 1; - else if (vel <= -SENSITIVITY) - up = 1; - - if (joy.wButtons & JOY_BUTTON1) - shift = 1; - if (joy.wButtons & JOY_BUTTON2) - alt = 1; - } - break; - } - - if (up) - transition = GO_IN; - if (down) - transition = GO_OUT; - if (left) - transition = ctrl ? RUN_L : WALK_L; - if (right) - transition = ctrl ? RUN_R : WALK_R; - if (shift) - transition = THROW; - if (alt && down) - transition = DUCK; - if (shift && down) - transition = POKE; - if (alt && shift) - transition = BLOCK; - - // got a transition; figure out the new state - if (pKlown->pushedState >= 0) - { - newstate = pKlown->pushedState; - pKlown->pushedState = -1; - } - else - { - newstate = ChangeState( klown_states, - klown_states_index, - oldstate, - transition, - me, - time); - } - - switch (newstate) - { - case INT_COLLIDED_ON_RIGHT: - if (rand() % 2) - { - posx -= WORLD2SUB(me->GetCurWidth()/4); - ++zchange; - } - newstate = STAND_RIGHT; - break; - - case INT_COLLIDED_ON_LEFT: - if (rand() % 2) - { - posx += WORLD2SUB(me->GetCurWidth()/4); - ++zchange; - } - newstate = STAND_LEFT; - break; - - case HIT_FACE_L: - case HIT_FACE_R: - case HIT_BACK_L: - case HIT_BACK_R: - if (newstate != oldstate) - { - --pKlown->HitsLeft; - if (pKlown->HitsLeft <= 0) - { - newstate = IS_DEAD; - } - } - break; - - case IS_DEAD: - velx = 0; - vely = 0; - ++zchange; - break; - - case GAME_OVER: - level->GameOver(); - pKlown->IGotKilled = 1; - - // reset scores of all Klowns... - { - KLOWN_DATA * pK = (KLOWN_DATA *) level->mMainKlown->mpPrivateData; - if (pK) - pK->HitsLeft = gKlownHits; - if (level->mSecondKlown) - { - pK = (KLOWN_DATA *) level->mSecondKlown->mpPrivateData; - if (pK) - pK->HitsLeft = gKlownHits; - } - - // need to change this for more than one computer klown... - if (level->mComputerKlowns[0]) - { - pK = (KLOWN_DATA *) level->mComputerKlowns[0]->mpPrivateData; - if (pK) - pK->HitsLeft = gKlownHits; - } - } - - break; - - case WALK_RIGHT: - velx = WALK_VELOCITY; - break; - - case RUN_RIGHT: - velx = RUN_VELOCITY; - break; - - case WALK_LEFT: - velx = -WALK_VELOCITY; - break; - - case RUN_LEFT: - velx = -RUN_VELOCITY; - break; - - case THROW_LEFT: - case THROW_RIGHT: - case THROW_LEFT_WALK: - case THROW_RIGHT_WALK: - case THROW_LEFT_RUN: - case THROW_RIGHT_RUN: - if (newstate != oldstate) - if (pKlown->myPie && (pKlown->myPie->mpPrivateData!=(void*)-1)) - newstate = oldstate; - break; - - case INT_THROW_RIGHT: - newstate = STAND_RIGHT; - FirePie(SUB2WORLD(posx), SUB2WORLD(posy), gPieSpeed, 0, me, level, FALSE); - break; - - case INT_THROW_RIGHT_WALK: - newstate = WALK_RIGHT; - FirePie(SUB2WORLD(posx), SUB2WORLD(posy), gPieSpeed, 0, me, level, FALSE); - break; - - case INT_THROW_RIGHT_RUN: - newstate = RUN_RIGHT; - FirePie(SUB2WORLD(posx), SUB2WORLD(posy), gPieSpeed, 0, me, level, FALSE); - break; - - case INT_THROW_LEFT: - newstate = STAND_LEFT; - FirePie(SUB2WORLD(posx), SUB2WORLD(posy), -gPieSpeed, 0, me, level, FALSE); - break; - - case INT_THROW_LEFT_WALK: - newstate = WALK_LEFT; - FirePie(SUB2WORLD(posx), SUB2WORLD(posy), -gPieSpeed, 0, me, level, FALSE); - break; - - case INT_THROW_LEFT_RUN: - newstate = RUN_LEFT; - FirePie(SUB2WORLD(posx), SUB2WORLD(posy), -gPieSpeed, 0, me, level, FALSE); - break; - - case IN_LEFT: - { - int curz = me->GetCurrentZ(); - velx = -32; - curz = AddWithLimit(curz, 1, me->GetMinZ(), me->GetMaxZ()); - posy = AdjustedY(posy, me->GetCurrentZ(), curz, me->GetMinZ(), me->GetMaxZ()); - me->SetCurrentZ(curz); - ++zchange; - } - break; - - case IN_RIGHT: - { - int curz = me->GetCurrentZ(); - velx = 32; - curz = AddWithLimit(curz, 1, me->GetMinZ(), me->GetMaxZ()); - posy = AdjustedY(posy, me->GetCurrentZ(), curz, me->GetMinZ(), me->GetMaxZ()); - me->SetCurrentZ(curz); - ++zchange; - } - break; - - case OUT_LEFT: - { - int curz = me->GetCurrentZ(); - velx=-32; - curz = AddWithLimit(curz, -1, me->GetMinZ(), me->GetMaxZ()); - posy = AdjustedY(posy, me->GetCurrentZ(), curz, me->GetMinZ(), me->GetMaxZ()); - me->SetCurrentZ(curz); - ++zchange; - } - break; - case OUT_RIGHT: - { - int curz = me->GetCurrentZ(); - velx=32; - curz = AddWithLimit(curz, -1, me->GetMinZ(), me->GetMaxZ()); - posy = AdjustedY(posy, me->GetCurrentZ(), curz, me->GetMinZ(), me->GetMaxZ()); - me->SetCurrentZ(curz); - ++zchange; - } - break; - } - } - - if (velx || vely || zchange) - { - posx += SUBPIXEL_DELTA(slices, velx); - posy += SUBPIXEL_DELTA(slices, vely); - int newX = SUB2WORLD(posx); - int newY = SUB2WORLD(posy); - - - if (pKlown->type == 0) - level->ForceOnScreen(&newX, &newY, me->GetCurWidth(), me->GetCurHeight()); - else - level->ForceOnScreen(&newX, &newY, me->GetCurWidth(), me->GetCurHeight(), FALSE); - me->MoveTo(newX, newY); - } - - me->SetVelocity(velx, vely); - pKlown->curState = newstate; - - - if (pKlown->type == 0) - { - if ((newstate != oldstate) || (velx || vely || zchange) - || (time - pKlown->timeLastUpdate > pKlown->UpdateInterval)) - { - GENERIC_CHAR_INFO ci; - int velx; - int vely; - - - ci.state = newstate; - me->GetSubXY((int *)&ci.posx, (int *)&ci.posy); - me->GetVelocity(&velx, &vely); - ci.velx = velx; - ci.vely = vely; - ci.curZ = me->GetCurrentZ(); - - me->TransmitRemoteAction(KLOWN_MOVE, &ci, sizeof(ci)); - pKlown->timeLastUpdate = time; - } - } - return ( newstate ); -} - -static int KlownDestroy( CGameCharacter *me, CGameLevel *level ) -{ - delete (void *) me->mpPrivateData; - return ( ACTION_COMPLETED ); -} - -static int KlownRemoteAction( CGameCharacter *me, CGameLevel *level ) -{ - KLOWN_DATA *pKlown = (KLOWN_DATA *) me->mpPrivateData; - int oldstate = pKlown->curState; - - int time = level->GetFrameTime(); - int slices = (me->mLastTime == -1) ? 1 : time - me->mLastTime; - me->mLastTime = time; - - void *Data; - int newstate = oldstate; - int action; - DWORD DataSize; - - me->NextSprite(time, FALSE); - - int nActionsProcessed = 0; - while ((action = me->GetRemoteAction(Data, DataSize)) != -1) - { - - nActionsProcessed++; - - GENERIC_CHAR_INFO *ci = (GENERIC_CHAR_INFO *)Data; - - switch (action) { - case KLOWN_MOVE: - newstate = ci->state; - pKlown->curState = newstate; - me->SetCurrentZ(ci->curZ); - me->SetVelocity(ci->velx, ci->vely); - me->SetAndMove(ci->posx, ci->posy); - break; - - case KLOWN_PIE: - FirePie(ci->posx, ci->posy, ci->velx * gPieSpeed, 0, me , level, TRUE); - break; - - } - me->ReleaseRemoteAction(Data); - } - - if (nActionsProcessed > 0) - { - pKlown->timeLastUpdate = time; - } - else if (time - pKlown->timeLastUpdate > pKlown->Timeout) - { - // need to kill 'em off - return(ACTION_KILLME); - } - else - { - int velx, vely; - int posx, posy; - - // Haven't heard from him, but keep him moving! - me->GetVelocity(&velx, &vely); - me->GetSubXY(&posx, &posy); - if (velx || vely) - { - posx += SUBPIXEL_DELTA(slices, velx); - posy += SUBPIXEL_DELTA(slices, vely); - - me->SetAndMove(posx, posy); - me->SetVelocity(velx, vely); - } - } - - return(newstate); -} - -static int boogy = 0; -int KlownCollide( CGameCharacter *me, CGameCharacter *other, CGameLevel *level ) -{ - KLOWN_DATA *pKlown = (KLOWN_DATA *) me->mpPrivateData; - RECT myRect, otherRect; - LPRECT pmyRect, potherRect; - - if ((pKlown->curState == GAME_OVER) || - (pKlown->curState == IS_DEAD)) - return(ACTION_COMPLETED); - - - pmyRect = me->GetRect(); - potherRect = other->GetRect(); - memcpy(&myRect, pmyRect, sizeof(RECT)); - memcpy(&otherRect, potherRect, sizeof(RECT)); - - if (lstrcmpi(other->GetName(), "Pie") == 0) - { - // got hit by a pie, so decrement HitsLeft - int velx, vely; - other->GetVelocity(&velx, &vely); - switch (pKlown->curState) - { - case STAND_LEFT: - case WALK_LEFT: - case RUN_LEFT: - pKlown->pushedState = (velx < 0) ? HIT_BACK_L : HIT_FACE_L; - break; - case STAND_RIGHT: - case WALK_RIGHT: - case RUN_RIGHT: - pKlown->pushedState = (velx < 0) ? HIT_FACE_R : HIT_BACK_R; - break; - } - } - else - { - // hit another solid body... need to move out of the way: - int posx, posy; - int posx2, posy2; - - if ( (myRect.right < otherRect.left) || - (myRect.left > otherRect.right) - ) - return(ACTION_COMPLETED); - - me->GetXY(&posx, &posy); - other->GetXY(&posx2, &posy2); - - // back up... - if (posx2 < posx) - pKlown->pushedState = INT_COLLIDED_ON_LEFT; - else if (posx2 > posx) - pKlown->pushedState = INT_COLLIDED_ON_RIGHT; - else - { - // coincident... how to handle this? - if (++boogy % 2) - pKlown->pushedState = IN_RIGHT; - else - pKlown->pushedState = OUT_RIGHT; - } - } - return(ACTION_COMPLETED); -} diff --git a/sdk/samples/iklowns/cgkrusty.def b/sdk/samples/iklowns/cgkrusty.def deleted file mode 100644 index c82f2b1..0000000 --- a/sdk/samples/iklowns/cgkrusty.def +++ /dev/null @@ -1,8 +0,0 @@ -LIBRARY KRUSTY - -DESCRIPTION 'CGameCharacter Implementation DLL: Krusty' - -EXPORTS - Ident @1 - Info @2 - diff --git a/sdk/samples/iklowns/cgkrusty.mak b/sdk/samples/iklowns/cgkrusty.mak deleted file mode 100644 index f9af8ec..0000000 --- a/sdk/samples/iklowns/cgkrusty.mak +++ /dev/null @@ -1,202 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "CGKRUSTY.MAK" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -MTL=MkTypLib.exe -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "retail" -# PROP BASE Intermediate_Dir "retail" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : $(OUTDIR)\krusty.dll $(OUTDIR)/CGKRUSTY.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE CPP /nologo /MT /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /MT /W3 /GX /YX /O2 /I "..\..\inc" /I ".\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /c -# SUBTRACT CPP /Fr -CPP_PROJ=/nologo /MT /W3 /GX /YX /O2 /I "..\..\inc" /I ".\include" \ - /D "WIN32" /D "STRICT" /D "NDEBUG" /D "_WINDOWS"\ - /Fp$(OUTDIR)/"CGKRUSTY.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -BSC32_SBRS= \ - -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"CGKRUSTY.bsc" - -$(OUTDIR)/CGKRUSTY.bsc : $(OUTDIR) $(BSC32_SBRS) -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /MACHINE:I386 /OUT:$(OUTDIR)\"krusty.dll" -# SUBTRACT LINK32 /INCREMENTAL:yes -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO\ - /SUBSYSTEM:windows,4.0 /DLL /INCREMENTAL:no /PDB:$(OUTDIR)/"CGKRUSTY.pdb"\ - /MACHINE:I386 /DEF:".\CGKRUSTY.DEF" /OUT:$(OUTDIR)\"krusty.dll"\ - /IMPLIB:$(OUTDIR)/"CGKRUSTY.lib" -DEF_FILE=.\CGKRUSTY.DEF -LINK32_OBJS= \ - $(INTDIR)/CGKRUSTY.OBJ \ - $(INTDIR)/CGINPUT.OBJ - -$(OUTDIR)\krusty.dll : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\krusty.dll krusty.dll - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "debug" -# PROP BASE Intermediate_Dir "debug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)\krusty.dll $(OUTDIR)/CGKRUSTY.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -# ADD BASE CPP /nologo /MT /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /MT /W3 /GX /Zi /YX /Od /I "..\..\inc" /I ".\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /c -# SUBTRACT CPP /Fr -CPP_PROJ=/nologo /MT /W3 /GX /Zi /YX /Od /I "..\..\inc" /I ".\include" \ - /D "WIN32" /D "STRICT" /D "_DEBUG" /D "_WINDOWS"\ - /Fp$(OUTDIR)/"CGKRUSTY.pch" /Fo$(INTDIR)/ /Fd$(OUTDIR)/"CGKRUSTY.pdb" /c -CPP_OBJS=.\debug/ -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -BSC32_SBRS= \ - -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"CGKRUSTY.bsc" - -$(OUTDIR)/CGKRUSTY.bsc : $(OUTDIR) $(BSC32_SBRS) -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /DEBUG /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /INCREMENTAL:no /DEBUG /MACHINE:I386 /OUT:$(OUTDIR)\"krusty.dll" -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO\ - /SUBSYSTEM:windows,4.0 /DLL /INCREMENTAL:no /PDB:$(OUTDIR)/"CGKRUSTY.pdb" /DEBUG\ - /MACHINE:I386 /DEF:".\CGKRUSTY.DEF" /OUT:$(OUTDIR)\"krusty.dll"\ - /IMPLIB:$(OUTDIR)/"CGKRUSTY.lib" -DEF_FILE=.\CGKRUSTY.DEF -LINK32_OBJS= \ - $(INTDIR)/CGKRUSTY.OBJ \ - $(INTDIR)/CGINPUT.OBJ - -$(OUTDIR)\krusty.dll : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\krusty.dll krusty.dll - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\CGKRUSTY.CPP -DEP_CGKRU=\ - .\CGCHDLL.H\ - .\CGCHAR.H\ - .\CGTIMER.H\ - .\CGINPUT.H\ - .\CGUPDATE.H\ - .\CGACTION.H\ - .\CGGRAPH.H\ - .\INCLUDE\LINKLIST.H\ - .\CGSPRITE.H\ - .\CGLEVEL.H\ - .\CGSCREEN.H\ - .\CGBITBUF.H\ - .\CGDLIST.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGKRUSTY.OBJ : $(SOURCE) $(DEP_CGKRU) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGKRUSTY.DEF -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGINPUT.CPP -DEP_CGINP=\ - .\CGINPUT.H - -$(INTDIR)/CGINPUT.OBJ : $(SOURCE) $(DEP_CGINP) $(INTDIR) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/iklowns/cglevel.cpp b/sdk/samples/iklowns/cglevel.cpp deleted file mode 100644 index 25a9bd1..0000000 --- a/sdk/samples/iklowns/cglevel.cpp +++ /dev/null @@ -1,886 +0,0 @@ -/*===========================================================================*\ -| -| File: cglevel.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include - -#include "cggraph.h" -#include "cglevel.h" -#include "cgtimer.h" -#include "cgchdll.h" -#include "cgchrint.h" -#include "strrec.h" -#include "cginput.h" -#include "cgchar.h" -#include "cgimage.h" -#include "cgmidi.h" -#include "cgremote.h" -#include "cgsound.h" -#include "cgglobl.h" -#include "cgtext.h" -#include "cgrsrce.h" - -void dbgprintf(char *fmt,...); - -extern LPSTR NewStringResource( - HINSTANCE hInst, - int idString -); -extern void GetRectFromProfile(RECT &, LPSTR, LPSTR, LPSTR); - -extern CGameTimer * Timer; -static RECT WholeScreen = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT }; -HDC LoadBitmapFile ( - LPSTR pBitmapFile -); -#define BASE_HWND ghMainWnd - -/*---------------------------------------------------------------------------*\ -| -| Class CGameLevel -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -// this is ONLY for the Klown; it must match the corresponding entry in cgkrusty.cpp -typedef struct -{ - int curState; - int LastMouseX; - int LastMouseY; - DWORD timeLastUpdate; - int HitsLeft; - int pushedState; - CGameCharacter * myPie; - int type; // 0 = main; 1=computer; 2= second; - int IGotKilled; -} KLOWN_DATA; -extern int gGameMode; -CGameLevel::CGameLevel( - char *pFileName, - TCHAR * pLevelName, - CGameTimer* pTimer, - CGameInput* pInput, - CGameScreen* pScreen - ) : mpGraphics( NULL ), - mpTimer( pTimer ), - mpInput( pInput ), - mpScreen( pScreen ), - mOffsetX( 0 ), - mOffsetY( 0 ), - mFrameTime( 0 ), - mpGraphicsKey( NULL ), - mFastKlown( FALSE ), - mpProfile( NULL ) -{ - char DllList[256]; - - mMainKlown = NULL; - // first scan internal table of characters: - LoadCharInfo( NULL ); - // Grab info from the GAM file; look for character DLLs and load them... - lstrcpy(DllList, ""); - GetPrivateProfileString("General", "DLLS", "", DllList, 255, pFileName); - if (strlen(DllList) > 0) - { - CStringRecord crec(DllList, ","); - int x; - char dlldir[260]; - char *p; - - lstrcpy( dlldir, pFileName ); - p = strrchr( dlldir, '/' ); - if ( p == NULL ) - p = strrchr( dlldir, '\\' ); - if ( p != NULL ) - lstrcpy( p + 1, "*.dll" ); - - - for (x=0; x 0) - { - CStringRecord crec(SoundList, ","); - for (int x=0; xSetPalette( paletteFile ); - } - - char graphicsName[256]; - GetPrivateProfileString( - pLevName, - "Graphics", - "", - graphicsName, - sizeof( graphicsName ), - pFileName - ); - - // keep a copy of the section name - mpGraphicsKey = new char[lstrlen(graphicsName)+1]; - lstrcpy( mpGraphicsKey, graphicsName ); - - mpGraphics = new CGameDisplayList(pFileName, graphicsName, this); - - // Add computer opponent(s), second klown, if needed: - mGameType = gGameMode; - mNumComputerKlowns = - mGameType == 0 ? - 1 : - 0 ; - memset(&mComputerKlowns[0], 0, sizeof(mComputerKlowns)); - GetPrivateProfileString("General", "RoboKlown", "", DllList, sizeof(DllList), pFileName); - int posx, posy; - mMainKlown->GetXY(&posx, &posy); - for (int x=0; xGetMinZ(), - mMainKlown->GetMaxZ(), posx + mMainKlown->GetCurWidth() * 2, - posy, NULL); - - if (mComputerKlowns[x]) - { - mpGraphics->Insert(mComputerKlowns[x]); - KLOWN_DATA *data = (KLOWN_DATA *) mComputerKlowns[x]->mpPrivateData; - if (data) - data->type = 1; // computer opponent; - } - } - - // if playing other person on same machine, create opponent; - if (mGameType == 1) - { - // create second klown - GetPrivateProfileString("General", "SecondKlown", "", DllList, sizeof(DllList), pFileName); - mSecondKlown = new CGameCharacter(pFileName, DllList, graphicsName, this, - mMainKlown->GetMinZ(), - mMainKlown->GetMaxZ(), posx + mMainKlown->GetCurWidth() * 2 , posy, NULL); - - if (mSecondKlown) - { - mpGraphics->Insert(mSecondKlown); - KLOWN_DATA *data = (KLOWN_DATA *) mSecondKlown->mpPrivateData; - if (data) - data->type = 2; // second (human) opponent; - } - - } - else - mSecondKlown = NULL; - - mpUpdateList = new CGameUpdateList; - mpUpdateList->AddRect(WholeScreen); -} - -CGameCharacter * CGameLevel::Add ( - char *name, - int curz, - int curx, - int cury, - void *pNewObjID) -{ - CGameCharacter * newchar; - - if (mpGraphics == NULL) - return(NULL); - - newchar = new CGameCharacter(pFilName, name, mpGraphicsKey, this, curz, curz, curx, cury, pNewObjID); - if (newchar) - { - mpGraphics->Insert(newchar); - } - return(newchar); -} - -CGameLevel::~CGameLevel( ) -{ - delete[] mpProfile; - delete mpGraphics; - delete pLevName; - delete pFilName; - delete mpGraphicsKey; - delete mpUpdateList; -} - -BOOL gameover = FALSE; -BOOL quit = FALSE; -BOOL showing = FALSE; -BOOL showFrameRate = FALSE; -void CGameLevel::GameOver() -{ - gameover = TRUE; -} - -void -CGameLevel::StopAnimating() -{ - showing = FALSE; -} - -void CGameLevel::Animate( - HWND hwndParent, - CGameScreen * pScreen - ) -{ - SetCapture( hwndParent ); // so we get mouse clicks - - // turn off the cursor - HCURSOR hOldCursor = SetCursor( NULL ); - -// pScreen->SetMode( SCREEN_WIDTH, SCREEN_HEIGHT, 8 ); - - showing = TRUE; - MSG msg; - - Timer->Time = timeGetTime(); // * 60 / 1000; - - UINT lastTime = Timer->Time; - mFrameTime = lastTime; - UINT elapsed = 0; - -#define DEBOUNCE_FRAMES 12 - static int debounceF2 = 0; - static int debounceF3 = 0; - static int debounceF5 = 0; - static int debounceF9 = 0; - -#define FRAMERATE - -#define SCORE_WIDTH 64 -#define SCORE_HEIGHT 64 - - CGameDSBitBuffer* pScoreFrameBufferLeft; - CGameDSBitBuffer* pScoreFrameBufferRight; - - HDC hdcWindow = GetDC(hwndParent); - HDC hdcScoreLeft = CreateCompatibleDC(hdcWindow); - HDC hdcScoreRight = CreateCompatibleDC(hdcWindow); - ReleaseDC(hwndParent, hdcWindow); - - pScoreFrameBufferLeft = new CGameDSBitBuffer( SCORE_WIDTH, SCORE_HEIGHT); - pScoreFrameBufferRight = new CGameDSBitBuffer( SCORE_WIDTH, SCORE_HEIGHT); - SelectObject(hdcScoreLeft, pScoreFrameBufferLeft->GetHBitmap()); - SelectObject(hdcScoreRight, pScoreFrameBufferRight->GetHBitmap()); - SetBkMode(hdcScoreLeft, TRANSPARENT); - SetBkMode(hdcScoreRight, TRANSPARENT); - - // set up our cool font - LOGFONT logFont; - HANDLE hFont; - memset(&logFont, 0, sizeof(LOGFONT)); - logFont.lfHeight = SCORE_HEIGHT; //maxHeight; - logFont.lfPitchAndFamily = FF_ROMAN; - hFont = CreateFontIndirect(&logFont); - SelectObject(hdcScoreLeft, hFont); - SetTextColor(hdcScoreLeft, PALETTEINDEX(4)); - - SelectObject(hdcScoreRight, hFont); - SetTextColor(hdcScoreRight, PALETTEINDEX(4)); - - int lastScoreLeft = -1; - int lastScoreRight = -1; - -#ifdef FRAMERATE -#define FR_WIDTH 32 -#define FR_HEIGHT 32 - - UINT frames = 0; - UINT frameTime = timeGetTime(); - - // create a memory bitmap for our frame text - CGameDSBitBuffer* pFrameBuffer; - - HDC hdc = GetDC( hwndParent ); - HDC hdcFrame = CreateCompatibleDC( hdc ); - - pFrameBuffer = new CGameDSBitBuffer( FR_WIDTH, FR_HEIGHT); - SelectObject( hdcFrame, pFrameBuffer->GetHBitmap() ); - // set up our cool font - LOGFONT logFont2; - HANDLE hFont2; - memset(&logFont2, 0, sizeof(LOGFONT)); - logFont2.lfHeight = FR_HEIGHT; //maxHeight; - logFont2.lfPitchAndFamily = FF_ROMAN; - hFont2 = CreateFontIndirect(&logFont2); - SelectObject(hdcFrame, hFont2); - SetTextColor(hdcFrame, COLOR_RED); - SetBkMode(hdcFrame, TRANSPARENT); - - memset(pFrameBuffer->GetBits(), 1, FR_WIDTH * FR_HEIGHT); - TextOut( hdcFrame, 0,0, "30", 2 ); - - frames = 0; -#endif // FRAMERATE - - Timer->Resume(); - if (gMusicOn) - { - resumeMusic(); - } -#ifndef DEBUG - HANDLE hprocess; - hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); - SetPriorityClass(hprocess, HIGH_PRIORITY_CLASS ); - CloseHandle(hprocess); -#endif - - while ( showing ) { - Timer->Time = timeGetTime(); - UINT time = Timer->Time; - - if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE | PM_NOYIELD ) ) { - TranslateMessage(&msg); - - if ((msg.message == WM_ACTIVATEAPP) && - (LOWORD(msg.wParam) == WA_INACTIVE)) - { - showing = FALSE; - DispatchMessage(&msg); - continue; - } - else - DispatchMessage(&msg); - } - - if (mpInput->GetKeyboard(VK_ESCAPE) || - mpInput->GetKeyboard(VK_F12)) - { - showing = FALSE; - if (!mpInput->GetKeyboard(VK_CONTROL)) - { - quit = TRUE; - } - continue; - } - - // toggles need to be debounced - if (mpInput->GetKeyboard(VK_F2) && (debounceF2 == 0)) - { - // mute! - gMusicOn = !gMusicOn; - if (gMusicOn) - { - resumeMusic(); - } else { - pauseMusic(); - } - debounceF2 = DEBOUNCE_FRAMES; - } - - if (debounceF2) - --debounceF2; - - if (mpInput->GetKeyboard(VK_F3) && (debounceF3 == 0)) - { - extern BOOL gbQuiet; - SetSilence(!gbQuiet); - debounceF3 = DEBOUNCE_FRAMES; - } - if (debounceF3) - --debounceF3; - - if (mpInput->GetKeyboard(VK_F9) && (debounceF9 == 0)) - { - mFastKlown = !mFastKlown; - debounceF9 = DEBOUNCE_FRAMES; - } - - if (debounceF9) - --debounceF9; - -#ifdef FRAMERATE - if (mpInput->GetKeyboard(VK_F5) && (debounceF5 == 0)) - { - showFrameRate = !showFrameRate; - debounceF5 = DEBOUNCE_FRAMES; - } - - if (debounceF5) - --debounceF5; -#endif - - lastTime = time; - - // If we are playing a network game, we - // poll here synchronously for the remote network activity - { - extern void PollForRemoteReceive( void ); - - if ( mGameType > 1 ) { - PollForRemoteReceive(); - } - } - - // !!! if we want to limit our framerate, put a check here for elapsed time - { - mFrameTime = time; - - // let each object update position, get input, etc - mpGraphics->Update(this, mpUpdateList); - - // let each object render its graphical image - mpGraphics->Render(this, pScreen, mpUpdateList); - mpUpdateList->Clear(); - - // get the correct score to show... there is always at least *one* - KLOWN_DATA * pKlown; - RECT score_rect; - char scorebuf[5]; - pKlown = (KLOWN_DATA *) mMainKlown->mpPrivateData; - - score_rect.left = 10; - score_rect.right = 10+SCORE_WIDTH; - score_rect.top = 10; - score_rect.bottom = 10+SCORE_HEIGHT; - mpUpdateList->AddRect(score_rect); - - if (pKlown->HitsLeft != lastScoreLeft) - { - lastScoreLeft = pKlown->HitsLeft; - - wsprintf(scorebuf, "%d", pKlown->HitsLeft); - - memset(pScoreFrameBufferLeft->GetBits(), 1, SCORE_WIDTH * SCORE_HEIGHT); - - TextOut(hdcScoreLeft, 0, 0, scorebuf, lstrlen(scorebuf)); - } - pScreen->TransRender(10,10,SCORE_WIDTH, SCORE_HEIGHT, - pScoreFrameBufferLeft,0,0); - - switch (mGameType) - { - case 0: // against computer - pKlown = (KLOWN_DATA *) mComputerKlowns[0]->mpPrivateData; - break; - - case 1: - pKlown = (KLOWN_DATA *) mSecondKlown->mpPrivateData; - break; - - default: - pKlown = NULL; - break; - } - if (pKlown != NULL) - { - score_rect.left = SCREEN_WIDTH -10 - SCORE_WIDTH; - score_rect.right = SCREEN_WIDTH -10; - mpUpdateList->AddRect(score_rect); - - if (pKlown->HitsLeft != lastScoreRight) - { - lastScoreRight = pKlown->HitsLeft; - wsprintf(scorebuf, "%d", pKlown->HitsLeft); - memset(pScoreFrameBufferRight->GetBits(), 1, - SCORE_WIDTH * SCORE_HEIGHT); - TextOut(hdcScoreRight, 0, 0, scorebuf, lstrlen(scorebuf)); - } - pScreen->TransRender(SCREEN_WIDTH -10-SCORE_WIDTH,10, - SCORE_WIDTH, SCORE_HEIGHT, - pScoreFrameBufferRight,0,0); - } - -#ifdef FRAMERATE - if (showFrameRate) - { - ++frames; - UINT newTime = timeGetTime(); - UINT dTime = newTime - frameTime; - if (dTime >= 1000 ) - { - char buf[4]; - - memset(pFrameBuffer->GetBits(), 1, FR_WIDTH * FR_HEIGHT); - wsprintf(buf, "%d", frames / (dTime / 1000) ); - TextOut( hdcFrame, 0,0, buf, lstrlen(buf) ); - - frames = 0; - frameTime = newTime; - } - pScreen->TransRender( - 320 - (FR_WIDTH >> 1), - 10, - FR_WIDTH, - FR_HEIGHT, - pFrameBuffer, - 0, - 0 - ); - } - else - { - // keep frametime updated - frameTime = time; - } -#endif // FRAMERATE - - // update the screen - pScreen->PageFlip(); - mpInput->UpdateJoystick(); - - if (gameover) - { - RECT rect; - char tempstring[20]; - pKlown = (KLOWN_DATA *) mMainKlown->mpPrivateData; - - Sleep(2000); - - GetPrivateProfileString( pLevName, "WinLose", "end.bmp", tempstring, 19, pFilName); - - CGameDIB * myDib = new CGameDIB(tempstring); - CGameDSBitBuffer * myBuf = new CGameDSBitBuffer(myDib); - - if (myBuf) - { - RECT rectdtop; - - HDC hdcWindow = GetDC(hwndParent); - HDC hdc = CreateCompatibleDC(hdcWindow); - ReleaseDC(hwndParent, hdcWindow); - - rectdtop.left = 0; - rectdtop.right = SCREEN_WIDTH; - rectdtop.top = 0; - rectdtop.bottom = SCREEN_HEIGHT; - mpUpdateList->AddRect(rectdtop); - - SelectObject(hdc, myBuf->GetHBitmap()); - // make the gameover bitmap fill current screen - rect = rectdtop; - - CGameText * pCtext = new CGameText (hdc, &rect, 12,1); - - if (pCtext) - { - int ix, ixend; - pKlown = (KLOWN_DATA *) mMainKlown->mpPrivateData; - pKlown->curState = 0; - - ix = pKlown->IGotKilled ? IDS_LOSE_START : IDS_WIN_START; - ixend = pKlown->IGotKilled ? IDS_LOSE_END : IDS_WIN_END; - // load strings... - while (ix <= ixend) - { - char *pChoice = NewStringResource(ghInst, ix); - pCtext->AddLine(pChoice, COLOR_YELLOW); - ++ix; - } - - // Overlay text on bitmap - pCtext->TextBlt(); - delete pCtext; - } - - // - // Display option screen! - pScreen->Render( - 0, - 0, - SCREEN_WIDTH, - SCREEN_HEIGHT, - myBuf, - 0, - 0, - SRCCOPY - ); - - pScreen->PageFlip(); - Sleep(5000); - pScreen->PageFlip(); - DeleteDC(hdc); - delete myBuf; - } - delete myDib; - - // reset igotkilled flag... - pKlown->IGotKilled = 0; - if (mComputerKlowns[0]) - { - pKlown = (KLOWN_DATA *) mComputerKlowns[0]->mpPrivateData; - if (pKlown) - { - pKlown->curState = 0; - pKlown->IGotKilled = 0; - } - - } - if (mSecondKlown) - { - pKlown = (KLOWN_DATA *) mSecondKlown->mpPrivateData; - if (pKlown) - { - pKlown->curState = 0; - pKlown->IGotKilled = 0; - } - } - - gameover = FALSE; - lastScoreLeft = lastScoreRight = -1; - } // if (gameover) - } // limit block - } // while - - Timer->Pause(); - SetCursor( hOldCursor ); - ReleaseCapture( ); - - if (gMusicOn) - { - pauseMusic(); - } -#ifndef DEBUG - hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); - SetPriorityClass(hprocess, IDLE_PRIORITY_CLASS ); - CloseHandle(hprocess); -#endif - -#ifdef FRAMERATE - DeleteDC( hdcFrame ); - DeleteObject(hFont2); - delete pFrameBuffer; -#endif - - DeleteDC( hdcScoreLeft ); - DeleteDC( hdcScoreRight ); - - DeleteObject(hFont); - delete pScoreFrameBufferLeft; - delete pScoreFrameBufferRight; - - ReleaseDC( hwndParent, hdc ); - - if (quit) - PostQuitMessage(0); -} - -void CGameLevel::ForceOnScreen(int *x, int *y, int wide, int high, BOOL primary) -{ - // if the x or y coords are off screen: - // 1) force screen to be there - unless - // 2) the coords are impossible, then adjust them! - -#define ROUGH_WIDTH 96 - // keep main char in center of screen - static RECT center = - { - SCREEN_WIDTH / 4, - 0, - SCREEN_WIDTH - (SCREEN_WIDTH / 4) - ROUGH_WIDTH, - SCREEN_HEIGHT - - }; - - if (*x < -mMaxWorldX) - *x = -mMaxWorldX; - else - { - if (*x > (mMaxWorldX-wide)) - *x = mMaxWorldX-wide; - } - - if (*y < -mMaxWorldY) - *y = -mMaxWorldY; - else - { - if (*y > (mMaxWorldY-wide)) - *y = mMaxWorldY-wide; - } - - if (primary) - { - if ((*x < Screen2WorldX(center.left)) && (mOffsetX > -mMaxWorldX)) - { - mOffsetX = max(-mMaxWorldX, mOffsetX - (Screen2WorldX(center.left) - *x)); - mpUpdateList->AddRect(WholeScreen); - } - else - { - if ((*x > Screen2WorldX(center.right)) && (mOffsetX < (mMaxWorldX-SCREEN_WIDTH))) - { - mOffsetX = min((mMaxWorldX-SCREEN_WIDTH), mOffsetX + (*x - Screen2WorldX(center.right))); - mpUpdateList->AddRect(WholeScreen); - } - } - - if ((*y < Screen2WorldY(center.top)) && (mOffsetY > -mMaxWorldY)) - { - mOffsetY = max(-mMaxWorldY, mOffsetY - (Screen2WorldY(center.top) - *y)); - mpUpdateList->AddRect(WholeScreen); - } - else - { - if ((*y > Screen2WorldY(center.bottom)) && (mOffsetY < (mMaxWorldY-SCREEN_HEIGHT))) - { - mOffsetY = min((mMaxWorldY-SCREEN_HEIGHT), mOffsetY + (*y - Screen2WorldY(center.bottom))); - mpUpdateList->AddRect(WholeScreen); - } - } - } -} - -void -CGameLevel::MatchProfile( - char* pGamFile - ) -{ - static char* pDefault = "Default"; - char profBuf[256]; - char dataBuf[256]; - - // first check to see if we need to force a given profile - GetPrivateProfileString( - "General", - "ForceProfile", - "", // no default - profBuf, - sizeof( profBuf ), - pGamFile - ); - - if (lstrlen(profBuf) >0) - { - mpProfile = new char[lstrlen(profBuf)+1]; - lstrcpy( mpProfile, profBuf ); - } - else - { - GetPrivateProfileString( - "Profiles", - NULL, // get all - "", // no default - profBuf, - sizeof( profBuf ), - pGamFile - ); - - - for (char *pChar = profBuf; *pChar; pChar++) - { - GetPrivateProfileString( - "Profiles", - pChar, - "", - dataBuf, - sizeof( dataBuf ), - pGamFile - ); - - // parse the data string into fields - CStringRecord fields( dataBuf, "," ); - - MC_PROCESSOR processor = (MC_PROCESSOR) atoi(fields[0]); - MC_BUSTYPE bus = (MC_BUSTYPE) atoi(fields[1]); - - // memory fields are in megabytes - DWORD sysMem = atoi(fields[2]) * 1024 * 1024; - DWORD vidMem = atoi(fields[3]) * 1024 * 1024; - - MC_VIDSYS vidSys = (MC_VIDSYS) atoi(fields[4]); - - if ((gMachineCaps.processor >= processor) && - (gMachineCaps.bus >= bus) && - (gMachineCaps.sysMemory >= sysMem) && - (gMachineCaps.vidMemory >= vidMem) && - (gMachineCaps.vidSystem >= vidSys)) - { - mpProfile = new char[lstrlen(pChar)+1]; - lstrcpy( mpProfile, pChar ); - break; - } - - pChar += lstrlen( pChar ); // move beyond terminator - } - - // if we didn't find it, use default - if (mpProfile == NULL) - { - mpProfile = new char[lstrlen(pDefault)+1]; - lstrcpy( mpProfile, pDefault ); - } - } -} diff --git a/sdk/samples/iklowns/cglevel.h b/sdk/samples/iklowns/cglevel.h deleted file mode 100644 index a063ff1..0000000 --- a/sdk/samples/iklowns/cglevel.h +++ /dev/null @@ -1,228 +0,0 @@ -/*===========================================================================*\ -| -| File: cglevel.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGLEVEL_H -#define CGLEVEL_H - -#include "cgdlist.h" - -// We use millisecond timing values; our velocity is specified in -// units of (pixels/256) per millisecond -// This macro converts a velocity and elapsed milliseconds into sub-pixels -#define SUBPIXEL_DELTA( vel, ms ) (vel * ms) - -class CGameTimer; -class CGameInput; -class CGameScreen; -class CGameGraphic; -class CGameCharacter; - -class CGameLevel -{ -public: - CGameLevel( - char* pFileName, - char* pLevelName, - CGameTimer* pTimer, - CGameInput* pInput, - CGameScreen* pScreen - ); - - virtual ~CGameLevel(); - - virtual void Animate(HWND, CGameScreen* pScreen); - - virtual int GetOffsetX() - { - return mOffsetX; - } - - virtual int GetOffsetY() - { - return mOffsetY; - } - - virtual int GetMaxX() - { - return mMaxWorldX; - } - - virtual int GetMaxY() - { - return mMaxWorldY; - } - - virtual int Screen2WorldX( int screenX ) - { - return screenX + mOffsetX; - }; - - virtual int Screen2WorldY( int screenY ) - { - return screenY + mOffsetY; - }; - - virtual int World2ScreenX( int worldX ) - { - return worldX - mOffsetX; - }; - - virtual int World2ScreenY( int worldY ) - { - return worldY - mOffsetY; - }; - - virtual int Screen2WorldX( int screenX, int parallax ) - { - return screenX + (mOffsetX >> parallax); - }; - - virtual int Screen2WorldY( int screenY, int parallax ) - { - return screenY + (mOffsetY >> parallax); - }; - - virtual int World2ScreenX( int worldX, int parallax ) - { - return worldX - (mOffsetX >> parallax); - }; - - virtual int World2ScreenY( int worldY, int parallax ) - { - return worldY - (mOffsetY >> parallax); - }; - - virtual void SetOffsetX(int newx) - { - if ((newx >= 0) && (newx <= mMaxWorldX)) - mOffsetX = newx; - } - - virtual void SetOffsetY(int newy) - { - if ((newy >= 0) && (newy <= mMaxWorldY)) - mOffsetY = newy; - } - - virtual void ForceOnScreen(int *x, int *y, int wide, int high, BOOL primary=TRUE); - - virtual CGameTimer* GetTimer() - { - return mpTimer; - } - - virtual CGameInput* GetInput() - { - return mpInput; - } - - virtual CGameScreen* GetScreen() - { - return mpScreen; - } - - virtual CGameCharacter * Add(char *name, int curz, - int curx=0, int cury=0, - void *pObjID=NULL); - - virtual void Remove(CGameGraphic * stale) - { - if (stale != NULL) - mpGraphics->Remove(stale); - } - - virtual void AddInvalidRect( LPRECT rect) - { - if (mpUpdateList) - mpUpdateList->AddRect(*rect); - } - - virtual char *GetLevelName() - { - return (pLevName); - } - - virtual char *GetProfileName() - { - return (pFilName); - } - - virtual char *GetSectionName() - { - return (pLevName); - } - - virtual int GetFrameTime() - { - return mFrameTime; - } - - virtual void GameOver(); - virtual void StopAnimating(); - virtual void ReSort() - { - mpGraphics->ReSort(); - } - - // members which let us access the game type and main characters directly - // from within the DLL - int mGameType; - int mNumComputerKlowns; - CGameCharacter *mMainKlown; // always the main player - CGameCharacter *mComputerKlowns[4]; // always the computer-generated klown(s) - CGameCharacter *mSecondKlown; // second players' klown - BOOL mFastKlown; - -protected: - // a level keeps a linked list of display objects, sorted in z-order - CGameDisplayList* mpGraphics; // our set of display objects - CGameUpdateList * mpUpdateList; - - int mMaxWorldX; // maximum x pixel value in our world - int mMaxWorldY; // maximum y pixel value in our world - - int mOffsetX; // current offset of screen within world - int mOffsetY; // current offset of screen within world - - int mFrameTime; // time at beginning of current frame - - CGameTimer* mpTimer; // ptr to the game's timer - CGameInput* mpInput; // ptr to the game's input object - CGameScreen* mpScreen; // ptr to the game's screen object - - char *pLevName; - char *pFilName; - char *mpGraphicsKey; // the .gam file section for our graphics list - - char* mpProfile; - - void MatchProfile( char* pFileName ); -}; - -#endif // CGLEVEL_H diff --git a/sdk/samples/iklowns/cgload.cpp b/sdk/samples/iklowns/cgload.cpp deleted file mode 100644 index c09a527..0000000 --- a/sdk/samples/iklowns/cgload.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/*===========================================================================*\ -| -| File: cgoption.cpp -| -| Description: -| Routines to display lines of text (from resource strings) overlayed on -| a bitmap. The text will be sized appropriately to fit within the -| rectangle specified in the profile. The user may hilight a particular -| line and the index of the line will be returned to the caller. -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgglobl.h" -#include "strrec.h" -#include "cgdib.h" -#include "cgscreen.h" -#include "cgmidi.h" -#include "cgsound.h" -#include "cgload.h" -#include "cgimage.h" - -#define BASE_HWND ghMainWnd - -extern HDC LoadBitmapFile (LPSTR pBitmapFile); -extern LPSTR NewStringResource( HINSTANCE hInst, int idString); - -// ---------------------------------------------------------- -// CLoadingScreen - -// ---------------------------------------------------------- -CLoadingScreen::CLoadingScreen( - CGameScreen* pScreen, - LPSTR pBitmapName, // bkgrnd bitmap - int iTextId, // resource text to overlay - POINT pt, // location of circle - TXTCOLOR color, // color of overlay texxt - RECT rect, - CSoundEffect *pSoundStart, // sound effect to play - CSoundEffect *pSoundUpdate, // sound effect to play - CSoundEffect *pSoundEnd, // sound effect to play - LPSTR MidiFile -) : pText( NULL ), - mpLoadBuffer( NULL ), - mpScreen( pScreen ) -{ - HBRUSH hBrush; - - HDC hdcScreen = GetDC(BASE_HWND); - ShowCursor(FALSE); - PatBlt(hdcScreen, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, BLACKNESS); - - hdcLoading = CreateCompatibleDC(hdcScreen); - - CLoadingScreen::pSoundStart = pSoundStart; - CLoadingScreen::pSoundUpdate = pSoundUpdate; - CLoadingScreen::pSoundEnd = pSoundEnd; - - if ((MidiFile != NULL) && (gMusicOn)) - { - playMusic(MidiFile, TRUE); - } - - CGameDIB loadDIB( pBitmapName ); - mWidth = loadDIB.GetWidth(); - mHeight = loadDIB.GetHeight(); - mpLoadBuffer = new CGameDSBitBuffer( &loadDIB ); - - // Load the bitmap - if (mpLoadBuffer) - { - SelectObject(hdcLoading, mpLoadBuffer->GetHBitmap()); - - hBrush = CreateSolidBrush(COLOR_YELLOW); - SelectObject(hdcLoading, hBrush); - SetBkMode(hdcLoading, TRANSPARENT); - - if (pSoundStart != NULL) - { - pSoundStart->Play(); - } - - Origin = pt; - - // Create text to be overlayed - pText = new CGameText(hdcLoading, &rect, 1, 1); - pText->AddLine(NewStringResource(ghInst, iTextId) - , color.main, color.shadow); - -// Don't display initially, 'cause palette ain't right yet. -#if 0 - pText->TextBlt(); - mpScreen->Render(0,0, mWidth, mHeight, mpLoadBuffer, 0, 0, SRCCOPY); - mpScreen->PageFlip(); -#endif - } - - ReleaseDC(BASE_HWND, hdcScreen); - curTotal = 0; -} - -#define MIN_RADIUS 5 -// ---------------------------------------------------------- -// Update - -// ---------------------------------------------------------- -void CLoadingScreen::Update( - int Increment -) -{ - int radius; - RECT rect; - - curTotal += Increment; - radius = curTotal; - - rect.left = Origin.x - radius; - rect.top = Origin.y - radius; - rect.right = Origin.x + radius; - rect.bottom = Origin.y + radius; - - Ellipse(hdcLoading, rect.left, rect.top, rect.right, rect.bottom); - pText->TextBlt(); - mpScreen->Render(0,0, mWidth, mHeight, mpLoadBuffer, 0, 0, SRCCOPY); - mpScreen->PageFlip(); - -} - -// ---------------------------------------------------------- -// Paint -// ---------------------------------------------------------- -void CLoadingScreen::Paint() -{ - mpScreen->Render(0,0, mWidth, mHeight, mpLoadBuffer, 0, 0, SRCCOPY); - mpScreen->PageFlip(); -} - -// ---------------------------------------------------------- -// ~CLoadingScreen - -// ---------------------------------------------------------- -CLoadingScreen::~CLoadingScreen() -{ - closeMusic(); - - delete pText; - - if (pSoundStart != NULL) - { - delete pSoundStart; - } - if (pSoundUpdate != NULL) - { - delete pSoundUpdate; - } - - RECT rect = {0,0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1}; - mpScreen->ColorFill(&rect, 0); - mpScreen->PageFlip(); - - if (pSoundEnd != NULL) - { - pSoundEnd->Play(); - } - - DeleteDC( hdcLoading ); - delete mpLoadBuffer; - ShowCursor(TRUE); -} diff --git a/sdk/samples/iklowns/cgload.h b/sdk/samples/iklowns/cgload.h deleted file mode 100644 index c7fb539..0000000 --- a/sdk/samples/iklowns/cgload.h +++ /dev/null @@ -1,77 +0,0 @@ -/*===========================================================================*\ -| -| File: cgload.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGLOAD_H -#define _CGLOAD_H - -#include "cgsound.h" -#include "cgtext.h" - -class CGameScreen; -class CGameDSBitBuffer; - -typedef struct _TXTCOLOR { - COLORREF main; - COLORREF shadow; -} TXTCOLOR; - -class CLoadingScreen { -private: - POINT Origin; - int curTotal; -// HDC hdcScreen; - HDC hdcLoading; - CGameText *pText; - CSoundEffect *pSoundStart; - CSoundEffect *pSoundUpdate; - CSoundEffect *pSoundEnd; - CGameScreen *mpScreen; - CGameDSBitBuffer *mpLoadBuffer; - int mWidth; - int mHeight; - -public: - - CLoadingScreen( - CGameScreen* pScreen, - LPSTR pBitmapName, - int StringId, - POINT pt, - TXTCOLOR color, - RECT rect, - CSoundEffect *pSoundStart=NULL, - CSoundEffect *pSoundUpdate=NULL, - CSoundEffect *pSoundEnd=NULL, - LPSTR MidiFile=NULL - ); - ~CLoadingScreen(); - void Update(int Increment=5); - void Paint(); -}; - -#endif diff --git a/sdk/samples/iklowns/cgmidi.cpp b/sdk/samples/iklowns/cgmidi.cpp deleted file mode 100644 index 3f1939a..0000000 --- a/sdk/samples/iklowns/cgmidi.cpp +++ /dev/null @@ -1,783 +0,0 @@ -/*===========================================================================*\ -| -| File: cgmidi.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include -#include -#include "cgmidi.h" -#include "MDSPlay.H" - - -#define FOURCC_MIDS mmioFOURCC('M','I','D','S') -#define FOURCC_fmt mmioFOURCC('f','m','t',' ') -#define FOURCC_data mmioFOURCC('d','a','t','a') - -// Format of structs within a MDS file -// -// 'fmt ' chunk -// -#define MDS_F_NOSTREAMID 0x00000001 -typedef struct -{ - DWORD dwTimeFormat; // Low word == time format in SMF format - DWORD cbMaxBuffer; // Guaranteed max buffer size - DWORD dwFlags; -} MIDSFMT; - -// 'data' chunk buffer header -// -typedef struct -{ - DWORD tkStart; // Absolute tick offset at start of buffer - DWORD cbBuffer; // Bytes in this buffer -} MIDSBUFFER; - -// An image handle points to this -// - -#define MDSI_F_RESET 0x00000001L -#define MDSI_F_LOOP 0x00000002L -#define MDSI_F_PAUSED 0x00000004L - -#define FOURCC_MDSI mmioFOURCC('M','D','S','I') - -#define V_HIMAGE(x) \ - if (((MDSIMAGE*)x)->fccSig != FOURCC_MDSI) \ - return MDS_ERR_INVALHANDLE; - -typedef struct -{ - FOURCC fccSig; // MDS image handle signature - MIDSFMT fmt; // MDS file format header - PBYTE pbBufferAlloc; // All MIDIHDR's/buffers - HMIDISTRM hms; // MIDI stream if open - DWORD fdwImage; // Generic flags - DWORD cBuffers; // Total buffers - DWORD cBuffersInUse; // Buffers MMSYSTEM owns right now -} MDSIMAGE; - -DWORD ParseImage(MDSIMAGE* pImage, PBYTE pbImage, DWORD cbImage); -BOOL Decompress(LPMIDIHDR lpmhSrc, LPMIDIHDR lpmhDst); - -void FAR PASCAL midiCallback(HMIDISTRM hms, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); - -#define MDS_F_IMAGEFLAGS (MDS_F_MEMORY|MDS_F_FILENAME) - -// LoadMDSImage -// -// Allocate space for the handle structure MDSImage and get the -// image into memory if it's in a file. Call ParseImage to -// allocate buffers and parse the image into them. -// -DWORD LoadMDSImage(HANDLE *hImage, PBYTE pbImage, DWORD cbImage, DWORD fdw) -{ - DWORD dwRet = MDS_SUCCESS; - MDSIMAGE* pImage = NULL; - BOOL fIsMapped = FALSE; - HANDLE hInFile = INVALID_HANDLE_VALUE; - HANDLE hInFileMap = NULL; - - // Must have one of the two image flags - // - if ((!(fdw & MDS_F_IMAGEFLAGS)) || - ((fdw & MDS_F_IMAGEFLAGS) == MDS_F_IMAGEFLAGS)) - { - dwRet = MDS_ERR_BADFLAGS; - goto Load_Cleanup; - } - - // Allocate the handle - // - pImage = (MDSIMAGE*)LocalAlloc(LPTR, sizeof(MDSIMAGE)); - if (!pImage) - { - dwRet = MDS_ERR_NOMEM; - goto Load_Cleanup; - } - - pImage->fccSig = FOURCC_MDSI; - pImage->hms = NULL; - pImage->cBuffersInUse = 0; - - - - // Read the image if we need to - // - if (!(fdw & MDS_F_MEMORY)) - { - fIsMapped = TRUE; - - // Try to map the file as an image - // - hInFile = CreateFile( - (LPSTR)pbImage, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - - pbImage = NULL; - if (INVALID_HANDLE_VALUE == hInFile) - { - dwRet = MDS_ERR_NOFILE; - goto Load_Cleanup; - } - - cbImage = GetFileSize(hInFile, NULL); - - hInFileMap = CreateFileMapping( - hInFile, NULL, PAGE_READONLY, 0, 0, NULL); - if (NULL == hInFileMap) - { - dwRet = MDS_ERR_NOFILE; - goto Load_Cleanup; - } - - pbImage = (PBYTE)MapViewOfFile( - hInFileMap, FILE_MAP_READ, 0, 0, 0); - if (NULL == pbImage) - { - dwRet = MDS_ERR_NOFILE; - goto Load_Cleanup; - } - } - - // pbImage now points to the file image in memory. Attempt to parse it. - // - dwRet = ParseImage(pImage, pbImage, cbImage); - -Load_Cleanup: - if (dwRet) - { - if (pImage) LocalFree((HLOCAL)pImage); - } - else - { - *hImage = (HANDLE)pImage; - } - - if (fIsMapped) - { - if (NULL != pbImage) UnmapViewOfFile(pbImage); - if (NULL != hInFileMap) CloseHandle(hInFileMap); - if (INVALID_HANDLE_VALUE != hInFile) CloseHandle(hInFile); - } - - return dwRet; -} - -// Given the file image, allocate MIDI stream buffers and put the -// image data into them. The file image will go away when LoadMDSImage -// returns, so this routine must save all important info somewhere off -// the handle structure pImage. -// -DWORD ParseImage(MDSIMAGE* pImage, PBYTE pbImage, DWORD cbImage) -{ - DWORD dwRet = MDS_SUCCESS; - DWORD cbChk; - DWORD idx; - MIDIHDR mhSrc; - LPMIDIHDR lpmh; - MIDSBUFFER mb; - - pImage->pbBufferAlloc = NULL; - - // Parse: RIFF + cbChk (size of rest of file) + MIDS - // - if ((cbImage < 2*sizeof(FOURCC) + sizeof(DWORD)) || - (FOURCC_RIFF != *(FOURCC*)pbImage) || - (FOURCC_MIDS != *(FOURCC*)(pbImage + sizeof(FOURCC) + sizeof(DWORD)))) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - - // Note: can't subtract off size of 'fmt ' FOURCC until we check against - // cbChk size... it's included in the RIFF chunk, not the header - // - cbChk = *(((PDWORD)pbImage)+1); - pbImage += sizeof(FOURCC) + sizeof(DWORD); - cbImage -= sizeof(FOURCC) + sizeof(DWORD); - - if (cbImage < cbChk) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - - pbImage += sizeof(FOURCC); - cbImage -= sizeof(FOURCC); - - - // Should have 'fmt ' chunk first - // - if ((cbImage < sizeof(FOURCC) + sizeof(DWORD)) || - (FOURCC_fmt != *(FOURCC*)pbImage) || - ((cbChk = *(PDWORD)(pbImage + sizeof(FOURCC))) > cbImage) || - cbChk < sizeof(pImage->fmt)) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - - pbImage += sizeof(FOURCC) + sizeof(DWORD); - cbImage -= sizeof(FOURCC) + sizeof(DWORD); - - // Already validated size, copy format chunk - // - pImage->fmt = *(MIDSFMT*)pbImage; - - pbImage += cbChk; - cbImage -= cbChk; - - // Should get buffers next - // - if ((cbImage < sizeof(FOURCC) + sizeof(DWORD)) || - (FOURCC_data != *(FOURCC*)pbImage) || - ((cbChk = *(PDWORD)(pbImage + sizeof(FOURCC))) > cbImage) || - cbChk < sizeof(DWORD)) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - - pImage->cBuffers = *(PDWORD)(pbImage + sizeof(FOURCC) + sizeof(DWORD)); - - pbImage += sizeof(FOURCC) + 2*sizeof(DWORD); - cbImage -= sizeof(FOURCC) + 2*sizeof(DWORD); - - // Now copy the data out, decompressing if needed - // - - // Total decompressed size including MIDIHDR's to hold them - // - // Allocate as one big block and put them into a buffer list - // - cbChk = pImage->cBuffers * (sizeof(MIDIHDR) + pImage->fmt.cbMaxBuffer); - pImage->pbBufferAlloc = (PBYTE)GlobalAllocPtr( - GMEM_MOVEABLE|GMEM_SHARE, cbChk); - if (NULL == pImage->pbBufferAlloc) - { - dwRet = MDS_ERR_NOMEM; - goto Parse_Cleanup; - } - - lpmh = (LPMIDIHDR)(pImage->pbBufferAlloc); - for (idx = pImage->cBuffers; idx; --idx) - { - lpmh->lpData = (LPSTR)(lpmh + 1); - lpmh->dwBufferLength = pImage->fmt.cbMaxBuffer; - lpmh->dwFlags = 0; - lpmh->dwUser = (DWORD)pImage; - lpmh->lpNext = NULL; - - if (cbImage < sizeof(mb)) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - - mb = *(MIDSBUFFER*)pbImage; - cbImage -= sizeof(mb); - pbImage += sizeof(mb); - - if (mb.cbBuffer > pImage->fmt.cbMaxBuffer || - mb.cbBuffer > cbImage) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - - if (!(pImage->fmt.dwFlags & MDS_F_NOSTREAMID)) - { - lpmh->dwBytesRecorded = mb.cbBuffer; - hmemcpy(lpmh->lpData, pbImage, mb.cbBuffer); - } - else - { - mhSrc.lpData = (LPSTR)pbImage; - mhSrc.dwBufferLength = mhSrc.dwBytesRecorded = mb.cbBuffer; - if (!Decompress(&mhSrc, lpmh)) - { - dwRet = MDS_ERR_BADFILE; - goto Parse_Cleanup; - } - } - - cbImage -= mb.cbBuffer; - pbImage += mb.cbBuffer; - - lpmh = (LPMIDIHDR)(((PBYTE)lpmh) + sizeof(MIDIHDR) + pImage->fmt.cbMaxBuffer); - } - - -Parse_Cleanup: - - if (dwRet) - { - if (pImage->pbBufferAlloc) { - GlobalFreePtr(pImage->pbBufferAlloc); - } - } - - return dwRet; -} - -// Compression is simply removing the DWORD of stream ID per event since it's -// 0 most of the time unless some really funky authoring is being done. This -// will save 1 of 3 DWORD's on a MIDI short event, reducing the file size -// to 2/3 of what it was. -// -BOOL Decompress(LPMIDIHDR lpmhSrc, LPMIDIHDR lpmhDst) -{ - LPDWORD lpSrc = (LPDWORD)lpmhSrc->lpData; - LPDWORD lpDst = (LPDWORD)lpmhDst->lpData; - DWORD cbSrc = lpmhSrc->dwBytesRecorded; - DWORD cbDst = lpmhDst->dwBufferLength; - DWORD cbExtra; - - // Total buffer length must be a DWORD multiple - // - if (cbSrc & 3) - return FALSE; - - // !!! OPTIMIZE THIS LOOP !!! - // - while (cbSrc) - { - // Need at least space for delta-t, stream-id, event DWORD - // - if (cbDst < 3 * sizeof(DWORD)) - return FALSE; - - - // Event delta-time - // - *lpDst++ = *lpSrc++; - cbSrc -= sizeof(DWORD); - - // Any event left? - // - if (!cbSrc) - return FALSE; - - // Stream ID - *lpDst++ = 0; - cbDst -= 2*sizeof(DWORD); - - // Now copy the actual event data - // - cbExtra = 0; - if ((*lpSrc) & 0x80000000L) - cbExtra = (*lpSrc) & 0x00FFFFFFL; - - // Long event length is byte aligned, but data is padded to next DWORD - // in file. - // - cbExtra = (cbExtra + 3) & ~3; - - // Event DWORD itself - // - *lpDst++ = *lpSrc++; - cbSrc -= sizeof(DWORD); - cbDst -= sizeof(DWORD); - - // Long event parameter data - // - if (cbExtra) - { - if (cbExtra > cbSrc || cbExtra > cbDst) - return FALSE; - - hmemcpy(lpDst, lpSrc, cbExtra); - } - -// assert(0 == (cbExtra % sizeof(DWORD))); - - lpDst += (cbExtra / sizeof(DWORD)); - lpSrc += (cbExtra / sizeof(DWORD)); - cbSrc -= cbExtra; - cbDst -= cbExtra; - } - - lpmhDst->dwBytesRecorded = (((LPBYTE)lpDst) - (LPBYTE)(lpmhDst->lpData)); - - return TRUE; -} - -// FreeMDSImage -// -// Get rid of all resources associated with this handle. Stops playback -// if running. -// -DWORD FreeMDSImage(HANDLE hImage) -{ - MDSIMAGE* pImage; - - V_HIMAGE(hImage); - pImage = (MDSIMAGE*)hImage; - - if (NULL != pImage->hms) - StopMDS(hImage); - - if (pImage->pbBufferAlloc) GlobalFreePtr(pImage->pbBufferAlloc); - - // Toast signature in case free'ing the block doesn't; this will - // cause future V_HIMAGE's to faile - // - pImage->fccSig = FOURCC_data; - - LocalFree((HLOCAL)pImage); - - return MDS_SUCCESS; -} - -// PlayMDS -// -// Start playback. -// Open the device if needed. -// Send the ready list -// -DWORD PlayMDS(HANDLE hImage, DWORD fdw) -{ - DWORD dwRet = MDS_SUCCESS; - MDSIMAGE* pImage; - LPMIDIHDR lpmh; - UINT uDeviceID; - BOOL fCloseOnFail = FALSE; - DWORD idx; - MIDIPROPTIMEDIV mptd; - - V_HIMAGE(hImage); - - pImage = (MDSIMAGE*)hImage; - - if (pImage->hms && !(pImage->fdwImage & MDSI_F_PAUSED)) - return MDS_ERR_BADSTATE; - - if (!(pImage->hms)) - { - fCloseOnFail = TRUE; - - // Starting from scratch. Try to open the MIDI device - // - uDeviceID = MIDI_MAPPER; - if (MMSYSERR_NOERROR != midiStreamOpen( - &pImage->hms, - &uDeviceID, - 1, - (DWORD)midiCallback, - 0L, - CALLBACK_FUNCTION)) - { - dwRet = MDS_ERR_MIDIERROR; - goto Play_Cleanup; - } - - mptd.cbStruct = sizeof(mptd); - mptd.dwTimeDiv = pImage->fmt.dwTimeFormat; - - if (MMSYSERR_NOERROR !=midiStreamProperty( - pImage->hms, (LPBYTE)&mptd, MIDIPROP_SET|MIDIPROP_TIMEDIV)) - { - dwRet = MDS_ERR_MIDIERROR; - goto Play_Cleanup; - } - - // Headers are put back into the ready queue by a midiOutReset on - // stop, but are not guaranteed to be in correct order. Resend - // directly from the allocated chunk-of-all-buffers - // - -// assert(0 == pImage->cBuffersInUse); - - lpmh = (LPMIDIHDR)(pImage->pbBufferAlloc); - for (idx = pImage->cBuffers; idx; --idx) - { - if (MMSYSERR_NOERROR != midiOutPrepareHeader( - (HMIDIOUT)pImage->hms, lpmh, sizeof(*lpmh)) || - MMSYSERR_NOERROR != midiStreamOut( - pImage->hms, lpmh, sizeof(*lpmh))) - { - dwRet = MDS_ERR_MIDIERROR; - goto Play_Cleanup; - } - - ++pImage->cBuffersInUse; - - lpmh = (LPMIDIHDR)(((PBYTE)lpmh) + sizeof(MIDIHDR) + lpmh->dwBufferLength); - } - } - - // Whether we're starting or resuming from paused, just need - // to restart - - pImage->fdwImage &= ~MDSI_F_LOOP; - if (fdw & MDS_F_LOOP) - pImage->fdwImage |= MDSI_F_LOOP; - - pImage->fdwImage &= ~MDSI_F_PAUSED; - if (MMSYSERR_NOERROR != midiStreamRestart( - pImage->hms)) - { - dwRet = MDS_ERR_MIDIERROR; - goto Play_Cleanup; - } - -Play_Cleanup: - - if (dwRet) - { - if (fCloseOnFail && pImage->hms) - StopMDS(hImage); - } - - return dwRet; -} - -// PauseMDS -// -// Pause the stream if it's playing -// -DWORD PauseMDS(HANDLE hImage) -{ - MDSIMAGE* pImage; - - V_HIMAGE(hImage); - - pImage = (MDSIMAGE*)hImage; - - if (NULL == pImage->hms) - return MDS_ERR_BADSTATE; - - if (pImage->fdwImage & MDSI_F_PAUSED) - return MDS_SUCCESS; - - if (MMSYSERR_NOERROR != midiStreamPause( - pImage->hms)) - return MDS_ERR_MIDIERROR; - - pImage->fdwImage |= MDSI_F_PAUSED; - - return MDS_SUCCESS; -} - -// StopMDS -// -// Stop the stream, reset to the start, close the device -// Do NOT free stream tho -// -DWORD StopMDS(HANDLE hImage) -{ - MDSIMAGE* pImage; - DWORD idx; - LPMIDIHDR lpmh; - - V_HIMAGE(hImage); - - pImage = (MDSIMAGE*)hImage; - - if (NULL == pImage->hms) - return MDS_ERR_BADSTATE; - - // Remove all the buffers from MMSYSTEM - // - pImage->fdwImage |= MDSI_F_RESET; - if (MMSYSERR_NOERROR != midiOutReset( - (HMIDIOUT)pImage->hms)) - { - pImage->fdwImage &= ~MDSI_F_RESET; - return MDS_ERR_MIDIERROR; - } - -// assert(0 == pImage->cBuffersInUse); - - // Unprepare everyone - // - lpmh = (LPMIDIHDR)(pImage->pbBufferAlloc); - for (idx = pImage->cBuffers; idx; --idx) - { - midiOutUnprepareHeader((HMIDIOUT)pImage->hms, lpmh, sizeof(*lpmh)); - lpmh = (LPMIDIHDR)(((PBYTE)lpmh) + sizeof(MIDIHDR) + lpmh->dwBufferLength); - } - - midiStreamClose(pImage->hms); - pImage->hms = NULL; - pImage->fdwImage = 0; - - return MDS_SUCCESS; -} - - -// Callback -// -// Keep things rolling or collect the buffers back in the queue -// -void FAR PASCAL midiCallback(HMIDISTRM hms, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) -{ - MDSIMAGE* pImage; - LPMIDIHDR lpmh = (LPMIDIHDR)dw1; - - if (uMsg != MOM_DONE) - return; - -// assert(NULL != lpmh); - pImage = (MDSIMAGE*)lpmh->dwUser; -// assert(FOURCC_MDSI == pImage->fccSig); - - pImage = (MDSIMAGE*)lpmh->dwUser; - - if ((pImage->fdwImage & MDSI_F_LOOP) && !(pImage->fdwImage & MDSI_F_RESET)) - if (MMSYSERR_NOERROR == midiStreamOut( - pImage->hms, lpmh, sizeof(*lpmh))) - return; - - --pImage->cBuffersInUse; -} - - - - - - - - - - - - -typedef struct _MIDI_INFO -{ - HANDLE hImage; - BOOL fPlaying; -} MIDI_INFO; - -static MIDI_INFO *pMidi = NULL; - -/* Plays a given MIDI file using MCI_OPEN, MCI_PLAY. Returns as soon as - * playback begins. The window procedure function for the given window - * will be notified when playback is complete. - */ -BOOL playMusic(LPSTR lpszMIDIFileName, BOOL fAutoStart) -{ - if (pMidi != NULL) { - closeMusic(); - } - - pMidi = new MIDI_INFO; - - - if( LoadMDSImage( &(pMidi->hImage), - (PBYTE)lpszMIDIFileName, - 0, - MDS_F_FILENAME ) != 0 ) { - delete pMidi; - pMidi = NULL; - return (FALSE); - } - - pMidi->fPlaying = FALSE; - if( fAutoStart ) { - if( PlayMDS(pMidi->hImage, MDS_F_LOOP) != 0 ) { - FreeMDSImage(pMidi->hImage); - delete pMidi; - pMidi = NULL; - return (FALSE); - } - pMidi->fPlaying = TRUE; - - } - - - return (TRUE); -} - - -void resumeMusic() -{ - if ( pMidi == NULL ) { - // Error - return; - } - - if( PlayMDS(pMidi->hImage, MDS_F_LOOP) != 0 ) { - // Error - return; - } - pMidi->fPlaying = TRUE; - -} - -void pauseMusic() -{ - if ( pMidi == NULL ) { - // Error - return; - } - - if( PauseMDS(pMidi->hImage) != 0 ) { - // Error - return; - } - pMidi->fPlaying = FALSE; - -} - -void restartMusic() -{ - if ( pMidi == NULL ) { - // Error - return; - } - - - if( StopMDS(pMidi->hImage) != 0 ) { - // Error - return; - } - if( PlayMDS(pMidi->hImage, MDS_F_LOOP) != 0 ) { - // Error - return; - } - pMidi->fPlaying = TRUE; - -} - -void closeMusic() -{ - if ( pMidi == NULL ) { - // Error - return; - } - - StopMDS(pMidi->hImage); - FreeMDSImage(pMidi->hImage); - - delete pMidi; - pMidi = NULL; - - -} diff --git a/sdk/samples/iklowns/cgmidi.h b/sdk/samples/iklowns/cgmidi.h deleted file mode 100644 index ff59dd5..0000000 --- a/sdk/samples/iklowns/cgmidi.h +++ /dev/null @@ -1,38 +0,0 @@ -/*===========================================================================*\ -| -| File: cgmidi.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGMIDI_H -#define _CGMIDI_H - -BOOL playMusic(LPSTR lpszMIDIFileName, BOOL fAutoStart=TRUE); -void pauseMusic(); -void resumeMusic(); -void restartMusic(); -void closeMusic(); - -#endif diff --git a/sdk/samples/iklowns/cgmisc.cpp b/sdk/samples/iklowns/cgmisc.cpp deleted file mode 100644 index 0a874fc..0000000 --- a/sdk/samples/iklowns/cgmisc.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/*===========================================================================*\ -| -| File: cgmisc.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#ifdef __WATCOMC__ -#include -#else -#include -#endif -#include "cgchdll.h" -#include "cgchar.h" -#include "cgtimer.h" -#include "cginput.h" -#include "cgimage.h" - -char inifile [260]; - - -HINSTANCE hInst = NULL; // our library instance -// This is returned by the 'Ident' function, but isn't used internally at all -CGameVersionIdent version = -{ - RELEASE1_0, - GAMEID -}; - -// prototypes so we can fill in the action arrays -int PlaneCreate( CGameCharacter *, CGameLevel * ); -int PlaneAction( CGameCharacter *, CGameLevel * ); -int PlaneDestroy( CGameCharacter *, CGameLevel * ); -int PlaneCollide( CGameCharacter *, CGameCharacter *, CGameLevel * ); - -int CloudCreate( CGameCharacter *, CGameLevel * ); -int CloudAction( CGameCharacter *, CGameLevel * ); -int CloudDestroy( CGameCharacter *, CGameLevel * ); -int CloudCollide( CGameCharacter *, CGameCharacter *, CGameLevel * ); - -// returned by 'Info' function, and isn't used either (internally) -CGameCharSequenceInfo char1seq[1] = -{ - {"plane.spr", "Fly", 15, {"plane.wav", NULL, 100, 1}} -}; - -CGameCharSequenceInfo char2seq[1] = -{ - {"clouds.spr", "Cloud1", 30, {NULL, NULL, 100, 1}} -}; -CGameCharSequenceInfo char3seq[1] = -{ - {"clouds.spr", "Cloud2", 30, {NULL, NULL, 100, 1}} -}; -CGameCharSequenceInfo char4seq[1] = -{ - {"clouds.spr", "Cloud3", 30, {NULL, NULL, 100, 1}} -}; - -CGameCharInfo character1 = -{ - "Plane", - 1, - &char1seq[0], - PlaneCreate, - PlaneAction, - PlaneDestroy, - NULL, - PlaneCollide -}; - -CGameCharInfo character2 = -{ - "Cloud1", - 1, - &char2seq[0], - CloudCreate, - CloudAction, - CloudDestroy, - NULL, - CloudCollide -}; - -CGameCharInfo character3 = -{ - "Cloud2", - 1, - &char3seq[0], - CloudCreate, - CloudAction, - CloudDestroy, - NULL, - CloudCollide -}; - -CGameCharInfo character4 = -{ - "Cloud3", - 1, - &char4seq[0], - CloudCreate, - CloudAction, - CloudDestroy, - NULL, - CloudCollide -}; - -// This array allows the caller to get our information directly -CGameCharInfo *characters[] = -{ - &character1, - &character2, - &character3, - &character4 -}; - -CGameInfo dllinfo = -{ - 4, // number of characters implemented in - // this DLL - characters // array of CGameCharInfo pointers -}; - -// EXPORTED as ordinal #1: -#ifdef __BORLANDC__ -extern "C" void CALLBACK Ident( CGameVersionIdent * id ) -#else -void CALLBACK Ident( CGameVersionIdent * id ) -#endif -{ - GetModuleFileName(NULL, inifile, 259); - char *p = strrchr(inifile, '.'); - if (p) - lstrcpy(p+1, "GAM"); - - memcpy( id, &version, sizeof( version ) ); -} - -// EXPORTED as ordinal #2: -#ifdef __BORLANDC__ -extern "C" void CALLBACK Info( CGameInfo * info ) -#else -void CALLBACK Info( CGameInfo * info ) -#endif -{ - memcpy( info, &dllinfo, sizeof( dllinfo ) ); -} - -int PlaneCreate( CGameCharacter *me, CGameLevel *level ) -{ - int posx,posy; - me->GetXY(&posx, &posy); - me->SetVelocity(-32,0); - me->MoveTo(level->GetMaxX(), posy); - return ( ACTION_COMPLETED ); -} - -int PlaneAction( CGameCharacter *me, CGameLevel *level ) -{ - int posx, posy, velx, vely; - int time = level->GetFrameTime(); - int slices = (me->mLastTime == -1) ? 1 : (time - me->mLastTime); - me->mLastTime = time; - - me->GetVelocity(&velx, &vely); - - // remember to use sub-pixels! - me->GetSubXY(&posx, &posy); - - - posx += SUBPIXEL_DELTA(velx, slices); - posy += SUBPIXEL_DELTA(vely, slices); - - // did we move off the screen? If so, start over at maxx... - if (SUB2WORLD(posx) < -level->GetMaxX()) - posx = WORLD2SUB(level->GetMaxX()); - - me->SetAndMove(posx, posy); - me->NextSprite(level->GetTimer()->Time, FALSE); - - return ( ACTION_COMPLETED ); -} - -int PlaneDestroy( CGameCharacter *me, CGameLevel *level ) -{ - return ( ACTION_COMPLETED ); -} - -int PlaneCollide( CGameCharacter *me, CGameCharacter *other, CGameLevel *level ) -{ - return(ACTION_COMPLETED); -} - - -int CloudCreate( CGameCharacter *me, CGameLevel *level ) -{ - me->SetVelocity(64 / (me->GetXParallax()+1),0); - return ( ACTION_COMPLETED ); -} - -int CloudAction( CGameCharacter *me, CGameLevel *level ) -{ - int posx, posy, velx, vely; - int time = level->GetFrameTime(); - int slices = (me->mLastTime == -1) ? 1 : (time - me->mLastTime); - me->mLastTime = time; - - me->GetVelocity(&velx, &vely); - - // remember to use sub-pixels! - me->GetSubXY(&posx, &posy); - - posx += SUBPIXEL_DELTA(velx, slices); - - // did we move off the screen? If so, start over at maxx... - if (posx > WORLD2SUB(SCREEN_WIDTH)) - posx = WORLD2SUB(-SCREEN_WIDTH); - - me->SetAndMove(posx, posy); - - return ( ACTION_COMPLETED ); -} - -int CloudDestroy( CGameCharacter *me, CGameLevel *level ) -{ - return ( ACTION_COMPLETED ); -} - -int CloudCollide( CGameCharacter *me, CGameCharacter *other, CGameLevel *level ) -{ - return(ACTION_COMPLETED); -} diff --git a/sdk/samples/iklowns/cgoption.cpp b/sdk/samples/iklowns/cgoption.cpp deleted file mode 100644 index 1d5916e..0000000 --- a/sdk/samples/iklowns/cgoption.cpp +++ /dev/null @@ -1,423 +0,0 @@ -/*===========================================================================*\ -| -| File: cgoption.cpp -| -| Description: -| Routines to display lines of text (from resource strings) overlayed on -| a bitmap. The text will be sized appropriately to fit within the -| rectangle specified in the profile. The user may hilight a particular -| line and the index of the line will be returned to the caller. -| -| Also, routines to scroll text across a bitmap image (useful for -| story lines and credits). -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgglobl.h" -#include "cgdib.h" -#include "strrec.h" -#include "cginput.h" -#include "cgtext.h" -#include "cgmidi.h" -#include "cgimage.h" -#include "cgrsrce.h" -#include "cgoption.h" - -#define MIN_JOY_MOVE 15 -#define MIN_MOUSE_MOVE 50 - -#define SOURCEX SCREEN_WIDTH -#define SOURCEY SCREEN_HEIGHT -#define SCREENX GetSystemMetrics(SM_CXSCREEN) -#define SCREENY GetSystemMetrics(SM_CYSCREEN) -#define CenterX (GetSystemMetrics(SM_CXSCREEN) / 2) -#define CenterY (GetSystemMetrics(SM_CXSCREEN) / 2) - -#define PIXEL_STEP 2 - -#define BASE_HWND ghMainWnd -#define NUM_ENTRIES(x) (sizeof(x)/sizeof(x[0])) - -//** external functions ** -extern void GetRectFromProfile(RECT &, LPSTR, LPSTR, LPSTR); -COLORREF GetColorFromProfile(LPSTR, LPSTR, LPSTR); - -//** external data ** -//** public data ** - -//** private data ** -static HDC hdcIntro; -static CGameDIB *pDib; -static HPALETTE hPal; - -static int iMouseMove; -static int iJoyMove; -static int iCycleRate; - -//** public functions ** -//** private functions ** - -// ---------------------------------------------------------- -// LoadBitmap - load bitmap from a file into a DC and setup -// palette. -// ---------------------------------------------------------- -HDC LoadBitmapFile ( - LPSTR pBitmapFile // Name of .BMP file -) -{ - HDC hdcBase, hdcBitmap; - - // Loadup bitmap - pDib = new CGameDIB(pBitmapFile); - - // Create a DC and copy bitmap to it - hdcBase = GetDC(BASE_HWND); - hdcBitmap = CreateCompatibleDC(hdcBase); - SelectObject(hdcBitmap, pDib->GetHBitmap()); - - // Set palette so image looks ok! - hPal = pDib->CreatePalette(); - SelectPalette(hdcBase, hPal, FALSE); - RealizePalette(hdcBase); - - ReleaseDC( BASE_HWND, hdcBase ); - - return(hdcBitmap); -} - -// ---------------------------------------------------------- -// GetUpDownDone - poll user input devices looking to see if -// there are any selection changes. -// ---------------------------------------------------------- -void GetUpDownDone(CGameInput *Input, BOOL &up, BOOL &down, BOOL &done) -{ - JOYINFO joy; - int x, y, buttons; - - up = down = done = FALSE; - - // Check for keyboard input - down = (Input->GetKeyboard(VK_DOWN) !=0) || - (Input->GetKeyboard(VK_NUMPAD2) != 0); - up = (Input->GetKeyboard(VK_UP) != 0) || - (Input->GetKeyboard(VK_NUMPAD8) != 0); - done = ((Input->GetKeyboard(VK_RETURN)) || (Input->GetKeyboard(VK_SPACE))); - - // No keyboard input? - if (!(up || down || done)) - { - - // Check for mouse input - if (Input->GetMouse(x, y, buttons)) - { - down = (y - CenterY > iMouseMove); - up = (y - CenterY < -iMouseMove); - done = (buttons & 1); - - // Keep mouse in center of screen - SetCursorPos(CenterX, CenterY); - } - - // No mouse input? - if (!(up || down || done)) - { - // Check for joystick input - Input->UpdateJoystick(); - if (Input->GetJoystick(1, &joy)) - { - down = ((int)joy.wYpos >= iJoyMove); - up = ((int)joy.wYpos <= -iJoyMove); - done = (joy.wButtons & JOY_BUTTON1); - } - } - } -} - -// ---------------------------------------------------------- -// NewStringResource - Load string from resource into memory -// ---------------------------------------------------------- -LPSTR NewStringResource( - HINSTANCE hInst, - int idString -) -{ - char TempBuf[256]; - DWORD nBytes=0; - LPSTR pStr=NULL; - - nBytes = LoadString(hInst, idString, TempBuf, sizeof(TempBuf)); - if (nBytes > 0) - { - pStr = new char [nBytes+1]; - lstrcpy(pStr, TempBuf); - } - return(pStr); -} - -// ---------------------------------------------------------- -// COptionScreen constructor - Options screen object for -// displaying option screen while allowing repaints to occur -// These routines do not take advantage of DirectDraw, unfortunately. -// ---------------------------------------------------------- -COptionScreen::COptionScreen() -{ - mHdcScreen = NULL; - mHdcIntro = NULL; - mInput = NULL; - pText = NULL; - pDib = NULL; - mnChoices = 0; -} - -// ---------------------------------------------------------- -// Init - initialises context for option screen -// NOTE: resource strings are assumed to be sequential! -// ---------------------------------------------------------- -BOOL COptionScreen::Init( - LPSTR pBitmapName, // name of .BMP file or NULL to use default - LPSTR ProfileName, // filename of game config file - CGameInput *Input, // ptr to input object or NULL if no input - int timeout // maximum time to wait or -1 forever -) -{ - return( TRUE ); -} - -// ---------------------------------------------------------- -// Init - initialises context for option screen -// NOTE: resource strings are assumed to be sequential! -// ---------------------------------------------------------- -BOOL COptionScreen::Init( - LPSTR pBitmapName, // name of .BMP file or NULL to use default - int idStringBase, // first resource id of text lines - int nChoices, // number of text lines to display - LPSTR ProfileName, // filename of game config file - CGameInput *Input, // ptr to input object or NULL if no input - int defSelect, // line to hilight first or -1 if none - int timeout, // maximum time to wait or -1 forever - int spacing, - int lines -) -{ - return( TRUE ); -} - -// ---------------------------------------------------------- -// AddText - -// ---------------------------------------------------------- -int COptionScreen::AddText( - LPSTR pNewText -) -{ - if (pText == NULL) - { - return(-1); - } - - mnChoices++; - pText->AddLine(pNewText, colorDefault, colorDefaultShadow); - return(mnChoices); -} - -// ---------------------------------------------------------- -// SelectText - -// ---------------------------------------------------------- -BOOL COptionScreen::SelectText( - int defSelect // line to hilight first or -1 if none -) -{ - if (pText == NULL) - { - return(FALSE); - } - - CurSel = defSelect; - - pText->TextBlt(); - pText->ChangeColor(CurSel+1, colorSelected, colorSelectedShadow); - return( TRUE ); -} - -// ---------------------------------------------------------- -// SetSpacing - -// ---------------------------------------------------------- -void COptionScreen::SetSpacing(int spacing) -{ - if (pText != NULL) - { - pText->SetSpacing(spacing); - } - -} - -// ---------------------------------------------------------- -// SetMaxLines - -// ---------------------------------------------------------- -void COptionScreen::SetMaxLines(int lines) -{ - if (pText != NULL) - { - pText->SetMaxLines(lines); - } - -} - -// ---------------------------------------------------------- -// Shutdown - closes down context -// ---------------------------------------------------------- -void COptionScreen::Shutdown( void ) -{ - // Cleanup - if ( mHdcIntro ) { - DeleteDC(mHdcIntro); - mHdcIntro = NULL; - } - if ( pText ) { - delete pText; // destructor will delete our strings for us! - } - if ( pDib ) { - delete pDib; - } - if ( mHdcScreen ) { - ReleaseDC(BASE_HWND, mHdcScreen); - mHdcScreen = NULL; - } -} - -// ---------------------------------------------------------- -// DlgProcOptions - main game options dialog -// ---------------------------------------------------------- -BOOL CALLBACK DlgProcOptions(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static LONG iIndex = -1; - static HWND hWndCtl; - // char chBuffer[128]; - - switch (msg) - { - case WM_INITDIALOG: - - iIndex = -1; - - hWndCtl = GetDlgItem(hDlg, IDC_LISTOPTION); - if (hWndCtl == NULL) - { - EndDialog(hDlg, -1); - return(TRUE); - } - SendMessage(hWndCtl, LB_ADDSTRING, 0, (LPARAM) "Play Solo"); - SendMessage(hWndCtl, LB_ADDSTRING, 0, (LPARAM) "Two Player Game"); - SendMessage(hWndCtl, LB_ADDSTRING, 0, (LPARAM) "Play Remote Opponents"); - SendMessage(hWndCtl, LB_ADDSTRING, 0, (LPARAM) "Quit Game"); - SendMessage(hWndCtl, LB_SETCURSEL, 0, 0); - SetFocus(hWndCtl); - iIndex = 0; - - return(FALSE); - - case WM_COMMAND: - - switch( HIWORD(wParam)) - { - case LBN_SELCHANGE: - iIndex = SendMessage((HWND) lParam, LB_GETCURSEL, 0, 0); - hWndCtl = (HWND) lParam; - //wsprintf( chBuffer, "Index set to %d, %8x %8x %8x\r\n", - // iIndex, msg, wParam, lParam); - // OutputDebugString(chBuffer); - return(FALSE); - - case LBN_DBLCLK: - iIndex = SendMessage((HWND) lParam, LB_GETCURSEL, 0, 0); - //wsprintf( chBuffer, "Index set to %d, %8x %8x %8x\r\n", - // iIndex, msg, wParam, lParam); - // OutputDebugString(chBuffer); - EndDialog(hDlg, iIndex); - return(TRUE); - - case 0: - //wsprintf( chBuffer, "Index returned %d, %8x %8x %8x\r\n", - // iIndex, msg, wParam, lParam); - // OutputDebugString(chBuffer); - - if (LOWORD(wParam) == IDOK) - { - EndDialog(hDlg, iIndex); - return(TRUE); - } - else if (LOWORD(wParam) == IDCANCEL) - { - EndDialog(hDlg, -1); - return(TRUE); - } - break; - - } - } - //wsprintf( chBuffer, "Ret False Index set to %d, %8x %8x %8x\r\n", - // iIndex, msg, wParam, lParam); - // OutputDebugString(chBuffer); - return (FALSE); -} - -// ---------------------------------------------------------- -// DoOptionScreen - display bitmap & text and allow user to -// make a selection. -// ---------------------------------------------------------- -int COptionScreen::DoOptionScreen( void ) -{ - // Allow user to change options - BOOL done = FALSE; - BOOL switchedAway = FALSE; - DWORD startTime = timeGetTime(); - DWORD dwRet; - - pDib = new CGameDIB("instruct.bmp"); - - InvalidateRect(NULL, NULL, TRUE); - - dwRet = DialogBox (ghInst, (LPCTSTR) IDD_OPTIONS, ghMainWnd, (DLGPROC) DlgProcOptions); - return(dwRet); -} - - -// ---------------------------------------------------------- -// Paint - -// ---------------------------------------------------------- -void COptionScreen::Paint( void ) -{ - HDC hdcScreen = GetDC(BASE_HWND); - HDC hdcBitmap; - - hdcBitmap = CreateCompatibleDC(hdcScreen); - SelectObject( hdcBitmap, pDib->GetHBitmap() ); - - StretchBlt(hdcScreen, 0, 0, SCREENX, SCREENY, hdcBitmap - , 0, 0, SOURCEX, SOURCEY, SRCCOPY); - - ReleaseDC(BASE_HWND, hdcScreen); - DeleteObject(hdcBitmap); -} - diff --git a/sdk/samples/iklowns/cgoption.h b/sdk/samples/iklowns/cgoption.h deleted file mode 100644 index b0e24e4..0000000 --- a/sdk/samples/iklowns/cgoption.h +++ /dev/null @@ -1,90 +0,0 @@ -/*===========================================================================*\ -| -| File: cgoption.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGOPTION_H -#define _CGOPTION_H - -HDC LoadBitmapFile ( - LPSTR pBitmapFile -); - -// Class for the options screen, to allow clean repaints -// from the base window when the option screen is up - -// Forward declaration of CGameText (protected member -// needn't force include of new header file) -class CGameText; - -class COptionScreen -{ - public: - COptionScreen(); - - BOOL Init( - LPSTR pBitmapName, // name of .BMP file or NULL to use default - LPSTR ProfileName, // filename of game config file - CGameInput *Input=NULL, // ptr to input object or NULL if no input - int timeout=-1 // maximum time to wait or -1 forever - ); - - BOOL Init( - LPSTR pBitmapName, // name of .BMP file or NULL to use default - int idStringBase, // first resource id of text lines - int nChoices, // number of text lines to display - LPSTR ProfileName, // filename of game config file - CGameInput *Input=NULL, // ptr to input object or NULL if no input - int defSelect=0, // line to hilight first or -1 if none - int timeout=-1, // maximum time to wait or -1 forever - int spacing=2, - int lines=2 - ); - BOOL AddText(LPSTR); - BOOL SelectText(int); - void SetSpacing(int spacing); - void SetMaxLines(int lines); - - int DoOptionScreen( void ); - void Shutdown( void ); - void Paint( void ); - protected: - RECT rect; - HDC mHdcScreen; - HDC mHdcIntro; // DC screen is assembled in - COLORREF colorDefault; - COLORREF colorSelected; - COLORREF colorDefaultShadow; - COLORREF colorSelectedShadow; - LPSTR pChoice; - int CurSel; - CGameInput *mInput; - int mnChoices; - CGameText *pText; - int mTimeout; -}; - -#endif diff --git a/sdk/samples/iklowns/cgremote.cpp b/sdk/samples/iklowns/cgremote.cpp deleted file mode 100644 index 2ded9dd..0000000 --- a/sdk/samples/iklowns/cgremote.cpp +++ /dev/null @@ -1,867 +0,0 @@ -/*===========================================================================*\ -| -| File: cgremote.cpp -| -| Description: -| Routines to send and receive remote actions for controlling objects -| on remote machines. Uses DirectPlay for transferring data. -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//** include files ** -#include -#ifndef __WATCOMC__ -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include -#include -#include "cgglobl.h" // For ghInst for dialog box -#include "cgrsrce.h" -#include "dplay.h" -#include "dplobby.h" -#include "cglevel.h" -#include "cgremote.h" -#include "strrec.h" - -#include -#include - -static void InitReceivePoll( void ); - -// [johnhall] -// hack -- get GENERIC_CHAR_INFO from cgkrusty.cpp -typedef signed char SCHAR; - -typedef struct -{ - LONG posx; - LONG posy; - SCHAR state; - SCHAR velx; - SCHAR vely; - SCHAR curZ; -} GENERIC_CHAR_INFO; - -//** local definitions ** -// structure to be used to pass remote actions across the link -typedef struct _GAMEMESSAGE { - BYTE Action; // action code - BYTE NumBytes; // size of data - REMOTE_OBJECT RemObj; // unique object id - char Data[1]; // action specific data -} GAMEMESSAGE, *PGAMEMESSAGE; - - -//** external functions ** - -//** external data ** -// KLUDGE: -CGameLevel *gCurLevel=NULL; - -//** public data ** -//** private data ** -static IDirectPlay *lpIDC=NULL; // DirectPlay Object -static DPID dcoID=0; // our DirectPlay ID -static HANDLE dphEvent = NULL; - -static BOOL fAbort = FALSE; // Abort flag for RemoteConnect() - -//** public functions ** -//** private functions ** -static DWORD RequestThreadProc(void *Dummy); -static BOOL CALLBACK AbortDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); - - -#define DP_BROADCAST_ID 0 - -// ---------------------------------------------------------- -// CreateRemotePeer - create a new character across all peers -// ---------------------------------------------------------- -REMOTE_OBJECT *CreateRemotePeers( - char *name, // name of object as per level->Add() - DWORD InstanceID // unique instance ID of object type -) -{ - // Gotta have a DCO object to do this! - if (lpIDC == NULL) - { - return(NULL); - } - - // Setup a message and an unique obect id - char *pBuffer = NULL; - DWORD lenBuff; - PGAMEMESSAGE pGameMsg; - REMOTE_OBJECT *pObj = new REMOTE_OBJECT; - memset(pObj, 0, sizeof(REMOTE_OBJECT)); - - // Make buffer big enough to hold game message plus - // leading non-system-char byte - lenBuff = sizeof(GAMEMESSAGE); - pBuffer = new char[lenBuff]; - pGameMsg = (PGAMEMESSAGE)&pBuffer[0]; - - // Fill in object id info so that this object is unique across - // all machines - pObj->OwnerID = (BYTE) dcoID; - pObj->InstanceID = (BYTE) InstanceID; - lstrcpyn(pObj->ObjectID, name, MAX_OBJ_NAME); - memcpy(&pGameMsg->RemObj, pObj, sizeof(REMOTE_OBJECT)); - - pGameMsg->Action = (BYTE) CREATE_OBJECT; - - // Broadcast it to everyone in the group. - lpIDC->Send( dcoID, // From - DP_BROADCAST_ID, - 0, - (LPSTR)pBuffer, - lenBuff); - - // Delete buffer, once sent - delete []pBuffer; - - return(pObj); -} - - - - - -// ---------------------------------------------------------- -// SendRemoteAction - broadcast an action to remote peers -// ---------------------------------------------------------- -BOOL SendRemoteAction( - REMOTE_OBJECT *pObj, // unique object id - ACTION Action, // action code - void *Data, // action data - DWORD nDataSize // size of action data -) -{ - PGAMEMESSAGE gameMsg; - char *pBuffer; - DWORD lenBuff; - // char chBuffer[128]; - - - - // Gotta have a valid DirectPlay object - if (lpIDC == NULL) - { - return(NULL); - } - - // Allocate the GAME buffer with room for data, - // plus room at the beginning for a non-sytem-message char - lenBuff = sizeof(GAMEMESSAGE) + nDataSize; - pBuffer = new char [lenBuff]; - // Now point gameMsg at the rest of the buffer - gameMsg = (PGAMEMESSAGE)&pBuffer[0]; - - // Copy the action code and data to message buffer - gameMsg->Action = Action; - memcpy(&gameMsg->RemObj, pObj, sizeof(REMOTE_OBJECT)); - gameMsg->NumBytes = (BYTE) nDataSize; - memcpy(gameMsg->Data, Data, nDataSize); -#if 0 - wsprintf( chBuffer, "%d (10%s) %d %d %d", - gameMsg->Action, - gameMsg->RemObj.ObjectID, - gameMsg->RemObj.InstanceID, - gameMsg->RemObj.OwnerID, - gameMsg->NumBytes); - OutputDebugString(chBuffer); - if (nDataSize == sizeof(GENERIC_CHAR_INFO)) - { - GENERIC_CHAR_INFO *pci; - pci = (GENERIC_CHAR_INFO *) Data; - wsprintf( chBuffer,"; %d %d %d %d %d %d", - pci->state, - pci->posx, - pci->posy, - pci->velx, - pci->vely, - pci->curZ); - OutputDebugString(chBuffer); - } - OutputDebugString("\r\n"); -#endif - - // Broadcast the action to all peers - lpIDC->Send(dcoID, // from - DP_BROADCAST_ID, // to - 0, - pBuffer, - lenBuff); - delete []pBuffer; - return(TRUE); -} - -// ---------------------------------------------------------- -// DestroyRemotePeer - Tell remote peers to kill an object -// ---------------------------------------------------------- -BOOL DestroyRemotePeer( - REMOTE_OBJECT *pObj // unique object id -) -{ - PGAMEMESSAGE gameMsg; - char *pBuffer = NULL; - DWORD lenBuff; - - if (pObj == NULL) - return(TRUE); - - // Allocate a buffer for the GAME buffer with roon for data, - // plus an extra character at the beginning to be the non-system - // message char. - lenBuff = sizeof(GAMEMESSAGE)+1; - pBuffer = new char [lenBuff]; - - // Point the game message pointer at the rest of the buffer - gameMsg = (PGAMEMESSAGE)&pBuffer[0]; - - // Format a destroy message - memcpy(&gameMsg->RemObj, pObj, sizeof(REMOTE_OBJECT)); - gameMsg->RemObj.OwnerID = (BYTE) dcoID; - gameMsg->NumBytes = 0; - gameMsg->Action = (BYTE) DESTROY_OBJECT; - - // Broadcast the destroy message to all peers - lpIDC->Send( dcoID, - DP_BROADCAST_ID, - 0, - pBuffer, - lenBuff); - // Delete buffer - delete []pBuffer; - - // Don't need the object id anymore - delete pObj; - return(TRUE); -} - -// ----------------------------------------------------------------- -// RemoteConnect - establish an active connection with remotes -// ----------------------------------------------------------------- - -BOOL FAR PASCAL EnumSession( - LPDPSESSIONDESC lpDPGameDesc, - LPVOID pContext, - LPDWORD pTimeOut, - DWORD dwFlags ) -{ - LONG iIndex; - HWND hWnd = (HWND) pContext; - - if( dwFlags == DPESC_TIMEDOUT ) - { - return FALSE; - } - - iIndex = SendMessage(hWnd, LB_ADDSTRING, 0, (LPARAM) lpDPGameDesc->szSessionName); - if (iIndex != LB_ERR) - SendMessage(hWnd, LB_SETITEMDATA, iIndex, (LPARAM) lpDPGameDesc->dwSession); - - SetFocus(hWnd); - SendMessage(hWnd, LB_SETCURSEL, 0, 0); - return(TRUE); - -} - -BOOL FAR PASCAL EnumSP(LPGUID lpGuid, LPSTR lpDesc, - DWORD dwMajor, DWORD dwMinor, LPVOID lpv) -{ - LONG iIndex; - HWND hWnd = (HWND) lpv; - - iIndex = SendMessage(hWnd, LB_ADDSTRING, 0, (LPARAM) lpDesc); - if (iIndex != LB_ERR) - SendMessage(hWnd, LB_SETITEMDATA, iIndex, (LPARAM) lpGuid); - - SetFocus(hWnd); - SendMessage(hWnd, LB_SETCURSEL, 0, 0); - return(TRUE); -} - - - -BOOL CALLBACK DlgProcQCreate (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_COMMAND: - switch(wParam) - { - case IDC_CREATE: - EndDialog(hDlg, 1); - return(TRUE); - - case IDC_CONNECT: - EndDialog(hDlg, 2); - return(TRUE); - - case IDCANCEL: - EndDialog(hDlg, -1); - return(TRUE); - } - break; - - } - return(FALSE); -} -BOOL CALLBACK DlgProcChooseProvider (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - LPGUID lpGuid; - static LONG iIndex; - static HWND hWndCtl; - - switch (msg) - { - case WM_INITDIALOG: - - hWndCtl = GetDlgItem(hDlg, IDC_LIST1); - if (hWndCtl == NULL) - { - EndDialog(hDlg, TRUE); - return(TRUE); - } - DirectPlayEnumerate(EnumSP, (LPVOID) hWndCtl); - SetFocus(hWndCtl); - SendMessage(hWndCtl, LB_SETCURSEL, 0, 0); - return(FALSE); - - case WM_COMMAND: - - switch( HIWORD(wParam)) - { - case LBN_SELCHANGE: - iIndex = SendMessage((HWND) lParam, LB_GETCURSEL, 0, 0); - hWndCtl = (HWND) lParam; - return(FALSE); - - case LBN_DBLCLK: - iIndex = SendMessage((HWND) lParam, LB_GETCURSEL, 0, 0); - if (iIndex != LB_ERR) - { - lpGuid = (LPGUID) SendMessage((HWND) lParam, LB_GETITEMDATA, iIndex, 0); - DirectPlayCreate(lpGuid, &lpIDC, NULL); - EndDialog(hDlg, TRUE); - return(TRUE); - } - break; - - case 0: - if (LOWORD(wParam) == IDOK) - { - if (iIndex != LB_ERR) - { - lpGuid = (LPGUID) SendMessage(hWndCtl, LB_GETITEMDATA, iIndex, 0); - if (lpGuid) - { - DirectPlayCreate(lpGuid, &lpIDC, NULL); - EndDialog(hDlg, TRUE); - } - else - EndDialog(hDlg, FALSE); - return(TRUE); - } - } - else if (LOWORD(wParam) == IDCANCEL) - { - EndDialog(hDlg, FALSE); - return(TRUE); - } - break; - - } - } - return (FALSE); -} - -LPGUID g_lpGuid; - -BOOL CALLBACK DlgProcSelSession (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static LONG iIndex; - static HWND hWndCtl; - DPSESSIONDESC dpDesc; - HRESULT hr = DP_OK + 10; - - switch (msg) - { - case WM_INITDIALOG: - - hWndCtl = GetDlgItem(hDlg, IDC_LB_SESSION); - if (hWndCtl == NULL) - { - EndDialog(hDlg, TRUE); - return(TRUE); - } - memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC)); - dpDesc.dwSize = sizeof(dpDesc); - dpDesc.guidSession = *g_lpGuid; - lpIDC->EnumSessions(&dpDesc, 5000, EnumSession, (LPVOID) hWndCtl, 0 ); - - SetFocus(hWndCtl); - return(FALSE); - - case WM_COMMAND: - - switch( HIWORD(wParam)) - { - case LBN_SELCHANGE: - iIndex = SendMessage((HWND) lParam, LB_GETCURSEL, 0, 0); - hWndCtl = (HWND) lParam; - return(FALSE); - - case 0: - if (LOWORD(wParam) == IDCANCEL) - { - lpIDC->Close(); - lpIDC->Release(); - lpIDC = NULL; - EndDialog(hDlg, FALSE); - return(TRUE); - } - // - // Fall Through. - // - case LBN_DBLCLK: - if (HIWORD(wParam) == LBN_DBLCLK) - { - hWndCtl = (HWND) lParam; - iIndex = SendMessage(hWndCtl, LB_GETCURSEL, 0, 0); - } - - if (iIndex != LB_ERR) - { - memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC)); - dpDesc.dwSize = sizeof(dpDesc); - dpDesc.guidSession = *g_lpGuid; - dpDesc.dwFlags = DPOPEN_OPENSESSION; - dpDesc.dwSession = SendMessage((HWND) hWndCtl, LB_GETITEMDATA, iIndex, 0); - hr = lpIDC->Open(&dpDesc); - - if (hr != DP_OK) - { - lpIDC->Close(); - lpIDC->Release(); - lpIDC = NULL; - EndDialog(hDlg, FALSE); - } - - EndDialog(hDlg, TRUE); - return(TRUE); - - } - } - } - return (FALSE); -} - -INT GetProvider() -{ - - return(DialogBox (NULL, (LPCTSTR) IDD_CHOOSEPROVIDER, NULL, (DLGPROC) DlgProcChooseProvider)); -} - -INT CreateGame() -{ - return(DialogBox (NULL, (LPCTSTR) IDD_Q_CREATE, NULL, (DLGPROC) DlgProcQCreate)); - -} - -INT GetGame() -{ - - return(DialogBox (NULL, (LPCTSTR) IDD_SELSESSION, NULL, (DLGPROC) DlgProcSelSession)); -} - -BOOL RemoteCreateLobby(void) -{ - LPDIRECTPLAY2A lpDPlay2 = NULL; - LPDIRECTPLAYLOBBYA lpDPLobby = NULL; - HRESULT hr; - - // Be sure we aren't already initialized. - if (lpIDC != NULL) - { - return( FALSE ); - } - - // create a lobby object - hr = DirectPlayLobbyCreate(NULL, &lpDPLobby, NULL, NULL, 0); - if FAILED(hr) - return (FALSE); - - // try to connect using the lobby - hr = lpDPLobby->Connect(0, &lpDPlay2, NULL) ; - - // lobby launched us, so get a DirectPlay 1 interface - if SUCCEEDED(hr) - { - // query for a DirectPlay 1.0 interface - hr = lpDPlay2->QueryInterface(IID_IDirectPlay, (LPVOID *) &lpIDC); - - // release the ANSI DirectPlay2 interface - lpDPlay2->Release(); - } - - // release lobby interface - lpDPLobby->Release(); - - return ((BOOL)(hr == DP_OK)); -} - -BOOL RemoteCreate(REFGUID pGuid, LPSTR FullName, LPSTR NickName) -{ - HRESULT hr; - DPSESSIONDESC dpDesc; - - // lobby did not launch us, so ask user for connection settings - if (lpIDC == NULL) - { - GetProvider(); - - if (lpIDC == NULL) - return(FALSE); - - switch( CreateGame()) - { - case 1: // Create - memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC)); - dpDesc.dwSize = sizeof(dpDesc); - dpDesc.dwMaxPlayers = 10; - dpDesc.dwFlags = DPOPEN_CREATESESSION; - dpDesc.guidSession = pGuid; - strcpy( dpDesc.szSessionName, FullName); - - if ((hr = lpIDC->Open(&dpDesc)) != DP_OK) - { - lpIDC->Release(); - lpIDC = NULL; - return(FALSE); - } - - break; - - case 2: // Connect - g_lpGuid = (LPGUID) &pGuid; - - GetGame(); - - if (lpIDC == NULL) - return(FALSE); - - break; - - default: - return(FALSE); - } - } - - if ((hr = lpIDC->CreatePlayer(&dcoID, NickName, - "IKlowns Player", &dphEvent)) != DP_OK) - { - lpIDC->Close(); - lpIDC->Release(); - lpIDC = NULL; - return(FALSE); - } - - - InitReceivePoll(); - return(TRUE); - -} - - -// ----------------------------------------------------------------- -// SetCurrentLevel - set pointer to current level object -// ----------------------------------------------------------------- -void SetCurrentLevel( - void *newLevel -) -{ - gCurLevel = (CGameLevel *)newLevel; -} - -// ---------------------------------------------------------- -// CreateNewCharacter - create a new game object! -// ---------------------------------------------------------- -void CreateNewCharacter( - REMOTE_OBJECT *pObj // unique object id -) -{ - char dataBuf[256]; - char graphicsBuf[256]; - - // Get specific data on object from profile - // NOTE: This means we hit the disk. For performance, - // it would be better if objects could be created based - // on an in memory object so that we don't ever have to - // hit the disk! - - - GetPrivateProfileString( - gCurLevel->GetLevelName(), - "Graphics", - "", - graphicsBuf, - sizeof( graphicsBuf ), - gCurLevel->GetProfileName() - ); - - GetPrivateProfileString( - graphicsBuf, - pObj->ObjectID, - "", - dataBuf, - sizeof( dataBuf ), - gCurLevel->GetProfileName() - ); - - // parse the data string into fields - CStringRecord fields( dataBuf, "," ); - - if (fields.GetNumFields() >= 5) - { - // Add the object to the game list! - gCurLevel->Add(pObj->ObjectID, - atoi(fields[1]), - atoi(fields[3]), - atoi(fields[4]), - (void *)pObj); - } -} - -// ---------------------------------------------------------- -// ProcessIncomingActions - Parse received messages & queue them -// ---------------------------------------------------------- -BOOL ProcessIncomingActions( - REMOTE_OBJECT *pObj, // unique object id - ACTION action, // action code - void *Data, // action data - DWORD nDataSize // sizeof action data -) -{ - CLinkedList *ActionList; - BOOL fQueuedUp = FALSE; - // char chBuffer[128]; - - // wsprintf( chBuffer, "IncomingAction %d size %d\r\n", action, nDataSize); - // OutputDebugString(chBuffer); - - // Guard against activity occurring before we are ready! - if (gCurLevel == NULL) - return(FALSE); - - // Don't do anything about our own requests - if (pObj->OwnerID == dcoID) - return(FALSE); - - // Figure out what to do with this message - switch (action) { - - // Need to create a brand new object locally - case CREATE_OBJECT: { - - // OutputDebugString("CreateObject \r\n"); - // Create a game character - if (!FindRemoteObjectEntry(pObj)) - { - // OutputDebugString("CreateNewCharacter \r\n"); - CreateNewCharacter(pObj); - } - // OutputDebugString("Leave CreateObject \r\n"); - break; - } - - // Time to destroy the object! - case DESTROY_OBJECT: { - REMOTE_DATA *pRemoteEntry = FindRemoteObjectEntry(pObj); - - // OutputDebugString("DestroyObject \r\n"); - // Need to tell level object to remove the character! - if (pRemoteEntry != NULL) - gCurLevel->Remove((CGameGraphic *)pRemoteEntry->Data); - - break; - } - - // Must be some character specific action - default:{ - - // Get action list for this object - ActionList = GetRemoteObjectQueue(pObj); - - // No action list -> a new object, so try to create it. - if (ActionList == NULL) - { - CreateNewCharacter(pObj); - ActionList = GetRemoteObjectQueue(pObj); - if (ActionList == NULL) - return(FALSE); - } - - // Place this action onto the queue - // OutputDebugString("QueueRemoteAction \r\n"); - QueueRemoteAction(ActionList, action, Data, nDataSize); - fQueuedUp = TRUE; - break; - } - } - return(fQueuedUp); -} - -// ---------------------------------------------------------- -// ReleaseRemoteData - free remote buffer -// ---------------------------------------------------------- -void ReleaseRemoteData( - LPVOID pData // ptr to app data portion -) -{ - PGAMEMESSAGE pMsg; // desired pointer - int iDiff; // difference between the two - - // Pretend we got passed in the proper ptr - pMsg = (PGAMEMESSAGE)pData; - - // Calculate the difference between what we got - // and what we need. - iDiff = (LPBYTE)(&pMsg->Data) - (LPBYTE)(pMsg); - - // Adjust accordingly and free the message! - pMsg = (PGAMEMESSAGE)((LPBYTE)pMsg - iDiff); - delete pMsg; -} - -#define MAX_BUFFER_SIZE (sizeof(GAMEMESSAGE)+512) - - - - -static char *pBuffer = NULL; -static DWORD lenBuff = MAX_BUFFER_SIZE; - -static void InitReceivePoll( void ) -{ - // We allocate a buffer to receive into first, - // which may have to cope with system messages, - // before copying the real message to the buffer to pass - // to the game - pBuffer = new char[ lenBuff ]; - -} - -void PollForRemoteReceive( void ) -{ - DPID fromID, dcoReceiveID; - DWORD nBytes; - PGAMEMESSAGE pMsg; - int i; - const int MAX_MESSAGES = 16; - BOOL fCheckForMore = TRUE; - - // Paranoia check - if ( lpIDC ) - { - // We try to receive MAX_MESSAGES at a time so that - // a backlog doesn't build up. If we run out of messages, - // we stop looking for them. - - for( i = 0; i < MAX_MESSAGES && fCheckForMore ; i++ ) - { - HRESULT status; - nBytes = lenBuff; - status = lpIDC->Receive( - &fromID, - &dcoReceiveID, - DPRECEIVE_ALL, - pBuffer, - &nBytes); - switch( status ) - { - case DP_OK: - if ( fromID == 0 ) - { - // We do not in fact utilise the system - // messages during the game. - } - else - { - // User message - we copy the buffer minus the - // user message byte to the game buffer, then - // pass it on. - - // Allocate buffer for game message - pMsg = (PGAMEMESSAGE)new char [MAX_BUFFER_SIZE]; - memcpy( pMsg, &pBuffer[0], nBytes ); - - if (!ProcessIncomingActions(&pMsg->RemObj, pMsg->Action, - pMsg->Data, nBytes)) - delete pMsg; - } - break; - - default: - // Error condition of some kind - we just stop - // checking for now - fCheckForMore = FALSE; - break; - } - } - } -} - - -BOOL CALLBACK AbortDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - WORD wID, wNotifyCode; - BOOL retVal = 0; - - switch( uMsg ) - { - case WM_INITDIALOG: - // We didn't set focus - retVal = 1; - break; - case WM_COMMAND: - wID = LOWORD( wParam ); - wNotifyCode = HIWORD( wParam ); - switch ( wID ) - { - case IDCANCEL: - if ( BN_CLICKED == wNotifyCode ) { - fAbort = TRUE; - retVal = 1; - } - break; - default: - break; - } - break; - } - return( retVal ); -} diff --git a/sdk/samples/iklowns/cgremote.h b/sdk/samples/iklowns/cgremote.h deleted file mode 100644 index 5723ecd..0000000 --- a/sdk/samples/iklowns/cgremote.h +++ /dev/null @@ -1,88 +0,0 @@ -/*===========================================================================*\ -| -| File: cgremote.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGREMOTE_H -#define _CGREMOTE_H -#include "linklist.h" -#include "dplay.h" - -#define MAX_OBJ_NAME 9 - -typedef int ACTION; -typedef char OBJ_ID[MAX_OBJ_NAME]; - -typedef struct -{ - BYTE InstanceID; - BYTE OwnerID; - OBJ_ID ObjectID; -} REMOTE_OBJECT; - -#include "cgremque.h" - -#define CREATE_OBJECT 0x81 -#define DESTROY_OBJECT 0x82 - -REMOTE_OBJECT *CreateRemotePeers( - char *name, - DWORD InstanceID -); - -inline ACTION PollRemoteAction( - REMOTE_OBJECT *pObj, - void *&Data, - DWORD &nDataSize -) -{ - return(GetNextRemoteAction(GetRemoteObjectQueue(pObj), Data, nDataSize)); -} - -BOOL SendRemoteAction( - REMOTE_OBJECT *pObj, - ACTION Action, - void *Data, - DWORD nDataSize -); - -void ReleaseRemoteData(void *); - -BOOL DestroyRemotePeer( - REMOTE_OBJECT *pObj -); - -BOOL RemoteCreateLobby(void); -BOOL RemoteConnect(REFGUID pGuid, LPSTR FullName, LPSTR NickName); -BOOL RemoteCreate(REFGUID pGuid, LPSTR FullName, LPSTR NickName); - -class CGameInput; - - -void SetCurrentLevel(void *); - -#endif - diff --git a/sdk/samples/iklowns/cgremque.cpp b/sdk/samples/iklowns/cgremque.cpp deleted file mode 100644 index 4c33e62..0000000 --- a/sdk/samples/iklowns/cgremque.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/*===========================================================================*\ -| -| File: cgremque.cpp -| -| Description: -| Routines to create and manage received remote actions -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//** include files ** -#ifndef __WATCOMC__ -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include -#include "linklist.h" -#include "dplay.h" -#include "cgremote.h" - -//** local definitions ** - -// Entry for object action in action queue -typedef struct -{ - ACTION Action; - DWORD nBytes; - void *Data; -} ACTION_ENTRY; - -//** external functions ** - -//** external data ** - -//** public data ** -//** private data ** - -// Master list of objects controlled by remote peers -static CLinkedList RemoteObjectList; - -//** public functions ** -//** private functions ** - -// ---------------------------------------------------------- -// CreateRemoteObjectQueue - register a new object and create an -// action queue for it! -// ---------------------------------------------------------- -CLinkedList *CreateRemoteObjectQueue( - REMOTE_OBJECT *pObj, // unique object id - void *Data // game character this pointer -) -{ - if (pObj == NULL) - return(NULL); - - // Create an object entry for the master list - REMOTE_DATA *pRemoteEntry = new REMOTE_DATA; - - // Initialize the object entry and add it to the list! - memcpy(&pRemoteEntry->RemObj, pObj, sizeof(REMOTE_OBJECT)); - pRemoteEntry->Data = Data; - pRemoteEntry->ActionList = new CLinkedList; - RemoteObjectList.Add((void *)pRemoteEntry); - - return(pRemoteEntry->ActionList); -} - -// ---------------------------------------------------------- -// FindRemoteObjectEntry - search list of registered objects -// and return its data -// ---------------------------------------------------------- -REMOTE_DATA *FindRemoteObjectEntry( - REMOTE_OBJECT *pObj // unique object id -) -{ - REMOTE_DATA *pRemoteEntry=NULL; - - // Beware of wise guys! - if (pObj == NULL) - return(NULL); - - // Search master object list for desired object entry - pRemoteEntry = (REMOTE_DATA *)RemoteObjectList.GetFirst(); - while (pRemoteEntry != NULL) - { - if (memcmp(&pRemoteEntry->RemObj, pObj, sizeof(REMOTE_OBJECT)) == 0) - { - break; - } - pRemoteEntry = (REMOTE_DATA *) RemoteObjectList.GetNext(); - } - return(pRemoteEntry); -} - -// ---------------------------------------------------------- -// DestroyRemoteObjectQueue - destroy an objects action queue -// and remove it from the list of known objects. -// ---------------------------------------------------------- -void DestroyRemoteObjectQueue( - REMOTE_OBJECT *pObj // unique object id -) -{ - REMOTE_DATA *pRemoteEntry; - - // If there is an entry in the master list, remove it! - pRemoteEntry = FindRemoteObjectEntry(pObj); - if (pRemoteEntry != NULL) - { - RemoteObjectList.Remove((void *)pRemoteEntry); - delete pRemoteEntry; - } -} - -// ---------------------------------------------------------- -// GetRemoteObjectQueue - get a pointer to the action queue -// ---------------------------------------------------------- -CLinkedList *GetRemoteObjectQueue( - REMOTE_OBJECT *pObj // unique object id -) -{ - REMOTE_DATA *pRemoteEntry; - - // Look up object in master list and return a ptr to - // its action queue - pRemoteEntry = FindRemoteObjectEntry(pObj); - if (pRemoteEntry != NULL) - return(pRemoteEntry->ActionList); - else - return(NULL); - -} - -// ---------------------------------------------------------- -// GetRemoteObjectData - retrieve an objects data value -// ---------------------------------------------------------- -void *GetRemoteObjectData( - REMOTE_OBJECT *pObj // unique object id -) -{ - REMOTE_DATA *pRemoteEntry; - - // Look up object in master list and return its data value - pRemoteEntry = FindRemoteObjectEntry(pObj); - if (pRemoteEntry != NULL) - return(pRemoteEntry->Data); - else - return(NULL); - -} - -// ---------------------------------------------------------- -// QueueRemoteAction - place an action onto the objects queue -// ---------------------------------------------------------- -BOOL QueueRemoteAction( - CLinkedList *pQueue, // object's action queue - ACTION Action, // action code - void *Data, // action data - DWORD nBytes // size of action data -) -{ - // Be sure action queue is valid! - if (pQueue == NULL) - return(FALSE); - - // Place a new action entry on the queue - ACTION_ENTRY *pAction = new ACTION_ENTRY; - - pAction->Action = Action; - pAction->nBytes = nBytes; - pAction->Data = Data; - pQueue->Append((void *)pAction); - return(TRUE); -} - -// ---------------------------------------------------------- -// GetNextRemoteAction - get the next action on the objects queue -// ---------------------------------------------------------- -ACTION GetNextRemoteAction( - CLinkedList *pQueue, // object's action queue - void *&Data, // ptr to a data ptr - DWORD &nBytes // size of action data -) -{ - ACTION_ENTRY *pAction; - ACTION Action=-1; - - // Be sure action queue is valid - if (pQueue == NULL) - return(-1); - - // Take first action off queue - pAction = (ACTION_ENTRY *)pQueue->RemoveFirst(); - - // If there is an action, set information for caller - if (pAction != NULL) - { - Data = pAction->Data; - nBytes = pAction->nBytes; - Action = pAction->Action; - - // Dispose of the action entry memory, the caller should - // delete the actual data itself (using ReleaseRemoteData) - delete pAction; - } - - return(Action); -} diff --git a/sdk/samples/iklowns/cgremque.h b/sdk/samples/iklowns/cgremque.h deleted file mode 100644 index e44caf7..0000000 --- a/sdk/samples/iklowns/cgremque.h +++ /dev/null @@ -1,48 +0,0 @@ -/*===========================================================================*\ -| -| File: cgremque.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGREMQUE_H -#define _CGREMQUE_H - -// Entry for object in master object list -typedef struct -{ - REMOTE_OBJECT RemObj; - void *Data; - CLinkedList *ActionList; -} REMOTE_DATA; - -CLinkedList *CreateRemoteObjectQueue(REMOTE_OBJECT *, void *); -void DestroyRemoteObjectQueue(REMOTE_OBJECT *); -CLinkedList *GetRemoteObjectQueue(REMOTE_OBJECT *); - -ACTION GetNextRemoteAction(CLinkedList *, void *&, DWORD &); -BOOL QueueRemoteAction(CLinkedList *, ACTION, void *, DWORD); - -REMOTE_DATA *FindRemoteObjectEntry(REMOTE_OBJECT *); -#endif diff --git a/sdk/samples/iklowns/cgres.cpp b/sdk/samples/iklowns/cgres.cpp deleted file mode 100644 index 5988a2a..0000000 --- a/sdk/samples/iklowns/cgres.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/*===========================================================================*\ -| -| File: cgres.cpp -| -| Description: -| Class implemetation for handling string resources -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#include "cgexcpt.h" -#include "cgres.h" - -/*---------------------------------------------------------------------------*\ -| -| Class CGameStringResource -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -CGameStringResource::CGameStringResource( - HINSTANCE hInst, // as passed to LoadString - UINT resId // ID of the string - ) -{ - mString[0] = '\0'; - if (!LoadString( - hInst, - resId, - mString, - MAX_STRING_LENGTH - ) - ) - { - // nasty business! we may be in an exception already, so be careful - throw CGameResourceError(); - } - -} - -CGameStringResource::~CGameStringResource() -{ - -} diff --git a/sdk/samples/iklowns/cgrsrce.h b/sdk/samples/iklowns/cgrsrce.h deleted file mode 100644 index 9479887..0000000 --- a/sdk/samples/iklowns/cgrsrce.h +++ /dev/null @@ -1,105 +0,0 @@ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by iklowns.rc -// -#define IDS_INFO_TITLE 1 -#define IDS_ERROR_TITLE 2 -#define IDS_INVALID_FILE 3 -#define IDS_GDI_ERROR 4 -#define IDS_STARTUP_ERROR 5 -#define IDR_GENERIC 101 -#define IDI_APP 102 -#define IDD_ABOUTBOX 103 -#define IDR_ACCELERATOR1 106 -#define IDD_REMCONNABORTDLG 106 -#define IDD_Q_CREATE 108 -#define IDD_OPTIONS 109 -#define IDD_CHOOSEPROVIDER 129 -#define IDD_SELSESSION 130 -#define IDC_FILEDESCRIPTION 1000 -#define IDC_PRODUCTVERSION 1001 -#define IDC_LEGALCOPYRIGHT 1002 -#define IDC_COMPANYNAME 1003 -#define IDC_LEGALTRADEMARKS 1004 -#define IDC_CREATE 1005 -#define IDC_CONNECT 1006 -#define IDC_LISTOPTION 1009 -#define IDC_LIST1 1021 -#define IDC_LB_SESSION 1024 -#define OPTION_PLAY_START 2001 -#define IDS_SOLO_PLAY 2001 -#define IDS_TWO_PLAYER 2002 -#define IDS_NET_PLAY 2003 -#define IDS_QUIT_GAME 2004 -#define OPTION_PLAY_END 2004 -#define IDS_INSTRUCTION_1 2005 -#define IDS_INSTRUCTION_2 2006 -#define CREDIT_START 2100 -#define IDS_LOAD_MSG 2200 -#define IDS_WIN_START 2300 -#define IDS_WIN_1 2300 -#define IDS_WIN_2 2301 -#define IDS_WIN_3 2302 -#define IDS_WIN_4 2303 -#define IDS_WIN_5 2304 -#define IDS_WIN_6 2305 -#define IDS_WIN_END IDS_WIN_6 -#define IDS_LOSE_START 2400 -#define IDS_LOSE_1 2400 -#define IDS_LOSE_2 2401 -#define IDS_LOSE_3 2402 -#define IDS_LOSE_4 2403 -#define IDS_LOSE_5 2404 -#define IDS_LOSE_6 2405 -#define IDS_LOSE_END IDS_LOSE_6 -#define NET_GAME_OPTION 2410 -#define IDM_NEW 40001 -#define IDM_OPEN 40002 -#define IDM_SAVE 40003 -#define IDM_SAVEAS 40004 -#define IDM_PRINT 40005 -#define IDM_PRINTSETUP 40006 -#define IDM_EXIT 40007 -#define IDM_UNDO 40008 -#define IDM_CUT 40009 -#define IDM_COPY 40010 -#define IDM_PASTE 40011 -#define IDM_LINK 40012 -#define IDM_LINKS 40013 -#define IDM_HELPCONTENTS 40014 -#define IDM_HELPSEARCH 40015 -#define IDM_HELPHELP 40016 -#define IDM_ABOUT 40017 -#define IDA_LEFT 40018 -#define IDA_RIGHT 40019 -#define IDA_UP 40020 -#define IDA_DOWN 40021 -#define IDA_RETURN 40022 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 110 -#define _APS_NEXT_COMMAND_VALUE 40023 -#define _APS_NEXT_CONTROL_VALUE 1010 -#define _APS_NEXT_SYMED_VALUE 104 -#endif -#endif diff --git a/sdk/samples/iklowns/cgscene.cpp b/sdk/samples/iklowns/cgscene.cpp deleted file mode 100644 index 6dcd2aa..0000000 --- a/sdk/samples/iklowns/cgscene.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/*===========================================================================*\ -| -| File: cgscene.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgdebug.h" -#include "cgimage.h" -#include "cgscene.h" - -#define MAX_IMAGES 4 - -/*---------------------------------------------------------------------------*\ -| -| Class CGameScene -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameScene::CGameScene( - ) -{ -} - -CGameScene::~CGameScene() -{ -} - - -/*---------------------------------------------------------------------------*\ -| -| Class CGameGruberScene -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameGruberScene::CGameGruberScene( - char* pFileName, - char* pSceneName - ) : CGameScene(), - mpImages( NULL ) -{ - // get the image info - char nameBuf[256]; - CGameGruberImage* tempImages[MAX_IMAGES]; - - // load all images for this scene - GetPrivateProfileString( - pSceneName, - NULL, // grab all the keys - "", // no default - nameBuf, - sizeof( nameBuf ), - pFileName - ); - - for (char *pImage = nameBuf; *pImage && (mNumImages < MAX_IMAGES); pImage++, mNumImages++) - { - tempImages[mNumImages] = new CGameGruberImage( pImage ); - pImage += lstrlen( pImage ); // move beyond terminator - } - - // now that we know how many there are, allocate our array & copy the temp - mpImages = new CGameGruberImage*[ mNumImages ]; - CopyMemory( mpImages, tempImages, mNumImages * sizeof( CGameGruberImage* ) ); - - // !!! for now use 1st image for size - mMaxX = mpImages[0]->GetWidth(); - mMaxY = mpImages[0]->GetHeight(); -} - -CGameGruberScene::~CGameGruberScene() -{ - if (mpImages) - { - for (; mNumImages>0; mNumImages--) - { - delete mpImages[mNumImages-1]; - } - - delete[] mpImages; - } -} - -BOOL -CGameGruberScene::ScrollTo( - int x, - int y - ) -{ - // !!! for now, assume 1 image - return mpImages[0]->ScrollTo(x, y); -} - -void -CGameGruberScene::Render( - CGameGDIScreen* pScreen - ) -{ - // !!! for now, assume 1 image - mpImages[0]->Render( pScreen ); -} diff --git a/sdk/samples/iklowns/cgscreen.cpp b/sdk/samples/iklowns/cgscreen.cpp deleted file mode 100644 index bd58dad..0000000 --- a/sdk/samples/iklowns/cgscreen.cpp +++ /dev/null @@ -1,506 +0,0 @@ -/*===========================================================================*\ -| -| File: cgscreen.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include -#include "cgdebug.h" -#include "cgbitbuf.h" -#include "cgscreen.h" - -// read a .pal file & convert to PALETTEENTRY array -void -ReadPalFile( char* pFile, LPPALETTEENTRY ppe, int count ) -{ - int fh; - WORD i; - unsigned char pRgb[4]; - - fh = _lopen( pFile, OF_READ); - if( fh == -1 ) - { - DB_LOG(DB_PROBLEM, "Can't open palette file."); - return; - } - - _llseek(fh, 24, SEEK_SET); - - for( i=0; i < min(256, count); i++ ) - { - if( sizeof (pRgb) != _lread (fh, pRgb, sizeof (pRgb))) - { - _lclose( fh ); - return; - } - ppe[i].peRed = (BYTE)pRgb[0]; - ppe[i].peGreen = (BYTE)pRgb[1]; - ppe[i].peBlue = (BYTE)pRgb[2]; - } - - ppe[0].peRed = (BYTE)0; - ppe[0].peGreen = (BYTE)0; - ppe[0].peBlue = (BYTE)0; - - if (count >= 256) - { - ppe[255].peRed = (BYTE)255; - ppe[255].peGreen = (BYTE)255; - ppe[255].peBlue = (BYTE)255; - } - - _lclose( fh ); -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameScreen -| -| DESCRIPTION: -| Encapsulates access to video display in Manhattan sample game -| -| -\*---------------------------------------------------------------------------*/ -CGameScreen::CGameScreen( - HWND hwnd, // this window determines "screen" size - int logWidth, - int logHeight, - int orgX, - int orgY - ) : mxCurrent( orgX ), - myCurrent( orgY ), - mhwnd( hwnd ), - mOutWidth( 0 ), - mOutHeight( 0 ), - mOldPalette( NULL ) -{ - DB_CHECK( hwnd, "DEBUG: NULL hwnd in CGameScreen."); - - if (hwnd) - { - HDC hdc = GetDC( hwnd ); - - // save previous palette - mOldPalette = (HPALETTE)GetCurrentObject( hdc, OBJ_PAL ); - - //now tell Windows to let us set our palette -// SetSystemPaletteUse( hdc, SYSPAL_NOSTATIC ); - - // determine size of output bitmap - if (GetClientRect( hwnd, &mScreenRect )) - { - mOutWidth = mScreenRect.right; - mOutHeight = mScreenRect.bottom; - - PatBlt(hdc, 0,0,mOutWidth,mOutHeight,BLACKNESS); - } - else - { - DB_LOG( DB_PROBLEM, "DEBUG: GetClientRect failed in CGameScreen" ); - } - - ReleaseDC( hwnd, hdc ); - } -} - -CGameScreen::~CGameScreen() -{ - HDC hdc = GetDC( HWND_DESKTOP ); - - PatBlt(hdc, 0,0,mOutWidth,mOutHeight,BLACKNESS); - if (mOldPalette) - { - SelectPalette( hdc, mOldPalette, FALSE ); - } - -// SetSystemPaletteUse( hdc, SYSPAL_STATIC ); - RealizePalette( hdc ); - - ReleaseDC( HWND_DESKTOP, hdc ); -} - -void CGameScreen::SetPalette(HPALETTE hPal) -{ - HDC hdc = GetDC( HWND_DESKTOP ); - - SelectPalette( hdc, hPal, FALSE ); - - RealizePalette( hdc ); - - ReleaseDC( HWND_DESKTOP, hdc ); -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDDrawScreen -| -| DESCRIPTION: -| provide screen access via DirectDraw -| -| -\*---------------------------------------------------------------------------*/ - -#define FRONT_BUFFER 0 -#define BACK_BUFFER 1 - -CGameDDrawScreen::CGameDDrawScreen( - HWND hwnd, // this window determines "screen" size - int logWidth, - int logHeight, - int orgX, - int orgY - ) : CGameScreen( hwnd, logWidth, orgX, orgY ), - mBackSurface( 1 ) -{ - // create the primary surfaces (front & back) - mpSurfaces[0] = new CGameDDrawScreenBuffer; - mpSurfaces[1] = new CGameDDrawScreenBuffer(mpSurfaces[0]); -} - -CGameDDrawScreen::~CGameDDrawScreen() -{ - delete mpSurfaces[1]; - delete mpSurfaces[0]; -} - -void CGameDDrawScreen::Render( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ) -{ - pSrcBuffer->BltDDraw( - mpSurfaces[BACK_BUFFER], - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - rop - ); -} - -void CGameDDrawScreen::TransRender( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc - ) -{ - pSrcBuffer->TransBltDDraw( - (CGameDDrawBitBuffer*) mpSurfaces[BACK_BUFFER], - xDest, - yDest, - wDest, - hDest, - xSrc, - ySrc, - 1 - ); -} - -void CGameDDrawScreen::PageFlip() -{ - HRESULT result; - - int stopCount = DDRAW_RETRY; - - do - { - result = mpSurfaces[FRONT_BUFFER]->mpSurface->Flip( - NULL, DDFLIP_WAIT ); - if (result == DDERR_SURFACELOST ) - { - mpSurfaces[FRONT_BUFFER]->mpSurface->Restore(); - mpSurfaces[BACK_BUFFER]->mpSurface->Restore(); - } - } - while( (result != DD_OK) && (--stopCount > 0)); -} - -void -CGameDDrawScreen::SetMode( - int width, - int height, - int bits - ) -{ - mpSurfaces[FRONT_BUFFER]->SetMode( - width, - height, - bits - ); -} - -void -CGameDDrawScreen::ShowGDIPage() -{ - mpSurfaces[FRONT_BUFFER]->ShowGDIPage(); -} - -void -CGameDDrawScreen::RestoreMode() -{ - mpSurfaces[FRONT_BUFFER]->RestoreMode(); -} - -void -CGameDDrawScreen::Refresh() -{ - mpSurfaces[FRONT_BUFFER]->mpSurface->Restore(); - mpSurfaces[BACK_BUFFER]->mpSurface->Restore(); -} - - -void -CGameDDrawScreen::ColorFill( - LPRECT pRect, - int palIndex - ) -{ - HRESULT result; - DDBLTFX dbf; - RECT tempR = *pRect; - - // rects are off by one - tempR.right++; - tempR.bottom++; - - memset( &dbf, 0, sizeof( dbf ) ); - dbf.dwSize = sizeof(dbf); - dbf.dwFillColor = palIndex; - - int stopCount = DDRAW_RETRY; - - do - { - result = mpSurfaces[BACK_BUFFER]->mpSurface->Blt( - &tempR, // dest rect - NULL, // src surf - NULL, // src rect - DDBLT_COLORFILL,// flags - &dbf ); // bltfx - - // surface may have been lost due to mode switch - if (result == DDERR_SURFACELOST) - { - mpSurfaces[FRONT_BUFFER]->mpSurface->Restore(); - mpSurfaces[BACK_BUFFER]->mpSurface->Restore(); - continue; - } - } - while( (result != DD_OK) && (--stopCount > 0)); -} - -// read in a .pal file & set our palette to it -void CGameDDrawScreen::SetPalette( char* pFile ) -{ - LPPALETTEENTRY ppe; - - ppe = new PALETTEENTRY[256]; - - ReadPalFile( pFile, ppe, 256 ); - - mpSurfaces[FRONT_BUFFER]->SetPalette( ppe ); - delete[] ppe; -} - -int -CGameDDrawScreen::GetVideoMemory() -{ - return mpSurfaces[FRONT_BUFFER]->GetVideoMemory(); -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameDSScreen -| -| DESCRIPTION: -| provide screen access via CreateDIBSection -| -| -\*---------------------------------------------------------------------------*/ - -CGameDSScreen::CGameDSScreen( - HWND hwnd, // this window determines "screen" size - int logWidth, - int logHeight, - int orgX, - int orgY - ) : CGameScreen( hwnd, logWidth, orgX, orgY ) -{ - LOGPALETTE* pPal; - HPALETTE hOurPal = NULL; - - pPal = (LOGPALETTE*) GlobalAllocPtr( LPTR, sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY) ); - - if (pPal) - { - pPal->palNumEntries = 256; - pPal->palVersion = 0x300; - - ReadPalFile( "iklowns.pal", pPal->palPalEntry, 256 ); - - hOurPal = CreatePalette( pPal ); - } - - GlobalFreePtr( pPal ); - - // create the primary surfaces (front & back) - mpScreenDIB = new CGameDIB( logWidth, logHeight, hOurPal ); - mpBufferDIB = new CGameDIB( logWidth, logHeight, hOurPal ); - - if (hwnd) - { - mhdcOut = GetDC( hwnd ); - - mhdcBackBuffer = CreateCompatibleDC( mhdcOut ); - - SelectPalette( mhdcOut, hOurPal, FALSE ); - RealizePalette( mhdcOut ); - - SelectPalette( mhdcBackBuffer, hOurPal, FALSE ); - RealizePalette( mhdcBackBuffer ); - - HBITMAP hbmOld = (HBITMAP)SelectObject( mhdcBackBuffer, mpBufferDIB->GetHBitmap() ); - - if (hbmOld) - DeleteObject( hbmOld ); - } - -} - -CGameDSScreen::~CGameDSScreen() -{ - if (mhdcOut) - { - // restore the old palette - if (mOldPalette) - SelectPalette( mhdcOut, mOldPalette, FALSE ); - - ReleaseDC( mhwnd, mhdcOut ); - } - - // free up the backbuffer DC - if (mhdcBackBuffer) - DeleteDC( mhdcBackBuffer ); - - delete mpBufferDIB; - delete mpScreenDIB; -} - -void CGameDSScreen::Render( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ) -{ - int scanDest = mpBufferDIB->BytesPerScanline(); - int scanSrc = ((CGameDSBitBuffer*)pSrcBuffer)->mpDIB->BytesPerScanline(); - - CopyDIBBits( - mpBufferDIB->GetPixelAddress( xDest, yDest ), - ((CGameDSBitBuffer*)pSrcBuffer)->mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) -scanDest, - (DWORD) -scanSrc - ); -} - -void CGameDSScreen::TransRender( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc - ) -{ - int scanDest = mpBufferDIB->BytesPerScanline(); - int scanSrc = ((CGameDSBitBuffer*)pSrcBuffer)->mpDIB->BytesPerScanline(); - - TransCopyDIBBits( - mpBufferDIB->GetPixelAddress( xDest, yDest ), - ((CGameDSBitBuffer*)pSrcBuffer)->mpDIB->GetPixelAddress( xSrc, ySrc ), - wDest, // width pixels - hDest, - (DWORD) -scanDest, - (DWORD) -scanSrc, - 1 - ); -} - -// we emulate page flipping by simply blitting from back to front -void CGameDSScreen::PageFlip() -{ - BitBlt( mhdcOut, 0, 0, mOutWidth, mOutHeight, mhdcBackBuffer, 0, 0, SRCCOPY ); -} - -void -CGameDSScreen::ColorFill( - LPRECT pRect, - int palIndex - ) -{ - LPBYTE lpdest; - int bytes = pRect->right - pRect->left + 1; - - for (int line=pRect->top; line<=pRect->bottom; line++) - { - lpdest = mpBufferDIB->GetPixelAddress( pRect->left, line ); - memset( lpdest, palIndex, bytes ); - } -} - -void CGameDSScreen::SetPalette(HPALETTE hPal) -{ - CGameScreen::SetPalette( hPal ); - - SelectPalette( mhdcBackBuffer, hPal, FALSE ); - RealizePalette( mhdcBackBuffer ); -} - -// read in a .pal file & set our palette to it -void CGameDSScreen::SetPalette( char* pFile ) -{ -} diff --git a/sdk/samples/iklowns/cgscreen.h b/sdk/samples/iklowns/cgscreen.h deleted file mode 100644 index 9a49472..0000000 --- a/sdk/samples/iklowns/cgscreen.h +++ /dev/null @@ -1,208 +0,0 @@ -/*===========================================================================*\ -| -| File: cgscreen.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGSCREEN_H -#define CGSCREEN_H - -#include -#include -#include "cgbitbuf.h" - -enum ST_TYPE -{ - ST_ROOT, // CGameScreen -- abstract base class - ST_DDraw, // CGameDDrawScreen -- Direct Draw screen - ST_DS // CGameDSScreen -- DIBSections screen -}; - -class CGameScreen -{ -public: - CGameScreen(HWND hwnd, int logWidth, int logHeight, int orgX=0, int orgY=0); - virtual ~CGameScreen(); - - virtual void SetPalette(HPALETTE); - virtual void SetPalette( char* ) = 0; - - virtual void Render( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ){}; - - // render with transparency mask - virtual void TransRender( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc - ) = 0; - - virtual void PageFlip()=0; - virtual void SetMode( int width, int height, int bits )=0; - virtual void RestoreMode()=0; - - virtual void ColorFill( LPRECT pRect, int palIndex )=0; - - // report this object's type - virtual ST_TYPE TypeID() - { - return ST_ROOT; - } - - virtual void Refresh() - { - } - -protected: - HWND mhwnd; // parent window - int mOutWidth; // width of output screen - int mOutHeight; // height of output screen - RECT mScreenRect; // describes entire screen - - int mxCurrent; // current x scroll position - int myCurrent; // current y scroll position - - HPALETTE mOldPalette; // saved to restore when object goes away -}; - -class CGameDDrawScreen : public CGameScreen -{ -public: - CGameDDrawScreen(HWND hwnd, int logWidth, int logHeight, int orgX=0, int orgY=0); - virtual ~CGameDDrawScreen(); - - virtual void Render( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ); - - // render with transparency mask - virtual void TransRender( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc - ); - - virtual void PageFlip(); - virtual void SetMode( int width, int height, int bits ); - virtual void ShowGDIPage(); - virtual void RestoreMode(); - virtual void ColorFill( LPRECT pRect, int palIndex ); - - virtual void SetPalette( char* ); - - // use direct draw to determine total video memory - int GetVideoMemory(); - - // report this object's type - virtual ST_TYPE TypeID() - { - return ST_DDraw; - } - - virtual void Refresh(); - -protected: - CGameDDrawScreenBuffer* mpSurfaces[2]; // ptrs to front & back buffer - int mBackSurface; // index to current back buffer -}; - -// use CreateDIBSection for accessing bits -class CGameDSScreen : public CGameScreen -{ -public: - CGameDSScreen(HWND hwnd, int logWidth, int logHeight, int orgX=0, int orgY=0); - virtual ~CGameDSScreen(); - - virtual void Render( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc, - DWORD rop - ); - - // render with transparency mask - virtual void TransRender( - int xDest, - int yDest, - int wDest, - int hDest, - CGameBitBuffer* pSrcBuffer, - int xSrc, - int ySrc - ); - - virtual void PageFlip(); - virtual void SetMode( int width, int height, int bits ){}; - virtual void ShowGDIPage(){}; - virtual void RestoreMode(){}; - virtual void SetPalette(HPALETTE); - virtual void SetPalette( char* ); - virtual void ColorFill( LPRECT pRect, int palIndex ); - - // report this object's type - virtual ST_TYPE TypeID() - { - return ST_DS; - } - -protected: - HDC mhdcOut; // keep output hdc around (assumes window is CS_OWNDC!) - HDC mhdcBackBuffer; // for holding backbuffer - - CGameDIB* mpBufferDIB; // ptr to back buffer - CGameDIB* mpScreenDIB; // ptr to screen - - HBITMAP mhbmOld; // for restoring screen's bitmap -}; - -#endif // CGSCREEN_H diff --git a/sdk/samples/iklowns/cgsound.cpp b/sdk/samples/iklowns/cgsound.cpp deleted file mode 100644 index 417f0b3..0000000 --- a/sdk/samples/iklowns/cgsound.cpp +++ /dev/null @@ -1,702 +0,0 @@ -/*===========================================================================*\ -| -| File: cgsound.cpp -| -| Description: -| Sample Immortal Klowns game sound effects routines. -| -| Sound effects are implemented as an object which are -| loaded from a wave file (.WAV) and can be mixed with -| other sounds as well as being algorithmically altered -| (panned from left to right, pitch changes, and volume -| changes). -| -| For demonstration purposes, sounds may be played using a -| variety of methods. -| 1) DirectSound - the preferred method, requires -| that a supported sound board be present -| and that the DirectSound drivers be installed. -| Offers greatest flexibility and lowest latency. -| Doesn't support compressed wave files. -| 2) waveOut - standard Windows API for low-level sound -| support. Hardest to code for and not as flexible -| as DirectSound nor as low in latency. Assumes -| similar format for all waves. Only allows playing -| one sound at a time (without using WaveMix). -| 3) sndPlaySound - the simpliest interface which -| yields the least flexibility and worst latency. -| Only one sound may be played at a time! -| -| If desired, individual sounds may be played using different -| methods (there's no advantage to this, it's just for demos). -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//** include files ** -#include -#include -#include -#include "linklist.h" -#include "cgwave.h" -#include "cgsound.h" -#include "cgglobl.h" - -//** local definitions ** -// Default volume and panning values -#define MINFREQ_TB 0 -#define MAXFREQ_TB 512 -#define MINPAN_TB 0 -#define MAXPAN_TB 127 -#define MIDPAN_TB 64 -#define MINVOL_TB 0 -#define MAXVOL_TB 127 - -#define INITVOL_TB 0 -#define INITPAN_TB 0 - -//** external functions ** -//** external data ** -//** public data ** -BOOL gbQuiet = FALSE; - -//** private data ** - -// To prevent having more than one instance of the same -// sound in memory, a list of all sounds is kept. -static CLinkedList *mpWaveList = NULL; - -// In order to turn off/on sounds we need a list of actively playing -// sounds. -static CLinkedList *pNowPlayingList = NULL; - -// Pointer to DirectSound object. -static LPDIRECTSOUND gpds = NULL; -static LPDIRECTSOUNDBUFFER lpDSPrimaryBuffer=NULL; - -// Handle of WaveOut device. -static HWAVEOUT hWaveDevice = NULL; - -// ---------------------------------------------------------- -// CreatePrimarySoundBuffer - create a primary sound buffer -// for direct sound. Every DirectSound app needs to have -// one (and only one) DirectSound buffer. -// ---------------------------------------------------------- -BOOL CreatePrimarySoundBuffer() -{ - DSBUFFERDESC dsbd; // buffer description struct - MMRESULT mmResult; // result of sound calls - - // Check if we already have a primary buffer - if (gpds != NULL) - { - return(TRUE); - } - - // Create the Direct Sound Object - if (DirectSoundCreate(NULL,&gpds, NULL) != 0) - { - return(FALSE); - } - if( gpds->SetCooperativeLevel( ghMainWnd, DSSCL_NORMAL ) != DS_OK ) - { - return(FALSE); - } - - // Set up the primary direct sound buffer. - memset(&dsbd, 0, sizeof(DSBUFFERDESC)); - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; - dsbd.dwBufferBytes = 0; - - dsbd.lpwfxFormat = NULL; - - if ((mmResult = gpds->CreateSoundBuffer(&dsbd, - &lpDSPrimaryBuffer, - NULL)) != 0) - { - return(FALSE); - } - - return(TRUE); -} - -// ---------------------------------------------------------- -// InitalizeWaveDevice - be sure wave method is ready for use. -// ---------------------------------------------------------- -BOOL InitializeWaveDevice( - int WaveMode, // sndPlaySound, waveOut, or DirectSound - LPWAVEFORMATEX pFormat // default wave format -) -{ - // If we are doing waveOut's then we need a handle to the device - // driver. - if (WaveMode == USE_WAVEOUT) - { - - // If there isn't a wave device already open, open one - // using the given format - if (hWaveDevice == NULL) - { - if (waveOutOpen((LPHWAVEOUT)&hWaveDevice - , WAVE_MAPPER, pFormat, NULL, 0L, 0)) - { - return(FALSE); - } - } - - // Must be using DirectSound, make sure we have a primary buffer - } else { - - if (pNowPlayingList == NULL) - { - pNowPlayingList = new CLinkedList; - } - - // Create a DirectSound primary buffer - return (CreatePrimarySoundBuffer()); - } - return(TRUE); -} - - -// ---------------------------------------------------------- -// LoadWaveData - read .WAV file information into appropriate -// memory buffer for playback. -// ---------------------------------------------------------- -LPWAVEHDR LoadWaveData( - CSoundEffect *pSound, // sound effect instance - LPSTR WaveName, // .WAV filename - int WaveMode // sndPlaySound, waveOut or DirectSound -) -{ - LPBYTE lpData = NULL; - LPWAVEHDR lpWaveHdr = NULL; - DWORD dwDataSize = 0; - LPDIRECTSOUNDBUFFER lpDirectSoundBuffer = NULL; - LPWAVEFORMATEX pwfxInfo = NULL; - - // Check to be sure a non-null name was given - if ((WaveName == NULL) || (*WaveName == '\0')) - { - return(NULL); - } - - // For sndPlaySound, we just read the whole file into a buffer - if (WaveMode == USE_SNDPLAY) - { - HANDLE hFile = CreateFile(WaveName, GENERIC_READ, FILE_SHARE_READ - , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) - { - return(NULL); - } - - dwDataSize = GetFileSize(hFile, NULL); - if ((dwDataSize == 0xFFFFFFFF) || (dwDataSize == 0)) - { - CloseHandle(hFile); - return(NULL); - } - - // Allocate and lock memory for the waveform data. The memory - // for waveform data must be globally allocated with - // GMEM_MOVEABLE and GMEM_SHARE flags. - if ((lpData = (LPBYTE) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_SHARE - , dwDataSize)) == NULL) - { - CloseHandle(hFile); - return(NULL); - } - - // Read the whole wave file in - ReadFile(hFile, lpData, dwDataSize, &dwDataSize, NULL); - CloseHandle(hFile); - - // Either DirectSound or WaveOut - } else { - - HMMIO hmmioIn; - MMCKINFO ckInRiff; - MMCKINFO ckIn; - UINT cbActualRead; - UINT cbSize; - - pwfxInfo = NULL; - cbSize = 0; - - // Use routines in CGWAVE to open the sound file and - // parse the data in it. - if (WaveOpenFile(WaveName, &hmmioIn, &pwfxInfo, &ckInRiff) != 0) - { - if (pwfxInfo != NULL) - GlobalFree(pwfxInfo); - return(NULL); - } - - // Be sure we have an output device ready to play the sound - if (!InitializeWaveDevice(WaveMode, pwfxInfo)) - { - mmioClose(hmmioIn, 0); - if (pwfxInfo != NULL) - GlobalFree(pwfxInfo); - return(NULL); - } - - - // Position the wave file for reading the wave data - if (WaveStartDataRead(&hmmioIn, &ckIn, &ckInRiff) != 0) - { - mmioClose(hmmioIn, 0); - if (pwfxInfo != NULL) - GlobalFree(pwfxInfo); - return(NULL); - } - - // Ok, size of wave data is in ckIn, allocate that buffer. - dwDataSize = ckIn.cksize; - - // waveOut requires that we allocate the data - if (WaveMode == USE_WAVEOUT) - { - - if ((lpData = (LPBYTE)GlobalAlloc(GMEM_FIXED - , dwDataSize)) == NULL) - { - mmioClose(hmmioIn, 0); - if (pwfxInfo != NULL) - GlobalFree(pwfxInfo); - return(NULL); - } - // For DirectSound, we let it allocate the buffer for us. - } else { - DSBUFFERDESC dsbd; - DWORD dwBSize; - DWORD dwWrapBSize; - LPVOID lpWrapPtr; - DWORD dw; // size place holder - - // Set up the secondary direct sound buffer. - memset(&dsbd, 0, sizeof(DSBUFFERDESC)); - dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_CTRLDEFAULT; - dsbd.dwBufferBytes = dwDataSize; - dw = pwfxInfo->cbSize + sizeof(WAVEFORMATEX); - - if ((dsbd.lpwfxFormat = (LPWAVEFORMATEX)GlobalAllocPtr(GPTR|GMEM_ZEROINIT, dw)) == NULL) - { - mmioClose(hmmioIn, 0); - return NULL; - } - - // Setup the format, frequency, volume, etc. - memcpy( dsbd.lpwfxFormat, pwfxInfo, dw ); - - if (gpds->CreateSoundBuffer(&dsbd, - &lpDirectSoundBuffer, - NULL) != 0) - { - GlobalFreePtr(dsbd.lpwfxFormat); - mmioClose(hmmioIn, 0); - return NULL; - } - - GlobalFreePtr(dsbd.lpwfxFormat); - - // Need to lock the buffer so that we can write to it! - if (lpDirectSoundBuffer->Lock( - 0, - dwDataSize, - (LPLPVOID)&lpData, - &dwBSize, - &lpWrapPtr, - &dwWrapBSize, - 0L) != 0) - { - mmioClose(hmmioIn, 0); - return NULL; - } else { - dwDataSize = dwBSize; - } - } - - // Now read the actual wave data into the data buffer. - if (WaveReadFile(hmmioIn, dwDataSize, lpData, &ckIn - , &cbActualRead) != 0) - { - // Data didn't get read for some reason! - if (pwfxInfo != NULL) - GlobalFree(pwfxInfo); - if (lpData != NULL) - GlobalFree(lpData); - } - - // Save info on size of data and close the wave file - cbSize = cbActualRead; - dwDataSize = cbSize; - mmioClose(hmmioIn, 0); - - // If we have a DirectSound buffer, set format & unlock it. - if (lpDirectSoundBuffer != NULL) - { - lpDirectSoundBuffer->Unlock(lpData, cbActualRead, NULL, 0 ); - } - - } - - // Allocate and lock memory for the header. This memory must - // also be globally allocated with GMEM_MOVEABLE and GMEM_SHARE flags. - if ((lpWaveHdr = (LPWAVEHDR) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_SHARE - , (DWORD)sizeof(WAVEHDR))) == NULL) { - GlobalFreePtr(lpData); - return(NULL); - } - - // After allocation, set up and prepare header. This struct will be - // used to play the sounds at the appropriate time. - lpWaveHdr->lpData = (LPSTR) lpData; - lpWaveHdr->dwBufferLength = dwDataSize; - lpWaveHdr->dwFlags = DSBCAPS_CTRLDEFAULT; - lpWaveHdr->dwLoops = 0L; - - pSound->pWaveInfo->lpDirectSoundBuffer = lpDirectSoundBuffer; - pSound->pWaveInfo->pwfxInfo = pwfxInfo; - - return(lpWaveHdr); -} - -// ---------------------------------------------------------- -// CSoundEffect constructor -// ---------------------------------------------------------- -CSoundEffect::CSoundEffect( - LPSTR WaveName, // name of wave file - DWORD Id, // object id to allow one buffer per object - BOOL fLoopIt, // loop the sound when played - int WaveMode // sndPlaySound, waveOut or DirectSound -) -{ - pWaveInfo = NULL; - fLoop = fLoopIt; - fPlaying = FALSE; - - // Guard against wise-guys (we don't mind) - if ((WaveName == NULL) || (*WaveName == '\0')) - return; - - CSoundEffect::WaveMode = WaveMode; - curVolume = MAXVOL_TB; - fMuted = FALSE; - - // initialize wave list if necessary - if (!mpWaveList) - { - mpWaveList = new CLinkedList; - } else { - // Need to search wave list to see if we already have this - // wave data cached. - WAVE_ENTRY *pCurBuffer = (WAVE_ENTRY *) mpWaveList->GetFirst(); - - while (pCurBuffer && !pWaveInfo) - { - // Do the name and mode match? - if ((lstrcmpi( WaveName, pCurBuffer->mpFileName ) == 0 ) - && (pCurBuffer->hObjectId == Id) - && (pCurBuffer->WaveMode == WaveMode)) - { - pCurBuffer->mRefCount++; - pWaveInfo = pCurBuffer; - } else { - pCurBuffer = (WAVE_ENTRY *) mpWaveList->GetNext(); - } - } - } - - // if we didn't find the wave file in our cache, we need to load it - if (!pWaveInfo) - { - LPWAVEHDR pWaveHdr; - pWaveInfo = new WAVE_ENTRY; - - // Load up the wave data - if (pWaveHdr = LoadWaveData(this, WaveName, WaveMode)) - { - // Add to list of known sounds - pWaveInfo->mpFileName = new char [lstrlen(WaveName)+1]; - lstrcpy(pWaveInfo->mpFileName, WaveName); - pWaveInfo->pWaveHdr = pWaveHdr; - pWaveInfo->WaveMode = WaveMode; - pWaveInfo->hObjectId = Id; - pWaveInfo->mRefCount = 1; - mpWaveList->Append( pWaveInfo ); - lpDirectSoundBuffer = pWaveInfo->lpDirectSoundBuffer; - } else { - delete pWaveInfo; - pWaveInfo = NULL; - } - } else { - lpDirectSoundBuffer = pWaveInfo->lpDirectSoundBuffer; - } -} - -// ---------------------------------------------------------- -// CSoundEffect destructor -// ---------------------------------------------------------- -CSoundEffect::~CSoundEffect() -{ - Stop(); - - if ((pWaveInfo != NULL) && (--pWaveInfo->mRefCount == 0)) - { - mpWaveList->Remove( pWaveInfo ); - - delete pWaveInfo->mpFileName; - if (lpDirectSoundBuffer != NULL) - { - lpDirectSoundBuffer->Release(); - } else { - GlobalFreePtr(pWaveInfo->pWaveHdr->lpData); - } - GlobalFreePtr(pWaveInfo->pwfxInfo); - GlobalFreePtr(pWaveInfo->pWaveHdr); - delete pWaveInfo; // causes GP fault why? - pWaveInfo = NULL; - // !!! should we delete the list if empty? - } -} - -// ---------------------------------------------------------- -// Play - -// ---------------------------------------------------------- -void CSoundEffect::Play() -{ - if ((pWaveInfo == NULL) || (gbQuiet)) - { - return; - } - - fPlaying = TRUE; - - switch (WaveMode) - { - case USE_WAVEOUT: - if (pWaveInfo->pWaveHdr != NULL) - { - pWaveInfo->pWaveHdr->dwLoops = fLoop; - waveOutPrepareHeader(hWaveDevice, pWaveInfo->pWaveHdr, sizeof(WAVEHDR)); - waveOutWrite(hWaveDevice, pWaveInfo->pWaveHdr, sizeof(WAVEHDR)); - waveOutUnprepareHeader(hWaveDevice, pWaveInfo->pWaveHdr, sizeof(WAVEHDR)); - } - break; - - case USE_DSOUND: - if (lpDirectSoundBuffer != NULL) - { - - // Add sound to active list if it isn't already there - CSoundEffect *pTemp = (CSoundEffect *)pNowPlayingList->GetFirst(); - while (pTemp != NULL) - { - if (pTemp == this) - { - break; - } - pTemp = (CSoundEffect *)pNowPlayingList->GetNext(); - } - - if (pTemp == NULL) - { - pNowPlayingList->Add(this); - } - - if( fLoop ) - { - lpDirectSoundBuffer->SetCurrentPosition( 0 ); - lpDirectSoundBuffer->Play(0, 0, DSBPLAY_LOOPING); - } - else - { - lpDirectSoundBuffer->SetCurrentPosition( 0 ); - lpDirectSoundBuffer->Play(0, 0, 0); - } - } - break; - - case USE_SNDPLAY: - if (pWaveInfo->pWaveHdr != NULL) - { - UINT flags = SND_MEMORY | SND_ASYNC; - - if (fLoop) - flags |= SND_LOOP; - - sndPlaySound((LPSTR)(pWaveInfo->pWaveHdr->lpData), flags); - } - break; - } -} - -// ---------------------------------------------------------- -// Stop - -// ---------------------------------------------------------- -void CSoundEffect::Stop() -{ - if ((pWaveInfo == NULL) || (!fPlaying)) - { - return; - } - - fPlaying = FALSE; - - switch (WaveMode) - { - case USE_WAVEOUT: - if (pWaveInfo->pWaveHdr != NULL) - { - waveOutReset(hWaveDevice); - } - break; - case USE_DSOUND: - if (lpDirectSoundBuffer != NULL) - { - pNowPlayingList->Remove(this); - lpDirectSoundBuffer->Stop(); - } - break; - - case USE_SNDPLAY: - if (pWaveInfo->pWaveHdr != NULL) - { - sndPlaySound(NULL, SND_ASYNC); - } - break; - } -} - -// ---------------------------------------------------------- -// SetPan - -// ---------------------------------------------------------- -void CSoundEffect::SetPan(int PanFactor) -{ -// if ((pWaveInfo == NULL) || (curPan == PanFactor)) - if (pWaveInfo == NULL) - { - return; - } - - curPan = PanFactor; - - switch (WaveMode) - { - case USE_WAVEOUT: - break; - case USE_DSOUND: - if (lpDirectSoundBuffer != NULL) - { - // parameter pan is 0-127; dsound's pan is -10000 to +10000 - long absPan; - absPan = (10000 * ((curPan-64)>>2)) / 128; - lpDirectSoundBuffer->SetPan(absPan); - } - break; - case USE_SNDPLAY: - break; - } -} - - -// ---------------------------------------------------------- -// SetVolume - -// ---------------------------------------------------------- -void CSoundEffect::SetVolume(int Volume) -{ - if ((pWaveInfo == NULL) || (curVolume == Volume)) - { - return; - } - - curVolume = Volume; - switch (WaveMode) - { - case USE_WAVEOUT: - break; - case USE_DSOUND: - if (lpDirectSoundBuffer != NULL) - { - // parameter volume is 0-127; dsound's volume is -10000 to 0 - long absVolume; - absVolume = -((127-curVolume)<<4); - lpDirectSoundBuffer->SetVolume(absVolume); - } - break; - case USE_SNDPLAY: - break; - } -} - - -// ---------------------------------------------------------- -// SetMute - -// ---------------------------------------------------------- -void CSoundEffect::SetMute(BOOL fMute) -{ - - if ((pWaveInfo == NULL) || (fMuted == fMute)) - { - return; - } - - fMuted = fMute; - - if (fMuted) - { - Stop(); - } else { - Play(); - } -} - -void SetSilence(BOOL fQuiet) -{ - gbQuiet = fQuiet; - if (lpDSPrimaryBuffer != NULL) - { - CSoundEffect *lpSound = (CSoundEffect *)pNowPlayingList->GetFirst(); - while (lpSound != NULL) - { - - if (fQuiet) - { - lpSound->lpDirectSoundBuffer->Stop(); - } else { - if (lpSound->fLoop) - { - lpSound->lpDirectSoundBuffer->Play(0, 0, DSBPLAY_LOOPING); - } else { - lpSound->lpDirectSoundBuffer->Play(0, 0, 0); - } - } - - lpSound = (CSoundEffect *)pNowPlayingList->GetNext(); - } - } -} diff --git a/sdk/samples/iklowns/cgsound.h b/sdk/samples/iklowns/cgsound.h deleted file mode 100644 index e955f60..0000000 --- a/sdk/samples/iklowns/cgsound.h +++ /dev/null @@ -1,87 +0,0 @@ -/*===========================================================================*\ -| -| File: cgsound.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGSOUND_H -#define _CGSOUND_H - -#include -#include -extern "C" { - #include "dsound.h" -}; - -#define USE_DSOUND 0 -#define USE_WAVEOUT 1 -#define USE_SNDPLAY 2 - -// Master wave information structure -- one for each unique -// sound (not each instance). -typedef struct _WAVE_ENTRY -{ - LPSTR mpFileName; - DSBUFFERDESC *dsbd; - LPDIRECTSOUNDBUFFER lpDirectSoundBuffer; - LPWAVEFORMATEX pwfxInfo; - LPWAVEHDR pWaveHdr; - DWORD hObjectId; - int WaveMode; - int mRefCount; -} WAVE_ENTRY, *LPWAVE_ENTRY; - - -class CSoundEffect -{ -private: - LPWAVE_ENTRY pWaveInfo; // ptr to master wav info - DSBUFFERDESC *dsbd; // instance DS buffer - LPDIRECTSOUNDBUFFER lpDirectSoundBuffer; - int WaveMode; // method for playing - int curVolume; // 0-127 - int curPan; // 0=left, 127=right - BOOL fLoop; - BOOL fPlaying; - BOOL fMuted; - int curChannel; - -public: - CSoundEffect(LPSTR WaveFile, DWORD UniqueId=0, BOOL fLoopIt=FALSE - , int Mode=USE_DSOUND); - ~CSoundEffect(); - - void Play(); - void Stop(); - void SetPan(int PanFactor); - void SetVolume(int Volume); - void SetMute(BOOL); - void SetFreq(); - - friend LPWAVEHDR LoadWaveData(CSoundEffect *, LPSTR, int); - friend void SetSilence(BOOL); -}; - -#endif diff --git a/sdk/samples/iklowns/cgsprite.cpp b/sdk/samples/iklowns/cgsprite.cpp deleted file mode 100644 index badb38c..0000000 --- a/sdk/samples/iklowns/cgsprite.cpp +++ /dev/null @@ -1,537 +0,0 @@ -/*===========================================================================*\ -| -| File: cgsprite.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgdebug.h" -#include "cgglobl.h" -#include "cgtimer.h" -#include "cgscreen.h" -#include "cgsprite.h" -#include "cgupdate.h" - -extern CGameTimer* Timer; - -char seqSection[] = "Sequences"; -char seqKey[] = "Sequence"; -char spriteKey[] = "Sprite"; -char sprExtension[] = "spr"; -char bmpExtension[] = "bmp"; - -/*---------------------------------------------------------------------------*\ -| -| Class CGameSprite -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameSprite::CGameSprite( - char* pFileName, - char* pSpriteName, - CGameBitBuffer* pBits, - BOOL needHorzMirror, - BOOL needVertMirror - ) -{ - // grab this sprite's parameters from the .spr file - // and put into mInfo[0] - mInfo[SRI_NORMAL].mSrcX = (int) GetPrivateProfileInt( - pSpriteName, - "X", - 0, // default to 0 - pFileName - ); - - mInfo[SRI_NORMAL].mSrcY = (int) GetPrivateProfileInt( - pSpriteName, - "Y", - 0, // default to 0 - pFileName - ); - - mInfo[SRI_NORMAL].mpBits = pBits; - mInfo[SRI_NORMAL].mNewBits = FALSE; - - mInfo[SRI_NORMAL].mWidth = (int) GetPrivateProfileInt( - pSpriteName, - "Width", - 0, // default to 0 - pFileName - ); - - mInfo[SRI_NORMAL].mHeight = (int) GetPrivateProfileInt( - pSpriteName, - "Height", - 0, // default to 0 - pFileName - ); - - // create mirrored images if necessary - if (needHorzMirror) - { - if (gUse_DDraw) - { - mInfo[SRI_HORZMIRROR].mpBits = new CGameDDrawBitBuffer( - mInfo[SRI_NORMAL].mWidth, - mInfo[SRI_NORMAL].mHeight, - pBits->GetHPalette(), - pBits->GetTransColor() - ); - } - else - { - mInfo[SRI_HORZMIRROR].mpBits = new CGameDSBitBuffer( - mInfo[SRI_NORMAL].mWidth, - mInfo[SRI_NORMAL].mHeight, - pBits->GetHPalette(), - pBits->GetTransColor() - ); - } - - mInfo[SRI_HORZMIRROR].mNewBits = TRUE; - mInfo[SRI_HORZMIRROR].mWidth = mInfo[SRI_NORMAL].mWidth; - mInfo[SRI_HORZMIRROR].mHeight = mInfo[SRI_NORMAL].mHeight; - mInfo[SRI_HORZMIRROR].mSrcX = 0; - mInfo[SRI_HORZMIRROR].mSrcY = 0; - - mInfo[SRI_HORZMIRROR].mpBits->Blt( - mInfo[SRI_HORZMIRROR].mWidth-1, - 0, - -mInfo[SRI_HORZMIRROR].mWidth, // create mirror image - mInfo[SRI_HORZMIRROR].mHeight, - pBits, - mInfo[SRI_NORMAL].mSrcX, - mInfo[SRI_NORMAL].mSrcY, - SRCCOPY - ); - } - else - { - // just make a copy of normal image - mInfo[SRI_HORZMIRROR] = mInfo[SRI_NORMAL]; - - // negate the width to force a mirrored blt - mInfo[SRI_HORZMIRROR].mWidth = -mInfo[SRI_NORMAL].mWidth; - - // make sure we don't delete it - mInfo[SRI_HORZMIRROR].mNewBits = FALSE; - } - - if (needVertMirror) - { - if (gUse_DDraw) - { - mInfo[SRI_VERTMIRROR].mpBits = new CGameDDrawBitBuffer( - mInfo[SRI_NORMAL].mWidth, - mInfo[SRI_NORMAL].mHeight, - pBits->GetHPalette(), - pBits->GetTransColor() - ); - - } - else - { - mInfo[SRI_VERTMIRROR].mpBits = new CGameDSBitBuffer( - mInfo[SRI_NORMAL].mWidth, - mInfo[SRI_NORMAL].mHeight, - pBits->GetHPalette(), - pBits->GetTransColor() - ); - } - - mInfo[SRI_VERTMIRROR].mNewBits = TRUE; - mInfo[SRI_VERTMIRROR].mWidth = mInfo[SRI_NORMAL].mWidth; - mInfo[SRI_VERTMIRROR].mHeight = mInfo[SRI_NORMAL].mHeight; - mInfo[SRI_VERTMIRROR].mSrcX = 0; - mInfo[SRI_VERTMIRROR].mSrcY = 0; - - mInfo[SRI_VERTMIRROR].mpBits->Blt( - 0, - mInfo[SRI_VERTMIRROR].mHeight-1, - mInfo[SRI_VERTMIRROR].mWidth, - -mInfo[SRI_VERTMIRROR].mHeight, // create mirror image - pBits, - mInfo[SRI_NORMAL].mSrcX, - mInfo[SRI_NORMAL].mSrcY, - SRCCOPY - ); - } - else - { - // just make a copy of normal image - mInfo[SRI_VERTMIRROR] = mInfo[SRI_NORMAL]; - - // negate the height to force a mirrored blt - mInfo[SRI_VERTMIRROR].mHeight = -mInfo[SRI_NORMAL].mHeight; - - // make sure we don't delete it - mInfo[SRI_VERTMIRROR].mNewBits = FALSE; - } - - // do we need both horizontal and vertical? - if (needHorzMirror && needVertMirror) - { - if (gUse_DDraw) - { - mInfo[SRI_BOTHMIRROR].mpBits = new CGameDDrawBitBuffer( - mInfo[SRI_NORMAL].mWidth, - mInfo[SRI_NORMAL].mHeight, - pBits->GetHPalette(), - pBits->GetTransColor() - ); - - } - else - { - mInfo[SRI_BOTHMIRROR].mpBits = new CGameDSBitBuffer( - mInfo[SRI_NORMAL].mWidth, - mInfo[SRI_NORMAL].mHeight, - pBits->GetHPalette(), - pBits->GetTransColor() - ); - } - - mInfo[SRI_BOTHMIRROR].mNewBits = TRUE; - mInfo[SRI_BOTHMIRROR].mWidth = mInfo[SRI_NORMAL].mWidth; - mInfo[SRI_BOTHMIRROR].mHeight = mInfo[SRI_NORMAL].mHeight; - mInfo[SRI_BOTHMIRROR].mSrcX = 0; - mInfo[SRI_BOTHMIRROR].mSrcY = 0; - - - mInfo[SRI_BOTHMIRROR].mpBits->Blt( - mInfo[SRI_BOTHMIRROR].mWidth-1, - mInfo[SRI_NORMAL].mHeight-1, - -mInfo[SRI_BOTHMIRROR].mWidth, // create mirror image - -mInfo[SRI_BOTHMIRROR].mHeight, - pBits, - mInfo[SRI_NORMAL].mSrcX, - mInfo[SRI_NORMAL].mSrcY, - SRCCOPY - ); - } - else - { - // just make a copy of normal image - mInfo[SRI_BOTHMIRROR] = mInfo[SRI_NORMAL]; - - // negate the width and height to force a mirrored blt - mInfo[SRI_BOTHMIRROR].mWidth = -mInfo[SRI_NORMAL].mHeight; - mInfo[SRI_BOTHMIRROR].mHeight = -mInfo[SRI_NORMAL].mHeight; - - // make sure we don't delete it - mInfo[SRI_BOTHMIRROR].mNewBits = FALSE; - } -} - -CGameSprite::~CGameSprite() -{ - for (int i = SRI_INFOCOUNT; i>0; i--) - { - if (mInfo[i-1].mNewBits) - { - delete mInfo[i-1].mpBits; - } - } -} - -/*---------------------------------------------------------------------------*\ -| -| class CGameSpriteBuffer -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameSpriteBuffer::CGameSpriteBuffer( - char* pFileName - ) : mpFileName( NULL ), - mpBitBuffer( NULL ), - mRefCount( 0 ) -{ - mpFileName = new char[lstrlen( pFileName ) +1]; - lstrcpy( mpFileName, pFileName ); - - // open the set's DIB file - char bmpName[256]; - SprToBmp( pFileName, bmpName, 256 ); - - CGameDIB dib( bmpName ); - - if (gUse_DDraw) - { - mpBitBuffer = new CGameDDrawBitBuffer( &dib ); - if (!mpBitBuffer->IsValid()) - { - // we didn't get video memory, so delete that buffer - delete mpBitBuffer; - // & create a system memory one - mpBitBuffer = new CGameDSBitBuffer( &dib ); - } - } - else - { - mpBitBuffer = new CGameDSBitBuffer( &dib ); - } - ++mRefCount; -} - -CGameSpriteBuffer::~CGameSpriteBuffer() -{ - delete mpBitBuffer; - delete[] mpFileName; -} - -void -CGameSpriteBuffer::SprToBmp( - char* pSprName, - char* pOutBuffer, - int size - ) -{ - lstrcpyn( pOutBuffer, pSprName, size ); - - int dotPos = strcspn( pOutBuffer, "." ); - - if (dotPos < lstrlen( pOutBuffer )) - { - pOutBuffer[dotPos] = '\0'; - lstrcat( pOutBuffer, "." ); - lstrcat( pOutBuffer, bmpExtension ); - } -} - -/*---------------------------------------------------------------------------*\ -| -| Class CGameSpriteSequence -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ - -LinkedList* CGameSpriteSequence::mpBufferList = NULL; - -CGameSpriteSequence::CGameSpriteSequence( - char* pFileName, - char* pSequenceName, - int rate, - BOOL mirrorHorz, // keep mirror images of sprites? - BOOL mirrorVert - ) : mpSpriteArray( NULL ), - mNumSprites( 0 ), - mCurSprite( 0 ), - mpMyBuffer( NULL ), - mLastTime( -1 ) -{ - char sprFile[MAX_PATH]; - - lstrcpy(sprFile, gDataPath); - lstrcat(sprFile, "\\"); - lstrcat(sprFile, pFileName); - - // get a ptr to this sequence's source bitmap - mpMyBuffer = LoadSpriteBits( pFileName ); - - // get the number of sprites - mNumSprites = GetPrivateProfileInt( - "Sequences", - pSequenceName, - 0, - sprFile - ); - - mpSpriteArray = new CGameSprite*[mNumSprites]; - - // get the sprite list - char spriteBuf[256]; - char defSprite[] = ""; // no default sprite names - - GetPrivateProfileString( - pSequenceName, - NULL, // grab all the key names - defSprite, - spriteBuf, - sizeof( spriteBuf ), - sprFile - ); - - int i=0; - for (char *pSprite = spriteBuf; *pSprite && (impBitBuffer, mirrorHorz, mirrorVert ); - pSprite += lstrlen( pSprite ); // move beyond terminator - ++i; - } - - mPeriod = 1000 / rate; -} - -CGameSpriteSequence::~CGameSpriteSequence() -{ - // !!! assumes that mpSpriteArray is valid if mNumSprites>0 - for (; mNumSprites>0; mNumSprites--) - { - delete mpSpriteArray[mNumSprites-1]; - } - - // remove our file from list - UnloadSpriteBits(); - - delete[] mpSpriteArray; -} - -BOOL // return TRUE if the are more sprites in sequence -CGameSpriteSequence::Frame() -{ - return TRUE; -} - -int // return mCurSprite .... is Zero if no more (i.e., wrapped) -CGameSpriteSequence::NextSprite( - int time, // current game time - BOOL wrap // wrap around (i.e. loop) at end of sequence - ) -{ - if (mLastTime == -1) - mLastTime = time-mPeriod; - - int elapsed = time - mLastTime; - if (elapsed >= mPeriod) - { - mLastTime = time; - mCurSprite += elapsed / mPeriod; - if (mCurSprite >= mNumSprites) - { - mCurSprite = wrap ? (mCurSprite % mNumSprites) : 0; - } - } - return mCurSprite; -} - -void -CGameSpriteSequence::Render( - CGameScreen* pScreen, - int x, - int y, - BOOL revX, // reverse the image? - BOOL revY, // reverse the image? - LPRECT pDirty // invalid rectangle in screen coordinates - ) -{ - int which = (int) revX + ((int) revY * 2); - RECT update; - int clipX = max(x, pDirty->left); - int clipY = max(y, pDirty->top); - - int offsetX = max(pDirty->left - x, 0); - int offsetY = max(pDirty->top - y, 0); - - update.left = mpSpriteArray[mCurSprite]->mInfo[which].mSrcX + - offsetX; - - update.top = mpSpriteArray[mCurSprite]->mInfo[which].mSrcY + - offsetY; - - // we're using right & bottom for width & height - update.right = min( mpSpriteArray[mCurSprite]->mInfo[which].mWidth - - offsetX, pDirty->right-clipX+1 ); - - update.bottom = min( mpSpriteArray[mCurSprite]->mInfo[which].mHeight - - offsetY, pDirty->bottom-clipY+1 ); - - if ((update.right > 0) && (update.bottom > 0)) - pScreen->TransRender( - clipX, - clipY, - update.right, - update.bottom, - mpSpriteArray[mCurSprite]->mInfo[which].mpBits, - update.left, - update.top - ); -} - -// return a ptr to the sprite buffer corresponding to this .spr filename -// keeps track of whether file is already loaded & maintains reference count -CGameSpriteBuffer* -CGameSpriteSequence::LoadSpriteBits( char* pFileName ) -{ - CGameSpriteBuffer* pResult = NULL; - CGameSpriteBuffer* pCurBuffer = NULL; - - // initialize buffer list if necessary - if (!mpBufferList) - { - mpBufferList = new LinkedList; - } - else - { - pCurBuffer = (CGameSpriteBuffer*) mpBufferList->GetFirst(); - - while (pCurBuffer && !pResult) - { - if (lstrcmpi( pFileName, pCurBuffer->mpFileName ) == 0 ) - { - pResult = pCurBuffer; - pCurBuffer->mRefCount++; - } - else - { - pCurBuffer = (CGameSpriteBuffer*) mpBufferList->GetNext(); - } - } - } - - // if we didn't find it, we need to load it - if (!pResult) - { - pResult = new CGameSpriteBuffer(pFileName); // increments ref count - - mpBufferList->Append( pResult ); - } - - return pResult; -} - - -// decrement the ref count for the given file & remove it if 0 -void -CGameSpriteSequence::UnloadSpriteBits() -{ - if (--mpMyBuffer->mRefCount == 0) - { - mpBufferList->Remove( mpMyBuffer ); - delete mpMyBuffer; - - // !!! should we delete the list if empty? - } -} diff --git a/sdk/samples/iklowns/cgsprite.h b/sdk/samples/iklowns/cgsprite.h deleted file mode 100644 index 301741a..0000000 --- a/sdk/samples/iklowns/cgsprite.h +++ /dev/null @@ -1,145 +0,0 @@ -/*===========================================================================*\ -| -| File: cgsprite.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGSPRITE_H -#define CGSPRITE_H - -#include -#include "cgbitbuf.h" - -struct SpriteRenderInfo -{ - CGameBitBuffer* mpBits; // image bits - int mSrcX; - int mSrcY; - int mWidth; - int mHeight; - - BOOL mRevX; - BOOL mRevY; - - BOOL mNewBits; // flag that mpBits needs deleted -}; - -#define SRI_NORMAL 0 -#define SRI_HORZMIRROR 1 -#define SRI_VERTMIRROR 2 -#define SRI_BOTHMIRROR 3 - -#define SRI_INFOCOUNT 4 - -struct CGameSprite -{ - CGameSprite( - char* pFileName, - char* pSpriteName, - CGameBitBuffer* pBits, - BOOL needHorzMirror = FALSE, - BOOL needVertMirror = FALSE - ); - virtual ~CGameSprite(); - - SpriteRenderInfo mInfo[SRI_INFOCOUNT]; -}; - -class CGameSpriteBuffer -{ -public: - CGameSpriteBuffer( char* pFileName ); - virtual ~CGameSpriteBuffer(); - - char* mpFileName; - CGameBitBuffer* mpBitBuffer; // a single DIB containing sprites - int mRefCount; // for knowing when to remove a buffer - -private: - void SprToBmp(char* pSprName,char* pOutBuffer,int size); -}; - -class CGameScreen; -class CGameUpdateList; - -class CGameSpriteSequence -{ -public: - CGameSpriteSequence( - char* pFileName, - char* pSequenceName, - int rate, - BOOL needHorzMirror = FALSE, - BOOL needVertMirror = FALSE - ); - - virtual ~CGameSpriteSequence(); - - virtual BOOL Frame(); - virtual void Render( - CGameScreen* pScreen, - int x, - int y, - BOOL revX, - BOOL revY, - LPRECT pDirty - ); - virtual int GetCurWidth() - { - return mpSpriteArray[mCurSprite]->mInfo[0].mWidth; - } - virtual int GetCurHeight() - { - return mpSpriteArray[mCurSprite]->mInfo[0].mHeight; - } - - virtual int NextSprite(int time, BOOL wrap=TRUE); - - void SetCurSprite( int sprite ) - { - mCurSprite = sprite; - mLastTime = -1; - } - -protected: - static LinkedList* mpBufferList; // list of CGameSpriteBuffers containing all sprites - - CGameSprite** mpSpriteArray; // sprites for this sequence - int mNumSprites; // size of the array - int mCurSprite; // which sprite is in the current frame - int mPeriod; // number of time slices per frame - int mLastTime; // last time we changed frames - - CGameSpriteBuffer* mpMyBuffer; // bit buffer for this instance's sprites - - // return a ptr to the sprite buffer corresponding .spr filename - CGameSpriteBuffer* LoadSpriteBits( char* pFileName ); - - // decrement reference count & delete buffer if 0 - void UnloadSpriteBits(); -}; - -#endif // CGSPRITE_H diff --git a/sdk/samples/iklowns/cgtext.cpp b/sdk/samples/iklowns/cgtext.cpp deleted file mode 100644 index c5df45a..0000000 --- a/sdk/samples/iklowns/cgtext.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/*===========================================================================*\ -| -| File: cgtext.cpp -| -| Description: -| Object class to manage lines of text to be displayed over a bitmap. -| The text may have an optional drop shadow and may be scrolled -| vertically. -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//** include files ** -#include -#include -#include "cgtext.h" - -//** local definitions ** -typedef struct { - LPSTR text; // actual text string - int nChars; // number of characters in string - int X; // location of text in rectangle - int Y; - COLORREF color; // color of text - COLORREF dropColor; // color of shadow - int shadowX; // horizontal offset of shaadow - int shadowY; // vertical offset of shadow -} LINE_INFO; - -#define DEFAULT_SHADOWX 2 -#define DEFAULT_SHADOWY 1 - -#define MAX(x,y) (((x) > (y)) ? (x) : (y)) - -//** external functions ** -//** external data ** -//** public data ** -//** private data ** -//** public functions ** -//** private functions ** - -// ---------------------------------------------------------- -// CGameText contructor - -// ---------------------------------------------------------- -CGameText::CGameText( - HDC hdc, // hdc to blit to - LPRECT pRect, // rectangle to center text - int screenLines, // max lines on screen at once - int linespacing // 1=single, 2=double -) : hOldFont( NULL ) -{ - nLines = 0; - maxLines = screenLines; - maxWidth = 0; - maxHeight = 0; - hdcText = hdc; - spacing = linespacing; - hFont = NULL; - memcpy(&rect, pRect, sizeof(RECT)); - pLines = new CLinkedList; - - SetBkMode(hdc, TRANSPARENT); -} - -// ---------------------------------------------------------- -// CGameText destructor - -// ---------------------------------------------------------- -CGameText::~CGameText() -{ - LINE_INFO *pCur; - - // remove all the text and delete entry in list - while ((pCur = (LINE_INFO *)pLines->RemoveFirst()) != NULL) - { - delete pCur->text; // hope caller alloced these with new! - delete pCur; - } - - delete pLines; - - if (hOldFont) - SelectObject( hdcText, hOldFont ); - - if (hFont) - DeleteObject(hFont); -} - -// ---------------------------------------------------------- -// AddLine - add a new line of text to the list -// ---------------------------------------------------------- -int CGameText::AddLine(LPSTR NewLine, COLORREF Color, COLORREF DropShadow) -{ - LINE_INFO *pCur = new LINE_INFO; - - pCur->text = NewLine; - pCur->nChars = lstrlen(NewLine); - pCur->X = -1; - pCur->Y = -1; - pCur->color = Color; - pCur->shadowX = 0; - pCur->shadowY = 0; - pCur->dropColor = DropShadow; - if (DropShadow != NO_SHADOW) - { - pCur->shadowX = DEFAULT_SHADOWX; - pCur->shadowY = DEFAULT_SHADOWY; - } else { - pCur->shadowX = 0; - pCur->shadowY = 0; - } - - pLines->Append(pCur); - return (++nLines); -} - -// ---------------------------------------------------------- -// ChangeColor - change the color of a particular string in -// the display list. The text is repainted onto the DC. -// ---------------------------------------------------------- -void CGameText::ChangeColor( - int LineIndex, // index of string to recolor - COLORREF NewColor, // color to make string - COLORREF DropColor // color of drop shadow -) -{ - LINE_INFO *pCur; - - if ((LineIndex <= 0) || (LineIndex > nLines)) - { - return; - } - - // Find the line in list - pCur = (LINE_INFO *)pLines->GetFirst(); - for (int ii=1; ii < LineIndex; ii++) - { - pCur = (LINE_INFO *)pLines->GetNext(); - } - - // Change the color of the entry - pCur->color = NewColor; - pCur->dropColor = DropColor; - - // Display drop shadow if any - if (pCur->shadowX || pCur->shadowY) - { - SetTextColor(hdcText, pCur->dropColor); - TextOut(hdcText, pCur->X+pCur->shadowX, pCur->Y+pCur->shadowY - , pCur->text, pCur->nChars); - } - - // Display text - SetTextColor(hdcText, pCur->color); - TextOut(hdcText, pCur->X, pCur->Y, pCur->text, pCur->nChars); -} - -// ---------------------------------------------------------- -// GetText - retrieve text assoicated with a particular index -// ---------------------------------------------------------- -LPSTR CGameText::GetText( - int LineIndex -) -{ - LINE_INFO *pCur; - - if ((LineIndex <= 0) || (LineIndex > nLines)) - { - return(NULL); - } - - pCur = (LINE_INFO *)pLines->GetFirst(); - for (int ii=1; ii < LineIndex; ii++) - { - pCur = (LINE_INFO *)pLines->GetNext(); - } - - return(pCur->text); -} - -// ---------------------------------------------------------- -// TextBlt - draw text to DC -// ---------------------------------------------------------- -int CGameText::TextBlt( - int ScrollPos // offset using for scrolling the data -) -{ - LINE_INFO *pCur; - int TextX, TextY; - int totalLines; - int nDisplayed=0; - - // Figure out how many lines are displayed and how tall each line is - - if (maxLines <= 2) - maxLines = nLines; - -// totalLines = nLines < maxLines ? nLines : maxLines; - totalLines = maxLines; - if (totalLines < 2) - totalLines = 2; - - maxHeight = (rect.bottom - rect.top) / ((totalLines * spacing) - 1); - - // figure out starting point (may be off screen if we are scrolling) - TextY = rect.top+ScrollPos; - TextX = rect.left; - - // If we don't have a font yet -- figure out how big of a font to use - // and create it. - if (hFont == NULL) - { - LOGFONT logFont; - memset(&logFont, 0, sizeof(LOGFONT)); - logFont.lfHeight = maxHeight; - logFont.lfPitchAndFamily = FF_ROMAN; - hFont = CreateFontIndirect(&logFont); - hOldFont = (HFONT)SelectObject(hdcText, hFont); - } - - - // Go through each line of text and display it to the screen. - pCur = (LINE_INFO *)pLines->GetFirst(); - while (pCur != NULL) - { - - // Don't bother if text won't be visible - if ((TextY+maxHeight > rect.top) && (TextY shadowX || pCur->shadowY) - { - SetTextColor(hdcText, pCur->dropColor); - ExtTextOut(hdcText, TextX+pCur->shadowX - , TextY+pCur->shadowY - , ETO_CLIPPED, &rect - , pCur->text, pCur->nChars, NULL); - } - - // paint text - SetTextColor(hdcText, pCur->color); - ExtTextOut(hdcText, TextX, TextY - , ETO_CLIPPED, &rect - , pCur->text, pCur->nChars, NULL); - - nDisplayed++; - } - - // save position of text - pCur->X = TextX; - pCur->Y = TextY; - TextY += maxHeight * spacing; - - pCur = (LINE_INFO *)pLines->GetNext(); - } - - return(nDisplayed); -} diff --git a/sdk/samples/iklowns/cgtext.h b/sdk/samples/iklowns/cgtext.h deleted file mode 100644 index bfec9ac..0000000 --- a/sdk/samples/iklowns/cgtext.h +++ /dev/null @@ -1,72 +0,0 @@ -/*===========================================================================*\ -| -| File: cgtext.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGTEXT_H -#define _CGTEXT_H -#include "linklist.h" - -//#define COLOR_RED (PALETTERGB(255,0,0)) -//#define COLOR_RED (RGB(255,0,0)) -#define COLOR_RED (PALETTEINDEX(5)) -#define COLOR_GREEN (PALETTERGB(0,255,0)) -#define COLOR_BLUE (PALETTERGB(0,0,255)) -#define COLOR_BLACK (PALETTERGB(0,0,0)) -#define COLOR_WHITE (PALETTERGB(255,255,255)) -//#define COLOR_YELLOW (PALETTERGB(255, 255, 0)) -#define COLOR_YELLOW (PALETTEINDEX(4)) -#define COLOR_GREY (PALETTERGB(149, 149, 149)) - -#define NO_SHADOW ((COLORREF)-1) - -class CGameText { -private: - int maxWidth; - int maxHeight; - RECT rect; - int nLines; - int maxLines; - int spacing; - CLinkedList *pLines; - HDC hdcText; - HFONT hFont; - HFONT hOldFont; - -public: - CGameText(HDC, LPRECT, int maxLines=2, int lineSpacing=2); - ~CGameText(); - - void SetSpacing(int lineSpacing) { spacing = lineSpacing; }; - void SetMaxLines(int lines) { maxLines = lines; }; - - int AddLine(LPSTR, COLORREF Color = COLOR_RED - , COLORREF DropColor = COLOR_GREY); - void ChangeColor(int, COLORREF, COLORREF DropColor = COLOR_GREY); - LPSTR GetText(int); - int TextBlt(int ScrollPos=0); -}; -#endif diff --git a/sdk/samples/iklowns/cgtile.h b/sdk/samples/iklowns/cgtile.h deleted file mode 100644 index 3e76e4e..0000000 --- a/sdk/samples/iklowns/cgtile.h +++ /dev/null @@ -1,43 +0,0 @@ -/*===========================================================================*\ -| -| File: cgtile.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGTILE_H -#define CGTILE_H - -class CGTile -{ -public: - CGameTile(); - ~CGameTile(); - -private: - CGameGraphic mGraphic; -}; - -#endif // CGTILE_H diff --git a/sdk/samples/iklowns/cgtimer.cpp b/sdk/samples/iklowns/cgtimer.cpp deleted file mode 100644 index 03b3513..0000000 --- a/sdk/samples/iklowns/cgtimer.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/*===========================================================================*\ -| -| File: cgtimer.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "CGTimer.h" - -static void TimerThread(void); -extern CGameTimer * Timer; -static CRITICAL_SECTION cs; - -CGameTimer::CGameTimer(void) -{ -#if 0 - DWORD id; - // initialize our critical section dude - InitializeCriticalSection(&cs); - - EnterCriticalSection(&cs); - // create our Event item - Event = CreateEvent ( - NULL, - FALSE, // auto-reset - FALSE, // initially not-signalled - NULL - ); - - // create our timer thread - Time = 0; // start at time-slice zero - SetRate(60); // sixty Hertz - - thread = CreateThread( - NULL, - 0, - (LPTHREAD_START_ROUTINE) TimerThread, - NULL, - 0, - &id - ); -// SetThreadPriority( thread, THREAD_PRIORITY_HIGHEST ); - LeaveCriticalSection(&cs); -#endif -} - -CGameTimer::~CGameTimer(void) -{ -#if 0 - // kill the thread - TerminateThread(thread,0); - // remove the Event - CloseHandle(Event); - // and the CS - DeleteCriticalSection(&cs); -#endif -} - -static void TimerThread(void) -{ - long mylasttime = timeGetTime(); - int x; - - while (1) - { - // wait till it's time to wake up - - x = timeGetTime() - mylasttime; - while (x < Timer->rate) - { - Sleep(0); - x = timeGetTime() - mylasttime; - } - mylasttime = timeGetTime(); - - // increment our notion of time - EnterCriticalSection(&cs); - if (!Timer->paused) - { - ++Timer->Time; - SetEvent(Timer->Event); - } // let the other thread go now... - - LeaveCriticalSection(&cs); - } -} - -void CGameTimer::Pause(void) -{ -// EnterCriticalSection(&cs); - paused = TRUE; -// LeaveCriticalSection(&cs); -}; - -void CGameTimer::Resume(void) -{ -// EnterCriticalSection(&cs); - paused = FALSE; -// LeaveCriticalSection(&cs); -}; - -void CGameTimer::SetRate ( int hertz ) -{ - if (hertz) - rate = 1000 / hertz; -} - -int CGameTimer::GetRate (void) -{ - if (rate) - { - return(1000 / rate); - } - else - { - return(0); - } -} diff --git a/sdk/samples/iklowns/cgtimer.h b/sdk/samples/iklowns/cgtimer.h deleted file mode 100644 index 61d6b3c..0000000 --- a/sdk/samples/iklowns/cgtimer.h +++ /dev/null @@ -1,46 +0,0 @@ -/*===========================================================================*\ -| -| File: cgtimer.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -class CGameTimer { - -public: - volatile int paused; - int rate; - HANDLE thread; - HANDLE Event; - volatile int Time; - - CGameTimer (void); - ~CGameTimer (void); - - void SetRate(int hertz); - int GetRate(void); - void Pause(void); - void Resume(void); -}; diff --git a/sdk/samples/iklowns/cgupdate.cpp b/sdk/samples/iklowns/cgupdate.cpp deleted file mode 100644 index 9d09464..0000000 --- a/sdk/samples/iklowns/cgupdate.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*===========================================================================*\ -| -| File: cgupdate.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include "cgupdate.h" -#include "cgimage.h" -#include "cgglobl.h" - -//#define FULL_SCREEN_DIRTY - -/*---------------------------------------------------------------------------*\ -| -| Class CGameUpdateList -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -CGameUpdateList::CGameUpdateList( - ) -{ - Clear(); -} - -CGameUpdateList::~CGameUpdateList() -{ - mDirty = FALSE; -} - -// we make a copy of the rect & add the copy to the list -void -CGameUpdateList::AddRect( - RECT Rect - ) -{ - // first clip new rect to screen boundaries - RECT temp = - { - 0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1 - }; - -//#ifndef FULL_SCREEN_DIRTY - if (!gUse_DDraw) - { - // only add if we're on the screen - if (IntersectRect( &temp, &Rect, &temp)) - { - if (mDirty) - { - // already have a rect. Let's make the union of them the new one... - UnionRect(&temp, &mRect, &temp); - } - else - { - // don't have a rect yet... use this one - mDirty = TRUE; - } - mRect = temp; - } - } - else - { - mDirty = TRUE; - mRect = temp; - } -} - -BOOL CGameUpdateList::Intersect( RECT Rect ) // find out if rectangle intersects us... -{ - RECT temp; - return(IntersectRect(&temp, &Rect, &mRect)); -} diff --git a/sdk/samples/iklowns/cgupdate.h b/sdk/samples/iklowns/cgupdate.h deleted file mode 100644 index cf9ffcd..0000000 --- a/sdk/samples/iklowns/cgupdate.h +++ /dev/null @@ -1,59 +0,0 @@ -/*===========================================================================*\ -| -| File: cgupdate.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef CGUPDATE_H -#define CGUPDATE_H - -#include - -// NOTE: all update rectangles are inclusive; both coordinates in the -// RECT are included in the update -class CGameUpdateList -{ -public: - CGameUpdateList(); - virtual ~CGameUpdateList(); - - virtual void AddRect( RECT Rect ); // add to update list - virtual BOOL Intersect( RECT Rect ); // find out if rectangle intersects us... - virtual void Clear() { // remove all rectangles - mRect.top = mRect.bottom = mRect.left = mRect.right = 0; - mDirty = FALSE; - }; - virtual LPRECT GetDirtyRect() - { - return &mRect; - } - -protected: - RECT mRect; - BOOL mDirty; -}; - -#endif // CGUPDATE_H diff --git a/sdk/samples/iklowns/cgutil.mak b/sdk/samples/iklowns/cgutil.mak deleted file mode 100644 index 770884b..0000000 --- a/sdk/samples/iklowns/cgutil.mak +++ /dev/null @@ -1,186 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "CGUTIL.MAK" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -CPP=cl.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "retail" -# PROP BASE Intermediate_Dir "retail" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : $(OUTDIR)/cgutil.lib $(OUTDIR)/CGUTIL.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /G3 /W3 /WX /GX /YX /O2 /I ".\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /G3 /W3 /WX /GX /YX /O2 /I ".\include" /D "WIN32" /D "STRICT" /D "NDEBUG"\ - /D "_WINDOWS" /FR$(INTDIR)/ /Fp$(OUTDIR)/"CGUTIL.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"CGUTIL.bsc" -BSC32_SBRS= \ - $(INTDIR)/CGEXCPT.SBR \ - $(INTDIR)/CGRES.SBR \ - $(INTDIR)/STRREC.SBR - -$(OUTDIR)/CGUTIL.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LIB32=lib.exe -# ADD BASE LIB32 /NOLOGO -# ADD LIB32 /NOLOGO /OUT:"$(OUTDIR)/cgutil.lib" -LIB32_FLAGS=/NOLOGO /OUT:"$(OUTDIR)/cgutil.lib" -DEF_FLAGS= -DEF_FILE= -LIB32_OBJS= \ - $(INTDIR)/CGEXCPT.OBJ \ - $(INTDIR)/CGRES.OBJ \ - $(INTDIR)/STRREC.OBJ - -$(OUTDIR)/cgutil.lib : $(OUTDIR) $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "debug" -# PROP BASE Intermediate_Dir "debug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)/CGUTIL.LIB $(OUTDIR)/CGUTIL.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE CPP /nologo /W3 /GX /Z7 /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /G3 /W3 /WX /GX /Z7 /YX /Od /I ".\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /G3 /W3 /WX /GX /Z7 /YX /Od /I ".\include" /D "WIN32" /D\ - "_DEBUG" /D "STRICT" /D "_WINDOWS" /FR$(INTDIR)/ /Fp$(OUTDIR)/"CGUTIL.pch" /Fo$(INTDIR)/ /c\ - -CPP_OBJS=.\debug/ -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"CGUTIL.bsc" -BSC32_SBRS= \ - $(INTDIR)/CGEXCPT.SBR \ - $(INTDIR)/CGRES.SBR \ - $(INTDIR)/STRREC.SBR - -$(OUTDIR)/CGUTIL.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LIB32=lib.exe -# ADD BASE LIB32 /NOLOGO -# ADD LIB32 /NOLOGO /OUT:"$(OUTDIR)/cgutil.lib" -LIB32_FLAGS=/NOLOGO /OUT:"$(OUTDIR)/cgutil.lib" -DEF_FLAGS= -DEF_FILE= -LIB32_OBJS= \ - $(INTDIR)/CGEXCPT.OBJ \ - $(INTDIR)/CGRES.OBJ \ - $(INTDIR)/STRREC.OBJ - -$(OUTDIR)/CGUTIL.LIB : $(OUTDIR) $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\CGEXCPT.CPP -DEP_CGEXC=\ - .\include\cgres.h\ - .\include\cgexcpt.h - -$(INTDIR)/CGEXCPT.OBJ : $(SOURCE) $(DEP_CGEXC) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGRES.CPP -DEP_CGRES=\ - .\include\cgexcpt.h\ - .\include\cgres.h - -$(INTDIR)/CGRES.OBJ : $(SOURCE) $(DEP_CGRES) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\STRREC.CPP -DEP_STRRE=\ - .\include\strrec.h - -$(INTDIR)/STRREC.OBJ : $(SOURCE) $(DEP_STRRE) $(INTDIR) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/iklowns/cgwave.cpp b/sdk/samples/iklowns/cgwave.cpp deleted file mode 100644 index d2b9dc4..0000000 --- a/sdk/samples/iklowns/cgwave.cpp +++ /dev/null @@ -1,336 +0,0 @@ -/*===========================================================================*\ -| -| File: cgwave.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//** include files ** -#ifndef __WATCOMC__ -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include -#include "cgwave.h" - -//** local definitions ** -//** external functions ** -//** external data ** -//** public data ** -//** private data ** -//** public functions ** -//** private functions ** - -// ---------------------------------------------------------- -// WaveOpenFile - -// This function will open a wave input file and prepare -// it for reading, so the data can be easily read with -// WaveReadFile. Returns 0 if successful, the error code -// if not. -// pszFileName - Input filename to load. -// phmmioIn - Pointer to handle which will -// be used for further mmio routines. -// ppwfxInfo - Ptr to ptr to WaveFormatEx -// structure with all info about the file. -// ---------------------------------------------------------- -int WaveOpenFile( - char *pszFileName, - HMMIO *phmmioIn, - WAVEFORMATEX **ppwfxInfo, - MMCKINFO *pckInRIFF -) -{ - - HMMIO hmmioIn; - MMCKINFO ckIn; // chunk info. for general use. - PCMWAVEFORMAT pcmWaveFormat; // Temporary PCM format structure to load in. - WORD cbExtraAlloc; // Extra bytes for waveformatex structure for weird formats. - int nError; // Return value. - - - // Initialization... - *ppwfxInfo = NULL; - nError = 0; - hmmioIn = NULL; - - if ((hmmioIn = mmioOpen(pszFileName, NULL, MMIO_ALLOCBUF | MMIO_READ)) == NULL) - { - nError = ER_CANNOTOPEN; - goto ERROR_READING_WAVE; - } - - if ((nError = (int)mmioDescend(hmmioIn, pckInRIFF, NULL, 0)) != 0) - { - goto ERROR_READING_WAVE; - } - - - if ((pckInRIFF->ckid != FOURCC_RIFF) || (pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E'))) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Search the input file for for the 'fmt ' chunk. */ - ckIn.ckid = mmioFOURCC('f', 'm', 't', ' '); - if ((nError = (int)mmioDescend(hmmioIn, &ckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - /* Expect the 'fmt' chunk to be at least as large as ; - * if there are extra parameters at the end, we'll ignore them */ - - if (ckIn.cksize < (long) sizeof(PCMWAVEFORMAT)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - - /* Read the 'fmt ' chunk into .*/ - if (mmioRead(hmmioIn, (HPSTR) &pcmWaveFormat, (long) sizeof(pcmWaveFormat)) != (long) sizeof(pcmWaveFormat)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - - // Ok, allocate the waveformatex, but if its not pcm - // format, read the next word, and thats how many extra - // bytes to allocate. - if (pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM) - cbExtraAlloc = 0; - - else - { - // Read in length of extra bytes. - if (mmioRead(hmmioIn, (LPSTR) &cbExtraAlloc, - (long) sizeof(cbExtraAlloc)) != (long) sizeof(cbExtraAlloc)) - { - nError = ER_CANNOTREAD; - goto ERROR_READING_WAVE; - } - - } - - // Ok, now allocate that waveformatex structure. - if ((*ppwfxInfo = (LPWAVEFORMATEX)GlobalAlloc(GMEM_FIXED - , sizeof(WAVEFORMATEX)+cbExtraAlloc)) == NULL) - { - nError = ER_MEM; - goto ERROR_READING_WAVE; - } - - // Copy the bytes from the pcm structure to the waveformatex structure - memcpy(*ppwfxInfo, &pcmWaveFormat, sizeof(pcmWaveFormat)); - (*ppwfxInfo)->cbSize = cbExtraAlloc; - - // Now, read those extra bytes into the structure, if cbExtraAlloc != 0. - if (cbExtraAlloc != 0) - { - if (mmioRead(hmmioIn, (LPSTR) (((BYTE*)&((*ppwfxInfo)->cbSize))+sizeof(cbExtraAlloc)), - (long) (cbExtraAlloc)) != (long) (cbExtraAlloc)) - { - nError = ER_NOTWAVEFILE; - goto ERROR_READING_WAVE; - } - } - - /* Ascend the input file out of the 'fmt ' chunk. */ - if ((nError = mmioAscend(hmmioIn, &ckIn, 0)) != 0) - { - goto ERROR_READING_WAVE; - } - - - goto TEMPCLEANUP; - -ERROR_READING_WAVE: - if (*ppwfxInfo != NULL) - { - GlobalFree(*ppwfxInfo); - *ppwfxInfo = NULL; - } - - if (hmmioIn != NULL) - { - mmioClose(hmmioIn, 0); - hmmioIn = NULL; - } - -TEMPCLEANUP: - *phmmioIn = hmmioIn; - - return(nError); - -} - - -// ---------------------------------------------------------- -// WaveStartDataRead - -// This routine has to be called before WaveReadFile as -// it searchs for the chunk to descend into for reading, -// that is, the 'data' chunk. For simplicity, this used -// to be in the open routine, but was taken out and moved -// to a separate routine so there was more control on the -// chunks that are before the data chunk, such as 'fact', -// etc... -// ---------------------------------------------------------- -int WaveStartDataRead( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRIFF -) -{ - int nError; - - nError = 0; - - // Do a nice little seek... - if ((nError = mmioSeek(*phmmioIn, pckInRIFF->dwDataOffset - + sizeof(FOURCC), SEEK_SET)) == -1) - { - //Assert(FALSE); - goto ERROR_READING_WAVE; - } - - nError = 0; - // Search the input file for for the 'data' chunk. - pckIn->ckid = mmioFOURCC('d', 'a', 't', 'a'); - if ((nError = mmioDescend(*phmmioIn, pckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0) - { - goto ERROR_READING_WAVE; - } - - goto CLEANUP; - -ERROR_READING_WAVE: - -CLEANUP: - return(nError); -} - - -// ---------------------------------------------------------- -// WaveReadFile - -// This will read wave data from the wave file. Make -// sure we're descended into the data chunk, else this -// will fail bigtime! -// hmmioIn - Handle to mmio. -// cbRead - # of bytes to read. -// pbDest - Destination buffer to put bytes. -// cbActualRead - # of bytes actually read. -// ---------------------------------------------------------- -int WaveReadFile( - HMMIO hmmioIn, - UINT cbRead, - BYTE *pbDest, - MMCKINFO *pckIn, - UINT *cbActualRead -) -{ - - MMIOINFO mmioinfoIn; // current status of - int nError; - UINT cT, cbDataIn; - - nError = 0; - - if (nError = mmioGetInfo(hmmioIn, &mmioinfoIn, 0) != 0) - { - goto ERROR_CANNOT_READ; - } - - cbDataIn = cbRead; - if (cbDataIn > pckIn->cksize) - cbDataIn = pckIn->cksize; - - pckIn->cksize -= cbDataIn; - - for (cT = 0; cT < cbDataIn; cT++) - { - /* Copy the bytes from the io to the buffer. */ - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - if ((nError = mmioAdvance(hmmioIn, &mmioinfoIn, MMIO_READ)) != 0) - { - goto ERROR_CANNOT_READ; - } - if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) - { - nError = ER_CORRUPTWAVEFILE; - goto ERROR_CANNOT_READ; - } - } - - // Actual copy. - *((BYTE*)pbDest+cT) = *((BYTE*)mmioinfoIn.pchNext++); - } - - if ((nError = mmioSetInfo(hmmioIn, &mmioinfoIn, 0)) != 0) - { - goto ERROR_CANNOT_READ; - } - - *cbActualRead = cbDataIn; - goto FINISHED_READING; - -ERROR_CANNOT_READ: - *cbActualRead = 0; - -FINISHED_READING: - return(nError); - -} - -// ---------------------------------------------------------- -// WaveCloseFile - -// This will close the wave file openned with WaveOpenFile. -// phmmioIn - Pointer to the handle to input MMIO. -// ppwfxSrc - Pointer to pointer to WaveFormatEx structure. -// -// Returns 0 if successful, non-zero if there was a warning. -// ---------------------------------------------------------- -int WaveCloseReadFile( - HMMIO *phmmio, - WAVEFORMATEX **ppwfxSrc -) -{ - - if (*ppwfxSrc != NULL) - { - GlobalFree(*ppwfxSrc); - *ppwfxSrc = NULL; - } - - if (*phmmio != NULL) - { - mmioClose(*phmmio, 0); - *phmmio = NULL; - } - - return(0); - -} diff --git a/sdk/samples/iklowns/cgwave.h b/sdk/samples/iklowns/cgwave.h deleted file mode 100644 index 90bf637..0000000 --- a/sdk/samples/iklowns/cgwave.h +++ /dev/null @@ -1,80 +0,0 @@ -/*===========================================================================*\ -| -| File: cgwave.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#ifndef _CGWAVE_H -#define _CGWAVE_H -#include - -#define WAVEVERSION 1 - -#ifndef ER_MEM -#define ER_MEM 0xe000 -#endif - -#ifndef ER_CANNOTOPEN -#define ER_CANNOTOPEN 0xe100 -#endif - -#ifndef ER_NOTWAVEFILE -#define ER_NOTWAVEFILE 0xe101 -#endif - -#ifndef ER_CANNOTREAD -#define ER_CANNOTREAD 0xe102 -#endif - -#ifndef ER_CORRUPTWAVEFILE -#define ER_CORRUPTWAVEFILE 0xe103 -#endif - -#ifndef ER_CANNOTWRITE -#define ER_CANNOTWRITE 0xe104 -#endif - - -int WaveOpenFile( - char *pszFileName, - HMMIO *phmmioIn, - WAVEFORMATEX **ppwfxInfo, - MMCKINFO *pckInRIFF -); - -int WaveStartDataRead( - HMMIO *phmmioIn, - MMCKINFO *pckIn, - MMCKINFO *pckInRIFF -); - -int WaveReadFile( - HMMIO hmmioIn, - UINT cbRead, - BYTE *pbDest, - MMCKINFO *pckIn, - UINT *cbActualRead -); -#endif diff --git a/sdk/samples/iklowns/data/backdrop.bmp b/sdk/samples/iklowns/data/backdrop.bmp deleted file mode 100644 index 8aaa249..0000000 Binary files a/sdk/samples/iklowns/data/backdrop.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/bang.wav b/sdk/samples/iklowns/data/bang.wav deleted file mode 100644 index 2d270b9..0000000 Binary files a/sdk/samples/iklowns/data/bang.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/bigtbig.bmp b/sdk/samples/iklowns/data/bigtbig.bmp deleted file mode 100644 index de42d96..0000000 Binary files a/sdk/samples/iklowns/data/bigtbig.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/bigtbig.tle b/sdk/samples/iklowns/data/bigtbig.tle deleted file mode 100644 index d162de0..0000000 Binary files a/sdk/samples/iklowns/data/bigtbig.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/bigtop.bmp b/sdk/samples/iklowns/data/bigtop.bmp deleted file mode 100644 index e428d8d..0000000 Binary files a/sdk/samples/iklowns/data/bigtop.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/bigtop.tle b/sdk/samples/iklowns/data/bigtop.tle deleted file mode 100644 index a115364..0000000 Binary files a/sdk/samples/iklowns/data/bigtop.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/bigtsml.bmp b/sdk/samples/iklowns/data/bigtsml.bmp deleted file mode 100644 index dcbafeb..0000000 Binary files a/sdk/samples/iklowns/data/bigtsml.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/bigtsml.tle b/sdk/samples/iklowns/data/bigtsml.tle deleted file mode 100644 index ee91246..0000000 Binary files a/sdk/samples/iklowns/data/bigtsml.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/bkgrnd.bmp b/sdk/samples/iklowns/data/bkgrnd.bmp deleted file mode 100644 index 98ae0ca..0000000 Binary files a/sdk/samples/iklowns/data/bkgrnd.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/blow1.wav b/sdk/samples/iklowns/data/blow1.wav deleted file mode 100644 index aae9ebc..0000000 Binary files a/sdk/samples/iklowns/data/blow1.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/blow2.wav b/sdk/samples/iklowns/data/blow2.wav deleted file mode 100644 index f75e99d..0000000 Binary files a/sdk/samples/iklowns/data/blow2.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1block.bmp b/sdk/samples/iklowns/data/c1block.bmp deleted file mode 100644 index d1d1e0b..0000000 Binary files a/sdk/samples/iklowns/data/c1block.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1block.spr b/sdk/samples/iklowns/data/c1block.spr deleted file mode 100644 index e959d67..0000000 --- a/sdk/samples/iklowns/data/c1block.spr +++ /dev/null @@ -1,77 +0,0 @@ -[BlockLeft] -C1blol01.dib=1 -C1blol03.dib=1 -C1blol05.dib=1 -C1blol07.dib=1 -C1blol09.dib=1 - -[C1blol01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[C1blol03.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[C1blol05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[C1blol07.dib] -X=171 -Y=0 -Width=57 -Height=133 - -[C1blol09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[Sequences] -BlockLeft=3 -BlockRight=3 - -[BlockRight] -C1blor01.dib=1 -C1blor03.dib=1 -C1blor05.dib=1 -C1blor07.dib=1 -C1blor09.dib=1 - -[C1blor01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C1blor03.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C1blor05.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C1blor07.dib] -X=174 -Y=133 -Width=58 -Height=133 - -[C1blor09.dib] -X=116 -Y=133 -Width=58 -Height=133 diff --git a/sdk/samples/iklowns/data/c1duck.bmp b/sdk/samples/iklowns/data/c1duck.bmp deleted file mode 100644 index cb71020..0000000 Binary files a/sdk/samples/iklowns/data/c1duck.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1duck.spr b/sdk/samples/iklowns/data/c1duck.spr deleted file mode 100644 index e0b00d2..0000000 --- a/sdk/samples/iklowns/data/c1duck.spr +++ /dev/null @@ -1,78 +0,0 @@ -[DuckLeft] -C1ducl01.dib=1 -C1ducl05.dib=1 -C1ducl09.dib=1 -C1ducl13.dib=1 -C1ducl17.dib=1 - -[C1ducl01.dib] -X=0 -Y=0 -Width=58 -Height=132 - -[C1ducl05.dib] -X=58 -Y=0 -Width=66 -Height=132 - -[C1ducl09.dib] -X=124 -Y=0 -Width=74 -Height=134 - -[C1ducl13.dib] -X=198 -Y=0 -Width=70 -Height=134 - -[C1ducl17.dib] -X=268 -Y=0 -Width=63 -Height=133 - -[Sequences] -DuckLeft=5 -DuckRight=5 - -[DuckRight] -C1ducr01.dib=1 -C1ducr05.dib=1 -C1ducr09.dib=1 -C1ducr13.dib=1 -C1ducr17.dib=1 - -[C1ducr01.dib] -X=0 -Y=134 -Width=72 -Height=132 - -[C1ducr05.dib] -X=72 -Y=134 -Width=68 -Height=131 - -[C1ducr09.dib] -X=140 -Y=134 -Width=65 -Height=131 - -[C1ducr13.dib] -X=205 -Y=134 -Width=68 -Height=131 - -[C1ducr17.dib] -X=273 -Y=134 -Width=72 -Height=132 - diff --git a/sdk/samples/iklowns/data/c1piefac.bmp b/sdk/samples/iklowns/data/c1piefac.bmp deleted file mode 100644 index f4219cd..0000000 Binary files a/sdk/samples/iklowns/data/c1piefac.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1piefac.spr b/sdk/samples/iklowns/data/c1piefac.spr deleted file mode 100644 index 43125d0..0000000 --- a/sdk/samples/iklowns/data/c1piefac.spr +++ /dev/null @@ -1,63 +0,0 @@ -[PieFaceLeft] -C1pfal01.dib=1 -C1pfal03.dib=1 -C1pfal05.dib=1 -Piefacel.bmp=1 - -[C1pfal01.dib] -X=0 -Y=0 -Width=70 -Height=133 - -[C1pfal03.dib] -X=70 -Y=0 -Width=70 -Height=133 - -[C1pfal05.dib] -X=140 -Y=0 -Width=70 -Height=133 - -[Piefacel.bmp] -X=210 -Y=0 -Width=70 -Height=133 - -[Sequences] -PieFaceLeft=4 -PieFaceRight=4 - -[PieFaceRight] -C1pfar01.dib=1 -C1pfar03.dib=1 -C1pfar05.dib=1 -Piefacer.bmp=1 - -[C1pfar01.dib] -X=0 -Y=133 -Width=70 -Height=133 - -[C1pfar03.dib] -X=70 -Y=133 -Width=58 -Height=133 - -[C1pfar05.dib] -X=128 -Y=133 -Width=58 -Height=133 - -[Piefacer.bmp] -X=186 -Y=133 -Width=58 -Height=133 diff --git a/sdk/samples/iklowns/data/c1piehed.bmp b/sdk/samples/iklowns/data/c1piehed.bmp deleted file mode 100644 index 4764726..0000000 Binary files a/sdk/samples/iklowns/data/c1piehed.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1piehed.spr b/sdk/samples/iklowns/data/c1piehed.spr deleted file mode 100644 index 8572f16..0000000 --- a/sdk/samples/iklowns/data/c1piehed.spr +++ /dev/null @@ -1,63 +0,0 @@ -[PieHeadLeft] -C1phel01.dib=1 -C1phel03.dib=1 -C1phel05.dib=1 -Pieheadl.bmp=1 - -[C1phel01.dib] -X=0 -Y=0 -Width=100 -Height=133 - -[C1phel03.dib] -X=100 -Y=0 -Width=76 -Height=133 - -[C1phel05.dib] -X=176 -Y=0 -Width=57 -Height=133 - -[Pieheadl.bmp] -X=233 -Y=0 -Width=57 -Height=133 - -[Sequences] -PieHeadLeft=4 -PieHeadRight=4 - -[PieHeadRight] -C1pher01.dib=1 -C1pher03.dib=1 -C1pher05.dib=1 -Pieheadr.bmp=1 - -[C1pher01.dib] -X=0 -Y=133 -Width=101 -Height=133 - -[C1pher03.dib] -X=101 -Y=133 -Width=101 -Height=133 - -[C1pher05.dib] -X=202 -Y=133 -Width=101 -Height=133 - -[Pieheadr.bmp] -X=303 -Y=133 -Width=101 -Height=133 diff --git a/sdk/samples/iklowns/data/c1poke.bmp b/sdk/samples/iklowns/data/c1poke.bmp deleted file mode 100644 index e8deea4..0000000 Binary files a/sdk/samples/iklowns/data/c1poke.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1poke.spr b/sdk/samples/iklowns/data/c1poke.spr deleted file mode 100644 index 962601b..0000000 --- a/sdk/samples/iklowns/data/c1poke.spr +++ /dev/null @@ -1,77 +0,0 @@ -[PokeLeft] -C1eyel01.dib=1 -C1eyel03.dib=1 -C1eyel05.dib=1 -C1eyel07.dib=1 -C1eyel09.dib=1 - -[C1eyel01.dib] -X=0 -Y=0 -Width=61 -Height=133 - -[C1eyel03.dib] -X=61 -Y=0 -Width=61 -Height=133 - -[C1eyel05.dib] -X=61 -Y=0 -Width=61 -Height=133 - -[C1eyel07.dib] -X=183 -Y=0 -Width=61 -Height=133 - -[C1eyel09.dib] -X=122 -Y=0 -Width=61 -Height=133 - -[Sequences] -PokeLeft=3 -PokeRight=3 - -[PokeRight] -C1eyer01.dib=1 -C1eyer03.dib=1 -C1eyer05.dib=1 -C1eyer07.dib=1 -C1eyer09.dib=1 - -[C1eyer01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C1eyer03.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C1eyer05.dib] -X=58 -Y=133 -Width=59 -Height=133 - -[C1eyer07.dib] -X=175 -Y=133 -Width=58 -Height=133 - -[C1eyer09.dib] -X=117 -Y=133 -Width=58 -Height=133 diff --git a/sdk/samples/iklowns/data/c1run.bmp b/sdk/samples/iklowns/data/c1run.bmp deleted file mode 100644 index eb82040..0000000 Binary files a/sdk/samples/iklowns/data/c1run.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1run.spr b/sdk/samples/iklowns/data/c1run.spr deleted file mode 100644 index 1293662..0000000 --- a/sdk/samples/iklowns/data/c1run.spr +++ /dev/null @@ -1,119 +0,0 @@ -[RunLeft] -C1-rul01.dib=1 -C1-rul03.dib=1 -C1-rul05.dib=1 -C1-rul07.dib=1 -C1-rul09.dib=1 -C1-rul11.dib=1 -C1-rul13.dib=1 -C1-rul15.dib=1 - -[C1-rul01.dib] -X=0 -Y=0 -Width=110 -Height=125 - -[C1-rul03.dib] -X=110 -Y=0 -Width=94 -Height=137 - -[C1-rul05.dib] -X=204 -Y=0 -Width=91 -Height=134 - -[C1-rul07.dib] -X=295 -Y=0 -Width=107 -Height=131 - -[C1-rul09.dib] -X=402 -Y=0 -Width=110 -Height=123 - -[C1-rul11.dib] -X=512 -Y=0 -Width=95 -Height=131 - -[C1-rul13.dib] -X=607 -Y=0 -Width=91 -Height=137 - -[C1-rul15.dib] -X=698 -Y=0 -Width=106 -Height=130 - -[Sequences] -RunLeft=8 -RunRight=8 - -[RunRight] -C1-rur01.dib=1 -C1-rur03.dib=1 -C1-rur05.dib=1 -C1-rur07.dib=1 -C1-rur09.dib=1 -C1-rur11.dib=1 -C1-rur13.dib=1 -C1-rur15.dib=1 - -[C1-rur01.dib] -X=0 -Y=137 -Width=105 -Height=123 - -[C1-rur03.dib] -X=105 -Y=137 -Width=87 -Height=136 - -[C1-rur05.dib] -X=192 -Y=137 -Width=90 -Height=133 - -[C1-rur07.dib] -X=282 -Y=137 -Width=110 -Height=130 - -[C1-rur09.dib] -X=392 -Y=137 -Width=106 -Height=125 - -[C1-rur11.dib] -X=498 -Y=137 -Width=87 -Height=132 - -[C1-rur13.dib] -X=585 -Y=137 -Width=95 -Height=138 - -[C1-rur15.dib] -X=680 -Y=137 -Width=109 -Height=131 diff --git a/sdk/samples/iklowns/data/c1sad.bmp b/sdk/samples/iklowns/data/c1sad.bmp deleted file mode 100644 index 6e0da4e..0000000 Binary files a/sdk/samples/iklowns/data/c1sad.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1sad.spr b/sdk/samples/iklowns/data/c1sad.spr deleted file mode 100644 index f5313b2..0000000 --- a/sdk/samples/iklowns/data/c1sad.spr +++ /dev/null @@ -1,151 +0,0 @@ -[C1SadDone] -C1sadl10.dib=1 - -[C1SadLeft] -C1sadl01.dib=1 -C1sadl02.dib=1 -C1sadl03.dib=1 -C1sadl04.dib=1 -C1sadl05.dib=1 -C1sadl06.dib=1 -C1sadl07.dib=1 -C1sadl08.dib=1 -C1sadl09.dib=1 -C1sadl10.dib=1 - -[C1sadl01.dib] -X=0 -Y=0 -Width=140 -Height=140 - -[C1sadl02.dib] -X=140 -Y=0 -Width=140 -Height=140 - -[C1sadl03.dib] -X=280 -Y=0 -Width=140 -Height=140 - -[C1sadl04.dib] -X=420 -Y=0 -Width=140 -Height=140 - -[C1sadl05.dib] -X=560 -Y=0 -Width=140 -Height=140 - -[C1sadl06.dib] -X=700 -Y=0 -Width=140 -Height=140 - -[C1sadl07.dib] -X=840 -Y=0 -Width=140 -Height=140 - -[C1sadl08.dib] -X=980 -Y=0 -Width=140 -Height=140 - -[C1sadl09.dib] -X=1120 -Y=0 -Width=140 -Height=140 - -[C1sadl10.dib] -X=1260 -Y=0 -Width=140 -Height=140 - -[Sequences] -C1SadLeft=10 -C1SadRight=10 -C1SadDone=1 - -[C1SadRight] -C1sadr01.dib=1 -C1sadr02.dib=1 -C1sadr03.dib=1 -C1sadr04.dib=1 -C1sadr05.dib=1 -C1sadr06.dib=1 -C1sadr07.dib=1 -C1sadr08.dib=1 -C1sadr09.dib=1 -C1sadr10.dib=1 - -[C1sadr01.dib] -X=0 -Y=140 -Width=140 -Height=140 - -[C1sadr02.dib] -X=140 -Y=140 -Width=140 -Height=140 - -[C1sadr03.dib] -X=280 -Y=140 -Width=140 -Height=140 - -[C1sadr04.dib] -X=420 -Y=140 -Width=140 -Height=140 - -[C1sadr05.dib] -X=560 -Y=140 -Width=140 -Height=140 - -[C1sadr06.dib] -X=700 -Y=140 -Width=140 -Height=140 - -[C1sadr07.dib] -X=840 -Y=140 -Width=140 -Height=140 - -[C1sadr08.dib] -X=980 -Y=140 -Width=140 -Height=140 - -[C1sadr09.dib] -X=1120 -Y=140 -Width=140 -Height=140 - -[C1sadr10.dib] -X=1260 -Y=140 -Width=140 -Height=140 diff --git a/sdk/samples/iklowns/data/c1stand.bmp b/sdk/samples/iklowns/data/c1stand.bmp deleted file mode 100644 index 9cb6933..0000000 Binary files a/sdk/samples/iklowns/data/c1stand.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1stand.spr b/sdk/samples/iklowns/data/c1stand.spr deleted file mode 100644 index d466bd8..0000000 --- a/sdk/samples/iklowns/data/c1stand.spr +++ /dev/null @@ -1,21 +0,0 @@ -[StandLeft] -C1thrl01.dib=1 - -[C1thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[Sequences] -StandLeft=1 -StandRight=1 - -[StandRight] -C1thrr01.dib=1 - -[C1thrr01.dib] -X=0 -Y=133 -Width=79 -Height=133 diff --git a/sdk/samples/iklowns/data/c1throw.bmp b/sdk/samples/iklowns/data/c1throw.bmp deleted file mode 100644 index 065d6bd..0000000 Binary files a/sdk/samples/iklowns/data/c1throw.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1throw.spr b/sdk/samples/iklowns/data/c1throw.spr deleted file mode 100644 index f864750..0000000 --- a/sdk/samples/iklowns/data/c1throw.spr +++ /dev/null @@ -1,63 +0,0 @@ -[ThrowLeft] -c1thrl01.dib=1 -c1thrl05.dib=1 -c1thrl09.dib=1 -c1thrl13.dib=1 - -[c1thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[c1thrl05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[c1thrl09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[c1thrl13.dib] -X=171 -Y=0 -Width=57 -Height=133 - -[Sequences] -ThrowLeft=4 -ThrowRight=4 - -[ThrowRight] -c1thrr01.dib=1 -c1thrr05.dib=1 -c1thrr09.dib=1 -c1thrr13.dib=1 - -[c1thrr01.dib] -X=0 -Y=133 -Width=80 -Height=133 - -[c1thrr05.dib] -X=80 -Y=133 -Width=79 -Height=133 - -[c1thrr09.dib] -X=159 -Y=133 -Width=79 -Height=133 - -[c1thrr13.dib] -X=238 -Y=133 -Width=73 -Height=133 diff --git a/sdk/samples/iklowns/data/c1turn.bmp b/sdk/samples/iklowns/data/c1turn.bmp deleted file mode 100644 index ee61630..0000000 Binary files a/sdk/samples/iklowns/data/c1turn.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1turn.spr b/sdk/samples/iklowns/data/c1turn.spr deleted file mode 100644 index 5900f19..0000000 --- a/sdk/samples/iklowns/data/c1turn.spr +++ /dev/null @@ -1,64 +0,0 @@ -[Left2Right] -C1turl01.dib=1 -C1turl05.dib=1 -C1turl09.dib=1 -C1turl13.dib=1 - -[C1turl01.dib] -X=0 -Y=0 -Width=76 -Height=133 - -[C1turl05.dib] -X=76 -Y=0 -Width=60 -Height=136 - -[C1turl09.dib] -X=136 -Y=0 -Width=68 -Height=138 - -[C1turl13.dib] -X=204 -Y=0 -Width=86 -Height=138 - -[Sequences] -Left2Right=4 -Right2Left=4 - -[Right2Left] -C1turr01.dib=1 -C1turr05.dib=1 -C1turr09.dib=1 -C1turr13.dib=1 - -[C1turr01.dib] -X=0 -Y=138 -Width=84 -Height=135 - -[C1turr05.dib] -X=84 -Y=138 -Width=73 -Height=131 - -[C1turr09.dib] -X=157 -Y=138 -Width=65 -Height=135 - -[C1turr13.dib] -X=222 -Y=138 -Width=67 -Height=134 - diff --git a/sdk/samples/iklowns/data/c1walk.bmp b/sdk/samples/iklowns/data/c1walk.bmp deleted file mode 100644 index c8c1b83..0000000 Binary files a/sdk/samples/iklowns/data/c1walk.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1walk.spr b/sdk/samples/iklowns/data/c1walk.spr deleted file mode 100644 index d88d28c..0000000 --- a/sdk/samples/iklowns/data/c1walk.spr +++ /dev/null @@ -1,105 +0,0 @@ -[WalkLeft] -C1wall11.dib=1 -C1wall13.dib=1 -C1wall15.dib=1 -C1wall02.dib=1 -C1wall04.dib=1 -C1wall06.dib=1 -C1wall08.dib=1 - -[C1wall11.dib] -X=0 -Y=0 -Width=64 -Height=137 - -[C1wall13.dib] -X=64 -Y=0 -Width=74 -Height=136 - -[C1wall15.dib] -X=138 -Y=0 -Width=83 -Height=135 - -[C1wall02.dib] -X=221 -Y=0 -Width=70 -Height=135 - -[C1wall04.dib] -X=291 -Y=0 -Width=68 -Height=135 - -[C1wall06.dib] -X=359 -Y=0 -Width=80 -Height=137 - -[C1wall08.dib] -X=439 -Y=0 -Width=83 -Height=136 - -[Sequences] -WalkLeft=7 -WalkRight=7 - -[WalkRight] -C1walr11.dib=1 -C1walr13.dib=1 -C1walr15.dib=1 -C1walr02.dib=1 -C1walr04.dib=1 -C1walr06.dib=1 -C1walr08.dib=1 - -[C1walr11.dib] -X=0 -Y=137 -Width=72 -Height=134 - -[C1walr13.dib] -X=72 -Y=137 -Width=79 -Height=139 - -[C1walr15.dib] -X=151 -Y=137 -Width=83 -Height=138 - -[C1walr02.dib] -X=234 -Y=137 -Width=74 -Height=138 - -[C1walr04.dib] -X=308 -Y=137 -Width=72 -Height=133 - -[C1walr06.dib] -X=380 -Y=137 -Width=83 -Height=135 - -[C1walr08.dib] -X=463 -Y=137 -Width=79 -Height=134 diff --git a/sdk/samples/iklowns/data/c1walk45.bmp b/sdk/samples/iklowns/data/c1walk45.bmp deleted file mode 100644 index 2fdba43..0000000 Binary files a/sdk/samples/iklowns/data/c1walk45.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c1walk45.spr b/sdk/samples/iklowns/data/c1walk45.spr deleted file mode 100644 index 36ed46d..0000000 --- a/sdk/samples/iklowns/data/c1walk45.spr +++ /dev/null @@ -1,237 +0,0 @@ -[InLeft] -c1u45L01.DIB=1 -c1u45L03.DIB=1 -c1u45L05.DIB=1 -c1u45L07.DIB=1 -c1u45L09.DIB=1 -c1u45L11.DIB=1 -c1u45L13.DIB=1 -c1u45L15.DIB=1 - -[c1u45L01.DIB] -X=0 -Y=0 -Width=67 -Height=133 - -[c1u45L03.DIB] -X=67 -Y=0 -Width=54 -Height=131 - -[c1u45L05.DIB] -X=121 -Y=0 -Width=57 -Height=133 - -[c1u45L07.DIB] -X=178 -Y=0 -Width=64 -Height=136 - -[c1u45L09.DIB] -X=242 -Y=0 -Width=59 -Height=135 - -[c1u45L11.DIB] -X=301 -Y=0 -Width=54 -Height=132 - -[c1u45L13.DIB] -X=355 -Y=0 -Width=60 -Height=134 - -[c1u45L15.DIB] -X=415 -Y=0 -Width=67 -Height=135 - -[Sequences] -InLeft=8 -InRight=8 -OutLeft=8 -OutRight=8 - -[InRight] -c1u45R01.DIB=1 -c1u45R03.DIB=1 -c1u45R05.DIB=1 -c1u45R07.DIB=1 -c1u45R09.DIB=1 -c1u45R11.DIB=1 -c1u45R13.DIB=1 -c1u45R15.DIB=1 - -[c1u45R01.DIB] -X=0 -Y=136 -Width=66 -Height=135 - -[c1u45R03.DIB] -X=66 -Y=136 -Width=66 -Height=132 - -[c1u45R05.DIB] -X=132 -Y=136 -Width=66 -Height=132 - -[c1u45R07.DIB] -X=198 -Y=136 -Width=69 -Height=134 - -[c1u45R09.DIB] -X=267 -Y=136 -Width=64 -Height=134 - -[c1u45R11.DIB] -X=331 -Y=136 -Width=66 -Height=131 - -[c1u45R13.DIB] -X=397 -Y=136 -Width=66 -Height=136 - -[c1u45R15.DIB] -X=463 -Y=136 -Width=66 -Height=137 - -[OutLeft] -C1w45l01.dib=1 -C1w45l03.dib=1 -C1w45l05.dib=1 -C1w45l07.dib=1 -C1w45l09.dib=1 -C1w45l11.dib=1 -C1w45l13.dib=1 -C1w45l15.dib=1 - -[C1w45l01.dib] -X=0 -Y=273 -Width=70 -Height=138 - -[C1w45l03.dib] -X=70 -Y=273 -Width=60 -Height=138 - -[C1w45l05.dib] -X=130 -Y=273 -Width=64 -Height=137 - -[C1w45l07.dib] -X=194 -Y=273 -Width=70 -Height=136 - -[C1w45l09.dib] -X=264 -Y=273 -Width=67 -Height=136 - -[C1w45l11.dib] -X=331 -Y=273 -Width=60 -Height=139 - -[C1w45l13.dib] -X=391 -Y=273 -Width=65 -Height=137 - -[C1w45l15.dib] -X=456 -Y=273 -Width=71 -Height=135 - -[OutRight] -C1w45r01.dib=1 -C1w45r03.dib=1 -C1w45r05.dib=1 -C1w45r07.dib=1 -C1w45r09.dib=1 -C1w45r11.dib=1 -C1w45r13.dib=1 -C1w45r15.dib=1 - -[C1w45r01.dib] -X=0 -Y=412 -Width=65 -Height=136 - -[C1w45r03.dib] -X=65 -Y=412 -Width=52 -Height=139 - -[C1w45r05.dib] -X=117 -Y=412 -Width=57 -Height=136 - -[C1w45r07.dib] -X=174 -Y=412 -Width=62 -Height=135 - -[C1w45r09.dib] -X=236 -Y=412 -Width=55 -Height=138 - -[C1w45r11.dib] -X=291 -Y=412 -Width=52 -Height=138 - -[C1w45r13.dib] -X=343 -Y=412 -Width=66 -Height=139 - -[C1w45r15.dib] -X=409 -Y=412 -Width=69 -Height=137 diff --git a/sdk/samples/iklowns/data/c2block.bmp b/sdk/samples/iklowns/data/c2block.bmp deleted file mode 100644 index d58f15c..0000000 Binary files a/sdk/samples/iklowns/data/c2block.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2block.spr b/sdk/samples/iklowns/data/c2block.spr deleted file mode 100644 index 1660be5..0000000 --- a/sdk/samples/iklowns/data/c2block.spr +++ /dev/null @@ -1,49 +0,0 @@ -[C2BlockLeft] -C2blol01.dib=1 -C2blol05.dib=1 -C2blol09.dib=1 - -[C2blol01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[C2blol05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[C2blol09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2BlockLeft=3 -C2BlockRight=3 - -[C2BlockRight] -C2blor01.dib=1 -C2blor05.dib=1 -C2blor09.dib=1 - -[C2blor01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C2blor05.dib] -X=58 -Y=133 -Width=58 -Height=133 - -[C2blor09.dib] -X=116 -Y=133 -Width=58 -Height=133 diff --git a/sdk/samples/iklowns/data/c2duck.bmp b/sdk/samples/iklowns/data/c2duck.bmp deleted file mode 100644 index 98ab17d..0000000 Binary files a/sdk/samples/iklowns/data/c2duck.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2duck.spr b/sdk/samples/iklowns/data/c2duck.spr deleted file mode 100644 index 331c453..0000000 --- a/sdk/samples/iklowns/data/c2duck.spr +++ /dev/null @@ -1,77 +0,0 @@ -[C2DuckLeft] -C2ducl01.dib=1 -C2ducl05.dib=1 -C2ducl09.dib=1 -C2ducl13.dib=1 -C2ducl17.dib=1 - -[C2ducl01.dib] -X=0 -Y=0 -Width=58 -Height=132 - -[C2ducl05.dib] -X=58 -Y=0 -Width=66 -Height=132 - -[C2ducl09.dib] -X=124 -Y=0 -Width=74 -Height=134 - -[C2ducl13.dib] -X=198 -Y=0 -Width=70 -Height=134 - -[C2ducl17.dib] -X=268 -Y=0 -Width=63 -Height=133 - -[Sequences] -C2DuckLeft=5 -C2DuckRight=5 - -[C2DuckRight] -C2ducr01.dib=1 -C2ducr05.dib=1 -C2ducr09.dib=1 -C2ducr13.dib=1 -C2ducr17.dib=1 - -[C2ducr01.dib] -X=0 -Y=134 -Width=72 -Height=132 - -[C2ducr05.dib] -X=72 -Y=134 -Width=68 -Height=131 - -[C2ducr09.dib] -X=140 -Y=134 -Width=65 -Height=131 - -[C2ducr13.dib] -X=205 -Y=134 -Width=68 -Height=131 - -[C2ducr17.dib] -X=273 -Y=134 -Width=72 -Height=132 diff --git a/sdk/samples/iklowns/data/c2piefac.bmp b/sdk/samples/iklowns/data/c2piefac.bmp deleted file mode 100644 index 2aea263..0000000 Binary files a/sdk/samples/iklowns/data/c2piefac.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2piefac.spr b/sdk/samples/iklowns/data/c2piefac.spr deleted file mode 100644 index 02d7dfc..0000000 --- a/sdk/samples/iklowns/data/c2piefac.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2PieFaceLeft] -C2pfal01.dib=1 -C2pfal03.dib=1 -C2pfal05.dib=1 -C2pfacel.bmp=1 - -[C2pfal01.dib] -X=0 -Y=0 -Width=70 -Height=133 - -[C2pfal03.dib] -X=70 -Y=0 -Width=70 -Height=133 - -[C2pfal05.dib] -X=140 -Y=0 -Width=70 -Height=133 - -[C2pfacel.bmp] -X=210 -Y=0 -Width=70 -Height=133 - -[Sequences] -C2PieFaceLeft=4 -C2PieFaceRight=4 - -[C2PieFaceRight] -C2pfar01.dib=1 -C2pfar03.dib=1 -C2pfar05.dib=1 -C2pfacer.bmp=1 - -[C2pfar01.dib] -X=0 -Y=133 -Width=70 -Height=133 - -[C2pfar03.dib] -X=70 -Y=133 -Width=58 -Height=133 - -[C2pfar05.dib] -X=128 -Y=133 -Width=58 -Height=133 - -[C2pfacer.bmp] -X=186 -Y=133 -Width=58 -Height=133 diff --git a/sdk/samples/iklowns/data/c2piehed.bmp b/sdk/samples/iklowns/data/c2piehed.bmp deleted file mode 100644 index f808cdb..0000000 Binary files a/sdk/samples/iklowns/data/c2piehed.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2piehed.spr b/sdk/samples/iklowns/data/c2piehed.spr deleted file mode 100644 index 0da187b..0000000 --- a/sdk/samples/iklowns/data/c2piehed.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2PieHeadLeft] -C2phel01.dib=1 -C2phel03.dib=1 -C2phel05.dib=1 -C2pheadl.bmp=1 - -[C2phel01.dib] -X=0 -Y=0 -Width=100 -Height=133 - -[C2phel03.dib] -X=100 -Y=0 -Width=76 -Height=133 - -[C2phel05.dib] -X=176 -Y=0 -Width=57 -Height=133 - -[C2pheadl.bmp] -X=233 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2PieHeadLeft=4 -C2PieHeadRight=4 - -[C2PieHeadRight] -C2pher01.dib=1 -C2pher03.dib=1 -C2pher05.dib=1 -C2pheadr.bmp=1 - -[C2pher01.dib] -X=0 -Y=133 -Width=101 -Height=133 - -[C2pher03.dib] -X=101 -Y=133 -Width=101 -Height=133 - -[C2pher05.dib] -X=202 -Y=133 -Width=101 -Height=133 - -[C2pheadr.bmp] -X=303 -Y=133 -Width=101 -Height=133 diff --git a/sdk/samples/iklowns/data/c2poke.bmp b/sdk/samples/iklowns/data/c2poke.bmp deleted file mode 100644 index 1822432..0000000 Binary files a/sdk/samples/iklowns/data/c2poke.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2poke.spr b/sdk/samples/iklowns/data/c2poke.spr deleted file mode 100644 index b118d17..0000000 --- a/sdk/samples/iklowns/data/c2poke.spr +++ /dev/null @@ -1,49 +0,0 @@ -[C2PokeLeft] -C2eyel01.dib=1 -C2eyel05.dib=1 -C2eyel09.dib=1 - -[C2eyel01.dib] -X=0 -Y=0 -Width=61 -Height=133 - -[C2eyel05.dib] -X=61 -Y=0 -Width=61 -Height=133 - -[C2eyel09.dib] -X=122 -Y=0 -Width=61 -Height=133 - -[Sequences] -C2PokeLeft=3 -C2PokeRight=3 - -[C2PokeRight] -C2eyer01.dib=1 -C2eyer05.dib=1 -C2eyer09.dib=1 - -[C2eyer01.dib] -X=0 -Y=133 -Width=58 -Height=133 - -[C2eyer05.dib] -X=58 -Y=133 -Width=59 -Height=133 - -[C2eyer09.dib] -X=117 -Y=133 -Width=58 -Height=133 diff --git a/sdk/samples/iklowns/data/c2run.bmp b/sdk/samples/iklowns/data/c2run.bmp deleted file mode 100644 index 2af321b..0000000 Binary files a/sdk/samples/iklowns/data/c2run.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2run.spr b/sdk/samples/iklowns/data/c2run.spr deleted file mode 100644 index fe6b5d5..0000000 --- a/sdk/samples/iklowns/data/c2run.spr +++ /dev/null @@ -1,119 +0,0 @@ -[C2RunLeft] -C2-rul01.dib=1 -C2-rul03.dib=1 -C2-rul05.dib=1 -C2-rul07.dib=1 -C2-rul09.dib=1 -C2-rul11.dib=1 -C2-rul13.dib=1 -C2-rul15.dib=1 - -[C2-rul01.dib] -X=0 -Y=0 -Width=110 -Height=125 - -[C2-rul03.dib] -X=110 -Y=0 -Width=94 -Height=137 - -[C2-rul05.dib] -X=204 -Y=0 -Width=91 -Height=134 - -[C2-rul07.dib] -X=295 -Y=0 -Width=107 -Height=131 - -[C2-rul09.dib] -X=402 -Y=0 -Width=110 -Height=123 - -[C2-rul11.dib] -X=512 -Y=0 -Width=95 -Height=131 - -[C2-rul13.dib] -X=607 -Y=0 -Width=91 -Height=137 - -[C2-rul15.dib] -X=698 -Y=0 -Width=106 -Height=130 - -[Sequences] -C2RunLeft=8 -C2RunRight=8 - -[C2RunRight] -C2-rur01.dib=1 -C2-rur03.dib=1 -C2-rur05.dib=1 -C2-rur07.dib=1 -C2-rur09.dib=1 -C2-rur11.dib=1 -C2-rur13.dib=1 -C2-rur15.dib=1 - -[C2-rur01.dib] -X=0 -Y=137 -Width=105 -Height=123 - -[C2-rur03.dib] -X=105 -Y=137 -Width=87 -Height=136 - -[C2-rur05.dib] -X=192 -Y=137 -Width=90 -Height=133 - -[C2-rur07.dib] -X=282 -Y=137 -Width=110 -Height=130 - -[C2-rur09.dib] -X=392 -Y=137 -Width=106 -Height=125 - -[C2-rur11.dib] -X=498 -Y=137 -Width=87 -Height=132 - -[C2-rur13.dib] -X=585 -Y=137 -Width=95 -Height=138 - -[C2-rur15.dib] -X=680 -Y=137 -Width=109 -Height=131 diff --git a/sdk/samples/iklowns/data/c2sad.bmp b/sdk/samples/iklowns/data/c2sad.bmp deleted file mode 100644 index f30fa16..0000000 Binary files a/sdk/samples/iklowns/data/c2sad.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2sad.spr b/sdk/samples/iklowns/data/c2sad.spr deleted file mode 100644 index 9c19247..0000000 --- a/sdk/samples/iklowns/data/c2sad.spr +++ /dev/null @@ -1,77 +0,0 @@ -[C2SadLeft] -C2sadl01.dib=1 -C2sadl02.dib=1 -C2sadl03.dib=1 -C2sadl04.dib=1 -C2sadl05.dib=1 -C2sadl06.dib=1 -C2sadl07.dib=1 -C2sadl08.dib=1 -C2sadl09.dib=1 - -[C2sadl01.dib] -X=0 -Y=0 -Width=54 -Height=135 - -[C2sadl02.dib] -X=54 -Y=0 -Width=57 -Height=136 - -[C2sadl03.dib] -X=111 -Y=0 -Width=59 -Height=136 - -[C2sadl04.dib] -X=170 -Y=0 -Width=62 -Height=136 - -[C2sadl05.dib] -X=232 -Y=0 -Width=64 -Height=136 - -[C2sadl06.dib] -X=296 -Y=0 -Width=65 -Height=136 - -[C2sadl07.dib] -X=361 -Y=0 -Width=64 -Height=136 - -[C2sadl08.dib] -X=425 -Y=0 -Width=61 -Height=136 - -[C2sadl09.dib] -X=486 -Y=0 -Width=60 -Height=136 - -[Sequences] -C2SadLeft=9 -C2SadDone=1 - -[C2SadDone] -C2sadl10.dib=1 - -[C2sadl10.dib] -X=0 -Y=136 -Width=45 -Height=130 diff --git a/sdk/samples/iklowns/data/c2stand.bmp b/sdk/samples/iklowns/data/c2stand.bmp deleted file mode 100644 index 7728dc7..0000000 Binary files a/sdk/samples/iklowns/data/c2stand.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2stand.spr b/sdk/samples/iklowns/data/c2stand.spr deleted file mode 100644 index 56bc79c..0000000 --- a/sdk/samples/iklowns/data/c2stand.spr +++ /dev/null @@ -1,21 +0,0 @@ -[C2StandLeft] -C2thrl01.dib=1 - -[C2thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2StandLeft=1 -C2StandRight=1 - -[C2StandRight] -C2thrr01.dib=1 - -[C2thrr01.dib] -X=0 -Y=133 -Width=78 -Height=133 diff --git a/sdk/samples/iklowns/data/c2throw.bmp b/sdk/samples/iklowns/data/c2throw.bmp deleted file mode 100644 index cc00ac2..0000000 Binary files a/sdk/samples/iklowns/data/c2throw.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2throw.spr b/sdk/samples/iklowns/data/c2throw.spr deleted file mode 100644 index bae5341..0000000 --- a/sdk/samples/iklowns/data/c2throw.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2ThrowLeft] -c2thrl01.dib=1 -c2thrl05.dib=1 -c2thrl09.dib=1 -c2thrl13.dib=1 - -[c2thrl01.dib] -X=0 -Y=0 -Width=57 -Height=133 - -[c2thrl05.dib] -X=57 -Y=0 -Width=57 -Height=133 - -[c2thrl09.dib] -X=114 -Y=0 -Width=57 -Height=133 - -[c2thrl13.dib] -X=171 -Y=0 -Width=57 -Height=133 - -[Sequences] -C2ThrowLeft=4 -C2ThrowRight=4 - -[C2ThrowRight] -c2thrr01.dib=1 -c2thrr05.dib=1 -c2thrr09.dib=1 -c2thrr13.dib=1 - -[c2thrr01.dib] -X=0 -Y=133 -Width=80 -Height=133 - -[c2thrr05.dib] -X=80 -Y=133 -Width=79 -Height=133 - -[c2thrr09.dib] -X=159 -Y=133 -Width=79 -Height=133 - -[c2thrr13.dib] -X=238 -Y=133 -Width=73 -Height=133 diff --git a/sdk/samples/iklowns/data/c2turn.bmp b/sdk/samples/iklowns/data/c2turn.bmp deleted file mode 100644 index 7adcb7f..0000000 Binary files a/sdk/samples/iklowns/data/c2turn.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2turn.spr b/sdk/samples/iklowns/data/c2turn.spr deleted file mode 100644 index 83129df..0000000 --- a/sdk/samples/iklowns/data/c2turn.spr +++ /dev/null @@ -1,63 +0,0 @@ -[C2Left2Right] -C2turr01.dib=1 -C2turr05.dib=1 -C2turr09.dib=1 -C2turr13.dib=1 - -[C2turr01.dib] -X=0 -Y=0 -Width=76 -Height=133 - -[C2turr05.dib] -X=76 -Y=0 -Width=60 -Height=136 - -[C2turr09.dib] -X=136 -Y=0 -Width=68 -Height=138 - -[C2turr13.dib] -X=204 -Y=0 -Width=86 -Height=138 - -[Sequences] -C2Left2Right=4 -C2Right2Left=4 - -[C2Right2Left] -C2turl01.dib=1 -C2turl05.dib=1 -C2turl09.dib=1 -C2turl13.dib=1 - -[C2turl01.dib] -X=0 -Y=138 -Width=84 -Height=135 - -[C2turl05.dib] -X=84 -Y=138 -Width=73 -Height=131 - -[C2turl09.dib] -X=157 -Y=138 -Width=65 -Height=135 - -[C2turl13.dib] -X=222 -Y=138 -Width=67 -Height=134 diff --git a/sdk/samples/iklowns/data/c2walk.bmp b/sdk/samples/iklowns/data/c2walk.bmp deleted file mode 100644 index acd960e..0000000 Binary files a/sdk/samples/iklowns/data/c2walk.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2walk.spr b/sdk/samples/iklowns/data/c2walk.spr deleted file mode 100644 index b3ecf04..0000000 --- a/sdk/samples/iklowns/data/c2walk.spr +++ /dev/null @@ -1,119 +0,0 @@ -[C2WalkLeft] -C2wall01.dib=1 -C2wall03.dib=1 -C2wall05.dib=1 -C2wall07.dib=1 -C2wall09.dib=1 -C2wall11.dib=1 -C2wall13.dib=1 -C2wall15.dib=1 - -[C2wall01.dib] -X=0 -Y=0 -Width=83 -Height=133 - -[C2wall03.dib] -X=83 -Y=0 -Width=64 -Height=134 - -[C2wall05.dib] -X=147 -Y=0 -Width=74 -Height=136 - -[C2wall07.dib] -X=221 -Y=0 -Width=84 -Height=137 - -[C2wall09.dib] -X=305 -Y=0 -Width=78 -Height=137 - -[C2wall11.dib] -X=383 -Y=0 -Width=64 -Height=137 - -[C2wall13.dib] -X=447 -Y=0 -Width=74 -Height=136 - -[C2wall15.dib] -X=521 -Y=0 -Width=83 -Height=135 - -[Sequences] -C2WalkLeft=8 -C2WalkRight=8 - -[C2WalkRight] -C2walr01.dib=1 -C2walr03.dib=1 -C2walr05.dib=1 -C2walr07.dib=1 -C2walr09.dib=1 -C2walr11.dib=1 -C2walr13.dib=1 -C2walr15.dib=1 - -[C2walr01.dib] -X=0 -Y=137 -Width=79 -Height=136 - -[C2walr03.dib] -X=79 -Y=137 -Width=71 -Height=137 - -[C2walr05.dib] -X=150 -Y=137 -Width=79 -Height=134 - -[C2walr07.dib] -X=229 -Y=137 -Width=84 -Height=135 - -[C2walr09.dib] -X=313 -Y=137 -Width=74 -Height=135 - -[C2walr11.dib] -X=387 -Y=137 -Width=72 -Height=134 - -[C2walr13.dib] -X=459 -Y=137 -Width=79 -Height=139 - -[C2walr15.dib] -X=538 -Y=137 -Width=83 -Height=138 diff --git a/sdk/samples/iklowns/data/c2walk45.bmp b/sdk/samples/iklowns/data/c2walk45.bmp deleted file mode 100644 index 9acbd41..0000000 Binary files a/sdk/samples/iklowns/data/c2walk45.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/c2walk45.spr b/sdk/samples/iklowns/data/c2walk45.spr deleted file mode 100644 index 732b420..0000000 --- a/sdk/samples/iklowns/data/c2walk45.spr +++ /dev/null @@ -1,237 +0,0 @@ -[C2InLeft] -c2u45L01.DIB=1 -c2u45L03.DIB=1 -c2u45L05.DIB=1 -c2u45L07.DIB=1 -c2u45L09.DIB=1 -c2u45L11.DIB=1 -c2u45L13.DIB=1 -c2u45L15.DIB=1 - -[c2u45L01.DIB] -X=0 -Y=0 -Width=67 -Height=133 - -[c2u45L03.DIB] -X=67 -Y=0 -Width=54 -Height=131 - -[c2u45L05.DIB] -X=121 -Y=0 -Width=57 -Height=133 - -[c2u45L07.DIB] -X=178 -Y=0 -Width=64 -Height=136 - -[c2u45L09.DIB] -X=242 -Y=0 -Width=59 -Height=135 - -[c2u45L11.DIB] -X=301 -Y=0 -Width=54 -Height=132 - -[c2u45L13.DIB] -X=355 -Y=0 -Width=60 -Height=134 - -[c2u45L15.DIB] -X=415 -Y=0 -Width=67 -Height=135 - -[Sequences] -C2InLeft=8 -C2InRight=8 -C2OutLeft=8 -C2OutRight=8 - -[C2InRight] -c2u45R01.DIB=1 -c2u45R03.DIB=1 -c2u45R05.DIB=1 -c2u45R07.DIB=1 -c2u45R09.DIB=1 -c2u45R11.DIB=1 -c2u45R13.DIB=1 -c2u45R15.DIB=1 - -[c2u45R01.DIB] -X=0 -Y=136 -Width=66 -Height=135 - -[c2u45R03.DIB] -X=66 -Y=136 -Width=66 -Height=132 - -[c2u45R05.DIB] -X=132 -Y=136 -Width=66 -Height=132 - -[c2u45R07.DIB] -X=198 -Y=136 -Width=69 -Height=134 - -[c2u45R09.DIB] -X=267 -Y=136 -Width=64 -Height=134 - -[c2u45R11.DIB] -X=331 -Y=136 -Width=66 -Height=131 - -[c2u45R13.DIB] -X=397 -Y=136 -Width=66 -Height=136 - -[c2u45R15.DIB] -X=463 -Y=136 -Width=66 -Height=137 - -[C2OutLeft] -C2w45l01.dib=1 -C2w45l03.dib=1 -C2w45l05.dib=1 -C2w45l07.dib=1 -C2w45l09.dib=1 -C2w45l11.dib=1 -C2w45l13.dib=1 -C2w45l15.dib=1 - -[C2w45l01.dib] -X=0 -Y=273 -Width=70 -Height=138 - -[C2w45l03.dib] -X=70 -Y=273 -Width=60 -Height=138 - -[C2w45l05.dib] -X=130 -Y=273 -Width=64 -Height=137 - -[C2w45l07.dib] -X=194 -Y=273 -Width=70 -Height=136 - -[C2w45l09.dib] -X=264 -Y=273 -Width=67 -Height=136 - -[C2w45l11.dib] -X=331 -Y=273 -Width=60 -Height=139 - -[C2w45l13.dib] -X=391 -Y=273 -Width=65 -Height=137 - -[C2w45l15.dib] -X=456 -Y=273 -Width=71 -Height=135 - -[C2OutRight] -C2w45r01.dib=1 -C2w45r03.dib=1 -C2w45r05.dib=1 -C2w45r07.dib=1 -C2w45r09.dib=1 -C2w45r11.dib=1 -C2w45r13.dib=1 -C2w45r15.dib=1 - -[C2w45r01.dib] -X=0 -Y=412 -Width=65 -Height=136 - -[C2w45r03.dib] -X=65 -Y=412 -Width=52 -Height=139 - -[C2w45r05.dib] -X=117 -Y=412 -Width=57 -Height=136 - -[C2w45r07.dib] -X=174 -Y=412 -Width=62 -Height=135 - -[C2w45r09.dib] -X=236 -Y=412 -Width=55 -Height=138 - -[C2w45r11.dib] -X=291 -Y=412 -Width=52 -Height=138 - -[C2w45r13.dib] -X=343 -Y=412 -Width=66 -Height=139 - -[C2w45r15.dib] -X=409 -Y=412 -Width=69 -Height=137 diff --git a/sdk/samples/iklowns/data/clouds.bmp b/sdk/samples/iklowns/data/clouds.bmp deleted file mode 100644 index 6d66911..0000000 Binary files a/sdk/samples/iklowns/data/clouds.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/clouds.spr b/sdk/samples/iklowns/data/clouds.spr deleted file mode 100644 index 6bc4976..0000000 --- a/sdk/samples/iklowns/data/clouds.spr +++ /dev/null @@ -1,31 +0,0 @@ -[Cloud1] -Cloud1-2.bmp=1 - -[Cloud1-2.bmp] -X=0 -Y=0 -Width=215 -Height=33 - -[Sequences] -Cloud1=1 -Cloud2=1 -Cloud3=1 - -[Cloud2] -Cloud2-2.bmp=1 - -[Cloud2-2.bmp] -X=0 -Y=33 -Width=136 -Height=48 - -[Cloud3] -Cloud3-2.bmp=1 - -[Cloud3-2.bmp] -X=0 -Y=81 -Width=149 -Height=43 diff --git a/sdk/samples/iklowns/data/clown0.bmp b/sdk/samples/iklowns/data/clown0.bmp deleted file mode 100644 index 0ea10d0..0000000 Binary files a/sdk/samples/iklowns/data/clown0.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/clown0.spr b/sdk/samples/iklowns/data/clown0.spr deleted file mode 100644 index 770c757..0000000 --- a/sdk/samples/iklowns/data/clown0.spr +++ /dev/null @@ -1,21 +0,0 @@ -[Stand] -Clownl.dib=1 - -[Clownl.dib] -X=0 -Y=0 -Width=160 -Height=352 - -[Sequences] -Stand=1 -LeftStand=1 - -[LeftStand] -Clownr.dib=1 - -[Clownr.dib] -X=0 -Y=352 -Width=160 -Height=352 diff --git a/sdk/samples/iklowns/data/credit.bmp b/sdk/samples/iklowns/data/credit.bmp deleted file mode 100644 index 048120a..0000000 Binary files a/sdk/samples/iklowns/data/credit.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/credits.bmp b/sdk/samples/iklowns/data/credits.bmp deleted file mode 100644 index e233e67..0000000 Binary files a/sdk/samples/iklowns/data/credits.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/foreg1.bmp b/sdk/samples/iklowns/data/foreg1.bmp deleted file mode 100644 index 70cb855..0000000 Binary files a/sdk/samples/iklowns/data/foreg1.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/foreg1.tle b/sdk/samples/iklowns/data/foreg1.tle deleted file mode 100644 index 45891f0..0000000 Binary files a/sdk/samples/iklowns/data/foreg1.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/fw0.bmp b/sdk/samples/iklowns/data/fw0.bmp deleted file mode 100644 index bc2e93e..0000000 Binary files a/sdk/samples/iklowns/data/fw0.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/fw0.spr b/sdk/samples/iklowns/data/fw0.spr deleted file mode 100644 index 034bed6..0000000 --- a/sdk/samples/iklowns/data/fw0.spr +++ /dev/null @@ -1,109 +0,0 @@ -[Turn] -Ferris01.dib=1 -Ferris02.dib=1 -Ferris03.dib=1 -Ferris04.dib=1 -Ferris05.dib=1 -Ferris06.dib=1 -Ferris07.dib=1 -Ferris08.dib=1 -Ferris09.dib=1 -Ferris10.dib=1 -Ferris11.dib=1 -Ferris12.dib=1 -Ferris13.dib=1 -Ferris14.dib=1 -Ferris15.dib=1 - -[Ferris01.dib] -X=0 -Y=0 -Width=188 -Height=170 - -[Ferris02.dib] -X=188 -Y=0 -Width=188 -Height=170 - -[Ferris03.dib] -X=376 -Y=0 -Width=188 -Height=170 - -[Ferris04.dib] -X=564 -Y=0 -Width=188 -Height=170 - -[Ferris05.dib] -X=752 -Y=0 -Width=188 -Height=170 - -[Ferris06.dib] -X=940 -Y=0 -Width=187 -Height=170 - -[Ferris07.dib] -X=1127 -Y=0 -Width=187 -Height=170 - -[Ferris08.dib] -X=1314 -Y=0 -Width=187 -Height=170 - -[Ferris09.dib] -X=1501 -Y=0 -Width=187 -Height=170 - -[Ferris10.dib] -X=1688 -Y=0 -Width=186 -Height=170 - -[Ferris11.dib] -X=1874 -Y=0 -Width=186 -Height=170 - -[Ferris12.dib] -X=2060 -Y=0 -Width=186 -Height=170 - -[Ferris13.dib] -X=2246 -Y=0 -Width=186 -Height=170 - -[Ferris14.dib] -X=2432 -Y=0 -Width=187 -Height=170 - -[Ferris15.dib] -X=2619 -Y=0 -Width=187 -Height=170 - -[Sequences] -Turn=15 diff --git a/sdk/samples/iklowns/data/fwstatic.bmp b/sdk/samples/iklowns/data/fwstatic.bmp deleted file mode 100644 index e6ae9cb..0000000 Binary files a/sdk/samples/iklowns/data/fwstatic.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/fwstatic.spr b/sdk/samples/iklowns/data/fwstatic.spr deleted file mode 100644 index b22d017..0000000 --- a/sdk/samples/iklowns/data/fwstatic.spr +++ /dev/null @@ -1,11 +0,0 @@ -[DontTurn] -ferris01.dib=1 - -[ferris01.dib] -X=0 -Y=0 -Width=188 -Height=170 - -[Sequences] -DontTurn=1 diff --git a/sdk/samples/iklowns/data/ground1.bmp b/sdk/samples/iklowns/data/ground1.bmp deleted file mode 100644 index c1d08cb..0000000 Binary files a/sdk/samples/iklowns/data/ground1.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/ground1.tle b/sdk/samples/iklowns/data/ground1.tle deleted file mode 100644 index 1d408db..0000000 Binary files a/sdk/samples/iklowns/data/ground1.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/iklowns.pal b/sdk/samples/iklowns/data/iklowns.pal deleted file mode 100644 index 4fc3c3c..0000000 Binary files a/sdk/samples/iklowns/data/iklowns.pal and /dev/null differ diff --git a/sdk/samples/iklowns/data/instruct.bmp b/sdk/samples/iklowns/data/instruct.bmp deleted file mode 100644 index 8b50459..0000000 Binary files a/sdk/samples/iklowns/data/instruct.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/intro.bmp b/sdk/samples/iklowns/data/intro.bmp deleted file mode 100644 index d462569..0000000 Binary files a/sdk/samples/iklowns/data/intro.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/klown.mid b/sdk/samples/iklowns/data/klown.mid deleted file mode 100644 index d22cc4c..0000000 Binary files a/sdk/samples/iklowns/data/klown.mid and /dev/null differ diff --git a/sdk/samples/iklowns/data/load.bmp b/sdk/samples/iklowns/data/load.bmp deleted file mode 100644 index ed52811..0000000 Binary files a/sdk/samples/iklowns/data/load.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/nyuk.wav b/sdk/samples/iklowns/data/nyuk.wav deleted file mode 100644 index 9fdb5ef..0000000 Binary files a/sdk/samples/iklowns/data/nyuk.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/pie.bmp b/sdk/samples/iklowns/data/pie.bmp deleted file mode 100644 index e039368..0000000 Binary files a/sdk/samples/iklowns/data/pie.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/pie.spr b/sdk/samples/iklowns/data/pie.spr deleted file mode 100644 index 90384f5..0000000 --- a/sdk/samples/iklowns/data/pie.spr +++ /dev/null @@ -1,32 +0,0 @@ -[Sequences] -Pie=4 - -[Pie] -pie0.bmp=1 -pie1.bmp=1 -pie2.bmp=1 -pie3.bmp=1 - -[pie0.bmp] -x=1 -y=0 -width=8 -height=13 - -[pie1.bmp] -x=12 -y=0 -width=8 -height=13 - -[pie2.bmp] -x=1 -y=15 -width=8 -height=13 - -[pie3.bmp] -x=12 -y=15 -width=8 -height=13 diff --git a/sdk/samples/iklowns/data/piefly.bmp b/sdk/samples/iklowns/data/piefly.bmp deleted file mode 100644 index 8df56e8..0000000 Binary files a/sdk/samples/iklowns/data/piefly.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/piefly.spr b/sdk/samples/iklowns/data/piefly.spr deleted file mode 100644 index ab4ef46..0000000 --- a/sdk/samples/iklowns/data/piefly.spr +++ /dev/null @@ -1,77 +0,0 @@ -[FlyLeft] -Piefll01.dib=1 -Piefll02.dib=1 -Piefll03.dib=1 -Piefll04.dib=1 -Piefll05.dib=1 - -[Piefll01.dib] -X=0 -Y=0 -Width=22 -Height=21 - -[Piefll02.dib] -X=22 -Y=0 -Width=22 -Height=21 - -[Piefll03.dib] -X=44 -Y=0 -Width=22 -Height=21 - -[Piefll04.dib] -X=66 -Y=0 -Width=22 -Height=21 - -[Piefll05.dib] -X=88 -Y=0 -Width=22 -Height=21 - -[Sequences] -FlyLeft=5 -FlyRight=5 - -[FlyRight] -Pieflr01.dib=1 -Pieflr02.dib=1 -Pieflr03.dib=1 -Pieflr04.dib=1 -Pieflr05.dib=1 - -[Pieflr01.dib] -X=0 -Y=21 -Width=22 -Height=21 - -[Pieflr02.dib] -X=22 -Y=21 -Width=22 -Height=21 - -[Pieflr03.dib] -X=44 -Y=21 -Width=22 -Height=21 - -[Pieflr04.dib] -X=66 -Y=21 -Width=22 -Height=21 - -[Pieflr05.dib] -X=88 -Y=21 -Width=22 -Height=21 diff --git a/sdk/samples/iklowns/data/piehit2.wav b/sdk/samples/iklowns/data/piehit2.wav deleted file mode 100644 index cf181b5..0000000 Binary files a/sdk/samples/iklowns/data/piehit2.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/plane.bmp b/sdk/samples/iklowns/data/plane.bmp deleted file mode 100644 index 679b828..0000000 Binary files a/sdk/samples/iklowns/data/plane.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/plane.spr b/sdk/samples/iklowns/data/plane.spr deleted file mode 100644 index 3e2590f..0000000 --- a/sdk/samples/iklowns/data/plane.spr +++ /dev/null @@ -1,109 +0,0 @@ -[Fly] -Plane-01.dib=1 -Plane-02.dib=1 -Plane-03.dib=1 -Plane-04.dib=1 -Plane-05.dib=1 -Plane-06.dib=1 -Plane-07.dib=1 -Plane-08.dib=1 -Plane-09.dib=1 -Plane-10.dib=1 -Plane-11.dib=1 -Plane-12.dib=1 -Plane-13.dib=1 -Plane-14.dib=1 -Plane-15.dib=1 - -[Plane-01.dib] -X=0 -Y=0 -Width=285 -Height=32 - -[Plane-02.dib] -X=285 -Y=0 -Width=285 -Height=32 - -[Plane-03.dib] -X=570 -Y=0 -Width=285 -Height=32 - -[Plane-04.dib] -X=855 -Y=0 -Width=285 -Height=32 - -[Plane-05.dib] -X=1140 -Y=0 -Width=285 -Height=32 - -[Plane-06.dib] -X=1425 -Y=0 -Width=285 -Height=32 - -[Plane-07.dib] -X=1710 -Y=0 -Width=285 -Height=32 - -[Plane-08.dib] -X=1995 -Y=0 -Width=285 -Height=32 - -[Plane-09.dib] -X=2280 -Y=0 -Width=285 -Height=32 - -[Plane-10.dib] -X=2565 -Y=0 -Width=285 -Height=32 - -[Plane-11.dib] -X=2850 -Y=0 -Width=285 -Height=32 - -[Plane-12.dib] -X=3135 -Y=0 -Width=285 -Height=32 - -[Plane-13.dib] -X=3420 -Y=0 -Width=285 -Height=32 - -[Plane-14.dib] -X=3705 -Y=0 -Width=285 -Height=32 - -[Plane-15.dib] -X=3990 -Y=0 -Width=285 -Height=32 - -[Sequences] -Fly=15 diff --git a/sdk/samples/iklowns/data/plane.wav b/sdk/samples/iklowns/data/plane.wav deleted file mode 100644 index 2bb51ee..0000000 Binary files a/sdk/samples/iklowns/data/plane.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/rollcost.bmp b/sdk/samples/iklowns/data/rollcost.bmp deleted file mode 100644 index 8996627..0000000 Binary files a/sdk/samples/iklowns/data/rollcost.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/rollcost.tle b/sdk/samples/iklowns/data/rollcost.tle deleted file mode 100644 index 025fad2..0000000 Binary files a/sdk/samples/iklowns/data/rollcost.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/run.wav b/sdk/samples/iklowns/data/run.wav deleted file mode 100644 index d3c9cf6..0000000 Binary files a/sdk/samples/iklowns/data/run.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/sideattr.bmp b/sdk/samples/iklowns/data/sideattr.bmp deleted file mode 100644 index c2aa886..0000000 Binary files a/sdk/samples/iklowns/data/sideattr.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/sideattr.tle b/sdk/samples/iklowns/data/sideattr.tle deleted file mode 100644 index 7f5c108..0000000 Binary files a/sdk/samples/iklowns/data/sideattr.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/sideb.bmp b/sdk/samples/iklowns/data/sideb.bmp deleted file mode 100644 index b8c2bd7..0000000 Binary files a/sdk/samples/iklowns/data/sideb.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/sideb.tle b/sdk/samples/iklowns/data/sideb.tle deleted file mode 100644 index c5d5864..0000000 Binary files a/sdk/samples/iklowns/data/sideb.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/sidef.bmp b/sdk/samples/iklowns/data/sidef.bmp deleted file mode 100644 index 16c2899..0000000 Binary files a/sdk/samples/iklowns/data/sidef.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/sidef.tle b/sdk/samples/iklowns/data/sidef.tle deleted file mode 100644 index 083fa3f..0000000 Binary files a/sdk/samples/iklowns/data/sidef.tle and /dev/null differ diff --git a/sdk/samples/iklowns/data/splash.bmp b/sdk/samples/iklowns/data/splash.bmp deleted file mode 100644 index d8b7a0b..0000000 Binary files a/sdk/samples/iklowns/data/splash.bmp and /dev/null differ diff --git a/sdk/samples/iklowns/data/throw.wav b/sdk/samples/iklowns/data/throw.wav deleted file mode 100644 index 5d44698..0000000 Binary files a/sdk/samples/iklowns/data/throw.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/walk.wav b/sdk/samples/iklowns/data/walk.wav deleted file mode 100644 index 468fbfc..0000000 Binary files a/sdk/samples/iklowns/data/walk.wav and /dev/null differ diff --git a/sdk/samples/iklowns/data/woob.wav b/sdk/samples/iklowns/data/woob.wav deleted file mode 100644 index c8a4d0f..0000000 Binary files a/sdk/samples/iklowns/data/woob.wav and /dev/null differ diff --git a/sdk/samples/iklowns/iklowns.cpp b/sdk/samples/iklowns/iklowns.cpp deleted file mode 100644 index 2f54abe..0000000 --- a/sdk/samples/iklowns/iklowns.cpp +++ /dev/null @@ -1,803 +0,0 @@ -/*===========================================================================*\ -| -| File: iklowns.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#define INITGUID -#include -#include -#include -#include -#include -#include -#include "strrec.h" -#include "cgglobl.h" -#include "cgrsrce.h" // Windows resource IDs -#include "cgexcpt.h" -#include "cgimage.h" -#include "cgdib.h" -#include "cgchar.h" -#include "cglevel.h" -#include "cgtimer.h" -#include "cginput.h" -#include "cgmidi.h" -#include "cgoption.h" -#include "cgload.h" -#include "iklowns.h" // specific to this program - -#define WPM_ANIMATE (WM_USER+1) - -#define CHOICE_SOLO 0 -#define CHOICE_TWO 1 -#define CHOICE_NET 2 -#define CHOICE_QUIT 3 - -#define FIVE_SECONDS 5000 - -//** local definitions ** -// ImmortalKlowns 279afa8b-4981-11ce-a521-0020af0be560 -DEFINE_GUID(IMMORTALKLOWNS_GUID,0x279AFA8B,0x4981,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60); - -char szAppName[] = "IKlowns"; // The name of this application -char szTitle[] = "Immortal Klowns"; // The title bar text - -CGameScreen* pGameScreen = NULL; -CGameLevel* pRumbleLevel = NULL; - -CGameTimer* Timer = NULL; -CGameInput* Input = NULL; -CLoadingScreen* gLoadingScreen = NULL; -static COptionScreen* pOptionScreen = NULL; -int gGameMode = 0; - -void ShutDownApp(void); -void GetMachineCaps(); - -#ifdef ONLY_ONE_INSTANCE -HANDLE hMutex = 0; -#endif - -// unhandled exception handler -#if defined(__BORLANDC__) || defined(__WATCOMC__) -void _cdecl UnHandler(void); -#else -void UnHandler(void); -#endif -void dbgprintf(char *fmt,...) -{ - char out [ 256 ]; - va_list vlist; - va_start(vlist, fmt); - wvsprintf(out, fmt, vlist); - OutputDebugString(out); -} - -/**************************************************************************** - - FUNCTION: WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - - PURPOSE: calls initialization function, processes message loop - - COMMENTS: - - Windows recognizes this function by name as the initial entry point - for the program. This function calls the application initialization - routine, if no other instance of the program is running, and always - calls the instance initialization routine. It then executes a message - retrieval and dispatch loop that is the top-level control structure - for the remainder of execution. The loop is terminated when a WM_QUIT - message is received, at which time this function exits the application - instance by returning the value passed by PostQuitMessage(). - - If this function must abort before entering the message loop, it - returns the conventional value NULL. - -****************************************************************************/ -int CALLBACK WinMain( - HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - MSG msg; - HACCEL hAccelTable; - int result = NULL; - - // only allow 1 instance - if (hPrevInstance) - return NULL; - - // install default exception handler - set_terminate( UnHandler ); - - ghInst = hInstance; - - if (InitInstance(hInstance, nCmdShow)) - { - hAccelTable = LoadAccelerators (hInstance, - MAKEINTRESOURCE(IDR_ACCELERATOR1)); - - /* Acquire and dispatch messages until a WM_QUIT message is - received. - */ - - while (GetMessage(&msg, // message structure - NULL, // handle of window receiving the message - 0, // lowest message to examine - 0)) // highest message to examine - { - if (!TranslateAccelerator (msg.hwnd, hAccelTable, &msg)) - { - TranslateMessage(&msg);// Translates virtual key codes - DispatchMessage(&msg); // Dispatches message to window - } - } - - ShutDownApp(); // call de-init code - result = msg.wParam; - -#ifdef ONLY_ONE_INSTANCE - CloseHandle(hMutex); -#endif - } - return (result); -} - -// ---------------------------------------------------------- -// GetSoundFromProfile - description -// ---------------------------------------------------------- -CSoundEffect *GetSoundFromProfile( - LPSTR SectionName, - LPSTR TopicName, - LPSTR ProfileName -) -{ - char dataBuf[256]; - - // Load any sound effects to be played - GetPrivateProfileString(SectionName, TopicName, "" - , dataBuf, sizeof(dataBuf), ProfileName); - - CStringRecord fields( dataBuf, "," ); - BOOL fLoop=FALSE; - - // See if the sound is to be looped when it is played - if ((fields.GetNumFields() > 2) && (toupper(*fields[2]) == 'L')) - { - fLoop = TRUE; - } - - // Create sound effect object based on WAV file - CSoundEffect *pSound = new CSoundEffect(fields[0], 0, fLoop, gSoundMode); - - // If a volume was specified and sound got created ok, - // set the defaul volume - if (pSound != NULL) - { - if (fields.GetNumFields() > 1) - pSound->SetVolume(atoi(fields[1])); - } - - return(pSound); - -} - -// ---------------------------------------------------------- -// GetRectFromProfile - description -// ---------------------------------------------------------- -void GetRectFromProfile( - RECT &rect, - LPSTR SectionName, - LPSTR EntryName, - LPSTR ProfileName -) -{ - char dataBuf[256]; - - GetPrivateProfileString(SectionName, EntryName, "" - , dataBuf, sizeof(dataBuf), ProfileName); - { - CStringRecord fields( dataBuf, "," ); - if (fields.GetNumFields() == 4) - { - rect.left = atoi(fields[0]); - rect.top = atoi(fields[1]); - rect.right = atoi(fields[2]); - rect.bottom = atoi(fields[3]); - } - } -} - -// ---------------------------------------------------------- -// GetPointFromProfile - description -// ---------------------------------------------------------- -void GetPointFromProfile( - POINT &pt, - LPSTR SectionName, - LPSTR EntryName, - LPSTR ProfileName -) -{ - char dataBuf[256]; - - GetPrivateProfileString(SectionName, EntryName, "" - , dataBuf, sizeof(dataBuf), ProfileName); - { - CStringRecord fields( dataBuf, "," ); - if (fields.GetNumFields() == 2) - { - pt.x = atoi(fields[0]); - pt.y = atoi(fields[1]); - } - } -} - -// ---------------------------------------------------------- -// GetColorFromProfile - description -// ---------------------------------------------------------- -COLORREF GetColorFromProfile( - LPSTR SectionName, - LPSTR EntryName, - LPSTR ProfileName -) -{ - char dataBuf[256]; - COLORREF color=0; - - // Initialize text color - GetPrivateProfileString(SectionName, EntryName, "" - , dataBuf, sizeof(dataBuf), ProfileName); - { - CStringRecord fields( dataBuf, "," ); - if (fields.GetNumFields() == 3) - { - color = PALETTERGB(atoi(fields[0]) - , atoi(fields[1]), atoi(fields[2])); - } - } - - return(color); - -} - -/**************************************************************************** - - FUNCTION: InitInstance(HINSTANCE, int) - - PURPOSE: Saves instance handle and creates main window - - COMMENTS: - - This function is called at initialization time for every instance of - this application. This function performs initialization tasks that - cannot be shared by multiple instances. - - In this case, we save the instance handle in a static variable and - create and display the main program window. - -****************************************************************************/ -int loading_stuff = 0; -#ifdef ONLY_ONE_INSTANCE -const char * MutexName = "IklownsMutex"; -#endif - -BOOL InitInstance( - HINSTANCE hInstance, - int nCmdShow) -{ - WNDCLASS wc; - -#ifdef ONLY_ONE_INSTANCE - // first, check to see if we're the first instance - hMutex = OpenMutex( SYNCHRONIZE, FALSE, MutexName); - if (hMutex != 0) - { - // we are *not* the first instance! - CloseHandle(hMutex); - MessageBox(0, "Only one copy of IKLOWNS can run at a time!", "Immortal Klowns", MB_OK); - return(FALSE); - } - else - { - // doesn't exist - so create it... - hMutex = CreateMutex(NULL, TRUE, MutexName); - } -#endif - - // Fill in window class structure with parameters that describe the - // main window. - - wc.style = CS_OWNDC; // Class style(s). - wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure - wc.cbClsExtra = 0; // No per-class extra data. - wc.cbWndExtra = 0; // No per-window extra data. - wc.hInstance = hInstance; // Owner of this class - wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APP)); // Icon name from .RC - wc.hCursor = LoadCursor(NULL, IDC_ARROW);// Cursor - wc.hbrBackground = NULL; // Default color - wc.lpszMenuName = NULL; - wc.lpszClassName = szAppName; // Name to register as - - // Register the window class - if (!RegisterClass(&wc)) - throw CGameException( - IDS_STARTUP_ERROR - ); - - // Create a main window for this application instance. - int winx = 0; - int winy = 0; - int winw = GetSystemMetrics(SM_CXSCREEN); - int winh = GetSystemMetrics(SM_CYSCREEN); - - ghMainWnd = CreateWindow( - szAppName, // See RegisterClass() call. - szTitle, // Text for window title bar. - WS_POPUP, // Window style. - winx, - winy, - winw, - winh, - NULL, // Overlapped windows have no parent. - NULL, // Use the window class menu. - hInstance, // This instance owns this window. - NULL // We don't use any data in our WM_CREATE - ); - - // If window could not be created, return "failure" - if (!ghMainWnd) - throw CGameException( - IDS_STARTUP_ERROR - ); - - ShowWindow(ghMainWnd, nCmdShow); // Show the window - UpdateWindow(ghMainWnd); // Sends WM_PAINT message - - char dirBuf[MAX_PATH]; - char dirPath[MAX_PATH]; - char dataPath[MAX_PATH]; - char *p; - GetModuleFileName(NULL, dirPath, sizeof(dirPath)); - p = strrchr(dirPath, '\\'); - *p = '\0'; - - lstrcpy(dirBuf, dirPath); - lstrcat(dirBuf , "\\iklowns.gam" ); - - GetPrivateProfileString("general", "datapath", ".", dataPath - , sizeof(dataPath), dirBuf); - - lstrcpy(gDataPath, dirPath); - lstrcat(gDataPath,"\\"); - lstrcat(gDataPath, dataPath); - SetCurrentDirectory(gDataPath); - - Input = new CGameInput; - - - // see if lobby can connect us - BOOL bConnected = FALSE; - - if (RemoteCreateLobby()) - { - bConnected = RemoteCreate(IMMORTALKLOWNS_GUID, "Whomever", "KrustyX"); - - // we are connected, so start multiplayer - if (bConnected) - gGameMode = CHOICE_NET; - } - - // let user decide how to connect - if (!bConnected) - { - pOptionScreen = new COptionScreen; - if ( ! pOptionScreen ) { - delete Input; - return( FALSE ); - } - pOptionScreen->Init(NULL, OPTION_PLAY_START, CHOICE_QUIT+1, NULL - , Input, CHOICE_SOLO, FIVE_SECONDS); - { - BOOL fReturnToOptionScreen; - - do { - fReturnToOptionScreen = FALSE; - - gGameMode = pOptionScreen->DoOptionScreen(); - - if ((gGameMode == -1) || (gGameMode == CHOICE_QUIT)) - { - pOptionScreen->Shutdown(); - delete pOptionScreen; - delete Input; - PostQuitMessage(0); - return (FALSE); - } - - if (gGameMode == CHOICE_NET) - { - if ( ! RemoteCreate(IMMORTALKLOWNS_GUID, "Whomever", "KrustyX") ) - { - fReturnToOptionScreen = TRUE; - } - } - } while ( fReturnToOptionScreen ); - } - pOptionScreen->Shutdown(); - delete pOptionScreen; - pOptionScreen = NULL; - } - - Timer = new CGameTimer; - - gUse_DDraw = (GetPrivateProfileInt("general", "useddraw", 0, dirBuf) == 1); - gDoubleBuffer = (GetPrivateProfileInt("general", "doublebuffer", 1, dirBuf)); - - if (gUse_DDraw) - { - // - // temp hack - verify DirectDraw object can be created - // before we do our construction, and if it cann't we - // punt to GDI - // - LPDIRECTDRAW pdd; - HRESULT result; - result = DirectDrawCreate( NULL, &pdd, NULL ); - if( result == DD_OK ) - { - pdd->Release(); - pGameScreen = new CGameDDrawScreen(ghMainWnd, 0, 0); - } - else - { - gUse_DDraw = 0; - } - } - if (!gUse_DDraw) - { - pGameScreen = new CGameDSScreen(ghMainWnd, SCREEN_WIDTH, - SCREEN_HEIGHT); - } - - // determine machine capabilities & store in gMachineCaps - GetMachineCaps(); - - gSoundMode = GetPrivateProfileInt("general", "SoundMode", 2, dirBuf); - if( gSoundMode == 0 ) - { - LPDIRECTSOUND pds; - HRESULT result; - result = DirectSoundCreate( NULL, &pds, NULL ); - if( result == 0 ) - { - pds->Release(); - } - else - { - gSoundMode = 1; - } - } - - - { - char BitmapFile[MAX_PATH]; - char MidiFile[MAX_PATH]; - POINT origin; - TXTCOLOR color; - RECT rect; - - GetPrivateProfileString("LoadingScreens", "Bitmap", "load.bmp" - , BitmapFile, sizeof(BitmapFile), dirBuf); - - color.main = COLOR_RED; - color.shadow = GetColorFromProfile("LoadingScreens", "DefaultShadow" - , dirBuf); - GetPointFromProfile(origin, "LoadingScreens", "HotSpot", dirBuf); - GetRectFromProfile(rect, "LoadingScreens", "TextRect", dirBuf); - - CSoundEffect *pSoundStart = GetSoundFromProfile("LoadingScreens", "SoundStart", dirBuf); - CSoundEffect *pSoundUpdate = GetSoundFromProfile("LoadingScreens", "SoundUpdate", dirBuf); - CSoundEffect *pSoundEnd = GetSoundFromProfile("LoadingScreens", "SoundEnd", dirBuf); - - GetPrivateProfileString("LoadingScreens", "Music", "" - , MidiFile, sizeof(MidiFile), dirBuf); - - gLoadingScreen = new CLoadingScreen(pGameScreen, BitmapFile, IDS_LOAD_MSG, origin - , color, rect, pSoundStart, pSoundUpdate, pSoundEnd, MidiFile); - } - - pRumbleLevel = new CGameLevel( dirBuf, "Rumble", Timer, Input, pGameScreen ); - - delete gLoadingScreen; - gLoadingScreen = NULL; - - char MidiFile[255]; - GetPrivateProfileString(pRumbleLevel->GetSectionName(), "Music", "", MidiFile - , sizeof(MidiFile), dirBuf); - - if (gMusicOn) - { - playMusic(MidiFile, FALSE); - } - - // prime the animation loop - PostMessage( ghMainWnd, WPM_ANIMATE, 0, 0 ); - - return (TRUE); // We succeeded... -} - -/**************************************************************************** - - FUNCTION: ShutDownApp() - - PURPOSE: un-initialize the app as needed - - COMMENTS: - -****************************************************************************/ -void ShutDownApp() -{ - closeMusic(); - - SetSilence( TRUE ); - ((CGameDDrawScreen*) pGameScreen)->ShowGDIPage(); - - delete pRumbleLevel; - delete pGameScreen; - - delete Input; - delete Timer; - - // force redraw of entire screen - InvalidateRect( HWND_DESKTOP, NULL, TRUE ); -} - -/**************************************************************************** - - FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) - - PURPOSE: Processes messages - - MESSAGES: - - WM_COMMAND - application menu (About dialog box) - WM_DESTROY - destroy window - - COMMENTS: - - To process the IDM_ABOUT message, call MakeProcInstance() to get the - current instance address of the About() function. Then call Dialog - box which will create the box according to the information in your - generic.rc file and turn control over to the About() function. When - it returns, free the intance address. - -****************************************************************************/ - -LRESULT CALLBACK WndProc( - HWND hWnd, // window handle - UINT message, // type of message - WPARAM uParam, // additional information - LPARAM lParam) // additional information -{ - int wmId, wmEvent; - - switch (message) { - case WM_ACTIVATEAPP: - gActive = (BOOL)uParam; - - // hook here for min on leaving ... - if (Timer) - { - switch (LOWORD(uParam)) - { - case WA_INACTIVE: - if (pRumbleLevel != NULL) - { - pRumbleLevel->StopAnimating(); - } - break; - - default: - if (pGameScreen != NULL) - { - pGameScreen->Refresh(); - } - - // restart the animation - PostMessage( hWnd, WPM_ANIMATE, 0, 0 ); - break; - } - return(0); - } - break; - - case WM_COMMAND: // message: command from application menu - - wmId = LOWORD(uParam); - wmEvent = HIWORD(uParam); - - switch (wmId) { - case IDM_EXIT: - DestroyWindow (hWnd); - break; - - default: - return (DefWindowProc(hWnd, message, uParam, lParam)); - } - break; - - case WM_PAINT: - { - PAINTSTRUCT ps; - HDC hdc; - - hdc = BeginPaint(hWnd, &ps); - - if (gLoadingScreen) - gLoadingScreen->Paint(); - else if ( pOptionScreen ) { - pOptionScreen->Paint(); - } - EndPaint(hWnd, &ps); - return(0); - break; - } - - case WM_ERASEBKGND: - // no need for erasing - if (pOptionScreen) - return (DefWindowProc(hWnd, message, uParam, lParam)); - else - return(1); - - case WPM_ANIMATE: - // won't return til finished with animation - if (gActive && (pRumbleLevel != NULL)) - { - // flush input... - if (Input) - Input->Flush(); - pRumbleLevel->Animate( hWnd, pGameScreen ); - } - return TRUE; - break; - - case WM_DESTROY: // message: window being destroyed - closeMusic(); - PostQuitMessage(0); - break; - - default: // Passes it on if unproccessed - return (DefWindowProc(hWnd, message, uParam, lParam)); - } - return (0); -} - -/*---------------------------------------------------------------------------*\ -| -| UnHandler -| -| DESCRIPTION: -| -| -| -\*---------------------------------------------------------------------------*/ -#if defined(__BORLANDC__) || defined(__WATCOMC__) -void _cdecl UnHandler(void) -#else -void UnHandler(void) -#endif -{ - - ShutDownApp(); - MessageBox( - HWND_DESKTOP, - "Unhandled exception in Immortal Klowns.", - "Exception", - MB_ICONSTOP | MB_OK - ); - abort(); -} - - -/*---------------------------------------------------------------------------*\ -| -| GetMachineProfile -| -| DESCRIPTION: -| determine various performance parameters for current machine -| -| -\*---------------------------------------------------------------------------*/ -void -GetMachineCaps() -{ - // processor type - SYSTEM_INFO info; - - GetSystemInfo( &info ); - switch (info.dwProcessorType) - { - case PROCESSOR_INTEL_PENTIUM: - gMachineCaps.processor = MCP_PENTIUM; - break; - - case PROCESSOR_INTEL_486: - gMachineCaps.processor = MCP_486; - break; - - case PROCESSOR_INTEL_386: - gMachineCaps.processor = MCP_386; - break; - - default: - gMachineCaps.processor = MCP_UNKNOWN; - break; - } - - // bus type - HKEY hPCI; - if (RegOpenKeyEx( - HKEY_LOCAL_MACHINE, - "Enum\\PCI", - 0, // reserved - KEY_READ, - &hPCI - ) == ERROR_SUCCESS) - { - gMachineCaps.bus = MCB_PCI; - RegCloseKey( hPCI ); - } - else - { - gMachineCaps.bus = MCB_ISA; - } - - // system memory - MEMORYSTATUS memStat; - - GlobalMemoryStatus( &memStat ); - gMachineCaps.sysMemory = memStat.dwTotalPhys; - // video memory & vid system - if (pGameScreen && (pGameScreen->TypeID() == ST_DDraw)) // info only available through ddraw - { - gMachineCaps.vidMemory = ((CGameDDrawScreen*) pGameScreen)->GetVideoMemory(); - if (gMachineCaps.vidMemory != 0) - { - gMachineCaps.vidSystem = MCV_DDRAW; - } - else - { - gMachineCaps.vidSystem = MCV_UNKNOWN; - } - } - else - { - gMachineCaps.vidMemory = 0; - gMachineCaps.vidSystem = MCV_UNKNOWN; - } -} diff --git a/sdk/samples/iklowns/iklowns.gam b/sdk/samples/iklowns/iklowns.gam deleted file mode 100644 index fd80090..0000000 --- a/sdk/samples/iklowns/iklowns.gam +++ /dev/null @@ -1,548 +0,0 @@ -[General] -useddraw=1 -doublebuffer=1 -; Sound Modes: 0=DirectSound, 1=waveOut, 2=sndPlaySound -soundmode=0 -dlls=krusty.dll,misc.dll -datapath=data -Sleep=-1 -; If two-players on one machine, character for second klown -SecondKlown=Klown2 -; If one-player, computer generated klown... -RoboKlown=Klown2 -; If n-players, character for remote klowns -RemoteKlown=Klown2 - -[KRUSTY.DLL] -aggression=5 -mobility=15 -fastklown=0 -fastvel=200 -debugout=0 -piespeed=80 -pierange=800 -MouseSensitivity=75 -JoystickSensitivity=33 -RunThreshold=50 -RemoteUpdateInterval=1000 -RemoteTimeout=30 - -[Levels] -Rumble=1 - -[IntroScreens] -Bitmap=credits.BMP -Delay=4 - -[OptionScreens] -Bitmap=BACKDROP.BMP -TextRect=150,100,590,380 -DefaultColor=255,0,0 -DefaultShadow=149,149,149 -SelectColor=255,255,255 -SelectShadow=0,0,0 -FontFamily=SS_TIMES -MouseSensitivity=75 -JoystickSensitivity=33 -Timeout=30 - -[CreditScreens] -Bitmap=BACKDROP.BMP -TextRect=100,5,590,475 -DefaultColor=255,255,0 -DefaultShadow=0,0,0 -FontFamily=SS_TIMES -LinesPerScreen=12 -ScrollRate=2 -Music=KLOWN.MID - -[LoadingScreens] -Bitmap=LOAD.BMP -HotSpot=327,273 -DefaultColor=255,0,0 -DefaultShadow=0,0,0 -FontFamily=SS_TIMES -TextRect=100,350,600,400 -SoundStart=blow1.wav,63,loop -SoundUpdate=blow2.wav,63,noloop -SoundEnd=bang.wav,127,noloop -Music=KLOWN.MID - -[Rumble] -WorldX=1920 -WorldY=704 -StartX=-390 -StartY=-240 -Music=KLOWN.MID -;PreloadSounds=throw.wav -Palette=iklowns.pal -Graphics=RumbleGraphics -WinLose=CREDIT.BMP - -[RumbleGraphics] -Sky=Sky -sidef=TiledImage,14,-960,-105 -foreg1=TiledImage,1,-960,115 -BigTBig=TiledImage,20,-400,-40 -RollCost=TiledImage,72,100,-5 -BigTop=TiledImage,60,200,30 -BigTSml=TiledImage,70,40,104 -sideb=TiledImage,15,-960,-40 -ground1=TiledImage,13,-960,80 -; !!! note: numbers are: zmin, zmax, xpos, ypos, numactions, preload, remote object name -; The actions MUST match the number of actions actually defined... -Ferris=Character,128,128,-60,20,1,1 -Plane=Character,129,129,700,0,1,1 -Cloud1=Character,180,180,300,0,1,1 -Cloud2=Character,260,260,350,50,1,1 -Cloud3=Character,340,340,0,40,1,1 -Klown=Character,2,12,-210,30,32,1,Klown2 -Klown2=Character,2,12,210,30,32,0 -Pie=Character,255,255,500,0,2,0 - -[Plane] -Fly=0 - -[Fly] -SequenceFile=plane.spr -SequenceName=Fly -Sound=plane.wav,100,loop -Rate=15 - -[Ferris] -Turn=0 - -[Turn] -SequenceFile=fw0.spr -SequenceName=Turn -Rate=15 - -; -; Note: The following action sequences MUST be in the same order as in the DLL -; -; -[Klown] -stand_right=0 -stand_left=1 -walk_right=2 -walk_left=3 -run_right=4 -run_left=5 -r2l_turn=6 -l2r_turn=7 -throw_right=8 -throw_left=9 -throw_right_walk=10 -throw_left_walk=11 -throw_right_run=12 -throw_left_run=13 -in_right=14 -in_left=15 -out_right=16 -out_left=17 -duck_right=18 -duck_left=19 -block_right=20 -block_left=21 -poke_right=22 -poke_left=23 -hit_face_l=24 -hit_face_r=25 -hit_back_l=26 -hit_back_r=27 -poked_l=28 -poked_r=29 -died=30 -done=31 - -[stand_right] -SequenceFile=c1stand.spr -SequenceName=StandRight - -[stand_left] -SequenceFile=c1stand.spr -SequenceName=StandLeft - -[run_right] -SequenceFile=c1run.spr -SequenceName=RunRight -Sound=run.wav,80,loop -Rate=30 - -[run_left] -SequenceFile=c1run.spr -SequenceName=RunLeft -Sound=run.wav,60,loop -Rate=30 - -[walk_right] -SequenceFile=c1walk.spr -SequenceName=WalkRight -Sound=walk.wav,40,loop -Rate=30 - -[walk_left] -SequenceFile=c1walk.spr -SequenceName=WalkLeft -Sound=walk.wav,40,loop -Rate=30 - -[throw_right] -SequenceFile=c1throw.spr -SequenceName=ThrowRight -Rate=60 - -[throw_left] -SequenceFile=c1throw.spr -SequenceName=ThrowLeft -Rate=60 - -[r2l_turn] -SequenceFile=c1turn.spr -SequenceName=Right2Left -Rate=60 - -[l2r_turn] -SequenceFile=c1turn.spr -SequenceName=Left2Right -Rate=60 - -[duck_right] -SequenceFile=c1duck.spr -SequenceName=DuckRight -Rate=60 - -[duck_left] -SequenceFile=c1duck.spr -SequenceName=DuckLeft -Rate=60 - -[block_right] -SequenceFile=c1block.spr -SequenceName=BlockRight -Rate=60 - -[block_left] -SequenceFile=c1block.spr -SequenceName=BlockLeft -Rate=60 - -[poke_right] -SequenceFile=c1poke.spr -SequenceName=PokeRight -Sound=nyuk.wav,63,noloop -Rate=60 - -[poke_left] -SequenceFile=c1poke.spr -SequenceName=PokeLeft -Sound=nyuk.wav,63,noloop -Rate=60 - -[in_right] -SequenceFile=c1walk45.spr -SequenceName=InRight -Sound=walk.wav,40,loop - -[in_left] -SequenceFile=c1walk45.spr -SequenceName=InLeft -Sound=walk.wav,40,loop - -[out_right] -SequenceFile=c1walk45.spr -SequenceName=OutRight -Sound=walk.wav,40,loop - -[out_left] -SequenceFile=c1walk45.spr -SequenceName=OutLeft -Sound=walk.wav,40,loop - -[hit_face_l] -SequenceFile=c1piefac.spr -SequenceName=PieFaceLeft -SoundEnd=piehit2.wav,100 - -[hit_face_r] -SequenceFile=c1piefac.spr -SequenceName=PieFaceRight -SoundEnd=piehit2.wav,100 - -[hit_back_l] -SequenceFile=c1piehed.spr -SequenceName=PieHeadLeft -SoundEnd=piehit2.wav,100 - -[hit_back_r] -SequenceFile=c1piehed.spr -SequenceName=PieHeadRight -SoundEnd=piehit2.wav,100 - -[poked_l] -SequenceFile=c1stand.spr -SequenceName=StandLeft -Sound=woob.wav,63,noloop - -[poked_r] -SequenceFile=c1stand.spr -SequenceName=StandRight -Sound=woob.wav,63,noloop - -[throw_right_walk] -SequenceFile=c1stand.spr -SequenceName=StandRight - -[throw_left_walk] -SequenceFile=c1stand.spr -SequenceName=StandLeft - -[throw_right_run] -SequenceFile=c1stand.spr -SequenceName=StandRight - -[throw_left_run] -SequenceFile=c1stand.spr -SequenceName=StandLeft - -[died] -SequenceFile=c1sad.spr -SequenceName=C1SadLeft -Rate=10 -Sound=sad.wav,100,noloop - -[done] -SequenceFile=c1sad.spr -SequenceName=C1SadDone - -[Pie] -ThrownLeft=0 -ThrownRight=1 - -[ThrownLeft] -SequenceFile=piefly.spr -SequenceName=FlyLeft -Sound=throw.wav,100,noloop - -[ThrownRight] -SequenceFile=piefly.spr -SequenceName=FlyRight -Sound=throw.wav,100,noloop - -[Cloud1] -Float1=0 - -[Float1] -SequenceFile=clouds.spr -SequenceName=Cloud1 - -[Cloud2] -Float2=0 - -[Float2] -SequenceFile=clouds.spr -SequenceName=Cloud2 - -[Cloud3] -Float3=0 - -[Float3] -SequenceFile=clouds.spr -SequenceName=Cloud3 - -; -; Note: The following action sequences MUST be in the same order as in the DLL -; -; -[Klown2] -C2StandRight=0 -C2StandLeft=1 -C2WalkRight=2 -C2WalkLeft=3 -C2RunRight=4 -C2RunLeft=5 -C2_r2l=6 -C2_l2r=7 -C2ThrowRight=8 -C2ThrowLeft=9 -C2ThrowRight_walk=10 -C2ThrowLeft_walk=11 -C2ThrowRight_run=12 -C2ThrowLeft_run=13 -C2InRight=14 -C2InLeft=15 -C2OutRight=16 -C2OutLeft=17 -C2DuckRight=18 -C2DuckLeft=19 -C2BlockRight=20 -C2BlockLeft=21 -C2PokeRight=22 -C2PokeLeft=23 -C2PieFaceLeft=24 -C2PieFaceRight=25 -C2PieBackLeft=26 -C2PieBackRight=27 -C2PokedLeft=28 -C2PokedRight=29 -C2Died=30 -C2Done=31 - -[C2StandRight] -SequenceFile=c2stand.spr -SequenceName=C2StandRight - -[C2StandLeft] -SequenceFile=c2stand.spr -SequenceName=C2StandLeft - -[C2RunRight] -SequenceFile=c2run.spr -SequenceName=C2RunRight -Sound=run.wav,60,loop -;Rate=30 - -[C2RunLeft] -SequenceFile=c2run.spr -SequenceName=C2RunLeft -Sound=run.wav,60,loop -;Rate=30 - -[C2WalkRight] -SequenceFile=c2walk.spr -SequenceName=C2WalkRight -Sound=walk.wav,40,loop -;Rate=30 - -[C2WalkLeft] -SequenceFile=c2walk.spr -SequenceName=C2WalkLeft -Sound=walk.wav,40,loop -;Rate=30 - -[C2ThrowRight] -SequenceFile=c2throw.spr -SequenceName=C2ThrowRight -;Rate=60 - -[C2ThrowLeft] -SequenceFile=c2throw.spr -SequenceName=C2ThrowLeft -;Rate=60 - -[C2_r2l] -SequenceFile=c2turn.spr -SequenceName=C2Right2Left -;Rate=60 - -[C2_l2r] -SequenceFile=c2turn.spr -SequenceName=C2Left2Right -;Rate=60 - -[C2DuckRight] -SequenceFile=c2duck.spr -SequenceName=C2DuckRight -;Rate=60 - -[C2DuckLeft] -SequenceFile=c2duck.spr -SequenceName=C2DuckLeft -;Rate=60 - -[C2BlockRight] -SequenceFile=c2block.spr -SequenceName=C2BlockRight -;Rate=60 - -[C2BlockLeft] -SequenceFile=c2block.spr -SequenceName=C2BlockLeft -;Rate=60 - -[C2PokeRight] -SequenceFile=c2poke.spr -SequenceName=C2PokeRight -Sound=nyuk.wav,63,noloop -;Rate=60 - -[C2PokeLeft] -SequenceFile=c2poke.spr -SequenceName=C2PokeLeft -Sound=nyuk.wav,63,noloop -;Rate=60 - -[C2InRight] -SequenceFile=c2walk45.spr -SequenceName=C2InRight -Sound=walk.wav,40,loop - -[C2InLeft] -SequenceFile=c2walk45.spr -SequenceName=C2InLeft -Sound=walk.wav,40,loop - -[C2OutRight] -SequenceFile=c2walk45.spr -SequenceName=C2OutRight -Sound=walk.wav,40,loop - -[C2OutLeft] -SequenceFile=c2walk45.spr -SequenceName=C2OutLeft -Sound=walk.wav,40,loop - -[C2PieFaceLeft] -SequenceFile=c2piefac.spr -SequenceName=C2PieFaceLeft -SoundEnd=piehit2.wav,100,noloop - -[C2PieFaceRight] -SequenceFile=c2piefac.spr -SequenceName=C2PieFaceRight -SoundEnd=piehit2.wav,100,noloop - -[C2PieBackLeft] -SequenceFile=c2piehed.spr -SequenceName=C2PieHeadLeft -SoundEnd=piehit2.wav,100,noloop - -[C2PieBackRight] -SequenceFile=c2piehed.spr -SequenceName=C2PieHeadRight -SoundEnd=piehit2.wav,100,noloop - -[C2PokedLeft] -SequenceFile=c2stand.spr -SequenceName=C2StandLeft -Sound=woob.wav,63,noloop - -[C2PokedRight] -SequenceFile=c2stand.spr -SequenceName=C2StandRight -Sound=woob.wav,63,noloop - -[C2ThrowRight_walk] -SequenceFile=c2stand.spr -SequenceName=C2StandRight - -[C2ThrowLeft_walk] -SequenceFile=c2stand.spr -SequenceName=C2StandLeft - -[C2ThrowRight_run] -SequenceFile=c2stand.spr -SequenceName=C2StandRight - -[C2ThrowLeft_run] -SequenceFile=c2stand.spr -SequenceName=C2StandLeft - -[C2Died] -SequenceFile=c2sad.spr -SequenceName=C2SadLeft -Rate=10 - -[C2Done] -SequenceFile=c2sad.spr -SequenceName=C2SadDone diff --git a/sdk/samples/iklowns/iklowns.h b/sdk/samples/iklowns/iklowns.h deleted file mode 100644 index 81b2a92..0000000 --- a/sdk/samples/iklowns/iklowns.h +++ /dev/null @@ -1,32 +0,0 @@ -/*===========================================================================*\ -| -| File: iklowns.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -BOOL InitApplication(HINSTANCE); -BOOL InitInstance(HINSTANCE, int); -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); -LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM); diff --git a/sdk/samples/iklowns/iklowns.ico b/sdk/samples/iklowns/iklowns.ico deleted file mode 100644 index 44fd9fd..0000000 Binary files a/sdk/samples/iklowns/iklowns.ico and /dev/null differ diff --git a/sdk/samples/iklowns/iklowns.mak b/sdk/samples/iklowns/iklowns.mak deleted file mode 100644 index c9bae22..0000000 --- a/sdk/samples/iklowns/iklowns.mak +++ /dev/null @@ -1,667 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "IKLOWNS.MAK" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -MTL=MkTypLib.exe -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "retail" -# PROP BASE Intermediate_Dir "retail" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : $(OUTDIR)/IKLOWNS.ovl $(OUTDIR)/IKLOWNS.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /G4 /MT /W3 /GX /YX /O2 /I ".\include" /I "..\..\inc "/D "NDEBUG" /D "WIN32" /D "_WINDOWS" /c -# SUBTRACT CPP /Fr -CPP_PROJ=/nologo /G4 /MT /W3 /GX /YX /O2 /I ".\include" /I "..\..\inc"\ - /D "NDEBUG" /D "STRICT" /D "WIN32" /D "_WINDOWS" \ - /Fp$(OUTDIR)/"IKLOWNS.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -RSC_PROJ=/l 0x409 /fo$(INTDIR)/"IKLOWNS.res" /d "NDEBUG" -BSC32=bscmake.exe -BSC32_SBRS= \ - -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"IKLOWNS.bsc" - -$(OUTDIR)/IKLOWNS.bsc : $(OUTDIR) $(BSC32_SBRS) -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows,4.0 /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib msacm32.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DEBUG /MACHINE:I386 -# SUBTRACT LINK32 /INCREMENTAL:yes -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib msacm32.lib\ - ..\..\lib\ddraw.lib ..\..\lib\dplayx.lib ..\..\lib\dsound.lib\ - /NOLOGO /SUBSYSTEM:windows,4.0 /INCREMENTAL:no /PDB:$(OUTDIR)/"IKLOWNS.pdb" /DEBUG\ - /MACHINE:I386 /OUT:$(OUTDIR)/"IKLOWNS.ovl" -DEF_FILE= -LINK32_OBJS= \ - $(INTDIR)/CGSCREEN.OBJ \ - $(INTDIR)/CGDIB.OBJ \ - $(INTDIR)/iklowns.obj \ - $(INTDIR)/CGGLOBL.OBJ \ - $(INTDIR)/IKLOWNS.res \ - $(INTDIR)/CGBITBUF.OBJ \ - $(INTDIR)/CGIMAGE.OBJ \ - $(INTDIR)/CGCHAR.OBJ \ - $(INTDIR)/CGSPRITE.OBJ \ - $(INTDIR)/CGACTION.OBJ \ - $(INTDIR)/LINKLIST.LIB \ - $(INTDIR)/CGUPDATE.OBJ \ - $(INTDIR)/cgutil.lib \ - $(INTDIR)/CGLEVEL.OBJ \ - $(INTDIR)/CGTIMER.OBJ \ - $(INTDIR)/CGINPUT.OBJ \ - $(INTDIR)/CGGRAPH.OBJ \ - $(INTDIR)/CGDLIST.OBJ \ - $(INTDIR)/CGCHRINT.OBJ \ - $(INTDIR)/CGREMOTE.OBJ \ - $(INTDIR)/CGREMQUE.OBJ \ - $(INTDIR)/cgmidi.obj \ - $(INTDIR)/cgsound.obj \ - $(INTDIR)/CGWAVE.OBJ \ - $(INTDIR)/CGOPTION.OBJ \ - $(INTDIR)/CGTEXT.OBJ \ - $(INTDIR)/CGLOAD.OBJ - -$(OUTDIR)/IKLOWNS.ovl : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\IKLOWNS.OVL IKLOWNS.OVL - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "debug" -# PROP BASE Intermediate_Dir "debug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)/IKLOWNS.ovl $(OUTDIR)/IKLOWNS.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -# ADD BASE CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /G4 /MT /W3 /GX /Zi /YX /Od /I ".\include" /D "_DEBUG" /D "DEBUG" /D "WIN32" /D "_WINDOWS" /c -# SUBTRACT CPP /Fr -CPP_PROJ=/nologo /G4 /MT /W3 /GX /Zi /YX /Od /I ".\include" /I "..\..\inc"\ - /D "_DEBUG" /D "STRICT" /D "DEBUG" /D "WIN32" /D\ - "_WINDOWS" /D "WINVER=0x0400" /Fp$(OUTDIR)/"IKLOWNS.pch" /Fo$(INTDIR)/\ - /Fd$(OUTDIR)/"IKLOWNS.pdb" /c -CPP_OBJS=.\debug/ -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -RSC_PROJ=/l 0x409 /fo$(INTDIR)/"IKLOWNS.res" /d "_DEBUG" -BSC32=bscmake.exe -BSC32_SBRS= \ - -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"IKLOWNS.bsc" - -$(OUTDIR)/IKLOWNS.bsc : $(OUTDIR) $(BSC32_SBRS) -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DEBUG /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib msacm32.lib /NOLOGO /SUBSYSTEM:windows,4.0 /INCREMENTAL:no /DEBUG /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib msacm32.lib\ - ..\..\lib\ddraw.lib ..\..\lib\dplayx.lib ..\..\lib\dsound.lib\ - /NOLOGO /SUBSYSTEM:windows,4.0 /INCREMENTAL:no /PDB:$(OUTDIR)/"IKLOWNS.pdb" /DEBUG\ - /MACHINE:I386 /OUT:$(OUTDIR)/"IKLOWNS.ovl" -DEF_FILE= -LINK32_OBJS= \ - $(INTDIR)/CGSCREEN.OBJ \ - $(INTDIR)/CGDIB.OBJ \ - $(INTDIR)/iklowns.obj \ - $(INTDIR)/CGGLOBL.OBJ \ - $(INTDIR)/IKLOWNS.res \ - $(INTDIR)/CGBITBUF.OBJ \ - $(INTDIR)/CGIMAGE.OBJ \ - $(INTDIR)/CGCHAR.OBJ \ - $(INTDIR)/CGSPRITE.OBJ \ - $(INTDIR)/CGACTION.OBJ \ - $(INTDIR)/LINKLIST.LIB \ - $(INTDIR)/CGUPDATE.OBJ \ - $(INTDIR)/cgutil.lib \ - $(INTDIR)/CGLEVEL.OBJ \ - $(INTDIR)/CGTIMER.OBJ \ - $(INTDIR)/CGINPUT.OBJ \ - $(INTDIR)/CGGRAPH.OBJ \ - $(INTDIR)/CGDLIST.OBJ \ - $(INTDIR)/CGCHRINT.OBJ \ - $(INTDIR)/CGREMOTE.OBJ \ - $(INTDIR)/CGREMQUE.OBJ \ - $(INTDIR)/cgmidi.obj \ - $(INTDIR)/cgsound.obj \ - $(INTDIR)/CGWAVE.OBJ \ - $(INTDIR)/CGOPTION.OBJ \ - $(INTDIR)/CGTEXT.OBJ \ - $(INTDIR)/CGLOAD.OBJ - -$(OUTDIR)/IKLOWNS.ovl : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\IKLOWNS.OVL IKLOWNS.OVL - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\CGSCREEN.CPP -DEP_CGSCR=\ - .\INCLUDE\CGDEBUG.H\ - .\CGBITBUF.H\ - .\CGSCREEN.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGSCREEN.OBJ : $(SOURCE) $(DEP_CGSCR) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGDIB.CPP -DEP_CGDIB=\ - .\CGGLOBL.H\ - .\cgrsrce.h\ - .\CGSCREEN.H\ - .\INCLUDE\CGEXCPT.H\ - .\INCLUDE\CGDEBUG.H\ - .\INCLUDE\CGDIB.H\ - .\CGBITBUF.H - -$(INTDIR)/CGDIB.OBJ : $(SOURCE) $(DEP_CGDIB) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\iklowns.cpp -DEP_IKLOW=\ - .\INCLUDE\STRREC.H\ - .\CGGLOBL.H\ - .\cgrsrce.h\ - .\INCLUDE\CGEXCPT.H\ - .\CGIMAGE.H\ - .\INCLUDE\CGDIB.H\ - .\CGCHAR.H\ - .\CGLEVEL.H\ - .\CGTIMER.H\ - .\CGINPUT.H\ - .\CGMIDI.H\ - .\CGOPTION.H\ - .\CGLOAD.H\ - .\IKLOWNS.H\ - .\CGSCREEN.H\ - .\CGBITBUF.H\ - .\CGGRAPH.H\ - .\CGUPDATE.H\ - .\CGACTION.H\ - .\CGCHDLL.H\ - .\CGREMOTE.H\ - .\CGDLIST.H\ - .\cgsound.h\ - .\CGTEXT.H\ - .\INCLUDE\LINKLIST.H\ - .\CGSPRITE.H\ - .\CGREMQUE.H - -$(INTDIR)/iklowns.obj : $(SOURCE) $(DEP_IKLOW) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGGLOBL.CPP -DEP_CGGLO=\ - .\CGGLOBL.H - -$(INTDIR)/CGGLOBL.OBJ : $(SOURCE) $(DEP_CGGLO) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\IKLOWNS.RC -DEP_IKLOWN=\ - .\IKLOWNS.ICO\ - .\cgrsrce.h - -$(INTDIR)/IKLOWNS.res : $(SOURCE) $(DEP_IKLOWN) $(INTDIR) - $(RSC) $(RSC_PROJ) $(SOURCE) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGBITBUF.CPP -DEP_CGBIT=\ - .\INCLUDE\CGDEBUG.H\ - .\INCLUDE\CGDIB.H\ - .\CGBITBUF.H - -$(INTDIR)/CGBITBUF.OBJ : $(SOURCE) $(DEP_CGBIT) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGIMAGE.CPP -DEP_CGIMA=\ - .\cgrsrce.h\ - .\INCLUDE\CGEXCPT.H\ - .\INCLUDE\CGDEBUG.H\ - .\CGGLOBL.H\ - .\CGSCREEN.H\ - .\CGLEVEL.H\ - .\CGUPDATE.H\ - .\CGIMAGE.H\ - .\CGBITBUF.H\ - .\CGDLIST.H\ - .\INCLUDE\LINKLIST.H\ - .\CGGRAPH.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGIMAGE.OBJ : $(SOURCE) $(DEP_CGIMA) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGCHAR.CPP -DEP_CGCHA=\ - .\INCLUDE\CGDEBUG.H\ - .\CGTIMER.H\ - .\CGINPUT.H\ - .\CGCHAR.H\ - .\CGCHDLL.H\ - .\CGCHRINT.H\ - .\CGREMOTE.H\ - .\INCLUDE\STRREC.H\ - .\CGUPDATE.H\ - .\CGACTION.H\ - .\CGGRAPH.H\ - .\INCLUDE\LINKLIST.H\ - .\CGREMQUE.H\ - .\CGSPRITE.H\ - .\cgsound.h\ - .\CGLEVEL.H\ - .\CGSCREEN.H\ - .\CGBITBUF.H\ - .\CGDLIST.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGCHAR.OBJ : $(SOURCE) $(DEP_CGCHA) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGSPRITE.CPP -DEP_CGSPR=\ - .\INCLUDE\CGDEBUG.H\ - .\CGGLOBL.H\ - .\CGTIMER.H\ - .\CGSPRITE.H\ - .\CGUPDATE.H\ - .\INCLUDE\LINKLIST.H\ - .\CGBITBUF.H\ - .\CGSCREEN.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGSPRITE.OBJ : $(SOURCE) $(DEP_CGSPR) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGACTION.CPP -DEP_CGACT=\ - .\CGGLOBL.H\ - .\INCLUDE\CGDEBUG.H\ - .\CGSPRITE.H\ - .\INCLUDE\STRREC.H\ - .\CGACTION.H\ - .\INCLUDE\LINKLIST.H\ - .\CGBITBUF.H\ - .\cgsound.h\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGACTION.OBJ : $(SOURCE) $(DEP_CGACT) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LIB\DEBUG\LINKLIST.LIB -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGUPDATE.CPP -DEP_CGUPD=\ - .\CGUPDATE.H\ - .\CGGLOBL.H\ - .\INCLUDE\LINKLIST.H - -$(INTDIR)/CGUPDATE.OBJ : $(SOURCE) $(DEP_CGUPD) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LIB\DEBUG\cgutil.lib -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGLEVEL.CPP -DEP_CGLEV=\ - .\INCLUDE\LINKLIST.H\ - .\CGGRAPH.H\ - .\CGLEVEL.H\ - .\CGTIMER.H\ - .\CGCHDLL.H\ - .\CGCHRINT.H\ - .\INCLUDE\STRREC.H\ - .\CGINPUT.H\ - .\CGCHAR.H\ - .\CGIMAGE.H\ - .\CGMIDI.H\ - .\CGREMOTE.H\ - .\cgsound.h\ - .\CGGLOBL.H\ - .\CGSCREEN.H\ - .\CGUPDATE.H\ - .\CGDLIST.H\ - .\CGACTION.H\ - .\CGREMQUE.H\ - .\CGBITBUF.H\ - .\CGSPRITE.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGLEVEL.OBJ : $(SOURCE) $(DEP_CGLEV) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGTIMER.CPP -DEP_CGTIM=\ - .\CGTIMER.H - -$(INTDIR)/CGTIMER.OBJ : $(SOURCE) $(DEP_CGTIM) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGINPUT.CPP -DEP_CGINP=\ - .\CGINPUT.H - -$(INTDIR)/CGINPUT.OBJ : $(SOURCE) $(DEP_CGINP) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGGRAPH.CPP -DEP_CGGRA=\ - .\CGGRAPH.H\ - .\CGLEVEL.H\ - .\CGSCREEN.H\ - .\CGUPDATE.H\ - .\CGDLIST.H\ - .\CGBITBUF.H\ - .\INCLUDE\LINKLIST.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGGRAPH.OBJ : $(SOURCE) $(DEP_CGGRA) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGDLIST.CPP -DEP_CGDLI=\ - .\cgrsrce.h\ - .\INCLUDE\CGEXCPT.H\ - .\INCLUDE\STRREC.H\ - .\INCLUDE\CGDEBUG.H\ - .\CGCHAR.H\ - .\CGIMAGE.H\ - .\CGLOAD.H\ - .\CGDLIST.H\ - .\CGUPDATE.H\ - .\CGACTION.H\ - .\CGGRAPH.H\ - .\CGCHDLL.H\ - .\CGREMOTE.H\ - .\cgsound.h\ - .\CGTEXT.H\ - .\INCLUDE\LINKLIST.H\ - .\CGSPRITE.H\ - .\CGLEVEL.H\ - .\CGSCREEN.H\ - .\CGREMQUE.H\ - .\CGBITBUF.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGDLIST.OBJ : $(SOURCE) $(DEP_CGDLI) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGCHRINT.CPP -DEP_CGCHR=\ - .\CGCHDLL.H\ - .\CGLEVEL.H\ - .\CGCHAR.H\ - .\CGCHRINT.H\ - .\CGINPUT.H\ - .\CGDLIST.H\ - .\CGUPDATE.H\ - .\CGACTION.H\ - .\CGGRAPH.H\ - .\CGREMOTE.H\ - .\INCLUDE\LINKLIST.H\ - .\CGSPRITE.H\ - .\cgsound.h\ - .\CGSCREEN.H\ - .\CGREMQUE.H\ - .\CGBITBUF.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGCHRINT.OBJ : $(SOURCE) $(DEP_CGCHR) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\.\LIB\DDRAW.LIB -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGREMOTE.CPP -DEP_CGREM=\ - .\CGLEVEL.H\ - .\CGREMOTE.H\ - .\INCLUDE\STRREC.H\ - .\CGDLIST.H\ - .\INCLUDE\LINKLIST.H\ - .\CGREMQUE.H\ - .\CGUPDATE.H - -$(INTDIR)/CGREMOTE.OBJ : $(SOURCE) $(DEP_CGREM) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGREMQUE.CPP -DEP_CGREMQ=\ - .\INCLUDE\LINKLIST.H\ - .\CGREMOTE.H\ - .\CGREMQUE.H - -$(INTDIR)/CGREMQUE.OBJ : $(SOURCE) $(DEP_CGREMQ) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\.\LIB\DPLAY.LIB -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\cgmidi.cpp -DEP_CGMID=\ - .\CGMIDI.H - -$(INTDIR)/cgmidi.obj : $(SOURCE) $(DEP_CGMID) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\cgsound.cpp -DEP_CGSOU=\ - .\INCLUDE\LINKLIST.H\ - .\CGWAVE.H\ - .\cgsound.h - -$(INTDIR)/cgsound.obj : $(SOURCE) $(DEP_CGSOU) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGWAVE.CPP -DEP_CGWAV=\ - .\CGWAVE.H - -$(INTDIR)/CGWAVE.OBJ : $(SOURCE) $(DEP_CGWAV) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\.\LIB\DSOUND.LIB -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGOPTION.CPP -DEP_CGOPT=\ - .\CGGLOBL.H\ - .\INCLUDE\CGDIB.H\ - .\INCLUDE\STRREC.H\ - .\CGINPUT.H\ - .\CGTEXT.H\ - .\INCLUDE\LINKLIST.H - -$(INTDIR)/CGOPTION.OBJ : $(SOURCE) $(DEP_CGOPT) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGTEXT.CPP -DEP_CGTEX=\ - .\CGTEXT.H\ - .\INCLUDE\LINKLIST.H - -$(INTDIR)/CGTEXT.OBJ : $(SOURCE) $(DEP_CGTEX) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGLOAD.CPP -DEP_CGLOA=\ - .\CGGLOBL.H\ - .\INCLUDE\STRREC.H\ - .\INCLUDE\CGDIB.H\ - .\cgsound.h\ - .\CGLOAD.H\ - .\CGTEXT.H\ - .\INCLUDE\LINKLIST.H - -$(INTDIR)/CGLOAD.OBJ : $(SOURCE) $(DEP_CGLOA) $(INTDIR) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/iklowns/iklowns.rc b/sdk/samples/iklowns/iklowns.rc deleted file mode 100644 index e408e11..0000000 --- a/sdk/samples/iklowns/iklowns.rc +++ /dev/null @@ -1,252 +0,0 @@ -//Microsoft Visual C++ generated resource script. -// -#include "cgrsrce.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "winver.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -IDI_APP ICON DISCARDABLE "IKLOWNS.ICO" - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDR_GENERIC ACCELERATORS MOVEABLE PURE -BEGIN - VK_F1, IDM_HELPCONTENTS, VIRTKEY - "?", IDM_ABOUT, ASCII, ALT - "/", IDM_ABOUT, ASCII, ALT -END - -IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE -BEGIN - VK_DOWN, IDA_DOWN, VIRTKEY, NOINVERT - VK_LEFT, IDA_LEFT, VIRTKEY, NOINVERT - VK_RETURN, IDA_RETURN, VIRTKEY, NOINVERT - VK_RIGHT, IDA_RIGHT, VIRTKEY, NOINVERT - VK_UP, IDA_UP, VIRTKEY, NOINVERT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 167, 64 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "About Generic" -BEGIN - DEFPUSHBUTTON "OK",IDOK,132,2,32,14,WS_GROUP - ICON IDI_APP,-1,3,2,18,20 - LTEXT "CompanyName",IDC_COMPANYNAME,30,2,100,8 - LTEXT "FileDescription",IDC_FILEDESCRIPTION,30,10,82,8 - LTEXT "ProductVersion",IDC_PRODUCTVERSION,114,10,16,8 - LTEXT "LegalCopyright",IDC_LEGALCOPYRIGHT,30,18,137,8 - LTEXT "LegalTrademarks",IDC_LEGALTRADEMARKS,30,34,136,27 - CONTROL "",501,"Static",SS_BLACKRECT,28,31,138,1 -END - -IDD_REMCONNABORTDLG DIALOG DISCARDABLE 0, 0, 183, 20 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Waiting for connection" -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Cancel",IDCANCEL,129,2,50,14 - LTEXT "Press Cancel to abort",IDC_STATIC,28,5,75,8 -END - -IDD_CHOOSEPROVIDER DIALOG DISCARDABLE 0, 0, 199, 158 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Choose Connection Mechanism" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_LIST1,6,7,182,109,LBS_SORT | LBS_NOINTEGRALHEIGHT | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "OK",IDOK,31,130,47,13 - PUSHBUTTON "Cancel",IDCANCEL,120,130,47,13 -END - -IDD_SELSESSION DIALOG DISCARDABLE 0, 0, 185, 170 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Select Session" -FONT 8, "MS Sans Serif" -BEGIN - LISTBOX IDC_LB_SESSION,10,12,157,129,LBS_SORT | - LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "OK",IDOK,10,150,60,15 - PUSHBUTTON "Cancel",IDCANCEL,100,150,65,15 -END - -IDD_Q_CREATE DIALOG DISCARDABLE 0, 0, 142, 36 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Create Game or Connect to Game?" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Create",IDC_CREATE,3,10,50,14 - PUSHBUTTON "Connect",IDC_CONNECT,78,10,50,14 -END - -IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 185, 183 -STYLE DS_SYSMODAL | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU -CAPTION "Iklowns Options" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,17,154,50,14 - PUSHBUTTON "Cancel",IDCANCEL,113,154,50,14 - LISTBOX IDC_LISTOPTION,21,26,136,112,LBS_NOINTEGRALHEIGHT | - WS_TABSTOP -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -1 VERSIONINFO - FILEVERSION 3,3,0,0 - PRODUCTVERSION 3,3,0,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0xbL -#else - FILEFLAGS 0xaL -#endif - FILEOS 0x10001L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "Microsoft Corporation\0" - VALUE "FileDescription", "Generic Example Application\0" - VALUE "FileVersion", "3.3\0" - VALUE "InternalName", "Generic\0" - VALUE "LegalCopyright", "Copyright \251 Microsoft Corp. 1990 - 1996\0" - VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation\0" - VALUE "OriginalFilename", "\0" - VALUE "ProductName", "Generic\0" - VALUE "ProductVersion", "3.2\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "cgrsrce.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""winver.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_INFO_TITLE "Attention" - IDS_ERROR_TITLE "Error" - IDS_INVALID_FILE "Invalid file." - IDS_GDI_ERROR "GDI Error." - IDS_STARTUP_ERROR "Error starting application." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SOLO_PLAY "Play solo" - IDS_TWO_PLAYER "Two player game" - IDS_NET_PLAY "Play network opponents" - IDS_QUIT_GAME "Quit Game" - IDS_INSTRUCTION_1 "Arrow keys move, shift fires pie, alt+down ducks, alt+shift blocks, shift+down pokes" - IDS_INSTRUCTION_2 "F2 = sound, F5 = frame rate, F9 = fastklown mode" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_WIN_1 "Congratulations!" - IDS_WIN_2 " " - IDS_WIN_3 "You beat the Klown!" - IDS_WIN_4 " " -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_WIN_5 "Try your luck again..." - IDS_WIN_6 "Or press ESC to quit" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_LOSE_1 "Sorry!" - IDS_LOSE_2 " " - IDS_LOSE_3 "The Klown beat you!" - IDS_LOSE_4 " " - IDS_LOSE_5 "Try your luck again..." - IDS_LOSE_6 "Or press ESC to quit" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_LOAD_MSG "Please Wait... Loading Data." -END - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/sdk/samples/iklowns/include/cgdebug.h b/sdk/samples/iklowns/include/cgdebug.h deleted file mode 100644 index df67379..0000000 --- a/sdk/samples/iklowns/include/cgdebug.h +++ /dev/null @@ -1,50 +0,0 @@ -/*===========================================================================*\ -| -| File: cgdebug.h -| -| Description: -| debugging macros -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef CGDEBUG_H -#define CGDEBUG_H - -// NOTE: must define DEBUG to get any debug strings! -#ifdef DEBUG -#define DB_LOG(type, string) if (DB_TYPES & type) OutputDebugString(string); -#else -#define DB_LOG(type, string) -#endif - -// DB_TYPES is a bitmap of desired debug strings -#define DB_INFO 0x01 // for non-error, non-time-critical information output -#define DB_TIMECRIT_INFO 0x02 // for non-error, time-critical (e.g. IRQ handler) info -#define DB_PROBLEM 0x04 // for non-time-critical problem report -#define DB_TIMECRIT_PROBLEM 0x08 // for time-critical (e.g. IRQ handler) problem report - -// default to no debug output if DB_TYPES not defined -#ifndef DB_TYPES -#define DB_TYPES 0 -#endif - -#ifdef DEBUG -#define DB_BREAK_IF(x) if (x) DebugBreak(); -#define DB_BREAK() DebugBreak(); - -#define DB_CHECK(x, string) if (x) DB_LOG(DB_PROBLEM, string); -#else -#define DB_BREAK_IF(x) -#define DB_BREAK() - -#define DB_CHECK(x, string) -#endif - - -#endif // CGDEBUG_H diff --git a/sdk/samples/iklowns/include/cgdib.h b/sdk/samples/iklowns/include/cgdib.h deleted file mode 100644 index f96b35d..0000000 --- a/sdk/samples/iklowns/include/cgdib.h +++ /dev/null @@ -1,69 +0,0 @@ -/*===========================================================================*\ -| -| File: cgdib.h -| -| Description: -| contains class definitions for handling DIBs -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef CGDIB_H -#define CGDIB_H - -#include - -// CGameDIB is class for handling DIBs in Manhattan games -class CGameDIB -{ -public: - CGameDIB(); // create empty, invalid object (used by derived classes) - CGameDIB( char* pFileName ); // constructor - create image from file - - // construct a new DIB section in memory of given size, palette - CGameDIB( int width, int height, HPALETTE hPal = NULL ); - - virtual ~CGameDIB(); // destructor - - virtual LPBITMAPINFO GetBitmapInfo(){return mpBitmapInfo;} - virtual LPBYTE GetBits(){return mpBits;} - - virtual HPALETTE CreatePalette(); - virtual HBITMAP GetHBitmap(){return mhBitmap;} - - virtual LPBYTE GetPixelAddress(int x, int y); - virtual COLORREF GetPixelColor(int x, int y); - - virtual UINT GetColorTable(UINT, UINT, RGBQUAD*); - - virtual int GetWidth(); - virtual int GetHeight(); - - virtual int BytesPerScanline() - { - return (GetWidth() + 3) & ~3; - } - - virtual const char* GetNamePtr() - { - return (const char*) mpFileName; - } - -protected: - - BOOL mImageValid; // flag whether image is valid - - LPBITMAPINFO mpBitmapInfo; - LPBYTE mpBits; - HBITMAP mhBitmap; // handle to our DIB section - char* mpFileName; - - void OpenDIB(char* pFileName); -}; - -#endif // CGDIB_H diff --git a/sdk/samples/iklowns/include/cgexcpt.h b/sdk/samples/iklowns/include/cgexcpt.h deleted file mode 100644 index a947f47..0000000 --- a/sdk/samples/iklowns/include/cgexcpt.h +++ /dev/null @@ -1,47 +0,0 @@ -/*===========================================================================*\ -| -| File: cgexcpt.h -| -| Description: -| Exception classes -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef CGEXCPT_H -#define CGEXCPT_H - -#include - -class CGameException -{ -public: - CGameException(int resID = 0); // 0 == no message - virtual ~CGameException(); - - virtual int GetResID(){return mResID;} - -protected: - int mResID; -}; - -class CGameStartupError : public CGameException -{ -public: - CGameStartupError(int resID = 0); // 0 == no message - virtual ~CGameStartupError(); -}; - -class CGameResourceError : public CGameException -{ -public: - CGameResourceError(); - virtual ~CGameResourceError(); -}; - -#endif // CGEXCPT_H diff --git a/sdk/samples/iklowns/include/cgres.h b/sdk/samples/iklowns/include/cgres.h deleted file mode 100644 index 5de85e2..0000000 --- a/sdk/samples/iklowns/include/cgres.h +++ /dev/null @@ -1,32 +0,0 @@ -/*===========================================================================*\ -| -| File: cgres.h -| -| Description: -| resource loading classes -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef CGRES_H -#define CGRES_H - -#include - -#define MAX_STRING_LENGTH 255 - -class CGameStringResource -{ -public: - CGameStringResource( HINSTANCE, UINT ); - virtual ~CGameStringResource(); - - char mString[MAX_STRING_LENGTH]; -}; - -#endif // CGRES_H diff --git a/sdk/samples/iklowns/include/dibfile.h b/sdk/samples/iklowns/include/dibfile.h deleted file mode 100644 index fa07da6..0000000 --- a/sdk/samples/iklowns/include/dibfile.h +++ /dev/null @@ -1,77 +0,0 @@ -/*===========================================================================*\ -| -| File: dibfile.h -| -| Description: -| Classes for saving DIB files -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef DIBFILE_H -#define DIBFILE_H - -#include -#include "cgdib.h" - -#if 0 -class TempBackupFile -{ -public: - // constructor makes a temporary backup copy of the file - TempBackupFile(char* pOrgFileName); - - // if Commit() never called, destructor restores the original file from the backup - virtual ~TempBackupFile(); - - void Commit(); // commit the org file by disgarding the temp backup - -private: - char* mpTempFileName; - char* mpOrgFileName; -}; -#endif - -// writes a DIB file -class DIBWriteFile : public CGameDIB -{ -public: - // constructor creates the DIB file & the DIBWriteFile object - DIBWriteFile(char* pFileName, LPBITMAPINFO pBmi); - - // destructor closes the file & deletes the DIBWriteFile object - virtual ~DIBWriteFile(); - -#if 0 - HBITMAP GetHBitmap() - { - return mhBitmap; - } - - LPVOID GetBits() - { - return mpBits; - } -#endif - - void Write(); - -// void SetColorTable( LPBITMAPINFO pBmi ); - void SetColorTable( CGameDIB* pDIB ); - void FillDIB( BYTE color ); // fill the DIB with color - -private: -// TempBackupFile* mpTempBackup; -// HBITMAP mhBitmap; -// LPBITMAPINFO mpInfo; // ptr to our BITMAPINFO -// LPVOID mpBits; // ptr to DIB bits - -// char* mpFileName; -}; - -#endif // DIBFILE_H diff --git a/sdk/samples/iklowns/include/linklist.h b/sdk/samples/iklowns/include/linklist.h deleted file mode 100644 index 4cb84e7..0000000 --- a/sdk/samples/iklowns/include/linklist.h +++ /dev/null @@ -1,53 +0,0 @@ -/*===========================================================================*\ -| -| File: linklist.h -| -| Description: -| link list class include file -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef _LINKLIST_H -#define _LINKLIST_H - -typedef struct _NODE { - struct _NODE *pPrev; - struct _NODE *pNext; - void *pData; -} NODE, *LPNODE; - -class CLinkedList { -private: - LPNODE Find(void *pData); - LPNODE pHead; - LPNODE pTail; - LPNODE pCurPosition; -public: - CLinkedList(); - ~CLinkedList(); - void *GetFirst(); - void *GetLast(); - void *GetNext(); - void *GetNext(void *pData); - void *GetPrev( ); - void *GetPrev(void *pData); - void Add(void *pData); - void Insert(void *pData); - void Insert(void *pData, void *pBefore); - void Append(void *pData); - void Remove( ); - void Remove(void *pData); - void *RemoveFirst(); - void *RemoveLast(); -}; - -#define LinkedList CLinkedList - -#endif - diff --git a/sdk/samples/iklowns/include/strrec.h b/sdk/samples/iklowns/include/strrec.h deleted file mode 100644 index f597cfe..0000000 --- a/sdk/samples/iklowns/include/strrec.h +++ /dev/null @@ -1,40 +0,0 @@ -/*===========================================================================*\ -| -| File: strrec.h -| -| Description: -| SDF string parsing class -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#ifndef STRREC_H -#define STRREC_H - -#define MAX_FIELDS 256 - -class CStringRecord -{ -public: - CStringRecord(char* pString, char* pDelims); - virtual ~CStringRecord(); - - char* operator[](int field); - - int GetNumFields() - { - return mNumFields; - } - -private: - char** mpFields; - int mNumFields; -}; - - -#endif // STRREC_H diff --git a/sdk/samples/iklowns/linklist.cpp b/sdk/samples/iklowns/linklist.cpp deleted file mode 100644 index ea0c577..0000000 --- a/sdk/samples/iklowns/linklist.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/*===========================================================================*\ -| -| File: linklist.cpp -| -| Description: -| Class to maintain a doubly linked list. -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -#include "linklist.h" - -#define NULL 0L - -// ----------------------------------------------------------------- -// CLinkedList constructor - initialize to empty -// ----------------------------------------------------------------- -CLinkedList::CLinkedList() -{ - pHead = pTail = pCurPosition = NULL; -} - -// ----------------------------------------------------------------- -// CLinkedList destructor - free each node -// Note: we do not free the app data pointed to by each node. -// ----------------------------------------------------------------- -CLinkedList::~CLinkedList() -{ - LPNODE pCur, pNext; - - pCur = pHead; - pHead = pTail = pCurPosition = NULL; - - // Go thru list and free each node - while (pCur != NULL) - { - pNext = pCur->pNext; - delete(pCur); - pCur = pNext; - } -} - -// ----------------------------------------------------------------- -// GetFirst - return app data for first entry in list and make it -// the current node. -// ----------------------------------------------------------------- -void * CLinkedList::GetFirst() -{ - pCurPosition = pHead; - if (pCurPosition == NULL) - { - return(NULL); - } - - return(pCurPosition->pData); -} - -// ----------------------------------------------------------------- -// GetLast - return app data to last entry in list and make it -// the current node. -// ----------------------------------------------------------------- -void * CLinkedList::GetLast() -{ - pCurPosition = pTail; - if (pCurPosition == NULL) - { - return(NULL); - } - - return(pCurPosition->pData); -} - -// ----------------------------------------------------------------- -// GetNext - return next app data entry in list and make it -// the current node. -// ----------------------------------------------------------------- -void * CLinkedList::GetNext() -{ - LPNODE pNext; - - // check for empty list or already at end of list. - if ((pCurPosition == NULL) || (pCurPosition->pNext == NULL)) - { - return(NULL); - } - - pNext = pCurPosition->pNext; - pCurPosition = pNext; - return(pNext->pData); -} - -// ----------------------------------------------------------------- -// GetFirst - return app data that follows a given entry and make it -// the current node. -// ----------------------------------------------------------------- -void * CLinkedList::GetNext(void *pData) -{ - pCurPosition = Find(pData); - return(GetNext()); -} - -// ----------------------------------------------------------------- -// GetPrev - return app data for previous entry in list and make it -// the current node. -// ----------------------------------------------------------------- -void * CLinkedList::GetPrev() -{ - LPNODE pPrev; - - // check for empty list or already at start - if ((pCurPosition == NULL) || (pCurPosition->pPrev == NULL)) - { - return(NULL); - } - - pPrev = pCurPosition->pPrev; - pCurPosition = pPrev; - return(pPrev->pData); - -} -// ----------------------------------------------------------------- -// GetFirst - return app data that preceeds a given entry and make it -// the current node. -// ----------------------------------------------------------------- -void * CLinkedList::GetPrev(void *pData) -{ - pCurPosition = Find(pData); - return(GetPrev()); -} - -// ----------------------------------------------------------------- -// Add - create a new node and put it at the start of the list and -// make it the current node. -// ----------------------------------------------------------------- -void CLinkedList::Add(void *pData) -{ - LPNODE pNew = new NODE; - - // setup node and prepare it for its role as the new head of the list - pNew->pData = pData; - pNew->pNext = pHead; - pNew->pPrev = NULL; - - // The old head of list (if any) should point to new node) - if (pHead != NULL) - pHead->pPrev = pNew; - - // Make new node the head and current position - pHead = pNew; - pCurPosition = pNew; - - // Check to see if new node is also the tail (ie. only list entry) - if (pTail == NULL) - pTail = pNew; -} - -// ----------------------------------------------------------------- -// Append - create a new node and put it at the end of the list. -// ----------------------------------------------------------------- -void CLinkedList::Append(void *pData) -{ - LPNODE pNew = new NODE; - - // setup node and prepare it for its role as the new tail of the list - pNew->pData = pData; - pNew->pPrev = pTail; - pNew->pNext = NULL; - - // The old tail of list (if any) should point to new node. - if (pTail != NULL) - pTail->pNext = pNew; - - // Make new node the tail - pTail = pNew; - - // Check to see if new node is also the head (ie. only list entry) - if (pHead == NULL) - { - pHead = pNew; - pCurPosition = pNew; - } -} - -// ----------------------------------------------------------------- -// Find - private method to find the node with the specified app data -// attached to it. -// ----------------------------------------------------------------- -LPNODE CLinkedList::Find(void *pData) -{ - LPNODE pCur; - - // go thru list until we reach end or we find the right node. - for (pCur=pHead; (pCur != NULL) && (pCur->pData != pData); pCur= pCur->pNext); - return(pCur); -} - - -// ----------------------------------------------------------------- -// Insert - create a new node and put it in front of the current -// position node and make it the current position. -// ----------------------------------------------------------------- -void CLinkedList::Insert(void *pData) -{ - LPNODE pNext, pPrev; - LPNODE pNew = new NODE; - - pNew->pData = pData; - - // check to be sure that there is a current node - if (pCurPosition != NULL) - { - - // get pointers of current position - pPrev = pCurPosition->pPrev; - pNext = pCurPosition->pNext; - - // set new nodes pointers for insertion into the list - pNew->pPrev = pPrev; - pNew->pNext = pCurPosition; - - // Set the node in front of new node (if any) to point to it - if (pPrev != NULL) - { - pPrev->pNext = pNew; - - // No node in front -> new node is at head - } else { - pHead = pNew; - } - - // make new node the current node - pCurPosition = pNew; - - // No current node, just Add to front - } else { - Add(pData); - } -} - -// ----------------------------------------------------------------- -// Insert - create a new node and put it in front of the specified -// node and make it the current position. -// ----------------------------------------------------------------- -void CLinkedList::Insert(void *pData, void *pBefore) -{ - // simply make the specified node current and insert the new - // node. - pCurPosition = Find(pBefore); - Insert(pData); -} - -// ----------------------------------------------------------------- -// Remove - remove a specified node from the list. -// Note: we do not delete the app data attached to the node! -// ----------------------------------------------------------------- -void CLinkedList::Remove() -{ - LPNODE pCur, pNext, pPrev; - - pCur = pCurPosition; - - if (pCur != NULL) - { - - // save a copy of the links - pPrev = pCur->pPrev; - pNext = pCur->pNext; - - // Is there a node ahead of us? - if (pPrev != NULL) - { - // yes -> update it to not point to us. - pPrev->pNext = pNext; - } else { - // no -> update head to not point to us. - pHead = pNext; - pCurPosition = pNext; - } - - // Is there a node behind us? - if (pNext != NULL) - { - // yes -> update it to not point to us. - pNext->pPrev = pPrev; - pCurPosition = pNext; - } else { - // no -> update tail to not point to us. - pTail = pPrev; - pCurPosition = pPrev; - } - - delete(pCur); - } - -} - -// ----------------------------------------------------------------- -// Remove - remove a specified node from the list. -// Note: we do not delete the app data attached to the node! -// ----------------------------------------------------------------- -void CLinkedList::Remove(void *pData) -{ - pCurPosition = Find(pData); - Remove(); -} -// ----------------------------------------------------------------- -// RemoveFirst - remove the first node in the list and return the -// app data associated with it. -// ----------------------------------------------------------------- -void * CLinkedList::RemoveFirst() -{ - LPNODE pCur, pNext; - void *pData = NULL; - - pCur = pHead; - - // is there a node at the head? - if (pCur != NULL) - { - - // take first node out of list. - pNext = pCur->pNext; - pHead = pNext; - pCurPosition = pNext; - - // are there any nodes after us? - if (pNext != NULL) - { - // yes -> make it the new head - pNext->pPrev = NULL; - } else { - // no -> the list is now empty - pTail = NULL; - } - - // get app data for node and then delete it - pData = pCur->pData; - delete(pCur); - } - - return(pData); -} - -// ----------------------------------------------------------------- -// RemoveLast - remove the last node in the list and return the -// app data associated with it. -// ----------------------------------------------------------------- -void * CLinkedList::RemoveLast() -{ - LPNODE pCur, pPrev; - void *pData = NULL; - - pCur = pTail; - - // is there a node at the tail? - if (pCur != NULL) - { - // take last node out of list. - pPrev = pCur->pPrev; - pTail = pPrev; - - // are there any nodes ahead of us? - if (pPrev != NULL) - { - // yes -> make it the new tail node - pPrev->pNext = NULL; - } else { - // no -> list is now empty - pHead = NULL; - pCurPosition = NULL; - } - - // get app data for node and then delete it - pData = pCur->pData; - delete(pCur); - } - - return(pData); -} diff --git a/sdk/samples/iklowns/linklist.mak b/sdk/samples/iklowns/linklist.mak deleted file mode 100644 index b828d8b..0000000 --- a/sdk/samples/iklowns/linklist.mak +++ /dev/null @@ -1,158 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "LINKLIST.mak" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -CPP=cl.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "retail" -# PROP BASE Intermediate_Dir "retail" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : $(OUTDIR)/LINKLIST.lib $(OUTDIR)/LINKLIST.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /W3 /GX /YX /O2 /I ".\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /W3 /GX /YX /O2 /I ".\include" /D "WIN32" /D "STRICT" /D "NDEBUG" /D\ - "_WINDOWS" /FR$(INTDIR)/ /Fp$(OUTDIR)/"LINKLIST.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"LINKLIST.bsc" -BSC32_SBRS= \ - $(INTDIR)/LINKLIST.SBR - -$(OUTDIR)/LINKLIST.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LIB32=lib.exe -# ADD BASE LIB32 /NOLOGO -# ADD LIB32 /NOLOGO -LIB32_FLAGS=/NOLOGO /OUT:$(OUTDIR)\"LINKLIST.lib" -DEF_FLAGS= -DEF_FILE= -LIB32_OBJS= \ - $(INTDIR)/LINKLIST.OBJ - -$(OUTDIR)/LINKLIST.lib : $(OUTDIR) $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "debug" -# PROP BASE Intermediate_Dir "debug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)/LINKLIST.lib $(OUTDIR)/LINKLIST.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE CPP /nologo /W3 /GX /Z7 /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /W3 /GX /Z7 /YX /Od /I ".\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /W3 /GX /Z7 /YX /Od /I ".\include" /D "STRICT" /D "WIN32" /D "_DEBUG" /D\ - "_WINDOWS" /FR$(INTDIR)/ /Fp$(OUTDIR)/"LINKLIST.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\debug/ -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"LINKLIST.bsc" -BSC32_SBRS= \ - $(INTDIR)/LINKLIST.SBR - -$(OUTDIR)/LINKLIST.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LIB32=lib.exe -# ADD BASE LIB32 /NOLOGO -# ADD LIB32 /NOLOGO -LIB32_FLAGS=/NOLOGO /OUT:$(OUTDIR)\"LINKLIST.lib" -DEF_FLAGS= -DEF_FILE= -LIB32_OBJS= \ - $(INTDIR)/LINKLIST.OBJ - -$(OUTDIR)/LINKLIST.lib : $(OUTDIR) $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\LINKLIST.CPP - -$(INTDIR)/LINKLIST.OBJ : $(SOURCE) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\INCLUDE\LINKLIST.H -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/iklowns/makefile b/sdk/samples/iklowns/makefile deleted file mode 100644 index 6cdbea4..0000000 --- a/sdk/samples/iklowns/makefile +++ /dev/null @@ -1,37 +0,0 @@ -# Master make file. Creates all necessary sub-components -# of the Immortal Klowns project, while allowing those components -# to be compiled w/VC - -!IF ("$(CFG)" == "") || ("$(CFG)" == "Win32 Debug") -CFG=Win32 Debug -TARGDIR=debug -TARGET=debug -!ELSE -CFG=Win32 Release -TARGDIR=retail -TARGET=retail -!ENDIF - -default: - nmake $(MISC) /nologo /f linklist.mak CFG="$(CFG)" - nmake $(MISC) /nologo /f cgutil.mak CFG="$(CFG)" - - nmake $(MISC) /nologo /f splash.mak CFG="$(CFG)" - - nmake $(MISC) /nologo /f iklowns.mak CFG="$(CFG)" - - nmake $(MISC) /nologo /f cgkrusty.mak CFG="$(CFG)" - - nmake $(MISC) /nologo /f misc.mak CFG="$(CFG)" - -all: debug retail - -retail: - nmake CFG="Win32 Release" - -debug: - nmake CFG="Win32 Debug" - -clean: - @deltree /y retail - @deltree /y debug diff --git a/sdk/samples/iklowns/mdsplay.h b/sdk/samples/iklowns/mdsplay.h deleted file mode 100644 index 33b7547..0000000 --- a/sdk/samples/iklowns/mdsplay.h +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -// -// Public include file for MDSPlay.DLL -// - -// Returned errors -// -#define MDS_SUCCESS (0) -#define MDS_ERR_NOMEM (1) -#define MDS_ERR_NOFILE (2) -#define MDS_ERR_BADFILE (3) -#define MDS_ERR_BADFLAGS (4) -#define MDS_ERR_MIDIERROR (5) -#define MDS_ERR_INVALHANDLE (6) -#define MDS_ERR_BADSTATE (7) - - -// -// LoadMDSImage -// -// Allocate space for and read the given image in preparation for playback. -// -// lpbImage may be freed after this call -// - -// One of these flags MUST be set -// -// lpbImage -> string containing filename -// -#define MDS_F_FILENAME 0x00000001L - -// lpbImage -> memory image of file -// -#define MDS_F_MEMORY 0x00000002L - -// NOTE: cbImage only used if MDS_F_MEMORY is set. -// -DWORD LoadMDSImage(HANDLE *hImage, PBYTE pbImage, DWORD cbImage, DWORD fdw); - -// -// FreeMDSImage -// -// Release all memory associated with the given MDS image. -// -// If the given MDS is still playing, it will be stopped and the device -// closed. -// -DWORD FreeMDSImage(HANDLE hImage); -// -// Basic operations on the MDS image -// - -// Loop until told to stop -// -#define MDS_F_LOOP 0x00000001L - -// Play from beginning or last pause state. -// -DWORD PlayMDS(HANDLE hImage, DWORD fdw); - -// Pause until next play -// -DWORD PauseMDS(HANDLE hImage); - -// Stop. Next play will start at beginning of file again -// -DWORD StopMDS(HANDLE hImage); diff --git a/sdk/samples/iklowns/misc.def b/sdk/samples/iklowns/misc.def deleted file mode 100644 index a8ca9b5..0000000 --- a/sdk/samples/iklowns/misc.def +++ /dev/null @@ -1,8 +0,0 @@ -LIBRARY MISC - -DESCRIPTION 'CGameCharacter Implementation DLL: Krusty' - -EXPORTS - Ident @1 - Info @2 - diff --git a/sdk/samples/iklowns/misc.mak b/sdk/samples/iklowns/misc.mak deleted file mode 100644 index 338f8e3..0000000 --- a/sdk/samples/iklowns/misc.mak +++ /dev/null @@ -1,204 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "MISC.MAK" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -MTL=MkTypLib.exe -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "retail" -# PROP BASE Intermediate_Dir "retail" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : .\$(OUTDIR)\misc.dll $(OUTDIR)/MISC.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE CPP /nologo /MT /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /MT /W3 /GX /YX /O2 /I "..\..\inc" /I ".\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /c -# SUBTRACT CPP /Fr -CPP_PROJ=/nologo /MT /W3 /GX /YX /O2 /I "..\..\inc" /I ".\include" \ - /D "WIN32" /D "STRICT" /D "NDEBUG"\ - /D "_WINDOWS" /Fp$(OUTDIR)/"MISC.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -# ADD BASE RSC /d "NDEBUG" -# ADD RSC /d "NDEBUG" -BSC32=bscmake.exe -BSC32_SBRS= \ - -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"MISC.bsc" - -$(OUTDIR)/MISC.bsc : $(OUTDIR) $(BSC32_SBRS) -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /MACHINE:I386 /OUT:"$(OUTDIR)\"misc.dll"" -# SUBTRACT LINK32 /INCREMENTAL:yes -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO\ - /SUBSYSTEM:windows,4.0 /DLL /INCREMENTAL:no /PDB:$(OUTDIR)/"MISC.pdb" /MACHINE:I386\ - /DEF:".\MISC.DEF" /OUT:$(OUTDIR)\""misc.dll"" /IMPLIB:$(OUTDIR)/"MISC.lib" -DEF_FILE=.\MISC.DEF -LINK32_OBJS= \ - $(INTDIR)/CGINPUT.OBJ \ - $(INTDIR)/CGMISC.OBJ - -.\$(OUTDIR)\misc.dll : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\misc.dll misc.dll - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "debug" -# PROP BASE Intermediate_Dir "debug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)\misc.dll $(OUTDIR)/MISC.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -# ADD BASE CPP /nologo /MT /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /MT /W3 /GX /Zi /YX /Od /I "..\..\inc" /I ".\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /c -# SUBTRACT CPP /Fr -CPP_PROJ=/nologo /MT /W3 /GX /Zi /YX /Od /I "..\..\inc" /I ".\include" \ - /D "WIN32" /D "STRICT" /D "_DEBUG"\ - /D "_WINDOWS" /Fp$(OUTDIR)/"MISC.pch" /Fo$(INTDIR)/ /Fd$(OUTDIR)/"MISC.pdb" /c -CPP_OBJS=.\debug/ -# ADD BASE RSC /d "_DEBUG" -# ADD RSC /d "_DEBUG" -BSC32=bscmake.exe -BSC32_SBRS= \ - -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"MISC.bsc" - -$(OUTDIR)/MISC.bsc : $(OUTDIR) $(BSC32_SBRS) -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /DEBUG /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DLL /INCREMENTAL:no /DEBUG /MACHINE:I386 /OUT:"$(OUTDIR)\"misc.dll"" -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib winmm.lib /NOLOGO\ - /SUBSYSTEM:windows,4.0 /DLL /INCREMENTAL:no /PDB:$(OUTDIR)/"MISC.pdb" /DEBUG\ - /MACHINE:I386 /DEF:".\MISC.DEF" /OUT:$(OUTDIR)\""misc.dll""\ - /IMPLIB:$(OUTDIR)/"MISC.lib" -DEF_FILE=.\MISC.DEF -LINK32_OBJS= \ - $(INTDIR)/CGINPUT.OBJ \ - $(INTDIR)/CGMISC.OBJ - -$(OUTDIR)\misc.dll : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\misc.dll misc.dll - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\MISC.DEF -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGINPUT.CPP -DEP_CGINP=\ - .\CGINPUT.H - -$(INTDIR)/CGINPUT.OBJ : $(SOURCE) $(DEP_CGINP) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\CGMISC.CPP -DEP_CGMIS=\ - .\CGCHDLL.H\ - .\CGCHAR.H\ - .\CGTIMER.H\ - .\CGINPUT.H\ - .\CGUPDATE.H\ - .\CGACTION.H\ - .\CGGRAPH.H\ - .\cgremote.h\ - .\INCLUDE\LINKLIST.H\ - .\CGSPRITE.H\ - .\cgsound.h\ - .\CGLEVEL.H\ - .\CGSCREEN.H\ - .\cgremque.h\ - .\CGBITBUF.H\ - .\CGDLIST.H\ - .\INCLUDE\CGDIB.H - -$(INTDIR)/CGMISC.OBJ : $(SOURCE) $(DEP_CGMIS) $(INTDIR) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/iklowns/readme.txt b/sdk/samples/iklowns/readme.txt deleted file mode 100644 index 69d1bd0..0000000 --- a/sdk/samples/iklowns/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ -Immortal Klowns Sample Game ---------------------------- - -To build Immortal Klowns, do an NMAKE in this directory. - -Be sure that the proper environment variables have been set up for the -windows include files and lib files. - -When the make is done, just type IKLOWNS in the current directory. Make sure -that you DO NOT run it from the debug or retail subdirectories - if you do, -you will get an error because IKLOWNS can't find all the resources it needs -to run. - -To play using TCP/IP over the Internet, the people who are joining the -game must enter the IP address of the machine that hosted the game. -You can find out the IP address of your machine by running "winipcfg". -If you have a net card and a modem installed, you will need to make sure -you read the IP address for the modem connected to the Internet. The -modem will be listed as "PPP Adapter". DirectPlay will not work through -proxies and firewalls. - -Also see the DPLAUNCH sample. - - diff --git a/sdk/samples/iklowns/splash.cpp b/sdk/samples/iklowns/splash.cpp deleted file mode 100644 index a51d7bf..0000000 --- a/sdk/samples/iklowns/splash.cpp +++ /dev/null @@ -1,559 +0,0 @@ -/*===========================================================================*\ -| -| File: splash.cpp -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -#include -#include -#include "splashrc.h" - -char szAppName[] = "ISplash"; // The name of this application -char acModuleName[256]; - -HINSTANCE ghInst; -HWND ghMainWnd; -LPBITMAPINFOHEADER lpBitmap; -LPBYTE mpBits; -HPALETTE hPal; -HPALETTE hPalOld; -LOGPALETTE *pPal; -int nPasses = 0; -int fadeDirection = 1; -LPSTR pSoundBuffer = NULL; - -/* Macro to determine to round off the given value to the closest byte */ -#define WIDTHBYTES(i) ((i+31)/32*4) - -#define PALVERSION 0x300 -#define MAXPALETTE 256 /* max. # supported palette entries */ - -#define NUMFADESTEPS 64 -#define HOLD_TIME 500 -#define INTERVAL_TIME 30 - -/**************************************************************************** - * * - * FUNCTION : DibNumColors(VOID FAR * pv) * - * * - * PURPOSE : Determines the number of colors in the DIB by looking at * - * the BitCount filed in the info block. * - * * - * RETURNS : The number of colors in the DIB. * - * * - ****************************************************************************/ -WORD DibNumColors (VOID FAR * pv) -{ - INT bits; - LPBITMAPINFOHEADER lpbi; - LPBITMAPCOREHEADER lpbc; - - lpbi = ((LPBITMAPINFOHEADER)pv); - lpbc = ((LPBITMAPCOREHEADER)pv); - - /* With the BITMAPINFO format headers, the size of the palette - * is in biClrUsed, whereas in the BITMAPCORE - style headers, it - * is dependent on the bits per pixel ( = 2 raised to the power of - * bits/pixel). - */ - if (lpbi->biSize != sizeof(BITMAPCOREHEADER)) - { - if (lpbi->biClrUsed != 0) - return (WORD)lpbi->biClrUsed; - bits = lpbi->biBitCount; - } - else - bits = lpbc->bcBitCount; - - switch (bits) - { - case 1: - return 2; - case 4: - return 16; - case 8: - return 256; - default: - /* A 24 bitcount DIB has no color table */ - return 0; - } -} - -/**************************************************************************** - * * - * FUNCTION : PaletteSize(VOID FAR * pv) * - * * - * PURPOSE : Calculates the palette size in bytes. If the info. block * - * is of the BITMAPCOREHEADER type, the number of colors is * - * multiplied by 3 to give the palette size, otherwise the * - * number of colors is multiplied by 4. * - * * - * RETURNS : Palette size in number of bytes. * - * * - ****************************************************************************/ -WORD PaletteSize (VOID FAR * pv) -{ - LPBITMAPINFOHEADER lpbi; - WORD NumColors; - - lpbi = (LPBITMAPINFOHEADER)pv; - NumColors = DibNumColors(lpbi); - - if (lpbi->biSize == sizeof(BITMAPCOREHEADER)) - return (WORD)(NumColors * sizeof(RGBTRIPLE)); - else - return (WORD)(NumColors * sizeof(RGBQUAD)); -} - -void FadePalette( - LOGPALETTE *pPal, - LPBITMAPINFOHEADER lpbi, - int fadestep -) -{ - RGBQUAD FAR *pRgb; - - if (lpbi == NULL) - return; - - if (lpbi->biSize != sizeof(BITMAPINFOHEADER)) - return; - - pRgb = (RGBQUAD FAR *)((LPSTR)lpbi + (WORD)lpbi->biSize); - for (int i = 1; i <= pPal->palNumEntries; i++) - { - pPal->palPalEntry[i-1].peRed = (pRgb[i].rgbRed * fadestep) / NUMFADESTEPS; - pPal->palPalEntry[i-1].peGreen = (pRgb[i].rgbGreen * fadestep) / NUMFADESTEPS; - pPal->palPalEntry[i-1].peBlue = (pRgb[i].rgbBlue * fadestep) / NUMFADESTEPS; - pPal->palPalEntry[i-1].peFlags = PC_NOCOLLAPSE; - } -} - -/**************************************************************************** - * * - * FUNCTION : CreateBIPalette(LPBITMAPINFOHEADER lpbi) * - * * - * PURPOSE : Given a Pointer to a BITMAPINFO struct will create a * - * a GDI palette object from the color table. * - * * - * RETURNS : * - * * - ****************************************************************************/ -LOGPALETTE *CreateBIPalette ( - LPBITMAPINFOHEADER lpbi, - int fadestep -) -{ - - LOGPALETTE *pPal; - HPALETTE hpal = NULL; - WORD nNumColors; - BYTE red; - BYTE green; - BYTE blue; - WORD i; - RGBQUAD FAR *pRgb; - - if (lpbi == NULL) - return NULL; - - if (lpbi->biSize != sizeof(BITMAPINFOHEADER)) - return NULL; - - /* Get a pointer to the color table and the number of colors in it */ - pRgb = (RGBQUAD FAR *)((LPSTR)lpbi + (WORD)lpbi->biSize); - nNumColors = DibNumColors(lpbi); - - if (nNumColors) - { - /* Allocate for the logical palette structure */ - pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + nNumColors * sizeof(PALETTEENTRY)); - if (!pPal) - return NULL; - - pPal->palNumEntries = nNumColors - 2; - pPal->palVersion = PALVERSION; - - /* Fill in the palette entries from the DIB color table and - * create a logical color palette. - */ - - for (i = 1; i < (nNumColors-1); i++) - { - pPal->palPalEntry[i-1].peRed = (pRgb[i].rgbRed * fadestep) / NUMFADESTEPS; - pPal->palPalEntry[i-1].peGreen = (pRgb[i].rgbGreen * fadestep) / NUMFADESTEPS; - pPal->palPalEntry[i-1].peBlue = (pRgb[i].rgbBlue * fadestep) / NUMFADESTEPS; - pPal->palPalEntry[i-1].peFlags = PC_NOCOLLAPSE; - } - } - else if (lpbi->biBitCount == 24) - { - /* A 24 bitcount DIB has no color table entries so, set the number of - * to the maximum value (256). - */ - nNumColors = MAXPALETTE; - pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + nNumColors * sizeof(PALETTEENTRY)); - if (!pPal) - return NULL; - - pPal->palNumEntries = nNumColors; - pPal->palVersion = PALVERSION; - - red = green = blue = 0; - - /* Generate 256 (= 8*8*4) RGB combinations to fill the palette - * entries. - */ - for (i = 0; i < pPal->palNumEntries; i++) - { - pPal->palPalEntry[i].peRed = red; - pPal->palPalEntry[i].peGreen = green; - pPal->palPalEntry[i].peBlue = blue; - pPal->palPalEntry[i].peFlags = (BYTE)0; - - if (!(red += 32)) - if (!(green += 32)) - blue += 64; - } - } - return pPal; -} - -/**************************************************************************** - - FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) - - PURPOSE: Processes messages - - MESSAGES: - - WM_COMMAND - application menu (About dialog box) - WM_DESTROY - destroy window - - COMMENTS: - - To process the IDM_ABOUT message, call MakeProcInstance() to get the - current instance address of the About() function. Then call Dialog - box which will create the box according to the information in your - generic.rc file and turn control over to the About() function. When - it returns, free the intance address. - -****************************************************************************/ - -LRESULT CALLBACK WndProc( - HWND hWnd, // window handle - UINT message, // type of message - WPARAM uParam, // additional information - LPARAM lParam) // additional information -{ - switch (message) { - - case WM_CREATE: - { - ShowCursor(FALSE); - SetTimer(hWnd, 1, HOLD_TIME, NULL); - break; - } - - case WM_PAINT: - { - PAINTSTRUCT PS; - HDC hDC; - HPALETTE hPalTmp; - - hDC = BeginPaint( hWnd, &PS ); - - hPalTmp = SelectPalette(hDC, hPal, FALSE); - if (hPalOld == NULL) - hPalOld = hPalTmp; - RealizePalette(hDC); - - StretchDIBits( - hDC, - 0, - 0, -#if 0 - lpBitmap->biWidth, // stretch to fit - lpBitmap->biHeight, // stretch to fit -#endif - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - 0, - 0, - lpBitmap->biWidth, // stretch to fit - lpBitmap->biHeight, // stretch to fit - mpBits, - (CONST BITMAPINFO *)lpBitmap, - DIB_RGB_COLORS, - SRCCOPY - ); - - EndPaint( hWnd, &PS ); - } - break; - - case WM_TIMER: - { - KillTimer(hWnd, 1); - HDC hDC = GetDC(hWnd); - - DWORD lastTime = timeGetTime(); - - if (pSoundBuffer != NULL) - sndPlaySound(pSoundBuffer, SND_MEMORY | SND_ASYNC); - - do { -#if 1 - pPal = CreateBIPalette(lpBitmap, nPasses); - hPal = CreatePalette(pPal); -#else - FadePalette(pPal, lpBitmap, nPasses); - AnimatePalette(hPal, 1, pPal->palNumEntries, pPal->palPalEntry); -#endif - DeleteObject(SelectPalette(hDC, hPal, FALSE)); - RealizePalette(hDC); - - nPasses += fadeDirection; - if (nPasses == NUMFADESTEPS) - { - fadeDirection = -1; - } - - while (timeGetTime() - lastTime < INTERVAL_TIME) - { - //Sleep(0); - } - lastTime = timeGetTime(); - - } while(nPasses > 0); - - ReleaseDC(hWnd, hDC); - WinExec(acModuleName, SW_SHOW); - } - - case WM_DESTROY: // message: window being destroyed - { -#if 1 - HDC hDC = GetDC(hWnd); - PatBlt(hDC, 0,0, 640, 480,BLACKNESS); - SelectPalette(hDC, hPalOld, FALSE); - RealizePalette(hDC); - ReleaseDC(hWnd, hDC); -#endif - - sndPlaySound(NULL, SND_SYNC); - ShowCursor(TRUE); - KillTimer(hWnd, 1); - PostQuitMessage(0); - break; - } - - default: // Passes it on if unproccessed - return (DefWindowProc(hWnd, message, uParam, lParam)); - } - return (0); -} - -#if 0 -void dbgprintf(char *fmt,...) -{ - static HANDLE dbg = NULL; - char out [ 256 ]; - DWORD len; - va_list vlist; - - if (dbg == NULL) - { - AllocConsole(); - dbg = GetStdHandle(STD_OUTPUT_HANDLE); - if (dbg == NULL) - return; - } - - va_start(vlist, fmt); - wvsprintf(out, fmt, vlist); - WriteConsole(dbg, out, strlen(out), &len, NULL); -} -#endif -/**************************************************************************** - - FUNCTION: InitInstance(HINSTANCE, int) - - PURPOSE: Saves instance handle and creates main window - - COMMENTS: - - This function is called at initialization time for every instance of - this application. This function performs initialization tasks that - cannot be shared by multiple instances. - - In this case, we save the instance handle in a static variable and - create and display the main program window. - -****************************************************************************/ - -BOOL InitInstance( - HINSTANCE hInstance, - int nCmdShow) -{ - WNDCLASS wc; - - - // Fill in window class structure with parameters that describe the - // main window. - - wc.style = CS_OWNDC; // Class style(s). - wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure - wc.cbClsExtra = 0; // No per-class extra data. - wc.cbWndExtra = 0; // No per-window extra data. - wc.hInstance = hInstance; // Owner of this class - wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APP)); // Icon name from .RC - wc.hCursor = LoadCursor(NULL, IDC_ARROW);// Cursor - wc.hbrBackground = NULL; // Default color - wc.lpszMenuName = NULL; - wc.lpszClassName = szAppName; // Name to register as - - // Register the window class - if (!RegisterClass(&wc)) - return(FALSE); - - // Create a main window for this application instance. - - ghMainWnd = CreateWindow( - szAppName, // See RegisterClass() call. - NULL, // Text for window title bar. - WS_POPUP, // Window style. - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, // Overlapped windows have no parent. - NULL, // Use the window class menu. - hInstance, // This instance owns this window. - NULL // We don't use any data in our WM_CREATE - ); - - // If window could not be created, return "failure" - if (!ghMainWnd) - return(FALSE); - - // Make the window visible; update its client area; and return "success" - ShowWindow(ghMainWnd, nCmdShow); // Show the window - UpdateWindow(ghMainWnd); // Sends WM_PAINT message - - return (TRUE); // We succeeded... -} - -/**************************************************************************** - - FUNCTION: ShutDownApp() - - PURPOSE: un-initialize the app as needed - - COMMENTS: - -****************************************************************************/ -void ShutDownApp() -{ -} - -/**************************************************************************** - - FUNCTION: WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - - PURPOSE: calls initialization function, processes message loop - - COMMENTS: - - Windows recognizes this function by name as the initial entry point - for the program. This function calls the application initialization - routine, if no other instance of the program is running, and always - calls the instance initialization routine. It then executes a message - retrieval and dispatch loop that is the top-level control structure - for the remainder of execution. The loop is terminated when a WM_QUIT - message is received, at which time this function exits the application - instance by returning the value passed by PostQuitMessage(). - - If this function must abort before entering the message loop, it - returns the conventional value NULL. - -****************************************************************************/ - -int CALLBACK WinMain( - HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - MSG msg; - int result = NULL; - int nNameLength; - - // only allow 1 instance - if (hPrevInstance) - return NULL; - - ghInst = hInstance; - - nNameLength = GetModuleFileName(ghInst, acModuleName, sizeof(acModuleName)); - lstrcpy(&acModuleName[nNameLength-3], "OVL"); - - - HGLOBAL hgrBitmap = LoadResource( ghInst, FindResource(ghInst, MAKEINTRESOURCE(IDB_SPLASH), RT_BITMAP)); - - lpBitmap = (LPBITMAPINFOHEADER)LockResource( hgrBitmap ); - - mpBits = (LPBYTE)lpBitmap + (WORD)lpBitmap->biSize + PaletteSize(lpBitmap); - pPal = CreateBIPalette(lpBitmap, NUMFADESTEPS); - hPal = CreatePalette(pPal); - fadeDirection = -1; - nPasses = NUMFADESTEPS; - - - HGLOBAL hgrSound = LoadResource( ghInst, FindResource(ghInst, MAKEINTRESOURCE(IDS_SPLASH), "WAVE")); - pSoundBuffer = (LPSTR)LockResource( hgrSound ); - - - if (InitInstance(hInstance, nCmdShow)) - { - /* Acquire and dispatch messages until a WM_QUIT message is - received. - */ - while (GetMessage(&msg, // message structure - NULL, // handle of window receiving the message - 0, // lowest message to examine - 0)) // highest message to examine - { - TranslateMessage(&msg);// Translates virtual key codes - DispatchMessage(&msg); // Dispatches message to window - } - - ShutDownApp(); // call de-init code - result = msg.wParam; - } - - return (result); -} diff --git a/sdk/samples/iklowns/splash.ico b/sdk/samples/iklowns/splash.ico deleted file mode 100644 index 76f7b5d..0000000 Binary files a/sdk/samples/iklowns/splash.ico and /dev/null differ diff --git a/sdk/samples/iklowns/splash.mak b/sdk/samples/iklowns/splash.mak deleted file mode 100644 index 3fd69e5..0000000 --- a/sdk/samples/iklowns/splash.mak +++ /dev/null @@ -1,189 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "SPLASH.MAK" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -MTL=MkTypLib.exe -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "retail" -# PROP BASE Intermediate_Dir "retail" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : $(OUTDIR)/iklowns.exe $(OUTDIR)/iklowns.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /W3 /GX /YX /O2 /D "WIN32" /D "STRICT" /D "NDEBUG" /D "_WINDOWS"\ - /FR$(INTDIR)/ /Fp$(OUTDIR)/"SPLASH.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -# ADD BASE RSC /d "NDEBUG" -# ADD RSC /d "NDEBUG" -RSC_PROJ= /l 0x409 /fo$(INTDIR)/"SPLASH.res" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"iklowns.bsc" -BSC32_SBRS= \ - $(INTDIR)/SPLASH.SBR - -$(OUTDIR)/iklowns.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:windows,4.0 /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0 /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0\ - /INCREMENTAL:no /PDB:$(OUTDIR)/"SPLASH.pdb" /MACHINE:I386\ - /OUT:$(OUTDIR)/"iklowns.exe" -DEF_FILE= -LINK32_OBJS= \ - $(INTDIR)/SPLASH.OBJ \ - $(INTDIR)/SPLASH.res - -$(OUTDIR)/iklowns.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\iklowns.exe iklowns.exe - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "debug" -# PROP BASE Intermediate_Dir "debug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)/iklowns.exe $(OUTDIR)/iklowns.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -# ADD BASE CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "STRICT" /D "_DEBUG" /D "_WINDOWS"\ - /FR$(INTDIR)/ /Fp$(OUTDIR)/"SPLASH.pch" /Fo$(INTDIR)/ /Fd$(OUTDIR)/"SPLASH.pdb"\ - /c -CPP_OBJS=.\debug/ -# ADD BASE RSC /d "_DEBUG" -# ADD RSC /d "_DEBUG" -RSC_PROJ=/l 0x409 /fo$(INTDIR)/"SPLASH.res" /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"iklowns.bsc" -BSC32_SBRS= \ - $(INTDIR)/SPLASH.SBR - -$(OUTDIR)/iklowns.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DEBUG /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0 /DEBUG /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib uuid.lib winmm.lib /NOLOGO /SUBSYSTEM:windows,4.0\ - /INCREMENTAL:yes /PDB:$(OUTDIR)/"SPLASH.pdb" /DEBUG /MACHINE:I386\ - /OUT:$(OUTDIR)/"iklowns.exe" -DEF_FILE= -LINK32_OBJS= \ - $(INTDIR)/SPLASH.OBJ \ - $(INTDIR)/SPLASH.res - -$(OUTDIR)/iklowns.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - copy $(OUTDIR)\iklowns.exe iklowns.exe - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\SPLASH.CPP - -$(INTDIR)/SPLASH.OBJ : $(SOURCE) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\SPLASH.RC -DEP_SPLAS=\ - .\data\SPLASH.BMP \ - .\SPLASH.WAV - -$(INTDIR)/SPLASH.res : $(SOURCE) $(DEP_SPLAS) $(INTDIR) -# which $(RSC) - $(RSC) $(RSC_PROJ) $(SOURCE) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/iklowns/splash.rc b/sdk/samples/iklowns/splash.rc deleted file mode 100644 index 362b2b2..0000000 --- a/sdk/samples/iklowns/splash.rc +++ /dev/null @@ -1,68 +0,0 @@ -//Microsoft Visual C++ generated resource script. -// -#include "splashrc.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -//#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_SPLASH BITMAP DISCARDABLE "DATA\\SPLASH.BMP" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "splashrc.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -IDI_APP ICON DISCARDABLE "splash.ico" - -IDS_SPLASH WAVE DISCARDABLE "splash.wav" - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/iklowns/splash.wav b/sdk/samples/iklowns/splash.wav deleted file mode 100644 index 541e43a..0000000 Binary files a/sdk/samples/iklowns/splash.wav and /dev/null differ diff --git a/sdk/samples/iklowns/splashrc.h b/sdk/samples/iklowns/splashrc.h deleted file mode 100644 index a95c7a4..0000000 --- a/sdk/samples/iklowns/splashrc.h +++ /dev/null @@ -1,46 +0,0 @@ -/*===========================================================================*\ -| -| File: splashrc.h -| -| Description: -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - we do not recomend you base your game on IKlowns, start with one of - the other simpler sample apps in the GDK - - **************************************************************************/ - -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by splash.rc -// -#define IDB_SPLASH 101 -#define IDI_APP 102 -#define IDS_SPLASH 103 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 104 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/iklowns/strrec.cpp b/sdk/samples/iklowns/strrec.cpp deleted file mode 100644 index 32e1775..0000000 --- a/sdk/samples/iklowns/strrec.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/*===========================================================================*\ -| -| File: strrec.cpp -| -| Description: -| string record parser class implementation -| -|----------------------------------------------------------------------------- -| -| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. -| -| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation -| -\*===========================================================================*/ - -#include -#include -#include "strrec.h" - -/*---------------------------------------------------------------------------*\ -| -| Class CStringRecord -| -| DESCRIPTION: -| parses a delimited string into fields -| -| -\*---------------------------------------------------------------------------*/ -CStringRecord::CStringRecord( - char* pString, - char* pDelims - ) : mpFields( NULL ), - mNumFields( 0 ) -{ - char* tempFields[MAX_FIELDS]; - - char* pWork = new char[lstrlen(pString)+1]; - lstrcpy(pWork, pString); - - char* pLook = strtok( pWork, pDelims ); - - while (pLook && mNumFields < MAX_FIELDS) - { - tempFields[mNumFields] = new char[lstrlen(pLook)+1]; - lstrcpy(tempFields[mNumFields], pLook); - - pLook = strtok( NULL, pDelims); - ++mNumFields; - } - - // now save the fields array - mpFields = new char*[mNumFields]; - - for (int i=0; i 0; mNumFields--) - { - delete[] mpFields[mNumFields-1]; - } - - delete[] mpFields; - } -} - -char* -CStringRecord::operator[](int field) -{ - char* pResult = NULL; - - if (field < mNumFields) - { - pResult = mpFields[field]; - } - - return pResult; -} - diff --git a/sdk/samples/makeall.bat b/sdk/samples/makeall.bat deleted file mode 100755 index 35cd30a..0000000 --- a/sdk/samples/makeall.bat +++ /dev/null @@ -1,155 +0,0 @@ -@echo * -@echo *** Batch File to build examples with Visual C++ -@echo * - -cd fdfilter -nmake %1 retail - -cd ..\scrawl -nmake %1 retail - -cd ..\rockem -nmake %1 retail - -cd ..\donuts -nmake %1 retail - -cd ..\shadow -nmake %1 retail - -cd ..\ddex1 -nmake %1 retail - -cd ..\ddex2 -nmake %1 retail - -cd ..\ddex3 -nmake %1 retail - -cd ..\ddex4 -nmake %1 retail - -cd ..\ddex5 -nmake %1 retail - -cd ..\donut -nmake %1 retail - -cd ..\fastfile -nmake %1 retail - -cd ..\palette -nmake %1 retail - -cd ..\dsshow -nmake %1 retail - -cd ..\dsshow3d -nmake %1 retail - -cd ..\dsstream -nmake %1 retail - -cd ..\mid2strm -nmake %1 retail - -cd ..\mstream -nmake %1 retail - -cd ..\dplaunch -nmake %1 retail - -cd ..\duel -nmake %1 retail - -cd ..\wormhole -nmake %1 retail - -cd ..\stretch -nmake %1 retail - -cd ..\memtime -nmake %1 retail - -cd ..\dxview -nmake %1 retail - -cd ..\ds3dview -nmake %1 retail - -cd ..\flipcube -nmake %1 retail - -cd ..\foxbear -nmake %1 retail - -cd ..\flip2d -nmake %1 retail - -cd ..\iklowns -nmake %1 retail - -cd ..\setup -nmake %1 retail - -cd ..\egg -nmake %1 retail - -cd ..\faces -nmake %1 retail - -cd ..\fly -nmake %1 retail - -cd ..\globe -nmake %1 retail - -cd ..\hier1 -nmake %1 retail - -cd ..\hier2 -nmake %1 retail - -cd ..\oct1 -nmake %1 retail - -cd ..\oct2 -nmake %1 retail - -cd ..\quat -nmake %1 retail - -cd ..\sphere -nmake %1 retail - -cd ..\tex1 -nmake %1 retail - -cd ..\tex3 -nmake %1 retail - -cd ..\tex4 -nmake %1 retail - -cd ..\tex5 -nmake %1 retail - -cd ..\trans -nmake %1 retail - -cd ..\triangle -nmake %1 retail - -cd ..\tunnel -nmake %1 retail - -cd ..\twist -nmake %1 retail - -cd ..\viewer -nmake %1 retail - -cd ..\uvis -nmake %1 retail - -cd .. diff --git a/sdk/samples/makeallw.bat b/sdk/samples/makeallw.bat deleted file mode 100755 index 09fa3e7..0000000 --- a/sdk/samples/makeallw.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo * -@echo ***Batch File to build examples with WATCOM C/C++ -@echo * -cd ddex1 -wmake /f makefile.wat debug retail -cd ..\ddex2 -wmake /f makefile.wat debug retail -cd ..\ddex3 -wmake /f makefile.wat debug retail -cd ..\ddex4 -wmake /f makefile.wat debug retail -cd ..\ddex5 -wmake /f makefile.wat debug retail -cd ..\donut -wmake /f makefile.wat debug retail -cd ..\stretch -wmake /f makefile.wat debug retail -cd .. diff --git a/sdk/samples/memtime/makefile b/sdk/samples/memtime/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/memtime/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/memtime/memtime.cpp b/sdk/samples/memtime/memtime.cpp deleted file mode 100644 index ade6a47..0000000 --- a/sdk/samples/memtime/memtime.cpp +++ /dev/null @@ -1,955 +0,0 @@ -//--------------------------------------------------------------------------; -// -// File: memtime.cpp -// -// Description: -// This code times various things about system memory and video -// memory. It is intended to show the advantages and disadvantages -// of different drawing methoids. -// Please refer to the documented for a more detailed discriptions of -// what is going on. -// -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. -// -//--------------------------------------------------------------------------- -// -// Copyright (c) 1994 - 1996 Microsoft Corporation. All Rights Reserved. -// -//--------------------------------------------------------------------------- - -#include -#include -#include -#include - -#include"memtime.h" - -/*----------------------------------------------------------------------------*\ -| | -| g l o b a l v a r i a b l e s | -| | -\*----------------------------------------------------------------------------*/ -static char szAppName[]="Direct Draw video/system memory timing tests"; - -static HINSTANCE hInstApp; -static HWND hwndApp; -static HACCEL hAccelApp; -static HPALETTE hpalApp; - -static DWORD ScreenHeight, ScreenWidth; -static PCHAR pSource, pDest; - -static LPDIRECTDRAW pDirectDrawObj; -static LPDIRECTDRAWSURFACE pOnScreenBuf; -static LPDIRECTDRAWSURFACE pOffScreenBuf; -static LPDIRECTDRAWSURFACE pSysMemBuf; - -static ULONG ModeXFrameCount; -static ULONG ModeYFrameCount; -static ULONG StretchFrameCount; - -/*---------------------------------------------------------------------------- - -Timers - -*/ - -extern "C" MemFunc DwordMemCopy_Pitch; -extern "C" MemFunc ByteMemCopy_Pitch; - -extern "C" MemFunc DwordMemFill_Pitch; -extern "C" MemFunc ByteMemFill_Pitch; - -extern "C" MemFunc VertMemSto_Pitch; - - -TIMING_RESULT SystemTests[]= -{ - {0, DwordMemCopy_Pitch, "System to System dword copy"}, - {0, ByteMemCopy_Pitch, "System to System byte copy"}, - - {0, DwordMemFill_Pitch, "System dword Fill"}, - {0, ByteMemFill_Pitch, "System byte Fill"}, - - {0, VertMemSto_Pitch, "System vertical byte fill"} -}; - - -TIMING_RESULT VideoTests[]= -{ - {0, DwordMemCopy_Pitch, "System to Video dword Copy"}, - {0, ByteMemCopy_Pitch, "System to Video byte Copy"}, - - {0, DwordMemFill_Pitch, "Video dword Fill"}, - {0, ByteMemFill_Pitch, "Video byte Fill"}, - - {0, VertMemSto_Pitch, "Video vertical byte fill"} -}; - - - - -/*---------------------------------------------------------------------------- - -defines - -*/ - -#define NUMBER_OF(aa) (sizeof(aa)/sizeof((aa)[0])) - - -/*----------------------------------------------------------------------------*\ -| -| f u n c t i o n d e f i n i t i o n s -| -\*----------------------------------------------------------------------------*/ - -LRESULT CALLBACK AppWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); -int ErrMsg (LPSTR sz,...); -LONG AppCommand (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); -void PrintTimingResults( void ); - -void AppExit(void); -BOOL AppIdle(void); -BOOL DirectDrawInit(); -VOID DoSystemTest( PTIMING_RESULT pTimeObject ); -VOID DoVideoTests( PTIMING_RESULT pTimeObject ); -ULONG GetFPS( int width, int height ); -ULONG GetStretchFPS( int width, int height ); - -/*----------------------------------------------------------------------------*\ -| AppAbout( hDlg, uiMessage, wParam, lParam ) -| -| Description: -| This function handles messages belonging to the "About" dialog box. -| The only message that it looks for is WM_COMMAND, indicating the use -| has pressed the "OK" button. When this happens, it takes down -| the dialog box. -| -| Arguments: -| hDlg window handle of about dialog window -| uiMessage message number -| wParam message-dependent -| lParam message-dependent -| -| Returns: -| TRUE if message has been processed, else FALSE -| -\*----------------------------------------------------------------------------*/ -BOOL CALLBACK -AppAbout( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) -{ - switch (msg) { - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) { - EndDialog(hwnd,TRUE); - } - break; - case WM_INITDIALOG: - return TRUE; - } - return FALSE; -} - -/*----------------------------------------------------------------------------*\ -| AppInit( hInst, hPrev) -| -| Description: -| This is called when the application is first loaded into -| memory. It performs all initialization that doesn't need to be done -| once per instance. -| -| Arguments: -| hInstance instance handle of current instance -| hPrev instance handle of previous instance -| -| Returns: -| TRUE if successful, FALSE if not -| -\*----------------------------------------------------------------------------*/ -BOOL -AppInit(HINSTANCE hInst, HINSTANCE hPrev, int sw, LPSTR szCmdLine ) -{ - WNDCLASS cls; - HRESULT ddrval; - DDSURFACEDESC ddsd; - BOOL returnValue = FALSE; - - /* Save instance handle for DialogBoxs */ - hInstApp = hInst; - - hAccelApp = LoadAccelerators(hInst, "AppAccel"); - - if (!hPrev) { - /* - * Register a class for the main application window - */ - cls.hCursor = LoadCursor(NULL,IDC_ARROW); - cls.hIcon = LoadIcon(hInst,"AppIcon"); - cls.lpszMenuName = "AppMenu"; - cls.lpszClassName = szAppName; - cls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - cls.hInstance = hInst; - cls.style = CS_BYTEALIGNCLIENT | CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; - cls.lpfnWndProc = (WNDPROC)AppWndProc; - cls.cbWndExtra = 0; - cls.cbClsExtra = 0; - - if (RegisterClass(&cls)) { - hwndApp = CreateWindow ( - szAppName, // Class name - szAppName, // Caption - WS_OVERLAPPEDWINDOW, // Style bits - 50, 50, // Position - 400+20,400+75, // Size - (HWND)NULL, // Parent window (no parent) - (HMENU)NULL, // use class menu - hInst, // handle to window instance - (LPSTR)NULL); // no params to pass on - ShowWindow(hwndApp,sw); - - // init our direct draw stuff - ddrval = DirectDrawCreate( NULL, &pDirectDrawObj, NULL ); - if( DD_OK == ddrval) { - // clear out the surface desctiptions - ZeroMemory( &ddsd, sizeof( ddsd ) ); - // set the size - ddsd.dwSize = sizeof( ddsd ); - - // figure out what display mode we are in now - ddrval = pDirectDrawObj->GetDisplayMode( &ddsd ); - if( DD_OK == ddrval ) { - // make sure we're in a 8-bit mode - if( ddsd.ddpfPixelFormat.dwRGBBitCount >= 8) { - ScreenHeight = ddsd.dwHeight; - ScreenWidth = ddsd.dwWidth; - - // if we are biger than 800x600 it's to much memory - // to move around. Clip it - if(ScreenHeight > 600) ScreenHeight = 600; - if(ScreenWidth > 800) ScreenWidth = 800; - - if( (ScreenWidth < 800) || (ScreenHeight < 600) ) { - ErrMsg("Resolutions smaller than 800x600 may yeild different numbers because of L2 cache effects"); - } - - // allocate some memory we are going to play with - pSource = (PCHAR)GlobalAllocPtr(GHND, ScreenHeight * ScreenWidth); - pDest = (PCHAR)GlobalAllocPtr(GHND, ScreenHeight * ScreenWidth); - - // make sure the memory worked and it's dword alligned. - // (we're in Win32, when is not going to be dword alligned?) - if( pSource && pDest && !((DWORD)pSource & 0x3) && !((DWORD)pDest & 0x3)) { - returnValue = TRUE; - } else { - ErrMsg("Memory allocation failure"); - } - } else { - ErrMsg("You must be in a 8-bit (or better) color mode to run this app"); - } - } else { - ErrMsg("DirectDraw failure getting the display mode"); - } - } else { - ErrMsg("DirectDraw create failure"); - } - } else { - ErrMsg("Register Class failure"); - } - } - return returnValue; -} - -/*----------------------------------------------------------------------------*\ -| BandwidthTestsSetup -| -| Description: -| Setup the surfaces for the bandwidth tests -| -| Returns: -| TRUE if successful, FALSE if not -\*----------------------------------------------------------------------------*/ -BOOL -BandwidthTestsSetup( VOID ) -{ - DDSURFACEDESC ddsd; - BOOL returnValue = FALSE; - HRESULT ddrval; - - if( pOnScreenBuf ) pOnScreenBuf->Release(); - if( pOffScreenBuf ) pOffScreenBuf->Release(); - if( pSysMemBuf ) pSysMemBuf->Release(); - - // Tell the world we love it and want to share - ddrval = pDirectDrawObj->SetCooperativeLevel( hwndApp, DDSCL_NORMAL ); - if( DD_OK == ddrval ) { - // clear out out stuff - ZeroMemory( &ddsd, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - - ddsd.dwHeight = ScreenHeight; - ddsd.dwWidth = ScreenWidth; - // create our off screen video memory. - ddrval = pDirectDrawObj->CreateSurface( &ddsd, &pOffScreenBuf, NULL ); - if( DD_OK == ddrval ) { - // yay! - returnValue = TRUE; - } else { - ErrMsg("Failure creating video surface"); - } - } else { - ErrMsg("Failure setting Co-op mode"); - } - return returnValue; -} -/*----------------------------------------------------------------------------*\ -| AppExit() -| -| Description: -| app is just about to exit, cleanup -| -\*----------------------------------------------------------------------------*/ -void AppExit() -{ - if( pSource ) GlobalFreePtr(pSource); - if( pDest ) GlobalFreePtr(pDest); - if( pOffScreenBuf ) pOffScreenBuf->Release(); - if( pOnScreenBuf ) pOnScreenBuf->Release(); - if( pSysMemBuf ) pSysMemBuf->Release(); - if( pDirectDrawObj ) pDirectDrawObj->Release(); - -} - -/*----------------------------------------------------------------------------*\ -| WinMain( hInst, hPrev, lpszCmdLine, cmdShow ) | -| -| Description: -| The main procedure for the App. After initializing, it just goes -| into a message-processing loop until it gets a WM_QUIT message -| (meaning the app was closed). | -| -| Arguments: -| hInst instance handle of this instance of the app -| hPrev instance handle of previous instance, NULL if first -| szCmdLine ->null-terminated command line -| cmdShow specifies how the window is initially displayed -| -| Returns: -| The exit code as specified in the WM_QUIT message. -| -\*----------------------------------------------------------------------------*/ -int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) -{ - MSG msg; - - /* Call initialization procedure */ - if (!AppInit(hInst,hPrev,sw,szCmdLine)) - return FALSE; - - /* - * Polling messages from event queue - */ - for (;;) { - if(!GetMessage(&msg, NULL, 0, 0)) { - return msg.wParam; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return msg.wParam; -} - - -/*----------------------------------------------------------------------------*\ -| AppPaint(hwnd, hdc) -| -| Description: -| The paint function. Right now this does nothing. -| -| Arguments: -| hwnd window painting into -| hdc display context to paint to -| -| Returns: -| nothing -| -\*----------------------------------------------------------------------------*/ -AppPaint (HWND hwnd, HDC hdc) -{ - TEXTMETRIC tm; - int x,y; - RECT rc; - -#define PRINT_STUFF(sz) (TextOut(hdc, x, y, sz, lstrlen(sz)), y += tm.tmHeight+1) - - SelectObject(hdc, GetStockObject(ANSI_FIXED_FONT)); - GetTextMetrics(hdc, &tm); - - GetClientRect(hwnd,&rc); - - SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT)); - SetBkColor(hdc,GetSysColor(COLOR_WINDOW)); - - // setup start pos - x=4; - y=4; - - PRINT_STUFF("Select 'Time All' to run tests"); - y += (tm.tmHeight+1) * 2; - PRINT_STUFF("The screen will go blank during some tests"); - - return TRUE; -} - -/*----------------------------------------------------------------------------*\ -| AppWndProc( hwnd, uiMessage, wParam, lParam ) -| -| Description: -| The window proc for the app's main (tiled) window. -| This processes all of the parent window's messages. -| -\*----------------------------------------------------------------------------*/ -LRESULT CALLBACK AppWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) -{ - PAINTSTRUCT ps; - HDC hdc; - - switch (msg) { - case WM_COMMAND: - return AppCommand(hwnd,msg,wParam,lParam); - break; - - case WM_PAINT: - hdc = BeginPaint(hwnd,&ps); - AppPaint( hwnd, hdc ); - break; - - case WM_DESTROY: - hAccelApp = NULL; - PostQuitMessage(0); - break; - - } - return DefWindowProc(hwnd,msg,wParam,lParam); -} - -/*----------------------------------------------------------------------------*\ -| AppCommand(hwnd, msg, wParam, lParam ) -| -| Description: -| handles WM_COMMAND messages for the main window (hwndApp) -| of the parent window's messages. -| -\*----------------------------------------------------------------------------*/ -LONG AppCommand (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) -{ - char achFileName[128] = ""; - - switch(wParam) { - case MENU_ABOUT: - DialogBox(hInstApp,"AppAbout",hwnd,(DLGPROC)AppAbout); - break; - - - // do all the timing tests - case MENU_TIMEALL: - { - HCURSOR Arror = SetCursor(LoadCursor(0,IDC_WAIT)); - - ShowCursor(FALSE); //take care of animated Plus! cursors - - DWORD PriorityClass = GetPriorityClass(GetCurrentProcess()); - int ThreadPriority = GetThreadPriority(GetCurrentThread()); - - if( NUMBER_OF(SystemTests) != NUMBER_OF(VideoTests)) - { - ErrMsg("test number mismatch"); - break; - } - - // Jack this thread up to realtime. - // NOTE: This is very bad from for the real world. The rule is - // "The Higher your ptiority, the less work your thread should do". - // We are doing a lot of work. But this is only a test app, so who cares. - SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS); - SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); - - // setup the surfaces for the bandwidth tests - BandwidthTestsSetup(); - // Walk through the list of timers, and call them all - - for(int Counter = 0;Counter < NUMBER_OF(SystemTests) ;Counter++) { - - SetWindowText(hwndApp,SystemTests[Counter].pDescription); - - DoSystemTest( &SystemTests[Counter] ); - - SetWindowText(hwndApp,VideoTests[Counter].pDescription); - - DoVideoTests( &VideoTests[Counter] ); - - } - - // do 320x240 frame rate tests - ModeXFrameCount = GetFPS(320,240); - // do 640x480 frame rate tests - ModeYFrameCount = GetFPS(640,480); - // do 320x240 stretch to 640x480 frame rate tests - StretchFrameCount = GetStretchFPS(640,480); - - // return ourselves to normal - SetPriorityClass(GetCurrentProcess(),PriorityClass); - SetThreadPriority(GetCurrentThread(),ThreadPriority); - - SetCursor(Arror); - SetWindowText(hwndApp,szAppName); - - ShowCursor(TRUE); - PrintTimingResults(); - } - break; - - case MENU_EXIT: - PostMessage(hwnd,WM_CLOSE,0,0L); - break; - } - return 0L; -} - -/*----------------------------------------------------------------------------*\ -| ErrMsg - Opens a Message box with a error message in it. The user can -| select the OK button to continue -\*----------------------------------------------------------------------------*/ -int ErrMsg (LPSTR sz,...) -{ - char ach[128]; - - wvsprintf (ach,sz,(LPSTR)(&sz+1)); /* Format the string */ - MessageBox(hwndApp,ach,szAppName,MB_OK|MB_ICONEXCLAMATION|MB_TASKMODAL); - return FALSE; -} - - - - -/*----------------------------------------------------------------------------*\ -| PrintTimingResults( void ) -| -| Description: -| Print the results of the timting tests -| -\*----------------------------------------------------------------------------*/ -#include - -VOID -PrintTimingResults( void ) -{ - double result; - LARGE_INTEGER perfFreq; - char OutputBuffer[2048]; - char TempOutputBuffer[2048]; -#define PRINT_DOUBLE(d) {sprintf(TempOutputBuffer,"%12.8f",d);strcat(OutputBuffer,TempOutputBuffer);} -#define PRINT_STRING(s) {sprintf(TempOutputBuffer,"%s",s);strcat(OutputBuffer,TempOutputBuffer);} - - OutputBuffer[0]=0; - TempOutputBuffer[0]=0; - - // get the frequemcy out of timer - QueryPerformanceFrequency( &perfFreq ); - - // Turn all the time resutls into MB per second - for(int Counter = 0; Counter < NUMBER_OF(SystemTests) ; Counter++) { - if(SystemTests[Counter].Time) { - result = (double)SystemTests[Counter].Iterations; - result /= (double)SystemTests[Counter].Time / (double)perfFreq.LowPart; - result /= (double)1000000.0; - PRINT_DOUBLE(result); - } else { - PRINT_STRING("N/A"); - } - PRINT_STRING(" MB/sec \t"); - PRINT_STRING(SystemTests[Counter].pDescription); - PRINT_STRING("\n"); - - if(VideoTests[Counter].Time) { - result = (double)VideoTests[Counter].Iterations; - result /= (double)VideoTests[Counter].Time / (double)perfFreq.LowPart; - result /= (double)1000000.0; - PRINT_DOUBLE(result); - } else { - PRINT_STRING("N/A"); - } - PRINT_STRING(" MB/sec \t"); - PRINT_STRING(VideoTests[Counter].pDescription); - PRINT_STRING("\n"); - - } - - if( ModeXFrameCount ) { - PRINT_DOUBLE((double)ModeXFrameCount/5.0); - } else { - PRINT_STRING("N/A"); - } - PRINT_STRING(" FPS \t\t"); - PRINT_STRING("320x240 Frame Rate"); - PRINT_STRING("\n"); - - if( ModeYFrameCount ) { - PRINT_DOUBLE((double)ModeYFrameCount/5.0); - } else { - PRINT_STRING("N/A"); - } - PRINT_STRING(" FPS \t\t"); - PRINT_STRING("640x480 Frame Rate"); - PRINT_STRING("\n"); - - if( StretchFrameCount ) { - PRINT_DOUBLE((double)StretchFrameCount/5.0); - } else { - PRINT_STRING("N/A"); - } - PRINT_STRING(" FPS \t\t"); - PRINT_STRING("320x240 stretched to 640x480"); - PRINT_STRING("\n"); - -#ifndef LOR_TESTS - // display the results - MessageBox(0, OutputBuffer ,"Timing Results",MB_OK); -#endif - -} - -VOID DoSystemTest( PTIMING_RESULT pTimeObject ) -{ - LARGE_INTEGER startTime, endTime; - - QueryPerformanceCounter( &startTime ); - - // do the memory copy - pTimeObject->Iterations = (*pTimeObject->pTimer)(pSource, pDest, ScreenHeight, ScreenWidth, ScreenWidth, 100 ); - - QueryPerformanceCounter( &endTime ); - - // if it takes more than 32bits of clock ticks - // it's not worth profiling. - pTimeObject->Time = endTime.LowPart - startTime.LowPart; -} - -VOID DoVideoTests( PTIMING_RESULT pTimeObject ) -{ - DDSURFACEDESC ddsd; - HRESULT returnValue; - LARGE_INTEGER startTime, endTime; - - ZeroMemory( &ddsd, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - - - // lock the video memory surfce - // NOTE: We are about to do a lock for a REALLY long time. - // this is really bad form in the real world. - // - returnValue = pOffScreenBuf->Lock( NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR, NULL); - if( returnValue == DD_OK ) - { - if( ddsd.lPitch && ddsd.dwWidth && ddsd.dwHeight && ddsd.lpSurface) - { - // get the time, and do the copy - QueryPerformanceCounter( &startTime ); - - pTimeObject->Iterations = (*pTimeObject->pTimer)( pSource, ddsd.lpSurface, ddsd.dwHeight, ddsd.dwWidth, ddsd.lPitch, 100 ); - - QueryPerformanceCounter( &endTime ); - - pOffScreenBuf->Unlock( ddsd.lpSurface ); - // stor the delta time - pTimeObject->Time = endTime.LowPart - startTime.LowPart; - } - else - { - pOffScreenBuf->Unlock( ddsd.lpSurface ); - ErrMsg("Lock returned bogus Session Description stuff"); - } - } - else - ErrMsg("Can't lock surface"); - - return; -} - -BOOL -InitFullScreen( - DWORD Height, - DWORD Width - ) -{ - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT ddrval; - ULONG returnValue = FALSE; - - // Kill our current offscreen surface. - if( pOffScreenBuf ) { - ddrval = pOffScreenBuf->Release(); - if( ddrval != DD_OK ) { - ErrMsg("Can't release offscreen buf"); - } - } - - - // Get exclusive mode - ddrval = pDirectDrawObj->SetCooperativeLevel( hwndApp, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_NOWINDOWCHANGES ); - - if( ddrval == DD_OK ){ - // set the display mode to the requested mode - ddrval = pDirectDrawObj->SetDisplayMode( Height, Width, 8); - if(ddrval == DD_OK){ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - // get the primary buffer - ddrval = pDirectDrawObj->CreateSurface( &ddsd, &pOnScreenBuf, NULL ); - - if( ddrval == DD_OK ) { - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - // the back buffer might be in system memory depending - // on the card and the mode. - ddrval = pOnScreenBuf->GetAttachedSurface(&ddscaps, &pOffScreenBuf); - - if( ddrval == DD_OK ) { - returnValue = TRUE; - } - } - } else { - ErrMsg("can't set display mode %d x %d",Width,Height); - } - } - return returnValue; -} - - -BOOL -CreateSysMemSurface( VOID ) -{ - DDSURFACEDESC ddsd; - ULONG returnValue; - - // clear out out stuff - ZeroMemory( &ddsd, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - - // build a surface in system memory - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; - - ddsd.dwHeight = 240; - ddsd.dwWidth = 320; - returnValue = pDirectDrawObj->CreateSurface( &ddsd, &pSysMemBuf, NULL ); - if( DD_OK == returnValue ) { - return TRUE; - } - - return FALSE; -} - -ULONG -GetStretchFPS( int width, int height ) -{ - ULONG time; - HRESULT ddrval; - DDSURFACEDESC ddsd; - DDBLTFX ddbltfx; - ULONG FrameCount; - - // set the mode (and create the surfaces) - if( InitFullScreen( width, height ) ) { - // get the system memory surface - if( CreateSysMemSurface() ) { - - // build the ROP for the blt - ZeroMemory( &ddbltfx, sizeof(ddbltfx) ); - ddbltfx.dwSize = sizeof( ddbltfx ); - ddbltfx.dwROP = SRCCOPY; - - time = timeGetTime(); - // wait for a seconds for the mode to settle out - // (I don't need to do this.. I'm just paranoid) - while( (timeGetTime() - time) < 1000); - FrameCount = 0; - time = timeGetTime(); - - // Initialize the surface description structure - ZeroMemory(&ddsd, sizeof(ddsd)); - ddsd.dwSize=sizeof(ddsd); - - ddrval = 0; - // do this for 5 seconds - while( ((timeGetTime() - time) < 5000) && (DD_OK == ddrval) ) { - // simluate rendering and off screen frame (with a copy) - ddrval = pSysMemBuf->Lock( NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - - DwordMemCopy_Pitch( pSource, ddsd.lpSurface, ddsd.dwHeight, ddsd.dwWidth, ddsd.lPitch, 1); - - ddrval = pSysMemBuf->Unlock( NULL ); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - - // blt the system buffer into the back buffer - ddrval = pOffScreenBuf->Blt( NULL, pSysMemBuf, NULL, DDBLT_ROP, &ddbltfx); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - - // flip the back buffer on screen - ddrval = pOnScreenBuf->Flip( NULL, DDFLIP_WAIT ); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - - FrameCount++; - } - } - pDirectDrawObj->RestoreDisplayMode(); - if( DD_OK != ddrval ) { - ErrMsg("Test failure %X",ddrval); - } - - pOffScreenBuf->Release(); - pOffScreenBuf = NULL; - pOnScreenBuf->Release(); - pOnScreenBuf = NULL; - pSysMemBuf->Release(); - pSysMemBuf = NULL; - } - return FrameCount; -} - -ULONG GetFPS( int width, int height ) -{ - ULONG time; - DDSURFACEDESC ddsd; - HRESULT ddrval; - ULONG FrameCount; - - ZeroMemory( &ddsd, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - - // set the mode (and setup the surfaces) - if( InitFullScreen( width, height ) ) - { - time = timeGetTime(); - // wait for a seconds for the mode to settle out - // (I don't need to do this, I'm just paranoid) - while( (timeGetTime() - time) < 1000); - ddrval = DD_OK; - FrameCount = 0; - time = timeGetTime(); - while( ((timeGetTime() - time) < 5000) && (ddrval == DD_OK) ) - { - // simluate a render into the back buffer with a copy - ddrval = pOffScreenBuf->Lock( NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - // Stuff some Junk into the offscreen surface - DwordMemCopy_Pitch( pSource, ddsd.lpSurface, ddsd.dwHeight, ddsd.dwWidth, ddsd.lPitch, 1 ); - - ddrval = pOffScreenBuf->Unlock( NULL ); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - - // flip the off screen surface on screen - ddrval = pOnScreenBuf->Flip( NULL, DDFLIP_WAIT ); - if (FAILED(ddrval)) - { - FrameCount=0; - break; - } - - FrameCount++; - } - pDirectDrawObj->RestoreDisplayMode(); - if( FAILED(ddrval) ) - ErrMsg("Test failure %X",ddrval); - pOffScreenBuf->Release(); - pOffScreenBuf = NULL; - pOnScreenBuf->Release(); - pOnScreenBuf = NULL; - } - - return FrameCount; -} - -/***************************************************************************** - * - * dprintf() is called by the DPF macro if DEBUG is defined at compile time. - * - * The messages will be send to COM1: like any debug message. To - * enable debug output, add the following to WIN.INI : - * - * [debug] - * QA=1 - * - ****************************************************************************/ - -#ifdef DEBUG - -#define MODNAME "QA" - - -#define _WINDLL -#include - -void FAR CDECL dprintf(LPSTR szFormat, ...) -{ - char ach[128]; - va_list va; - - static BOOL fDebug = -1; - - if (fDebug == -1) { - fDebug = GetProfileIntA("Debug", MODNAME, TRUE); - } - - if (!fDebug) return; - - - - lstrcpyA(ach, MODNAME ": "); - va_start(va, szFormat); - wvsprintfA(ach+lstrlenA(ach),szFormat,(LPSTR)va); - va_end(va); - lstrcatA(ach, "\r\n"); - - OutputDebugStringA(ach); -} - -#endif diff --git a/sdk/samples/memtime/memtime.def b/sdk/samples/memtime/memtime.def deleted file mode 100644 index d9964cb..0000000 --- a/sdk/samples/memtime/memtime.def +++ /dev/null @@ -1,11 +0,0 @@ -NAME MEMTIME - -DESCRIPTION 'MemTime Timer for DirectDraw' - -EXETYPE WINDOWS - -CODE MOVEABLE -DATA MOVEABLE MULTIPLE - -HEAPSIZE 512 -STACKSIZE 4096 diff --git a/sdk/samples/memtime/memtime.h b/sdk/samples/memtime/memtime.h deleted file mode 100644 index f108406..0000000 --- a/sdk/samples/memtime/memtime.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Menu Items */ -#define MENU_ABOUT 2 -#define MENU_EXIT 4 -#define MENU_OPEN 5 -#define MENU_COPY 6 -#define MENU_PASTE 7 -#define MENU_CUT 8 -#define MENU_TIMEALL 9 -#define MENU_REALTIME 10 - -#define MENU_TIME 50 - - -/**************************************************************************** -****************************************************************************/ -struct _timing_result; - -typedef DWORD MemFunc(PVOID pSource, PVOID pDest, DWORD Heigh, DWORD Width, DWORD Pitch, DWORD Count); - -typedef struct _timing_result -{ - DWORD Time; - MemFunc *pTimer; - char const *pDescription; - DWORD Iterations; -} TIMING_RESULT, *PTIMING_RESULT; - - - -#ifdef DEBUG - extern void FAR CDECL dprintf(LPSTR szFormat, ...); - #define DPF dprintf -#else - #define DPF ; / ## / -#endif diff --git a/sdk/samples/memtime/memtime.ico b/sdk/samples/memtime/memtime.ico deleted file mode 100644 index 492557c..0000000 Binary files a/sdk/samples/memtime/memtime.ico and /dev/null differ diff --git a/sdk/samples/memtime/memtime.rc b/sdk/samples/memtime/memtime.rc deleted file mode 100644 index acc71b5..0000000 --- a/sdk/samples/memtime/memtime.rc +++ /dev/null @@ -1,34 +0,0 @@ -#include "windows.h" -#include "memtime.h" - -AppIcon ICON memtime.ico - -AppAccel ACCELERATORS PRELOAD -BEGIN - VK_DELETE, MENU_CUT, VIRTKEY, CONTROL - VK_INSERT, MENU_COPY, VIRTKEY, CONTROL - VK_INSERT, MENU_PASTE, VIRTKEY - "^c", MENU_COPY - "^v", MENU_PASTE - "^x", MENU_CUT -END - -AppAbout DIALOG 22, 17, 144, 75 -STYLE WS_POPUP | WS_DLGFRAME -BEGIN - CTEXT "DirectDraw Memory Bandwidth Tests" -1, 37, 5, 60, 8 - CTEXT "Version 2.00" -1, 38, 34, 64, 8 - CTEXT "Copyright ) 1996, Microsoft Corp." -1, 5, 47,132, 9 - ICON "AppIcon" -1, 9, 23, 0, 0 - DEFPUSHBUTTON "Ok" IDOK, 53, 59, 32, 14, WS_GROUP -END - -AppMenu menu -begin - POPUP "&File" - begin - MENUITEM "&About..." , MENU_ABOUT - MENUITEM "E&xit" , MENU_EXIT - end - MENUITEM "Time &All", MENU_TIMEALL -end diff --git a/sdk/samples/memtime/msvc.mk b/sdk/samples/memtime/msvc.mk deleted file mode 100644 index 61474ba..0000000 --- a/sdk/samples/memtime/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = memtime -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = $(NAME).obj ..\timing.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/memtime/readme.txt b/sdk/samples/memtime/readme.txt deleted file mode 100644 index 59bc82f..0000000 --- a/sdk/samples/memtime/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -MEMTIME - -Memory bandwidth tests. Times various operations on system and video -memory. Memtime is intended to show the advantages and disadvantages of -different drawing methods. - -BUILDING WITH MICROSOFT VISUAL C++ 4.0 AND HIGHER - -From the File/Open Workspace menu, open the makefile file and reply -'Yes' when asked if you wish to create a wrapper project. - diff --git a/sdk/samples/memtime/timing.asm b/sdk/samples/memtime/timing.asm deleted file mode 100644 index 59c9fe0..0000000 --- a/sdk/samples/memtime/timing.asm +++ /dev/null @@ -1,268 +0,0 @@ -;;--------------------------------------------------------------------------; -;; -;; File: timing.asm -;; -;; Description: -;; This asm file is various methods of memory copies -;; that copy the same data over and over for timing -;; tests. They all assume DWORD alignment. -;; They all take: -;; Source. The source buffer to copy from -;; Dest. The dest buffer to copy to. -;; Height. The hight of both the source and dest buffers -;; Width. The width of both the source and dest buffers -;; Pitch. The pitch of the dest buffer ONLY. The source -;; buffer assumes the pitch = width. -;; Count. The number of times you want to do the copy. -;; They all return: -;; The number of bytes copied -;; -;; -;; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -;; KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -;; IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -;; PURPOSE. -;; -;;--------------------------------------------------------------------------- -;; -;; Copyright (c) 1994 - 1996 Microsoft Corporation. All Rights Reserved. -;; -;;--------------------------------------------------------------------------- -.386 -.MODEL FLAT - - - - -.CODE - - -;; fill a verticale byte colum of memory (either system or video) - -VertMemSto_Pitch PROC C PUBLIC Uses ESI EDI EBX EDX ECX, - pSource:DWORD, \ ;; this isn't used, but it's gotta be here so I can - pDest:DWORD, \ ;; use it in a jump table - Height:DWORD, \ - sWidth:DWORD, \ - Pitch:DWORD, \ - Count:DWORD - - mov ebx, pSource ;; this is only here so the assembler doesn't tell - ;; me about un-used parameters. (I'm to lazy to - ;; figure out how to turn the warning off) - - mov ebx, Count ;; ebx = number of times to copy the buffers - mov eax, Pitch ;; eax = the pitch of the dest - -top_o_loop: - mov edx, pDest ;; edx = pointer to the dest - mov ecx, sWidth -VerLine: - mov edi, edx ;; load the pDest - mov esi, Height -pixel: - mov byte ptr [edi], 0 ;; store the byte (0's are nice) - add edi, eax ;; skip to the next line - dec esi ;; are we done with this colum? - jnz pixel - - inc edx ;; we did the colum. increment the pDest by one - dec ecx ;; are we done with all the colums? - jnz VerLine - - dec ebx ;; did we do it the correct number of times? - jnz top_o_loop - - mov eax, Count ;; return the number of bytes we filled - imul eax, sWidth - imul eax, Height - - ret -VertMemSto_Pitch ENDP - -; Copy from system memory to Video memory and -; cope with pitch. - -DwordMemCopy_Pitch PROC C PUBLIC USES ESI EDI EBX ECX EDX, \ - pSource:DWORD, \ - pDest:DWORD, \ - Height:DWORD, \ - sWidth:DWORD, \ - Pitch:DWORD, \ - Count:DWORD - - mov ebx, Count ;; do the copy this many times - mov edx, sWidth ;; set up the number of Dwords per scanline - shr edx, 2 - -top_o_loop: ;; every screen - push ebx - mov ebx, pDest - mov esi, pSource ;; the source is linear data - mov eax, Height ;; number of lines - push ebp - mov ebp, pitch -scan_line: - mov edi, ebx ;; get a dest pointer to this scan line - mov ecx, edx ;; reset our dword count - rep movsd - add ebx, ebp ;; add in the offset to the next scan line - - dec eax - jnz scan_line - - pop ebp ;; we've done a whole screen - pop ebx - dec ebx ;; do another screen (till we're done) - jnz top_o_loop - - mov eax, edx ;; the width - shl eax, 2 ;; in bytes - imul eax, Height ;; * height - imul eax, Count ;; * number of screens we copied - - ret - -DwordMemCopy_Pitch ENDP - -; Copy from system memory to Video memory (in BYTES) -; and cope with pitch. - -ByteMemCopy_Pitch PROC C PUBLIC USES ESI EDI EBX ECX EDX, \ - pSource:DWORD, \ - pDest:DWORD, \ - Height:DWORD, \ - sWidth:DWORD, \ - Pitch:DWORD, \ - Count:DWORD - - mov ebx, Count ;; do the copy this many times - mov edx, sWidth ;; set up the number of bytes per scanline - -top_o_loop: ;; every screen - push ebx - mov ebx, pDest - mov esi, pSource ;; the source is linear data - mov eax, Height ;; number of lines - push ebp - mov ebp, pitch -scan_line: - mov edi, ebx ;; get a dest pointer to this scan line - mov ecx, edx ;; reset our dword count - rep movsb - add ebx, ebp ;; add in the offset to the next scan line - - dec eax - jnz scan_line - - pop ebp ;; we've done a whole screen - pop ebx - dec ebx ;; do another screen (till we're done) - jnz top_o_loop - - mov eax, edx ;; the width - imul eax, Height ;; * height - imul eax, Count ;; * number of screens we copied - - ret - -ByteMemCopy_Pitch ENDP - -;; fill memory (video or system) with 0s (DOWRD fill) - -DwordMemFill_Pitch PROC C PUBLIC USES ESI EDI EBX ECX EDX, \ - pSource:DWORD, \ - pDest:DWORD, \ - Height:DWORD, \ - sWidth:DWORD, \ - Pitch:DWORD, \ - Count:DWORD - - mov ebx, pSource ;; this is only here so the assembler doesn't tell - ;; me about un-used parameters. (I'm to lazy to - ;; figure out how to turn the warning off) - mov ebx, Count - xor eax, eax - mov edx, sWidth ;; we want a dword count - shr edx, 2 - -screen: - mov esi, pDest ;; re-load the dest - push ebx - mov ebx, Height ;; re-load the height - push ebp - mov ebp, Pitch ;; put this in a register - -line: - mov edi, esi ;; get the new line - mov ecx, edx ;; load the count - rep stosd ;; store the data (eax = 0) - - add esi, ebp ;; add the pitch into the pDest - - dec ebx ;; are we done with the screen? - jnz line - - pop ebp - pop ebx - dec ebx ;; did we do it the requested number of times? - jnz screen - - mov eax, Count ;; return how many bytes we filled - imul eax, sWidth - imul eax, Height - - ret -DwordMemFill_Pitch ENDP - -;; fill memory (video or system) with 0s (DOWRD fill) - -;; same thing as above, just do it in bytes. -;; only 2 lines change. Whata waste of code space. -;; good thing it's only a test app - -ByteMemFill_Pitch PROC C PUBLIC USES ESI EDI EBX ECX EDX, \ - pSource:DWORD, \ - pDest:DWORD, \ - Height:DWORD, \ - sWidth:DWORD, \ - Pitch:DWORD, \ - Count:DWORD - - mov ebx, pSource ;; this is here so masm wont choke. - - mov ebx, Count - xor eax, eax - mov edx, sWidth - -screen: - mov esi, pDest - push ebx - mov ebx, Height - push ebp - mov ebp, Pitch - -line: - mov edi, esi - mov ecx, edx - rep stosb - - add esi, ebp - - dec ebx - jnz line - - pop ebp - pop ebx - dec ebx - jnz screen - - mov eax, Count - imul eax, sWidth - imul eax, Height - - ret -ByteMemFill_Pitch ENDP -END - - diff --git a/sdk/samples/memtime/timing.obj b/sdk/samples/memtime/timing.obj deleted file mode 100644 index ecd3162..0000000 Binary files a/sdk/samples/memtime/timing.obj and /dev/null differ diff --git a/sdk/samples/mid2strm/canyon.mds b/sdk/samples/mid2strm/canyon.mds deleted file mode 100644 index 479e104..0000000 Binary files a/sdk/samples/mid2strm/canyon.mds and /dev/null differ diff --git a/sdk/samples/mid2strm/canyon.mid b/sdk/samples/mid2strm/canyon.mid deleted file mode 100644 index b7ae43f..0000000 Binary files a/sdk/samples/mid2strm/canyon.mid and /dev/null differ diff --git a/sdk/samples/mid2strm/default.mk b/sdk/samples/mid2strm/default.mk deleted file mode 100644 index 8cae757..0000000 --- a/sdk/samples/mid2strm/default.mk +++ /dev/null @@ -1,47 +0,0 @@ -NAME = mid2strm -EXT = exe - -IS_32 = 1 - -GOALS = $(PBIN)\$(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib libc.lib \ - comdlg32.lib gdi32.lib winmm.lib - -OBJS = mid2strm.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -AOPT =-DDEBUG -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -AOPT = -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def - -!if ("$(DEBUG)" == "ntretail") || ("$(DEBUG)" == "ntdebug") -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -!else -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -!endif -AFLAGS =$(AOPT) -Zp4 -DSTD_CALL -DBLD_COFF -coff -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\..\proj.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def ..\default.mk - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:console --def:..\$(NAME).def -$(LIBS) -$(OBJS) -<< diff --git a/sdk/samples/mid2strm/makefile b/sdk/samples/mid2strm/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/mid2strm/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/mid2strm/mid2strm.c b/sdk/samples/mid2strm/mid2strm.c deleted file mode 100644 index 2f8326b..0000000 --- a/sdk/samples/mid2strm/mid2strm.c +++ /dev/null @@ -1,1023 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: mid2strm.c - * Content: Converts a MIDI file into a MDS (MidiStream) File. - * - ***************************************************************************/ -#include -#include -#include -#include -#include - -// MIDI file constants -// -#define MThd 0x6468544D // Start of file -#define MTrk 0x6B72544D // Start of track - -#define MIDI_SYSEX ((BYTE)0xF0) // SysEx begin -#define MIDI_SYSEXEND ((BYTE)0xF7) // SysEx begin -#define MIDI_META ((BYTE)0xFF) // Meta event begin -#define MIDI_META_TEMPO ((BYTE)0x51) -#define MIDI_META_EOT ((BYTE)0x2F) // End-of-track - -#define MIDI_NOTEOFF ((BYTE)0x80) // + note + velocity -#define MIDI_NOTEON ((BYTE)0x90) // + note + velocity -#define MIDI_POLYPRESS ((BYTE)0xA0) // + pressure (2 bytes) -#define MIDI_CTRLCHANGE ((BYTE)0xB0) // + ctrlr + value -#define MIDI_PRGMCHANGE ((BYTE)0xC0) // + new patch -#define MIDI_CHANPRESS ((BYTE)0xD0) // + pressure (1 byte) -#define MIDI_PITCHBEND ((BYTE)0xE0) // + pitch bend (2 bytes) - -#define CB_STREAMBUF (4096) // Size of each stream buffer - -#define MIDS_SHORTMSG (0x00000000) -#define MIDS_TEMPO (0x01000000) - -// Macros for swapping hi/lo-endian data -// -#define WORDSWAP(w) (((w) >> 8) | \ - (((w) << 8) & 0xFF00)) - -#define DWORDSWAP(dw) (((dw) >> 24) | \ - (((dw) >> 8) & 0x0000FF00) | \ - (((dw) << 8) & 0x00FF0000) | \ - (((dw) << 24) & 0xFF000000)) - -// In debug builds, TRACKERR will show us where the parser died -// -#ifdef _DEBUG -#define TRACKERR(p,sz) ShowTrackError(p,sz); -#else -#define TRACKERR(p,sz) -#endif - - -// These structures are stored in MIDI files; they need to be byte -// aligned. -// -#pragma pack(1) - -// Chunk header. dwTag is either MTrk or MThd. -// -typedef struct -{ - DWORD dwTag; // Type - DWORD cbChunk; // Length (hi-lo) -} MIDICHUNK; - -// Contents of MThd chunk. -typedef struct -{ - WORD wFormat; // Format (hi-lo) - WORD cTrack; // # tracks (hi-lo) - WORD wTimeDivision; // Time division (hi-lo) -} MIDIFILEHDR; - -#pragma pack() - -// One event we're reading or writing to a track -// -typedef struct -{ - DWORD tkEvent; // Absolute time of event - BYTE abEvent[4]; // Event type and parameters if channel msg - DWORD cbEvent; // Of data which follows if meta or sysex - LPBYTE pEvent; // -> Event data if applicable -} MEVENT; - -// Description of a track open for read -// -#define ITS_F_ENDOFTRK 0x00000001 - -typedef struct -{ - DWORD fdwTrack; // Track status - DWORD cbTrack; // Total bytes in track - DWORD cbLeft; // Bytes left unread in track - LPBYTE pTrack; // -> start of track data - LPBYTE pTrackPointer; // -> next byte to read - DWORD tkNextEventDue; // Absolute time of next event in track - BYTE bRunningStatus; // Running status from last channel msg -#ifdef _DEBUG - DWORD nTrack; // # of this track for debugging -#endif -} INTRACKSTATE; - -// Description of the input MIDI file -// -typedef struct -{ - DWORD cbFile; // Total bytes in file - LPBYTE pFile; // -> entire file in memory - DWORD cbLeft; // Bytes left unread - LPBYTE pFilePointer; // -> next byte to read - - DWORD dwTimeDivision; // Original time division - DWORD dwFormat; // Original format - DWORD cTrack; // Track count (specifies apIts size) - INTRACKSTATE* apIts; // -> array of tracks in this file -} INFILESTATE; - -// Description of a stream buffer on the output side -// -typedef struct STREAMBUF *PSTREAMBUF; -typedef struct STREAMBUF -{ - LPBYTE pBuffer; // -> Start of actual buffer - DWORD tkStart; // Tick time just before first event - LPBYTE pbNextEvent; // Where to write next event - DWORD cbLeft; // bytes left in buffer - DWORD cbLeftUncompressed; // bytes left when uncompressed - PSTREAMBUF pNext; // Next buffer -} STREAMBUF; - -// Description of output stream open for write -// -typedef struct -{ - DWORD tkTrack; // Current tick position in track - PSTREAMBUF pFirst; // First stream buffer - PSTREAMBUF pLast; // Last (current) stream buffer -} OUTSTREAMSTATE; - -// Format of structs within a MSD file -// -// 'fmt ' chunk -// - -#define MDS_F_NOSTREAMID 0x00000001 // Stream ID's skipped; reader inserts -typedef struct -{ - DWORD dwTimeFormat; // Low word == time format in SMF format - DWORD cbMaxBuffer; // Guaranteed max buffer size - DWORD dwFlags; // Format flags -} MIDSFMT; - -// 'data' chunk buffer header -// -typedef struct -{ - DWORD tkStart; // Absolute tick offset at start of buffer - DWORD cbBuffer; // Bytes in this buffer -} MIDSBUFFER; - -// A few globals -// -static HANDLE hInFile = INVALID_HANDLE_VALUE; -static HANDLE hOutFile = INVALID_HANDLE_VALUE; -static INFILESTATE ifs; -static OUTSTREAMSTATE ots; -static BOOL fCompress = FALSE; - -// Messages -// -static char szInitErrMem[] = "Out of memory.\n"; -static char szInitErrInFile[] = "Read error on input file or file is corrupt.\n"; - -#ifdef _DEBUG -static char gteBadRunStat[] = "Reference to missing running status."; -static char gteRunStatMsgTrunc[] = "Running status message truncated"; -static char gteChanMsgTrunc[] = "Channel message truncated"; -static char gteSysExLenTrunc[] = "SysEx event truncated (length)"; -static char gteSysExTrunc[] = "SysEx event truncated"; -static char gteMetaNoClass[] = "Meta event truncated (no class byte)"; -static char gteMetaLenTrunc[] = "Meta event truncated (length)"; -static char gteMetaTrunc[] = "Meta event truncated"; -#endif - -// Prototypes -// -static BOOL Init(LPSTR szInFile, LPSTR szOutFile); -static LPBYTE GetInFileData(DWORD cbToGet); -static void Cleanup(void); -static BOOL BuildNewTracks(void); -static BOOL WriteStreamBuffers(void); -static BOOL GetTrackVDWord(INTRACKSTATE* pTs, LPDWORD lpdw); -static BOOL GetTrackEvent(INTRACKSTATE* pTs, MEVENT *pMe); -static BOOL AddEventToStream(MEVENT *pMe); -static LPBYTE GetOutStreamBytes(DWORD tkNow, DWORD cbNeeded, DWORD cbUncompressed); -#ifdef _DEBUG -static void ShowTrackError(INTRACKSTATE* pTs, char* szErr); -#endif - -void main(int argc, char* argv[]) -{ - UINT idxFnames; - - if (argc < 3) - { - fprintf(stderr, "Format is mid2strm [-c] infile outfile\n"); - fprintf(stderr, "-c\tNo-stream-id compression\n"); - exit(1); - } - - idxFnames = 1; - if (argv[1][0] == '-') - { - ++idxFnames; - if (argv[1][1] == 'c') - fCompress = TRUE; - } - - if (!Init(argv[idxFnames], argv[idxFnames+1])) - exit(1); - - if (!BuildNewTracks()) - exit(1); - - if (!WriteStreamBuffers()) - exit(1); - - // Add cleanup code!!! - // - Cleanup(); - - exit(0); -} - -// Init -// -// Open the input and output files -// Allocate and read the entire input file into memory -// Validate the input file structure -// Allocate the input track structures and initialize them -// Initialize the output track structures -// -// Return TRUE on success -// Prints its own error message if something goes wrong -// -static BOOL Init(LPSTR szInFile, LPSTR szOutFile) -{ - BOOL fRet = FALSE; - DWORD cbRead; - LPDWORD lpdwTag; - LPDWORD lpcbHeader; - DWORD cbHeader; - MIDIFILEHDR* pHeader; - INTRACKSTATE* pTs; - UINT idx; - - // Initialize things we'll try to free later if we fail - // - ifs.cbFile = 0; - ifs.pFile = NULL; - ifs.apIts = NULL; - - // Attempt to open the input and output files - // - hInFile = CreateFile(szInFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (INVALID_HANDLE_VALUE == hInFile) - { - fprintf(stderr, "Could not open \"%s\" for read.\n", szInFile); - goto Init_Cleanup; - } - - hOutFile = CreateFile(szOutFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (INVALID_HANDLE_VALUE == hOutFile) - { - fprintf(stderr, "Could not open \"%s\" for write.\n", szOutFile); - goto Init_Cleanup; - } - - // Figure out how big the input file is and allocate a chunk of memory big enough - // to hold the whole thing. Read the whole file in at once. - // - if (((UINT)-1) == (ifs.cbFile = GetFileSize(hInFile, NULL))) - { - fprintf(stderr, "File system error on input file.\n"); - goto Init_Cleanup; - } - - if (NULL == (ifs.pFile = GlobalAllocPtr(GPTR, ifs.cbFile))) - { - fprintf(stderr, szInitErrMem); - goto Init_Cleanup; - } - - if ((!ReadFile(hInFile, ifs.pFile, ifs.cbFile, &cbRead, NULL)) || - cbRead != ifs.cbFile) - { - fprintf(stderr, szInitErrInFile); - goto Init_Cleanup; - } - - // Set up to read from the memory buffer. Read and validate - // - MThd header - // - size of file header chunk - // - file header itself - // - ifs.cbLeft = ifs.cbFile; - ifs.pFilePointer = ifs.pFile; - - if (NULL == (lpdwTag = (LPDWORD)GetInFileData(sizeof(*lpdwTag))) || - *lpdwTag != MThd || - NULL == (lpcbHeader = (LPDWORD)GetInFileData(sizeof(*lpcbHeader))) || - (cbHeader = DWORDSWAP(*lpcbHeader)) < sizeof(MIDIFILEHDR) || - NULL == (pHeader = (MIDIFILEHDR*)GetInFileData(cbHeader))) - { - fprintf(stderr, szInitErrInFile); - goto Init_Cleanup; - } - - // File header is stored in hi-lo order. Swap this into Intel order and save - // parameters in our native int size (32 bits) - // - ifs.dwFormat = (DWORD)WORDSWAP(pHeader->wFormat); - ifs.cTrack = (DWORD)WORDSWAP(pHeader->cTrack); - ifs.dwTimeDivision = (DWORD)WORDSWAP(pHeader->wTimeDivision); - - // We know how many tracks there are; allocate the structures for them and parse - // them. The parse merely looks at the MTrk signature and track chunk length - // in order to skip to the next track header. - // - ifs.apIts = (INTRACKSTATE*)GlobalAllocPtr(GPTR, ifs.cTrack*sizeof(INTRACKSTATE)); - if (NULL == ifs.apIts) - { - fprintf(stderr, szInitErrMem); - goto Init_Cleanup; - } - - for (idx = 0, pTs = ifs.apIts; idx < ifs.cTrack; ++idx, ++pTs) - { - if (NULL == (lpdwTag = (LPDWORD)GetInFileData(sizeof(*lpdwTag))) || - *lpdwTag != MTrk || - NULL == (lpcbHeader = (LPDWORD)GetInFileData(sizeof(*lpcbHeader)))) - { - fprintf(stderr, szInitErrInFile); - goto Init_Cleanup; - } - - cbHeader = DWORDSWAP(*lpcbHeader); - pTs->cbTrack = cbHeader; - pTs->cbLeft = cbHeader; - pTs->pTrack = GetInFileData(cbHeader); - if (NULL == pTs->pTrack) - { - fprintf(stderr, szInitErrInFile); - goto Init_Cleanup; - } - -#ifdef _DEBUG - pTs->nTrack = idx; -#endif - pTs->pTrackPointer = pTs->pTrack; - pTs->cbLeft = pTs->cbTrack; - pTs->fdwTrack = 0; - pTs->bRunningStatus = 0; - - // Handle bozo MIDI files which contain empty track chunks - // - if (!pTs->cbLeft) - { - pTs->fdwTrack |= ITS_F_ENDOFTRK; - continue; - } - - - // We always preread the time from each track so the mixer code can - // determine which track has the next event with a minimum of work - // - if (!GetTrackVDWord(pTs, &pTs->tkNextEventDue)) - { - fprintf(stderr, szInitErrInFile); - goto Init_Cleanup; - } - } - - ots.tkTrack = 0; - ots.pFirst = NULL; - ots.pLast = NULL; - - fRet = TRUE; - -Init_Cleanup: - if (!fRet) - Cleanup(); - - return fRet; -} - -// -// GetInFileData -// -// Gets the requested number of bytes of data from the input file and returns -// a pointer to them. -// -// Returns a pointer to the data or NULL if we'd read more than is -// there. -// -static LPBYTE GetInFileData(DWORD cbToGet) -{ - LPBYTE pRet; - - if (ifs.cbLeft < cbToGet) - return NULL; - - pRet = ifs.pFilePointer; - - ifs.cbLeft -= cbToGet; - ifs.pFilePointer += cbToGet; - - return pRet; -} - -// -// Cleanup -// -// Free anything we ever allocated -// -static void Cleanup(void) -{ - PSTREAMBUF pCurr; - PSTREAMBUF pNext; - - if (hInFile != INVALID_HANDLE_VALUE) CloseHandle(hInFile); - if (hOutFile != INVALID_HANDLE_VALUE) CloseHandle(hOutFile); - if (ifs.pFile) GlobalFreePtr(ifs.pFile); - if (ifs.apIts) GlobalFreePtr(ifs.apIts); - - - pCurr = ots.pFirst; - while (pCurr) - { - pNext = pCurr->pNext; - GlobalFreePtr(pCurr); - pCurr = pNext; - } -} - -// -// BuildNewTracks -// -// This is where the actual work gets done. -// -// Until all tracks are done, -// Scan the tracks to find the next due event -// Figure out where the event belongs in the new mapping -// Put it there -// Add end of track metas to all new tracks that now have any data -// -// Return TRUE on success -// Prints its own error message if something goes wrong -// -static BOOL BuildNewTracks(void) -{ - INTRACKSTATE* pTs; - INTRACKSTATE* pTsFound; - UINT idx; - DWORD tkNext; - MEVENT me; - - for(;;) - { - // Find nearest event due - // - pTsFound = NULL; - tkNext = 0xFFFFFFFFL; - - for (idx = 0, pTs = ifs.apIts; idx < ifs.cTrack; ++idx, ++pTs) - if ((!(pTs->fdwTrack & ITS_F_ENDOFTRK)) && (pTs->tkNextEventDue < tkNext)) - { - tkNext = pTs->tkNextEventDue; - pTsFound = pTs; - } - - // None found? We must be done - // - if (!pTsFound) - break; - - // Ok, get the event header from that track - // - - if (!GetTrackEvent(pTsFound, &me)) - { - fprintf(stderr, "MIDI file is corrupt!\n"); - return FALSE; - } - - // Don't add end of track event 'til we're done - // - if (me.abEvent[0] == MIDI_META && me.abEvent[1] == MIDI_META_EOT) - continue; - - if (!AddEventToStream(&me)) - { - fprintf(stderr, "Out of memory building tracks.\n"); - return FALSE; - } - } - - return TRUE; -} - -// -// WriteStreamBuffers -// -// Write stream buffers into an MDS file (RIFF MIDS format) -// -// Return TRUE on success -// Prints its own error message if something goes wrong -// -#define FOURCC_MIDS mmioFOURCC('M','I','D','S') -#define FOURCC_fmt mmioFOURCC('f','m','t',' ') -#define FOURCC_data mmioFOURCC('d','a','t','a') - -static BOOL WriteStreamBuffers(void) -{ - DWORD cbFmt; - DWORD cbData; - DWORD cbRiff; - PSTREAMBUF psb; - FOURCC fcc; - FOURCC fcc2; - MIDSFMT fmt; - MIDSBUFFER data; - DWORD cb; - DWORD cBuffers; - - // Walk buffer list to find entire size of data chunk - // - cbData = sizeof(cBuffers); - cBuffers = 0; - for (psb = ots.pFirst; psb; psb = psb->pNext, ++cBuffers) - cbData += sizeof(MIDSBUFFER) + (CB_STREAMBUF - psb->cbLeft); - - cbFmt = sizeof(fmt); - - // Figure size of entire RIFF chunk - // - cbRiff = - sizeof(FOURCC) + // RIFF form type ('MIDS') - sizeof(FOURCC) + // Format chunk type ('fmt ') - sizeof(DWORD) + // Format chunk size - sizeof(MIDSFMT) + // Format chunk contents - sizeof(FOURCC) + // Data chunk type ('data') - sizeof(DWORD) + // Data chunk size - cbData; // Data chunk contents - - fcc = FOURCC_RIFF; - fcc2 = FOURCC_MIDS; - if ((!WriteFile(hOutFile, &fcc, sizeof(fcc), &cb, NULL)) || - (!WriteFile(hOutFile, &cbRiff, sizeof(cbRiff), &cb, NULL)) || - (!WriteFile(hOutFile, &fcc2, sizeof(fcc2), &cb, NULL))) - return FALSE; - - - fmt.dwTimeFormat = ifs.dwTimeDivision; - fmt.cbMaxBuffer = CB_STREAMBUF; - fmt.dwFlags = 0; - if (fCompress) - fmt.dwFlags |= MDS_F_NOSTREAMID; - - fcc = FOURCC_fmt; - if ((!WriteFile(hOutFile, &fcc, sizeof(fcc), &cb, NULL)) || - (!WriteFile(hOutFile, &cbFmt, sizeof(cbFmt), &cb, NULL)) || - (!WriteFile(hOutFile, &fmt, sizeof(fmt), &cb, NULL))) - return FALSE; - - fcc = FOURCC_data; - if ((!WriteFile(hOutFile, &fcc, sizeof(fcc), &cb, NULL)) || - (!WriteFile(hOutFile, &cbData, sizeof(cbData), &cb, NULL)) || - (!WriteFile(hOutFile, &cBuffers, sizeof(cBuffers), &cb, NULL))) - return FALSE; - - for (psb = ots.pFirst; psb; psb = psb->pNext) - { - data.tkStart = psb->tkStart; - data.cbBuffer = CB_STREAMBUF - psb->cbLeft; - - if ((!WriteFile(hOutFile, &data, sizeof(data), &cb, NULL)) || - (!WriteFile(hOutFile, psb->pBuffer, data.cbBuffer, &cb, NULL))) - return FALSE; - } - - return TRUE; -} - -// -// GetTrackVDWord -// -// Attempts to parse a variable length DWORD from the given track. A VDWord -// in a MIDI file -// (a) is in lo-hi format -// (b) has the high bit set on every byte except the last -// -// Returns the DWORD in *lpdw and TRUE on success; else -// FALSE if we hit end of track first. Sets ITS_F_ENDOFTRK -// if we hit end of track. -// -static BOOL GetTrackVDWord(INTRACKSTATE* pTs, LPDWORD lpdw) -{ - BYTE b; - DWORD dw = 0; - - if (pTs->fdwTrack & ITS_F_ENDOFTRK) - return FALSE; - - do - { - if (!pTs->cbLeft) - { - pTs->fdwTrack |= ITS_F_ENDOFTRK; - return FALSE; - } - - b = *pTs->pTrackPointer++; - --pTs->cbLeft; - - dw = (dw << 7) | (b & 0x7F); - } while (b & 0x80); - - *lpdw = dw; - - return TRUE; -} - -// -// GetTrackEvent -// -// Fills in the event struct with the next event from the track -// -// pMe->tkEvent will contain the absolute tick time of the event -// pMe->abEvent[0] will contain -// MIDI_META if the event is a meta event; -// in this case pMe->abEvent[1] will contain the meta class -// MIDI_SYSEX or MIDI_SYSEXEND if the event is a SysEx event -// Otherwise, the event is a channel message and pMe->abEvent[1] -// and pMe->abEvent[2] will contain the rest of the event. -// -// pMe->cbEvent will contain -// The total length of the channel message in pMe->abEvent if -// the event is a channel message -// The total length of the paramter data pointed to by -// pMe->pEvent otherwise -// -// pMe->pEvent will point at any additional paramters if the -// event is a SysEx or meta event with non-zero length; else -// it will contain NULL -// -// Returns TRUE on success or FALSE on any kind of parse error -// Prints its own error message ONLY in the debug version -// -// Maintains the state of the input track (i.e. pTs->cbLeft, -// pTs->pTrackPointers, and pTs->bRunningStatus). -// -static BOOL GetTrackEvent(INTRACKSTATE* pTs, MEVENT *pMe) -{ - BYTE b; - UINT cbEvent; - - pMe->pEvent = NULL; - - // Already at end of track? There's nothing to read. - // - if ((pTs->fdwTrack & ITS_F_ENDOFTRK) || !pTs->cbLeft) - return FALSE; - - // Get the first byte, which determines the type of event. - // - b = *pTs->pTrackPointer++; - --pTs->cbLeft; - - // If the high bit is not set, then this is a channel message - // which uses the status byte from the last channel message - // we saw. NOTE: We do not clear running status across SysEx or - // meta events even though the spec says to because there are - // actually files out there which contain that sequence of data. - // - if (!(b & 0x80)) - { - // No previous status byte? We're hosed. - // - if (!pTs->bRunningStatus) - { - TRACKERR(pTs, gteBadRunStat); - return FALSE; - } - - pMe->abEvent[0] = pTs->bRunningStatus; - pMe->abEvent[1] = b; - - b = pMe->abEvent[0] & 0xF0; - pMe->cbEvent = 2; - - // Only program change and channel pressure events are 2 bytes long; - // the rest are 3 and need another byte - // - if (b != MIDI_PRGMCHANGE && b != MIDI_CHANPRESS) - { - if (!pTs->cbLeft) - { - TRACKERR(pTs, gteRunStatMsgTrunc); - pTs->fdwTrack |= ITS_F_ENDOFTRK; - return FALSE; - } - - pMe->abEvent[2] = *pTs->pTrackPointer++; - --pTs->cbLeft; - ++pMe->cbEvent; - } - } - else if ((b & 0xF0) != MIDI_SYSEX) - { - // Not running status, not in SysEx range - must be - // normal channel message (0x80-0xEF) - // - pMe->abEvent[0] = b; - pTs->bRunningStatus = b; - - // Strip off channel and just keep message type - // - b &= 0xF0; - - cbEvent = (b == MIDI_PRGMCHANGE || b == MIDI_CHANPRESS) ? 1 : 2; - pMe->cbEvent = cbEvent + 1; - - if (pTs->cbLeft < cbEvent) - { - TRACKERR(pTs, gteChanMsgTrunc); - pTs->fdwTrack |= ITS_F_ENDOFTRK; - return FALSE; - } - - pMe->abEvent[1] = *pTs->pTrackPointer++; - if (cbEvent == 2) - pMe->abEvent[2] = *pTs->pTrackPointer++; - - pTs->cbLeft -= cbEvent; - } - else if (b == MIDI_SYSEX || b == MIDI_SYSEXEND) - { - // One of the SysEx types. (They are the same as far as we're concerned; - // there is only a semantic difference in how the data would actually - // get sent when the file is played. We must take care to put the correct - // event type back on the output track, however.) - // - // Parse the general format of: - // BYTE bEvent (MIDI_SYSEX or MIDI_SYSEXEND) - // VDWORD cbParms - // BYTE abParms[cbParms] - // - pMe->abEvent[0] = b; - if (!GetTrackVDWord(pTs, &pMe->cbEvent)) - { - TRACKERR(pTs, gteSysExLenTrunc); - return FALSE; - } - - if (pTs->cbLeft < pMe->cbEvent) - { - TRACKERR(pTs, gteSysExTrunc); - pTs->fdwTrack |= ITS_F_ENDOFTRK; - return FALSE; - } - - pMe->pEvent = pTs->pTrackPointer; - pTs->pTrackPointer += pMe->cbEvent; - pTs->cbLeft -= pMe->cbEvent; - } - else if (b == MIDI_META) - { - // It's a meta event. Parse the general form: - // BYTE bEvent (MIDI_META) - // BYTE bClass - // VDWORD cbParms - // BYTE abParms[cbParms] - // - pMe->abEvent[0] = b; - - if (!pTs->cbLeft) - { - TRACKERR(pTs, gteMetaNoClass); - pTs->fdwTrack |= ITS_F_ENDOFTRK; - return FALSE; - } - - pMe->abEvent[1] = *pTs->pTrackPointer++; - --pTs->cbLeft; - - if (!GetTrackVDWord(pTs, &pMe->cbEvent)) - { - TRACKERR(pTs, gteMetaLenTrunc); - return FALSE; - } - - // NOTE: Perfectly valid to have a meta with no data - // In this case, cbEvent == 0 and pEvent == NULL - // - if (pMe->cbEvent) - { - if (pTs->cbLeft < pMe->cbEvent) - { - TRACKERR(pTs, gteMetaTrunc); - pTs->fdwTrack |= ITS_F_ENDOFTRK; - return FALSE; - } - - pMe->pEvent = pTs->pTrackPointer; - pTs->pTrackPointer += pMe->cbEvent; - pTs->cbLeft -= pMe->cbEvent; - } - - if (pMe->abEvent[1] == MIDI_META_EOT) - pTs->fdwTrack |= ITS_F_ENDOFTRK; - } - else - { - // Messages in this range are system messages and aren't supposed to - // be in a normal MIDI file. If they are, we've misparsed or the - // authoring software is stpuid. - // - return FALSE; - } - - // Event time was already stored as the current track time - // - pMe->tkEvent = pTs->tkNextEventDue; - - // Now update to the next event time. The code above MUST properly - // maintain the end of track flag in case the end of track meta is - // missing. - // - if (!(pTs->fdwTrack & ITS_F_ENDOFTRK)) - { - DWORD tkDelta; - - if (!GetTrackVDWord(pTs, &tkDelta)) - return FALSE; - - pTs->tkNextEventDue += tkDelta; - } - - return TRUE; -} - -// -// AddEventToStream -// -// Put the given event onto the given output track. -// pMe must point to an event filled out in accordance with the -// description given in GetTrackEvent -// -// Returns TRUE on sucess or FALSE if we're out of memory -// -static BOOL AddEventToStream(MEVENT *pMe) -{ - PDWORD pdw; - DWORD tkNow; - DWORD tkDelta; - UINT cdw; - - tkNow = ots.tkTrack; - - // Delta time is absolute event time minus absolute time - // already gone by on this track - // - tkDelta = pMe->tkEvent - ots.tkTrack; - - // Event time is now current time on this track - // - ots.tkTrack = pMe->tkEvent; - - if (pMe->abEvent[0] < MIDI_SYSEX) - { - // Channel message. We know how long it is, just copy it. Need 3 DWORD's: delta-t, - // stream-ID, event - // - // TODO: Compress with running status - // - - cdw = (fCompress ? 2 : 3); - if (NULL == (pdw = (PDWORD)GetOutStreamBytes(tkNow, cdw * sizeof(DWORD), 3 * sizeof(DWORD)))) - return FALSE; - - *pdw++ = tkDelta; - if (!fCompress) - *pdw++ = 0; - *pdw = (pMe->abEvent[0]) | - (((DWORD)pMe->abEvent[1]) << 8) | - (((DWORD)pMe->abEvent[2]) << 16) | - MIDS_SHORTMSG; - - } - else if (pMe->abEvent[0] == MIDI_SYSEX || pMe->abEvent[0] == MIDI_SYSEXEND) - { - fprintf(stderr, "NOTE: Ignoring SysEx for now.\n"); - } - else - { - // Better be a meta event. - // BYTE bEvent - // BYTE bClass - // VDWORD cbParms - // BYTE abParms[cbParms] - // - assert(pMe->abEvent[0] == MIDI_META); - - // The only meta-event we care about is change tempo - // - if (pMe->abEvent[1] != MIDI_META_TEMPO) - return TRUE; - - assert(pMe->cbEvent == 3); - - cdw = (fCompress ? 2 : 3); - pdw = (PDWORD)GetOutStreamBytes(tkNow, cdw * sizeof(DWORD), 3 * sizeof(DWORD)); - if (NULL == pdw) - return FALSE; - - *pdw++ = tkDelta; - if (!fCompress) - *pdw++ = (DWORD)-1; - *pdw = (pMe->pEvent[2]) | - (((DWORD)pMe->pEvent[1]) << 8) | - (((DWORD)pMe->pEvent[0]) << 16) | - MIDS_TEMPO; - } - - return TRUE; -} - -// -// GetOutStreamBytes -// -// This function performs the memory management and pseudo-file I/O for output -// tracks. -// -// We build a linked list of stream buffers as they would exist if they were -// about to be played. Each buffer is CB_STREAMBUF bytes long maximum. They are -// filled as full as possible; events are not allowed to cross buffers. -// -// Returns a pointer to the number of requested bytes or NULL if we're out of memory -// -static LPBYTE GetOutStreamBytes(DWORD tkNow, DWORD cbNeeded, DWORD cbUncompressed) -{ - LPBYTE pb; - - // Round request up to the next DWORD boundry. This aligns the final output buffer correctly - // and allows the above routines to deal with byte-aligned data - // - cbNeeded = (cbNeeded + 3) & ~3; - cbUncompressed = (cbUncompressed + 3) & ~3; - - assert(cbUncompressed >= cbNeeded); - - if (NULL == ots.pLast || cbUncompressed > ots.pLast->cbLeftUncompressed) - { - PSTREAMBUF pNew; - - pNew = GlobalAllocPtr(GHND, sizeof(*pNew) + CB_STREAMBUF); - if (NULL == pNew) - return NULL; - - pNew->pBuffer = (LPBYTE)(pNew + 1); - pNew->tkStart = tkNow; - pNew->pbNextEvent = pNew->pBuffer; - pNew->cbLeft = CB_STREAMBUF; - pNew->cbLeftUncompressed = CB_STREAMBUF; - pNew->pNext = NULL; - - if (!ots.pLast) - { - ots.pFirst = pNew; - ots.pLast = pNew; - } - else - { - ots.pLast->pNext = pNew; - ots.pLast = pNew; - } - } - - // If there's STILL not enough room for the requested block, then an event is bigger than - // the buffer size -- this is unacceptable. - // - if (cbNeeded > ots.pLast->cbLeft) - { - fprintf(stderr, "NOTE: An event requested %lu bytes of memory; the\n", cbNeeded); - fprintf(stderr, " maximum configured buffer size is %lu.\n", (DWORD)CB_STREAMBUF); - - return NULL; - } - - pb = ots.pLast->pbNextEvent; - - ots.pLast->pbNextEvent += cbNeeded; - ots.pLast->cbLeft -= cbNeeded; - ots.pLast->cbLeftUncompressed -= cbUncompressed; - - return pb; -} - -#ifdef _DEBUG -static void ShowTrackError(INTRACKSTATE* pTs, char* szErr) -{ - fprintf(stderr, "Track %u: %s\n", pTs->nTrack, szErr); - fprintf(stderr, "Track offset %lu\n", (DWORD)(pTs->pTrackPointer - pTs->pTrack)); - fprintf(stderr, "Track total %lu Track left %lu\n", pTs->cbTrack, pTs->cbLeft); -} -#endif diff --git a/sdk/samples/mid2strm/mid2strm.def b/sdk/samples/mid2strm/mid2strm.def deleted file mode 100644 index a980c0f..0000000 --- a/sdk/samples/mid2strm/mid2strm.def +++ /dev/null @@ -1,9 +0,0 @@ -NAME mid2strm.exe - -DESCRIPTION 'Midi to Stream Conversion Utility (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE diff --git a/sdk/samples/mid2strm/mid2strm.mak b/sdk/samples/mid2strm/mid2strm.mak deleted file mode 100644 index bc5a240..0000000 --- a/sdk/samples/mid2strm/mid2strm.mak +++ /dev/null @@ -1,163 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "Mid2strm.mak" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "WinRel" -# PROP BASE Intermediate_Dir "WinRel" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "WinRel" -# PROP Intermediate_Dir "WinRel" -OUTDIR=.\WinRel -INTDIR=.\WinRel - -ALL : $(OUTDIR)/Mid2strm.exe $(OUTDIR)/Mid2strm.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FR /c -# ADD CPP /nologo /Zp4 /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FR /c -CPP_PROJ=/nologo /Zp4 /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"\ - /FR$(INTDIR)/ /Fp$(OUTDIR)/"Mid2strm.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\WinRel/ -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"Mid2strm.bsc" -BSC32_SBRS= \ - $(INTDIR)/mid2strm.sbr - -$(OUTDIR)/Mid2strm.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:console /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:console /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO\ - /SUBSYSTEM:console /INCREMENTAL:no /PDB:$(OUTDIR)/"Mid2strm.pdb"\ - /MACHINE:I386 /OUT:$(OUTDIR)/"Mid2strm.exe" -DEF_FILE= -LINK32_OBJS= \ - $(INTDIR)/mid2strm.obj - -$(OUTDIR)/Mid2strm.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "WinDebug" -# PROP BASE Intermediate_Dir "WinDebug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "WinDebug" -# PROP Intermediate_Dir "WinDebug" -OUTDIR=.\WinDebug -INTDIR=.\WinDebug - -ALL : $(OUTDIR)/Mid2strm.exe $(OUTDIR)/Mid2strm.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FR /c -# ADD CPP /nologo /Zp4 /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FR /c -CPP_PROJ=/nologo /Zp4 /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE"\ - /FR$(INTDIR)/ /Fp$(OUTDIR)/"Mid2strm.pch" /Fo$(INTDIR)/\ - /Fd$(OUTDIR)/"Mid2strm.pdb" /c -CPP_OBJS=.\WinDebug/ -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"Mid2strm.bsc" -BSC32_SBRS= \ - $(INTDIR)/mid2strm.sbr - -$(OUTDIR)/Mid2strm.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:console /DEBUG /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:console /DEBUG /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO\ - /SUBSYSTEM:console /INCREMENTAL:yes /PDB:$(OUTDIR)/"Mid2strm.pdb" /DEBUG\ - /MACHINE:I386 /OUT:$(OUTDIR)/"Mid2strm.exe" -DEF_FILE= -LINK32_OBJS= \ - $(INTDIR)/mid2strm.obj - -$(OUTDIR)/Mid2strm.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\mid2strm.c - -$(INTDIR)/mid2strm.obj : $(SOURCE) $(INTDIR) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/mid2strm/msvc.mk b/sdk/samples/mid2strm/msvc.mk deleted file mode 100644 index 2dddbfb..0000000 --- a/sdk/samples/mid2strm/msvc.mk +++ /dev/null @@ -1,40 +0,0 @@ -NAME = mid2strm -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = mid2strm.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:console --def:..\$(NAME).def -$(LIBS) -$(OBJS) -<< diff --git a/sdk/samples/mid2strm/readme.txt b/sdk/samples/mid2strm/readme.txt deleted file mode 100644 index 5986bc3..0000000 --- a/sdk/samples/mid2strm/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ -Mid2Strm Sample Readme File -=========================== - -This sample is related to the mstream sample, and contains a subset of the -functionality of mstream. - -Mid2strm converts a .mid file (standard midi file) into a format which can -be easily sent to the the midiStreamXxx APIs. It takes a .mid file as -input, and produces a .mds file as output. Note that .mds files are not -a standard Windows file format; for example, they can't be played back by -mplayer. Your application must play the file back by sending the data to -the midiStreamXxx APIs as shown in the mstream sample. - -The midiStreamXxx APIs expect a buffer containing 3 DWORDs per MIDI event: -the event, the time stamp, and the stream ID. The mid2strm sample will -create a buffer of this format and store it as a .mds file. Of course, -the file will be larger than the .mid file. To save space, you can specify -the -c option. This specifies that stream IDs should not be included in the -file, compressing the file by 1/3. This assumes that all stream IDs will be -zero; for most applications, this is sufficient. Note, however, that the -stream ID DWORD will have to be inserted into the buffer before it is sent -to the midiStreamXxx APIs. - -Please see the mstream readme file for more information. diff --git a/sdk/samples/misc/d3d.ico b/sdk/samples/misc/d3d.ico deleted file mode 100644 index bb39b7d..0000000 Binary files a/sdk/samples/misc/d3d.ico and /dev/null differ diff --git a/sdk/samples/misc/d3dapp.c b/sdk/samples/misc/d3dapp.c deleted file mode 100644 index 93f64f1..0000000 --- a/sdk/samples/misc/d3dapp.c +++ /dev/null @@ -1,1400 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dapp.c - * - * Top level D3DApp functions and internal global variables. See - * d3dapp.h for more information. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#include "d3dappi.h" -#include /* For D3DRM error codes only */ - -#define INITGUID - -/***************************************************************************/ -/* GLOBAL VARIABLES */ -/***************************************************************************/ -/* - * All DD and D3D objects which are also available to the application - * See d3dapp.h for typedef - */ -D3DAppInfo d3dappi; -/* - * Internal record of the render state. See d3dapp.h for typedef - */ -D3DAppRenderState d3dapprs; -/* - * Callback functions for D3D device creation and destruction - */ -BOOL(*D3DDeviceDestroyCallback)(LPVOID); -LPVOID D3DDeviceDestroyCallbackContext; -BOOL(*D3DDeviceCreateCallback)(int, int, LPDIRECT3DVIEWPORT*, LPVOID); -LPVOID D3DDeviceCreateCallbackContext; -/* - * The last error code and string - */ -HRESULT LastError; -char LastErrorString[256]; -/* - * List of dirty rectangles on back buffer and client area - */ -int NumDirtyClientRects, NumDirtyBackRects, NumDirtyZRects; -D3DRECT DirtyClient[D3DAPP_MAXCLEARRECTS]; -D3DRECT DirtyBack[D3DAPP_MAXCLEARRECTS]; -D3DRECT DirtyZ[D3DAPP_MAXCLEARRECTS]; -/* - * List of texture handles which is copied to D3DAppInfo structure when - * necessary - */ -D3DTEXTUREHANDLE MasterTextureHandle[D3DAPP_MAXTEXTURES]; - -LPDIRECTDRAWCLIPPER lpClipper; /* Clipper in windowed case */ -LPDIRECTDRAWPALETTE lpPalette; /* Front buffer's palette */ -PALETTEENTRY ppe[256]; /* Current palette entries */ -PALETTEENTRY Originalppe[256]; /* Windows palette entries at startup */ -BOOL bD3DAppInitialized; /* Is D3DApp initialized? */ -BOOL bPrimaryPalettized; /* Is the front buffer palettized? */ -BOOL bPaletteActivate; /* Is the front buffer's palette valid? */ -BOOL bIgnoreWM_SIZE; /* Ignore this WM_SIZE messages */ -SIZE szLastClient; /* Dimensions of the last window */ -SIZE szBuffers; /* Current buffer dimensions, not necessarily - the same as the client window */ -int CallbackRefCount; /* How many times DeviceCreateCallback has - been called in a row */ - -/***************************************************************************/ -/* FUNCTIONS */ -/***************************************************************************/ -/* - * D3DAppCreateFromHWND - */ -BOOL D3DAppCreateFromHWND(DWORD flags, HWND hwnd, - BOOL(*DeviceCreateCallback)(int, int, - LPDIRECT3DVIEWPORT*, - LPVOID), - LPVOID lpCreateContext, - BOOL(*DeviceDestroyCallback)(LPVOID), - LPVOID lpDestroyContext, - D3DAppInfo** D3DApp) -{ - int driver, mode, w, h; - /* - * Clean the global varaibles and check the flags - */ - D3DAppISetDefaults(); - if (flags & D3DAPP_ONLYSYSTEMMEMORY) { - d3dappi.bOnlySystemMemory = TRUE; - d3dappi.bOnlyEmulation = TRUE; - } - if (flags & D3DAPP_ONLYD3DEMULATION) - d3dappi.bOnlyEmulation = TRUE; - /* - * Create DirectDraw, remember the Windows display mode and enumerate the - * display modes - */ - ATTEMPT(D3DAppICreateDD(d3dappi.bOnlyEmulation ? - D3DAPP_ONLYDDEMULATION : 0L)); - ATTEMPT(D3DAppIRememberWindowsMode()); - ATTEMPT(D3DAppIEnumDisplayModes()); - /* - * Create Direct3D and enumerate the D3D drivers - */ - ATTEMPT(D3DAppICreateD3D()); - ATTEMPT(D3DAppIEnumDevices()); - /* - * Set the device creation and destroy callback functions - */ - D3DDeviceDestroyCallback = DeviceDestroyCallback; - D3DDeviceDestroyCallbackContext = lpDestroyContext; - D3DDeviceCreateCallback = DeviceCreateCallback; - D3DDeviceCreateCallbackContext = lpCreateContext; - *D3DApp = &d3dappi; - d3dappi.hwnd = hwnd; - /* - * Choose a driver and display mode. Using the current window is - * prefered, but a fullscreen mode may be selected. Set the cooperative - * level and create the front and back buffers for this mode. - */ - driver = D3DAPP_YOUDECIDE; - mode = D3DAPP_YOUDECIDE; - ATTEMPT(D3DAppIVerifyDriverAndMode(&driver, &mode)); - D3DAppIGetClientWin(hwnd); - if (mode == D3DAPP_USEWINDOW) { - w = d3dappi.szClient.cx; - h = d3dappi.szClient.cy; - ATTEMPT(D3DAppISetCoopLevel(hwnd, FALSE)); - ATTEMPT(D3DAppICreateBuffers(hwnd, w, h, D3DAPP_BOGUS, FALSE, - d3dappi.Driver[driver].bIsHardware)); - /* - * Change the currently selected mode if it's not compatible with - * this driver. Just to make sure that CurrMode is always a mode the - * current driver can do. - */ - if (!(d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth & - D3DAppIBPPToDDBD(d3dappi.Mode[d3dappi.CurrMode].bpp))){ - ATTEMPT(D3DAppIPickDisplayMode(&d3dappi.CurrMode, - d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth)); - } - } else { - szLastClient = d3dappi.szClient; - w = d3dappi.Mode[mode].w; - h = d3dappi.Mode[mode].h; - d3dappi.szClient.cx = w; d3dappi.szClient.cy = h; - ATTEMPT(D3DAppISetCoopLevel(hwnd, TRUE)); - ATTEMPT(D3DAppISetDisplayMode(w, h, d3dappi.Mode[mode].bpp)); - d3dappi.CurrMode = mode; - ATTEMPT(D3DAppICreateBuffers(hwnd, w, h, d3dappi.Mode[mode].bpp, TRUE, - d3dappi.Driver[driver].bIsHardware)); - } - /* - * If the front buffer is palettized, initialize its palette - */ - ATTEMPT(D3DAppICheckForPalettized()); - /* - * Create the Z-buffer - */ - ATTEMPT(D3DAppICreateZBuffer(w, h, driver)); - /* - * Create the D3D device, load the textures, call the device create - * callback and set a default render state - */ - ATTEMPT(D3DAppICreateDevice(driver)); - ATTEMPT(D3DAppILoadAllTextures()); - ATTEMPT(D3DAppIFilterDisplayModes(driver)); /* bThisDriverCanDo flags */ - ATTEMPT(D3DAppICallDeviceCreateCallback(w, h)); - ATTEMPT(D3DAppISetRenderState()); - /* - * Initialize dirty rectangle information - */ - D3DAppIValidateDirtyRects(); - /* - * Ready to render - */ - bD3DAppInitialized = TRUE; - d3dappi.bRenderingIsOK = TRUE; - return TRUE; - -exit_with_error: - D3DAppICallDeviceDestroyCallback(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - if (d3dappi.bFullscreen) { - D3DAppIRestoreDispMode(); - D3DAppISetCoopLevel(hwnd, FALSE); - } - RELEASE(d3dappi.lpD3D); - RELEASE(d3dappi.lpDD); - return FALSE; -} - -/* - * D3DAppFullscreen - */ -BOOL D3DAppFullscreen(int mode) -{ - int w, h, bpp; - BOOL b; /* was already in a fullscreen mode? */ - - d3dappi.bRenderingIsOK = FALSE; - /* - * Make sure this is a valid request, otherwise doctor mode so it will - * work with this driver. - */ - ATTEMPT(D3DAppIVerifyDriverAndMode(&d3dappi.CurrDriver, &mode)); - /* - * Release everything - */ - ATTEMPT(D3DAppICallDeviceDestroyCallback()); - if (d3dappi.bFullscreen) { - ATTEMPT(D3DAppIClearBuffers()); - } - D3DAppIReleaseAllTextures(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - /* - * Record information about the current status - */ - b = d3dappi.bFullscreen; - w = d3dappi.Mode[mode].w; - h = d3dappi.Mode[mode].h; - bpp = d3dappi.Mode[mode].bpp; - if (!b) { - /* - * If this is not a fullscreen mode, we'll need to record the window - * size for when we return to it. - */ - szLastClient = d3dappi.szClient; - } - /* - * Set the cooperative level and create front and back buffers - */ - d3dappi.szClient.cx = w; d3dappi.szClient.cy = h; - ATTEMPT(D3DAppISetCoopLevel(d3dappi.hwnd, TRUE)); - ATTEMPT(D3DAppISetDisplayMode(w, h, bpp)); - d3dappi.CurrMode = mode; - ATTEMPT(D3DAppICreateBuffers(d3dappi.hwnd, w, h, bpp, TRUE, - d3dappi.Driver[d3dappi.CurrDriver].bIsHardware)); - /* - * If the front buffer is palettized, initialize its palette - */ - ATTEMPT(D3DAppICheckForPalettized()); - /* - * Create the Z-buffer - */ - ATTEMPT(D3DAppICreateZBuffer(w, h, d3dappi.CurrDriver)); - /* - * Create the D3D device, load the textures, call the device create - * callback and set a default render state - */ - ATTEMPT(D3DAppICreateDevice(d3dappi.CurrDriver)); - ATTEMPT(D3DAppILoadAllTextures()); - ATTEMPT(D3DAppICallDeviceCreateCallback(w, h)); - ATTEMPT(D3DAppISetRenderState()); - /* - * Set current mode and clear dirty rectangle information - */ - d3dappi.CurrMode = mode; - D3DAppIValidateDirtyRects(); - d3dappi.bRenderingIsOK = TRUE; - return TRUE; - -exit_with_error: - D3DAppICallDeviceDestroyCallback(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - if (!b) { - D3DAppIRestoreDispMode(); - D3DAppISetCoopLevel(d3dappi.hwnd, FALSE); - } - return FALSE; -} - -/* - * D3DAppWindow - */ -BOOL -D3DAppWindow(int w, int h) -{ - BOOL b; /* changing from a fullscreen mode? */ - - if (!d3dappi.bIsPrimary) { - D3DAppISetErrorString("It is not possible to create a D3D window with a hardware DirectDraw device. Check the bIsPrimary flag before calling D3DAppWindow."); - return FALSE; - } - b = d3dappi.bFullscreen; - /* - * If asked to set the window size, return it to the last value or use - * a default value. - */ - if (w == D3DAPP_YOUDECIDE) { - w = b ? szLastClient.cx : D3DAPP_DEFAULTWINDOWDIM; - } - if (h == D3DAPP_YOUDECIDE) { - h = b ? szLastClient.cy : D3DAPP_DEFAULTWINDOWDIM; - } - /* - * Release everything - */ - d3dappi.bRenderingIsOK = FALSE; - ATTEMPT(D3DAppICallDeviceDestroyCallback()); - if (b) { - ATTEMPT(D3DAppIClearBuffers()); - } - D3DAppIReleaseAllTextures(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - /* - * Restore the display mode if we were in a fullscreen mode - */ - if (b) { - D3DAppIRestoreDispMode(); - } - /* - * Set the cooperative level and create front and back buffers - */ - D3DAppISetCoopLevel(d3dappi.hwnd, FALSE); - D3DAppISetClientSize(d3dappi.hwnd, w, h, b); - ATTEMPT(D3DAppICreateBuffers(d3dappi.hwnd, w, h, D3DAPP_BOGUS, FALSE, - d3dappi.Driver[d3dappi.CurrDriver].bIsHardware)); - /* - * If the front buffer is palettized, initialize its palette - */ - ATTEMPT(D3DAppICheckForPalettized()); - /* - * Create the Z-buffer - */ - ATTEMPT(D3DAppICreateZBuffer(szBuffers.cx, szBuffers.cy, - d3dappi.CurrDriver)); - /* - * Create the D3D device, load the textures, call the device create - * callback and set a default render state - */ - ATTEMPT(D3DAppICreateDevice(d3dappi.CurrDriver)); - ATTEMPT(D3DAppILoadAllTextures()); - ATTEMPT(D3DAppICallDeviceCreateCallback(szBuffers.cx, szBuffers.cy)); - ATTEMPT(D3DAppISetRenderState()); - /* - * Clear dirty rectangle information - */ - D3DAppIValidateDirtyRects(); - d3dappi.bRenderingIsOK = TRUE; - return TRUE; - -exit_with_error: - D3DAppICallDeviceDestroyCallback(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - return FALSE; -} - - -/* - * D3DAppChangeDriver - */ -BOOL -D3DAppChangeDriver(int driver, DWORD flags) -{ - int mode; - - /* - * Verify the compatibility of this mode with the specified driver. - * The mode may change. - */ - if (d3dappi.bFullscreen) - mode = d3dappi.CurrMode; - else - mode = D3DAPP_USEWINDOW; - ATTEMPT(D3DAppIVerifyDriverAndMode(&driver, &mode)); - if (driver == D3DAPP_BOGUS || mode == D3DAPP_BOGUS) - goto exit_with_error; - /* - * Update the current driver and set bThisDriverCanDo flags - */ - d3dappi.CurrDriver = driver; - ATTEMPT(D3DAppIFilterDisplayModes(driver)); - /* - * Either call D3DAppWindow or D3DAppFullscreen depending on mode - */ - if (mode == D3DAPP_USEWINDOW) { - if (d3dappi.bFullscreen) { - /* - * We need to switch to a window. D3DApp will either use the - * size of the last window it saw or use a default size. - */ - ATTEMPT(D3DAppWindow(D3DAPP_YOUDECIDE, D3DAPP_YOUDECIDE)); - } else { - /* - * We need to recreate the current window. Don't let D3DApp - * decide on the size. - */ - ATTEMPT(D3DAppWindow(d3dappi.szClient.cx, d3dappi.szClient.cy)); - } - /* - * Change the currently selected mode if it's not compatible with - * this driver. Just to make sure that CurrMode is always a mode the - * current driver can do. - */ - if (!(d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth & - D3DAppIBPPToDDBD(d3dappi.Mode[d3dappi.CurrMode].bpp))){ - ATTEMPT(D3DAppIPickDisplayMode(&d3dappi.CurrMode, - d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth)); - } - return TRUE; - } else { - /* - * We need to switch to fullscreen or switch fullscreen modes or stay - * in the same fullscreen mode. In any of these cases, we call the - * same function. - */ - ATTEMPT(D3DAppFullscreen(mode)); - return TRUE; - } - -exit_with_error: - /* - * The failed mode setting call would have released everything - */ - return FALSE; -} - - -/* - * D3DAppWindowProc - */ -BOOL -D3DAppWindowProc(BOOL* bStopProcessing, LRESULT* lresult, HWND hwnd, - UINT message, WPARAM wParam, LPARAM lParam) -{ - PAINTSTRUCT ps; - *bStopProcessing = FALSE; - if (!bD3DAppInitialized) - return TRUE; - /* - * Look for messages which effect rendering. In some cases, we will not - * want the app to continue processing the message, so set the flag and - * provide a return value in lresult. - */ - switch(message) { - case WM_SIZE: - if (!bIgnoreWM_SIZE) { - /* - * Too long to fit here, see ddcalls.c. Updates the buffers - * and re-creates the device. - */ - ATTEMPT(D3DAppIHandleWM_SIZE(lresult, d3dappi.hwnd, message, - wParam, lParam)); - *bStopProcessing = TRUE; - } - break; - case WM_MOVE: - /* - * Update client window position information - */ - d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0; - ClientToScreen(hwnd, &d3dappi.pClientOnPrimary); - break; - case WM_ACTIVATE: - /* - * Set the front buffer's palette - */ - if (bPaletteActivate && bPrimaryPalettized && - d3dappi.lpFrontBuffer) { - d3dappi.lpFrontBuffer->lpVtbl->SetPalette(d3dappi.lpFrontBuffer, - lpPalette); - } - break; - case WM_ACTIVATEAPP: - d3dappi.bAppActive = (BOOL)wParam; - break; - case WM_SETCURSOR: - /* - * Prevent the cursor from being shown in fullscreen - */ - if (d3dappi.bFullscreen && !d3dappi.bPaused) { - SetCursor(NULL); - *lresult = 1; - *bStopProcessing = TRUE; - return TRUE; - } - break; - case WM_MOVING: - /* - * Prevent the window from moving in fullscreen - */ - if (d3dappi.bFullscreen) { - GetWindowRect(hwnd, (LPRECT)lParam); - *lresult = 1; - *bStopProcessing = TRUE; - return TRUE; - } - break; - case WM_GETMINMAXINFO: - /* - * Ensure the window won't resize in fullscreen - */ - if (d3dappi.bFullscreen) { - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x= d3dappi.ThisMode.w; - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y= d3dappi.ThisMode.h; - ((LPMINMAXINFO)lParam)->ptMinTrackSize.x= d3dappi.ThisMode.w; - ((LPMINMAXINFO)lParam)->ptMinTrackSize.y= d3dappi.ThisMode.h; - *lresult = 0; - *bStopProcessing = TRUE; - return TRUE; - } else { - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = - d3dappi.WindowsDisplay.w; - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = - d3dappi.WindowsDisplay.h; - *lresult = 0; - *bStopProcessing = TRUE; - return TRUE; - } - break; - case WM_PAINT: - /* - * Clear the rectangle and blt the backbuffer image - */ - BeginPaint(hwnd, &ps); - if (d3dappi.bRenderingIsOK && !d3dappi.bFullscreen) { - D3DAppShowBackBuffer(D3DAPP_SHOWALL); - } - D3DAppIValidateDirtyRects(); - EndPaint(hwnd, &ps); - *lresult = 1; - *bStopProcessing = TRUE; - return TRUE; - case WM_NCPAINT: - /* - * When in fullscreen mode, don't draw the window frame. - */ - if (d3dappi.bFullscreen && !d3dappi.bPaused) { - *lresult = 0; - *bStopProcessing = TRUE; - return TRUE; - } - break; - } - return TRUE; - -exit_with_error: - return FALSE; -} - -/* - * D3DAppAddTexture - */ -BOOL -D3DAppAddTexture(const char* imagefile) -{ - if (d3dappi.NumTextures == D3DAPP_MAXTEXTURES - 1) { - D3DAppISetErrorString("Can only load %i textures.", D3DAPP_MAXTEXTURES); - return FALSE; - } - lstrcpy(d3dappi.ImageFile[d3dappi.NumTextures], imagefile); - /* - * If this driver does texture mapping, load the texture. - * This test also tests that a device has been created. - */ - if (d3dappi.ThisDriver.bDoesTextures && d3dappi.NumUsableTextures == d3dappi.NumTextures) { - BOOL bInVideo; - ATTEMPT(D3DAppILoadTextureSurf(d3dappi.NumTextures, &bInVideo)); - if (!bInVideo && d3dappi.ThisDriver.bIsHardware) { - D3DAppIReleaseTexture(d3dappi.NumTextures); - } else { - ATTEMPT(D3DAppIGetTextureHandle(d3dappi.NumTextures)); - ++d3dappi.NumUsableTextures; - } - } - d3dappi.NumTextures++; - return TRUE; - -exit_with_error: - d3dappi.ImageFile[d3dappi.NumTextures][0] = 0; - return FALSE; -} - -/* - * D3DAppChangeTextureFormat - */ -BOOL -D3DAppChangeTextureFormat(int format) -{ - /* - * Release all the textures, change the format and load them again - */ - d3dappi.bRenderingIsOK = FALSE; - D3DAppIReleaseAllTextures(); - d3dappi.CurrTextureFormat = format; - memcpy(&d3dappi.ThisTextureFormat, &d3dappi.TextureFormat[format], - sizeof(D3DAppTextureFormat)); - ATTEMPT(D3DAppILoadAllTextures()); - d3dappi.bRenderingIsOK = TRUE; - return TRUE; - -exit_with_error: - D3DAppIReleaseAllTextures(); - return FALSE; -} - -/* - * D3DAppDisableTextures - */ -BOOL -D3DAppDisableTextures(BOOL flag) -{ - int i; - if (flag == d3dappi.bTexturesDisabled) - return TRUE; - if (flag) { - /* - * Set all the texture handles to 0 - */ - d3dappi.bTexturesDisabled = TRUE; - for (i = 0; i < d3dappi.NumTextures; i++) - d3dappi.TextureHandle[i] = 0; - } else { - /* - * Restore the texture handles from the master array - */ - d3dappi.bTexturesDisabled = FALSE; - memcpy(d3dappi.TextureHandle, MasterTextureHandle, - sizeof(D3DTEXTUREHANDLE) * D3DAPP_MAXTEXTURES); - } - return TRUE; -} - -/* - * D3DAppSwapTextures - */ -BOOL -D3DAppSwapTextures() -{ - int i; - char tempfile[30]; - LPDIRECT3DTEXTURE lptempTexture; - LPDIRECTDRAWSURFACE lptempSurface; - if (d3dappi.bTexturesDisabled || d3dappi.NumTextures == 0) { - D3DAppISetErrorString("Cannot swap textures which are disable or not loaded.\n"); - goto exit_with_error; - } - if (!d3dappi.ThisDriver.bDoesTextures) - return TRUE; - /* - * Swap texture 1 with 2, then 2 with 3, then 3 with 4, etc. - * Don't forget the image file names, texture objects and surfaces - */ - for (i = 0; i < d3dappi.NumUsableTextures - 1; i++) { - lstrcpy(tempfile, d3dappi.ImageFile[i]); - lstrcpy(d3dappi.ImageFile[i], d3dappi.ImageFile[i+1]); - lstrcpy(d3dappi.ImageFile[i+1], tempfile); - d3dappi.lpD3DDevice->lpVtbl->SwapTextureHandles(d3dappi.lpD3DDevice, - d3dappi.lpTexture[i], - d3dappi.lpTexture[i+1]); - lptempTexture = d3dappi.lpTexture[i]; - d3dappi.lpTexture[i] = d3dappi.lpTexture[i+1]; - d3dappi.lpTexture[i+1] = lptempTexture; - lptempSurface = d3dappi.lpTextureSurf[i]; - d3dappi.lpTextureSurf[i] = d3dappi.lpTextureSurf[i+1]; - d3dappi.lpTextureSurf[i+1] = lptempSurface; - } - return TRUE; -exit_with_error: - return FALSE; -} - -/* - * D3DAppSetRenderState - */ -BOOL -D3DAppSetRenderState(D3DAppRenderState* lpState) -{ - /* - * If none was provided, reset the current render state. - */ - if (!lpState) - lpState = &d3dapprs; - /* - * Record this render state and set it. - */ - if (lpState != &d3dapprs) - memcpy(&d3dapprs, lpState, sizeof(D3DAppRenderState)); - if (d3dappi.bRenderingIsOK) { - ATTEMPT(D3DAppISetRenderState()); - } - return TRUE; - -exit_with_error: - return FALSE; -} - -/* - * D3DAppGetRenderState - */ -BOOL -D3DAppGetRenderState(D3DAppRenderState* lpState) -{ - memcpy(lpState, &d3dapprs, sizeof(D3DAppRenderState)); - return TRUE; -} - -/* - * D3DAppShowBackBuffer - */ -BOOL -D3DAppShowBackBuffer(DWORD flags) -{ - if (!d3dappi.bRenderingIsOK) { - D3DAppISetErrorString("Cannot call D3DAppShowBackBuffer while bRenderingIsOK is FALSE.\n"); - return FALSE; - } - if (d3dappi.bPaused) - return TRUE; - if (d3dappi.bFullscreen) { - int numtemp; - D3DRECT temp[D3DAPP_MAXCLEARRECTS]; - /* - * Flip the back and front buffers - */ - LastError = d3dappi.lpFrontBuffer->lpVtbl->Flip(d3dappi.lpFrontBuffer, - d3dappi.lpBackBuffer, - 1); - if (LastError == DDERR_SURFACELOST) { - d3dappi.lpFrontBuffer->lpVtbl->Restore(d3dappi.lpFrontBuffer); - d3dappi.lpBackBuffer->lpVtbl->Restore(d3dappi.lpBackBuffer); - D3DAppIClearBuffers(); - } else if (LastError != DD_OK) { - D3DAppISetErrorString("Flipping complex display surface failed.\n%s", D3DAppErrorToString(LastError)); - return FALSE; - } - if (d3dappi.bBackBufferInVideo) { - /* - * This is a real flip, so the client and back buffer dirty - * rectangles also flip - */ - D3DAppICopyRectList(&numtemp, temp, NumDirtyClientRects, - DirtyClient); - D3DAppICopyRectList(&NumDirtyClientRects, DirtyClient, - NumDirtyBackRects, DirtyBack); - D3DAppICopyRectList(&NumDirtyBackRects, DirtyBack, numtemp, temp); - } else { - /* - * The flip is being emulated as a blt from a system memory back - * buffer, so the back buffer's dirty rectangles are now also the - * client's. - */ - D3DAppICopyRectList(&NumDirtyClientRects, DirtyClient, - NumDirtyBackRects, DirtyBack); - } - } else { - int NumFrontRects, NumBufferRects, i; - RECT front[D3DAPP_MAXCLEARRECTS]; - RECT buffer[D3DAPP_MAXCLEARRECTS]; - /* - * Set the rectangle to blt from the back to front bufer - */ - if (flags & D3DAPP_SHOWALL) { - /* - * Set to entire client window - */ - NumBufferRects = 1; - SetRect(&buffer[0], 0, 0, d3dappi.szClient.cx, - d3dappi.szClient.cy); - SetRect(&front[0], - d3dappi.pClientOnPrimary.x, d3dappi.pClientOnPrimary.y, - d3dappi.szClient.cx + d3dappi.pClientOnPrimary.x, - d3dappi.szClient.cy + d3dappi.pClientOnPrimary.y); - } else { - /* - * Merge the back and front buffer dirty rectangle lists to get - * a list of rectangles to blt. This will simultaneously clear - * the smallest front buffer region while blt'ing all the back - * buffer which changed. - */ - D3DAppIMergeRectLists(&NumBufferRects, (LPD3DRECT)buffer, - NumDirtyClientRects, DirtyClient, - NumDirtyBackRects, DirtyBack); - D3DAppICopyRectList(&NumFrontRects, (LPD3DRECT)front, - NumBufferRects, (LPD3DRECT)buffer); - for (i = 0; i < NumFrontRects; i++) { - front[i].top += d3dappi.pClientOnPrimary.y; - front[i].left += d3dappi.pClientOnPrimary.x; - front[i].bottom += d3dappi.pClientOnPrimary.y; - front[i].right += d3dappi.pClientOnPrimary.x; - } - } - /* - * Blt the list of rectangles from the back to front buffer - */ - for (i = 0; i < NumBufferRects; i++) { - LastError = - d3dappi.lpFrontBuffer->lpVtbl->Blt(d3dappi.lpFrontBuffer, - &front[i], d3dappi.lpBackBuffer, - &buffer[i], DDBLT_WAIT, NULL); - if (LastError == DDERR_SURFACELOST) { - d3dappi.lpFrontBuffer->lpVtbl->Restore(d3dappi.lpFrontBuffer); - d3dappi.lpBackBuffer->lpVtbl->Restore(d3dappi.lpBackBuffer); - D3DAppIClearBuffers(); - } else if (LastError != DD_OK) { - D3DAppISetErrorString("Blt of back buffer to front buffer failed.\n%s", D3DAppErrorToString(LastError)); - return FALSE; - } - } - /* - * The back buffer's dirty rectangles are now also the client's - */ - D3DAppICopyRectList(&NumDirtyClientRects, DirtyClient, - NumDirtyBackRects, DirtyBack); - } - return TRUE; -} - -/* - * D3DAppRenderExtents - */ -BOOL -D3DAppRenderExtents(DWORD dwCount, LPD3DRECT extent, DWORD flags) -{ - if (dwCount > D3DAPP_MAXCLEARRECTS) { - D3DAppISetErrorString("The number of clear rectangles exceeded D3DAPP_MAXCLEARRECTS."); - return FALSE; - } - if (flags & D3DAPP_CLEARALL) { - /* - * Set the back buffer dirty rectangle to the entire client area - */ - D3DRECT dummy; - dummy.x1 = dummy.y1 = 0; - dummy.x2 = d3dappi.szClient.cx; - dummy.y2 = d3dappi.szClient.cy; - D3DAppICopyRectList(&NumDirtyBackRects, DirtyBack, 1, &dummy); - D3DAppICopyRectList(&NumDirtyClientRects, DirtyClient, 1, &dummy); - D3DAppICopyRectList(&NumDirtyZRects, DirtyZ, 1, &dummy); - } else { - /* - * Set the back and Z buffer dirty rectangle list as specified - */ - D3DAppICopyRectList(&NumDirtyBackRects, DirtyBack, dwCount, extent); - D3DAppICopyRectList(&NumDirtyZRects, DirtyZ, dwCount, extent); - } - return TRUE; -} - -/* - * D3DAppClearBackBuffer - */ -BOOL -D3DAppClearBackBuffer(DWORD flags) -{ - if (!d3dappi.bRenderingIsOK) { - D3DAppISetErrorString("Cannot call D3DAppClearBackBuffer while bRenderingIsOK is FALSE.\n"); - return FALSE; - } - if (flags & D3DAPP_CLEARALL) { - /* - * Clear the entire back buffer - */ - int clearflags; - D3DRECT dummy; - /* - * Decided wether to clear just back buffer or also z-buffer - */ - clearflags = D3DCLEAR_TARGET; - if (d3dapprs.bZBufferOn) - clearflags |= D3DCLEAR_ZBUFFER; - dummy.x1 = dummy.y1 = 0; - dummy.x2 = d3dappi.szClient.cx; - dummy.y2 = d3dappi.szClient.cy; - LastError = - d3dappi.lpD3DViewport->lpVtbl->Clear(d3dappi.lpD3DViewport, - 1, &dummy, - clearflags); - if (LastError != D3D_OK) { - D3DAppISetErrorString("Viewport clear failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - } else { - /* - * Clear the dirty rectangles on the back buffer - */ - LastError = - d3dappi.lpD3DViewport->lpVtbl->Clear(d3dappi.lpD3DViewport, - NumDirtyBackRects, - DirtyBack, D3DCLEAR_TARGET); - if (LastError != D3D_OK) { - D3DAppISetErrorString("Viewport clear of back buffer failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - /* - * Clear the dirty rectangles on the Z buffer - */ - LastError = - d3dappi.lpD3DViewport->lpVtbl->Clear(d3dappi.lpD3DViewport, - NumDirtyZRects, - DirtyZ, D3DCLEAR_ZBUFFER); - if (LastError != D3D_OK) { - D3DAppISetErrorString("Viewport clear of Z buffer failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - - } - return TRUE; -} - -/* - * D3DAppCheckForLostSurfaces - */ -#define CHECKSURF(x) if (x) { \ - if (x->lpVtbl->IsLost(x) == DDERR_SURFACELOST) { \ - LastError = x->lpVtbl->Restore(x); \ - if (LastError != DD_OK) goto exit_with_error; \ - b = TRUE; \ - } \ - } -BOOL -D3DAppCheckForLostSurfaces(void) -{ - int i; - BOOL b = FALSE; - /* - * Check all the surfaces D3DApp owns and restore them if lost. - */ - CHECKSURF(d3dappi.lpFrontBuffer); - CHECKSURF(d3dappi.lpBackBuffer); - CHECKSURF(d3dappi.lpZBuffer); - if (b) { - /* - * If any of the surfaces were lost and restored, clear all the buffers. - * If this fails, that's fine, just move on. - */ - D3DAppIClearBuffers(); - } - for (i = 0; i < d3dappi.NumUsableTextures; i++) { - b = FALSE; - CHECKSURF(d3dappi.lpTextureSurf[i]); - if (b) { - ATTEMPT(D3DAppIReloadTextureSurf(i)); - } - } - return TRUE; - -exit_with_error: - D3DAppISetErrorString("Restoring of a lost surface failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; -} - -/* - * D3DAppPause - */ -BOOL -D3DAppPause(BOOL flag) -{ - static int pausecount; - - /* - * Keep a count of the number of times D3DAppPause has been called to - * prevent pausing more than once in a row. - */ - if (pausecount != 0) { - if (flag) { - ++pausecount; - return TRUE; - } else { - --pausecount; - if (pausecount != 0) - return TRUE; - } - } - - d3dappi.bPaused = flag; - if (!flag) { - /* - * Returning from a pause - */ - if (d3dappi.bFullscreen && bPrimaryPalettized && lpPalette) { - /* - * Set front buffer's palette back to what it was before pause - */ - LastError = lpPalette->lpVtbl->SetEntries(lpPalette, 0, 0, 256, - &ppe[0]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Setting palette entries during unpause failed.\n%s", D3DAppErrorToString(LastError)); - goto exit_with_error; - } - } - /* - * Dirty rectangle info is no longer valid - */ - D3DAppIValidateDirtyRects(); - } - if (flag && d3dappi.bFullscreen) { - /* - * Pausing in a fullscreen mode - */ - if (bPrimaryPalettized && lpPalette) { - /* - * Save the front buffer's current palette and restore the - * original Windows palette. - */ - int i; - LastError = lpPalette->lpVtbl->GetEntries(lpPalette, 0, 0, 256, - &ppe[0]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Getting palette entries before a pause failed.\n%s", D3DAppErrorToString(LastError)); - goto exit_with_error; - } - for (i = 10; i < 246; i++) - Originalppe[i] = ppe[i]; - LastError = lpPalette->lpVtbl->SetEntries(lpPalette, 0, 0, 256, - &Originalppe[0]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Returning palette entries to defaults failed.\n%s", D3DAppErrorToString(LastError)); - goto exit_with_error; - } - } - /* - * Flip to GDI surface (either front or back buffer) - */ - if (d3dappi.bIsPrimary && d3dappi.lpDD) { - LastError = d3dappi.lpDD->lpVtbl->FlipToGDISurface(d3dappi.lpDD); - if (LastError != DD_OK) { - D3DAppISetErrorString("Flipping to GDI surface failed.\n%s", D3DAppErrorToString(LastError)); - goto exit_with_error; - } - } - /* - * Draw the menu and frame - */ - DrawMenuBar(d3dappi.hwnd); - RedrawWindow(d3dappi.hwnd, NULL, NULL, RDW_FRAME); - } - return TRUE; -exit_with_error: - return FALSE; -} - -/* - * D3DAppCreateSurface - */ -BOOL -D3DAppCreateSurface(DDSURFACEDESC *ddsd, LPDIRECTDRAWSURFACE *lplpSurf) -{ - return D3DAppICreateSurface(ddsd, lplpSurf); -} - -/* - * D3DAppLastError - */ -HRESULT -D3DAppLastError(void) -{ - return LastError; -} - -/* - * D3DAppLastD3DAppISetErrorString - */ -char* -D3DAppLastErrorString(void) -{ - return LastErrorString; -} - - -/* - * D3DAppDestroy - */ -BOOL -D3DAppDestroy(void) -{ - /* - * Destroys all objects including Direct Draw. - */ - d3dappi.bRenderingIsOK = FALSE; - d3dappi.hwnd = NULL; - ATTEMPT(D3DAppICallDeviceDestroyCallback()); - D3DAppIReleaseAllTextures(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - if (d3dappi.bFullscreen) { - D3DAppIRestoreDispMode(); - D3DAppISetCoopLevel(d3dappi.hwnd, FALSE); - } - D3DAppIReleasePathList(); - RELEASE(d3dappi.lpD3D); - RELEASE(d3dappi.lpDD); - return TRUE; -exit_with_error: - return FALSE; -} - - -/* - * D3DAppErrorToString - */ -char* -D3DAppErrorToString(HRESULT error) -{ - switch(error) { - case DD_OK: - return "No error.\0"; - case DDERR_ALREADYINITIALIZED: - return "This object is already initialized.\0"; - case DDERR_BLTFASTCANTCLIP: - return "Return if a clipper object is attached to the source surface passed into a BltFast call.\0"; - case DDERR_CANNOTATTACHSURFACE: - return "This surface can not be attached to the requested surface.\0"; - case DDERR_CANNOTDETACHSURFACE: - return "This surface can not be detached from the requested surface.\0"; - case DDERR_CANTCREATEDC: - return "Windows can not create any more DCs.\0"; - case DDERR_CANTDUPLICATE: - return "Can't duplicate primary & 3D surfaces, or surfaces that are implicitly created.\0"; - case DDERR_CLIPPERISUSINGHWND: - return "An attempt was made to set a cliplist for a clipper object that is already monitoring an hwnd.\0"; - case DDERR_COLORKEYNOTSET: - return "No src color key specified for this operation.\0"; - case DDERR_CURRENTLYNOTAVAIL: - return "Support is currently not available.\0"; - case DDERR_DIRECTDRAWALREADYCREATED: - return "A DirectDraw object representing this driver has already been created for this process.\0"; - case DDERR_EXCEPTION: - return "An exception was encountered while performing the requested operation.\0"; - case DDERR_EXCLUSIVEMODEALREADYSET: - return "An attempt was made to set the cooperative level when it was already set to exclusive.\0"; - case DDERR_GENERIC: - return "Generic failure.\0"; - case DDERR_HEIGHTALIGN: - return "Height of rectangle provided is not a multiple of reqd alignment.\0"; - case DDERR_HWNDALREADYSET: - return "The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.\0"; - case DDERR_HWNDSUBCLASSED: - return "HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.\0"; - case DDERR_IMPLICITLYCREATED: - return "This surface can not be restored because it is an implicitly created surface.\0"; - case DDERR_INCOMPATIBLEPRIMARY: - return "Unable to match primary surface creation request with existing primary surface.\0"; - case DDERR_INVALIDCAPS: - return "One or more of the caps bits passed to the callback are incorrect.\0"; - case DDERR_INVALIDCLIPLIST: - return "DirectDraw does not support the provided cliplist.\0"; - case DDERR_INVALIDDIRECTDRAWGUID: - return "The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.\0"; - case DDERR_INVALIDMODE: - return "DirectDraw does not support the requested mode.\0"; - case DDERR_INVALIDOBJECT: - return "DirectDraw received a pointer that was an invalid DIRECTDRAW object.\0"; - case DDERR_INVALIDPARAMS: - return "One or more of the parameters passed to the function are incorrect.\0"; - case DDERR_INVALIDPIXELFORMAT: - return "The pixel format was invalid as specified.\0"; - case DDERR_INVALIDPOSITION: - return "Returned when the position of the overlay on the destination is no longer legal for that destination.\0"; - case DDERR_INVALIDRECT: - return "Rectangle provided was invalid.\0"; - case DDERR_LOCKEDSURFACES: - return "Operation could not be carried out because one or more surfaces are locked.\0"; - case DDERR_NO3D: - return "There is no 3D present.\0"; - case DDERR_NOALPHAHW: - return "Operation could not be carried out because there is no alpha accleration hardware present or available.\0"; - case DDERR_NOBLTHW: - return "No blitter hardware present.\0"; - case DDERR_NOCLIPLIST: - return "No cliplist available.\0"; - case DDERR_NOCLIPPERATTACHED: - return "No clipper object attached to surface object.\0"; - case DDERR_NOCOLORCONVHW: - return "Operation could not be carried out because there is no color conversion hardware present or available.\0"; - case DDERR_NOCOLORKEY: - return "Surface doesn't currently have a color key\0"; - case DDERR_NOCOLORKEYHW: - return "Operation could not be carried out because there is no hardware support of the destination color key.\0"; - case DDERR_NOCOOPERATIVELEVELSET: - return "Create function called without DirectDraw object method SetCooperativeLevel being called.\0"; - case DDERR_NODC: - return "No DC was ever created for this surface.\0"; - case DDERR_NODDROPSHW: - return "No DirectDraw ROP hardware.\0"; - case DDERR_NODIRECTDRAWHW: - return "A hardware-only DirectDraw object creation was attempted but the driver did not support any hardware.\0"; - case DDERR_NOEMULATION: - return "Software emulation not available.\0"; - case DDERR_NOEXCLUSIVEMODE: - return "Operation requires the application to have exclusive mode but the application does not have exclusive mode.\0"; - case DDERR_NOFLIPHW: - return "Flipping visible surfaces is not supported.\0"; - case DDERR_NOGDI: - return "There is no GDI present.\0"; - case DDERR_NOHWND: - return "Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.\0"; - case DDERR_NOMIRRORHW: - return "Operation could not be carried out because there is no hardware present or available.\0"; - case DDERR_NOOVERLAYDEST: - return "Returned when GetOverlayPosition is called on an overlay that UpdateOverlay has never been called on to establish a destination.\0"; - case DDERR_NOOVERLAYHW: - return "Operation could not be carried out because there is no overlay hardware present or available.\0"; - case DDERR_NOPALETTEATTACHED: - return "No palette object attached to this surface.\0"; - case DDERR_NOPALETTEHW: - return "No hardware support for 16 or 256 color palettes.\0"; - case DDERR_NORASTEROPHW: - return "Operation could not be carried out because there is no appropriate raster op hardware present or available.\0"; - case DDERR_NOROTATIONHW: - return "Operation could not be carried out because there is no rotation hardware present or available.\0"; - case DDERR_NOSTRETCHHW: - return "Operation could not be carried out because there is no hardware support for stretching.\0"; - case DDERR_NOT4BITCOLOR: - return "DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.\0"; - case DDERR_NOT4BITCOLORINDEX: - return "DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.\0"; - case DDERR_NOT8BITCOLOR: - return "DirectDrawSurface is not in 8 bit color mode and the requested operation requires 8 bit color.\0"; - case DDERR_NOTAOVERLAYSURFACE: - return "Returned when an overlay member is called for a non-overlay surface.\0"; - case DDERR_NOTEXTUREHW: - return "Operation could not be carried out because there is no texture mapping hardware present or available.\0"; - case DDERR_NOTFLIPPABLE: - return "An attempt has been made to flip a surface that is not flippable.\0"; - case DDERR_NOTFOUND: - return "Requested item was not found.\0"; - case DDERR_NOTLOCKED: - return "Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.\0"; - case DDERR_NOTPALETTIZED: - return "The surface being used is not a palette-based surface.\0"; - case DDERR_NOVSYNCHW: - return "Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.\0"; - case DDERR_NOZBUFFERHW: - return "Operation could not be carried out because there is no hardware support for zbuffer blitting.\0"; - case DDERR_NOZOVERLAYHW: - return "Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.\0"; - case DDERR_OUTOFCAPS: - return "The hardware needed for the requested operation has already been allocated.\0"; - case DDERR_OUTOFMEMORY: - return "DirectDraw does not have enough memory to perform the operation.\0"; - case DDERR_OUTOFVIDEOMEMORY: - return "DirectDraw does not have enough memory to perform the operation.\0"; - case DDERR_OVERLAYCANTCLIP: - return "The hardware does not support clipped overlays.\0"; - case DDERR_OVERLAYCOLORKEYONLYONEACTIVE: - return "Can only have ony color key active at one time for overlays.\0"; - case DDERR_OVERLAYNOTVISIBLE: - return "Returned when GetOverlayPosition is called on a hidden overlay.\0"; - case DDERR_PALETTEBUSY: - return "Access to this palette is being refused because the palette is already locked by another thread.\0"; - case DDERR_PRIMARYSURFACEALREADYEXISTS: - return "This process already has created a primary surface.\0"; - case DDERR_REGIONTOOSMALL: - return "Region passed to Clipper::GetClipList is too small.\0"; - case DDERR_SURFACEALREADYATTACHED: - return "This surface is already attached to the surface it is being attached to.\0"; - case DDERR_SURFACEALREADYDEPENDENT: - return "This surface is already a dependency of the surface it is being made a dependency of.\0"; - case DDERR_SURFACEBUSY: - return "Access to this surface is being refused because the surface is already locked by another thread.\0"; - case DDERR_SURFACEISOBSCURED: - return "Access to surface refused because the surface is obscured.\0"; - case DDERR_SURFACELOST: - return "Access to this surface is being refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have Restore called on it.\0"; - case DDERR_SURFACENOTATTACHED: - return "The requested surface is not attached.\0"; - case DDERR_TOOBIGHEIGHT: - return "Height requested by DirectDraw is too large.\0"; - case DDERR_TOOBIGSIZE: - return "Size requested by DirectDraw is too large, but the individual height and width are OK.\0"; - case DDERR_TOOBIGWIDTH: - return "Width requested by DirectDraw is too large.\0"; - case DDERR_UNSUPPORTED: - return "Action not supported.\0"; - case DDERR_UNSUPPORTEDFORMAT: - return "FOURCC format requested is unsupported by DirectDraw.\0"; - case DDERR_UNSUPPORTEDMASK: - return "Bitmask in the pixel format requested is unsupported by DirectDraw.\0"; - case DDERR_VERTICALBLANKINPROGRESS: - return "Vertical blank is in progress.\0"; - case DDERR_WASSTILLDRAWING: - return "Informs DirectDraw that the previous Blt which is transfering information to or from this Surface is incomplete.\0"; - case DDERR_WRONGMODE: - return "This surface can not be restored because it was created in a different mode.\0"; - case DDERR_XALIGN: - return "Rectangle provided was not horizontally aligned on required boundary.\0"; - case D3DERR_BADMAJORVERSION: - return "D3DERR_BADMAJORVERSION\0"; - case D3DERR_BADMINORVERSION: - return "D3DERR_BADMINORVERSION\0"; - case D3DERR_EXECUTE_LOCKED: - return "D3DERR_EXECUTE_LOCKED\0"; - case D3DERR_EXECUTE_NOT_LOCKED: - return "D3DERR_EXECUTE_NOT_LOCKED\0"; - case D3DERR_EXECUTE_CREATE_FAILED: - return "D3DERR_EXECUTE_CREATE_FAILED\0"; - case D3DERR_EXECUTE_DESTROY_FAILED: - return "D3DERR_EXECUTE_DESTROY_FAILED\0"; - case D3DERR_EXECUTE_LOCK_FAILED: - return "D3DERR_EXECUTE_LOCK_FAILED\0"; - case D3DERR_EXECUTE_UNLOCK_FAILED: - return "D3DERR_EXECUTE_UNLOCK_FAILED\0"; - case D3DERR_EXECUTE_FAILED: - return "D3DERR_EXECUTE_FAILED\0"; - case D3DERR_EXECUTE_CLIPPED_FAILED: - return "D3DERR_EXECUTE_CLIPPED_FAILED\0"; - case D3DERR_TEXTURE_NO_SUPPORT: - return "D3DERR_TEXTURE_NO_SUPPORT\0"; - case D3DERR_TEXTURE_NOT_LOCKED: - return "D3DERR_TEXTURE_NOT_LOCKED\0"; - case D3DERR_TEXTURE_LOCKED: - return "D3DERR_TEXTURELOCKED\0"; - case D3DERR_TEXTURE_CREATE_FAILED: - return "D3DERR_TEXTURE_CREATE_FAILED\0"; - case D3DERR_TEXTURE_DESTROY_FAILED: - return "D3DERR_TEXTURE_DESTROY_FAILED\0"; - case D3DERR_TEXTURE_LOCK_FAILED: - return "D3DERR_TEXTURE_LOCK_FAILED\0"; - case D3DERR_TEXTURE_UNLOCK_FAILED: - return "D3DERR_TEXTURE_UNLOCK_FAILED\0"; - case D3DERR_TEXTURE_LOAD_FAILED: - return "D3DERR_TEXTURE_LOAD_FAILED\0"; - case D3DERR_MATRIX_CREATE_FAILED: - return "D3DERR_MATRIX_CREATE_FAILED\0"; - case D3DERR_MATRIX_DESTROY_FAILED: - return "D3DERR_MATRIX_DESTROY_FAILED\0"; - case D3DERR_MATRIX_SETDATA_FAILED: - return "D3DERR_MATRIX_SETDATA_FAILED\0"; - case D3DERR_SETVIEWPORTDATA_FAILED: - return "D3DERR_SETVIEWPORTDATA_FAILED\0"; - case D3DERR_MATERIAL_CREATE_FAILED: - return "D3DERR_MATERIAL_CREATE_FAILED\0"; - case D3DERR_MATERIAL_DESTROY_FAILED: - return "D3DERR_MATERIAL_DESTROY_FAILED\0"; - case D3DERR_MATERIAL_SETDATA_FAILED: - return "D3DERR_MATERIAL_SETDATA_FAILED\0"; - case D3DERR_LIGHT_SET_FAILED: - return "D3DERR_LIGHT_SET_FAILED\0"; - case D3DRMERR_BADOBJECT: - return "D3DRMERR_BADOBJECT\0"; - case D3DRMERR_BADTYPE: - return "D3DRMERR_BADTYPE\0"; - case D3DRMERR_BADALLOC: - return "D3DRMERR_BADALLOC\0"; - case D3DRMERR_FACEUSED: - return "D3DRMERR_FACEUSED\0"; - case D3DRMERR_NOTFOUND: - return "D3DRMERR_NOTFOUND\0"; - case D3DRMERR_NOTDONEYET: - return "D3DRMERR_NOTDONEYET\0"; - case D3DRMERR_FILENOTFOUND: - return "The file was not found.\0"; - case D3DRMERR_BADFILE: - return "D3DRMERR_BADFILE\0"; - case D3DRMERR_BADDEVICE: - return "D3DRMERR_BADDEVICE\0"; - case D3DRMERR_BADVALUE: - return "D3DRMERR_BADVALUE\0"; - case D3DRMERR_BADMAJORVERSION: - return "D3DRMERR_BADMAJORVERSION\0"; - case D3DRMERR_BADMINORVERSION: - return "D3DRMERR_BADMINORVERSION\0"; - case D3DRMERR_UNABLETOEXECUTE: - return "D3DRMERR_UNABLETOEXECUTE\0"; - default: - return "Unrecognized error value.\0"; - } -} diff --git a/sdk/samples/misc/d3dapp.h b/sdk/samples/misc/d3dapp.h deleted file mode 100644 index e00f159..0000000 --- a/sdk/samples/misc/d3dapp.h +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dapp.h - * - * Header to be included in source using D3DApp. Contains D3DApp function - * prototypes and defines. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#ifndef __D3DAPP_H__ -#define __D3DAPP_H__ - -#define INITGUID - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * DEFINES - */ -#define D3DAPP_WINDOWMINIMUM 50 /* smallest buffer size allowed */ -#define D3DAPP_DEFAULTWINDOWDIM 320 /* replaces window size if invalid */ -#define D3DAPP_MINBUFFERSIZE 15360 /* minimum "maximum buffer size" for a - D3D driver to be accepted */ -#define D3DAPP_MINVERTEXCOUNT 320 /* minimum "maximum vertex count" for a - D3D driver to be accepted */ -#define D3DAPP_MAXD3DDRIVERS 5 /* maximum Direct3D drivers ever expected - to find */ -#define D3DAPP_MAXTEXTUREFORMATS 50 /* maximum texture formats */ -#define D3DAPP_MAXMODES 50 /* maximum display modes ever expected to - be reported by DirectDraw */ -#define D3DAPP_MAXTEXTURES 15 /* maximum number of textures that wil be - loaded and managed */ -#define D3DAPP_MAXCLEARRECTS 30 /* maximum num. rectangles (ie extents) - for clearing */ -#define D3DAPP_BOGUS -100 /* unused parameters accept this */ -#define D3DAPP_YOUDECIDE -25 /* Use this for certain parameters to - have D3DApp decide an appropriate - value for you */ -#define D3DAPP_USEWINDOW -24 /* Used in place of fullscreen mode */ - -/* - * DATA STRUCTURES - */ - -/* - * D3DAppD3DDriver structure - * Describes a D3D driver - */ -typedef struct tagD3DAppD3DDriver { - char Name[30]; /* short name of the driver */ - char About[50]; /* short string about the driver */ - D3DDEVICEDESC Desc; /* D3DDEVICEDESC for complete information */ - GUID Guid; /* it's GUID */ - BOOL bIsHardware; /* does this driver represent a hardware device? */ - BOOL bDoesTextures; /* does this driver do texture mapping? */ - BOOL bDoesZBuffer; /* can this driver use a z-buffer? */ - BOOL bCanDoWindow; /* can it render to Window's display depth? */ -} D3DAppD3DDriver; - -/* - * D3DAppTextureFormat stucture - * Describes a texture format - */ -typedef struct tagD3DAppTextureFormat { - DDSURFACEDESC ddsd; /* DDSURFACEDESC for complete information */ - BOOL bPalettized; /* is this format palettized */ - int RedBPP; /* number of red, */ - int BlueBPP; /* blue, */ - int GreenBPP; /* and green bits per pixel */ - int IndexBPP; /* number of bits in palette index */ -} D3DAppTextureFormat; - -/* - * D3DAppMode structure - * Describes a display mode - */ -typedef struct tagD3DAppMode { - int w; /* width */ - int h; /* height */ - int bpp; /* bits per pixel */ - BOOL bThisDriverCanDo; /*can current D3D driver render in this mode?*/ -} D3DAppMode; - -/* - * D3DAppInfo structure - * Contains all the information D3DApp makes available to the application. A - * pointer to the internal, read only copy is returned by the initializing - * function. - */ -typedef struct tagD3DAppInfo { - HWND hwnd; /*handle of window being managed*/ - /* - * Direct3D objects and information - */ - LPDIRECT3D lpD3D; /* D3D object */ - LPDIRECT3DDEVICE lpD3DDevice; /* D3D device */ - LPDIRECT3DVIEWPORT lpD3DViewport; /* D3D viewport, created by - application */ - int NumDrivers; /* number of D3D drivers avail. */ - int CurrDriver; /* number of curr. D3D driver */ - D3DAppD3DDriver Driver[D3DAPP_MAXD3DDRIVERS]; /* avail. drivers*/ - D3DAppD3DDriver ThisDriver; /* description of this driver, - identical to Driver[CurrDriver] */ - - int NumTextureFormats; /* num texture formats avail*/ - int CurrTextureFormat; /* current texture format - will only change if driver changes or when app changes it*/ - D3DAppTextureFormat TextureFormat[D3DAPP_MAXTEXTUREFORMATS]; - /* description of all avail. formats */ - D3DAppTextureFormat ThisTextureFormat; /* description of this format, - identical to TextureFormat[CurrTextureFormat] */ - - int NumTextures; /* number of textures in D3DApp's - texture list */ - char ImageFile[D3DAPP_MAXTEXTURES][50]; /* files */ - D3DTEXTUREHANDLE TextureHandle[D3DAPP_MAXTEXTURES]; /* handles */ - LPDIRECTDRAWSURFACE lpTextureSurf[D3DAPP_MAXTEXTURES]; /* surfaces */ - LPDIRECT3DTEXTURE lpTexture[D3DAPP_MAXTEXTURES]; /* texture objs */ - int NumUsableTextures; /* the number of currently usable - textures (e.g. for a hardware - device there may not be enough - video memory*/ - /* - * DirectDraw objects and information - */ - LPDIRECTDRAW lpDD; /* DirectDraw object */ - BOOL bIsPrimary; /* Is this the primary DD device? - If FALSE, we're using a hardware DD device that cannot - display a window and so only fullscreen modes are available */ - LPDIRECTDRAWSURFACE lpFrontBuffer; /* front buffer surface */ - LPDIRECTDRAWSURFACE lpBackBuffer; /* back buffer surface */ - LPDIRECTDRAWSURFACE lpZBuffer; /* z-buffer surface */ - BOOL bBackBufferInVideo; /* back buf in video mem? */ - BOOL bZBufferInVideo; /* is Z-buf in video mem? */ - - int NumModes; /* number of available display modes */ - int CurrMode; /* number of current display mode (only - when fullscreen) */ - D3DAppMode Mode[D3DAPP_MAXMODES]; /* desc avail modes */ - D3DAppMode ThisMode; /* description of this mode, identical - to Mode[CurrMode] */ - BOOL bFullscreen; /* in fullscreen exclusive mode? */ - D3DAppMode WindowsDisplay; /* current Windows disply mode */ - - SIZE szClient; /* dimensions of client win */ - POINT pClientOnPrimary; /* position of client win */ - - BOOL bPaused; /* the app is paused */ - BOOL bAppActive; /* the app is active */ - BOOL bTexturesDisabled; /* textures are disabled */ - BOOL bOnlySystemMemory; /* all surfaces forced into - system memory */ - BOOL bOnlyEmulation; /* no hardware DD or D3D - devices allowed */ - BOOL bMinimized; /* app window is minimized */ - BOOL bRenderingIsOK; /* All objects etc. necessary - for rendering are in ok */ -} D3DAppInfo; - -/* - * D3DAppRenderState structure - * The "render state" is the status of this collection of D3D options and - * variables. This structure is used to get and set the render state. The - * render state will only change during program initialization and when - * the application sets it. - */ -typedef struct tagD3DAppRenderState { - BOOL bZBufferOn; /* Z buffer is on */ - BOOL bPerspCorrect; /* perspective correction is on */ - D3DSHADEMODE ShadeMode; /* flat, gouraud, phong? */ - D3DTEXTUREFILTER TextureFilter; /* linear or bi-linear texture filter */ - D3DTEXTUREBLEND TextureBlend; /* Use shade mode or copy mode? */ - D3DFILLMODE FillMode; /* solid, lines or points? */ - BOOL bDithering; /* dithering is on */ - BOOL bSpecular; /* specular highlights are on */ - BOOL bAntialiasing; /* anti-aliasing is on */ - - BOOL bFogEnabled; /* fog is on */ - D3DCOLOR FogColor; /* fog color */ - D3DFOGMODE FogMode; /* linear, exp. etc. */ - D3DVALUE FogStart; /* begining depth */ - D3DVALUE FogEnd; /* ending depth */ -} D3DAppRenderState; - -/* - * FUNCTION PROTOTYPES - */ - -/* - * D3DAppCreateFromHWND - * - * Call this before all other D3DApp functions (except AddTexture). - * Initializes all DD and D3D objects necessary for rendering, enumerates the - * available display modes and drivers and loads textures specified by prior - * AddTexture() calls. Caller passes the handle of the window to be manged - * and callback functions to execute for device creation and destruction. - * - * DeviceCreateCallback is executed AFTER the creation of D3D device and all - * objects D3DApp created using the device. This allows an application to - * reconstruct the scene and create any additional objects. The callback - * must create and return (in the variable provided) the DIRECT3DVIEWPORT - * from the given width and height. The returned pointer is stored in the - * D3DAppInfo structure and used for clearing and setting the render state. - * A NULL pointer is fine if D3DApp is not used for either of these - * functions. The create callback will always be called before any calls to - * the destroy callback. The boolean returned indicates success or failure. - * - * DeviceDestroyCallback is executed BEFORE the D3D device and objects - * created by D3DApp using the device are released. This allows an - * application to save data regarding the scene or release any objects - * created from the device before it is destroyed. The DIRECT3DVIEWPORT - * should be released in this callback. The boolean returned indicates the - * success or failure. - * - * A pointer to the internal D3DAppInfo data structure is returned. This - * should be READ ONLY! - * - * The DirectDraw device, Direct3D driver, display mode and texture format - * will all be chosen by D3DApp. Hardware DD and D3D devices are prefered. - * Mono lighting D3D drivers are prefered. Paletted texture formats are - * prefered. If possible, the current window size will be used, otherwise - * a fullscreen mode will be selected. - * - * Call AddTexture() to add textures to be loaded upon initialization. - * - * Valid flags: - * D3DAPP_ONLYSYSTEMMEMORY Force all surfaces into system memory. Also - * disables hardware DD and D3D drivers. - * D3DAPP_ONLYD3DEMULATION Disable D3D hardware - * D3DAPP_ONLYDDEMULATION Disable DD hardware - */ -#define D3DAPP_ONLYSYSTEMMEMORY 0x00000001 -#define D3DAPP_ONLYD3DEMULATION 0x00000002 -#define D3DAPP_ONLYDDEMULATION 0x00000004 -BOOL D3DAppCreateFromHWND(DWORD flags, HWND hwnd, - BOOL(*DeviceCreateCallback)(int, int, - LPDIRECT3DVIEWPORT*, - LPVOID), - LPVOID lpCreateContext, - BOOL(*DeviceDestroyCallback)(LPVOID), - LPVOID lpDestroyContext, - D3DAppInfo** D3DApp); - -/* - * D3DAppWindowProc - * To be truly effective, D3DApp should be allowed to trap incoming window - * messages such as WM_SIZE. Call D3DAppWindowProc at the begining of the - * application's main window WindowProc with the message information. If - * bStopProcessing is set to TRUE, stop processing the message and return - * lresult. - */ -BOOL D3DAppWindowProc(BOOL* bStopProcessing, LRESULT* lresult, HWND hwnd, - UINT message, WPARAM wParam, LPARAM lParam); - -/* - * D3DAppFullscreen - * Places the app in a fullscreen mode using the current driver. - */ -BOOL D3DAppFullscreen(int mode); - -/* - * D3DAppWindow - * Places the application in windowed mode at the given client size. If w - * and h are D3DAPP_YOUDECIDE, D3DApp will decide on a suitable client size. - * If called while in fullscreen, restores the display mode and returns the - * hooked window to the size it was before a call to D3DAppFullscreen or to - * the size specified. - */ -BOOL D3DAppWindow(int w, int h); - -/* - * D3DAppChangeDriver - * Changes the driver. If the current display mode is incompatible with the - * driver, a new one will be selected and employed. A new texture format is - * selected and textures are reloaded, hence their handles may change. By - * default, paletted formats are prefered. - */ -BOOL D3DAppChangeDriver(int driver, DWORD flags); - -/* - * D3DAppAddTexture - * D3DApp has an internal list of textures which it maintains. The image - * files will be reloaded when necessary and the texture handles, objects and - * surfaces will always be up to date and available in the D3DAppInfo - * structure. D3DAppAddTextures adds the given PPM image file to this - * list. - * - * This is the only function which can be called before CreateD3DAppFromHWND. - * Use it to create a list of textures to load during this creation function. - * - * The handles and texture objects will change when the device or texture - * format changes. To react to changes in the texture objects and surfaces, - * use the callback for D3D device creation/release and make necessary - * changes whenever calling D3DAppChangeTextureFormat. - * - * Image files are searched for in the current directory, D3DPATH env var, - * and the "Software\Microsoft\Direct3D\4.0\D3D Path" registry entry. - * - */ -BOOL D3DAppAddTexture(const char* imagefile); - -/* - * D3DAppChangeTextureFormat - * Changes all textures to the given format. Texture handles and objects - * will change. - */ -BOOL D3DAppChangeTextureFormat(int format); - -/* - * D3DAppDisableTextures - * Disables the textures by turning handles to NULL. If the driver changes, - * textures are not loaded until this state is toggled by another call with a - * TRUE flag. - */ -BOOL D3DAppDisableTextures(BOOL flag); - -/* - * D3DAppSwapTextures - * Swaps first texture with the second, second with third, etc. while keeping - * the handles array the same. - */ -BOOL D3DAppSwapTextures(void); - -/* - * D3DAppSetRenderState - * Uses a D3D execute buffer to set the render state. If lpState is NULL, - * the current settings are reset. - */ -BOOL D3DAppSetRenderState(D3DAppRenderState* lpState); - -/* - * D3DAppGetRenderState - * Returns the current render state. - */ -BOOL D3DAppGetRenderState(D3DAppRenderState* lpState); - -/* - * D3DAppShowBackBuffer - * Blts or flips the back buffer to the primary surface. In the windowed - * case, only the dirty portion of the front buffer is blt'ed over. The - * dirty region of front and back buffers is maintained by calls to - * D3DAppRenderExtents(). D3DAPP_SHOWALL will force the entire front buffer - * to be updated. - */ -#define D3DAPP_SHOWALL 0x00000001 -BOOL D3DAppShowBackBuffer(DWORD flags); - -/* - * D3DAppRenderExtents - * Tells D3DApp the extents of all regions updated on the back buffer as a - * list of D3DRECTs (no more than D3DAPP_MAXCLEARRECTS). Call this before - * clearing the back buffer. If the D3DAPP_CLEARALL flag is set, the extents - * are ignored and the entire back buffer is assumed to have changed. - */ -#define D3DAPP_CLEARALL 0x00000001 -BOOL D3DAppRenderExtents(DWORD dwCount, LPD3DRECT extent, DWORD flags); - -/* - * D3DAppClearBackBuffer - * Clears the back buffer and Z-buffer (if enabled). D3DAPP_CLEARALL can be - * used to clear the entire back buffer. - */ -#define D3DAPP_CLEARALL 0x00000001 -BOOL D3DAppClearBackBuffer(DWORD flags); - -/* - * D3DAppCheckForLostSurfaces - * Checks all surfaces D3DApp has allocated and restores them if necessary. - * An error is returned on any type of failure, but it may be best to ignore - * it since restoring surface can fail for non-fatal reasons and the app may - * just want to spin. - */ -BOOL D3DAppCheckForLostSurfaces(void); - -/* - * D3DAppPause - * Use D3DAppPause(TRUE) to pause the app and D3DAppPause(FALSE) to unpause. - * When fullscreen, the menu bar is redrawn. bPaused is updated to reflect - * the current status. - */ -BOOL D3DAppPause(BOOL flag); - -/* - * D3DAppErrorToString - * Converts a DirectDraw, Direct3D or Direct3D RM error code to a string. - */ -char* D3DAppErrorToString(HRESULT error); - -/* - * D3DAppCreateSurface - * Creates a surface described by ddsd. Will force the surface into - * systemmemory if D3DApp was initialized with D3DAPP_ONLYSYSTEMMEMORY. - */ -BOOL D3DAppCreateSurface(DDSURFACEDESC *ddsd, LPDIRECTDRAWSURFACE *lplpSurf); - -/* - * D3DAppLastError - * D3DAppLastErrorString - * Returns the last D3DApp error as a string and HRESULT. - */ -HRESULT D3DAppLastError(void); -char* D3DAppLastErrorString(void); - -/* - * D3DAppDestroy - * Destroys all objects including Direct Draw. Call before program - * termination. - */ -BOOL D3DAppDestroy(void); - -#ifdef __cplusplus -}; -#endif - -#endif // __D3DAPP_H__ diff --git a/sdk/samples/misc/d3dappi.h b/sdk/samples/misc/d3dappi.h deleted file mode 100644 index 2165552..0000000 --- a/sdk/samples/misc/d3dappi.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dappi.h - * - * Internal header. Part of D3DApp. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#ifndef __D3DAPPI_H__ -#define __D3DAPPI_H__ - -/* - * INCLUDED HEADERS - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "d3dapp.h" -#include "d3dmacs.h" -#include "lclib.h" /* lclib is a override for standard string lib */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * MACROS - */ -#undef ATTEMPT -#define ATTEMPT(x) if (!(x)) goto exit_with_error -#undef RELEASE -#define RELEASE(x) if (x) { x->lpVtbl->Release(x); x = NULL; } -#undef MAX -#define MAX(x, y) ((x) > (y)) ? (x) : (y) -#undef MIN -#define MIN(x, y) ((x) > (y)) ? (y) : (x) -#undef ZEROMEM -#define ZEROMEM(x) memset(&x, 0, sizeof(x)) - -/* - * GLOBAL VARIABLES - * see d3dapp.c for descriptions - */ -extern D3DAppInfo d3dappi; -extern D3DAppRenderState d3dapprs; -extern BOOL bD3DAppInitialized; -extern HRESULT LastError; -extern LPDIRECTDRAWCLIPPER lpClipper; -extern LPDIRECTDRAWPALETTE lpPalette; -extern BOOL(*D3DDeviceDestroyCallback)(LPVOID); -extern LPVOID D3DDeviceDestroyCallbackContext; -extern BOOL(*D3DDeviceCreateCallback)(int, int, LPDIRECT3DVIEWPORT*, LPVOID); -extern LPVOID D3DDeviceCreateCallbackContext; -extern BOOL bPrimaryPalettized; -extern BOOL bPaletteActivate; -extern BOOL bIgnoreWM_SIZE; -extern PALETTEENTRY ppe[256]; -extern PALETTEENTRY Originalppe[256]; -extern char LastErrorString[256]; -extern SIZE szLastClient; -extern SIZE szBuffers; -extern int NumDirtyClientRects, NumDirtyBackRects, NumDirtyZRects; -extern D3DRECT DirtyClient[D3DAPP_MAXCLEARRECTS]; -extern D3DRECT DirtyBack[D3DAPP_MAXCLEARRECTS]; -extern D3DRECT DirtyZ[D3DAPP_MAXCLEARRECTS]; -extern D3DTEXTUREHANDLE MasterTextureHandle[D3DAPP_MAXTEXTURES]; -extern int CallbackRefCount; - -#ifdef __cplusplus -}; -#endif - -/* - * INTERNAL FUNCTION PROTOTYPES - */ -BOOL D3DAppISetRenderState(void); -BOOL D3DAppIEnumDevices(void); -BOOL D3DAppIPickDriver(int* driver, DWORD depths); -BOOL D3DAppICreateD3D(void); -BOOL D3DAppIEnumTextureFormats(void); -BOOL D3DAppICreateZBuffer(int w, int h, int driver); -BOOL D3DAppICreateDevice(int driver); -BOOL D3DAppILoadTextureSurf(int n, BOOL* bInVideo); -BOOL D3DAppIGetTextureHandle(int n); -BOOL D3DAppILoadAllTextures(void); -void D3DAppIReleaseTexture(int n); -void D3DAppIReleaseAllTextures(void); -BOOL D3DAppIReloadTextureSurf(int n); -BOOL D3DAppISetCoopLevel(HWND hwnd, BOOL bFullscreen); -BOOL D3DAppISetDisplayMode(int w, int h, int bpp); -BOOL D3DAppICheckForPalettized(void); -BOOL D3DAppIRestoreDispMode(void); -BOOL D3DAppIVerifyDriverAndMode(int* lpdriver, int* lpmode); -BOOL D3DAppIFilterDrivers(int mode); -DWORD D3DAppTotalVideoMemory(void); -BOOL D3DAppIEnumDisplayModes(void); -BOOL D3DAppIPickDisplayMode(int* mode, DWORD depths); -BOOL D3DAppISetDispMode(int w, int h, int bpp); -BOOL D3DAppICreateDD(DWORD flags); -BOOL D3DAppIFilterDisplayModes(int driver); -HRESULT D3DAppICreateSurface(LPDDSURFACEDESC lpDDSurfDesc, - LPDIRECTDRAWSURFACE FAR *lpDDSurface); -HRESULT D3DAppIGetSurfDesc(LPDDSURFACEDESC lpDDSurfDesc, - LPDIRECTDRAWSURFACE lpDDSurf); -BOOL D3DAppICreateBuffers(HWND hwnd, int w, int h, int bpp, BOOL bFullscreen, BOOL bIsHardware); -BOOL D3DAppIRememberWindowsMode(void); -BOOL D3DAppIClearBuffers(void); -DWORD D3DAppIBPPToDDBD(int bpp); -void D3DAppIReleasePathList(void); -LPDIRECTDRAWSURFACE D3DAppILoadSurface(LPDIRECTDRAW lpDD, LPCSTR lpName, - LPDDSURFACEDESC lpFormat, - DWORD memoryflag); -void D3DAppISetClientSize(HWND hwnd, int w,int h,BOOL bReturnFromFullscreen); -void D3DAppIGetClientWin(HWND hwnd); -void D3DAppISetDefaults(void); -BOOL D3DAppICallDeviceDestroyCallback(void); -BOOL D3DAppICallDeviceCreateCallback(int w, int h); -void D3DAppIMergeRectLists(int* dstnum, LPD3DRECT dst, int src1num, - LPD3DRECT src1, int src2num, LPD3DRECT src2); -void D3DAppICopyRectList(int* dstnum, LPD3DRECT dst, int srcnum, - LPD3DRECT src); -void D3DAppIValidateDirtyRects(void); -BOOL D3DAppIHandleWM_SIZE(LRESULT* lresult, HWND hwnd, UINT message, - WPARAM wParam, LPARAM lParam); -void D3DAppISetErrorString( LPSTR fmt, ... ); - -void __cdecl dpf( LPSTR fmt, ... ); - - -#endif // __D3DAPPI_H__ diff --git a/sdk/samples/misc/d3dcalls.c b/sdk/samples/misc/d3dcalls.c deleted file mode 100644 index 5678c5f..0000000 --- a/sdk/samples/misc/d3dcalls.c +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dcalls.c - * - * Calls to Direct3D objects needed for rendering. Part of D3DApp. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#define INITGUID -#include "d3dappi.h" - -/***************************************************************************/ -/* Creation of D3D */ -/***************************************************************************/ -BOOL -D3DAppICreateD3D(void) -{ - LastError = d3dappi.lpDD->lpVtbl->QueryInterface(d3dappi.lpDD, - &IID_IDirect3D, (LPVOID*)&d3dappi.lpD3D); - if (LastError != DD_OK) { - D3DAppISetErrorString("Creation of IDirect3D failed.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - return TRUE; -exit_with_error: - return FALSE; -} - -/***************************************************************************/ -/* D3D Device Enumeration */ -/***************************************************************************/ -/* - * enumDeviceFunc - * Device enumeration callback. Record information about the D3D device - * reported by D3D. - */ -static HRESULT -WINAPI enumDeviceFunc(LPGUID lpGuid, LPSTR lpDeviceDescription, - LPSTR lpDeviceName, LPD3DDEVICEDESC lpHWDesc, - LPD3DDEVICEDESC lpHELDesc, LPVOID lpContext) -{ - lpContext = lpContext; - /* - * Don't accept any hardware D3D devices if emulation only option is set - */ - if (lpHWDesc->dcmColorModel && d3dappi.bOnlyEmulation) - return D3DENUMRET_OK; - /* - * Record the D3D driver's inforamation - */ - memcpy(&d3dappi.Driver[d3dappi.NumDrivers].Guid, lpGuid, sizeof(GUID)); - lstrcpy(d3dappi.Driver[d3dappi.NumDrivers].About, lpDeviceDescription); - lstrcpy(d3dappi.Driver[d3dappi.NumDrivers].Name, lpDeviceName); - /* - * Is this a hardware device or software emulation? Checking the color - * model for a valid model works. - */ - if (lpHWDesc->dcmColorModel) { - d3dappi.Driver[d3dappi.NumDrivers].bIsHardware = TRUE; - memcpy(&d3dappi.Driver[d3dappi.NumDrivers].Desc, lpHWDesc, - sizeof(D3DDEVICEDESC)); - } else { - d3dappi.Driver[d3dappi.NumDrivers].bIsHardware = FALSE; - memcpy(&d3dappi.Driver[d3dappi.NumDrivers].Desc, lpHELDesc, - sizeof(D3DDEVICEDESC)); - } - /* - * Does this driver do texture mapping? - */ - d3dappi.Driver[d3dappi.NumDrivers].bDoesTextures = - (d3dappi.Driver[d3dappi.NumDrivers].Desc.dpcTriCaps.dwTextureCaps & - D3DPTEXTURECAPS_PERSPECTIVE) ? TRUE : FALSE; - /* - * Can this driver use a z-buffer? - */ - d3dappi.Driver[d3dappi.NumDrivers].bDoesZBuffer = - d3dappi.Driver[d3dappi.NumDrivers].Desc.dwDeviceZBufferBitDepth - ? TRUE : FALSE; - /* - * Can this driver render to the Windows display depth - */ - d3dappi.Driver[d3dappi.NumDrivers].bCanDoWindow = - (d3dappi.Driver[d3dappi.NumDrivers].Desc.dwDeviceRenderBitDepth & - D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp)) ? TRUE : FALSE; - if (!d3dappi.bIsPrimary) - d3dappi.Driver[d3dappi.NumDrivers].bCanDoWindow = FALSE; - - d3dappi.NumDrivers++; - if (d3dappi.NumDrivers == D3DAPP_MAXD3DDRIVERS) - return (D3DENUMRET_CANCEL); - return (D3DENUMRET_OK); -} - -/* - * D3DAppIEnumDevices - * Get the available drivers from Direct3D by enumeration. - */ -BOOL -D3DAppIEnumDevices(void) -{ - d3dappi.NumDrivers = 0; - LastError = d3dappi.lpD3D->lpVtbl->EnumDevices(d3dappi.lpD3D, - enumDeviceFunc, NULL); - if (LastError != DD_OK) { - D3DAppISetErrorString("Enumeration of drivers failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - d3dappi.CurrDriver = 0; - return TRUE; -} - -/***************************************************************************/ -/* Enumeration of texure format */ -/***************************************************************************/ -/* - * EnumTextureFormatsCallback - * Record information about each texture format the current D3D driver can - * support. Choose one as the default format (paletted formats are prefered) - * and return it through lpContext. - */ -static HRESULT -CALLBACK EnumTextureFormatsCallback(LPDDSURFACEDESC lpDDSD, LPVOID lpContext) -{ - unsigned long m; - int r, g, b; - int *lpStartFormat = (int *)lpContext; - /* - * Record the DDSURFACEDESC of this texture format - */ - memset(&d3dappi.TextureFormat[d3dappi.NumTextureFormats], 0, - sizeof(D3DAppTextureFormat)); - memcpy(&d3dappi.TextureFormat[d3dappi.NumTextureFormats].ddsd, lpDDSD, - sizeof(DDSURFACEDESC)); - /* - * Is this format palettized? How many bits? Otherwise, how many RGB - * bits? - */ - if (lpDDSD->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { - d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized = TRUE; - d3dappi.TextureFormat[d3dappi.NumTextureFormats].IndexBPP = 8; - } else if (lpDDSD->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED4) { - d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized = TRUE; - d3dappi.TextureFormat[d3dappi.NumTextureFormats].IndexBPP = 4; - } else if (lpDDSD->ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS) { - /* - * The sample apps don't currently understand - * the alpha bit - just filter this format - * away for now. - */ - - return DDENUMRET_OK; - } else - { - d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized = FALSE; - d3dappi.TextureFormat[d3dappi.NumTextureFormats].IndexBPP = 0; - for (r = 0, m = lpDDSD->ddpfPixelFormat.dwRBitMask; !(m & 1); - r++, m >>= 1); - for (r = 0; m & 1; r++, m >>= 1); - for (g = 0, m = lpDDSD->ddpfPixelFormat.dwGBitMask; !(m & 1); - g++, m >>= 1); - for (g = 0; m & 1; g++, m >>= 1); - for (b = 0, m = lpDDSD->ddpfPixelFormat.dwBBitMask; !(m & 1); - b++, m >>= 1); - for (b = 0; m & 1; b++, m >>= 1); - d3dappi.TextureFormat[d3dappi.NumTextureFormats].RedBPP = r; - d3dappi.TextureFormat[d3dappi.NumTextureFormats].GreenBPP = g; - d3dappi.TextureFormat[d3dappi.NumTextureFormats].BlueBPP = b; - } - /* - * If lpStarFormat is -1, this is the first format. Select it. - */ - if (*lpStartFormat == -1) - *lpStartFormat = d3dappi.NumTextureFormats; - /* - * If this format is paletted, select it. - */ - if (d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized) { - *lpStartFormat = d3dappi.NumTextureFormats; - } - d3dappi.NumTextureFormats++; - return DDENUMRET_OK; -} - -/* - * D3DAppIEnumTextureFormats - * Get a list of available texture map formats from the Direct3D driver by - * enumeration. Choose a default format (paletted is prefered). - */ -BOOL -D3DAppIEnumTextureFormats(void) -{ - int StartFormat; - /* - * Set the default format to -1 to let the callback know it's being - * called for the first time. - */ - StartFormat = -1; - d3dappi.NumTextureFormats = 0; - LastError = - d3dappi.lpD3DDevice->lpVtbl->EnumTextureFormats(d3dappi.lpD3DDevice, - EnumTextureFormatsCallback, - (LPVOID)&StartFormat); - if (LastError != DD_OK) { - D3DAppISetErrorString("Enumeration of texture formats failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - memcpy(&d3dappi.ThisTextureFormat, &d3dappi.TextureFormat[StartFormat], - sizeof(D3DAppTextureFormat)); - d3dappi.CurrTextureFormat = StartFormat; - return TRUE; -} - -/***************************************************************************/ -/* Device creation */ -/***************************************************************************/ -/* - * D3DAppICreateDevice - * Create the D3D device and enumerate the texture formats - */ -BOOL -D3DAppICreateDevice(int driver) -{ - - RELEASE(d3dappi.lpD3DDevice); - - if (d3dappi.Driver[driver].bIsHardware && !d3dappi.bBackBufferInVideo) { - D3DAppISetErrorString("Could not fit the rendering surfaces in video memory for this hardware device.\n"); - goto exit_with_error; - } - - d3dappi.CurrDriver = driver; - memcpy(&d3dappi.ThisDriver, &d3dappi.Driver[driver], sizeof(D3DAppD3DDriver)); - LastError = - d3dappi.lpBackBuffer->lpVtbl->QueryInterface(d3dappi.lpBackBuffer, - &d3dappi.Driver[driver].Guid, - (LPVOID*)&d3dappi.lpD3DDevice); - if (LastError != DD_OK) { - D3DAppISetErrorString("Create D3D device failed.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - d3dappi.CurrDriver = driver; - d3dappi.NumTextureFormats = 0; - if (d3dappi.Driver[driver].bDoesTextures) { - if (!D3DAppIEnumTextureFormats()) - goto exit_with_error; - } - - return TRUE; -exit_with_error: - RELEASE(d3dappi.lpD3DDevice); - return FALSE; -} - -/***************************************************************************/ -/* Setting the render state */ -/***************************************************************************/ -/* - * D3DAppISetRenderState - * Create and execute an execute buffer which will set the render state and - * light state for the current viewport. - */ -BOOL -D3DAppISetRenderState() -{ - D3DEXECUTEBUFFERDESC debDesc; - D3DEXECUTEDATA d3dExData; - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf = NULL; - LPVOID lpBuffer, lpInsStart; - size_t size; - - /* - * If there is no D3D Viewport, we must return true because it is not - * required. - */ - if (!d3dappi.lpD3DViewport) - return TRUE; - /* - * Create an execute buffer of the required size - */ - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 17; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - LastError = - d3dappi.lpD3DDevice->lpVtbl->CreateExecuteBuffer(d3dappi.lpD3DDevice, - &debDesc, &lpD3DExCmdBuf, NULL); - if (LastError != D3D_OK) { - D3DAppISetErrorString("CreateExecuteBuffer failed in SetRenderState.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Lock the execute buffer so it can be filled - */ - LastError = lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc); - if (LastError != D3D_OK) { - D3DAppISetErrorString("Lock failed on execute buffer in SetRenderState.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - memset(debDesc.lpData, 0, size); - - lpInsStart = debDesc.lpData; - lpBuffer = lpInsStart; - /* - * Set render state - */ - OP_STATE_RENDER(14, lpBuffer); - STATE_DATA(D3DRENDERSTATE_SHADEMODE, d3dapprs.ShadeMode, lpBuffer); - STATE_DATA(D3DRENDERSTATE_TEXTUREPERSPECTIVE, d3dapprs.bPerspCorrect, - lpBuffer); - STATE_DATA(D3DRENDERSTATE_ZENABLE, d3dapprs.bZBufferOn && - d3dappi.ThisDriver.bDoesZBuffer, lpBuffer); - STATE_DATA(D3DRENDERSTATE_ZWRITEENABLE, d3dapprs.bZBufferOn, lpBuffer); - STATE_DATA(D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL, lpBuffer); - STATE_DATA(D3DRENDERSTATE_TEXTUREMAG, d3dapprs.TextureFilter,lpBuffer); - STATE_DATA(D3DRENDERSTATE_TEXTUREMIN, d3dapprs.TextureFilter,lpBuffer); - STATE_DATA(D3DRENDERSTATE_TEXTUREMAPBLEND, d3dapprs.TextureBlend, - lpBuffer); - STATE_DATA(D3DRENDERSTATE_FILLMODE, d3dapprs.FillMode, lpBuffer); - STATE_DATA(D3DRENDERSTATE_DITHERENABLE, d3dapprs.bDithering, lpBuffer); - STATE_DATA(D3DRENDERSTATE_SPECULARENABLE, d3dapprs.bSpecular,lpBuffer); - STATE_DATA(D3DRENDERSTATE_ANTIALIAS, d3dapprs.bAntialiasing, lpBuffer); - STATE_DATA(D3DRENDERSTATE_FOGENABLE, d3dapprs.bFogEnabled, lpBuffer); - STATE_DATA(D3DRENDERSTATE_FOGCOLOR, d3dapprs.FogColor, lpBuffer); - /* - * Set light state - */ - OP_STATE_LIGHT(3, lpBuffer); - STATE_DATA(D3DLIGHTSTATE_FOGMODE, d3dapprs.bFogEnabled ? - d3dapprs.FogMode : D3DFOG_NONE, lpBuffer); - STATE_DATA(D3DLIGHTSTATE_FOGSTART, *(unsigned long*)&d3dapprs.FogStart, - lpBuffer); - STATE_DATA(D3DLIGHTSTATE_FOGEND, *(unsigned long*)&d3dapprs.FogEnd, - lpBuffer); - OP_EXIT(lpBuffer); - - LastError = lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - if (LastError != D3D_OK) { - D3DAppISetErrorString("Unlock failed on execute buffer in SetRenderState.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Set the execute data and exectue the buffer - */ - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char*)lpBuffer - - (char*)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - LastError = d3dappi.lpD3DDevice->lpVtbl->BeginScene(d3dappi.lpD3DDevice); - if (LastError != D3D_OK) { - D3DAppISetErrorString("BeginScene failed in SetRenderState.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = d3dappi.lpD3DDevice->lpVtbl->Execute(d3dappi.lpD3DDevice, - lpD3DExCmdBuf, - d3dappi.lpD3DViewport, - D3DEXECUTE_UNCLIPPED); - if (LastError != D3D_OK) { - D3DAppISetErrorString("Execute failed in SetRenderState.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = d3dappi.lpD3DDevice->lpVtbl->EndScene(d3dappi.lpD3DDevice); - if (LastError != D3D_OK) { - D3DAppISetErrorString("EndScene failed in SetRenderState.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * We are done with the execute buffer, so release it. - */ - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - return TRUE; - -exit_with_error: - RELEASE(lpD3DExCmdBuf); - return FALSE; -} - diff --git a/sdk/samples/misc/d3ddemo.h b/sdk/samples/misc/d3ddemo.h deleted file mode 100644 index 121f7a1..0000000 --- a/sdk/samples/misc/d3ddemo.h +++ /dev/null @@ -1,89 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3ddemo.h - * - ***************************************************************************/ -#ifndef __D3DDEMO_H__ -#define __D3DDEMO_H__ - -#include -#include -#include "d3dapp.h" -#include "d3dmath.h" -#include "d3dsphr.h" -#include "d3dmacs.h" - -#ifdef __cplusplus -extern "C" { -#endif - /* - * SetMouseCallback - * Called in an example to set a callback function for all WM messages - * dealing with the mouse. The handler should return whether or not - * it handled the message. - */ - BOOL SetMouseCallback(BOOL(*)(UINT, WPARAM, LPARAM)); - /* - * SetKeyDownCallback - * Called in an example to set a callback function for keyboard - * messages. The handler should return whether or not it handled the - * message. - */ - BOOL SetKeyboardCallback(BOOL(*)(UINT, WPARAM, LPARAM)); - -/* - * These functions are found in the source for each example. - */ - /* - * RenderScene - * Clears the viewport and viewport Z-buffer and render the scene. - * The extent of rendering is returned in the rectangle. - */ - BOOL RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent); - /* - * InitScene - * Builds the model which will be rendered. - */ - BOOL InitScene(void); - - /* - * InitView - * Builds execute buffer and all components needed to be added to viewport. - */ - BOOL InitView(LPDIRECTDRAW lpDD, - LPDIRECT3D lpD3D, - LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, - int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle); - /* - * Release all objects and free all memory allocated in InitScene - */ - void ReleaseScene(void); - - /* - * Release all objects and free all memory allocated in InitView - */ - void ReleaseView(LPDIRECT3DVIEWPORT lpView); - - typedef struct Defaultstag { - D3DAppRenderState rs; - BOOL bTexturesDisabled; - BOOL bResizingDisabled; - BOOL bClearsOn; - char Name[30]; - } Defaults; - - /* - * Allows each example to begin with different defaults - */ - void OverrideDefaults(Defaults* defaults); - -#ifdef __cplusplus -}; -#endif - -#endif // __D3DDEMO_H__ diff --git a/sdk/samples/misc/d3dmacs.h b/sdk/samples/misc/d3dmacs.h deleted file mode 100644 index ce26f43..0000000 --- a/sdk/samples/misc/d3dmacs.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dmacs.h - * - * Useful macros for generating execute buffers. Consult the D3D sample - * code for examples of their usage. - * - * Use OP_NOP to QWORD align triangle and line instructions. - */ - -#ifndef __D3DMACS_H__ -#define __D3DMACS_H__ - -#undef RELEASE - -#ifndef __cplusplus -#define MAKE_MATRIX(lpDev, handle, data) \ - if (lpDev->lpVtbl->CreateMatrix(lpDev, &handle) != D3D_OK) \ - return FALSE; \ - if (lpDev->lpVtbl->SetMatrix(lpDev, handle, &data) != D3D_OK) \ - return FALSE -#define RELEASE(x) if (x != NULL) {x->lpVtbl->Release(x); x = NULL;} -#endif - -#ifdef __cplusplus -#define MAKE_MATRIX(lpDev, handle, data) \ - if (lpDev->CreateMatrix(&handle) != D3D_OK) \ - return FALSE; \ - if (lpDev->SetMatrix(handle, &data) != D3D_OK) \ - return FALSE -#define RELEASE(x) if (x != NULL) {x->Release(); x = NULL;} -#endif - -#define PUTD3DINSTRUCTION(op, sz, cnt, ptr) \ - ((LPD3DINSTRUCTION) ptr)->bOpcode = op; \ - ((LPD3DINSTRUCTION) ptr)->bSize = sz; \ - ((LPD3DINSTRUCTION) ptr)->wCount = cnt; \ - ptr = (void *)(((LPD3DINSTRUCTION) ptr) + 1) - -#define VERTEX_DATA(loc, cnt, ptr) \ - if ((ptr) != (loc)) memcpy((ptr), (loc), sizeof(D3DVERTEX) * (cnt)); \ - ptr = (void *)(((LPD3DVERTEX) (ptr)) + (cnt)) - -// OP_MATRIX_MULTIPLY size: 4 (sizeof D3DINSTRUCTION) -#define OP_MATRIX_MULTIPLY(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_MATRIXMULTIPLY, sizeof(D3DMATRIXMULTIPLY), cnt, ptr) - -// MATRIX_MULTIPLY_DATA size: 12 (sizeof MATRIXMULTIPLY) -#define MATRIX_MULTIPLY_DATA(src1, src2, dest, ptr) \ - ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix1 = src1; \ - ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix2 = src2; \ - ((LPD3DMATRIXMULTIPLY) ptr)->hDestMatrix = dest; \ - ptr = (void *)(((LPD3DMATRIXMULTIPLY) ptr) + 1) - -// OP_STATE_LIGHT size: 4 (sizeof D3DINSTRUCTION) -#define OP_STATE_LIGHT(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_STATELIGHT, sizeof(D3DSTATE), cnt, ptr) - -// OP_STATE_TRANSFORM size: 4 (sizeof D3DINSTRUCTION) -#define OP_STATE_TRANSFORM(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_STATETRANSFORM, sizeof(D3DSTATE), cnt, ptr) - -// OP_STATE_RENDER size: 4 (sizeof D3DINSTRUCTION) -#define OP_STATE_RENDER(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_STATERENDER, sizeof(D3DSTATE), cnt, ptr) - -// STATE_DATA size: 8 (sizeof D3DSTATE) -#define STATE_DATA(type, arg, ptr) \ - ((LPD3DSTATE) ptr)->drstRenderStateType = (D3DRENDERSTATETYPE)type; \ - ((LPD3DSTATE) ptr)->dwArg[0] = arg; \ - ptr = (void *)(((LPD3DSTATE) ptr) + 1) - -// OP_PROCESS_VERTICES size: 4 (sizeof D3DINSTRUCTION) -#define OP_PROCESS_VERTICES(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_PROCESSVERTICES, sizeof(D3DPROCESSVERTICES), cnt, ptr) - -// PROCESSVERTICES_DATA size: 16 (sizeof D3DPROCESSVERTICES) -#define PROCESSVERTICES_DATA(flgs, strt, cnt, ptr) \ - ((LPD3DPROCESSVERTICES) ptr)->dwFlags = flgs; \ - ((LPD3DPROCESSVERTICES) ptr)->wStart = strt; \ - ((LPD3DPROCESSVERTICES) ptr)->wDest = strt; \ - ((LPD3DPROCESSVERTICES) ptr)->dwCount = cnt; \ - ((LPD3DPROCESSVERTICES) ptr)->dwReserved = 0; \ - ptr = (void *)(((LPD3DPROCESSVERTICES) ptr) + 1) - -// OP_TRIANGLE_LIST size: 4 (sizeof D3DINSTRUCTION) -#define OP_TRIANGLE_LIST(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), cnt, ptr) - -#define TRIANGLE_LIST_DATA(loc, count, ptr) \ - if ((ptr) != (loc)) memcpy((ptr), (loc), sizeof(D3DTRIANGLE) * (count)); \ - ptr = (void *)(((LPD3DTRIANGLE) (ptr)) + (count)) - -// OP_LINE_LIST size: 4 (sizeof D3DINSTRUCTION) -#define OP_LINE_LIST(cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_LINE, sizeof(D3DLINE), cnt, ptr) - -#define LINE_LIST_DATA(loc, count, ptr) \ - if ((ptr) != (loc)) memcpy((ptr), (loc), sizeof(D3DLINE) * (count)); \ - ptr = (void *)(((LPD3DLINE) (ptr)) + (count)) - -// OP_POINT_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DPOINT) -#define OP_POINT_LIST(first, cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_POINT, sizeof(D3DPOINT), 1, ptr); \ - ((LPD3DPOINT)(ptr))->wCount = cnt; \ - ((LPD3DPOINT)(ptr))->wFirst = first; \ - ptr = (void*)(((LPD3DPOINT)(ptr)) + 1) - -// OP_SPAN_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DSPAN) -#define OP_SPAN_LIST(first, cnt, ptr) \ - PUTD3DINSTRUCTION(D3DOP_SPAN, sizeof(D3DSPAN), 1, ptr); \ - ((LPD3DSPAN)(ptr))->wCount = cnt; \ - ((LPD3DSPAN)(ptr))->wFirst = first; \ - ptr = (void*)(((LPD3DSPAN)(ptr)) + 1) - -// OP_BRANCH_FORWARD size: 18 (sizeof D3DINSTRUCTION + sizeof D3DBRANCH) -#define OP_BRANCH_FORWARD(tmask, tvalue, tnegate, toffset, ptr) \ - PUTD3DINSTRUCTION(D3DOP_BRANCHFORWARD, sizeof(D3DBRANCH), 1, ptr); \ - ((LPD3DBRANCH) ptr)->dwMask = tmask; \ - ((LPD3DBRANCH) ptr)->dwValue = tvalue; \ - ((LPD3DBRANCH) ptr)->bNegate = tnegate; \ - ((LPD3DBRANCH) ptr)->dwOffset = toffset; \ - ptr = (void *)(((LPD3DBRANCH) (ptr)) + 1) - -// OP_SET_STATUS size: 20 (sizeof D3DINSTRUCTION + sizeof D3DSTATUS) -#define OP_SET_STATUS(flags, status, _x1, _y1, _x2, _y2, ptr) \ - PUTD3DINSTRUCTION(D3DOP_SETSTATUS, sizeof(D3DSTATUS), 1, ptr); \ - ((LPD3DSTATUS)(ptr))->dwFlags = flags; \ - ((LPD3DSTATUS)(ptr))->dwStatus = status; \ - ((LPD3DSTATUS)(ptr))->drExtent.x1 = _x1; \ - ((LPD3DSTATUS)(ptr))->drExtent.y1 = _y1; \ - ((LPD3DSTATUS)(ptr))->drExtent.x2 = _x2; \ - ((LPD3DSTATUS)(ptr))->drExtent.y2 = _y2; \ - ptr = (void *)(((LPD3DSTATUS) (ptr)) + 1) - -// OP_NOP size: 4 -#define OP_NOP(ptr) \ - PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), 0, ptr) - -#define OP_EXIT(ptr) \ - PUTD3DINSTRUCTION(D3DOP_EXIT, 0, 0, ptr) - -#define QWORD_ALIGNED(ptr) \ - !(0x00000007L & (ULONG)(ptr)) - -#endif // __D3DMACS_H__ diff --git a/sdk/samples/misc/d3dmain.cpp b/sdk/samples/misc/d3dmain.cpp deleted file mode 100644 index 8db378e..0000000 --- a/sdk/samples/misc/d3dmain.cpp +++ /dev/null @@ -1,1246 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dmain.cpp - * - * Each of the Direct3D samples must be linked with this file. It contains - * the code which allows them to run in the Windows environment. - * - * A window is created using d3dmain.res which allows the user to select the - * Direct3D driver to use and change the render options. The D3DApp - * collection of functions is used to initialize DirectDraw, Direct3D and - * keep surfaces and D3D devices available for rendering. - * - * Frame rate and a screen mode information buffer is Blt'ed to the screen - * by functions in stats.cpp. - * - * Each sample is executed through the functions: InitScene, InitView, - * RenderScene, ReleaseView, ReleaseScene and OverrideDefaults, as described - * in d3ddemo.h. Samples can also read mouse and keyboard input via - * SetMouseCallback and SetKeyboardCallback. - */ - -#include "d3dmain.h" - -/* - * GLOBAL VARIABLES - */ -D3DAppInfo* d3dapp; /* Pointer to read only collection of DD and D3D - objects maintained by D3DApp */ -d3dmainglobals myglobs; /* collection of global variables */ - -BOOL(*MouseHandler)(UINT, WPARAM, LPARAM); /* sample's function which traps - mouse input */ -BOOL(*KeyboardHandler)(UINT, WPARAM, LPARAM); /* sample's functions which traps - keyboard input */ - -/* - * INTERNAL FUNCTION PROTOTYPES - */ -static BOOL AppInit(HINSTANCE hInstance, LPSTR lpCmdLine); -static BOOL CreateD3DApp(LPSTR lpCmdLine); -static BOOL BeforeDeviceDestroyed(LPVOID lpContext); -static BOOL AfterDeviceCreated(int w, int h, LPDIRECT3DVIEWPORT* lpViewport, - LPVOID lpContext); -void CleanUpAndPostQuit(void); -static void InitGlobals(void); -static BOOL AppPause(BOOL f); -void ReportD3DAppError(void); -static BOOL RenderLoop(void); -static BOOL RestoreSurfaces(); -long FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam ); - -/****************************************************************************/ -/* WinMain */ -/****************************************************************************/ -/* - * Initializes the application then enters a message loop which calls sample's - * RenderScene until a quit message is received. - */ -int PASCAL -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow) -{ - int failcount = 0; /* number of times RenderLoop has failed */ - MSG msg; - HACCEL hAccelApp; - - hPrevInstance; - /* - * Create the window and initialize all objects needed to begin rendering - */ - if(!AppInit(hInstance, lpCmdLine)) - return FALSE; - hAccelApp = LoadAccelerators(hInstance, "AppAccel"); - - while (!myglobs.bQuit) { - /* - * Monitor the message queue until there are no pressing - * messages - */ - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - CleanUpAndPostQuit(); - break; - } - if (!myglobs.hWndMain || !TranslateAccelerator(myglobs.hWndMain, - hAccelApp, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - /* - * If the app is not minimized, not about to quit, not paused, either the - * active fullscreen app or in a window and D3D has been initialized, - * we can render - */ - } else if (d3dapp->bRenderingIsOK && !d3dapp->bMinimized - && !d3dapp->bPaused && !myglobs.bQuit - && (d3dapp->bAppActive || !d3dapp->bFullscreen)) { - /* - * If were are not in single step mode or if we are and the - * bDrawAFrame flag is set, render one frame - */ - if (!(myglobs.bSingleStepMode && !myglobs.bDrawAFrame)) { - /* - * Attempt to render a frame, if it fails, take a note. If - * rendering fails more than twice, abort execution. - */ - if (!RenderLoop()) { - ++failcount; - if (failcount == 3) { - Msg("Rendering has failed too many times. Aborting execution.\n"); - CleanUpAndPostQuit(); - break; - } - } - } - /* - * Reset the bDrawAFrame flag if we are in single step mode - */ - if (myglobs.bSingleStepMode) - myglobs.bDrawAFrame = FALSE; - } else { - WaitMessage(); - } - } - - DestroyWindow(myglobs.hWndMain); - return msg.wParam; -} - -/****************************************************************************/ -/* D3DApp Initialization and callback functions */ -/****************************************************************************/ -/* - * AppInit - * Creates the window and initializes all objects necessary to begin rendering - */ -static BOOL -AppInit(HINSTANCE hInstance, LPSTR lpCmdLine) -{ - WNDCLASS wc; - - /* - * Initialize the global variables - */ - InitGlobals(); - myglobs.hInstApp = hInstance; - /* - * Register the window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, "AppIcon"); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = "AppMenu"; - wc.lpszClassName = "Example"; - if (!RegisterClass(&wc)) - return FALSE; - /* - * Create a window with some default settings that may change - */ - myglobs.hWndMain = CreateWindowEx( - WS_EX_APPWINDOW, - "Example", - "D3D Example", - WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | - WS_THICKFRAME | WS_MINIMIZEBOX, - CW_USEDEFAULT, CW_USEDEFAULT, - START_WIN_SIZE, START_WIN_SIZE, - NULL, /* parent window */ - NULL, /* menu handle */ - hInstance, /* program handle */ - NULL); /* create parms */ - if (!myglobs.hWndMain){ - Msg("CreateWindowEx failed"); - return FALSE; - } - /* - * Display the window - */ - ShowWindow(myglobs.hWndMain, SW_SHOWNORMAL); - UpdateWindow(myglobs.hWndMain); - /* - * Have the example initialize it components which remain constant - * throughout execution - */ - if (!InitScene()) - return FALSE; - /* - * Call D3DApp to initialize all DD and D3D objects necessary to render. - * D3DApp will call the device creation callback which will initialize the - * viewport and the sample's execute buffers. - */ - if (!CreateD3DApp(lpCmdLine)) - return FALSE; - - return TRUE; -} - -/* - * CreateD3DApp - * Create all DirectDraw and Direct3D objects necessary to begin rendering. - * Add the list of D3D drivers to the file menu. - */ -static BOOL -CreateD3DApp(LPSTR lpCmdLine) -{ - HMENU hmenu; - int i; - LPSTR option; - BOOL bOnlySystemMemory, bOnlyEmulation; - DWORD flags; - Defaults defaults; - - /* - * Give D3DApp a list of textures to keep track of. - */ - D3DAppAddTexture("checker.ppm"); - D3DAppAddTexture("tex2.ppm"); - D3DAppAddTexture("tex7.ppm"); - D3DAppAddTexture("win95.ppm"); - /* - * Parse the command line in seach of one of the following options: - * systemmemory All surfaces should be created in system memory. - * Hardware DD and D3D devices are disabled, but - * debugging during the Win16 lock becomes possible. - * emulation Do not use hardware DD or D3D devices. - */ - bOnlySystemMemory = FALSE; - bOnlyEmulation = FALSE; - option = strtok(lpCmdLine, " -"); - while(option != NULL ) { - if (!lstrcmp(option, "systemmemory")) { - bOnlySystemMemory = TRUE; - } else if (!lstrcmp(option, "emulation")) { - bOnlyEmulation = TRUE; - } else { - Msg("Invalid command line options given.\nLegal options: -systemmemory, -emulation\n"); - return FALSE; - } - option = strtok(NULL, " -"); - } - /* - * Set the flags to pass to the D3DApp creation based on command line - */ - flags = ((bOnlySystemMemory) ? D3DAPP_ONLYSYSTEMMEMORY : 0) | - ((bOnlyEmulation) ? (D3DAPP_ONLYD3DEMULATION | - D3DAPP_ONLYDDEMULATION) : 0); - /* - * Create all the DirectDraw and D3D objects neccesary to render. The - * AfterDeviceCreated callback function is called by D3DApp to create the - * viewport and the example's execute buffers. - */ - if (!D3DAppCreateFromHWND(flags, myglobs.hWndMain, AfterDeviceCreated, - NULL, BeforeDeviceDestroyed, NULL, &d3dapp)) { - ReportD3DAppError(); - return FALSE; - } - /* - * Add the the list of display modes D3DApp found to the mode menu - */ - hmenu = GetSubMenu(GetMenu(myglobs.hWndMain), 4); - for (i = 0; i < d3dapp->NumModes; i++) { - char ach[80]; - wsprintf(ach,"%dx%dx%d", d3dapp->Mode[i].w, d3dapp->Mode[i].h, - d3dapp->Mode[i].bpp); - AppendMenu(hmenu, MF_STRING, MENU_FIRST_MODE+i, ach); - } - /* - * Add the list of D3D drivers D3DApp foudn to the file menu - */ - hmenu = GetSubMenu(GetMenu(myglobs.hWndMain), 0); - for (i = 0; i < d3dapp->NumDrivers; i++) { - InsertMenu(hmenu, 6 + i, MF_BYPOSITION | MF_STRING, - MENU_FIRST_DRIVER + i, d3dapp->Driver[i].Name); - } - /* - * Allow the sample to override the default render state and other - * settings - */ - if (!D3DAppGetRenderState(&defaults.rs)) { - ReportD3DAppError(); - return FALSE; - } - lstrcpy(defaults.Name, "D3D Example"); - defaults.bTexturesDisabled = FALSE; - defaults.bResizingDisabled = myglobs.bResizingDisabled; - defaults.bClearsOn = myglobs.bClearsOn; - OverrideDefaults(&defaults); - myglobs.bClearsOn = defaults.bClearsOn; - myglobs.bResizingDisabled = defaults.bResizingDisabled; - /* - * Apply any changes to the render state - */ - memcpy(&myglobs.rstate, &defaults.rs, sizeof(D3DAppRenderState)); - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - return FALSE; - } - /* - * If I should begin with textures off, disable them and re-create - * the view. - */ - if (defaults.bTexturesDisabled) { - if (!D3DAppDisableTextures(defaults.bTexturesDisabled)) { - ReportD3DAppError(); - return FALSE; - } - /* - * Release all objects (ie execute buffers) created by InitView - */ - ReleaseView(d3dapp->lpD3DViewport); - /* - * Create the sample's execute buffers via InitView - */ - if (!InitView(d3dapp->lpDD, d3dapp->lpD3D, d3dapp->lpD3DDevice, - d3dapp->lpD3DViewport, d3dapp->NumUsableTextures, - d3dapp->TextureHandle)) { - Msg("InitView failed.\n"); - CleanUpAndPostQuit(); - return FALSE; - } - } - - SetWindowText(myglobs.hWndMain, defaults.Name); - - return TRUE; -} - -/* - * AfterDeviceCreated - * D3DApp will call this function immediately after the D3D device has been - * created (or re-created). D3DApp expects the D3D viewport to be created and - * returned. The sample's execute buffers are also created (or re-created) - * here. - */ -static BOOL -AfterDeviceCreated(int w, int h, LPDIRECT3DVIEWPORT* lplpViewport, LPVOID lpContext) -{ - HMENU hmenu; - int i; - char ach[20]; - LPDIRECT3DVIEWPORT lpD3DViewport; - HRESULT rval; - - /* - * Create the D3D viewport object - */ - rval = d3dapp->lpD3D->CreateViewport(&lpD3DViewport, NULL); - if (rval != D3D_OK) { - Msg("Create D3D viewport failed.\n%s", D3DAppErrorToString(rval)); - CleanUpAndPostQuit(); - return FALSE; - } - /* - * Add the viewport to the D3D device - */ - rval = d3dapp->lpD3DDevice->AddViewport(lpD3DViewport); - if (rval != D3D_OK) { - Msg("Add D3D viewport failed.\n%s", D3DAppErrorToString(rval)); - CleanUpAndPostQuit(); - return FALSE; - } - /* - * Setup the viewport for a reasonable viewing area - */ - D3DVIEWPORT viewData; - memset(&viewData, 0, sizeof(D3DVIEWPORT)); - viewData.dwSize = sizeof(D3DVIEWPORT); - viewData.dwX = viewData.dwY = 0; - viewData.dwWidth = w; - viewData.dwHeight = h; - viewData.dvScaleX = viewData.dwWidth / (float)2.0; - viewData.dvScaleY = viewData.dwHeight / (float)2.0; - viewData.dvMaxX = (float)D3DDivide(D3DVAL(viewData.dwWidth), - D3DVAL(2 * viewData.dvScaleX)); - viewData.dvMaxY = (float)D3DDivide(D3DVAL(viewData.dwHeight), - D3DVAL(2 * viewData.dvScaleY)); - rval = lpD3DViewport->SetViewport(&viewData); - if (rval != D3D_OK) { - Msg("SetViewport failed.\n%s", D3DAppErrorToString(rval)); - CleanUpAndPostQuit(); - return FALSE; - } - /* - * Return the viewport to D3DApp so it can use it - */ - *lplpViewport = lpD3DViewport; - /* - * Create the sample's execute buffers via InitView - */ - if (!InitView(d3dapp->lpDD, d3dapp->lpD3D, d3dapp->lpD3DDevice, - lpD3DViewport, d3dapp->NumUsableTextures, - d3dapp->TextureHandle)) { - Msg("InitView failed.\n"); - CleanUpAndPostQuit(); - return FALSE; - } - /* - * Add the list of texture formats found by D3DApp to the texture menu - */ - hmenu = GetSubMenu(GetMenu(myglobs.hWndMain), 3); - for (i = 0; i < d3dapp->NumTextureFormats; i++) { - if (d3dapp->TextureFormat[i].bPalettized) { - wsprintf(ach, "%d-bit Palettized", - d3dapp->TextureFormat[i].IndexBPP); - } else { - wsprintf(ach, "%d%d%d RGB", d3dapp->TextureFormat[i].RedBPP, - d3dapp->TextureFormat[i].GreenBPP, - d3dapp->TextureFormat[i].BlueBPP); - } - AppendMenu(hmenu, MF_STRING, MENU_FIRST_FORMAT + i, ach); - } - /* - * Create and initialize the surfaces containing the frame rate and - * window information - */ - InitFontAndTextBuffers(); - - return TRUE; -} - -/* - * BeforeDeviceDestroyed - * D3DApp will call this function before the current D3D device is destroyed - * to give the app the opportunity to destroy objects it has created with the - * DD or D3D objects. - */ -static BOOL -BeforeDeviceDestroyed(LPVOID lpContext) -{ - HMENU hmenu; - int i; - /* - * Release the font object and buffers containing stats - */ - ReleaseFontAndTextBuffers(); - /* - * Release all objects (ie execute buffers) created by InitView - */ - ReleaseView(d3dapp->lpD3DViewport); - /* - * Since we created the viewport it is our responsibility to release - * it. Use D3DApp's pointer to it since we didn't save one. - */ - d3dapp->lpD3DViewport->Release(); - /* - * Delete the list of texture formats from the texture menu because - * they are likely to change - */ - if (myglobs.hWndMain) { - hmenu = GetSubMenu(GetMenu(myglobs.hWndMain), 3); - if (hmenu) { - for (i = 0; i < d3dapp->NumTextureFormats; i++) { - DeleteMenu(hmenu, MENU_FIRST_FORMAT + i, MF_BYCOMMAND); - } - } - } - return TRUE; -} - -/****************************************************************************/ -/* Rendering loop */ -/****************************************************************************/ -/* - * RenderLoop - * Render the next frame and update the window - */ -static BOOL -RenderLoop() -{ - D3DRECT extents[D3DAPP_MAXCLEARRECTS]; - int count; - /* - * If all the DD and D3D objects have been initialized we can render - */ - if (d3dapp->bRenderingIsOK) { - /* - * Restore any lost surfaces - */ - if (!RestoreSurfaces()) { - /* - * Restoring surfaces sometimes fails because the surfaces cannot - * yet be restored. If this is the case, the error will show up - * somewhere else and we should return success here to prevent - * unnecessary error's being reported. - */ - return TRUE; - } - /* - * Calculate the frame rate - */ - if (!CalculateFrameRate()) - return FALSE; - - /* - * Clear the back buffer and Z buffer if enabled. If bResized is set, - * clear the entire window. - */ - if (myglobs.bClearsOn) { - if (!D3DAppClearBackBuffer(myglobs.bResized ? - D3DAPP_CLEARALL : NULL)) { - ReportD3DAppError(); - return FALSE; - } - } - /* - * Call the sample's RenderScene to render this frame - */ - { - if (!RenderScene(d3dapp->lpD3DDevice, d3dapp->lpD3DViewport, - &extents[0])) { - Msg("RenderScene failed.\n"); - return FALSE; - } - count = 1; - } - /* - * Blt the frame rate and window stat text to the back buffer - */ - if (!DisplayFrameRate(&count, &extents[1])) - return FALSE; - /* - * Give D3DApp the extents so it can keep track of dirty sections of - * the back and front buffers - */ - if (!D3DAppRenderExtents(count, extents, myglobs.bResized ? - D3DAPP_CLEARALL : NULL)) { - ReportD3DAppError(); - return FALSE; - } - /* - * Blt or flip the back buffer to the front buffer. Don't report an - * error if this fails. - */ - D3DAppShowBackBuffer(myglobs.bResized ? D3DAPP_SHOWALL : NULL); - - /* - * Reset the resize flag - */ - myglobs.bResized = FALSE; - } - return TRUE; -} - -/* - * AppPause - * Pause and unpause the application - */ -static BOOL -AppPause(BOOL f) -{ - /* - * Flip to the GDI surface and halt rendering - */ - if (!D3DAppPause(f)) - return FALSE; - /* - * When returning from a pause, reset the frame rate count - */ - if (!f) { - ResetFrameRate(); - } - return TRUE; -} - -/* - * RestoreSurfaces - * Restores any lost surfaces. Returns TRUE if all surfaces are not lost and - * FALSE if one or more surfaces is lost and can not be restored at the - * moment. - */ -static BOOL -RestoreSurfaces() -{ - HRESULT d3drval; - - /* - * Have D3DApp check all the surfaces it's in charge of - */ - if (!D3DAppCheckForLostSurfaces()) { - return FALSE; - } - /* - * Check frame rate and info surfaces and re-write them if they - * were lost. - */ - if (myglobs.lpFrameRateBuffer->IsLost() == DDERR_SURFACELOST) { - d3drval = myglobs.lpFrameRateBuffer->Restore(); - if (d3drval != DD_OK) { - return FALSE; - } - if (!WriteFrameRateBuffer(0.0f, 0)) - return FALSE; - } - if (myglobs.lpInfoBuffer->IsLost() == DDERR_SURFACELOST) { - d3drval = myglobs.lpInfoBuffer->Restore(); - if (d3drval != DD_OK) { - return FALSE; - } - if (!WriteInfoBuffer()) - return FALSE; - } - return TRUE; -} - - -/************************************************************************* - Windows message handlers - *************************************************************************/ -/* - * AppAbout - * About box message handler - */ -BOOL -FAR PASCAL AppAbout(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) - EndDialog(hwnd, TRUE); - break; - - case WM_INITDIALOG: - return TRUE; - } - return FALSE; -} - -/* - * WindowProc - * Main window message handler. - */ -long -FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam ) -{ - int i; - BOOL bStop; - LRESULT lresult; - - /* - * Give D3DApp an opportunity to process any messages it MUST see in order - * to perform it's function. - */ - if (!D3DAppWindowProc(&bStop, &lresult, hWnd, message, wParam, lParam)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - return 0; - } - - /* - * Prevent resizing through this message - */ - if (message == WM_GETMINMAXINFO && myglobs.bResizingDisabled && !d3dapp->bFullscreen && !d3dapp->bMinimized) { - RECT rc; - GetWindowRect(hWnd, &rc); - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = START_WIN_SIZE; - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = START_WIN_SIZE; - ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = START_WIN_SIZE; - ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = START_WIN_SIZE; - return 0; - } - - /* - * If bStop is set by D3DApp, the app should not process the message but - * return lresult. - */ - if (bStop) - return lresult; - - switch( message ) { - case WM_MOUSEMOVE: - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - /* - * Call the sample's MouseHandler if available - */ - if (!MouseHandler) - break; - if ((MouseHandler)(message, wParam, lParam)) - return 1; - break; - case WM_KEYDOWN: - /* - * Call the sample's keyboard handler if available - */ - if (!KeyboardHandler) - break; - if ((KeyboardHandler)(message, wParam, lParam)) - return 1; - break; - /* - * Pause and unpause the app when entering/leaving the menu - */ - case WM_ENTERMENULOOP: - AppPause(TRUE); - break; - case WM_EXITMENULOOP: - AppPause(FALSE); - break; - case WM_DESTROY: - myglobs.hWndMain = NULL; - CleanUpAndPostQuit(); - break; - case WM_INITMENUPOPUP: - /* - * Check and enable the appropriate menu items - */ - if (d3dapp->ThisDriver.bDoesZBuffer) { - EnableMenuItem((HMENU)wParam, MENU_ZBUFFER, MF_ENABLED); - CheckMenuItem((HMENU)wParam, MENU_ZBUFFER, myglobs.rstate.bZBufferOn ? MF_CHECKED : MF_UNCHECKED); - } else { - EnableMenuItem((HMENU)wParam, MENU_ZBUFFER, MF_GRAYED); - CheckMenuItem((HMENU)wParam, MENU_ZBUFFER, MF_UNCHECKED); - } - CheckMenuItem((HMENU)wParam, MENU_STEP, (myglobs.bSingleStepMode) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_GO, (myglobs.bSingleStepMode) ? MF_ENABLED : MF_GRAYED); - CheckMenuItem((HMENU)wParam, MENU_FLAT, (myglobs.rstate.ShadeMode == D3DSHADE_FLAT) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_GOURAUD, (myglobs.rstate.ShadeMode == D3DSHADE_GOURAUD) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_PHONG, (myglobs.rstate.ShadeMode == D3DSHADE_PHONG) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_PHONG, MF_GRAYED); - CheckMenuItem((HMENU)wParam, MENU_CLEARS, myglobs.bClearsOn ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_POINT, (myglobs.rstate.FillMode == D3DFILL_POINT) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_WIREFRAME, (myglobs.rstate.FillMode == D3DFILL_WIREFRAME) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_SOLID, (myglobs.rstate.FillMode == D3DFILL_SOLID) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_DITHERING, myglobs.rstate.bDithering ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_SPECULAR, myglobs.rstate.bSpecular ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_SPECULAR, MF_ENABLED); - CheckMenuItem((HMENU)wParam, MENU_FOG, myglobs.rstate.bFogEnabled ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_ANTIALIAS, myglobs.rstate.bAntialiasing ? MF_CHECKED : MF_UNCHECKED); - if (d3dapp->ThisDriver.bDoesTextures) { - CheckMenuItem((HMENU)wParam, MENU_TEXTURE_TOGGLE, (!d3dapp->bTexturesDisabled) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_TEXTURE_TOGGLE, MF_ENABLED); - EnableMenuItem((HMENU)wParam, MENU_TEXTURE_SWAP, (d3dapp->bTexturesDisabled) ? MF_GRAYED : MF_ENABLED); - CheckMenuItem((HMENU)wParam, MENU_PERSPCORRECT, myglobs.rstate.bPerspCorrect ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_PERSPCORRECT, (d3dapp->bTexturesDisabled) ? MF_GRAYED : MF_ENABLED); - CheckMenuItem((HMENU)wParam, MENU_POINT_FILTER, (myglobs.rstate.TextureFilter == D3DFILTER_NEAREST) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_POINT_FILTER, (d3dapp->bTexturesDisabled) ? MF_GRAYED : MF_ENABLED); - CheckMenuItem((HMENU)wParam, MENU_LINEAR_FILTER, (myglobs.rstate.TextureFilter == D3DFILTER_LINEAR) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_LINEAR_FILTER, (d3dapp->bTexturesDisabled) ? MF_GRAYED : MF_ENABLED); - for (i = 0; i < d3dapp->NumTextureFormats; i++) { - CheckMenuItem((HMENU)wParam, MENU_FIRST_FORMAT + i, (i == d3dapp->CurrTextureFormat) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_FIRST_FORMAT + i, (d3dapp->bTexturesDisabled) ? MF_GRAYED : MF_ENABLED); - } - } else { - EnableMenuItem((HMENU)wParam, MENU_TEXTURE_SWAP, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_TEXTURE_TOGGLE, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_POINT_FILTER, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_LINEAR_FILTER, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_PERSPCORRECT, MF_GRAYED); - } - if (d3dapp->bIsPrimary) { - CheckMenuItem((HMENU)wParam, MENU_FULLSCREEN, d3dapp->bFullscreen ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_FULLSCREEN, d3dapp->bFullscreen && !d3dapp->ThisDriver.bCanDoWindow ? MF_GRAYED : MF_ENABLED); - EnableMenuItem((HMENU)wParam, MENU_NEXT_MODE, (!d3dapp->bFullscreen) ? MF_GRAYED : MF_ENABLED); - EnableMenuItem((HMENU)wParam, MENU_PREVIOUS_MODE, (!d3dapp->bFullscreen) ? MF_GRAYED : MF_ENABLED); - } else { - EnableMenuItem((HMENU)wParam, MENU_FULLSCREEN, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_NEXT_MODE, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_PREVIOUS_MODE, MF_GRAYED); - } - for (i = 0; i < d3dapp->NumModes; i++) { - CheckMenuItem((HMENU)wParam, MENU_FIRST_MODE + i, (i == d3dapp->CurrMode) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_FIRST_MODE + i, (d3dapp->Mode[i].bThisDriverCanDo) ? MF_ENABLED : MF_GRAYED); - } - for (i = 0; i < d3dapp->NumDrivers; i++) { - CheckMenuItem((HMENU)wParam, MENU_FIRST_DRIVER + i, (i == d3dapp->CurrDriver) ? MF_CHECKED : MF_UNCHECKED); - } - break; - case WM_GETMINMAXINFO: - /* - * Some samples don't like being resized, such as those which use - * screen coordinates (TLVERTEXs). - */ - if (myglobs.bResizingDisabled) { - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = START_WIN_SIZE; - ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = START_WIN_SIZE; - ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = START_WIN_SIZE; - ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = START_WIN_SIZE; - return 0; - } - break; - case WM_COMMAND: - switch(LOWORD(wParam)) { - case MENU_ABOUT: - AppPause(TRUE); - DialogBox(myglobs.hInstApp, "AppAbout", myglobs.hWndMain, (DLGPROC)AppAbout); - AppPause(FALSE); - break; - case MENU_EXIT: - CleanUpAndPostQuit(); - break; - case MENU_STEP: - /* - * Begin single step more or draw a frame if in single - * step mode - */ - if (!myglobs.bSingleStepMode) { - myglobs.bSingleStepMode = TRUE; - myglobs.bDrawAFrame = TRUE; - } else if (!myglobs.bDrawAFrame) { - myglobs.bDrawAFrame = TRUE; - } - break; - case MENU_GO: - /* - * Exit single step mode - */ - if (myglobs.bSingleStepMode) { - myglobs.bSingleStepMode = FALSE; - ResetFrameRate(); - } - break; - case MENU_STATS: - /* - * Toggle output of frame rate and window info - */ - if ((myglobs.bShowFrameRate) && (myglobs.bShowInfo)) { - myglobs.bShowFrameRate = FALSE; - myglobs.bShowInfo = FALSE; - break; - } - if ((!myglobs.bShowFrameRate) && (!myglobs.bShowInfo)) { - myglobs.bShowFrameRate = TRUE; - break; - } - myglobs.bShowInfo = TRUE; - break; - case MENU_FULLSCREEN: - if (d3dapp->bFullscreen) { - /* - * Return to a windowed mode. Let D3DApp decide which - * D3D driver to use in case this one cannot render to - * the Windows display depth - */ - if (!D3DAppWindow(D3DAPP_YOUDECIDE, D3DAPP_YOUDECIDE)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - break; - } - } else { - /* - * Enter the current fullscreen mode. D3DApp may - * resort to another mode if this driver cannot do - * the currently selected mode. - */ - if (!D3DAppFullscreen(d3dapp->CurrMode)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - break; - } - } - break; - /* - * Texture filter method selection - */ - case MENU_POINT_FILTER: - if (myglobs.rstate.TextureFilter == D3DFILTER_NEAREST) - break; - myglobs.rstate.TextureFilter = D3DFILTER_NEAREST; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_LINEAR_FILTER: - if (myglobs.rstate.TextureFilter == D3DFILTER_LINEAR) - break; - myglobs.rstate.TextureFilter = D3DFILTER_LINEAR; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - /* - * Shading selection - */ - case MENU_FLAT: - if (myglobs.rstate.ShadeMode == D3DSHADE_FLAT) - break; - myglobs.rstate.ShadeMode = D3DSHADE_FLAT; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_GOURAUD: - if (myglobs.rstate.ShadeMode == D3DSHADE_GOURAUD) - break; - myglobs.rstate.ShadeMode = D3DSHADE_GOURAUD; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_PHONG: - if (myglobs.rstate.ShadeMode == D3DSHADE_PHONG) - break; - myglobs.rstate.ShadeMode = D3DSHADE_PHONG; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - /* - * Fill mode selection - */ - case MENU_POINT: - if (myglobs.rstate.FillMode == D3DFILL_POINT) - break; - myglobs.rstate.FillMode = D3DFILL_POINT; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_WIREFRAME: - if (myglobs.rstate.FillMode == D3DFILL_WIREFRAME) - break; - myglobs.rstate.FillMode = D3DFILL_WIREFRAME; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_SOLID: - if (myglobs.rstate.FillMode == D3DFILL_SOLID) - break; - myglobs.rstate.FillMode = D3DFILL_SOLID; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_PERSPCORRECT: - /* - * Toggle perspective correction - */ - myglobs.rstate.bPerspCorrect = - !myglobs.rstate.bPerspCorrect; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_CLEARS: - /* - * Toggle the clearing the the back buffer and Z-buffer - * and set the resized flag to clear the entire window - */ - myglobs.bClearsOn = !myglobs.bClearsOn; - if (myglobs.bClearsOn) - myglobs.bResized = TRUE; - break; - case MENU_ZBUFFER: - /* - * Toggle the use of a Z-buffer - */ - myglobs.rstate.bZBufferOn = !myglobs.rstate.bZBufferOn; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_DITHERING: - /* - * Toggle dithering - */ - myglobs.rstate.bDithering = !myglobs.rstate.bDithering; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_SPECULAR: - /* - * Toggle specular highlights - */ - myglobs.rstate.bSpecular = !myglobs.rstate.bSpecular; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_FOG: - /* - * Toggle fog - */ - myglobs.rstate.bFogEnabled = !myglobs.rstate.bFogEnabled; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_ANTIALIAS: - /* - * Toggle anti-aliasing - */ - myglobs.rstate.bAntialiasing = - !myglobs.rstate.bAntialiasing; - if (!D3DAppSetRenderState(&myglobs.rstate)) { - ReportD3DAppError(); - break; - } - break; - case MENU_TEXTURE_TOGGLE: - /* - * Release the sample's execute buffers, toggle the - * texture disabled state and recreate them. - */ - ReleaseView(d3dapp->lpD3DViewport); - D3DAppDisableTextures(!d3dapp->bTexturesDisabled); - { - if (!InitView(d3dapp->lpDD, d3dapp->lpD3D, - d3dapp->lpD3DDevice, - d3dapp->lpD3DViewport, - d3dapp->NumUsableTextures, - d3dapp->TextureHandle)) { - Msg("InitView failed.\n"); - CleanUpAndPostQuit(); - break; - } - } - myglobs.bResized = TRUE; - break; - case MENU_TEXTURE_SWAP: - /* - * Swap textures using the load command - */ - if (!D3DAppSwapTextures()) { - ReportD3DAppError(); - break; - } - /* - * Just in case we have a texture background - */ - myglobs.bResized = TRUE; - break; - case MENU_NEXT_MODE: - /* - * Enter the next usable fullscreen mode - */ - i = d3dapp->CurrMode; - do { - ++i; - if (i >= d3dapp->NumModes) - i = 0; - if (!d3dapp->Mode[i].bThisDriverCanDo) - continue; - else { - if (!D3DAppFullscreen(i)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - break; - } - } while(i != d3dapp->CurrMode); - break; - case MENU_PREVIOUS_MODE: - /* - * Enter the previous usable fullscreen mode - */ - i = d3dapp->CurrMode; - do { - --i; - if (i < 0) - i = d3dapp->NumModes - 1; - if (!d3dapp->Mode[i].bThisDriverCanDo) - continue; - else { - if (!D3DAppFullscreen(i)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - break; - } - } while(i != d3dapp->CurrMode); - break; - } - if ( LOWORD(wParam) >= MENU_FIRST_FORMAT - && LOWORD(wParam) < MENU_FIRST_FORMAT + - D3DAPP_MAXTEXTUREFORMATS - && d3dapp->CurrTextureFormat != - LOWORD(wParam) - MENU_FIRST_FORMAT) { - /* - * Release the sample's execute buffers, change the texture - * format and recreate the view. - */ - ReleaseView(d3dapp->lpD3DViewport); - if (!D3DAppChangeTextureFormat(LOWORD(wParam) - - MENU_FIRST_FORMAT)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - { - if (!InitView(d3dapp->lpDD, d3dapp->lpD3D, - d3dapp->lpD3DDevice, d3dapp->lpD3DViewport, - d3dapp->NumUsableTextures, - d3dapp->TextureHandle)) { - Msg("InitView failed.\n"); - CleanUpAndPostQuit(); - break; - } - } - ResetFrameRate(); - } - if ( LOWORD(wParam) >= MENU_FIRST_DRIVER - && LOWORD(wParam) < MENU_FIRST_DRIVER + D3DAPP_MAXD3DDRIVERS - && d3dapp->CurrDriver != LOWORD(wParam) - MENU_FIRST_DRIVER) { - /* - * Change the D3D driver - */ - if (!D3DAppChangeDriver(LOWORD(wParam) - MENU_FIRST_DRIVER, - NULL)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - } - if ( LOWORD(wParam) >= MENU_FIRST_MODE - && LOWORD(wParam) < MENU_FIRST_MODE+100) { - /* - * Switch to the selected fullscreen mode - */ - if (!D3DAppFullscreen(LOWORD(wParam) - MENU_FIRST_MODE)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - } - /* - * Whenever we receive a command in single step mode, draw a frame - */ - if (myglobs.bSingleStepMode) - myglobs.bDrawAFrame = TRUE; - return 0L; - } - return DefWindowProc(hWnd, message, wParam, lParam); -} - - -/****************************************************************************/ -/* Setting up callbacks for examples */ -/****************************************************************************/ - /* - * SetMouseCallback - * Called in an example to set a callback function for all WM messages - * dealing with the mouse. The handler should return whether or not - * it handled the message. - */ -BOOL -SetMouseCallback(BOOL(*Handler)(UINT, WPARAM, LPARAM)) -{ - MouseHandler = Handler; - return TRUE; -} - -/* - * SetKeyboardCallback - * Called in an example to set a callback function for all WM messages - * dealing with the keyboard. The handler should return whether or not it - * handled the message. - */ -BOOL -SetKeyboardCallback(BOOL(*Handler)(UINT, WPARAM, LPARAM)) { - - KeyboardHandler = Handler; - return TRUE; -} - -/****************************************************************************/ -/* Initialization, error reporting and release functions. */ -/****************************************************************************/ -/* - * InitGlobals - * Called once at program initialization to initialize global variables. - */ -static void -InitGlobals(void) -{ - d3dapp = NULL; - memset(&myglobs.rstate, 0, sizeof(myglobs.rstate)); - memset(&myglobs, 0, sizeof(myglobs)); - myglobs.bClearsOn = TRUE; - myglobs.bShowFrameRate = TRUE; - myglobs.bShowInfo = TRUE; - MouseHandler = NULL; - KeyboardHandler = NULL; -} - -/* - * CleanUpAndPostQuit - * Release all D3D objects, post a quit message and set the bQuit flag - */ -void -CleanUpAndPostQuit(void) -{ - if (myglobs.bQuit) - return; - if (!D3DAppDestroy()) - ReportD3DAppError(); - ReleaseScene(); - myglobs.bQuit = TRUE; - PostQuitMessage( 0 ); -} - -/* - * ReportD3DAppError - * Reports an error during a d3d app call. - */ -void -ReportD3DAppError(void) -{ - Msg("%s", D3DAppLastErrorString()); -} - -/* Msg - * Message output for error notification. - */ -void __cdecl -Msg( LPSTR fmt, ... ) -{ - char buff[256]; - - wvsprintf(buff, fmt, (char *)(&fmt+1)); - lstrcat(buff, "\r\n"); - AppPause(TRUE); - if (d3dapp && d3dapp->bFullscreen) - SetWindowPos(myglobs.hWndMain, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE); - MessageBox( NULL, buff, "D3D Example Message", MB_OK ); - if (d3dapp && d3dapp->bFullscreen) - SetWindowPos(myglobs.hWndMain, HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE); - AppPause(FALSE); -} - diff --git a/sdk/samples/misc/d3dmain.h b/sdk/samples/misc/d3dmain.h deleted file mode 100644 index 6e78bbf..0000000 --- a/sdk/samples/misc/d3dmain.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dmain.h - * - */ -#ifndef __D3DMAIN_H__ -#define __D3DMAIN_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "d3dapp.h" /* prototypes for D3D helper functions */ -#include "d3dres.h" /* defines constants used in d3dmain.rc */ -#include "d3ddemo.h" /* prototypes for functions to communicate with - each sample */ -#define START_WIN_SIZE 320 /* initial size of the window */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct tagd3dmainglobals { - HWND hWndMain; /* application window handle */ - HINSTANCE hInstApp; /* application instance for dialog boxes */ - - D3DAppRenderState rstate; /* struct describing the current render state */ - - BOOL bSingleStepMode; /* render one frame at a time */ - BOOL bDrawAFrame; /* render on this pass of the main loop */ - BOOL bClearsOn; /* clear the back and z-buffer each frame */ - BOOL bShowFrameRate; /* show the frame rate at the top */ - BOOL bShowInfo; /* show window information at the bottom */ - BOOL bResizingDisabled; /* do not allow resizing */ - - BOOL bResized; /* the window has resized or some other drastic change, the - entire client area should be cleared */ - BOOL bQuit; /* program is about to terminate */ - - LPDIRECTDRAWSURFACE lpFrameRateBuffer; /* frame rate surface */ - LPDIRECTDRAWSURFACE lpInfoBuffer; /* window info surface */ -} d3dmainglobals; - -void __cdecl Msg( LPSTR fmt, ... ); -/* - * STATS.CPP FUNCTION PROTOTYPES - */ -BOOL InitFontAndTextBuffers(void); -void ReleaseFontAndTextBuffers(void); -BOOL WriteInfoBuffer(void); -BOOL WriteFrameRateBuffer(float fps, long tps); -void ResetFrameRate(void); -BOOL CalculateFrameRate(void); -BOOL DisplayFrameRate(int* count, LPD3DRECT lpExtents ); - -#ifdef __cplusplus -}; -#endif - -#endif // __D3DMAIN_H__ diff --git a/sdk/samples/misc/d3dmain.rc b/sdk/samples/misc/d3dmain.rc deleted file mode 100644 index 806c091..0000000 --- a/sdk/samples/misc/d3dmain.rc +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dmain.rc - * - */ -#include "d3dres.h" -#include "windows.h" - -AppIcon ICON DISCARDABLE "d3d.ico" - -AppMenu MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&About..\tF1", MENU_ABOUT - MENUITEM SEPARATOR - MENUITEM "&Single Step\tSpc", MENU_STEP - MENUITEM "&Go\tEnter", MENU_GO - MENUITEM "&Toggle Stats\tTab", MENU_STATS - MENUITEM SEPARATOR - MENUITEM SEPARATOR - MENUITEM "E&xit\tESC", MENU_EXIT - END - POPUP "&Render" - BEGIN - MENUITEM "&Flat\tF2", MENU_FLAT - MENUITEM "&Gouraud\tF3", MENU_GOURAUD - MENUITEM "P&hong\tF4", MENU_PHONG - MENUITEM SEPARATOR - MENUITEM "&Point\tCtrl+P", MENU_POINT - MENUITEM "&Wireframe\tCtrl+W", MENU_WIREFRAME - MENUITEM "&Solid\tCtrl+S", MENU_SOLID - MENUITEM SEPARATOR - MENUITEM "&Dithering\tCtrl+D", MENU_DITHERING - MENUITEM "&Anti-aliasing\tCtrl+A", MENU_ANTIALIAS - MENUITEM SEPARATOR - MENUITEM "&Z Buffer\tF5", MENU_ZBUFFER - MENUITEM "&Clears\tF6", MENU_CLEARS - END - POPUP "&Lighting" - BEGIN - MENUITEM "&Specular Highlights\tF7", MENU_SPECULAR - MENUITEM "&Fog\tCtrl+F", MENU_FOG - END - POPUP "&Textures" - BEGIN - MENUITEM "&Textures On\tF8", MENU_TEXTURE_TOGGLE - MENUITEM "&Swap Textures\tF9", MENU_TEXTURE_SWAP - MENUITEM "Perspective &Correct\tF10", MENU_PERSPCORRECT - MENUITEM SEPARATOR - MENUITEM "P&oint Filtering\tCtrl+O", MENU_POINT_FILTER - MENUITEM "Bi-&Linear Filtering\tCtrl+L",MENU_LINEAR_FILTER - MENUITEM SEPARATOR - END - POPUP "&Modes" - BEGIN - MENUITEM "&Fullscreen\tAlt+Enter", MENU_FULLSCREEN - MENUITEM "&Previous Mode\tAlt+PgUp", MENU_PREVIOUS_MODE - MENUITEM "&Next Mode\tAlt+PgDown", MENU_NEXT_MODE - MENUITEM SEPARATOR - END -END - - -AppAccel ACCELERATORS DISCARDABLE -BEGIN - VK_F1, MENU_ABOUT, VIRTKEY, NOINVERT - VK_F2, MENU_FLAT, VIRTKEY, NOINVERT - VK_F3, MENU_GOURAUD, VIRTKEY, NOINVERT - VK_F4, MENU_PHONG, VIRTKEY, NOINVERT - VK_F5, MENU_ZBUFFER, VIRTKEY, NOINVERT - VK_F6, MENU_CLEARS, VIRTKEY, NOINVERT - VK_F7, MENU_SPECULAR, VIRTKEY, NOINVERT - VK_F8, MENU_TEXTURE_TOGGLE,VIRTKEY, NOINVERT - VK_F9, MENU_TEXTURE_SWAP, VIRTKEY, NOINVERT - VK_F10, MENU_PERSPCORRECT, VIRTKEY, NOINVERT - "P", MENU_POINT, VIRTKEY, CONTROL, NOINVERT - "W", MENU_WIREFRAME, VIRTKEY, CONTROL, NOINVERT - "S", MENU_SOLID, VIRTKEY, CONTROL, NOINVERT - "D", MENU_DITHERING, VIRTKEY, CONTROL, NOINVERT - "A", MENU_ANTIALIAS, VIRTKEY, CONTROL, NOINVERT - "F", MENU_FOG, VIRTKEY, CONTROL, NOINVERT - "O", MENU_POINT_FILTER, VIRTKEY, CONTROL, NOINVERT - "L", MENU_LINEAR_FILTER, VIRTKEY, CONTROL, NOINVERT - VK_ESCAPE, MENU_EXIT, VIRTKEY, NOINVERT - VK_SPACE, MENU_STEP, VIRTKEY, NOINVERT - VK_RETURN, MENU_GO, VIRTKEY, NOINVERT - VK_RETURN, MENU_FULLSCREEN, VIRTKEY, ALT, NOINVERT - VK_TAB, MENU_STATS, VIRTKEY, NOINVERT - VK_NEXT, MENU_NEXT_MODE, VIRTKEY, ALT, NOINVERT - VK_PRIOR, MENU_PREVIOUS_MODE, VIRTKEY, ALT, NOINVERT -END - -AppAbout DIALOG DISCARDABLE 0, 0, 188, 96 -STYLE DS_MODALFRAME | WS_POPUP -BEGIN - DEFPUSHBUTTON "OK",IDOK,76,75,35,14 - CTEXT "Direct3D Example",IDC_STATIC,61,5,65,15 - CTEXT "Copyright (c) 1995, 1996 Microsoft Corp.",IDC_STATIC,21,55, - 145,12 - ICON "AppIcon",IDC_STATIC,86,25,16,16 -END diff --git a/sdk/samples/misc/d3dmath.c b/sdk/samples/misc/d3dmath.c deleted file mode 100644 index 0ffebc8..0000000 --- a/sdk/samples/misc/d3dmath.c +++ /dev/null @@ -1,179 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dmath.c - * - ***************************************************************************/ - -#include -#include - -/* - * Normalises the vector v - */ -LPD3DVECTOR -D3DVECTORNormalise(LPD3DVECTOR v) -{ - float vx, vy, vz, inv_mod; - vx = v->x; - vy = v->y; - vz = v->z; - if ((vx == 0) && (vy == 0) && (vz == 0)) - return v; - inv_mod = (float)(1.0 / sqrt(vx * vx + vy * vy + vz * vz)); - v->x = vx * inv_mod; - v->y = vy * inv_mod; - v->z = vz * inv_mod; - return v; -} - - -/* - * Calculates cross product of a and b. - */ -LPD3DVECTOR -D3DVECTORCrossProduct(LPD3DVECTOR lpd, LPD3DVECTOR lpa, LPD3DVECTOR lpb) -{ - - lpd->x = lpa->y * lpb->z - lpa->z * lpb->y; - lpd->y = lpa->z * lpb->x - lpa->x * lpb->z; - lpd->z = lpa->x * lpb->y - lpa->y * lpb->x; - return lpd; -} - - -/* - * lpDst = lpSrc1 * lpSrc2 - * lpDst can be equal to lpSrc1 or lpSrc2 - */ -LPD3DMATRIX MultiplyD3DMATRIX(LPD3DMATRIX lpDst, LPD3DMATRIX lpSrc1, - LPD3DMATRIX lpSrc2) -{ - D3DVALUE M1[4][4], M2[4][4], D[4][4]; - int i, r, c; - - memcpy(&M1[0][0], lpSrc1, sizeof(D3DMATRIX)); - memcpy(&M2[0][0], lpSrc2, sizeof(D3DMATRIX)); - for (r = 0; r < 4; r++) { - for (c = 0; c < 4; c++) { - D[r][c] = (float)0.0; - for (i = 0; i < 4; i++) - D[r][c] += M1[r][i] * M2[i][c]; - } - } - memcpy(lpDst, &D[0][0], sizeof(D3DMATRIX)); - return lpDst; -} - - - -/* - * -1 d = a - */ -LPD3DMATRIX -D3DMATRIXInvert(LPD3DMATRIX d, LPD3DMATRIX a) -{ - d->_11 = a->_11; - d->_12 = a->_21; - d->_13 = a->_31; - d->_14 = a->_14; - - d->_21 = a->_12; - d->_22 = a->_22; - d->_23 = a->_32; - d->_24 = a->_24; - - d->_31 = a->_13; - d->_32 = a->_23; - d->_33 = a->_33; - d->_34 = a->_34; - - d->_41 = a->_14; - d->_42 = a->_24; - d->_43 = a->_34; - d->_44 = a->_44; - - return d; -} - - -/* - * Set the rotation part of a matrix such that the vector lpD is the new - * z-axis and lpU is the new y-axis. - */ -LPD3DMATRIX -D3DMATRIXSetRotation(LPD3DMATRIX lpM, LPD3DVECTOR lpD, LPD3DVECTOR lpU) -{ - float t; - D3DVECTOR d, u, r; - - /* - * Normalise the direction vector. - */ - d.x = lpD->x; - d.y = lpD->y; - d.z = lpD->z; - D3DVECTORNormalise(&d); - - u.x = lpU->x; - u.y = lpU->y; - u.z = lpU->z; - /* - * Project u into the plane defined by d and normalise. - */ - t = u.x * d.x + u.y * d.y + u.z * d.z; - u.x -= d.x * t; - u.y -= d.y * t; - u.z -= d.z * t; - D3DVECTORNormalise(&u); - - /* - * Calculate the vector pointing along the matrix x axis (in a right - * handed coordinate system) using cross product. - */ - D3DVECTORCrossProduct(&r, &u, &d); - - lpM->_11 = r.x; - lpM->_12 = r.y, lpM->_13 = r.z; - lpM->_21 = u.x; - lpM->_22 = u.y, lpM->_23 = u.z; - lpM->_31 = d.x; - lpM->_32 = d.y; - lpM->_33 = d.z; - - return lpM; -} - -/* - * Calculates a point along a B-Spline curve defined by four points. p - * n output, contain the point. t Position - * along the curve between p2 and p3. This position is a float between 0 - * and 1. p1, p2, p3, p4 Points defining spline curve. p, at parameter - * t along the spline curve - */ -void -spline(LPD3DVECTOR p, float t, LPD3DVECTOR p1, LPD3DVECTOR p2, - LPD3DVECTOR p3, LPD3DVECTOR p4) -{ - double t2, t3; - float m1, m2, m3, m4; - - t2 = (double)(t * t); - t3 = t2 * (double)t; - - m1 = (float)((-1.0 * t3) + (2.0 * t2) + (-1.0 * (double)t)); - m2 = (float)((3.0 * t3) + (-5.0 * t2) + (0.0 * (double)t) + 2.0); - m3 = (float)((-3.0 * t3) + (4.0 * t2) + (1.0 * (double)t)); - m4 = (float)((1.0 * t3) + (-1.0 * t2) + (0.0 * (double)t)); - - m1 /= (float)2.0; - m2 /= (float)2.0; - m3 /= (float)2.0; - m4 /= (float)2.0; - - p->x = p1->x * m1 + p2->x * m2 + p3->x * m3 + p4->x * m4; - p->y = p1->y * m1 + p2->y * m2 + p3->y * m3 + p4->y * m4; - p->z = p1->z * m1 + p2->z * m2 + p3->z * m3 + p4->z * m4; -} - diff --git a/sdk/samples/misc/d3dmath.h b/sdk/samples/misc/d3dmath.h deleted file mode 100644 index e295cd2..0000000 --- a/sdk/samples/misc/d3dmath.h +++ /dev/null @@ -1,58 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dmath.h - * - ***************************************************************************/ -#ifndef __D3DMATH_H__ -#define __D3DMATH_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif -/* - * Normalises the vector v - */ -LPD3DVECTOR D3DVECTORNormalise(LPD3DVECTOR v); - -/* - * Calculates cross product of a and b. - */ -LPD3DVECTOR D3DVECTORCrossProduct(LPD3DVECTOR lpd, LPD3DVECTOR lpa, LPD3DVECTOR lpb); - -/* - * lpDst = lpSrc1 * lpSrc2 - * lpDst can be equal to lpSrc1 or lpSrc2 - */ -LPD3DMATRIX MultiplyD3DMATRIX(LPD3DMATRIX lpDst, LPD3DMATRIX lpSrc1, - LPD3DMATRIX lpSrc2); -/* - * -1 d = a - */ -LPD3DMATRIX D3DMATRIXInvert(LPD3DMATRIX d, LPD3DMATRIX a); - -/* - * Set the rotation part of a matrix such that the vector lpD is the new - * z-axis and lpU is the new y-axis. - */ -LPD3DMATRIX D3DMATRIXSetRotation(LPD3DMATRIX lpM, LPD3DVECTOR lpD, LPD3DVECTOR lpU); - -/* - * Calculates a point along a B-Spline curve defined by four points. p - * n output, contain the point. t Position - * along the curve between p2 and p3. This position is a float between 0 - * and 1. p1, p2, p3, p4 Points defining spline curve. p, at parameter - * t along the spline curve - */ -void spline(LPD3DVECTOR p, float t, LPD3DVECTOR p1, LPD3DVECTOR p2, - LPD3DVECTOR p3, LPD3DVECTOR p4); - -#ifdef __cplusplus -}; -#endif - -#endif // __D3DMATH_H__ - diff --git a/sdk/samples/misc/d3dres.h b/sdk/samples/misc/d3dres.h deleted file mode 100644 index 7ccde74..0000000 --- a/sdk/samples/misc/d3dres.h +++ /dev/null @@ -1,38 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddres.h - * - ***************************************************************************/ - -#define MENU_ABOUT 1 -#define MENU_EXIT 2 -#define MENU_TEXTURE_TOGGLE 3 -#define MENU_TEXTURE_SWAP 4 -#define MENU_FULLSCREEN 7 -#define MENU_NEXT_MODE 8 -#define MENU_PREVIOUS_MODE 9 -#define MENU_STATS 10 -#define MENU_FLAT 12 -#define MENU_GOURAUD 13 -#define MENU_PHONG 14 -#define MENU_ZBUFFER 15 -#define MENU_PERSPCORRECT 16 -#define MENU_POINT_FILTER 17 -#define MENU_LINEAR_FILTER 18 -#define MENU_CLEARS 19 -#define MENU_POINT 20 -#define MENU_WIREFRAME 21 -#define MENU_SOLID 22 -#define MENU_SPECULAR 23 -#define MENU_DITHERING 24 -#define MENU_FOG 25 -#define MENU_ANTIALIAS 26 -#define MENU_STEP 27 -#define MENU_GO 28 -#define MENU_FIRST_FORMAT 40 -#define MENU_FIRST_DRIVER 100 -#define MENU_FIRST_MODE 200 - -#define IDC_STATIC -1 diff --git a/sdk/samples/misc/d3dsphr.c b/sdk/samples/misc/d3dsphr.c deleted file mode 100644 index cdeb113..0000000 --- a/sdk/samples/misc/d3dsphr.c +++ /dev/null @@ -1,211 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dsphr.c - * - ***************************************************************************/ - -#include -#include - -#define PI 3.1415 - -/* - * Generates a sphere around the y-axis centered at the origin including - * normals and texture coordiantes. Returns TRUE on success and FALSE on - * failure. - * sphere_r Radius of the sphere. - * num_rings Number of full rings not including the top and bottom - * caps. - * num_sections Number of sections each ring is divided into. Each - * section contains two triangles on full rings and one - * on top and bottom caps. - * sx, sy, sz Scaling along each axis. Set each to 1.0 for a - * perfect sphere. - * plpv On exit points to the vertices of the sphere. The - * function allocates this space. Not allocated if - * function fails. - * plptri On exit points to the triangles of the sphere which - * reference vertices in the vertex list. The function - * allocates this space. Not allocated if function fails. - * pnum_v On exit contains the number of vertices. - * pnum_tri On exit contains the number of triangles. - */ -BOOL -GenerateSphere(float sphere_r, int num_rings, int num_sections, float sx, - float sy, float sz, LPD3DVERTEX* plpv, - LPD3DTRIANGLE* plptri, int* pnum_v, int* pnum_tri) -{ - - float theta, phi; /* Angles used to sweep around sphere */ - float dtheta, dphi; /* Angle between each section and ring */ - float x, y, z, v, rsintheta; /* Temporary variables */ - int i, j, n, m; /* counters */ - int num_v, num_tri; /* Internal vertex and triangle count */ - LPD3DVERTEX lpv; /* Internal pointer for vertices */ - LPD3DTRIANGLE lptri; /* Internal pointer for trianlges */ - - /* - * Check the parameters to make sure they are valid. - */ - if ((sphere_r <= 0) || (num_rings < 1) || (num_sections < 3) || - (sx <= 0) || (sy <= 0) || (sz <= 0)) - return FALSE; - /* - * Generate space for the required triangles and vertices. - */ - num_tri = (num_rings + 1) * num_sections * 2; - num_v = (num_rings + 1) * num_sections + 2; - *plpv = (LPD3DVERTEX) malloc(sizeof(D3DVERTEX) * num_v); - *plptri = (LPD3DTRIANGLE) malloc(sizeof(D3DTRIANGLE) * num_tri); - lpv = *plpv; - lptri = *plptri; - *pnum_v = num_v; - *pnum_tri = num_tri; - - /* - * Generate vertices at the top and bottom points. - */ - lpv[0].x = D3DVAL(0.0); - lpv[0].y = D3DVAL(sy * sphere_r); - lpv[0].z = D3DVAL(0.0); - lpv[0].nx = D3DVAL(0.0); - lpv[0].ny = D3DVAL(1.0); - lpv[0].nz = D3DVAL(0.0); - lpv[0].tu = D3DVAL(0.0); - lpv[0].tv = D3DVAL(0.0); - lpv[num_v - 1].x = D3DVAL(0.0); - lpv[num_v - 1].y = D3DVAL(sy * -sphere_r); - lpv[num_v - 1].z = D3DVAL(0.0); - lpv[num_v - 1].nx = D3DVAL(0.0); - lpv[num_v - 1].ny = D3DVAL(-1.0); - lpv[num_v - 1].nz = D3DVAL(0.0); - lpv[num_v - 1].tu = D3DVAL(0.0); - lpv[num_v - 1].tv = D3DVAL(1.0); - - - /* - * Generate vertex points for rings - */ - dtheta = (float)(PI / (double)(num_rings + 2)); - dphi = (float)(2.0 * PI / (double) num_sections); - n = 1; /* vertex being generated, begins at 1 to skip top point */ - theta = dtheta; - for (i = 0; i <= num_rings; i++) { - y = sphere_r * (float)cos(theta); /* y is the same for each ring */ - v = theta / (float)PI; /* v is the same for each ring */ - rsintheta = sphere_r * (float)sin(theta); - phi = (float)0.0; - for (j = 0; j < num_sections; j++) { - x = rsintheta * (float)sin(phi); - z = rsintheta * (float)cos(phi); - lpv[n].x = D3DVAL(sx * x); - lpv[n].z = D3DVAL(sz * z); - lpv[n].y = D3DVAL(sy * y); - lpv[n].nx = D3DVAL(x / sphere_r); - lpv[n].ny = D3DVAL(y / sphere_r); - lpv[n].nz = D3DVAL(z / sphere_r); - lpv[n].tv = D3DVAL(v); - lpv[n].tu = D3DVAL((float)(1.0 - phi / (2.0 * PI))); - phi += dphi; - ++n; - } - theta += dtheta; - } - - /* - * Generate triangles for top and bottom caps. - */ - if (num_sections < 30) { - /* - * we can put the whole cap in a tri fan. - */ - for (i = 0; i < num_sections; i++) { - lptri[i].v1 = 0; - lptri[i].v2 = i + 1; - lptri[i].v3 = 1 + ((i + 1) % num_sections); - - lptri[num_tri - num_sections + i].v1 = num_v - 1; - lptri[num_tri - num_sections + i].v2 = num_v - 2 - i; - lptri[num_tri - num_sections + i].v3 = num_v - 2 - - ((1 + i) % num_sections); - - - /* - * Enable correct edges. - */ - lptri[i].wFlags = D3DTRIFLAG_EDGEENABLE1 | - D3DTRIFLAG_EDGEENABLE2; - - lptri[num_tri - num_sections + i].wFlags= D3DTRIFLAG_EDGEENABLE1 | - D3DTRIFLAG_EDGEENABLE2; - /* - * build fans. - */ - if (i == 0) { - lptri[i].wFlags |= D3DTRIFLAG_START; - lptri[num_tri - num_sections + i].wFlags |= D3DTRIFLAG_START; - } else { - lptri[i].wFlags |= D3DTRIFLAG_EVEN; - lptri[num_tri - num_sections + i].wFlags |= D3DTRIFLAG_EVEN; - } - - } - } else { - for (i = 0; i < num_sections; i++) { - lptri[i].v1 = 0; - lptri[i].v2 = i + 1; - lptri[i].v3 = 1 + ((i + 1) % num_sections); - lptri[i].wFlags = D3DTRIFLAG_EDGEENABLE1; - D3DTRIFLAG_EDGEENABLE2; - lptri[num_tri - num_sections + i].v1 = num_v - 1; - lptri[num_tri - num_sections + i].v2 = num_v - 2 - i; - lptri[num_tri - num_sections + i].v3 = num_v - 2 - - ((1 + i) % num_sections); - lptri[num_tri - num_sections + i].wFlags= D3DTRIFLAG_EDGEENABLE1 | - D3DTRIFLAG_EDGEENABLE2; - } - } - - /* - * Generate triangles for the rings - */ - m = 1; /* first vertex in current ring,begins at 1 to skip top point*/ - n = num_sections; /* triangle being generated, skip the top cap */ - for (i = 0; i < num_rings; i++) { - for (j = 0; j < num_sections; j++) { - lptri[n].v1 = m + j; - lptri[n].v2 = m + num_sections + j; - lptri[n].v3 = m + num_sections + ((j + 1) % num_sections); - lptri[n].wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - - /* - * Start a two triangle flat fan for each face. - */ - - lptri[n].wFlags = D3DTRIFLAG_STARTFLAT(1); - - /* - * only need two edges for wireframe. - */ - lptri[n].wFlags |= D3DTRIFLAG_EDGEENABLE1 | - D3DTRIFLAG_EDGEENABLE2; - - - lptri[n + 1].v1 = lptri[n].v1; - lptri[n + 1].v2 = lptri[n].v3; - lptri[n + 1].v3 = m + ((j + 1) % num_sections); - - lptri[n + 1].wFlags = D3DTRIFLAG_EVEN; - /* - * only need two edges for wireframe. - */ - lptri[n + 1].wFlags |= D3DTRIFLAG_EDGEENABLE2 | - D3DTRIFLAG_EDGEENABLE3; - n += 2; - } - m += num_sections; - } - return TRUE; -} diff --git a/sdk/samples/misc/d3dsphr.h b/sdk/samples/misc/d3dsphr.h deleted file mode 100644 index 236a1a2..0000000 --- a/sdk/samples/misc/d3dsphr.h +++ /dev/null @@ -1,45 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: d3dsphr.h - * - ***************************************************************************/ -#ifndef __D3DSPHR_H__ -#define __D3DSPHR_H__ - -#ifdef __cplusplus -extern "C" { -#endif -/* - * Generates a sphere around the y-axis centered at the origin including - * normals and texture coordiantes. Returns TRUE on success and FALSE on - * failure. - * sphere_r Radius of the sphere. - * num_rings Number of full rings not including the top and bottom - * caps. - * num_sections Number of sections each ring is divided into. Each - * section contains two triangles on full rings and one - * on top and bottom caps. - * sx, sy, sz Scaling along each axis. Set each to 1.0 for a - * perfect sphere. - * plpv On exit points to the vertices of the sphere. The - * function allocates this space. Not allocated if - * function fails. - * plptri On exit points to the triangles of the sphere which - * reference vertices in the vertex list. The function - * allocates this space. Not allocated if function fails. - * pnum_v On exit contains the number of vertices. - * pnum_tri On exit contains the number of triangles. - */ -BOOL -GenerateSphere(float sphere_r, int num_rings, int num_sections, float sx, - float sy, float sz, LPD3DVERTEX* plpv, - LPD3DTRIANGLE* plptri, int* pnum_v, int* pnum_tri); - -#ifdef __cplusplus -}; -#endif - -#endif // __D3DSPHR_H__ - diff --git a/sdk/samples/misc/ddcalls.c b/sdk/samples/misc/ddcalls.c deleted file mode 100644 index e539bce..0000000 --- a/sdk/samples/misc/ddcalls.c +++ /dev/null @@ -1,974 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddcalls.c - * - * Manages DirectDraw objects needed for rendering. Part of D3DApp. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#include "d3dappi.h" - -/***************************************************************************/ -/* Direct Draw Creation */ -/***************************************************************************/ -/* - * D3DAppIDDEnumCallback - * Callback function used during enumeration of DirectDraw drivers. - * During enumeration, if a 3D capable hardware device is found, it is - * created and *(LPDIRECTDRAW*)lpContext is set to it. Otherwise, does - * nothing. - */ -BOOL FAR PASCAL D3DAppIDDEnumCallback(GUID FAR* lpGUID, LPSTR lpDriverDesc, - LPSTR lpDriverName, LPVOID lpContext) -{ - LPDIRECTDRAW lpDD; - DDCAPS DriverCaps, HELCaps; - - /* - * A NULL GUID* indicates the DirectDraw HEL which we are not interested - * in at the moment. - */ - if (lpGUID) { - /* - * Create the DirectDraw device using this driver. If it fails, - * just move on to the next driver. - */ - if (FAILED(DirectDrawCreate(lpGUID, &lpDD, NULL))) { - return DDENUMRET_OK; - } - /* - * Get the capabilities of this DirectDraw driver. If it fails, - * just move on to the next driver. - */ - memset(&DriverCaps, 0, sizeof(DDCAPS)); - DriverCaps.dwSize = sizeof(DDCAPS); - memset(&HELCaps, 0, sizeof(DDCAPS)); - HELCaps.dwSize = sizeof(DDCAPS); - if (FAILED(lpDD->lpVtbl->GetCaps(lpDD, &DriverCaps, &HELCaps))) { - lpDD->lpVtbl->Release(lpDD); - return DDENUMRET_OK; - } - if (DriverCaps.dwCaps & DDCAPS_3D) { - /* - * We have found a 3d hardware device. Return the DD object - * and stop enumeration. - */ - d3dappi.bIsPrimary = FALSE; - *(LPDIRECTDRAW*)lpContext = lpDD; - return DDENUMRET_CANCEL; - } - lpDD->lpVtbl->Release(lpDD); - } - return DDENUMRET_OK; -} - -/* - * D3DAppICreateDD - * Creates the DirectDraw device and saves the current palette. If a 3D - * capable DD driver is available, use it as the DD device, otherwise, use - * the HEL. It is assumed that a 3D capable DD hardware driver is not the - * primary device and hence cannot operate in a window (ie it's a fullscreen - * only device displaying on a second monitor). Valid flags: - * D3DAPP_ONLYDDEMULATION Always use the DirectDraw HEL - */ -BOOL -D3DAppICreateDD(DWORD flags) -{ - HDC hdc; - int i; - LPDIRECTDRAW lpDD = NULL; - - /* - * If we aren't forced to use the DirectDraw HEL, search for a 3D capable - * DirectDraw hardware driver and create it. - */ - if (!(flags & D3DAPP_ONLYDDEMULATION)) { - LastError = DirectDrawEnumerate(D3DAppIDDEnumCallback, &lpDD); - if (LastError != DD_OK) { - D3DAppISetErrorString("DirectDrawEnumerate failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - } - if (!lpDD) { - /* - * If we haven't created a hardware DD device by now, resort to HEL - */ - d3dappi.bIsPrimary = TRUE; - LastError = DirectDrawCreate(NULL, &d3dappi.lpDD, NULL); - if (LastError != DD_OK) { - D3DAppISetErrorString("DirectDrawCreate failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - } else { - d3dappi.lpDD = lpDD; - } - /* - * Save the original palette for when we are paused. Just in case we - * start in a fullscreen mode, put them in ppe. - */ - hdc = GetDC(NULL); - GetSystemPaletteEntries(hdc, 0, (1 << 8), - (LPPALETTEENTRY)(&Originalppe[0])); - for (i = 0; i < 256; i++) - ppe[i] = Originalppe[i]; - ReleaseDC(NULL, hdc); - return TRUE; -} - -/***************************************************************************/ -/* Enumerating the display modes */ -/***************************************************************************/ -/* - * EnumDisplayModesCallback - * Callback to save the display mode information. - */ -static HRESULT -CALLBACK EnumDisplayModesCallback(LPDDSURFACEDESC pddsd, LPVOID lpContext) -{ - /* - * Very large resolutions cause problems on some hardware. They are also - * not very useful for real-time rendering. We have chosen to disable - * them by not reporting them as available. - */ - if (pddsd->dwWidth > 1024 || pddsd->dwHeight > 768) - return DDENUMRET_OK; - /* - * Save this mode at the end of the mode array and increment mode count - */ - d3dappi.Mode[d3dappi.NumModes].w = pddsd->dwWidth; - d3dappi.Mode[d3dappi.NumModes].h = pddsd->dwHeight; - d3dappi.Mode[d3dappi.NumModes].bpp = pddsd->ddpfPixelFormat.dwRGBBitCount; - d3dappi.Mode[d3dappi.NumModes].bThisDriverCanDo = FALSE; - d3dappi.NumModes++; - if (d3dappi.NumModes == D3DAPP_MAXMODES) - return DDENUMRET_CANCEL; - else - return DDENUMRET_OK; -} - -/* - * CompareModes - * Compare two display modes during sorting. Modes are sorted by depth and - * then resolution. - */ -static int -_cdecl CompareModes(const void* element1, const void* element2) { - D3DAppMode *lpMode1, *lpMode2; - - lpMode1 = (D3DAppMode*)element1; - lpMode2 = (D3DAppMode*)element2; - - if (lpMode1->bpp > lpMode2->bpp) - return -1; - else if (lpMode2->bpp > lpMode1->bpp) - return 1; - else if (lpMode1->w > lpMode2->w) - return -1; - else if (lpMode2->w > lpMode1->w) - return 1; - else if (lpMode1->h > lpMode2->h) - return -1; - else if (lpMode2->h > lpMode1->h) - return 1; - else - return 0; -} - -/* - * EnumerateDisplayModes - * Generates the list of available display modes. - */ -BOOL -D3DAppIEnumDisplayModes(void) -{ - int i; - /* - * Get a list of available display modes from DirectDraw - */ - d3dappi.NumModes = 0; - LastError = d3dappi.lpDD->lpVtbl->EnumDisplayModes(d3dappi.lpDD, 0, NULL, - 0, EnumDisplayModesCallback); - if(LastError != DD_OK ) { - D3DAppISetErrorString("EnumDisplayModes failed.\n%s", - D3DAppErrorToString(LastError)); - d3dappi.NumModes = 0; - return FALSE; - } - /* - * Sort the list of display modes - */ - qsort((void *)&d3dappi.Mode[0], (size_t)d3dappi.NumModes, sizeof(D3DAppMode), - CompareModes); - /* - * Pick a default display mode. 640x480x16 is a very good mode for - * rendering, so choose it over all others. Otherwise, just take the - * first one. This selection may be overriden later if a driver is - * created which cannot render in this mode. - */ - d3dappi.CurrMode = 0; - for (i = 0; i < d3dappi.NumModes; i++) { - if (d3dappi.Mode[i].w == 640 && d3dappi.Mode[i].h == 480 && - d3dappi.Mode[i].bpp == 16) - d3dappi.CurrMode = i; - } - memcpy(&d3dappi.ThisMode, &d3dappi.Mode[d3dappi.CurrMode], - sizeof(D3DAppMode)); - return TRUE; -} - -/***************************************************************************/ -/* Creating Front and Back Buffers (and misc surf funcs) */ -/***************************************************************************/ -/* - * D3DAppICreateSurface - * Create a DirectDraw Surface of the given description. Using this function - * ensures that all surfaces end up in system memory if that option was set. - * Returns the result of the CreateSurface call. - */ -HRESULT -D3DAppICreateSurface(LPDDSURFACEDESC lpDDSurfDesc, - LPDIRECTDRAWSURFACE FAR *lpDDSurface) { - HRESULT result; - if (d3dappi.bOnlySystemMemory) - lpDDSurfDesc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - result = d3dappi.lpDD->lpVtbl->CreateSurface(d3dappi.lpDD, lpDDSurfDesc, - lpDDSurface, NULL); - return result; -} - -/* - * D3DAppIGetSurfDesc - * Get the description of the given surface. Returns the result of the - * GetSurfaceDesc call. - */ -HRESULT -D3DAppIGetSurfDesc(LPDDSURFACEDESC lpDDSurfDesc,LPDIRECTDRAWSURFACE lpDDSurf) -{ - HRESULT result; - memset(lpDDSurfDesc, 0, sizeof(DDSURFACEDESC)); - lpDDSurfDesc->dwSize = sizeof(DDSURFACEDESC); - result = lpDDSurf->lpVtbl->GetSurfaceDesc(lpDDSurf, lpDDSurfDesc); - return result; -} - -/* - * D3DAppICreateBuffers - * Creates the front and back buffers for the window or fullscreen case - * depending on the bFullscreen flag. In the window case, bpp is ignored. - */ -BOOL -D3DAppICreateBuffers(HWND hwnd, int w, int h, int bpp, BOOL bFullscreen, BOOL bIsHardware) -{ - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - - /* - * Release any old objects that might be lying around. This should have - * already been taken care of, but just in case... - */ - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - /* - * The size of the buffers is going to be w x h, so record it now - */ - if (w < D3DAPP_WINDOWMINIMUM) - w = D3DAPP_WINDOWMINIMUM; - if (h < D3DAPP_WINDOWMINIMUM) - h = D3DAPP_WINDOWMINIMUM; - szBuffers.cx = w; - szBuffers.cy = h; - - if (bFullscreen) { - /* - * Create a complex flipping surface for fullscreen mode with one - * back buffer. - */ - memset(&ddsd,0,sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | - DDSCAPS_3DDEVICE | DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - if (bIsHardware) - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - LastError = D3DAppICreateSurface(&ddsd, &d3dappi.lpFrontBuffer); - if(LastError != DD_OK) { - if (LastError == DDERR_OUTOFMEMORY || LastError == DDERR_OUTOFVIDEOMEMORY) { - D3DAppISetErrorString("There was not enough video memory to create the rendering surface.\nPlease restart the program and try another fullscreen mode with less resolution or lower bit depth."); - } else { - D3DAppISetErrorString("CreateSurface for fullscreen flipping surface failed.\n%s", - D3DAppErrorToString(LastError)); - } - goto exit_with_error; - } - /* - * Obtain a pointer to the back buffer surface created above so we - * can use it later. For now, just check to see if it ended up in - * video memory (FYI). - */ - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - LastError = d3dappi.lpFrontBuffer->lpVtbl->GetAttachedSurface(d3dappi.lpFrontBuffer, &ddscaps, &d3dappi.lpBackBuffer); - if(LastError != DD_OK) { - D3DAppISetErrorString("GetAttachedSurface failed to get back buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpBackBuffer); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to get surface description of back buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - d3dappi.bBackBufferInVideo = - (ddsd.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) ? TRUE : FALSE; - } - else { - /* - * In the window case, create a front buffer which is the primary - * surface and a back buffer which is an offscreen plane surface. - */ - memset(&ddsd,0,sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - /* - * If we specify system memory when creating a primary surface, we - * won't get the actual primary surface in video memory. So, don't - * use D3DAppICreateSurface(). - */ - LastError = d3dappi.lpDD->lpVtbl->CreateSurface(d3dappi.lpDD, - &ddsd, &d3dappi.lpFrontBuffer, NULL); - if(LastError != DD_OK ) { - if (LastError == DDERR_OUTOFMEMORY || LastError == DDERR_OUTOFVIDEOMEMORY) { - D3DAppISetErrorString("There was not enough video memory to create the rendering surface.\nTo run this program in a window of this size, please adjust your display settings for a smaller desktop area or a lower palette size and restart the program."); - } else { - D3DAppISetErrorString("CreateSurface for window front buffer failed.\n%s", - D3DAppErrorToString(LastError)); - } - goto exit_with_error; - } - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; - ddsd.dwWidth = w; - ddsd.dwHeight = h; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE; - if (bIsHardware) - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - else - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - LastError = D3DAppICreateSurface(&ddsd, &d3dappi.lpBackBuffer); - if (LastError != DD_OK) { - if (LastError == DDERR_OUTOFMEMORY || LastError == DDERR_OUTOFVIDEOMEMORY) { - D3DAppISetErrorString("There was not enough video memory to create the rendering surface.\nTo run this program in a window of this size, please adjust your display settings for a smaller desktop area or a lower palette size and restart the program."); - } else { - D3DAppISetErrorString("CreateSurface for window back buffer failed.\n%s", - D3DAppErrorToString(LastError)); - } - goto exit_with_error; - } - /* - * Check to see if the back buffer is in video memory (FYI). - */ - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpBackBuffer); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to get surface description for back buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - d3dappi.bBackBufferInVideo = - (ddsd.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) ? TRUE : FALSE; - /* - * Create the DirectDraw Clipper object and attach it to the window - * and front buffer. - */ - LastError = d3dappi.lpDD->lpVtbl->CreateClipper(d3dappi.lpDD, 0, - &lpClipper, NULL); - if(LastError != DD_OK ) { - D3DAppISetErrorString("CreateClipper failed.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = lpClipper->lpVtbl->SetHWnd(lpClipper, 0, hwnd); - if(LastError != DD_OK ) { - D3DAppISetErrorString("Attaching clipper to window failed.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = - d3dappi.lpFrontBuffer->lpVtbl->SetClipper(d3dappi.lpFrontBuffer, - lpClipper); - if(LastError != DD_OK ) { - D3DAppISetErrorString("Attaching clipper to front buffer failed.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - } - - D3DAppIClearBuffers(); - return TRUE; - -exit_with_error: - RELEASE(d3dappi.lpFrontBuffer); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(lpClipper); - return FALSE; -} - -/* - * D3DAppICheckForPalettized - * If the front/back buffer is palettized, we need to create a palette. - */ -BOOL -D3DAppICheckForPalettized(void) -{ - DDSURFACEDESC ddsd; - /* - * Get the back buffer surface description and check to see if it's - * palettized - */ - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpBackBuffer); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to get surface description for back buffer for palettizing.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - bPrimaryPalettized = - (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) ? TRUE : FALSE; - - if (bPrimaryPalettized) { - int i; - /* - * Get the current palette. - */ - HDC hdc = GetDC(NULL); - GetSystemPaletteEntries(hdc, 0, (1 << 8), ppe); - ReleaseDC(NULL, hdc); - /* - * Change the flags on the palette entries to allow D3D to change - * some of them. In the window case, we must not change the top and - * bottom ten (system colors), but in a fullscreen mode we can have - * all but the first and last. - */ - if (!d3dappi.bFullscreen) { - for (i = 0; i < 10; i++) ppe[i].peFlags = D3DPAL_READONLY; - for (i = 10; i < 256 - 10; i++) ppe[i].peFlags = D3DPAL_FREE | PC_RESERVED; - for (i = 256 - 10; i < 256; i++) ppe[i].peFlags = D3DPAL_READONLY; - } else { - ppe[0].peFlags = D3DPAL_READONLY; - for (i = 1; i < 255; i++) ppe[i].peFlags = D3DPAL_FREE | PC_RESERVED; - ppe[255].peFlags = D3DPAL_READONLY; - } - /* - * Create a palette using the old colors and new flags - */ - LastError = d3dappi.lpDD->lpVtbl->CreatePalette(d3dappi.lpDD, - DDPCAPS_8BIT | DDPCAPS_INITIALIZE, - ppe, &lpPalette, NULL); - if (LastError != DD_OK) { - D3DAppISetErrorString("CreatePalette failed.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Set this as the front and back buffers' palette - */ - LastError = - d3dappi.lpBackBuffer->lpVtbl->SetPalette(d3dappi.lpBackBuffer, - lpPalette); - if(LastError != DD_OK ) { - D3DAppISetErrorString("SetPalette failed on back buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = - d3dappi.lpFrontBuffer->lpVtbl->SetPalette(d3dappi.lpFrontBuffer, - lpPalette); - if(LastError != DD_OK ) { - D3DAppISetErrorString("SetPalette failed on front buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * The palette is now valid, so set it again on anyt WM_ACTIVATE - */ - bPaletteActivate = TRUE; - } - return TRUE; -exit_with_error: - RELEASE(lpPalette); - return FALSE; -} - -/***************************************************************************/ -/* Creation of Z-Buffer */ -/***************************************************************************/ -/* - * D3DAppICreateZBuffer - * Create a Z-Buffer of the appropriate depth and attach it to the back - * buffer. - */ -BOOL -D3DAppICreateZBuffer(int w, int h, int driver) -{ - DDSURFACEDESC ddsd; - DWORD devDepth; - /* - * Release any Z-Buffer that might be around just in case. - */ - RELEASE(d3dappi.lpZBuffer); - - /* - * If this driver does not do z-buffering, don't create a z-buffer - */ - if (!d3dappi.Driver[driver].bDoesZBuffer) - return TRUE; - - memset(&ddsd, 0 ,sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | - DDSD_ZBUFFERBITDEPTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER; - ddsd.dwHeight = h; - ddsd.dwWidth = w; - /* - * If this is a hardware D3D driver, the Z-Buffer MUST end up in video - * memory. Otherwise, it MUST end up in system memory. - */ - if (d3dappi.Driver[driver].bIsHardware) - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - else - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - /* - * Get the Z buffer bit depth from this driver's D3D device description - */ - devDepth = d3dappi.Driver[driver].Desc.dwDeviceZBufferBitDepth; - if (devDepth & DDBD_32) - ddsd.dwZBufferBitDepth = 32; - else if (devDepth & DDBD_24) - ddsd.dwZBufferBitDepth = 24; - else if (devDepth & DDBD_16) - ddsd.dwZBufferBitDepth = 16; - else if (devDepth & DDBD_8) - ddsd.dwZBufferBitDepth = 8; - else { - D3DAppISetErrorString("Unsupported Z-buffer depth requested by device.\n"); - return FALSE; - } - LastError = d3dappi.lpDD->lpVtbl->CreateSurface(d3dappi.lpDD, &ddsd, - &d3dappi.lpZBuffer, - NULL); - if(LastError != DD_OK) { - if (LastError == DDERR_OUTOFMEMORY || LastError == DDERR_OUTOFVIDEOMEMORY) { - if (d3dappi.bFullscreen) { - D3DAppISetErrorString("There was not enough video memory to create the Z-buffer surface.\nPlease restart the program and try another fullscreen mode with less resolution or lower bit depth."); - } else { - D3DAppISetErrorString("There was not enough video memory to create the Z-buffer surface.\nTo run this program in a window of this size, please adjust your display settings for a smaller desktop area or a lower palette size and restart the program."); - } - } else { - D3DAppISetErrorString("CreateSurface for Z-buffer failed.\n%s", - D3DAppErrorToString(LastError)); - } - goto exit_with_error; - } - /* - * Attach the Z-buffer to the back buffer so D3D will find it - */ - LastError = - d3dappi.lpBackBuffer->lpVtbl->AddAttachedSurface(d3dappi.lpBackBuffer, - d3dappi.lpZBuffer); - if(LastError != DD_OK) { - D3DAppISetErrorString("AddAttachedBuffer failed for Z-Buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Find out if it ended up in video memory. - */ - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpZBuffer); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to get surface description of Z buffer.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - d3dappi.bZBufferInVideo = - (ddsd.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) ? TRUE : FALSE; - if (d3dappi.Driver[driver].bIsHardware && !d3dappi.bZBufferInVideo) { - D3DAppISetErrorString("Could not fit the Z-buffer in video memory for this hardware device.\n"); - goto exit_with_error; - } - - return TRUE; - -exit_with_error: - RELEASE(d3dappi.lpZBuffer); - return FALSE; -} - -/***************************************************************************/ -/* WM_SIZE Handler */ -/***************************************************************************/ -/* - * D3DAppIHandleWM_SIZE - * Processes the WM_SIZE message. Resizes all the buffers and re-creates - * device if necessary. - */ -BOOL -D3DAppIHandleWM_SIZE(LRESULT* lresult, HWND hwnd, UINT message, - WPARAM wParam, LPARAM lParam) -{ - int w, h, i; - /* - * If we have minimzied, take note and call the default window proc - */ - if (wParam == SIZE_MINIMIZED) { - d3dappi.bMinimized = TRUE; - *lresult = DefWindowProc(hwnd, message, wParam, lParam); - return TRUE; - } - /* - * In fullscreen mode, restore our surfaces and let DDraw take - * care of the rest. - */ - if (d3dappi.bFullscreen) { - D3DAppIValidateDirtyRects(); - D3DAppCheckForLostSurfaces(); - d3dappi.bMinimized = FALSE; - *lresult = DefWindowProc(hwnd, message, wParam, lParam); - return TRUE; - } - /* - * If we are minimized, this is the un-minimized size message. - */ - if (d3dappi.bMinimized) { - /* - * Restore our surfaces and update the dirty rectangle info - */ - D3DAppIValidateDirtyRects(); - D3DAppCheckForLostSurfaces(); - d3dappi.bMinimized = FALSE; - *lresult = DefWindowProc(hwnd, message, wParam, lParam); - return TRUE; - } - /* - * Since we are still here, this must be a regular, window resize - * message. A new viewport will definitely be needed, but the - * device and buffers will only be re-created if they have gotten bigger - * or change size by a very large amount. - */ - D3DAppIGetClientWin(hwnd); - w = LOWORD(lParam); - h = HIWORD(lParam); - /* - * If w and h are under the minimum, create buffers of the minimum size - */ - if (w < D3DAPP_WINDOWMINIMUM) - w = D3DAPP_WINDOWMINIMUM; - if (h < D3DAPP_WINDOWMINIMUM) - h = D3DAPP_WINDOWMINIMUM; - /* - * Destroy the viewport and all execute buffers - */ - d3dappi.bRenderingIsOK = FALSE; - ATTEMPT(D3DAppICallDeviceDestroyCallback()); - /* - * Only create a new device and buffers if they changed significantly, - * otherwise just make sure the old buffers aren't lost. - */ - if ((w > szBuffers.cx || h > szBuffers.cy) || - (w < szBuffers.cx / 2 || h < szBuffers.cy / 2)) { - /* - * Release the device - */ - RELEASE(d3dappi.lpD3DDevice); - /* - * Release the old buffers - */ - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - /* - * Create new ones - */ - ATTEMPT(D3DAppICreateBuffers(hwnd, w, h, D3DAPP_BOGUS, FALSE, d3dappi.ThisDriver.bIsHardware)); - ATTEMPT(D3DAppICheckForPalettized()); - ATTEMPT(D3DAppICreateZBuffer(w, h, d3dappi.CurrDriver)); - /* - * Create the driver - */ - ATTEMPT(D3DAppICreateDevice(d3dappi.CurrDriver)); - /* - * Since the driver did not change, the texture surfaces are still valid. - * We just need to get new handles. - */ - if (d3dappi.ThisDriver.bDoesTextures) { - for (i = 0; i < d3dappi.NumUsableTextures; i++) { - D3DAppIGetTextureHandle(i); - } - } - } else { - D3DAppCheckForLostSurfaces(); - } - /* - * Call the device create callback to create the viewport, set the render - * state and clear the dirty rectangle info - */ - ATTEMPT(D3DAppICallDeviceCreateCallback(w, h)); - ATTEMPT(D3DAppISetRenderState()); - D3DAppIValidateDirtyRects(); - d3dappi.bRenderingIsOK = TRUE; - /* - * Call the default window proc - */ - *lresult = DefWindowProc(hwnd, message, wParam, lParam); - return TRUE; -exit_with_error: - D3DAppICallDeviceDestroyCallback(); - RELEASE(d3dappi.lpD3DDevice); - RELEASE(d3dappi.lpZBuffer); - RELEASE(lpPalette); - RELEASE(lpClipper); - RELEASE(d3dappi.lpBackBuffer); - RELEASE(d3dappi.lpFrontBuffer); - return FALSE; -} - -/***************************************************************************/ -/* Setting the display mode and cooperative level */ -/***************************************************************************/ -/* - * D3DAppISetCoopLevel - * Set the cooperative level to exclusive mode for fullscreen and normal for - * a window. Set the bIgnoreWM_SIZE flag because SetCooperativeLevel - * generates a WM_SIZE message you do not have to resize the buffers on. - */ -BOOL -D3DAppISetCoopLevel(HWND hwnd, BOOL bFullscreen) -{ - if (bFullscreen) { - bIgnoreWM_SIZE = TRUE; - LastError = d3dappi.lpDD->lpVtbl->SetCooperativeLevel(d3dappi.lpDD, - hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); - bIgnoreWM_SIZE = FALSE; - if(LastError != DD_OK ) { - D3DAppISetErrorString("SetCooperativeLevel to fullscreen failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - d3dappi.bFullscreen = TRUE; - } else { - bIgnoreWM_SIZE = TRUE; - LastError = d3dappi.lpDD->lpVtbl->SetCooperativeLevel(d3dappi.lpDD, - hwnd, DDSCL_NORMAL); - bIgnoreWM_SIZE = FALSE; - if(LastError != DD_OK ) { - D3DAppISetErrorString("SetCooperativeLevel to normal failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - d3dappi.bFullscreen = FALSE; - } - return TRUE; -} - -/* - * D3DAppISetDisplayMode - * Set the display mode to the given dimensions and bits per pixel. The - * bIgnoreWM_SIZE message is set because the display change generates a - * WM_SIZE message which we don't want to resize the buffers on. - */ -BOOL -D3DAppISetDisplayMode(int w, int h, int bpp) -{ - d3dappi.ThisMode.w = w; d3dappi.ThisMode.h = h; - d3dappi.ThisMode.bpp = bpp; - bIgnoreWM_SIZE = TRUE; - LastError = d3dappi.lpDD->lpVtbl->SetDisplayMode(d3dappi.lpDD, w, h, - bpp); - bIgnoreWM_SIZE = FALSE; - if(LastError != DD_OK ) { - D3DAppISetErrorString("SetDisplayMode to %dx%dx%d failed\n%s", - w, h, bpp, D3DAppErrorToString(LastError)); - return FALSE; - } - return TRUE; -} - -/* - * D3DAppIRestoreDispMode - * Restores the display mode to the current windows display mode. The - * bIgnoreWM_SIZE message is set because the display change generates a - * WM_SIZE message which we don't want to resize the buffers on. - */ -BOOL -D3DAppIRestoreDispMode(void) -{ - bIgnoreWM_SIZE = TRUE; - LastError = d3dappi.lpDD->lpVtbl->RestoreDisplayMode(d3dappi.lpDD); - if (LastError != DD_OK) { - D3DAppISetErrorString("RestoreDisplayMode failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - bIgnoreWM_SIZE = FALSE; - return TRUE; -} - -/* - * D3DAppRememberWindowsMode - * Record the current display mode in d3dappi.WindowsDisplay - */ -BOOL -D3DAppIRememberWindowsMode(void) -{ - DDSURFACEDESC ddsd; - - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - LastError = d3dappi.lpDD->lpVtbl->GetDisplayMode(d3dappi.lpDD, &ddsd); - if (LastError != DD_OK) { - D3DAppISetErrorString("Getting the current display mode failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - d3dappi.WindowsDisplay.w = ddsd.dwWidth; - d3dappi.WindowsDisplay.h = ddsd.dwHeight; - d3dappi.WindowsDisplay.bpp = ddsd.ddpfPixelFormat.dwRGBBitCount; - return TRUE; -} - -/***************************************************************************/ -/* Misc DD Utilities */ -/***************************************************************************/ - -/* - * D3DAppIClearBuffers - * Clear the front and back buffers to black - */ -BOOL -D3DAppIClearBuffers(void) -{ - DDSURFACEDESC ddsd; - RECT dst; - DDBLTFX ddbltfx; - /* - * Find the width and height of the front buffer by getting its - * DDSURFACEDESC - */ - if (d3dappi.lpFrontBuffer) { - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpFrontBuffer); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failure getting the surface description of the front buffer before clearing.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - /* - * Clear the front buffer to black - */ - memset(&ddbltfx, 0, sizeof(ddbltfx)); - ddbltfx.dwSize = sizeof(DDBLTFX); - SetRect(&dst, 0, 0, ddsd.dwWidth, ddsd.dwHeight); - LastError = d3dappi.lpFrontBuffer->lpVtbl->Blt(d3dappi.lpFrontBuffer, - &dst, NULL, NULL, - DDBLT_COLORFILL | DDBLT_WAIT, - &ddbltfx); - if (LastError != DD_OK) { - D3DAppISetErrorString("Clearing the front buffer failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - } - if (d3dappi.lpBackBuffer) { - /* - * Find the width and height of the back buffer by getting its - * DDSURFACEDESC - */ - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpBackBuffer); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failure while getting the surface description of the back buffer before clearing.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - /* - * Clear the back buffer to black - */ - memset(&ddbltfx, 0, sizeof(ddbltfx)); - ddbltfx.dwSize = sizeof(DDBLTFX); - SetRect(&dst, 0, 0, ddsd.dwWidth, ddsd.dwHeight); - LastError = d3dappi.lpBackBuffer->lpVtbl->Blt(d3dappi.lpBackBuffer, &dst, - NULL, NULL, - DDBLT_COLORFILL | DDBLT_WAIT, - &ddbltfx); - if (LastError != DD_OK) { - D3DAppISetErrorString("Clearing the front buffer failed.\n%s", - D3DAppErrorToString(LastError)); - return FALSE; - } - } - return TRUE; -} - -/* - * D3DAppIBPPToDDBD - * Convert an integer bit per pixel number to a DirectDraw bit depth flag - */ -DWORD -D3DAppIBPPToDDBD(int bpp) -{ - switch(bpp) { - case 1: - return DDBD_1; - case 2: - return DDBD_2; - case 4: - return DDBD_4; - case 8: - return DDBD_8; - case 16: - return DDBD_16; - case 24: - return DDBD_24; - case 32: - return DDBD_32; - default: - return (DWORD)D3DAPP_BOGUS; - } -} - -/* - * D3DAppTotalVideoMemory - * Returns the amount of total video memory supported (not free) - */ -DWORD -D3DAppTotalVideoMemory(void) -{ - DDCAPS DriverCaps, HELCaps; - memset (&DriverCaps, 0, sizeof(DDCAPS)); - DriverCaps.dwSize = sizeof(DDCAPS); - memset (&HELCaps, 0, sizeof(DDCAPS)); - HELCaps.dwSize = sizeof(DDCAPS); - LastError = d3dappi.lpDD->lpVtbl->GetCaps(d3dappi.lpDD, &DriverCaps, - &HELCaps); - if (LastError != DD_OK) { - D3DAppISetErrorString("Getting DD capabilities failed while checking total video memory.\n%s", - D3DAppErrorToString(LastError)); - return 0L; - } - if (DriverCaps.dwVidMemTotal) - return DriverCaps.dwVidMemTotal; - else - return HELCaps.dwVidMemTotal; -} diff --git a/sdk/samples/misc/ddutil.cpp b/sdk/samples/misc/ddutil.cpp deleted file mode 100644 index 361b08b..0000000 --- a/sdk/samples/misc/ddutil.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: ddutil.cpp - * Content: Routines for loading bitmap and palettes from resources - * - ***************************************************************************/ -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "ddutil.h" - -/* - * DDLoadBitmap - * - * create a DirectDrawSurface from a bitmap resource. - * - */ -extern "C" IDirectDrawSurface * DDLoadBitmap(IDirectDraw *pdd, LPCSTR szBitmap, int dx, int dy) -{ - HBITMAP hbm; - BITMAP bm; - DDSURFACEDESC ddsd; - IDirectDrawSurface *pdds; - - // - // try to load the bitmap as a resource, if that fails, try it as a file - // - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); - - if (hbm == NULL) - hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION); - - if (hbm == NULL) - return NULL; - - // - // get size of the bitmap - // - GetObject(hbm, sizeof(bm), &bm); // get size of bitmap - - // - // create a DirectDrawSurface for this bitmap - // - ZeroMemory(&ddsd, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwWidth = bm.bmWidth; - ddsd.dwHeight = bm.bmHeight; - - if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK) - return NULL; - - DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); - - DeleteObject(hbm); - - return pdds; -} - -/* - * DDReLoadBitmap - * - * load a bitmap from a file or resource into a directdraw surface. - * normaly used to re-load a surface after a restore. - * - */ -HRESULT DDReLoadBitmap(IDirectDrawSurface *pdds, LPCSTR szBitmap) -{ - HBITMAP hbm; - HRESULT hr; - - // - // try to load the bitmap as a resource, if that fails, try it as a file - // - hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - - if (hbm == NULL) - hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); - - if (hbm == NULL) - { - OutputDebugString("handle is null\n"); - return E_FAIL; - } - - hr = DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); - if (hr != DD_OK) - { - OutputDebugString("ddcopybitmap failed\n"); - } - - - DeleteObject(hbm); - return hr; -} - -/* - * DDCopyBitmap - * - * draw a bitmap into a DirectDrawSurface - * - */ -extern "C" HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP hbm, int x, int y, int dx, int dy) -{ - HDC hdcImage; - HDC hdc; - BITMAP bm; - DDSURFACEDESC ddsd; - HRESULT hr; - - if (hbm == NULL || pdds == NULL) - return E_FAIL; - - // - // make sure this surface is restored. - // - pdds->Restore(); - - // - // select bitmap into a memoryDC so we can use it. - // - hdcImage = CreateCompatibleDC(NULL); - if (!hdcImage) - OutputDebugString("createcompatible dc failed\n"); - SelectObject(hdcImage, hbm); - - // - // get size of the bitmap - // - GetObject(hbm, sizeof(bm), &bm); // get size of bitmap - dx = dx == 0 ? bm.bmWidth : dx; // use the passed size, unless zero - dy = dy == 0 ? bm.bmHeight : dy; - - // - // get size of surface. - // - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; - pdds->GetSurfaceDesc(&ddsd); - - if ((hr = pdds->GetDC(&hdc)) == DD_OK) - { - StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY); - pdds->ReleaseDC(hdc); - } - - DeleteDC(hdcImage); - - return hr; -} - -// -// DDLoadPalette -// -// Create a DirectDraw palette object from a bitmap resoure -// -// if the resource does not exist or NULL is passed create a -// default 332 palette. -// -extern "C" IDirectDrawPalette * DDLoadPalette(IDirectDraw *pdd, LPCSTR szBitmap) -{ - IDirectDrawPalette* ddpal; - int i; - int n; - int fh; - HRSRC h; - LPBITMAPINFOHEADER lpbi; - PALETTEENTRY ape[256]; - RGBQUAD * prgb; - - // - // build a 332 palette as the default. - // - for (i=0; i<256; i++) - { - ape[i].peRed = (BYTE)(((i >> 5) & 0x07) * 255 / 7); - ape[i].peGreen = (BYTE)(((i >> 2) & 0x07) * 255 / 7); - ape[i].peBlue = (BYTE)(((i >> 0) & 0x03) * 255 / 3); - ape[i].peFlags = (BYTE)0; - } - - // - // get a pointer to the bitmap resource. - // - if (szBitmap && (h = FindResource(NULL, szBitmap, RT_BITMAP))) - { - lpbi = (LPBITMAPINFOHEADER)LockResource(LoadResource(NULL, h)); - if (!lpbi) - OutputDebugString("lock resource failed\n"); - prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->biSize); - - if (lpbi == NULL || lpbi->biSize < sizeof(BITMAPINFOHEADER)) - n = 0; - else if (lpbi->biBitCount > 8) - n = 0; - else if (lpbi->biClrUsed == 0) - n = 1 << lpbi->biBitCount; - else - n = lpbi->biClrUsed; - - // - // a DIB color table has its colors stored BGR not RGB - // so flip them around. - // - for(i=0; i 8) - n = 0; - else if (bi.biClrUsed == 0) - n = 1 << bi.biBitCount; - else - n = bi.biClrUsed; - - // - // a DIB color table has its colors stored BGR not RGB - // so flip them around. - // - for(i=0; iCreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL); - - return ddpal; -} - -/* - * DDColorMatch - * - * convert a RGB color to a pysical color. - * - * we do this by leting GDI SetPixel() do the color matching - * then we lock the memory and see what it got mapped to. - */ -extern "C" DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb) -{ - COLORREF rgbT; - HDC hdc; - DWORD dw = CLR_INVALID; - DDSURFACEDESC ddsd; - HRESULT hres; - - // - // use GDI SetPixel to color match for us - // - if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK) - { - rgbT = GetPixel(hdc, 0, 0); // save current pixel value - SetPixel(hdc, 0, 0, rgb); // set our value - pdds->ReleaseDC(hdc); - } - - // - // now lock the surface so we can read back the converted color - // - ddsd.dwSize = sizeof(ddsd); - while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING) - ; - - if (hres == DD_OK) - { - dw = *(DWORD *)ddsd.lpSurface; // get DWORD - dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1; // mask it to bpp - pdds->Unlock(NULL); - } - - // - // now put the color that was there back. - // - if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK) - { - SetPixel(hdc, 0, 0, rgbT); - pdds->ReleaseDC(hdc); - } - - return dw; -} - -/* - * DDSetColorKey - * - * set a color key for a surface, given a RGB. - * if you pass CLR_INVALID as the color key, the pixel - * in the upper-left corner will be used. - */ -extern "C" HRESULT DDSetColorKey(IDirectDrawSurface *pdds, COLORREF rgb) -{ - DDCOLORKEY ddck; - - ddck.dwColorSpaceLowValue = DDColorMatch(pdds, rgb); - ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue; - return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck); -} diff --git a/sdk/samples/misc/ddutil.h b/sdk/samples/misc/ddutil.h deleted file mode 100644 index e1f782b..0000000 --- a/sdk/samples/misc/ddutil.h +++ /dev/null @@ -1,23 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: ddutil.cpp - * Content: Routines for loading bitmap and palettes from resources - * - ***************************************************************************/ - -#ifdef __cplusplus -extern "C" { /* Assume C declarations for C++ */ -#endif /* __cplusplus */ - -extern IDirectDrawPalette * DDLoadPalette(IDirectDraw *pdd, LPCSTR szBitmap); -extern IDirectDrawSurface * DDLoadBitmap(IDirectDraw *pdd, LPCSTR szBitmap, int dx, int dy); -extern HRESULT DDReLoadBitmap(IDirectDrawSurface *pdds, LPCSTR szBitmap); -extern HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP hbm, int x, int y, int dx, int dy); -extern DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb); -extern HRESULT DDSetColorKey(IDirectDrawSurface *pdds, COLORREF rgb); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ diff --git a/sdk/samples/misc/dsutil.c b/sdk/samples/misc/dsutil.c deleted file mode 100644 index d9871fb..0000000 --- a/sdk/samples/misc/dsutil.c +++ /dev/null @@ -1,378 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: dsutil.cpp - * Content: Routines for dealing with sounds from resources - * - * - ***************************************************************************/ - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include - -typedef struct -{ - BYTE *pbWaveData; // pointer into wave resource (for restore) - DWORD cbWaveSize; // size of wave data (for restore) - int iAlloc; // number of buffers. - int iCurrent; // current buffer - IDirectSoundBuffer* Buffers[1]; // list of buffers - -} SNDOBJ, *HSNDOBJ; - -#define _HSNDOBJ_DEFINED -#include "dsutil.h" - -static const char c_szWAV[] = "WAV"; - -/////////////////////////////////////////////////////////////////////////////// -// -// DSLoadSoundBuffer -// -/////////////////////////////////////////////////////////////////////////////// - -IDirectSoundBuffer *DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName) -{ - IDirectSoundBuffer *pDSB = NULL; - DSBUFFERDESC dsBD = {0}; - BYTE *pbWaveData; - - if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) - { - dsBD.dwSize = sizeof(dsBD); - dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLDEFAULT | DSBCAPS_GETCURRENTPOSITION2; - - if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) - { - if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) - { - IDirectSoundBuffer_Release(pDSB); - pDSB = NULL; - } - } - else - { - pDSB = NULL; - } - } - - return pDSB; -} - -/////////////////////////////////////////////////////////////////////////////// -// -// DSReloadSoundBuffer -// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName) -{ - BOOL result=FALSE; - BYTE *pbWaveData; - DWORD cbWaveSize; - - if (DSGetWaveResource(NULL, lpName, NULL, &pbWaveData, &cbWaveSize)) - { - if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB)) && - DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) - { - result = TRUE; - } - } - - return result; -} - -/////////////////////////////////////////////////////////////////////////////// -// -// DSGetWaveResource -// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pcbWaveSize) -{ - HRSRC hResInfo; - HGLOBAL hResData; - void *pvRes; - - if (((hResInfo = FindResource(hModule, lpName, c_szWAV)) != NULL) && - ((hResData = LoadResource(hModule, hResInfo)) != NULL) && - ((pvRes = LockResource(hResData)) != NULL) && - DSParseWaveResource(pvRes, ppWaveHeader, ppbWaveData, pcbWaveSize)) - { - return TRUE; - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////// -// SndObj fns -/////////////////////////////////////////////////////////////////////////////// - -SNDOBJ *SndObjCreate(IDirectSound *pDS, LPCTSTR lpName, int iConcurrent) -{ - SNDOBJ *pSO = NULL; - LPWAVEFORMATEX pWaveHeader; - BYTE *pbData; - UINT cbData; - - if (DSGetWaveResource(NULL, lpName, &pWaveHeader, &pbData, &cbData)) - { - if (iConcurrent < 1) - iConcurrent = 1; - - if ((pSO = (SNDOBJ *)LocalAlloc(LPTR, sizeof(SNDOBJ) + - (iConcurrent-1) * sizeof(IDirectSoundBuffer *))) != NULL) - { - int i; - - pSO->iAlloc = iConcurrent; - pSO->pbWaveData = pbData; - pSO->cbWaveSize = cbData; - pSO->Buffers[0] = DSLoadSoundBuffer(pDS, lpName); - - for (i=1; iiAlloc; i++) - { - if (FAILED(IDirectSound_DuplicateSoundBuffer(pDS, - pSO->Buffers[0], &pSO->Buffers[i]))) - { - pSO->Buffers[i] = DSLoadSoundBuffer(pDS, lpName); - if (!pSO->Buffers[i]) { - SndObjDestroy(pSO); - pSO = NULL; - break; - } - } - } - } - } - - return pSO; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -void SndObjDestroy(SNDOBJ *pSO) -{ - if (pSO) - { - int i; - - for (i=0; iiAlloc; i++) - { - if (pSO->Buffers[i]) - { - IDirectSoundBuffer_Release(pSO->Buffers[i]); - pSO->Buffers[i] = NULL; - } - } - LocalFree((HANDLE)pSO); - } -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -IDirectSoundBuffer *SndObjGetFreeBuffer(SNDOBJ *pSO) -{ - IDirectSoundBuffer *pDSB; - - if (pSO == NULL) - return NULL; - - if (pDSB = pSO->Buffers[pSO->iCurrent]) - { - HRESULT hres; - DWORD dwStatus; - - hres = IDirectSoundBuffer_GetStatus(pDSB, &dwStatus); - - if (FAILED(hres)) - dwStatus = 0; - - if ((dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) - { - if (pSO->iAlloc > 1) - { - if (++pSO->iCurrent >= pSO->iAlloc) - pSO->iCurrent = 0; - - pDSB = pSO->Buffers[pSO->iCurrent]; - hres = IDirectSoundBuffer_GetStatus(pDSB, &dwStatus); - - if (SUCCEEDED(hres) && (dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) - { - IDirectSoundBuffer_Stop(pDSB); - IDirectSoundBuffer_SetCurrentPosition(pDSB, 0); - } - } - else - { - pDSB = NULL; - } - } - - if (pDSB && (dwStatus & DSBSTATUS_BUFFERLOST)) - { - if (FAILED(IDirectSoundBuffer_Restore(pDSB)) || - !DSFillSoundBuffer(pDSB, pSO->pbWaveData, pSO->cbWaveSize)) - { - pDSB = NULL; - } - } - } - - return pDSB; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL SndObjPlay(SNDOBJ *pSO, DWORD dwPlayFlags) -{ - BOOL result = FALSE; - - if (pSO == NULL) - return FALSE; - - if ((!(dwPlayFlags & DSBPLAY_LOOPING) || (pSO->iAlloc == 1))) - { - IDirectSoundBuffer *pDSB = SndObjGetFreeBuffer(pSO); - if (pDSB != NULL) { - result = SUCCEEDED(IDirectSoundBuffer_Play(pDSB, 0, 0, dwPlayFlags)); - } - } - - return result; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL SndObjStop(SNDOBJ *pSO) -{ - int i; - - if (pSO == NULL) - return FALSE; - - for (i=0; iiAlloc; i++) - { - IDirectSoundBuffer_Stop(pSO->Buffers[i]); - IDirectSoundBuffer_SetCurrentPosition(pSO->Buffers[i], 0); - } - - return TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize) -{ - if (pDSB && pbWaveData && cbWaveSize) - { - LPVOID pMem1, pMem2; - DWORD dwSize1, dwSize2; - - if (SUCCEEDED(IDirectSoundBuffer_Lock(pDSB, 0, cbWaveSize, - &pMem1, &dwSize1, &pMem2, &dwSize2, 0))) - { - CopyMemory(pMem1, pbWaveData, dwSize1); - - if ( 0 != dwSize2 ) - CopyMemory(pMem2, pbWaveData+dwSize1, dwSize2); - - IDirectSoundBuffer_Unlock(pDSB, pMem1, dwSize1, pMem2, dwSize2); - return TRUE; - } - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData,DWORD *pcbWaveSize) -{ - DWORD *pdw; - DWORD *pdwEnd; - DWORD dwRiff; - DWORD dwType; - DWORD dwLength; - - if (ppWaveHeader) - *ppWaveHeader = NULL; - - if (ppbWaveData) - *ppbWaveData = NULL; - - if (pcbWaveSize) - *pcbWaveSize = 0; - - pdw = (DWORD *)pvRes; - dwRiff = *pdw++; - dwLength = *pdw++; - dwType = *pdw++; - - if (dwRiff != mmioFOURCC('R', 'I', 'F', 'F')) - goto exit; // not even RIFF - - if (dwType != mmioFOURCC('W', 'A', 'V', 'E')) - goto exit; // not a WAV - - pdwEnd = (DWORD *)((BYTE *)pdw + dwLength-4); - - while (pdw < pdwEnd) - { - dwType = *pdw++; - dwLength = *pdw++; - - switch (dwType) - { - case mmioFOURCC('f', 'm', 't', ' '): - if (ppWaveHeader && !*ppWaveHeader) - { - if (dwLength < sizeof(WAVEFORMAT)) - goto exit; // not a WAV - - *ppWaveHeader = (WAVEFORMATEX *)pdw; - - if ((!ppbWaveData || *ppbWaveData) && - (!pcbWaveSize || *pcbWaveSize)) - { - return TRUE; - } - } - break; - - case mmioFOURCC('d', 'a', 't', 'a'): - if ((ppbWaveData && !*ppbWaveData) || - (pcbWaveSize && !*pcbWaveSize)) - { - if (ppbWaveData) - *ppbWaveData = (LPBYTE)pdw; - - if (pcbWaveSize) - *pcbWaveSize = dwLength; - - if (!ppWaveHeader || *ppWaveHeader) - return TRUE; - } - break; - } - - pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1)); - } - -exit: - return FALSE; -} diff --git a/sdk/samples/misc/dsutil.h b/sdk/samples/misc/dsutil.h deleted file mode 100644 index fa2d90f..0000000 --- a/sdk/samples/misc/dsutil.h +++ /dev/null @@ -1,215 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: dsutil.cpp - * Content: Routines for dealing with sounds from resources - * - * - ***************************************************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/////////////////////////////////////////////////////////////////////////////// -// -// DSLoadSoundBuffer Loads an IDirectSoundBuffer from a Win32 resource in -// the current application. -// -// Params: -// pDS -- Pointer to an IDirectSound that will be used to create -// the buffer. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// Returns an IDirectSoundBuffer containing the wave data or NULL on error. -// -// example: -// in the application's resource script (.RC file) -// Turtle WAV turtle.wav -// -// some code in the application: -// IDirectSoundBuffer *pDSB = DSLoadSoundBuffer(pDS, "Turtle"); -// -// if (pDSB) -// { -// IDirectSoundBuffer_Play(pDSB, 0, 0, DSBPLAY_TOEND); -// /* ... */ -// -/////////////////////////////////////////////////////////////////////////////// -IDirectSoundBuffer *DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName); - -/////////////////////////////////////////////////////////////////////////////// -// -// DSReloadSoundBuffer Reloads an IDirectSoundBuffer from a Win32 resource in -// the current application. normally used to handle -// a DSERR_BUFFERLOST error. -// Params: -// pDSB -- Pointer to an IDirectSoundBuffer to be reloaded. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// Returns a BOOL indicating whether the buffer was successfully reloaded. -// -// example: -// in the application's resource script (.RC file) -// Turtle WAV turtle.wav -// -// some code in the application: -// TryAgain: -// HRESULT hres = IDirectSoundBuffer_Play(pDSB, 0, 0, DSBPLAY_TOEND); -// -// if (FAILED(hres)) -// { -// if ((hres == DSERR_BUFFERLOST) && -// DSReloadSoundBuffer(pDSB, "Turtle")) -// { -// goto TryAgain; -// } -// /* deal with other errors... */ -// } -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName); - -/////////////////////////////////////////////////////////////////////////////// -// -// DSGetWaveResource Finds a WAV resource in a Win32 module. -// -// Params: -// hModule -- Win32 module handle of module containing WAV resource. -// Pass NULL to indicate current application. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// ppWaveHeader-- Optional pointer to WAVEFORMATEX * to receive a pointer to -// the WAVEFORMATEX header in the specified WAV resource. -// Pass NULL if not required. -// -// ppbWaveData -- Optional pointer to BYTE * to receive a pointer to the -// waveform data in the specified WAV resource. Pass NULL if -// not required. -// -// pdwWaveSize -- Optional pointer to DWORD to receive the size of the -// waveform data in the specified WAV resource. Pass NULL if -// not required. -// -// Returns a BOOL indicating whether a valid WAV resource was found. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, - WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pdwWaveSize); - -/////////////////////////////////////////////////////////////////////////////// -// -// HSNDOBJ Handle to a SNDOBJ object. -// -// SNDOBJs are implemented in dsutil as an example layer built on top -// of DirectSound. -// -// A SNDOBJ is generally used to manage individual -// sounds which need to be played multiple times concurrently. A -// SNDOBJ represents a queue of IDirectSoundBuffer objects which -// all refer to the same buffer memory. -// -// A SNDOBJ also automatically reloads the sound resource when -// DirectSound returns a DSERR_BUFFERLOST -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef _HSNDOBJ_DEFINED -DECLARE_HANDLE32(HSNDOBJ); -#endif - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjCreate Loads a SNDOBJ from a Win32 resource in -// the current application. -// -// Params: -// pDS -- Pointer to an IDirectSound that will be used to create -// the SNDOBJ. -// -// lpName -- Name of WAV resource to load the data from. Can be a -// resource id specified using the MAKEINTRESOURCE macro. -// -// iConcurrent -- Integer representing the number of concurrent playbacks of -// to plan for. Attempts to play more than this number will -// succeed but will restart the least recently played buffer -// even if it is not finished playing yet. -// -// Returns an HSNDOBJ or NULL on error. -// -// NOTES: -// SNDOBJs automatically restore and reload themselves as required. -// -/////////////////////////////////////////////////////////////////////////////// -HSNDOBJ SndObjCreate(IDirectSound *pDS, LPCTSTR lpName, int iConcurrent); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjDestroy Frees a SNDOBJ and releases all of its buffers. -// -// Params: -// hSO -- Handle to a SNDOBJ to free. -// -/////////////////////////////////////////////////////////////////////////////// -void SndObjDestroy(HSNDOBJ hSO); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjPlay Plays a buffer in a SNDOBJ. -// -// Params: -// hSO -- Handle to a SNDOBJ to play a buffer from. -// -// dwPlayFlags -- Flags to pass to IDirectSoundBuffer::Play. It is not -// legal to play an SndObj which has more than one buffer -// with the DSBPLAY_LOOPING flag. Pass 0 to stop playback. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL SndObjPlay(HSNDOBJ hSO, DWORD dwPlayFlags); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjStop Stops one or more buffers in a SNDOBJ. -// -// Params: -// hSO -- Handle to a SNDOBJ to play a buffer from. -// -/////////////////////////////////////////////////////////////////////////////// -BOOL SndObjStop(HSNDOBJ hSO); - -/////////////////////////////////////////////////////////////////////////////// -// -// SndObjGetFreeBuffer returns one of the cloned buffers that is -// not currently playing -// -// Params: -// hSO -- Handle to a SNDOBJ -// -// NOTES: -// This function is provided so that callers can set things like pan etc -// before playing the buffer. -// -// EXAMPLE: -// ... -// -/////////////////////////////////////////////////////////////////////////////// -IDirectSoundBuffer *SndObjGetFreeBuffer(HSNDOBJ hSO); - -/////////////////////////////////////////////////////////////////////////////// -// -// helper routines -// -/////////////////////////////////////////////////////////////////////////////// - -BOOL DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD dwWaveSize); -BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pdwWaveSize); - -#ifdef __cplusplus -} -#endif diff --git a/sdk/samples/misc/lbprintf.c b/sdk/samples/misc/lbprintf.c deleted file mode 100644 index efad4f8..0000000 --- a/sdk/samples/misc/lbprintf.c +++ /dev/null @@ -1,226 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: lbprintf.c - * Content: Routines to display text in a listbox - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "lbprintf.h" - -static HWND hWndListBox; -static DWORD dwPos; - -/* - * LBCreate - * - * Create a list box on a given parent window - */ -void LBCreate( HWND hWnd, DWORD pos ) -{ - hWndListBox = CreateWindow( - "listbox", // class - NULL, // caption - WS_BORDER | WS_CHILDWINDOW | WS_VSCROLL | LBS_NOINTEGRALHEIGHT, // style - 0, // x pos - 0, // y pos - 0, // width - 0, // height - hWnd, // parent window - NULL, // menu - GetWindowInstance( hWnd ), // instance - NULL // parms - ); - - ShowWindow( hWndListBox, SW_NORMAL ); - UpdateWindow( hWndListBox ); - - dwPos = pos; - if( dwPos > 100 ) - { - dwPos = 100; - } - -} /* LBCreate */ - -/* - * LBSize - * - * New size for the listbox. Should be called whenever the parent window - * is resized - */ -void LBSize( DWORD width, DWORD height ) -{ - DWORD y; - - y = (height*(100-dwPos))/100; - MoveWindow( hWndListBox, 0, y, width-1, height-y-1, TRUE ); - -} /* LBSize */ - -/* - * LBClear - * - * Clear the listbox - */ -void LBClear( void ) -{ - SendMessage( hWndListBox, LB_RESETCONTENT, 0, 0L ); - -} /* LBClear */ - -/* - * LBPrintf - */ -void __cdecl LBPrintf( LPSTR fmt, ... ) -{ - char buff[512]; - UINT sel; - - wvsprintf( buff, fmt, (LPVOID)(&fmt+1) ); - SendMessage( hWndListBox, LB_ADDSTRING, 0, (LONG) (LPSTR) buff ); - sel = (UINT) SendMessage( hWndListBox, LB_GETCOUNT, 0, 0L ); - if( sel != LB_ERR ) - { - SendMessage( hWndListBox, LB_SETCURSEL, sel-1, 0L ); - } - -} /* LBPrintf */ - -typedef struct -{ - HRESULT rval; - LPSTR str; -} ERRLIST; - -static ERRLIST elErrors[] = -{ - { DD_OK, "DD_OK" }, - { DDERR_ALREADYINITIALIZED, "DDERR_ALREADYINITIALIZED" }, - { DDERR_CANNOTATTACHSURFACE, "DDERR_CANNOTATTACHSURFACE" }, - { DDERR_CANNOTDETACHSURFACE, "DDERR_CANNOTDETACHSURFACE" }, - { DDERR_CURRENTLYNOTAVAIL, "DDERR_CURRENTLYNOTAVAIL" }, - { DDERR_EXCEPTION, "DDERR_EXCEPTION" }, - { DDERR_GENERIC, "DDERR_GENERIC" }, - { DDERR_HEIGHTALIGN, "DDERR_HEIGHTALIGN" }, - { DDERR_INCOMPATIBLEPRIMARY, "DDERR_INCOMPATIBLEPRIMARY" }, - { DDERR_INVALIDCAPS, "DDERR_INVALIDCAPS" }, - { DDERR_INVALIDCLIPLIST, "DDERR_INVALIDCLIPLIST" }, - { DDERR_INVALIDMODE, "DDERR_INVALIDMODE" }, - { DDERR_INVALIDOBJECT, "DDERR_INVALIDOBJECT" }, - { DDERR_INVALIDPARAMS, "DDERR_INVALIDPARAMS" }, - { DDERR_INVALIDPIXELFORMAT, "DDERR_INVALIDPIXELFORMAT" }, - { DDERR_INVALIDRECT, "DDERR_INVALIDRECT" }, - { DDERR_LOCKEDSURFACES, "DDERR_LOCKEDSURFACES" }, - { DDERR_NO3D, "DDERR_NO3D" }, - { DDERR_NOALPHAHW, "DDERR_NOALPHAHW" }, - { DDERR_NOCLIPLIST, "DDERR_NOCLIPLIST" }, - { DDERR_NOCOLORCONVHW, "DDERR_NOCOLORCONVHW" }, - { DDERR_NOCOOPERATIVELEVELSET, "DDERR_NOCOOPERATIVELEVELSET" }, - { DDERR_NOCOLORKEY, "DDERR_NOCOLORKEY" }, - { DDERR_NOCOLORKEYHW, "DDERR_NOCOLORKEYHW" }, - { DDERR_NOEXCLUSIVEMODE, "DDERR_NOEXCLUSIVEMODE" }, - { DDERR_NOFLIPHW, "DDERR_NOFLIPHW" }, - { DDERR_NOGDI, "DDERR_NOGDI" }, - { DDERR_NOMIRRORHW, "DDERR_NOMIRRORHW" }, - { DDERR_NOTFOUND, "DDERR_NOTFOUND" }, - { DDERR_NOOVERLAYHW, "DDERR_NOOVERLAYHW" }, - { DDERR_NORASTEROPHW, "DDERR_NORASTEROPHW" }, - { DDERR_NOROTATIONHW, "DDERR_NOROTATIONHW" }, - { DDERR_NOSTRETCHHW, "DDERR_NOSTRETCHHW" }, - { DDERR_NOT4BITCOLOR, "DDERR_NOT4BITCOLOR" }, - { DDERR_NOT4BITCOLORINDEX, "DDERR_NOT4BITCOLORINDEX" }, - { DDERR_NOT8BITCOLOR, "DDERR_NOT8BITCOLOR" }, - { DDERR_NOTEXTUREHW, "DDERR_NOTEXTUREHW" }, - { DDERR_NOVSYNCHW, "DDERR_NOVSYNCHW" }, - { DDERR_NOZBUFFERHW, "DDERR_NOZBUFFERHW" }, - { DDERR_NOZOVERLAYHW, "DDERR_NOZOVERLAYHW" }, - { DDERR_OUTOFCAPS, "DDERR_OUTOFCAPS" }, - { DDERR_OUTOFMEMORY, "DDERR_OUTOFMEMORY" }, - { DDERR_OUTOFVIDEOMEMORY, "DDERR_OUTOFVIDEOMEMORY" }, - { DDERR_OVERLAYCANTCLIP, "DDERR_OVERLAYCANTCLIP" }, - { DDERR_OVERLAYCOLORKEYONLYONEACTIVE, "DDERR_OVERLAYCOLORKEYONLYONEACTIVE" }, - { DDERR_PALETTEBUSY, "DDERR_PALETTEBUSY" }, - { DDERR_COLORKEYNOTSET, "DDERR_COLORKEYNOTSET" }, - { DDERR_SURFACEALREADYATTACHED, "DDERR_SURFACEALREADYATTACHED" }, - { DDERR_SURFACEALREADYDEPENDENT, "DDERR_SURFACEALREADYDEPENDENT" }, - { DDERR_SURFACEBUSY, "DDERR_SURFACEBUSY" }, - { DDERR_SURFACEISOBSCURED, "DDERR_SURFACEISOBSCURED" }, - { DDERR_SURFACELOST, "DDERR_SURFACELOST" }, - { DDERR_SURFACENOTATTACHED, "DDERR_SURFACENOTATTACHED" }, - { DDERR_TOOBIGHEIGHT, "DDERR_TOOBIGHEIGHT" }, - { DDERR_TOOBIGSIZE, "DDERR_TOOBIGSIZE" }, - { DDERR_TOOBIGWIDTH, "DDERR_TOOBIGWIDTH" }, - { DDERR_UNSUPPORTED, "DDERR_UNSUPPORTED" }, - { DDERR_UNSUPPORTEDFORMAT, "DDERR_UNSUPPORTEDFORMAT" }, - { DDERR_UNSUPPORTEDMASK, "DDERR_UNSUPPORTEDMASK" }, - { DDERR_VERTICALBLANKINPROGRESS, "DDERR_VERTICALBLANKINPROGRESS" }, - { DDERR_WASSTILLDRAWING, "DDERR_WASSTILLDRAWING" }, - { DDERR_XALIGN, "DDERR_XALIGN" }, - { DDERR_INVALIDDIRECTDRAWGUID, "DDERR_INVALIDDIRECTDRAWGUID" }, - { DDERR_DIRECTDRAWALREADYCREATED, "DDERR_DIRECTDRAWALREADYCREATED" }, - { DDERR_NODIRECTDRAWHW, "DDERR_NODIRECTDRAWHW" }, - { DDERR_PRIMARYSURFACEALREADYEXISTS, "DDERR_PRIMARYSURFACEALREADYEXISTS" }, - { DDERR_NOEMULATION, "DDERR_NOEMULATION" }, - { DDERR_REGIONTOOSMALL, "DDERR_REGIONTOOSMALL" }, - { DDERR_CLIPPERISUSINGHWND, "DDERR_CLIPPERISUSINGHWND" }, - { DDERR_NOCLIPPERATTACHED, "DDERR_NOCLIPPERATTACHED" }, - { DDERR_NOHWND, "DDERR_NOHWND" }, - { DDERR_HWNDSUBCLASSED, "DDERR_HWNDSUBCLASSED" }, - { DDERR_HWNDALREADYSET, "DDERR_HWNDALREADYSET" }, - { DDERR_NOPALETTEATTACHED, "DDERR_NOPALETTEATTACHED" }, - { DDERR_NOPALETTEHW, "DDERR_NOPALETTEHW" }, - { DDERR_BLTFASTCANTCLIP, "DDERR_BLTFASTCANTCLIP" }, - { DDERR_NOBLTHW, "DDERR_NOBLTHW" }, - { DDERR_NODDROPSHW, "DDERR_NODDROPSHW" }, - { DDERR_OVERLAYNOTVISIBLE, "DDERR_OVERLAYNOTVISIBLE" }, - { DDERR_NOOVERLAYDEST, "DDERR_NOOVERLAYDEST" }, - { DDERR_INVALIDPOSITION, "DDERR_INVALIDPOSITION" }, - { DDERR_NOTAOVERLAYSURFACE, "DDERR_NOTAOVERLAYSURFACE" }, - { DDERR_EXCLUSIVEMODEALREADYSET, "DDERR_EXCLUSIVEMODEALREADYSET" }, - { DDERR_NOTFLIPPABLE, "DDERR_NOTFLIPPABLE" }, - { DDERR_CANTDUPLICATE, "DDERR_CANTDUPLICATE" }, - { DDERR_NOTLOCKED, "DDERR_NOTLOCKED" }, - { DDERR_CANTCREATEDC, "DDERR_CANTCREATEDC" }, - { DDERR_NODC, "DDERR_NODC" }, - { DDERR_WRONGMODE, "DDERR_WRONGMODE" }, - { DDERR_IMPLICITLYCREATED, "DDERR_IMPLICITLYCREATED" }, -}; - -/* - * getErrorString - */ -static LPSTR getErrorString( HRESULT ddrval ) -{ - int i; - - for( i=0;i -#include "lclib.h" - - -char* LSTRCHR( const char* lpString, int bChar ) -{ - if( lpString != NULL ) - { - while( *lpString != 0 ) - { - if( *lpString == bChar ) - { - return (char*)lpString; - } - - lpString++; - } - } - return NULL; - -} /* LSTRCHR */ - -char* LSTRRCHR( const char* lpString, int bChar ) -{ - if( lpString != NULL ) - { - const char* lpBegin; - - lpBegin = lpString; - - while( *lpString != 0 ) - { - lpString++; - } - - while( 1 ) - { - if( *lpString == bChar ) - { - return (char*)lpString; - } - - if( lpString == lpBegin ) - { - break; - } - - lpString--; - } - } - - return NULL; -} /* LSTRRCHR */ - diff --git a/sdk/samples/misc/lclib.h b/sdk/samples/misc/lclib.h deleted file mode 100644 index 263fda0..0000000 --- a/sdk/samples/misc/lclib.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: lclib.h - * - */ - -#ifndef __LCLIB_H__ -#define __LCLIB_H__ - -char* LSTRRCHR( const char*, int ); -char* LSTRCHR( const char*, int ); - -#endif - diff --git a/sdk/samples/misc/misc.c b/sdk/samples/misc/misc.c deleted file mode 100644 index e1874b0..0000000 --- a/sdk/samples/misc/misc.c +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: misc.c - * - * Miscellaneous functions not involving DD and D3D. Part of D3DApp. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#include "d3dappi.h" - -/***************************************************************************/ -/* Setting Defaults */ -/***************************************************************************/ -/* - * D3DAppISetDefaults - * Set all the global variables to their default values. Do not reset the - * image files. - */ -void -D3DAppISetDefaults(void) -{ - int n; - char backup[D3DAPP_MAXTEXTURES][50]; - - n = d3dappi.NumTextures; - memcpy(&backup[0][0], &d3dappi.ImageFile[0][0], 50 * D3DAPP_MAXTEXTURES); - ZEROMEM(d3dappi); - memcpy(&d3dappi.ImageFile[0][0], &backup[0][0], 50 * D3DAPP_MAXTEXTURES); - d3dappi.NumTextures = n; - d3dappi.bAppActive = TRUE; - ZEROMEM(d3dapprs); - d3dapprs.bZBufferOn = TRUE; - d3dapprs.bPerspCorrect = FALSE; - d3dapprs.ShadeMode = D3DSHADE_GOURAUD; - d3dapprs.TextureFilter = D3DFILTER_NEAREST; - d3dapprs.TextureBlend = D3DTBLEND_MODULATE; - d3dapprs.FillMode = D3DFILL_SOLID; - d3dapprs.bDithering = FALSE; - d3dapprs.bSpecular = TRUE; - d3dapprs.bAntialiasing = FALSE; - d3dapprs.bFogEnabled = FALSE; - d3dapprs.FogColor = RGB_MAKE(0, 0, 0); - d3dapprs.FogMode = D3DFOG_LINEAR; - d3dapprs.FogStart = D3DVAL(6.0); - d3dapprs.FogEnd = D3DVAL(11.0); - - lpClipper = NULL; - lpPalette = NULL; - bPrimaryPalettized = FALSE; - bPaletteActivate = FALSE; - bIgnoreWM_SIZE = FALSE; - ZEROMEM(ppe); - ZEROMEM(Originalppe); - LastError = DD_OK; - ZEROMEM(LastErrorString); - D3DDeviceDestroyCallback = NULL; - D3DDeviceDestroyCallbackContext = NULL; - D3DDeviceCreateCallback = NULL; - D3DDeviceCreateCallbackContext = NULL; -} - -/***************************************************************************/ -/* Calling Device Create And Destroy Callbacks */ -/***************************************************************************/ -BOOL -D3DAppICallDeviceDestroyCallback(void) -{ - if (D3DDeviceDestroyCallback) { - if (CallbackRefCount) { - --CallbackRefCount; - return (D3DDeviceDestroyCallback)(D3DDeviceDestroyCallbackContext); - } - } - return TRUE; -} - -BOOL -D3DAppICallDeviceCreateCallback(int w, int h) -{ - if (D3DDeviceCreateCallback) { - ++CallbackRefCount; - return (D3DDeviceCreateCallback)(w, h, &d3dappi.lpD3DViewport, - D3DDeviceCreateCallbackContext); - } - return TRUE; -} - -/***************************************************************************/ -/* Choosing and verifying the driver and display mode */ -/***************************************************************************/ -/* - * D3DAppIPickDriver - * Choose a driver from the list of available drivers which can render to one - * of the given depths. Hardware is prefered. Mono-lighting drivers are - * prefered over RGB. - */ -BOOL -D3DAppIPickDriver(int* driver, DWORD depths) -{ - int i, j; - j = 0; - for (i = 0; i < d3dappi.NumDrivers; i++) - if (d3dappi.Driver[i].Desc.dwDeviceRenderBitDepth & depths) - break; - if (i >= d3dappi.NumDrivers) { - *driver = D3DAPP_BOGUS; - return TRUE; - } - j = i; - for (i = 0; i < d3dappi.NumDrivers; i++) { - if (d3dappi.Driver[i].Desc.dwDeviceRenderBitDepth & depths) { - if (d3dappi.Driver[i].bIsHardware && - !d3dappi.Driver[j].bIsHardware) - j = i; - else if (d3dappi.Driver[i].bIsHardware == - d3dappi.Driver[j].bIsHardware) { - if (d3dappi.Driver[i].Desc.dcmColorModel & D3DCOLOR_MONO && - !(d3dappi.Driver[j].Desc.dcmColorModel & D3DCOLOR_MONO)) - j = i; - } - } - } - if (j >= d3dappi.NumDrivers) - *driver = D3DAPP_BOGUS; - else - *driver = j; - return TRUE; -} - -/* - * D3DAppIFilterDisplayModes - * Set the bThisDriverCanDo flag for each display mode if the given driver - * can render in that depth. Also checks to make sure there is enough - * total video memory for front/back/z-buffer in video memory if it's a - * hardware device. - */ -BOOL -D3DAppIFilterDisplayModes(int driver) -{ - int i; - DWORD depths = d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth; - - for (i = 0; i < d3dappi.NumModes; i++) { - d3dappi.Mode[i].bThisDriverCanDo = FALSE; - if (!(D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp) & depths)) - continue; - d3dappi.Mode[i].bThisDriverCanDo = TRUE; - - } - d3dappi.ThisMode.bThisDriverCanDo = - d3dappi.Mode[d3dappi.CurrMode].bThisDriverCanDo; - return TRUE; -} - -/* - * D3DAppIPickDisplayMode - * Pick a display mode of one of the given depths. 640x480x16 is prefered. - */ -BOOL -D3DAppIPickDisplayMode(int *mode, DWORD depths) -{ - int i, j; - for (i = 0; i < d3dappi.NumModes; i++) - if (D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp) & depths) - break; - j = i; - for (; i < d3dappi.NumModes; i++) { - if (!(D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp) & depths)) - continue; - if (d3dappi.Mode[i].w == 640 && d3dappi.Mode[i].h == 480 && - d3dappi.Mode[i].bpp == 16) { - j = i; - break; - } - } - if (j >= d3dappi.NumModes) - *mode = D3DAPP_BOGUS; - else - *mode = j; - return TRUE; -} - -/* - * D3DAppIVerifyDriverAndMode - * Verifies the selected driver and mode combination. If the driver is - * specified, the mode will be changed to accomodate the driver if it's not - * compatible. If the driver is not specified, one will be selected which is - * compatible with the specified mode. If neither are specified, a suitable - * pair will be returned. - */ -BOOL -D3DAppIVerifyDriverAndMode(int* lpdriver, int* lpmode) -{ - DWORD depths; - int driver, mode, i; - driver = *lpdriver; mode = *lpmode; - - if (mode == D3DAPP_USEWINDOW && !d3dappi.bIsPrimary) { - D3DAppISetErrorString("Cannot render to a window when the DirectDraw device is not the primary.\n"); - goto exit_with_error; - } - - /* - * If I've been ask to choose a driver, choose one which is compatible - * with the specified mode. - */ - if (driver == D3DAPP_YOUDECIDE) { - if (mode == D3DAPP_USEWINDOW) { - /* - * I must find a driver for this display depth - */ - depths = D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp); - ATTEMPT(D3DAppIPickDriver(&driver, depths)); - if (driver == D3DAPP_BOGUS) { - D3DAppISetErrorString("Cannot find a D3D device driver which is compatible with the current display depth.\n"); - goto exit_with_error; - } - /* - * I don't need to go through the mode selection since I've - * verified it here - */ - goto ret_ok; - } else if (mode == D3DAPP_YOUDECIDE) { - /* - * I'm free to choose any driver which can use even one - * supported depth - */ - if (d3dappi.bIsPrimary) - depths = D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp); - else - depths = 0; - for (i = 0; i < d3dappi.NumModes; i++) - depths |= D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp); - ATTEMPT(D3DAppIPickDriver(&driver, depths)); - if (driver == D3DAPP_BOGUS) { - D3DAppISetErrorString("Cannot find a D3D device driver which is compatible with the current display depth or any supported fullscreen mode.\n"); - goto exit_with_error; - } - /* - * The mode will be chosen in the next section - */ - } else { - /* - * Must pick a driver which uses the given mode depth - */ - ATTEMPT(D3DAppIPickDriver(&driver, - D3DAppIBPPToDDBD(d3dappi.Mode[mode].bpp))); - if (driver == D3DAPP_BOGUS) { - D3DAppISetErrorString("Cannot find a D3D device driver which is compatible with the specified fullscreen mode.\n"); - goto exit_with_error; - } - /* - * I don't need to go through the mode selection since I've - * verified it here - */ - goto ret_ok; - } - } - - /* - * At this stage, I have a driver I want to match the mode to. - */ - if (mode == D3DAPP_YOUDECIDE) { - /* - * If it's my choice, I prefer windowed over fullscreen - */ - if (d3dappi.bIsPrimary) { - if (D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp) & - d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth) { - mode = D3DAPP_USEWINDOW; - goto ret_ok; - } - } - /* - * Either this is not a primary DD device or the driver cannot use - * the Windows display depth - */ - ATTEMPT(D3DAppIPickDisplayMode(&mode, - d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth)); - if (mode == D3DAPP_BOGUS) { - D3DAppISetErrorString("The selected D3D device driver is not compatible with the current display depth or any supported fullscreen modes.\n"); - goto exit_with_error; - } - goto ret_ok; - } else if (mode == D3DAPP_USEWINDOW) { - /* - * Check to see if this driver can use the Windows display depth - */ - if (D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp) & - d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth) { - goto ret_ok; - } else { - /* - * Since it cannot, call this function again to choose any - * display mode which is compatible - */ - mode = D3DAPP_YOUDECIDE; - ATTEMPT(D3DAppIVerifyDriverAndMode(&driver, &mode)); - if (driver == D3DAPP_BOGUS) - goto exit_with_error; - goto ret_ok; - } - } else { - /* - * Check to see if this driver can use the specified fullscreen mode - */ - if (D3DAppIBPPToDDBD(d3dappi.Mode[mode].bpp) & - d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth) { - goto ret_ok; - } else { - /* - * Since it cannot, call this function again to choose any - * display mode which is compatible - */ - mode = D3DAPP_YOUDECIDE; - ATTEMPT(D3DAppIVerifyDriverAndMode(&driver, &mode)); - if (driver == D3DAPP_BOGUS) - goto exit_with_error; - goto ret_ok; - } - } - -ret_ok: - *lpdriver = driver; *lpmode = mode; - return TRUE; -exit_with_error: - return FALSE; -} - -/***************************************************************************/ -/* Dirty Rectangle Functions */ -/***************************************************************************/ -/* - * D3DAppIValidateDirtyRects - * Set the dirty rectangles for the front and back buffers to the entire - * client size. - */ -void -D3DAppIValidateDirtyRects(void) -{ - NumDirtyClientRects = 1; NumDirtyBackRects = 1; NumDirtyZRects = 1; - SetRect((LPRECT)&DirtyClient[0], 0, 0, d3dappi.szClient.cx, - d3dappi.szClient.cy); - SetRect((LPRECT)&DirtyBack[0], 0, 0, d3dappi.szClient.cx, - d3dappi.szClient.cy); - SetRect((LPRECT)&DirtyZ[0], 0, 0, d3dappi.szClient.cx, - d3dappi.szClient.cy); -} - -/* - * D3DAppICopyRectList - * Copy a list of rectangles to another - */ -void -D3DAppICopyRectList(int* dstnum, LPD3DRECT dst, int srcnum, LPD3DRECT src) -{ - int i; - for (i = 0; i < srcnum; i++) - dst[i] = src[i]; - *dstnum = srcnum; -} - -/* - * MERGE macro - * Set first rectangle to be the smallest rectangle containing both rects - */ -#undef MERGE -#define MERGE(rc1, rc2) \ - do { \ - if (rc2.x1 < rc1.x1) rc1.x1 = rc2.x1; \ - if (rc2.y1 < rc1.y1) rc1.y1 = rc2.y1; \ - if (rc2.x2 > rc1.x2) rc1.x2 = rc2.x2; \ - if (rc2.y2 > rc1.y2) rc1.y2 = rc2.y2; \ - } while(0) - -/* - * D3DAppIMergeRectLists - * Merge two lists of rectangles to create another list of rectangles. The - * merged list of rectangles covers all the area of the original two with NO - * OVERLAPPING amongst it's rectangles. - */ -void -D3DAppIMergeRectLists(int* dstnum, LPD3DRECT dst, int src1num, LPD3DRECT src1, - int src2num, LPD3DRECT src2) -{ - LPD3DRECT rc; - int* isvalid; - int num, i, j, intersect; - rc = (LPD3DRECT)malloc(sizeof(D3DRECT) * D3DAPP_MAXCLEARRECTS * 2); - memset(rc, 0, sizeof(D3DRECT) * D3DAPP_MAXCLEARRECTS * 2); - isvalid = (int*)malloc(sizeof(int) * D3DAPP_MAXCLEARRECTS * 2); - memset(isvalid, 0, sizeof(int) * D3DAPP_MAXCLEARRECTS * 2); - for (i = 0; i < src1num; i++) { - memcpy(&rc[i], &src1[i], sizeof(D3DRECT)); - if ((rc[i].x1 == 0 && rc[i].x2 == 0) || - (rc[i].y1 == 0 && rc[i].y2 == 0)) - isvalid[i] = 0; - else if (rc[i].x1 <= rc[i].x2 && rc[i].y1 <= rc[i].y2) - isvalid[i] = 1; - else - isvalid[i] = 0; - } - for (i = 0; i < src2num; i++) { - memcpy(&rc[i + src1num], &src2[i], sizeof(D3DRECT)); - if (rc[i + src1num].x1 <= rc[i + src1num].x2 && - rc[i + src1num].y1 <= rc[i + src1num].y2) - isvalid[i + src1num] = 1; - else - isvalid[i + src1num] = 0; - - } - num = src1num + src2num; - for (i = 0; i < num - 1; i++) { - if (!isvalid[i]) continue; - j = i + 1; - do { - intersect = 0; - for (; j < num; j++) { - if (j != i && isvalid[j]) { - if (rc[i].x1 < rc[j].x1) { - if (rc[i].x2 < rc[j].x1) - continue; - } else { - if (rc[j].x2 < rc[i].x1) - continue; - } - if (rc[i].y1 < rc[j].y1) { - if (rc[i].y2 < rc[j].y1) - continue; - } else { - if (rc[j].y2 < rc[i].y1) - continue; - } - MERGE(rc[i], rc[j]); - isvalid[j] = 0; - j = 0; intersect = 1; - break; - } - } - } while(intersect); - } - - for (i = 0, j = 0; i < num; i++) - if (isvalid[i]) ++j; - if (j > D3DAPP_MAXCLEARRECTS) { - for (i = 0; i < num; i++) - if (isvalid[i]) break; - if (i < num) { - *dstnum = 1; - dst[0] = rc[i]; - for (; i < num; i++) { - if (isvalid[i]) { - MERGE(dst[0], rc[i]); - } - } - } else { - *dstnum = 0; - } - } else { - for (i = 0, j = 0; i < num; i++) { - if (isvalid[i]) { - memcpy(&dst[j], &rc[i], sizeof(D3DRECT)); - ++j; - } - } - *dstnum = j; - } - free(rc); - free(isvalid); -} - -/***************************************************************************/ -/* Getting and Setting Window Attribs */ -/***************************************************************************/ -/* - * D3DAppISetClientSize - * Set the client size of the given window. A WM_SIZE message is generated, - * but ignored. - */ -void -D3DAppISetClientSize(HWND hwnd, int w, int h, BOOL bReturnFromFullscreen) -{ - RECT rc; - - bIgnoreWM_SIZE = TRUE; - if (bReturnFromFullscreen) { - SetRect(&rc, 0, 0, w, h); - AdjustWindowRectEx(&rc, GetWindowLong(hwnd, GWL_STYLE), - GetMenu(hwnd) != NULL, - GetWindowLong(hwnd, GWL_EXSTYLE)); - SetWindowPos(hwnd, NULL, 0, 0, rc.right-rc.left, - rc.bottom-rc.top, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); - - } else { - /* - * This is the only way to set the client size correctly if the menu - * is stacked, so do it unless we are returning from a fullscreen - * mode. - */ - SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, w + h << 16); - GetWindowRect(hwnd, &rc); - SetWindowPos(hwnd, NULL, 0, 0, rc.right-rc.left, - rc.bottom-rc.top, - SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); - } - bIgnoreWM_SIZE = FALSE; - d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0; - ClientToScreen(hwnd, &d3dappi.pClientOnPrimary); - d3dappi.szClient.cx = w; d3dappi.szClient.cy = h; -} - -/* - * D3DAppIGetClientWin - * Gets the client window size and sets it in the D3DAppInfo structure - */ -void -D3DAppIGetClientWin(HWND hwnd) -{ - RECT rc; - if (!d3dappi.bFullscreen) { - d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0; - ClientToScreen(hwnd, &d3dappi.pClientOnPrimary); - GetClientRect(hwnd, &rc); - d3dappi.szClient.cx = rc.right; - d3dappi.szClient.cy = rc.bottom; - } else { - /* - * In the fullscreen case, we must be careful because if the window - * frame has been drawn, the client size has shrunk and this can - * cause problems, so it's best to report the entire screen. - */ - d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0; - d3dappi.szClient.cx = d3dappi.ThisMode.w; - d3dappi.szClient.cy = d3dappi.ThisMode.h; - } -} - - -/***************************************************************************/ -/* Error reporting */ -/***************************************************************************/ - -/* - * D3DAppISetErrorString - * Set the global variable which records the last error string. - */ -void -D3DAppISetErrorString( LPSTR fmt, ... ) -{ - char buff[256]; - - buff[0] = 0; - wvsprintf(&buff[0], fmt, (char *)(&fmt+1)); - lstrcat(buff, "\r\n"); - lstrcpy(LastErrorString, buff); -} - -/* dpf - * Debug printf. Very useful for fullscreen exclusive mode or when surfaces - * are in video memory. - */ -void __cdecl -dpf( LPSTR fmt, ... ) -{ - char buff[256]; - - lstrcpy(buff, "D3DApp: "); - wvsprintf(&buff[lstrlen(buff)], fmt, (char *)(&fmt+1)); - lstrcat(buff, "\r\n"); - OutputDebugString(buff); -} diff --git a/sdk/samples/misc/readme.txt b/sdk/samples/misc/readme.txt deleted file mode 100644 index d52f2bb..0000000 --- a/sdk/samples/misc/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -This directory contains a number of miscellaneous files used by the other -sample programs. Many of them code that you may find useful in your -application. - -Rather than browse through these files directly, we suggest that you start -with the sample that is doing something close to what you want to do. Then -when you find references to functions which are not in the files in that -sample directory, you should look for them here. diff --git a/sdk/samples/misc/rmdemo.h b/sdk/samples/misc/rmdemo.h deleted file mode 100644 index 6eebd07..0000000 --- a/sdk/samples/misc/rmdemo.h +++ /dev/null @@ -1,51 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmdemo.h - * - ***************************************************************************/ -#ifndef __RMDEMO_H__ -#define __RMDEMO_H__ - -#include -#include -#include "rmerror.h" - -#undef RELEASE -#ifdef __cplusplus -#define RELEASE(x) if (x != NULL) {x->Release(); x = NULL;} -#else -#define RELEASE(x) if (x != NULL) {x->lpVtbl->Release(x); x = NULL;} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - /* - * A copy of LPDIRECT3DRM for use by the examples. - */ - extern LPDIRECT3DRM lpD3DRM; - /* - * Builds the scene. - */ - BOOL BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, LPDIRECT3DRMFRAME scene, - LPDIRECT3DRMFRAME camera); - - /* - * Allows each example to begin with different defaults - */ - typedef struct Defaultstag { - BOOL bNoTextures; - BOOL bResizingDisabled; - BOOL bConstRenderQuality; - char Name[50]; - } Defaults; - void OverrideDefaults(Defaults* defaults); - -#ifdef __cplusplus -}; -#endif - -#endif //__RMDEMO_H__ - diff --git a/sdk/samples/misc/rmerror.c b/sdk/samples/misc/rmerror.c deleted file mode 100644 index 4a9e3bf..0000000 --- a/sdk/samples/misc/rmerror.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmerror.cpp - * - * Error reporting code for D3DRM examples. - * - */ - -#include "rmerror.h" - -/* Msg - * Displays a message box containing the given formatted string. - */ -void __cdecl -Msg( LPSTR fmt, ... ) -{ - char buff[256]; - - wvsprintf(buff, fmt, (char *)(&fmt+1)); - lstrcat(buff, "\r\n"); - MessageBox( NULL, buff, "D3DRM Example Message", MB_OK ); -} - -/* - * D3DRMErrorToString - * Returns a pointer to a string describing the given DD, D3D or D3DRM error code. - */ -char* -D3DRMErrorToString(HRESULT error) -{ - switch(error) { - case DD_OK: - /* Also includes D3D_OK and D3DRM_OK */ - return "No error.\0"; - case DDERR_ALREADYINITIALIZED: - return "This object is already initialized.\0"; - case DDERR_BLTFASTCANTCLIP: - return "Return if a clipper object is attached to the source surface passed into a BltFast call.\0"; - case DDERR_CANNOTATTACHSURFACE: - return "This surface can not be attached to the requested surface.\0"; - case DDERR_CANNOTDETACHSURFACE: - return "This surface can not be detached from the requested surface.\0"; - case DDERR_CANTCREATEDC: - return "Windows can not create any more DCs.\0"; - case DDERR_CANTDUPLICATE: - return "Can't duplicate primary & 3D surfaces, or surfaces that are implicitly created.\0"; - case DDERR_CLIPPERISUSINGHWND: - return "An attempt was made to set a cliplist for a clipper object that is already monitoring an hwnd.\0"; - case DDERR_COLORKEYNOTSET: - return "No src color key specified for this operation.\0"; - case DDERR_CURRENTLYNOTAVAIL: - return "Support is currently not available.\0"; - case DDERR_DIRECTDRAWALREADYCREATED: - return "A DirectDraw object representing this driver has already been created for this process.\0"; - case DDERR_EXCEPTION: - return "An exception was encountered while performing the requested operation.\0"; - case DDERR_EXCLUSIVEMODEALREADYSET: - return "An attempt was made to set the cooperative level when it was already set to exclusive.\0"; - case DDERR_GENERIC: - return "Generic failure.\0"; - case DDERR_HEIGHTALIGN: - return "Height of rectangle provided is not a multiple of reqd alignment.\0"; - case DDERR_HWNDALREADYSET: - return "The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.\0"; - case DDERR_HWNDSUBCLASSED: - return "HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.\0"; - case DDERR_IMPLICITLYCREATED: - return "This surface can not be restored because it is an implicitly created surface.\0"; - case DDERR_INCOMPATIBLEPRIMARY: - return "Unable to match primary surface creation request with existing primary surface.\0"; - case DDERR_INVALIDCAPS: - return "One or more of the caps bits passed to the callback are incorrect.\0"; - case DDERR_INVALIDCLIPLIST: - return "DirectDraw does not support the provided cliplist.\0"; - case DDERR_INVALIDDIRECTDRAWGUID: - return "The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.\0"; - case DDERR_INVALIDMODE: - return "DirectDraw does not support the requested mode.\0"; - case DDERR_INVALIDOBJECT: - return "DirectDraw received a pointer that was an invalid DIRECTDRAW object.\0"; - case DDERR_INVALIDPARAMS: - return "One or more of the parameters passed to the function are incorrect.\0"; - case DDERR_INVALIDPIXELFORMAT: - return "The pixel format was invalid as specified.\0"; - case DDERR_INVALIDPOSITION: - return "Returned when the position of the overlay on the destination is no longer legal for that destination.\0"; - case DDERR_INVALIDRECT: - return "Rectangle provided was invalid.\0"; - case DDERR_LOCKEDSURFACES: - return "Operation could not be carried out because one or more surfaces are locked.\0"; - case DDERR_NO3D: - return "There is no 3D present.\0"; - case DDERR_NOALPHAHW: - return "Operation could not be carried out because there is no alpha accleration hardware present or available.\0"; - case DDERR_NOBLTHW: - return "No blitter hardware present.\0"; - case DDERR_NOCLIPLIST: - return "No cliplist available.\0"; - case DDERR_NOCLIPPERATTACHED: - return "No clipper object attached to surface object.\0"; - case DDERR_NOCOLORCONVHW: - return "Operation could not be carried out because there is no color conversion hardware present or available.\0"; - case DDERR_NOCOLORKEY: - return "Surface doesn't currently have a color key\0"; - case DDERR_NOCOLORKEYHW: - return "Operation could not be carried out because there is no hardware support of the destination color key.\0"; - case DDERR_NOCOOPERATIVELEVELSET: - return "Create function called without DirectDraw object method SetCooperativeLevel being called.\0"; - case DDERR_NODC: - return "No DC was ever created for this surface.\0"; - case DDERR_NODDROPSHW: - return "No DirectDraw ROP hardware.\0"; - case DDERR_NODIRECTDRAWHW: - return "A hardware-only DirectDraw object creation was attempted but the driver did not support any hardware.\0"; - case DDERR_NOEMULATION: - return "Software emulation not available.\0"; - case DDERR_NOEXCLUSIVEMODE: - return "Operation requires the application to have exclusive mode but the application does not have exclusive mode.\0"; - case DDERR_NOFLIPHW: - return "Flipping visible surfaces is not supported.\0"; - case DDERR_NOGDI: - return "There is no GDI present.\0"; - case DDERR_NOHWND: - return "Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.\0"; - case DDERR_NOMIRRORHW: - return "Operation could not be carried out because there is no hardware present or available.\0"; - case DDERR_NOOVERLAYDEST: - return "Returned when GetOverlayPosition is called on an overlay that UpdateOverlay has never been called on to establish a destination.\0"; - case DDERR_NOOVERLAYHW: - return "Operation could not be carried out because there is no overlay hardware present or available.\0"; - case DDERR_NOPALETTEATTACHED: - return "No palette object attached to this surface.\0"; - case DDERR_NOPALETTEHW: - return "No hardware support for 16 or 256 color palettes.\0"; - case DDERR_NORASTEROPHW: - return "Operation could not be carried out because there is no appropriate raster op hardware present or available.\0"; - case DDERR_NOROTATIONHW: - return "Operation could not be carried out because there is no rotation hardware present or available.\0"; - case DDERR_NOSTRETCHHW: - return "Operation could not be carried out because there is no hardware support for stretching.\0"; - case DDERR_NOT4BITCOLOR: - return "DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.\0"; - case DDERR_NOT4BITCOLORINDEX: - return "DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.\0"; - case DDERR_NOT8BITCOLOR: - return "DirectDrawSurface is not in 8 bit color mode and the requested operation requires 8 bit color.\0"; - case DDERR_NOTAOVERLAYSURFACE: - return "Returned when an overlay member is called for a non-overlay surface.\0"; - case DDERR_NOTEXTUREHW: - return "Operation could not be carried out because there is no texture mapping hardware present or available.\0"; - case DDERR_NOTFLIPPABLE: - return "An attempt has been made to flip a surface that is not flippable.\0"; - case DDERR_NOTFOUND: - return "Requested item was not found.\0"; - case DDERR_NOTLOCKED: - return "Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.\0"; - case DDERR_NOTPALETTIZED: - return "The surface being used is not a palette-based surface.\0"; - case DDERR_NOVSYNCHW: - return "Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.\0"; - case DDERR_NOZBUFFERHW: - return "Operation could not be carried out because there is no hardware support for zbuffer blitting.\0"; - case DDERR_NOZOVERLAYHW: - return "Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.\0"; - case DDERR_OUTOFCAPS: - return "The hardware needed for the requested operation has already been allocated.\0"; - case DDERR_OUTOFMEMORY: - return "DirectDraw does not have enough memory to perform the operation.\0"; - case DDERR_OUTOFVIDEOMEMORY: - return "DirectDraw does not have enough memory to perform the operation.\0"; - case DDERR_OVERLAYCANTCLIP: - return "The hardware does not support clipped overlays.\0"; - case DDERR_OVERLAYCOLORKEYONLYONEACTIVE: - return "Can only have ony color key active at one time for overlays.\0"; - case DDERR_OVERLAYNOTVISIBLE: - return "Returned when GetOverlayPosition is called on a hidden overlay.\0"; - case DDERR_PALETTEBUSY: - return "Access to this palette is being refused because the palette is already locked by another thread.\0"; - case DDERR_PRIMARYSURFACEALREADYEXISTS: - return "This process already has created a primary surface.\0"; - case DDERR_REGIONTOOSMALL: - return "Region passed to Clipper::GetClipList is too small.\0"; - case DDERR_SURFACEALREADYATTACHED: - return "This surface is already attached to the surface it is being attached to.\0"; - case DDERR_SURFACEALREADYDEPENDENT: - return "This surface is already a dependency of the surface it is being made a dependency of.\0"; - case DDERR_SURFACEBUSY: - return "Access to this surface is being refused because the surface is already locked by another thread.\0"; - case DDERR_SURFACEISOBSCURED: - return "Access to surface refused because the surface is obscured.\0"; - case DDERR_SURFACELOST: - return "Access to this surface is being refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have Restore called on it.\0"; - case DDERR_SURFACENOTATTACHED: - return "The requested surface is not attached.\0"; - case DDERR_TOOBIGHEIGHT: - return "Height requested by DirectDraw is too large.\0"; - case DDERR_TOOBIGSIZE: - return "Size requested by DirectDraw is too large, but the individual height and width are OK.\0"; - case DDERR_TOOBIGWIDTH: - return "Width requested by DirectDraw is too large.\0"; - case DDERR_UNSUPPORTED: - return "Action not supported.\0"; - case DDERR_UNSUPPORTEDFORMAT: - return "FOURCC format requested is unsupported by DirectDraw.\0"; - case DDERR_UNSUPPORTEDMASK: - return "Bitmask in the pixel format requested is unsupported by DirectDraw.\0"; - case DDERR_VERTICALBLANKINPROGRESS: - return "Vertical blank is in progress.\0"; - case DDERR_WASSTILLDRAWING: - return "Informs DirectDraw that the previous Blt which is transfering information to or from this Surface is incomplete.\0"; - case DDERR_WRONGMODE: - return "This surface can not be restored because it was created in a different mode.\0"; - case DDERR_XALIGN: - return "Rectangle provided was not horizontally aligned on required boundary.\0"; - case D3DERR_BADMAJORVERSION: - return "D3DERR_BADMAJORVERSION\0"; - case D3DERR_BADMINORVERSION: - return "D3DERR_BADMINORVERSION\0"; - case D3DERR_EXECUTE_LOCKED: - return "D3DERR_EXECUTE_LOCKED\0"; - case D3DERR_EXECUTE_NOT_LOCKED: - return "D3DERR_EXECUTE_NOT_LOCKED\0"; - case D3DERR_EXECUTE_CREATE_FAILED: - return "D3DERR_EXECUTE_CREATE_FAILED\0"; - case D3DERR_EXECUTE_DESTROY_FAILED: - return "D3DERR_EXECUTE_DESTROY_FAILED\0"; - case D3DERR_EXECUTE_LOCK_FAILED: - return "D3DERR_EXECUTE_LOCK_FAILED\0"; - case D3DERR_EXECUTE_UNLOCK_FAILED: - return "D3DERR_EXECUTE_UNLOCK_FAILED\0"; - case D3DERR_EXECUTE_FAILED: - return "D3DERR_EXECUTE_FAILED\0"; - case D3DERR_EXECUTE_CLIPPED_FAILED: - return "D3DERR_EXECUTE_CLIPPED_FAILED\0"; - case D3DERR_TEXTURE_NO_SUPPORT: - return "D3DERR_TEXTURE_NO_SUPPORT\0"; - case D3DERR_TEXTURE_NOT_LOCKED: - return "D3DERR_TEXTURE_NOT_LOCKED\0"; - case D3DERR_TEXTURE_LOCKED: - return "D3DERR_TEXTURELOCKED\0"; - case D3DERR_TEXTURE_CREATE_FAILED: - return "D3DERR_TEXTURE_CREATE_FAILED\0"; - case D3DERR_TEXTURE_DESTROY_FAILED: - return "D3DERR_TEXTURE_DESTROY_FAILED\0"; - case D3DERR_TEXTURE_LOCK_FAILED: - return "D3DERR_TEXTURE_LOCK_FAILED\0"; - case D3DERR_TEXTURE_UNLOCK_FAILED: - return "D3DERR_TEXTURE_UNLOCK_FAILED\0"; - case D3DERR_TEXTURE_LOAD_FAILED: - return "D3DERR_TEXTURE_LOAD_FAILED\0"; - case D3DERR_MATRIX_CREATE_FAILED: - return "D3DERR_MATRIX_CREATE_FAILED\0"; - case D3DERR_MATRIX_DESTROY_FAILED: - return "D3DERR_MATRIX_DESTROY_FAILED\0"; - case D3DERR_MATRIX_SETDATA_FAILED: - return "D3DERR_MATRIX_SETDATA_FAILED\0"; - case D3DERR_SETVIEWPORTDATA_FAILED: - return "D3DERR_SETVIEWPORTDATA_FAILED\0"; - case D3DERR_MATERIAL_CREATE_FAILED: - return "D3DERR_MATERIAL_CREATE_FAILED\0"; - case D3DERR_MATERIAL_DESTROY_FAILED: - return "D3DERR_MATERIAL_DESTROY_FAILED\0"; - case D3DERR_MATERIAL_SETDATA_FAILED: - return "D3DERR_MATERIAL_SETDATA_FAILED\0"; - case D3DERR_LIGHT_SET_FAILED: - return "D3DERR_LIGHT_SET_FAILED\0"; - case D3DRMERR_BADOBJECT: - return "D3DRMERR_BADOBJECT\0"; - case D3DRMERR_BADTYPE: - return "D3DRMERR_BADTYPE\0"; - case D3DRMERR_BADALLOC: - return "D3DRMERR_BADALLOC\0"; - case D3DRMERR_FACEUSED: - return "D3DRMERR_FACEUSED\0"; - case D3DRMERR_NOTFOUND: - return "D3DRMERR_NOTFOUND\0"; - case D3DRMERR_NOTDONEYET: - return "D3DRMERR_NOTDONEYET\0"; - case D3DRMERR_FILENOTFOUND: - return "The file was not found.\0"; - case D3DRMERR_BADFILE: - return "D3DRMERR_BADFILE\0"; - case D3DRMERR_BADDEVICE: - return "D3DRMERR_BADDEVICE\0"; - case D3DRMERR_BADVALUE: - return "D3DRMERR_BADVALUE\0"; - case D3DRMERR_BADMAJORVERSION: - return "D3DRMERR_BADMAJORVERSION\0"; - case D3DRMERR_BADMINORVERSION: - return "D3DRMERR_BADMINORVERSION\0"; - case D3DRMERR_UNABLETOEXECUTE: - return "D3DRMERR_UNABLETOEXECUTE\0"; - default: - return "Unrecognized error value.\0"; - } -} diff --git a/sdk/samples/misc/rmerror.h b/sdk/samples/misc/rmerror.h deleted file mode 100644 index 80cf3b7..0000000 --- a/sdk/samples/misc/rmerror.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmerror.h - * - * Error reporting code for D3DRM examples. - * - */ - -#ifndef __ERROR_H__ -#define __ERROR_H__ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Msg - * Displays a message box containing the given formatted string. - */ -void __cdecl -Msg( LPSTR fmt, ... ); - -/* - * D3DRMErrorToString - * Returns a pointer to a string describing the given DD, D3D or D3DRM error code. - */ -char* -D3DRMErrorToString(HRESULT error); - -#ifdef __cplusplus -}; -#endif -#endif // __ERROR_H__ - diff --git a/sdk/samples/misc/rmfull.cpp b/sdk/samples/misc/rmfull.cpp deleted file mode 100644 index 15837f4..0000000 --- a/sdk/samples/misc/rmfull.cpp +++ /dev/null @@ -1,1088 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmfull.cpp - * - * Each of the Direct3D retained mode (D3DRM) samples may be linked with - * this file. It contains the code which allows them to run in the Windows - * environment as a window or fullscreen. It is a modified version of - * d3dmain.cpp. Comparing these two files is instructive. - * - * A window is created using rmfull.res which allows the user to select the - * Direct3D driver to use and change the render options. The D3DApp - * collection of functions is used to initialize DirectDraw, Direct3D and - * keep surfaces and D3D devices available for rendering. - * - * Frame rate and a screen mode information buffer is Blt'ed to the screen - * by functions in rmstats.cpp. - * - * Individual samples are executed through two functions, BuildScene and - * OverrideDefaults, as described in rmdemo.h. Samples can also read - * mouse input via ReadMouse. - */ - -#include "rmfull.h" - -/* - * GLOBAL VARIABLES - */ -D3DAppInfo* d3dapp; /* Pointer to read only collection of DD and D3D - objects maintained by D3DApp */ -rmfullglobals myglobs; /* collection of global variables */ -LPDIRECT3DRM lpD3DRM; /* Direct3DRM object */ - -/* - * INTERNAL FUNCTION PROTOTYPES - */ -static BOOL AppInit(HINSTANCE hInstance, LPSTR lpCmdLine); -static BOOL CreateD3DApp(LPSTR lpCmdLine); -static BOOL BeforeDeviceDestroyed(LPVOID lpContext); -static BOOL AfterDeviceCreated(int w, int h, LPDIRECT3DVIEWPORT* lpViewport, - LPVOID lpContext); -void CleanUpAndPostQuit(void); -static void InitGlobals(void); -static BOOL AppPause(BOOL f); -void ReportD3DAppError(void); -static BOOL RenderLoop(void); -static BOOL RestoreSurfaces(); -long FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam ); -extern "C" void ReadMouse(int*, int*, int*); -extern "C" char* D3DRMErrorToString(HRESULT error); -BOOL CreateD3DRM(HWND win); -BOOL SetRenderState(void); - -/****************************************************************************/ -/* WinMain */ -/****************************************************************************/ -/* - * Initializes the application then enters a message loop which calls sample's - * RenderScene until a quit message is received. - */ -int PASCAL -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow) -{ - int failcount = 0; /* number of times RenderLoop has failed */ - MSG msg; - HACCEL hAccelApp; - - hPrevInstance; - /* - * Create the window and initialize all objects needed to begin rendering - */ - if(!AppInit(hInstance, lpCmdLine)) - return FALSE; - hAccelApp = LoadAccelerators(hInstance, "AppAccel"); - - while (!myglobs.bQuit) { - /* - * Monitor the message queue until there are no pressing - * messages - */ - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - CleanUpAndPostQuit(); - break; - } - if (!myglobs.hWndMain || !TranslateAccelerator(myglobs.hWndMain, - hAccelApp, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - /* - * If the app is not minimized, not about to quit, not paused, either the - * active fullscreen app or in a window and D3D has been initialized, - * we can render - */ - } else if (d3dapp->bRenderingIsOK && !d3dapp->bMinimized - && !d3dapp->bPaused && !myglobs.bQuit - && (d3dapp->bAppActive || !d3dapp->bFullscreen)) { - /* - * If were are not in single step mode or if we are and the - * bDrawAFrame flag is set, render one frame - */ - if (!(myglobs.bSingleStepMode && !myglobs.bDrawAFrame)) { - /* - * Attempt to render a frame, if it fails, take a note. If - * rendering fails more than twice, abort execution. - */ - if (!RenderLoop()) { - ++failcount; - if (failcount == 3) { - Msg("Rendering has failed too many times. Aborting execution.\n"); - CleanUpAndPostQuit(); - break; - } - } - } - /* - * Reset the bDrawAFrame flag if we are in single step mode - */ - if (myglobs.bSingleStepMode) - myglobs.bDrawAFrame = FALSE; - } else { - WaitMessage(); - } - } - DestroyWindow(myglobs.hWndMain); - return msg.wParam; -} - -/****************************************************************************/ -/* D3DApp Initialization and callback functions */ -/****************************************************************************/ -/* - * AppInit - * Creates the window and initializes all objects necessary to begin rendering - */ -static BOOL -AppInit(HINSTANCE hInstance, LPSTR lpCmdLine) -{ - WNDCLASS wc; - DWORD flags; - Defaults defaults; - - /* - * Register the window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, "AppIcon"); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = "AppMenu"; - wc.lpszClassName = "Example"; - if (!RegisterClass(&wc)) - return FALSE; - /* - * Initialize the global variables and allow the sample code to override - * some of these default settings. - */ - InitGlobals(); - myglobs.hInstApp = hInstance; - defaults.bNoTextures = myglobs.bNoTextures; - defaults.bConstRenderQuality = myglobs.bConstRenderQuality; - defaults.bResizingDisabled = FALSE; - lstrcpy(defaults.Name, "D3DRM Example"); - OverrideDefaults(&defaults); - myglobs.bNoTextures = defaults.bNoTextures; - myglobs.bConstRenderQuality = defaults.bConstRenderQuality; - /* - * Create the window - */ - if (defaults.bResizingDisabled) - flags = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | - WS_MINIMIZEBOX | WS_MAXIMIZEBOX; - else - flags = WS_OVERLAPPEDWINDOW; - /* - * Create a window with some default settings that may change - */ - myglobs.hWndMain = CreateWindowEx( - WS_EX_APPWINDOW, - "Example", - defaults.Name, - flags, - CW_USEDEFAULT, CW_USEDEFAULT, - START_WIN_SIZE, START_WIN_SIZE, - NULL, /* parent window */ - NULL, /* menu handle */ - hInstance, /* program handle */ - NULL); /* create parms */ - if (!myglobs.hWndMain){ - Msg("CreateWindowEx failed"); - return FALSE; - } - /* - * Display the window - */ - ShowWindow(myglobs.hWndMain, SW_SHOWNORMAL); - UpdateWindow(myglobs.hWndMain); - /* - * Create the D3DRM object which are initialized only when the program - * starts - */ - if (!CreateD3DRM(myglobs.hWndMain)) - return FALSE; - /* - * Call D3DApp to initialize all DD and D3D objects necessary to render. - * D3DApp will call the device creation callback which will initialize the - * viewport and the sample's execute buffers. - */ - if (!CreateD3DApp(lpCmdLine)) - return FALSE; - /* - * Create the scene to be rendered by calling this sample's BuildScene - */ - if (!BuildScene(myglobs.dev, myglobs.view, myglobs.scene, myglobs.camera)) - return FALSE; - - return TRUE; -} - -/* - * CreateD3DRM - * Create main D3DRM objects which are only initialized once. - */ -BOOL -CreateD3DRM(HWND win) -{ - HRESULT rval; - - /* - * Create the D3DRM object - */ - rval = Direct3DRMCreate(&lpD3DRM); - if (rval != D3DRM_OK) { - Msg("Failed to create Direct3DRM.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Create the master scene frame and camera frame - */ - rval = lpD3DRM->CreateFrame(NULL, &myglobs.scene); - if (rval != D3DRM_OK) { - Msg("Failed to create the master scene frame.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - rval = lpD3DRM->CreateFrame(myglobs.scene, &myglobs.camera); - if (rval != D3DRM_OK) { - Msg("Failed to create the camera's frame.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - rval = myglobs.camera->SetPosition(myglobs.scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - if (rval != D3DRM_OK) { - Msg("Failed to position the camera in the frame.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - return TRUE; -} - -/* - * CreateD3DApp - * Create all DirectDraw and Direct3D objects necessary to begin rendering. - * Add the list of D3D drivers to the file menu. - */ -static BOOL -CreateD3DApp(LPSTR lpCmdLine) -{ - HMENU hmenu; - int i; - LPSTR option; - BOOL bOnlySystemMemory, bOnlyEmulation; - DWORD flags; - - /* - * Parse the command line in seach of one of the following options: - * systemmemory All surfaces should be created in system memory. - * Hardware DD and D3D devices are disabled, but - * debugging during the Win16 lock becomes possible. - * emulation Do not use hardware DD or D3D devices. - */ - bOnlySystemMemory = FALSE; - bOnlyEmulation = FALSE; - option = strtok(lpCmdLine, " -"); - while(option != NULL ) { - if (!lstrcmp(option, "systemmemory")) { - bOnlySystemMemory = TRUE; - } else if (!lstrcmp(option, "emulation")) { - bOnlyEmulation = TRUE; - } else { - Msg("Invalid command line options given.\nLegal options: -systemmemory, -emulation\n"); - return FALSE; - } - option = strtok(NULL, " -"); - } - /* - * Set the flags to pass to the D3DApp creation based on command line - */ - flags = ((bOnlySystemMemory) ? D3DAPP_ONLYSYSTEMMEMORY : 0) | - ((bOnlyEmulation) ? (D3DAPP_ONLYD3DEMULATION | - D3DAPP_ONLYDDEMULATION) : 0); - /* - * Create all the DirectDraw and D3D objects neccesary to render. The - * AfterDeviceCreated callback function is called by D3DApp to create the - * viewport and the example's execute buffers. - */ - if (!D3DAppCreateFromHWND(flags, myglobs.hWndMain, AfterDeviceCreated, - NULL, BeforeDeviceDestroyed, NULL, &d3dapp)) { - ReportD3DAppError(); - return FALSE; - } - /* - * Add the the list of display modes D3DApp found to the mode menu - */ - hmenu = GetSubMenu(GetMenu(myglobs.hWndMain), 2); - for (i = 0; i < d3dapp->NumModes; i++) { - char ach[80]; - wsprintf(ach,"%dx%dx%d", d3dapp->Mode[i].w, d3dapp->Mode[i].h, - d3dapp->Mode[i].bpp); - AppendMenu(hmenu, MF_STRING, MENU_FIRST_MODE+i, ach); - } - /* - * Add the list of D3D drivers D3DApp foudn to the file menu - */ - hmenu = GetSubMenu(GetMenu(myglobs.hWndMain), 0); - for (i = 0; i < d3dapp->NumDrivers; i++) { - InsertMenu(hmenu, 6 + i, MF_BYPOSITION | MF_STRING, - MENU_FIRST_DRIVER + i, d3dapp->Driver[i].Name); - } - - return TRUE; -} - -/* - * AfterDeviceCreated - * D3DApp will call this function immediately after the D3D device has been - * created (or re-created). D3DApp expects the D3D viewport to be created and - * returned. In this case, we will return NULL because we only have a D3DRM - * viewport. This is fine as long as we don't use any of the D3D viewport - * functionality of D3DApp. - */ -static BOOL -AfterDeviceCreated(int w, int h, LPDIRECT3DVIEWPORT* lplpViewport, LPVOID lpContext) -{ - HRESULT rval; - - rval = lpD3DRM->CreateDeviceFromD3D(d3dapp->lpD3D, d3dapp->lpD3DDevice, - &myglobs.dev); - if (rval != D3DRM_OK) { - Msg("Creation of D3DRM device failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Create the D3DRM viewport using the camera frame. Set the background - * depth to a large number. The width and height may be slightly - * adjusted, so get them from the device to be sure. - */ - w = myglobs.dev->GetWidth(); - h = myglobs.dev->GetHeight(); - rval = lpD3DRM->CreateViewport(myglobs.dev, myglobs.camera, 0, 0, w, - h, &myglobs.view); - if (rval != D3DRM_OK) { - Msg("Failed to create the D3DRM viewport.\n%s", - D3DAppErrorToString(rval)); - RELEASE(myglobs.dev); - return FALSE; - } - rval = myglobs.view->SetBack(D3DVAL(5000.0)); - if (rval != D3DRM_OK) { - Msg("Failed to set the background depth of the D3DRM viewport.\n%s", - D3DAppErrorToString(rval)); - RELEASE(myglobs.dev); - RELEASE(myglobs.view); - return FALSE; - } - /* - * Set the render quality, fill mode, lighting state and color shade info - */ - if (!SetRenderState()) - return FALSE; - - /* - * Return NULL for the viewport - */ - *lplpViewport = NULL; - /* - * Create and initialize the surfaces containing the frame rate and - * window information - */ - InitFontAndTextBuffers(); - - return TRUE; -} - -/* - * BeforeDeviceDestroyed - * D3DApp will call this function before the current D3D device is destroyed - * to give the app the opportunity to destroy objects it has created with the - * DD or D3D objects. - */ -static BOOL -BeforeDeviceDestroyed(LPVOID lpContext) -{ - RELEASE(myglobs.view); - RELEASE(myglobs.dev); - return TRUE; -} - -/****************************************************************************/ -/* Rendering loop */ -/****************************************************************************/ -/* - * RenderLoop - * Render the next frame and update the window - */ -static BOOL -RenderLoop() -{ - D3DRECT extents[D3DAPP_MAXCLEARRECTS]; - int count; - HRESULT rval; - static BOOL b = FALSE; // Clear the second buffer on also - - /* - * If all the DD and D3D objects have been initialized we can render - */ - if (d3dapp->bRenderingIsOK) { - /* - * Restore any lost surfaces - */ - if (!RestoreSurfaces()) { - /* - * Restoring surfaces sometimes fails because the surfaces cannot - * yet be restored. If this is the case, the error will show up - * somewhere else and we should return success here to prevent - * unnecessary error's being reported. - */ - return TRUE; - } - /* - * Force an update of the entire client window if the resized flag is set - */ - if (myglobs.bResized || b) - myglobs.view->ForceUpdate(0, 0, d3dapp->szClient.cx, d3dapp->szClient.cy); - /* - * Use b to makesure the second buffer is cleared also - */ - if (b) - b = FALSE; - if (myglobs.bResized) - b = TRUE; - - /* - * Calculate the frame rate - */ - if (!CalculateFrameRate()) - return FALSE; - - /* - * Tick the scene - */ - rval = myglobs.scene->Move(D3DVAL(1.0)); - if (rval != D3DRM_OK) { - Msg("Moving scene failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Clear the viewport - */ - rval = myglobs.view->Clear(); - if (rval != D3DRM_OK) { - Msg("Clearing viewport failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Render the scene to the viewport - */ - rval = myglobs.view->Render(myglobs.scene); - if (rval != D3DRM_OK) { - Msg("Rendering scene failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Blt the frame rate and window stat text to the back buffer - */ - count = 0; - if (!DisplayFrameRate(&count, &extents[0])) - return FALSE; - for (;count;--count) - myglobs.view->ForceUpdate(extents[count-1].x1, extents[count-1].y1, - extents[count-1].x2, extents[count-1].y2); - /* - * Update the window - */ - rval = myglobs.dev->Update(); - if (rval != D3DRM_OK) { - Msg("Updating device failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Blt or flip the back buffer to the front buffer. If this fails, - * don't report an error. - */ - D3DAppShowBackBuffer(myglobs.bResized ? D3DAPP_SHOWALL : NULL); - - /* - * Reset the resize flag - */ - myglobs.bResized = FALSE; - } - return TRUE; -} - -/* - * AppPause - * Pause and unpause the application - */ -static BOOL -AppPause(BOOL f) -{ - /* - * Flip to the GDI surface and halt rendering - */ - if (!D3DAppPause(f)) - return FALSE; - /* - * When returning from a pause, reset the frame rate count - */ - if (!f) { - ResetFrameRate(); - myglobs.bResized = TRUE; - } - return TRUE; -} - -/* - * RestoreSurfaces - * Restores any lost surfaces. Returns TRUE if all surfaces are not lost and - * FALSE if one or more surfaces is lost and can not be restored at the - * moment. - */ -static BOOL -RestoreSurfaces() -{ - HRESULT d3drval; - - /* - * Have D3DApp check all the surfaces it's in charge of - */ - if (!D3DAppCheckForLostSurfaces()) { - return FALSE; - } - /* - * Check frame rate and info surfaces and re-write them if they - * were lost. - */ - if (myglobs.lpFrameRateBuffer->IsLost() == DDERR_SURFACELOST) { - d3drval = myglobs.lpFrameRateBuffer->Restore(); - if (d3drval != DD_OK) { - return FALSE; - } - if (!WriteFrameRateBuffer(0.0f, 0)) - return FALSE; - } - if (myglobs.lpInfoBuffer->IsLost() == DDERR_SURFACELOST) { - d3drval = myglobs.lpInfoBuffer->Restore(); - if (d3drval != DD_OK) { - return FALSE; - } - if (!WriteInfoBuffer()) - return FALSE; - } - return TRUE; -} - - -/************************************************************************* - Windows message handlers - *************************************************************************/ -/* - * AppAbout - * About box message handler - */ -BOOL -FAR PASCAL AppAbout(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) - EndDialog(hwnd, TRUE); - break; - - case WM_INITDIALOG: - return TRUE; - } - return FALSE; -} - -/* - * WindowProc - * Main window message handler. - */ -long -FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam ) -{ - int i; - BOOL bStop; - LRESULT lresult; - - /* - * Give D3DApp an opportunity to process any messages it MUST see in order - * to perform it's function. - */ - if (!D3DAppWindowProc(&bStop, &lresult, hWnd, message, wParam, lParam)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - return 0; - } - /* - * If bStop is set by D3DApp, the app should not process the message but - * return lresult. - */ - if (bStop) - return lresult; - - switch( message ) { - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MOUSEMOVE: - /* - * Record the mouse state for ReadMouse - */ - myglobs.mouse_buttons = wParam; - myglobs.mouse_x = LOWORD(lParam); - myglobs.mouse_y = HIWORD(lParam); - break; - case WM_ENTERMENULOOP: - AppPause(TRUE); - break; - case WM_EXITMENULOOP: - AppPause(FALSE); - break; - case WM_DESTROY: - myglobs.hWndMain = NULL; - CleanUpAndPostQuit(); - break; - case WM_INITMENUPOPUP: - /* - * Check and enable the appropriate menu items - */ - CheckMenuItem((HMENU)wParam, MENU_STEP, (myglobs.bSingleStepMode) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_GO, (myglobs.bSingleStepMode) ? MF_ENABLED : MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_PHONG, MF_GRAYED); - if (!myglobs.bConstRenderQuality) { - CheckMenuItem((HMENU)wParam, MENU_LIGHTING, (myglobs.RenderQuality & D3DRMLIGHT_MASK) == D3DRMLIGHT_ON ? MF_CHECKED : MF_GRAYED); - CheckMenuItem((HMENU)wParam, MENU_FLAT, (myglobs.RenderQuality & D3DRMSHADE_MASK) == D3DRMSHADE_FLAT ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_GOURAUD, (myglobs.RenderQuality & D3DRMSHADE_MASK) == D3DRMSHADE_GOURAUD ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_PHONG, (myglobs.RenderQuality & D3DRMSHADE_MASK) == D3DRMSHADE_PHONG ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_PHONG, MF_GRAYED); - CheckMenuItem((HMENU)wParam, MENU_POINT, (myglobs.RenderQuality & D3DRMFILL_MASK) == D3DRMFILL_POINTS ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_WIREFRAME, (myglobs.RenderQuality & D3DRMFILL_MASK) == D3DRMFILL_WIREFRAME ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_SOLID, (myglobs.RenderQuality & D3DRMFILL_MASK) == D3DRMFILL_SOLID ? MF_CHECKED : MF_UNCHECKED); - } else { - EnableMenuItem((HMENU)wParam, MENU_LIGHTING, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_FLAT, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_GOURAUD, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_PHONG, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_POINT, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_WIREFRAME, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_SOLID, MF_GRAYED); - } - if (!myglobs.bNoTextures && d3dapp->ThisDriver.bDoesTextures) { - CheckMenuItem((HMENU)wParam, MENU_POINT_FILTER, (myglobs.TextureQuality == D3DRMTEXTURE_NEAREST) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_LINEAR_FILTER, (myglobs.TextureQuality == D3DRMTEXTURE_LINEAR) ? MF_CHECKED : MF_UNCHECKED); - } else { - EnableMenuItem((HMENU)wParam, MENU_POINT_FILTER, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_LINEAR_FILTER, MF_GRAYED); - } - CheckMenuItem((HMENU)wParam, MENU_DITHERING, (myglobs.bDithering) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wParam, MENU_ANTIALIAS, (myglobs.bAntialiasing) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_ANTIALIAS, MF_GRAYED); - if (d3dapp->bIsPrimary) { - CheckMenuItem((HMENU)wParam, MENU_FULLSCREEN, d3dapp->bFullscreen ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_FULLSCREEN, d3dapp->bFullscreen && !d3dapp->ThisDriver.bCanDoWindow ? MF_GRAYED : MF_ENABLED); - EnableMenuItem((HMENU)wParam, MENU_NEXT_MODE, (!d3dapp->bFullscreen) ? MF_GRAYED : MF_ENABLED); - EnableMenuItem((HMENU)wParam, MENU_PREVIOUS_MODE, (!d3dapp->bFullscreen) ? MF_GRAYED : MF_ENABLED); - } else { - EnableMenuItem((HMENU)wParam, MENU_FULLSCREEN, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_NEXT_MODE, MF_GRAYED); - EnableMenuItem((HMENU)wParam, MENU_PREVIOUS_MODE, MF_GRAYED); - } - for (i = 0; i < d3dapp->NumModes; i++) { - CheckMenuItem((HMENU)wParam, MENU_FIRST_MODE + i, (i == d3dapp->CurrMode) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wParam, MENU_FIRST_MODE + i, (d3dapp->Mode[i].bThisDriverCanDo) ? MF_ENABLED : MF_GRAYED); - } - for (i = 0; i < d3dapp->NumDrivers; i++) { - CheckMenuItem((HMENU)wParam, MENU_FIRST_DRIVER + i, (i == d3dapp->CurrDriver) ? MF_CHECKED : MF_UNCHECKED); - } - break; - case WM_COMMAND: - switch(LOWORD(wParam)) { - case MENU_ABOUT: - AppPause(TRUE); - DialogBox(myglobs.hInstApp, "AppAbout", myglobs.hWndMain, (DLGPROC)AppAbout); - AppPause(FALSE); - break; - case MENU_EXIT: - CleanUpAndPostQuit(); - break; - case MENU_STEP: - /* - * Begin single step more or draw a frame if in single - * step mode - */ - if (!myglobs.bSingleStepMode) { - myglobs.bSingleStepMode = TRUE; - myglobs.bDrawAFrame = TRUE; - } else if (!myglobs.bDrawAFrame) { - myglobs.bDrawAFrame = TRUE; - } - break; - case MENU_GO: - /* - * Exit single step mode - */ - if (myglobs.bSingleStepMode) { - myglobs.bSingleStepMode = FALSE; - ResetFrameRate(); - } - break; - case MENU_STATS: - /* - * Toggle output of frame rate and window info - */ - if ((myglobs.bShowFrameRate) && (myglobs.bShowInfo)) { - myglobs.bShowFrameRate = FALSE; - myglobs.bShowInfo = FALSE; - break; - } - if ((!myglobs.bShowFrameRate) && (!myglobs.bShowInfo)) { - myglobs.bShowFrameRate = TRUE; - break; - } - myglobs.bShowInfo = TRUE; - break; - case MENU_FULLSCREEN: - if (d3dapp->bFullscreen) { - /* - * Return to a windowed mode. Let D3DApp decide which - * D3D driver to use in case this one cannot render to - * the Windows display depth - */ - if (!D3DAppWindow(D3DAPP_YOUDECIDE, D3DAPP_YOUDECIDE)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - break; - } - } else { - /* - * Enter the current fullscreen mode. D3DApp may - * resort to another mode if this driver cannot do - * the currently selected mode. - */ - if (!D3DAppFullscreen(d3dapp->CurrMode)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - break; - } - } - break; - /* - * Lighting toggle - */ - case MENU_LIGHTING: - myglobs.RenderQuality ^= D3DRMLIGHT_ON; - SetRenderState(); - break; - /* - * Fill mode selection - */ - case MENU_POINT: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMFILL_MASK) | D3DRMFILL_POINTS; - SetRenderState(); - break; - case MENU_WIREFRAME: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMFILL_MASK) | D3DRMFILL_WIREFRAME; - SetRenderState(); - break; - case MENU_SOLID: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMFILL_MASK) | D3DRMFILL_SOLID; - SetRenderState(); - break; - /* - * Shade mode selection - */ - case MENU_FLAT: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMSHADE_MASK) | D3DRMSHADE_FLAT; - SetRenderState(); - break; - case MENU_GOURAUD: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMSHADE_MASK) | D3DRMSHADE_GOURAUD; - SetRenderState(); - break; - case MENU_PHONG: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMSHADE_MASK) | D3DRMSHADE_PHONG; - SetRenderState(); - break; - - case MENU_DITHERING: - myglobs.bDithering = !myglobs.bDithering; - SetRenderState(); - break; - case MENU_ANTIALIAS: - myglobs.bAntialiasing = !myglobs.bAntialiasing; - SetRenderState(); - break; - /* - * Texture filter selection - */ - case MENU_POINT_FILTER: - if (myglobs.TextureQuality == D3DRMTEXTURE_NEAREST) - break; - myglobs.TextureQuality = D3DRMTEXTURE_NEAREST; - SetRenderState(); - break; - case MENU_LINEAR_FILTER: - if (myglobs.TextureQuality == D3DRMTEXTURE_LINEAR) - break; - myglobs.TextureQuality = D3DRMTEXTURE_LINEAR; - SetRenderState(); - break; - case MENU_NEXT_MODE: - /* - * Enter the next usable fullscreen mode - */ - i = d3dapp->CurrMode; - do { - ++i; - if (i >= d3dapp->NumModes) - i = 0; - if (!d3dapp->Mode[i].bThisDriverCanDo) - continue; - else { - if (!D3DAppFullscreen(i)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - break; - } - } while(i != d3dapp->CurrMode); - break; - case MENU_PREVIOUS_MODE: - /* - * Enter the previous usable fullscreen mode - */ - i = d3dapp->CurrMode; - do { - --i; - if (i < 0) - i = d3dapp->NumModes - 1; - if (!d3dapp->Mode[i].bThisDriverCanDo) - continue; - else { - if (!D3DAppFullscreen(i)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - break; - } - } while(i != d3dapp->CurrMode); - break; - } - if ( LOWORD(wParam) >= MENU_FIRST_DRIVER - && LOWORD(wParam) < MENU_FIRST_DRIVER + D3DAPP_MAXD3DDRIVERS - && d3dapp->CurrDriver != LOWORD(wParam) - MENU_FIRST_DRIVER) { - /* - * Change the D3D driver - */ - if (!D3DAppChangeDriver(LOWORD(wParam) - MENU_FIRST_DRIVER, - NULL)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - } - if ( LOWORD(wParam) >= MENU_FIRST_MODE - && LOWORD(wParam) < MENU_FIRST_MODE+100) { - /* - * Switch to the selected fullscreen mode - */ - if (!D3DAppFullscreen(LOWORD(wParam) - MENU_FIRST_MODE)) { - ReportD3DAppError(); - CleanUpAndPostQuit(); - } - } - /* - * Whenever we receive a command in single step mode, draw a frame - */ - if (myglobs.bSingleStepMode) - myglobs.bDrawAFrame = TRUE; - return 0L; - } - return DefWindowProc(hWnd, message, wParam, lParam); -} - -/****************************************************************************/ -/* Additional Functions */ -/****************************************************************************/ -/* - * ReadMouse - * Returns the mouse status for interaction with sample code - */ -void -ReadMouse(int* b, int* x, int* y) -{ - *b = myglobs.mouse_buttons; - *x = myglobs.mouse_x; - *y = myglobs.mouse_y; -} - -/* - * SetRenderState - * Set the render quality, dither toggle and shade info if any of them has - * changed - */ -BOOL -SetRenderState(void) -{ - HRESULT rval; - /* - * Set the number of buffers so D3DRM can keep track of extents properly - */ - rval = myglobs.dev->SetBufferCount(d3dapp->bFullscreen && - d3dapp->bBackBufferInVideo ? 2 : 1); - if (rval != D3DRM_OK) { - Msg("Setting the buffer count failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - /* - * Set the render quality (light toggle, fill mode, shade mode) - */ - if (myglobs.dev->GetQuality() != myglobs.RenderQuality) { - rval = myglobs.dev->SetQuality(myglobs.RenderQuality); - if (rval != D3DRM_OK) { - Msg("Setting the render quality failed.\n%s", - D3DAppErrorToString(rval)); - return FALSE; - } - } - /* - * Set dithering toggle - */ - if (myglobs.dev->GetDither() != myglobs.bDithering) { - rval = myglobs.dev->SetDither(myglobs.bDithering); - if (rval != D3DRM_OK) { - Msg("Setting dither mode failed.\n%s", D3DAppErrorToString(rval)); - return FALSE; - } - } - /* - * Set the texture quality (point or linear filtering) - */ - if (myglobs.dev->GetTextureQuality() != myglobs.TextureQuality) { - rval = myglobs.dev->SetTextureQuality(myglobs.TextureQuality); - if (rval != D3DRM_OK) { - Msg("Setting texture quality failed.\n%s", - D3DAppErrorToString(rval)); - return FALSE; - } - } - /* - * Set shade info based on current bits per pixel - */ - switch (d3dapp->ThisMode.bpp) { - case 1: - if (FAILED(myglobs.dev->SetShades(4))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(4))) - goto shades_error; - break; - case 16: - if (FAILED(myglobs.dev->SetShades(32))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureColors(64))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(32))) - goto shades_error; - break; - case 24: - case 32: - if (FAILED(myglobs.dev->SetShades(256))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureColors(64))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(256))) - goto shades_error; - break; - } - return TRUE; -shades_error: - Msg("A failure occurred while setting color shade information.\n"); - return FALSE; -} - -/****************************************************************************/ -/* Initialization, error reporting and release functions. */ -/****************************************************************************/ -/* - * InitGlobals - * Called once at program initialization to initialize global variables. - */ -static void -InitGlobals(void) -{ - d3dapp = NULL; - memset(&myglobs, 0, sizeof(myglobs)); - myglobs.bShowFrameRate = TRUE; - myglobs.bShowInfo = TRUE; - myglobs.RenderQuality = D3DRMLIGHT_ON | D3DRMFILL_SOLID | - D3DRMSHADE_GOURAUD; - myglobs.TextureQuality = D3DRMTEXTURE_NEAREST; -} - -/* - * CleanUpAndPostQuit - * Release all D3D objects, post a quit message and set the bQuit flag - */ -void -CleanUpAndPostQuit(void) -{ - if (myglobs.bQuit) - return; - if (!D3DAppDestroy()) - ReportD3DAppError(); - RELEASE(myglobs.scene); - RELEASE(myglobs.camera); - RELEASE(lpD3DRM); - myglobs.bQuit = TRUE; - PostQuitMessage( 0 ); -} - -/* - * ReportD3DAppError - * Reports an error during a d3d app call. - */ -void -ReportD3DAppError(void) -{ - Msg("%s", D3DAppLastErrorString()); -} - -/* Msg - * Message output for error notification. - */ -void __cdecl -Msg( LPSTR fmt, ... ) -{ - char buff[256]; - - wvsprintf(buff, fmt, (char *)(&fmt+1)); - lstrcat(buff, "\r\n"); - AppPause(TRUE); - if (d3dapp && d3dapp->bFullscreen) - SetWindowPos(myglobs.hWndMain, HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE); - MessageBox( NULL, buff, "D3D Example Message", MB_OK ); - if (d3dapp && d3dapp->bFullscreen) - SetWindowPos(myglobs.hWndMain, HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE); - AppPause(FALSE); -} - -/* - * D3DRMErrorToString - * Allows the samples to return error strings. - */ -char* -D3DRMErrorToString(HRESULT error) -{ - return D3DAppErrorToString(error); -} diff --git a/sdk/samples/misc/rmfull.h b/sdk/samples/misc/rmfull.h deleted file mode 100644 index 737c2b4..0000000 --- a/sdk/samples/misc/rmfull.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmfull.h - * - */ -#ifndef __RMFULL_H__ -#define __RMFULL_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "d3dapp.h" /* prototypes for D3D helper functions */ -#include "rmdemo.h" /* prototypes for functions to commumicate - with each sample */ -#include "rmfullrc.h" /* defines constants used in rmfull.rc */ -#define START_WIN_SIZE 320 /* initial size of the window */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct tagrmfullglobals { - HWND hWndMain; /* application window handle */ - HINSTANCE hInstApp; /* application instance for dialog boxes */ - - LPDIRECT3DRMDEVICE dev; /* Direct3DRM device */ - LPDIRECT3DRMVIEWPORT view; /* Direct3DRM viewport through which we view - the scene */ - LPDIRECT3DRMFRAME scene; /* Master frame in which others are placed */ - LPDIRECT3DRMFRAME camera; /* Frame describing the users POV */ - - BOOL bSingleStepMode; /* render one frame at a time */ - BOOL bDrawAFrame; /* render on this pass of the main loop */ - BOOL bShowFrameRate; /* show the frame rate at the top */ - BOOL bShowInfo; /* show window information at the bottom */ - - BOOL bResized; /* the window has resized or some other drastic change, the - entire client area should be cleared */ - BOOL bQuit; /* program is about to terminate */ - - BOOL bNoTextures; /* this sample doesn't use any textures */ - BOOL bConstRenderQuality; /* this sample is not constructed with - MeshBuilders and so the RenderQuality - cannot be changed */ - D3DRMRENDERQUALITY RenderQuality; /* current shade mode, fill mode and - lighting state */ - D3DRMTEXTUREQUALITY TextureQuality; /* current texture interpolation */ - BOOL bDithering; /* is dithering on? */ - BOOL bAntialiasing; /* is antialiasing on? */ - - int mouse_buttons; /* mouse button state */ - int mouse_x; /* mouse cursor x position */ - int mouse_y; /* mouse cursor y position */ - - LPDIRECTDRAWSURFACE lpFrameRateBuffer; /* frame rate surface */ - LPDIRECTDRAWSURFACE lpInfoBuffer; /* window info surface */ -} rmfullglobals; - -void __cdecl Msg( LPSTR fmt, ... ); -/* - * STATS.CPP FUNCTION PROTOTYPES - */ -BOOL InitFontAndTextBuffers(void); -BOOL WriteInfoBuffer(void); -BOOL WriteFrameRateBuffer(float fps, long tps); -void ResetFrameRate(void); -BOOL CalculateFrameRate(); -BOOL DisplayFrameRate(int* count, LPD3DRECT lpExtents ); - -#ifdef __cplusplus -}; -#endif - -#endif // __RMFULL_H__ diff --git a/sdk/samples/misc/rmfull.rc b/sdk/samples/misc/rmfull.rc deleted file mode 100644 index 524c4f4..0000000 --- a/sdk/samples/misc/rmfull.rc +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmfull.rc - * - */ - -#include "rmfullrc.h" -#include "windows.h" - -AppIcon ICON DISCARDABLE "d3d.ico" - -AppMenu MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&About..\tF1", MENU_ABOUT - MENUITEM SEPARATOR - MENUITEM "&Single Step\tSpc", MENU_STEP - MENUITEM "&Go\tEnter", MENU_GO - MENUITEM "&Toggle Stats\tTab", MENU_STATS - MENUITEM SEPARATOR - MENUITEM SEPARATOR - MENUITEM "E&xit\tESC", MENU_EXIT - END - POPUP "&Render" - BEGIN - MENUITEM "&Flat\tF2", MENU_FLAT - MENUITEM "&Gouraud\tF3", MENU_GOURAUD - MENUITEM "P&hong\tF4", MENU_PHONG - MENUITEM SEPARATOR - MENUITEM "L&ighting\tF5", MENU_LIGHTING - MENUITEM SEPARATOR - MENUITEM "&Point\tCtrl+P", MENU_POINT - MENUITEM "&Wireframe\tCtrl+W", MENU_WIREFRAME - MENUITEM "&Solid\tCtrl+S", MENU_SOLID - MENUITEM SEPARATOR - MENUITEM "&Dithering\tCtrl+D", MENU_DITHERING - MENUITEM "&Anti-aliasing\tCtrl+A", MENU_ANTIALIAS - MENUITEM SEPARATOR - MENUITEM "P&oint Filtering\tCtrl+O", MENU_POINT_FILTER - MENUITEM "Bi-&Linear Filtering\tCtrl+L",MENU_LINEAR_FILTER - END - POPUP "&Modes" - BEGIN - MENUITEM "&Fullscreen\tAlt+Enter", MENU_FULLSCREEN - MENUITEM "&Previous Mode\tAlt+PgUp", MENU_PREVIOUS_MODE - MENUITEM "&Next Mode\tAlt+PgDown", MENU_NEXT_MODE - MENUITEM SEPARATOR - END -END - - -AppAccel ACCELERATORS DISCARDABLE -BEGIN - VK_F1, MENU_ABOUT, VIRTKEY, NOINVERT - VK_F2, MENU_FLAT, VIRTKEY, NOINVERT - VK_F3, MENU_GOURAUD, VIRTKEY, NOINVERT - VK_F4, MENU_PHONG, VIRTKEY, NOINVERT - VK_F5, MENU_LIGHTING, VIRTKEY, NOINVERT - "P", MENU_POINT, VIRTKEY, CONTROL, NOINVERT - "W", MENU_WIREFRAME, VIRTKEY, CONTROL, NOINVERT - "S", MENU_SOLID, VIRTKEY, CONTROL, NOINVERT - "D", MENU_DITHERING, VIRTKEY, CONTROL, NOINVERT - "A", MENU_ANTIALIAS, VIRTKEY, CONTROL, NOINVERT - "O", MENU_POINT_FILTER, VIRTKEY, CONTROL, NOINVERT - "L", MENU_LINEAR_FILTER, VIRTKEY, CONTROL, NOINVERT - VK_ESCAPE, MENU_EXIT, VIRTKEY, NOINVERT - VK_SPACE, MENU_STEP, VIRTKEY, NOINVERT - VK_RETURN, MENU_GO, VIRTKEY, NOINVERT - VK_RETURN, MENU_FULLSCREEN, VIRTKEY, ALT, NOINVERT - VK_TAB, MENU_STATS, VIRTKEY, NOINVERT - VK_NEXT, MENU_NEXT_MODE, VIRTKEY, ALT, NOINVERT - VK_PRIOR, MENU_PREVIOUS_MODE, VIRTKEY, ALT, NOINVERT -END - -AppAbout DIALOG DISCARDABLE 0, 0, 188, 96 -STYLE DS_MODALFRAME | WS_POPUP -BEGIN - DEFPUSHBUTTON "OK",IDOK,76,75,35,14 - CTEXT "Direct3DRM Example",IDC_STATIC,61,5,65,15 - CTEXT "Copyright (c)1995, 1996 Microsoft Corp.",IDC_STATIC,21,55, - 145,12 - ICON "AppIcon",IDC_STATIC,86,25,16,16 -END diff --git a/sdk/samples/misc/rmfullrc.h b/sdk/samples/misc/rmfullrc.h deleted file mode 100644 index 1a48ee1..0000000 --- a/sdk/samples/misc/rmfullrc.h +++ /dev/null @@ -1,31 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmfullrc.h - * - ***************************************************************************/ - -#define MENU_ABOUT 1 -#define MENU_EXIT 2 -#define MENU_FULLSCREEN 7 -#define MENU_NEXT_MODE 8 -#define MENU_PREVIOUS_MODE 9 -#define MENU_STATS 10 -#define MENU_FLAT 12 -#define MENU_GOURAUD 13 -#define MENU_PHONG 14 -#define MENU_POINT_FILTER 17 -#define MENU_LINEAR_FILTER 18 -#define MENU_POINT 20 -#define MENU_WIREFRAME 21 -#define MENU_SOLID 22 -#define MENU_DITHERING 24 -#define MENU_ANTIALIAS 26 -#define MENU_STEP 27 -#define MENU_GO 28 -#define MENU_LIGHTING 29 -#define MENU_FIRST_DRIVER 80 -#define MENU_FIRST_MODE 100 - -#define IDC_STATIC -1 diff --git a/sdk/samples/misc/rmmain.cpp b/sdk/samples/misc/rmmain.cpp deleted file mode 100644 index 8393741..0000000 --- a/sdk/samples/misc/rmmain.cpp +++ /dev/null @@ -1,999 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmmain.cpp - * - * Each of the Direct3D retained mode (D3DRM) samples must be linked with - * this file. It contains the code which allows them to run in the Windows - * environment. - * - * A window is created using the rmmain.res which allows the user to select - * the Direct3D driver to use and change the render options. - * - * Individual samples are executed through two functions, BuildScene and - * OverrideDefaults, as described in rmdemo.h. Samples can also read - * mouse input via ReadMouse. - */ - -#define INITGUID - -#include -#include -#include -#include -#include -#include -#include -#include "rmdemo.h" /* prototypes for functions to commumicate - with each sample */ -#include "rmmain.h" /* defines constants used in rmmain.rc */ -#include "rmerror.h" /* prototypes for error reporting: error.c */ - -#define MAX_DRIVERS 5 /* maximum D3D drivers we ever expect to find */ - -/* - * GLOBAL VARIABLES - */ -LPDIRECT3DRM lpD3DRM; /* Direct3DRM object */ -LPDIRECTDRAWCLIPPER lpDDClipper;/* DirectDrawClipper object */ - -struct _myglobs { - LPDIRECT3DRMDEVICE dev; /* Direct3DRM device */ - LPDIRECT3DRMVIEWPORT view; /* Direct3DRM viewport through which we view - the scene */ - LPDIRECT3DRMFRAME scene; /* Master frame in which others are placed */ - LPDIRECT3DRMFRAME camera; /* Frame describing the users POV */ - - GUID DriverGUID[MAX_DRIVERS]; /* GUIDs of the available D3D drivers */ - char DriverName[MAX_DRIVERS][50]; /* names of the available D3D drivers */ - int NumDrivers; /* number of available D3D drivers */ - int CurrDriver; /* number of D3D driver currently - being used */ - - D3DRMRENDERQUALITY RenderQuality; /* current shade mode, fill mode and - lighting state */ - D3DRMTEXTUREQUALITY TextureQuality; /* current texture interpolation */ - BOOL bDithering; /* is dithering on? */ - BOOL bAntialiasing; /* is antialiasing on? */ - - BOOL bQuit; /* program is about to terminate */ - BOOL bInitialized; /* all D3DRM objects have been initialized */ - BOOL bMinimized; /* window is minimized */ - BOOL bSingleStepMode; /* render one frame at a time */ - BOOL bDrawAFrame; /* render on this pass of the main loop */ - BOOL bNoTextures; /* this sample doesn't use any textures */ - BOOL bConstRenderQuality; /* this sample is not constructed with - MeshBuilders and so the RenderQuality - cannot be changed */ - - int BPP; /* bit depth of the current display mode */ - - int mouse_buttons; /* mouse button state */ - int mouse_x; /* mouse cursor x position */ - int mouse_y; /* mouse cursor y position */ -} myglobs; - -/* - * PROTOTYPES - */ -static HWND InitApp(HINSTANCE, int); -static void InitGlobals(void); -long FAR PASCAL WindowProc(HWND, UINT, WPARAM, LPARAM); -static BOOL CreateDevAndView(LPDIRECTDRAWCLIPPER lpDDClipper, int driver, int width, int height); -static BOOL RenderLoop(void); -static void CleanUpAndPostQuit(void); -static BOOL SetRenderState(void); -static BOOL EnumDevices(HWND win); -extern "C" void ReadMouse(int*, int*, int*); - -/****************************************************************************/ -/* WinMain */ -/****************************************************************************/ -/* - * Initializes the application then enters a message loop which renders the - * scene until a quit message is received. - */ -int PASCAL -WinMain (HINSTANCE this_inst, HINSTANCE prev_inst, LPSTR cmdline, int cmdshow) -{ - HWND hwnd; - MSG msg; - HACCEL accel; - int failcount = 0; /* number of times RenderLoop has failed */ - - prev_inst; - cmdline; - - /* - * Create the window and initialize all objects needed to begin rendering - */ - if (!(hwnd = InitApp(this_inst, cmdshow))) - return 1; - - accel = LoadAccelerators(this_inst, "AppAccel"); - - while (!myglobs.bQuit) { - /* - * Monitor the message queue until there are no pressing - * messages - */ - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - CleanUpAndPostQuit(); - break; - } - if (!TranslateAccelerator(msg.hwnd, accel, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - if (myglobs.bQuit) - break; - /* - * If the app is not minimized, not about to quit and D3DRM has - * been initialized, we can render - */ - if (!myglobs.bMinimized && !myglobs.bQuit && myglobs.bInitialized) { - /* - * If were are not in single step mode or if we are and the - * bDrawAFrame flag is set, render one frame - */ - if (!(myglobs.bSingleStepMode && !myglobs.bDrawAFrame)) { - /* - * Attempt to render a frame, if it fails, take a note. If - * rendering fails more than twice, abort execution. - */ - if (!RenderLoop()) - ++failcount; - if (failcount > 2) { - Msg("Rendering has failed too many times. Aborting execution.\n"); - CleanUpAndPostQuit(); - break; - } - } - /* - * Reset the bDrawAFrame flag if we are in single step mode - */ - if (myglobs.bSingleStepMode) - myglobs.bDrawAFrame = FALSE; - } else { - WaitMessage(); - } - } - DestroyWindow(hwnd); - return msg.wParam; -} - -/****************************************************************************/ -/* Initialization and object creation */ -/****************************************************************************/ -/* - * InitApp - * Creates window and initializes all objects neccessary to begin rendering - */ -static HWND -InitApp(HINSTANCE this_inst, int cmdshow) -{ - HWND win; - HDC hdc; - DWORD flags; - WNDCLASS wc; - Defaults defaults; - HRESULT rval; - RECT rc; - - /* - * set up and registers the window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof(DWORD); - wc.hInstance = this_inst; - wc.hIcon = LoadIcon(this_inst, "AppIcon"); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = "AppMenu"; - wc.lpszClassName = "D3DRM Example"; - if (!RegisterClass(&wc)) - return FALSE; - /* - * Initialize the global variables and allow the sample code to override - * some of these default settings. - */ - InitGlobals(); - defaults.bNoTextures = myglobs.bNoTextures; - defaults.bConstRenderQuality = myglobs.bConstRenderQuality; - defaults.bResizingDisabled = FALSE; - lstrcpy(defaults.Name, "D3DRM Example"); - OverrideDefaults(&defaults); - myglobs.bNoTextures = defaults.bNoTextures; - myglobs.bConstRenderQuality = defaults.bConstRenderQuality; - /* - * Create the window - */ - if (defaults.bResizingDisabled) - flags = WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | - WS_MINIMIZEBOX | WS_MAXIMIZEBOX; - else - flags = WS_OVERLAPPEDWINDOW; - win = - CreateWindow - ( "D3DRM Example", /* class */ - defaults.Name, /* caption */ - flags, /* style */ - CW_USEDEFAULT, /* init. x pos */ - CW_USEDEFAULT, /* init. y pos */ - 300, /* init. x size */ - 300, /* init. y size */ - NULL, /* parent window */ - NULL, /* menu handle */ - this_inst, /* program handle */ - NULL /* create parms */ - ); - if (!win) - return FALSE; - /* - * Record the current display BPP - */ - hdc = GetDC(win); - myglobs.BPP = GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(win, hdc); - /* - * Enumerate the D3D drivers and select one - */ - if (!EnumDevices(win)) - return FALSE; - /* - * Create the D3DRM object and the D3DRM window object - */ - rval = Direct3DRMCreate(&lpD3DRM); - if (rval != D3DRM_OK) { - Msg("Failed to create Direct3DRM.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Create the master scene frame and camera frame - */ - rval = lpD3DRM->CreateFrame(NULL, &myglobs.scene); - if (rval != D3DRM_OK) { - Msg("Failed to create the master scene frame.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - rval = lpD3DRM->CreateFrame(myglobs.scene, &myglobs.camera); - if (rval != D3DRM_OK) { - Msg("Failed to create the camera's frame.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - rval = myglobs.camera->SetPosition(myglobs.scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - if (rval != D3DRM_OK) { - Msg("Failed to position the camera in the frame.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Create a clipper and associate the window with it - */ - rval = DirectDrawCreateClipper(0, &lpDDClipper, NULL); - if (rval != DD_OK) { - Msg("Failed to create DirectDrawClipper"); - return FALSE; - } - rval = lpDDClipper->SetHWnd(0, win); - if (rval != DD_OK) { - Msg("Failed to set hwnd on the clipper"); - return FALSE; - } - /* - * Created the D3DRM device with the selected D3D driver - */ - GetClientRect(win, &rc); - if (!CreateDevAndView(lpDDClipper, myglobs.CurrDriver, rc.right, rc.bottom)) { - return FALSE; - } - /* - * Create the scene to be rendered by calling this sample's BuildScene - */ - if (!BuildScene(myglobs.dev, myglobs.view, myglobs.scene, myglobs.camera)) - return FALSE; - /* - * Now we are ready to render - */ - myglobs.bInitialized = TRUE; - /* - * Display the window - */ - ShowWindow(win, cmdshow); - UpdateWindow(win); - - return win; -} - -/* - * CreateDevAndView - * Create the D3DRM device and viewport with the given D3D driver and of the - * specified size. - */ -static BOOL -CreateDevAndView(LPDIRECTDRAWCLIPPER lpDDClipper, int driver, int width, int height) -{ - HRESULT rval; - - if (!width || !height) { - Msg("Cannot create a D3DRM device with invalid window dimensions."); - return FALSE; - } - /* - * Create the D3DRM device from this window and using the specified D3D - * driver. - */ - rval = lpD3DRM->CreateDeviceFromClipper(lpDDClipper, &myglobs.DriverGUID[driver], - width, height, &myglobs.dev); - if (rval != D3DRM_OK) { - Msg("Failed to create the D3DRM device from the clipper.\n%s", - D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Create the D3DRM viewport using the camera frame. Set the background - * depth to a large number. The width and height may be slightly - * adjusted, so get them from the device to be sure. - */ - width = myglobs.dev->GetWidth(); - height = myglobs.dev->GetHeight(); - rval = lpD3DRM->CreateViewport(myglobs.dev, myglobs.camera, 0, 0, width, - height, &myglobs.view); - if (rval != D3DRM_OK) { - Msg("Failed to create the D3DRM viewport.\n%s", - D3DRMErrorToString(rval)); - RELEASE(myglobs.dev); - return FALSE; - } - rval = myglobs.view->SetBack(D3DVAL(5000.0)); - if (rval != D3DRM_OK) { - Msg("Failed to set the background depth of the D3DRM viewport.\n%s", - D3DRMErrorToString(rval)); - RELEASE(myglobs.dev); - RELEASE(myglobs.view); - return FALSE; - } - /* - * Set the render quality, fill mode, lighting state and color shade info - */ - if (!SetRenderState()) - return FALSE; - return TRUE; -} - -/****************************************************************************/ -/* D3D Device Enumeration */ -/****************************************************************************/ -/* - * BPPToDDBD - * Converts bits per pixel to a DirectDraw bit depth flag - */ -static DWORD -BPPToDDBD(int bpp) -{ - switch(bpp) { - case 1: - return DDBD_1; - case 2: - return DDBD_2; - case 4: - return DDBD_4; - case 8: - return DDBD_8; - case 16: - return DDBD_16; - case 24: - return DDBD_24; - case 32: - return DDBD_32; - default: - return 0; - } -} - -/* - * enumDeviceFunc - * Callback function which records each usable D3D driver's name and GUID - * Chooses a driver to begin with and sets *lpContext to this starting driver - */ -static HRESULT -WINAPI enumDeviceFunc(LPGUID lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, - LPD3DDEVICEDESC lpHWDesc, LPD3DDEVICEDESC lpHELDesc, LPVOID lpContext) -{ - static BOOL hardware = FALSE; /* current start driver is hardware */ - static BOOL mono = FALSE; /* current start driver is mono light */ - LPD3DDEVICEDESC lpDesc; - int *lpStartDriver = (int *)lpContext; - /* - * Decide which device description we should consult - */ - lpDesc = lpHWDesc->dcmColorModel ? lpHWDesc : lpHELDesc; - /* - * If this driver cannot render in the current display bit depth skip - * it and continue with the enumeration. - */ - if (!(lpDesc->dwDeviceRenderBitDepth & BPPToDDBD(myglobs.BPP))) - return D3DENUMRET_OK; - /* - * Record this driver's info - */ - memcpy(&myglobs.DriverGUID[myglobs.NumDrivers], lpGuid, sizeof(GUID)); - lstrcpy(&myglobs.DriverName[myglobs.NumDrivers][0], lpDeviceName); - /* - * Choose hardware over software, RGB lights over mono lights - */ - if (*lpStartDriver == -1) { - /* - * this is the first valid driver - */ - *lpStartDriver = myglobs.NumDrivers; - hardware = lpDesc == lpHWDesc ? TRUE : FALSE; - mono = lpDesc->dcmColorModel & D3DCOLOR_MONO ? TRUE : FALSE; - } else if (lpDesc == lpHWDesc && !hardware) { - /* - * this driver is hardware and start driver is not - */ - *lpStartDriver = myglobs.NumDrivers; - hardware = lpDesc == lpHWDesc ? TRUE : FALSE; - mono = lpDesc->dcmColorModel & D3DCOLOR_MONO ? TRUE : FALSE; - } else if ((lpDesc == lpHWDesc && hardware ) || (lpDesc == lpHELDesc - && !hardware)) { - if (lpDesc->dcmColorModel == D3DCOLOR_MONO && !mono) { - /* - * this driver and start driver are the same type and this - * driver is mono while start driver is not - */ - *lpStartDriver = myglobs.NumDrivers; - hardware = lpDesc == lpHWDesc ? TRUE : FALSE; - mono = lpDesc->dcmColorModel & D3DCOLOR_MONO ? TRUE : FALSE; - } - } - myglobs.NumDrivers++; - if (myglobs.NumDrivers == MAX_DRIVERS) - return (D3DENUMRET_CANCEL); - return (D3DENUMRET_OK); -} - -/* - * EnumDevices - * Enumerate the available D3D drivers, add them to the file menu, and choose - * one to use. - */ -static BOOL -EnumDevices(HWND win) -{ - LPDIRECTDRAW lpDD; - LPDIRECT3D lpD3D; - HRESULT rval; - HMENU hmenu; - int i; - - /* - * Create a DirectDraw object and query for the Direct3D interface to use - * to enumerate the drivers. - */ - rval = DirectDrawCreate(NULL, &lpDD, NULL); - if (rval != DD_OK) { - Msg("Creation of DirectDraw HEL failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - rval = lpDD->QueryInterface(IID_IDirect3D, (void**) &lpD3D); - if (rval != DD_OK) { - Msg("Creation of Direct3D interface failed.\n%s", D3DRMErrorToString(rval)); - lpDD->Release(); - return FALSE; - } - /* - * Enumerate the drivers, setting CurrDriver to -1 to initialize the - * driver selection code in enumDeviceFunc - */ - myglobs.CurrDriver = -1; - rval = lpD3D->EnumDevices(enumDeviceFunc, &myglobs.CurrDriver); - if (rval != DD_OK) { - Msg("Enumeration of drivers failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Make sure we found at least one valid driver - */ - if (myglobs.NumDrivers == 0) { - Msg("Could not find a D3D driver which is compatible with this display depth"); - return FALSE; - } - lpD3D->Release(); - lpDD->Release(); - /* - * Add the driver names to the File menu - */ - hmenu = GetSubMenu(GetMenu(win), 0); - for (i = 0; i < myglobs.NumDrivers; i++) { - InsertMenu(hmenu, 5 + i, MF_BYPOSITION | MF_STRING, MENU_FIRST_DRIVER + i, - myglobs.DriverName[i]); - } - return TRUE; -} - -/****************************************************************************/ -/* Render Loop */ -/****************************************************************************/ -/* - * Clear the viewport, render the next frame and update the window - */ -static BOOL -RenderLoop() -{ - HRESULT rval; - /* - * Tick the scene - */ - rval = myglobs.scene->Move(D3DVAL(1.0)); - if (rval != D3DRM_OK) { - Msg("Moving scene failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Clear the viewport - */ - rval = myglobs.view->Clear(); - if (rval != D3DRM_OK) { - Msg("Clearing viewport failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Render the scene to the viewport - */ - rval = myglobs.view->Render(myglobs.scene); - if (rval != D3DRM_OK) { - Msg("Rendering scene failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - /* - * Update the window - */ - rval = myglobs.dev->Update(); - if (rval != D3DRM_OK) { - Msg("Updating device failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - return TRUE; -} - - -/****************************************************************************/ -/* Windows Message Handlers */ -/****************************************************************************/ -/* - * AppAbout - * About box message handler - */ -BOOL -FAR PASCAL AppAbout(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lParam) -{ - switch (msg) - { - case WM_COMMAND: - if (LOWORD(wparam) == IDOK) - EndDialog(hwnd, TRUE); - break; - - case WM_INITDIALOG: - return TRUE; - } - return FALSE; -} - -/* - * WindowProc - * Main window message handler - */ -LONG FAR PASCAL WindowProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - int i; - HRESULT rval; - RECT rc; - - switch (msg) { - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MOUSEMOVE: - /* - * Record the mouse state for ReadMouse - */ - myglobs.mouse_buttons = wparam; - myglobs.mouse_x = LOWORD(lparam); - myglobs.mouse_y = HIWORD(lparam); - break; - case WM_INITMENUPOPUP: - /* - * Check and enable the appropriate menu items - */ - CheckMenuItem((HMENU)wparam, MENU_STEP,(myglobs.bSingleStepMode) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wparam, MENU_GO,(myglobs.bSingleStepMode) ? MF_ENABLED : MF_GRAYED); - if (!myglobs.bConstRenderQuality) { - CheckMenuItem((HMENU)wparam, MENU_LIGHTING, (myglobs.RenderQuality & D3DRMLIGHT_MASK) == D3DRMLIGHT_ON ? MF_CHECKED : MF_GRAYED); - CheckMenuItem((HMENU)wparam, MENU_FLAT, (myglobs.RenderQuality & D3DRMSHADE_MASK) == D3DRMSHADE_FLAT ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wparam, MENU_GOURAUD, (myglobs.RenderQuality & D3DRMSHADE_MASK) == D3DRMSHADE_GOURAUD ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wparam, MENU_PHONG, (myglobs.RenderQuality & D3DRMSHADE_MASK) == D3DRMSHADE_PHONG ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wparam, MENU_PHONG, MF_GRAYED); - CheckMenuItem((HMENU)wparam, MENU_POINT, (myglobs.RenderQuality & D3DRMFILL_MASK) == D3DRMFILL_POINTS ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wparam, MENU_WIREFRAME, (myglobs.RenderQuality & D3DRMFILL_MASK) == D3DRMFILL_WIREFRAME ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wparam, MENU_SOLID, (myglobs.RenderQuality & D3DRMFILL_MASK) == D3DRMFILL_SOLID ? MF_CHECKED : MF_UNCHECKED); - } else { - EnableMenuItem((HMENU)wparam, MENU_LIGHTING, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_FLAT, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_GOURAUD, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_PHONG, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_POINT, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_WIREFRAME, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_SOLID, MF_GRAYED); - } - if (!myglobs.bNoTextures) { - CheckMenuItem((HMENU)wparam, MENU_POINT_FILTER, (myglobs.TextureQuality == D3DRMTEXTURE_NEAREST) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wparam, MENU_LINEAR_FILTER, (myglobs.TextureQuality == D3DRMTEXTURE_LINEAR) ? MF_CHECKED : MF_UNCHECKED); - } else { - EnableMenuItem((HMENU)wparam, MENU_POINT_FILTER, MF_GRAYED); - EnableMenuItem((HMENU)wparam, MENU_LINEAR_FILTER, MF_GRAYED); - } - CheckMenuItem((HMENU)wparam, MENU_DITHERING, (myglobs.bDithering) ? MF_CHECKED : MF_UNCHECKED); - CheckMenuItem((HMENU)wparam, MENU_ANTIALIAS, (myglobs.bAntialiasing) ? MF_CHECKED : MF_UNCHECKED); - EnableMenuItem((HMENU)wparam, MENU_ANTIALIAS, MF_GRAYED); - for (i = 0; i < myglobs.NumDrivers; i++) { - CheckMenuItem((HMENU)wparam, MENU_FIRST_DRIVER + i, - (i == myglobs.CurrDriver) ? MF_CHECKED : MF_UNCHECKED); - } - break; - case WM_COMMAND: - switch(LOWORD(wparam)) { - case MENU_ABOUT: - DialogBox((HINSTANCE)GetWindowLong(win, GWL_HINSTANCE), - "AppAbout", win, (DLGPROC)AppAbout); - break; - case MENU_EXIT: - CleanUpAndPostQuit(); - break; - case MENU_STEP: - /* - * Begin single step more or draw a frame if in single - * step mode - */ - if (!myglobs.bSingleStepMode) { - myglobs.bSingleStepMode = TRUE; - myglobs.bDrawAFrame = TRUE; - } else if (!myglobs.bDrawAFrame) { - myglobs.bDrawAFrame = TRUE; - } - break; - case MENU_GO: - /* - * Exit single step mode - */ - myglobs.bSingleStepMode = FALSE; - break; - /* - * Lighting toggle - */ - case MENU_LIGHTING: - myglobs.RenderQuality ^= D3DRMLIGHT_ON; - SetRenderState(); - break; - /* - * Fill mode selection - */ - case MENU_POINT: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMFILL_MASK) | D3DRMFILL_POINTS; - SetRenderState(); - break; - case MENU_WIREFRAME: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMFILL_MASK) | D3DRMFILL_WIREFRAME; - SetRenderState(); - break; - case MENU_SOLID: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMFILL_MASK) | D3DRMFILL_SOLID; - SetRenderState(); - break; - /* - * Shade mode selection - */ - case MENU_FLAT: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMSHADE_MASK) | D3DRMSHADE_FLAT; - SetRenderState(); - break; - case MENU_GOURAUD: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMSHADE_MASK) | D3DRMSHADE_GOURAUD; - SetRenderState(); - break; - case MENU_PHONG: - myglobs.RenderQuality = (myglobs.RenderQuality & ~D3DRMSHADE_MASK) | D3DRMSHADE_PHONG; - SetRenderState(); - break; - - case MENU_DITHERING: - myglobs.bDithering = !myglobs.bDithering; - SetRenderState(); - break; - case MENU_ANTIALIAS: - myglobs.bAntialiasing = !myglobs.bAntialiasing; - break; - /* - * Texture filter selection - */ - case MENU_POINT_FILTER: - if (myglobs.TextureQuality == D3DRMTEXTURE_NEAREST) - break; - myglobs.TextureQuality = D3DRMTEXTURE_NEAREST; - SetRenderState(); - break; - case MENU_LINEAR_FILTER: - if (myglobs.TextureQuality == D3DRMTEXTURE_LINEAR) - break; - myglobs.TextureQuality = D3DRMTEXTURE_LINEAR; - SetRenderState(); - break; - } - /* - * Changing the D3D Driver - */ - if (LOWORD(wparam) >= MENU_FIRST_DRIVER && - LOWORD(wparam) < MENU_FIRST_DRIVER + MAX_DRIVERS && - myglobs.CurrDriver != LOWORD(wparam) - MENU_FIRST_DRIVER){ - /* - * Release the current viewport and device and create - * the new one - */ - RELEASE(myglobs.view); - RELEASE(myglobs.dev); - myglobs.CurrDriver = LOWORD(wparam)-MENU_FIRST_DRIVER; - GetClientRect(win, &rc); - if (!CreateDevAndView(lpDDClipper, myglobs.CurrDriver, - rc.right, rc.bottom)) { - CleanUpAndPostQuit(); - } - } - /* - * Draw a frame in single step mode after ever command - */ - myglobs.bDrawAFrame = TRUE; - break; - case WM_DESTROY: - CleanUpAndPostQuit(); - break; - case WM_SIZE: - /* - * Handle resizing of the window - */ - { - int width = LOWORD(lparam); - int height = HIWORD(lparam); - if (width && height) { - int view_width = myglobs.view->GetWidth(); - int view_height = myglobs.view->GetHeight(); - int dev_width = myglobs.dev->GetWidth(); - int dev_height = myglobs.dev->GetHeight(); - /* - * If the window hasn't changed size and we aren't returning from - * a minimize, there is nothing to do - */ - if (view_width == width && view_height == height && - !myglobs.bMinimized) - break; - if (width <= dev_width && height <= dev_height) { - /* - * If the window has shrunk, we can use the same device with a - * new viewport - */ - RELEASE(myglobs.view); - rval = lpD3DRM->CreateViewport(myglobs.dev, myglobs.camera, - 0, 0, width, height, - &myglobs.view); - if (rval != D3DRM_OK) { - Msg("Failed to resize the viewport.\n%s", - D3DRMErrorToString(rval)); - CleanUpAndPostQuit(); - break; - } - rval = myglobs.view->SetBack(D3DVAL(5000.0)); - if (rval != D3DRM_OK) { - Msg("Failed to set background depth after viewport resize.\n%s", - D3DRMErrorToString(rval)); - CleanUpAndPostQuit(); - break; - } - } else { - /* - * If the window got larger than the current device, create a - * new device. - */ - RELEASE(myglobs.view); - RELEASE(myglobs.dev); - if (!CreateDevAndView(lpDDClipper, myglobs.CurrDriver, width, - height)) { - CleanUpAndPostQuit(); - break; - } - } - /* - * We must not longer be minimized - */ - myglobs.bMinimized = FALSE; - } else { - /* - * This is a minimize message - */ - myglobs.bMinimized = TRUE; - } - } - break; - case WM_ACTIVATE: - { - /* - * Create a Windows specific D3DRM window device to handle this - * message - */ - LPDIRECT3DRMWINDEVICE windev; - if (!myglobs.dev) - break; - if (SUCCEEDED(myglobs.dev->QueryInterface(IID_IDirect3DRMWinDevice, - (void **) &windev))) { - if (FAILED(windev->HandleActivate(wparam))) - Msg("Failed to handle WM_ACTIVATE.\n"); - windev->Release(); - } else { - Msg("Failed to create Windows device to handle WM_ACTIVATE.\n"); - } - } - break; - case WM_PAINT: - if (!myglobs.bInitialized || !myglobs.dev) - return DefWindowProc(win, msg, wparam, lparam); - /* - * Create a Windows specific D3DRM window device to handle this - * message - */ - RECT r; - PAINTSTRUCT ps; - LPDIRECT3DRMWINDEVICE windev; - - if (GetUpdateRect(win, &r, FALSE)) { - BeginPaint(win, &ps); - if (SUCCEEDED(myglobs.dev->QueryInterface(IID_IDirect3DRMWinDevice, - (void **) &windev))) { - if (FAILED(windev->HandlePaint(ps.hdc))) - Msg("Failed to handle WM_PAINT.\n"); - windev->Release(); - } else { - Msg("Failed to create Windows device to handle WM_PAINT.\n"); - } - EndPaint(win, &ps); - } - break; - default: - return DefWindowProc(win, msg, wparam, lparam); - } - return 0L; -} - -/* - * SetRenderState - * Set the render quality, dither toggle and shade info if any of them has - * changed - */ -BOOL -SetRenderState(void) -{ - HRESULT rval; - /* - * Set the render quality (light toggle, fill mode, shade mode) - */ - if (myglobs.dev->GetQuality() != myglobs.RenderQuality) { - rval = myglobs.dev->SetQuality(myglobs.RenderQuality); - if (rval != D3DRM_OK) { - Msg("Setting the render quality failed.\n%s", - D3DRMErrorToString(rval)); - return FALSE; - } - } - /* - * Set dithering toggle - */ - if (myglobs.dev->GetDither() != myglobs.bDithering) { - rval = myglobs.dev->SetDither(myglobs.bDithering); - if (rval != D3DRM_OK) { - Msg("Setting dither mode failed.\n%s", D3DRMErrorToString(rval)); - return FALSE; - } - } - /* - * Set the texture quality (point or linear filtering) - */ - if (myglobs.dev->GetTextureQuality() != myglobs.TextureQuality) { - rval = myglobs.dev->SetTextureQuality(myglobs.TextureQuality); - if (rval != D3DRM_OK) { - Msg("Setting texture quality failed.\n%s", - D3DRMErrorToString(rval)); - return FALSE; - } - } - /* - * Set shade info based on current bits per pixel - */ - switch (myglobs.BPP) { - case 1: - if (FAILED(myglobs.dev->SetShades(4))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(4))) - goto shades_error; - break; - case 16: - if (FAILED(myglobs.dev->SetShades(32))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureColors(64))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(32))) - goto shades_error; - break; - case 24: - case 32: - if (FAILED(myglobs.dev->SetShades(256))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureColors(64))) - goto shades_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(256))) - goto shades_error; - break; - } - return TRUE; -shades_error: - Msg("A failure occurred while setting color shade information.\n"); - return FALSE; -} - -/****************************************************************************/ -/* Additional Functions */ -/****************************************************************************/ -/* - * ReadMouse - * Returns the mouse status for interaction with sample code - */ -void -ReadMouse(int* b, int* x, int* y) -{ - *b = myglobs.mouse_buttons; - *x = myglobs.mouse_x; - *y = myglobs.mouse_y; -} - -/* - * InitGlobals - * Initialize the global variables - */ -void -InitGlobals(void) -{ - lpD3DRM = NULL; - memset(&myglobs, 0, sizeof(myglobs)); - myglobs.RenderQuality = D3DRMLIGHT_ON | D3DRMFILL_SOLID | - D3DRMSHADE_GOURAUD; - myglobs.TextureQuality = D3DRMTEXTURE_NEAREST; -} - -/* - * CleanUpAndPostQuit - * Release all D3DRM objects, post a quit message and set the bQuit flag - */ -void -CleanUpAndPostQuit(void) -{ - myglobs.bInitialized = FALSE; - RELEASE(myglobs.scene); - RELEASE(myglobs.camera); - RELEASE(myglobs.view); - RELEASE(myglobs.dev); - RELEASE(lpD3DRM); - RELEASE(lpDDClipper); - myglobs.bQuit = TRUE; -} diff --git a/sdk/samples/misc/rmmain.h b/sdk/samples/misc/rmmain.h deleted file mode 100644 index 9d90999..0000000 --- a/sdk/samples/misc/rmmain.h +++ /dev/null @@ -1,26 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: resource.h - * - ***************************************************************************/ - -#define MENU_ABOUT 1 -#define MENU_EXIT 2 -#define MENU_STEP 27 -#define MENU_GO 28 -#define MENU_FLAT 12 -#define MENU_GOURAUD 13 -#define MENU_PHONG 14 -#define MENU_POINT_FILTER 17 -#define MENU_LINEAR_FILTER 18 -#define MENU_POINT 20 -#define MENU_WIREFRAME 21 -#define MENU_SOLID 22 -#define MENU_DITHERING 24 -#define MENU_ANTIALIAS 26 -#define MENU_LIGHTING 29 -#define MENU_FIRST_DRIVER 80 - -#define IDC_STATIC -1 diff --git a/sdk/samples/misc/rmmain.rc b/sdk/samples/misc/rmmain.rc deleted file mode 100644 index fafa1be..0000000 --- a/sdk/samples/misc/rmmain.rc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmmain.rc - * - */ - -#include "rmmain.h" -#include "windows.h" - -AppIcon ICON DISCARDABLE "d3d.ico" - -AppMenu MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&About..\tF1", MENU_ABOUT - MENUITEM SEPARATOR - MENUITEM "&Single Step\tSpc", MENU_STEP - MENUITEM "&Go\tEnter", MENU_GO - MENUITEM SEPARATOR - MENUITEM SEPARATOR - MENUITEM "E&xit\tESC", MENU_EXIT - END - POPUP "&Render" - BEGIN - MENUITEM "&Flat\tF2", MENU_FLAT - MENUITEM "&Gouraud\tF3", MENU_GOURAUD - MENUITEM "P&hong\tF4", MENU_PHONG - MENUITEM SEPARATOR - MENUITEM "L&ighting\tF5", MENU_LIGHTING - MENUITEM SEPARATOR - MENUITEM "&Point\tCtrl+P", MENU_POINT - MENUITEM "&Wireframe\tCtrl+W", MENU_WIREFRAME - MENUITEM "&Solid\tCtrl+S", MENU_SOLID - MENUITEM SEPARATOR - MENUITEM "&Dithering\tCtrl+D", MENU_DITHERING - MENUITEM "&Anti-aliasing\tCtrl+A", MENU_ANTIALIAS - MENUITEM SEPARATOR - MENUITEM "P&oint Filtering\tCtrl+O", MENU_POINT_FILTER - MENUITEM "Bi-&Linear Filtering\tCtrl+L",MENU_LINEAR_FILTER - END -END - - -AppAccel ACCELERATORS DISCARDABLE -BEGIN - VK_F1, MENU_ABOUT, VIRTKEY, NOINVERT - VK_F2, MENU_FLAT, VIRTKEY, NOINVERT - VK_F3, MENU_GOURAUD, VIRTKEY, NOINVERT - VK_F4, MENU_PHONG, VIRTKEY, NOINVERT - VK_F5, MENU_LIGHTING, VIRTKEY, NOINVERT - "P", MENU_POINT, VIRTKEY, CONTROL, NOINVERT - "W", MENU_WIREFRAME, VIRTKEY, CONTROL, NOINVERT - "S", MENU_SOLID, VIRTKEY, CONTROL, NOINVERT - "D", MENU_DITHERING, VIRTKEY, CONTROL, NOINVERT - "A", MENU_ANTIALIAS, VIRTKEY, CONTROL, NOINVERT - "O", MENU_POINT_FILTER, VIRTKEY, CONTROL, NOINVERT - "L", MENU_LINEAR_FILTER, VIRTKEY, CONTROL, NOINVERT - VK_ESCAPE, MENU_EXIT, VIRTKEY, NOINVERT - VK_SPACE, MENU_STEP, VIRTKEY, NOINVERT - VK_RETURN, MENU_GO, VIRTKEY, NOINVERT -END - -APPABOUT DIALOG DISCARDABLE 0, 0, 188, 96 -STYLE DS_MODALFRAME | WS_POPUP -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,76,75,35,14 - CTEXT "Direct3D RM Example",IDC_STATIC,61,5,65,15 - CTEXT "Copyright (c) 1995, 1996 Microsoft Corp.",IDC_STATIC,21,55, - 145,12 - ICON "AppIcon",IDC_STATIC,86,25,18,20 -END diff --git a/sdk/samples/misc/rmstats.cpp b/sdk/samples/misc/rmstats.cpp deleted file mode 100644 index a5be07a..0000000 --- a/sdk/samples/misc/rmstats.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rmstats.cpp - * - ***************************************************************************/ -#include "rmfull.h" - -/* - * GLOBAL VARIABLES - */ -extern D3DAppInfo* d3dapp; /* Pointer to read only collection of DD and D3D - objects maintained by D3DApp */ -extern rmfullglobals myglobs; /* collection of global variables */ - -static struct { - HFONT hFont; - SIZE szFrameRate; - SIZE szInfo; -} statglobs; - - /************************************************************************ - Frame rate and info text - ************************************************************************/ - -BOOL -WriteFrameRateBuffer(float fps, long tps) -{ - HRESULT LastError; - HDC hdc; - RECT rc; - char buf1[30], buf2[30], buf[60]; - int len; - - if (!myglobs.lpFrameRateBuffer) - return TRUE; - if (fps > 0.0f) - wsprintf(buf1, "%d.%02d fps ", - (int)( fps * 100 ) / 100, - (int)( fps * 100 ) % 100); - else - buf1[0] = 0; - if (tps > 0) - wsprintf(buf2, "%ld tps ", tps); - else - buf2[0] = 0; - len = wsprintf(buf, "%s%s", buf1, buf2); - if (!myglobs.lpFrameRateBuffer) - return FALSE; - LastError = myglobs.lpFrameRateBuffer->GetDC(&hdc); - if (LastError != DD_OK) { - /* - * This is not vital, don't report an error. - */ - return TRUE; - } - SelectObject(hdc, statglobs.hFont); - SetTextColor(hdc, RGB(255,255,0)); - SetBkColor(hdc, RGB(0,0,0)); - SetBkMode(hdc, OPAQUE); - GetTextExtentPoint32(hdc, buf, len, &statglobs.szFrameRate); - SetRect(&rc, 0, 0, statglobs.szFrameRate.cx, statglobs.szFrameRate.cy); - ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, buf, len, NULL); - myglobs.lpFrameRateBuffer->ReleaseDC(hdc); - return TRUE; -} - -BOOL -WriteInfoBuffer(void) -{ - HRESULT LastError; - HDC hdc; - RECT rc; - char buf[40]; - int len; - - if (!myglobs.lpInfoBuffer) - return TRUE; - if (d3dapp->bFullscreen) - len = wsprintf(buf, "%dx%dx%d (%s)", d3dapp->ThisMode.w, d3dapp->ThisMode.h, d3dapp->ThisMode.bpp, - (d3dapp->ThisDriver.Desc.dcmColorModel == D3DCOLOR_MONO) ? "MONO" : "RGB"); - else - len = wsprintf(buf, "%dx%d (%s)", d3dapp->szClient.cx, d3dapp->szClient.cy, - (d3dapp->ThisDriver.Desc.dcmColorModel == D3DCOLOR_MONO) ? "MONO" : "RGB"); - if (!myglobs.lpInfoBuffer) - return FALSE; - LastError = myglobs.lpInfoBuffer->GetDC(&hdc); - if (LastError != DD_OK) { - /* - * This is not vital, don't report an error. - */ - return TRUE; - } - - SelectObject(hdc, statglobs.hFont); - SetTextColor(hdc, RGB(255,255,0)); - SetBkColor(hdc, RGB(0,0,0)); - SetBkMode(hdc, OPAQUE); - GetTextExtentPoint32(hdc, buf, len, &statglobs.szInfo); - SetRect(&rc, 0, 0, statglobs.szInfo.cx, statglobs.szInfo.cy); - ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, buf, len, NULL); - myglobs.lpInfoBuffer->ReleaseDC(hdc); - return TRUE; -} - - -BOOL -InitFontAndTextBuffers(void) -{ - DDCOLORKEY ddck; - DDSURFACEDESC ddsd; - HDC hdc; - HRESULT ddrval; - char dummyinfo[] = "000x000x00 (MONO) 0000"; - char dummyfps[] = "000.00 fps 00000000.00 tps 0000.00 mppps"; - - /* - * Create the font. - */ - RELEASE(myglobs.lpInfoBuffer); - RELEASE(myglobs.lpFrameRateBuffer); - if (statglobs.hFont != NULL) { - DeleteObject(statglobs.hFont); - } - statglobs.hFont = CreateFont( - d3dapp->szClient.cx <= 600 ? 12 : 24, - 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, - ANSI_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - VARIABLE_PITCH, - "Arial" ); - - hdc = GetDC(NULL); - SelectObject(hdc, statglobs.hFont); - GetTextExtentPoint(hdc, dummyfps, strlen(dummyfps), &statglobs.szFrameRate); - GetTextExtentPoint(hdc, dummyinfo, strlen(dummyinfo), &statglobs.szInfo); - ReleaseDC(NULL, hdc); - - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwHeight = statglobs.szFrameRate.cy; - ddsd.dwWidth = statglobs.szFrameRate.cx; - ddrval = D3DAppCreateSurface(&ddsd, &myglobs.lpFrameRateBuffer); - if (ddrval != DD_OK) { - Msg("Could not create frame rate buffer.\n%s", D3DAppErrorToString(ddrval)); - goto exit_with_error; - } - memset(&ddck, 0, sizeof(ddck)); - myglobs.lpFrameRateBuffer->SetColorKey(DDCKEY_SRCBLT, &ddck); - if (!WriteFrameRateBuffer(0.0f, 0)) { - goto exit_with_error; - } - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwHeight = statglobs.szInfo.cy; - ddsd.dwWidth = statglobs.szInfo.cx; - ddrval = D3DAppCreateSurface(&ddsd, &myglobs.lpInfoBuffer); - if (ddrval != DD_OK) { - Msg("Could not create info buffer.\n%s", D3DAppErrorToString(ddrval)); - goto exit_with_error; - } - memset(&ddck, 0, sizeof(ddck)); - myglobs.lpInfoBuffer->SetColorKey(DDCKEY_SRCBLT, &ddck); - if (!WriteInfoBuffer()) - goto exit_with_error; - return TRUE; -exit_with_error: - RELEASE(myglobs.lpInfoBuffer); - RELEASE(myglobs.lpFrameRateBuffer); - if (statglobs.hFont != NULL) { - DeleteObject(statglobs.hFont); - } - return FALSE; -} - -/************************************************************************* - Frame rate output. - *************************************************************************/ - -#define INTERVAL 100 - -char StatTxt[100]; -int StatTxtLen; -int count = 0; -int last_polygons = 0; -int this_frames = 0; -time_t last_time; -float fps; -long tps; - -/* - * ResetFrameRate - * Initializes the frame rate counter. - */ -void -ResetFrameRate(void) -{ - last_time = clock(); - count = 0; - last_polygons = 0; - this_frames = 0; - fps = 0.0f; tps = 0; - StatTxt[0] = 0; - StatTxtLen = 0; -} - -BOOL -CalculateFrameRate() -{ - /* - * Calculate the frame rate and get other stats. - */ - count++; - this_frames++; - if (count == INTERVAL) { - double t; - int p, f; - time_t this_time; - - count = 0; - this_time = clock(); - t = (this_time - last_time) / (double)CLOCKS_PER_SEC; - last_time = this_time; - - p = myglobs.dev->GetTrianglesDrawn() - last_polygons; - last_polygons = myglobs.dev->GetTrianglesDrawn(); - - f = this_frames; - this_frames = 0; - - fps = (float)(f / t); - tps = (long)(p / t); - - if (myglobs.bShowFrameRate) { - if (!WriteFrameRateBuffer(fps, tps)) - return FALSE; - } - } - return TRUE; -} - -/* - * DisplayFrameRate - * Outputs frame rate info and screen mode to back buffer when appropriate. - */ -BOOL -DisplayFrameRate(int* count, LPD3DRECT lpExtents ) -{ - RECT rc; - int x, y; - HRESULT ddrval = DD_OK; - if (myglobs.bShowFrameRate && !myglobs.bSingleStepMode && statglobs.szFrameRate.cx > 0 && statglobs.szFrameRate.cy > 0 && - statglobs.szFrameRate.cx < d3dapp->szClient.cx && statglobs.szFrameRate.cy < d3dapp->szClient.cy) { - SetRect(&rc, 0, 0, statglobs.szFrameRate.cx, statglobs.szFrameRate.cy); - x = (int)(0.5 * (d3dapp->szClient.cx - statglobs.szFrameRate.cx) + 0.5); - y = 0; - if (myglobs.lpFrameRateBuffer) - ddrval = d3dapp->lpBackBuffer->BltFast(x, y, myglobs.lpFrameRateBuffer, &rc, - DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT); - if (ddrval != DD_OK) { - /* - * Blting the frame rate has failed. Since it is not vital, we - * aren't going to report an error. Check to see if the surfaces - * have been lost and then return. - */ - if (ddrval == DDERR_SURFACELOST) { - d3dapp->lpBackBuffer->Restore(); - myglobs.lpFrameRateBuffer->Restore(); - } - return TRUE; - } - SetRect((LPRECT)(lpExtents), x, y, statglobs.szFrameRate.cx + x, statglobs.szFrameRate.cy); - ++(*count); - ++lpExtents; - } - if (myglobs.bShowInfo && statglobs.szInfo.cx < d3dapp->szClient.cx && statglobs.szInfo.cy < d3dapp->szClient.cy) { - SetRect(&rc, 0, 0, statglobs.szInfo.cx, statglobs.szInfo.cy); - x = (int)(0.5 * (d3dapp->szClient.cx - statglobs.szInfo.cx) + 0.5); - y = d3dapp->szClient.cy - statglobs.szInfo.cy; - if (myglobs.lpInfoBuffer) - ddrval = d3dapp->lpBackBuffer->BltFast(x,y, myglobs.lpInfoBuffer, &rc, - DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT); - if (ddrval != DD_OK) { - /* - * Blting the info has failed. Since it is not vital, we - * aren't going to report an error. Check to see if the surfaces - * have been lost and then return. - */ - if (ddrval == DDERR_SURFACELOST) { - d3dapp->lpBackBuffer->Restore(); - myglobs.lpInfoBuffer->Restore(); - } - return TRUE; - } - SetRect((LPRECT)(lpExtents), x, y, x + statglobs.szInfo.cx, y + statglobs.szInfo.cy); - ++(*count); - } - return TRUE; -} diff --git a/sdk/samples/misc/stats.cpp b/sdk/samples/misc/stats.cpp deleted file mode 100644 index 45d17cd..0000000 --- a/sdk/samples/misc/stats.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: stats.cpp - * - ***************************************************************************/ -#include "d3dmain.h" - -/* - * GLOBAL VARIABLES - */ -extern D3DAppInfo* d3dapp; /* Pointer to read only collection of DD and D3D - objects maintained by D3DApp */ -extern d3dmainglobals myglobs; /* collection of global variables */ - -static struct { - HFONT hFont; - SIZE szFrameRate; - SIZE szInfo; -} statglobs; - - /************************************************************************ - Frame rate and info text - ************************************************************************/ - -BOOL -WriteFrameRateBuffer(float fps, long tps) -{ - HRESULT LastError; - HDC hdc; - RECT rc; - char buf1[30], buf2[30], buf[60]; - int len; - - if (!myglobs.lpFrameRateBuffer) - return TRUE; - if (fps > 0.0f) - wsprintf(buf1, "%d.%02d fps ", - (int)( fps * 100 ) / 100, - (int)( fps * 100 ) % 100); - else - buf1[0] = 0; - if (tps > 0) - wsprintf(buf2, "%ld tps ", tps); - else - buf2[0] = 0; - len = wsprintf(buf, "%s%s", buf1, buf2); - if (!myglobs.lpFrameRateBuffer) - return FALSE; - LastError = myglobs.lpFrameRateBuffer->GetDC(&hdc); - if (LastError != DD_OK) { - /* - * If this fails, it's not vital, so don't report an error. - */ - return TRUE; - } - SelectObject(hdc, statglobs.hFont); - SetTextColor(hdc, RGB(255,255,0)); - SetBkColor(hdc, RGB(0,0,0)); - SetBkMode(hdc, OPAQUE); - GetTextExtentPoint32(hdc, buf, len, &statglobs.szFrameRate); - SetRect(&rc, 0, 0, statglobs.szFrameRate.cx, statglobs.szFrameRate.cy); - ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, buf, len, NULL); - myglobs.lpFrameRateBuffer->ReleaseDC(hdc); - return TRUE; -} - -BOOL -WriteInfoBuffer(void) -{ - HRESULT LastError; - HDC hdc; - RECT rc; - char buf[40]; - int len; - - if (!myglobs.lpInfoBuffer) - return TRUE; - if (d3dapp->bFullscreen) - len = wsprintf(buf, "%dx%dx%d (%s)", d3dapp->ThisMode.w, d3dapp->ThisMode.h, d3dapp->ThisMode.bpp, - (d3dapp->ThisDriver.Desc.dcmColorModel == D3DCOLOR_MONO) ? "MONO" : "RGB"); - else - len = wsprintf(buf, "%dx%d (%s)", d3dapp->szClient.cx, d3dapp->szClient.cy, - (d3dapp->ThisDriver.Desc.dcmColorModel == D3DCOLOR_MONO) ? "MONO" : "RGB"); - if (!myglobs.lpInfoBuffer) - return FALSE; - LastError = myglobs.lpInfoBuffer->GetDC(&hdc); - if (LastError != DD_OK) { - /* - * If this fails, it's not vital, so don't report an error. - */ - return TRUE; - } - - SelectObject(hdc, statglobs.hFont); - SetTextColor(hdc, RGB(255,255,0)); - SetBkColor(hdc, RGB(0,0,0)); - SetBkMode(hdc, OPAQUE); - GetTextExtentPoint32(hdc, buf, len, &statglobs.szInfo); - SetRect(&rc, 0, 0, statglobs.szInfo.cx, statglobs.szInfo.cy); - ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, buf, len, NULL); - myglobs.lpInfoBuffer->ReleaseDC(hdc); - return TRUE; -} - -void -ReleaseFontAndTextBuffers(void) -{ - RELEASE(myglobs.lpInfoBuffer); - RELEASE(myglobs.lpFrameRateBuffer); - if (statglobs.hFont != NULL) { - DeleteObject(statglobs.hFont); - statglobs.hFont = NULL; - } -} - -BOOL -InitFontAndTextBuffers(void) -{ - DDCOLORKEY ddck; - DDSURFACEDESC ddsd; - HDC hdc; - HRESULT ddrval; - char dummyinfo[] = "000x000x00 (MONO) 0000"; - char dummyfps[] = "000.00 fps 00000000.00 tps 0000.00 mppps"; - - /* - * Create the font. - */ - RELEASE(myglobs.lpInfoBuffer); - RELEASE(myglobs.lpFrameRateBuffer); - if (statglobs.hFont != NULL) { - DeleteObject(statglobs.hFont); - statglobs.hFont = NULL; - } - statglobs.hFont = CreateFont( - d3dapp->szClient.cx <= 600 ? 12 : 24, - 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, - ANSI_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - VARIABLE_PITCH, - "Arial" ); - - hdc = GetDC(NULL); - SelectObject(hdc, statglobs.hFont); - GetTextExtentPoint(hdc, dummyfps, strlen(dummyfps), &statglobs.szFrameRate); - GetTextExtentPoint(hdc, dummyinfo, strlen(dummyinfo), &statglobs.szInfo); - ReleaseDC(NULL, hdc); - - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwHeight = statglobs.szFrameRate.cy; - ddsd.dwWidth = statglobs.szFrameRate.cx; - ddrval = D3DAppCreateSurface(&ddsd, &myglobs.lpFrameRateBuffer); - if (ddrval != DD_OK) { - Msg("Could not create frame rate buffer.\n%s", D3DAppErrorToString(ddrval)); - goto exit_with_error; - } - memset(&ddck, 0, sizeof(ddck)); - myglobs.lpFrameRateBuffer->SetColorKey(DDCKEY_SRCBLT, &ddck); - if (!WriteFrameRateBuffer(0.0f, 0)) { - goto exit_with_error; - } - memset( &ddsd, 0, sizeof( ddsd ) ); - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwHeight = statglobs.szInfo.cy; - ddsd.dwWidth = statglobs.szInfo.cx; - ddrval = D3DAppCreateSurface(&ddsd, &myglobs.lpInfoBuffer); - if (ddrval != DD_OK) { - Msg("Could not create info buffer.\n%s", D3DAppErrorToString(ddrval)); - goto exit_with_error; - } - memset(&ddck, 0, sizeof(ddck)); - myglobs.lpInfoBuffer->SetColorKey(DDCKEY_SRCBLT, &ddck); - if (!WriteInfoBuffer()) - goto exit_with_error; - return TRUE; -exit_with_error: - RELEASE(myglobs.lpInfoBuffer); - RELEASE(myglobs.lpFrameRateBuffer); - if (statglobs.hFont != NULL) { - DeleteObject(statglobs.hFont); - } - return FALSE; -} - -/************************************************************************* - Frame rate output. - *************************************************************************/ - -#define INTERVAL 100 - -char StatTxt[100]; -int StatTxtLen; -int count = 0; -int last_polygons = 0; -int this_frames = 0; -time_t last_time; -float fps; -long tps; - -/* - * ResetFrameRate - * Initializes the frame rate counter. - */ -void -ResetFrameRate(void) -{ - last_time = clock(); - count = 0; - last_polygons = 0; - this_frames = 0; - fps = 0.0f; tps = 0; - StatTxt[0] = 0; - StatTxtLen = 0; -} - -BOOL -CalculateFrameRate(void) -{ - /* - * Calculate the frame rate and get other stats. - */ - count++; - this_frames++; - if (count == INTERVAL) { - double t; - int p, f; - D3DSTATS stats; - time_t this_time; - - count = 0; - this_time = clock(); - t = (this_time - last_time) / (double)CLOCKS_PER_SEC; - last_time = this_time; - - memset(&stats, 0, sizeof(D3DSTATS)); - stats.dwSize = sizeof(D3DSTATS); - d3dapp->lpD3DDevice->GetStats(&stats); - p = stats.dwTrianglesDrawn - last_polygons; - last_polygons = stats.dwTrianglesDrawn; - - f = this_frames; - this_frames = 0; - - fps = (float)(f / t); - tps = (long)(p / t); - - if (myglobs.bShowFrameRate) { - if (!WriteFrameRateBuffer(fps, tps)) - return FALSE; - } - } - return TRUE; -} - -/* - * DisplayFrameRate - * Outputs frame rate info and screen mode to back buffer when appropriate. - */ -BOOL -DisplayFrameRate(int* count, LPD3DRECT lpExtents ) -{ - RECT rc; - int x, y; - HRESULT ddrval = DD_OK; - if (myglobs.bShowFrameRate && !myglobs.bSingleStepMode && statglobs.szFrameRate.cx > 0 && statglobs.szFrameRate.cy > 0 && - statglobs.szFrameRate.cx < d3dapp->szClient.cx && statglobs.szFrameRate.cy < d3dapp->szClient.cy) { - SetRect(&rc, 0, 0, statglobs.szFrameRate.cx, statglobs.szFrameRate.cy); - x = (int)(0.5 * (d3dapp->szClient.cx - statglobs.szFrameRate.cx) + 0.5); - y = 0; - if (myglobs.lpFrameRateBuffer) - ddrval = d3dapp->lpBackBuffer->BltFast(x, y, myglobs.lpFrameRateBuffer, &rc, - DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT); - if (ddrval != DD_OK) { - /* - * Blting the frame rate has failed. Since it is not vital, we - * aren't going to report an error. - */ - return TRUE; - } - SetRect((LPRECT)(lpExtents), x, y, statglobs.szFrameRate.cx + x, statglobs.szFrameRate.cy); - ++(*count); - ++lpExtents; - } - if (myglobs.bShowInfo && statglobs.szInfo.cx < d3dapp->szClient.cx && statglobs.szInfo.cy < d3dapp->szClient.cy) { - SetRect(&rc, 0, 0, statglobs.szInfo.cx, statglobs.szInfo.cy); - x = (int)(0.5 * (d3dapp->szClient.cx - statglobs.szInfo.cx) + 0.5); - y = d3dapp->szClient.cy - statglobs.szInfo.cy; - if (myglobs.lpInfoBuffer) - ddrval = d3dapp->lpBackBuffer->BltFast(x,y, myglobs.lpInfoBuffer, &rc, - DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT); - if (ddrval != DD_OK) { - /* - * Blting the info has failed. Since it is not vital, we - * aren't going to report an error. - */ - return TRUE; - } - SetRect((LPRECT)(lpExtents), x, y, x + statglobs.szInfo.cx, y + statglobs.szInfo.cy); - ++(*count); - } - return TRUE; -} diff --git a/sdk/samples/misc/texture.c b/sdk/samples/misc/texture.c deleted file mode 100644 index b8783d1..0000000 --- a/sdk/samples/misc/texture.c +++ /dev/null @@ -1,854 +0,0 @@ -/* - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: texture.c - * - * Loads and manages textures. Part of D3DApp. - * - * D3DApp is a collection of helper functions for Direct3D applications. - * D3DApp consists of the following files: - * d3dapp.h Main D3DApp header to be included by application - * d3dappi.h Internal header - * d3dapp.c D3DApp functions seen by application. - * ddcalls.c All calls to DirectDraw objects except textures - * d3dcalls.c All calls to Direct3D objects except textures - * texture.c Texture loading and managing texture list - * misc.c Miscellaneous calls - */ - -#include "d3dappi.h" - -#define MAGICBYTES 2 - -/* - * STATIC FUNCTION DECLARATIONS - */ -static void D3DAppIAddPathList(const char *path); -static void D3DAppIInitialisePathList(); -static FILE * D3DAppIFindFile(const char *name, const char *mode); -static BOOL loadPPMHeader(FILE *fp, DWORD *width, DWORD *height, int *maxgrey); - - -/***************************************************************************/ -/* Managing the texture list */ -/***************************************************************************/ -/* - * D3DAppILoadTextureSurf - * Creates a texture map surface and texture object from the numbered PPM - * file. This is done in a two step process. A source texture surface and - * object are created in system memory. A second, initially empty, texture - * surface is created (in video memory if hardware is present). The source - * texture is loaded into the destination texture surface and then discarded. - * This process allows a device to compress or reformat a texture map as it - * enters video memory during the Load call. - */ -BOOL -D3DAppILoadTextureSurf(int n, BOOL* bInVideo) -{ - DDSURFACEDESC ddsd; - LPDIRECTDRAWSURFACE lpSrcTextureSurf = NULL; - LPDIRECT3DTEXTURE lpSrcTexture = NULL; - LPDIRECTDRAWPALETTE lpDstPalette = NULL; - PALETTEENTRY ppe[256]; - DWORD pcaps; - /* - * Release the surface if it is hanging around - */ - RELEASE(d3dappi.lpTextureSurf[n]); - /* - * Create a surface in system memory and load the PPM file into it. - * Query for the texture interface. - */ - lpSrcTextureSurf = D3DAppILoadSurface(d3dappi.lpDD, d3dappi.ImageFile[n], - &d3dappi.ThisTextureFormat.ddsd, - DDSCAPS_SYSTEMMEMORY); - if (!lpSrcTextureSurf) - goto exit_with_error; - LastError = lpSrcTextureSurf->lpVtbl->QueryInterface(lpSrcTextureSurf, - &IID_IDirect3DTexture, - (LPVOID*)&lpSrcTexture); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to obtain D3D texture interface for a source texture.\n%s", D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Create an empty texture surface to load the source texture into. - * The DDSCAPS_ALLOCONLOAD flag allows the DD driver to wait until the - * load call to allocate the texture in memory because at this point, - * we may not know how much memory the texture will take up (e.g. it - * could be compressed to an unknown size in video memory). - * Make sure SW renderers get textures in system memory - */ - LastError = D3DAppIGetSurfDesc(&ddsd, lpSrcTextureSurf); - if (LastError != DD_OK) { - D3DAppISetErrorString("Could not get the surface description of the source texture.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_ALLOCONLOAD; - if (!d3dappi.ThisDriver.bIsHardware) - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - LastError = D3DAppICreateSurface(&ddsd, &d3dappi.lpTextureSurf[n]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Could not create the destination texture surface.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - if (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { - pcaps = DDPCAPS_8BIT | DDPCAPS_ALLOW256; - } else if (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED4) { - pcaps = DDPCAPS_4BIT; - } else { - pcaps = 0; - } - if (pcaps) { - memset(ppe, 0, sizeof(PALETTEENTRY) * 256); - LastError = d3dappi.lpDD->lpVtbl->CreatePalette(d3dappi.lpDD, pcaps, - ppe, &lpDstPalette, NULL); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to create a palette for the destination texture.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - LastError = d3dappi.lpTextureSurf[n]->lpVtbl->SetPalette(d3dappi.lpTextureSurf[n], - lpDstPalette); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to set the destination texture's palette.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } -// lpDstPalette->lpVtbl->Release(lpDstPalette); - } - /* - * Query our destination surface for a texture interface - */ - LastError = d3dappi.lpTextureSurf[n]->lpVtbl->QueryInterface(d3dappi.lpTextureSurf[n], - &IID_IDirect3DTexture, - (LPVOID*)&d3dappi.lpTexture[n]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to obtain D3D texture interface for a destination texture.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Load the source texture into the destination. During this call, a - * driver could compress or reformat the texture surface and put it in - * video memory. - */ - LastError = d3dappi.lpTexture[n]->lpVtbl->Load(d3dappi.lpTexture[n], lpSrcTexture); - if (LastError != DD_OK) { - D3DAppISetErrorString("Could not load a source texture into a destination texture.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - - /* - * Now we are done with the source texture - */ - RELEASE(lpSrcTexture); - RELEASE(lpSrcTextureSurf); - - /* - * Did the texture end up in video memory? - */ - LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpTextureSurf[n]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Could not get the surface description of the loaded texture surface.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - if (ddsd.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) - *bInVideo = TRUE; - else - *bInVideo = FALSE; - - - return TRUE; - -exit_with_error: - RELEASE(lpSrcTexture); - RELEASE(lpSrcTextureSurf); - RELEASE(lpDstPalette); - RELEASE(d3dappi.lpTexture[n]); - RELEASE(d3dappi.lpTextureSurf[n]); - return FALSE; -} - -/* - * D3DAppIReloadTextureSurf - * Reloads a lost and restored texture surface - */ -BOOL -D3DAppIReloadTextureSurf(int n) -{ - LPDIRECTDRAWSURFACE lpSrcTextureSurf = NULL; - LPDIRECT3DTEXTURE lpSrcTexture = NULL; - - /* - * Create a surface in system memory and load the PPM file into it. - * Query for the texture interface. - */ - lpSrcTextureSurf = D3DAppILoadSurface(d3dappi.lpDD, d3dappi.ImageFile[n], - &d3dappi.ThisTextureFormat.ddsd, - DDSCAPS_SYSTEMMEMORY); - if (!lpSrcTextureSurf) - goto exit_with_error; - LastError = lpSrcTextureSurf->lpVtbl->QueryInterface(lpSrcTextureSurf, - &IID_IDirect3DTexture, - (LPVOID*)&lpSrcTexture); - if (LastError != DD_OK) { - D3DAppISetErrorString("Failed to obtain D3D texture interface for a source texture.\n%s", D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Load the source texture into the destination. During this call, a - * driver could compress or reformat the texture surface and put it in - * video memory. - */ - LastError = d3dappi.lpTexture[n]->lpVtbl->Load(d3dappi.lpTexture[n], lpSrcTexture); - if (LastError != DD_OK) { - D3DAppISetErrorString("Could not load a source texture into a destination texture.\n%s", - D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * Now we are done with the source texture - */ - RELEASE(lpSrcTexture); - RELEASE(lpSrcTextureSurf); - - return TRUE; - -exit_with_error: - RELEASE(lpSrcTexture); - RELEASE(lpSrcTextureSurf); - return FALSE; -} - - -/* - * D3DAppIGetTextureHandle - * Get a texture handle from the current D3D device for this texture and save - * it in the MasterTextureHandle list and public texture handle list. - */ -BOOL -D3DAppIGetTextureHandle(int n) -{ - LastError = d3dappi.lpTexture[n]->lpVtbl->GetHandle(d3dappi.lpTexture[n], - d3dappi.lpD3DDevice, &MasterTextureHandle[n]); - if (LastError != DD_OK) { - D3DAppISetErrorString("Could not get a handle to loaded texture %i.\n%s", - n, D3DAppErrorToString(LastError)); - goto exit_with_error; - } - /* - * If textures are enabled, put the handle in the public texture list, - * otherwise, keep it as zero. - */ - if (!d3dappi.bTexturesDisabled) { - d3dappi.TextureHandle[n] = MasterTextureHandle[n]; - } else { - d3dappi.TextureHandle[n] = 0; - } - return TRUE; -exit_with_error: - MasterTextureHandle[n] = 0; - d3dappi.TextureHandle[n] = 0; - return FALSE; -} - -/* - * D3DAppIReleaseTexture - * Release this texture surface and texture interface. Remember, a texture - * handle is NOT and object and does not need to be released or destroyed. - * The handle is no longer valid after the device is destroyed, so set it to - * zero here. - */ -void -D3DAppIReleaseTexture(int n) -{ - RELEASE(d3dappi.lpTexture[n]); - RELEASE(d3dappi.lpTextureSurf[n]); - MasterTextureHandle[n] = 0; - d3dappi.TextureHandle[n] = 0; -} - -/* - * D3DAppIReleaseAllTextures - * Release all texture surfaces and texture interfaces - */ -void -D3DAppIReleaseAllTextures(void) -{ - int i; - for (i = 0; i < d3dappi.NumTextures; i++) { - D3DAppIReleaseTexture(i); - } -} - -/* - * D3DAppILoadAllTextures - * Load all texture surfaces, qeury them for texture interfaces and get - * handles for them from the current D3D driver. - */ -BOOL -D3DAppILoadAllTextures(void) -{ - int i; - if (d3dappi.ThisDriver.bDoesTextures) { - d3dappi.NumUsableTextures = 0; - for (i = 0; i < d3dappi.NumTextures; i++) { - BOOL bInVideo; - ATTEMPT(D3DAppILoadTextureSurf(i, &bInVideo)); - if (!bInVideo && d3dappi.ThisDriver.bIsHardware) { - /* - * If a texture fails to load into video memory for a hardware - * device, stop the NumUsableTextures count here. - */ - D3DAppIReleaseTexture(i); - break; - } else { - ++d3dappi.NumUsableTextures; - } - } - for (i = 0; i < d3dappi.NumUsableTextures; i++) { - ATTEMPT(D3DAppIGetTextureHandle(i)); - } - } else { - d3dappi.NumUsableTextures = 0; - } - return TRUE; - -exit_with_error: - for (i = 0; i < d3dappi.NumTextures; i++) { - D3DAppIReleaseTexture(i); - } - return FALSE; -} - -/***************************************************************************/ -/* Loading a PPM file into a surface */ -/***************************************************************************/ -/* - * LoadSurface - * Loads a ppm file into a texture map DD surface of the given format. The - * memory flag specifies DDSCAPS_SYSTEMMEMORY or DDSCAPS_VIDEOMEMORY. - */ -LPDIRECTDRAWSURFACE -D3DAppILoadSurface(LPDIRECTDRAW lpDD, LPCSTR lpName, - LPDDSURFACEDESC lpFormat, DWORD memoryflag) -{ - LPDIRECTDRAWSURFACE lpDDS; - DDSURFACEDESC ddsd, format; - D3DCOLOR colors[256]; - D3DCOLOR c; - DWORD dwWidth, dwHeight; - int i, j; - FILE *fp; - char *lpC; - LPDIRECTDRAWPALETTE lpDDPal; - PALETTEENTRY ppe[256]; - int psize; - DWORD pcaps; - int color_count; - BOOL bQuant = FALSE; - HRESULT ddrval; - - /* - * Find the image file and open it - */ - fp = D3DAppIFindFile(lpName, "rb"); - if (fp == NULL) { - D3DAppISetErrorString("Cannot find %s.\n", lpName); - return NULL; - } - /* - * Parse the PPM header - */ - if (!loadPPMHeader(fp, &dwWidth, &dwHeight, &i)) { - fclose(fp); - D3DAppISetErrorString("Could not load or parse PPM header in %s.\n", lpName); - return NULL; - } - /* - * Create a surface of the given format using the dimensions of the PPM - * file. - */ - memcpy(&format, lpFormat, sizeof(DDSURFACEDESC)); - if (format.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { - bQuant = TRUE; - psize = 256; - pcaps = DDPCAPS_8BIT | DDPCAPS_ALLOW256; - } else if (format.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED4) { - bQuant = TRUE; - psize = 16; - pcaps = DDPCAPS_4BIT; - } - memcpy(&ddsd, &format, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | memoryflag; - ddsd.dwHeight = dwHeight; - ddsd.dwWidth = dwWidth; - - ddrval = lpDD->lpVtbl->CreateSurface(lpDD, &ddsd, &lpDDS, NULL); - if (ddrval != DD_OK) { - D3DAppISetErrorString("CreateSurface for texture failed (loadtex).\n%s", - D3DAppErrorToString(ddrval)); - return NULL; - } - /* - * Lock the surface so it can be filled with the PPM file - */ - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddrval = lpDDS->lpVtbl->Lock(lpDDS, NULL, &ddsd, 0, NULL); - if (ddrval != DD_OK) { - lpDDS->lpVtbl->Release(lpDDS); - D3DAppISetErrorString("Lock failed while loading surface (loadtex).\n%s", - D3DAppErrorToString(ddrval)); - return NULL; - } - /* - * The method of loading depends on the pixel format of the dest surface - */ - if (!bQuant) { - /* - * The texture surface is not palettized - */ - unsigned long* lpLP; - unsigned short* lpSP; - unsigned char* lpCP; - unsigned long m; - int s; - int red_shift, red_scale; - int green_shift, green_scale; - int blue_shift, blue_scale; - /* - * Determine the red, green and blue masks' shift and scale. - */ - for (s = 0, m = format.ddpfPixelFormat.dwRBitMask; !(m & 1); - s++, m >>= 1); - red_shift = s; - red_scale = 255 / (format.ddpfPixelFormat.dwRBitMask >> s); - for (s = 0, m = format.ddpfPixelFormat.dwGBitMask; !(m & 1); - s++, m >>= 1); - green_shift = s; - green_scale = 255 / (format.ddpfPixelFormat.dwGBitMask >> s); - for (s = 0, m = format.ddpfPixelFormat.dwBBitMask; !(m & 1); - s++, m >>= 1); - blue_shift = s; - blue_scale = 255 / (format.ddpfPixelFormat.dwBBitMask >> s); - /* - * Each RGB bit count requires different pointers - */ - switch (format.ddpfPixelFormat.dwRGBBitCount) { - case 32 : - for (j = 0; j < (int)dwHeight; j++) { - /* - * Point to next row in texture surface - */ - lpLP = (unsigned long*)(((char*)ddsd.lpSurface) + - ddsd.lPitch * j); - for (i = 0; i < (int)dwWidth; i++) { - int r, g, b; - /* - * Read each value, scale it and shift it into position - */ - r = getc(fp) / red_scale; - g = getc(fp) / green_scale; - b = getc(fp) / blue_scale; - *lpLP = (r << red_shift) | (g << green_shift) | - (b << blue_shift); - lpLP++; - } - } - break; - case 16 : - for (j = 0; j < (int)dwHeight; j++) { - lpSP = (unsigned short*)(((char*)ddsd.lpSurface) + - ddsd.lPitch * j); - for (i = 0; i < (int)dwWidth; i++) { - int r, g, b; - r = getc(fp) / red_scale; - g = getc(fp) / green_scale; - b = getc(fp) / blue_scale; - *lpSP = (r << red_shift) | (g << green_shift) | - (b << blue_shift); - lpSP++; - } - } - break; - case 8: - for (j = 0; j < (int)dwHeight; j++) { - lpCP = (unsigned char*)(((char*)ddsd.lpSurface) + - ddsd.lPitch * j); - for (i = 0; i < (int)dwWidth; i++) { - int r, g, b; - r = getc(fp) / red_scale; - g = getc(fp) / green_scale; - b = getc(fp) / blue_scale; - *lpCP = (r << red_shift) | (g << green_shift) | - (b << blue_shift); - lpCP++; - } - } - break; - default: - /* - * This wasn't a format I recognize - */ - lpDDS->lpVtbl->Unlock(lpDDS, NULL); - fclose(fp); - lpDDS->lpVtbl->Release(lpDDS); - D3DAppISetErrorString("Unknown pixel format (loadtex)."); - return NULL; - } - /* - * Unlock the texture and return the surface pointer - */ - lpDDS->lpVtbl->Unlock(lpDDS, NULL); - fclose(fp); - return (lpDDS); - } - - /* - * We assume the 8-bit palettized case - */ - color_count = 0; /* number of colors in the texture */ - for (j = 0; j < (int)dwHeight; j++) { - /* - * Point to next row in surface - */ - lpC = ((char*)ddsd.lpSurface) + ddsd.lPitch * j; - for (i = 0; i < (int)dwWidth; i++) { - int r, g, b, k; - /* - * Get the next red, green and blue values and turn them into a - * D3DCOLOR - */ - r = getc(fp); - g = getc(fp); - b = getc(fp); - c = RGB_MAKE(r, g, b); - /* - * Search for this color in a table of colors in this texture - */ - for (k = 0; k < color_count; k++) - if (c == colors[k]) break; - if (k == color_count) { - /* - * This is a new color, so add it to the list - */ - color_count++; - /* - * More than 256 and we fail (8-bit) - */ - if (color_count > psize) { - color_count--; - k = color_count - 1; - //goto burst_colors; - } - colors[k] = c; - } - /* - * Set the "pixel" value on the surface to be the index into the - * color table - */ - if (psize == 16) { - if ((i & 1) == 0) - *lpC = k & 0xf; - else { - *lpC |= (k & 0xf) << 4; - lpC++; - } - } else { - *lpC = (char)k; - lpC++; - } - } - } - /* - * Close the file and unlock the surface - */ - fclose(fp); - lpDDS->lpVtbl->Unlock(lpDDS, NULL); - -//burst_colors: - if (color_count > psize) { - /* - * If there are more than 256 colors, we overran our palette - */ - lpDDS->lpVtbl->Unlock(lpDDS, NULL); - lpDDS->lpVtbl->Release(lpDDS); - D3DAppISetErrorString("Palette burst. (loadtex).\n"); - return (NULL); - } - - /* - * Create a palette with the colors in our color table - */ - memset(ppe, 0, sizeof(PALETTEENTRY) * 256); - for (i = 0; i < color_count; i++) { - ppe[i].peRed = (unsigned char)RGB_GETRED(colors[i]); - ppe[i].peGreen = (unsigned char)RGB_GETGREEN(colors[i]); - ppe[i].peBlue = (unsigned char)RGB_GETBLUE(colors[i]); - } - /* - * Set all remaining entry flags to D3DPAL_RESERVED, which are ignored by - * the renderer. - */ - for (; i < 256; i++) - ppe[i].peFlags = D3DPAL_RESERVED; - /* - * Create the palette with the DDPCAPS_ALLOW256 flag because we want to - * have access to all entries. - */ - ddrval = lpDD->lpVtbl->CreatePalette(lpDD, - DDPCAPS_INITIALIZE | pcaps, - ppe, &lpDDPal, NULL); - if (ddrval != DD_OK) { - lpDDS->lpVtbl->Release(lpDDS); - D3DAppISetErrorString("Create palette failed while loading surface (loadtex).\n%s", - D3DAppErrorToString(ddrval)); - return (NULL); - } - /* - * Finally, bind the palette to the surface - */ - ddrval = lpDDS->lpVtbl->SetPalette(lpDDS, lpDDPal); - if (ddrval != DD_OK) { - lpDDS->lpVtbl->Release(lpDDS); - lpDDPal->lpVtbl->Release(lpDDPal); - D3DAppISetErrorString("SetPalette failed while loading surface (loadtex).\n%s", - D3DAppErrorToString(ddrval)); - return (NULL); - } - - lpDDPal->lpVtbl->Release(lpDDPal); - - return lpDDS; -} - -static BOOL -ppm_getbyte(FILE *fp, char *newByte) -{ - char cchar; - int cc; - - /* Get a byte, and dump comments */ - cchar = cc = getc(fp); - if (cc == EOF) { - return FALSE; - } - - if (cchar == '#') { - /* Read until next end of line */ - do { - cchar = cc = getc(fp); - if (cc == EOF) - return FALSE; - } while (cchar != '\n' && cchar != '\r'); - } - - *newByte = cchar; - - return TRUE; -} - -static BOOL -ppm_getint(FILE *fp, int *newInt) -{ - int cint; - char cchar; - - do { - if (!ppm_getbyte(fp, &cchar)) return FALSE; - } while (isspace(cchar)); - - if (!isdigit(cchar)) { - return FALSE; - } - - cint = 0; - - do { - cint = (cint * 10) + (cchar - '0'); - if (!ppm_getbyte(fp, &cchar)) return FALSE; - } while(isdigit(cchar)); - - *newInt = cint; - - return TRUE; -} - -static BOOL -loadPPMHeader(FILE *fp, DWORD *width, DWORD *height, int *maxgrey) -{ - char magic[MAGICBYTES], cchar; - - /* Slurp up ppm header until we get width, height and maxgrey values */ - - /* Read and check the magic bytes */ - if (fread(magic, MAGICBYTES, 1, fp) != 1) - return FALSE; - if (magic[0] != 'P' || magic[1] != '6') - return FALSE; - - /* Now we can actually read some numbers */ - if (!ppm_getint(fp, width)) - return FALSE; - if (!ppm_getint(fp, height)) - return FALSE; - if (!ppm_getint(fp, maxgrey)) - return FALSE; - - /* Slurp up rest of white space so we get to actual data */ - do { - if (!ppm_getbyte(fp, &cchar)) - return FALSE; - } while (cchar == ' ' || cchar == '\t' || cchar == '\n' || cchar == '\r'); - - fseek(fp, -1, SEEK_CUR); - - return TRUE; -} - - -/***************************************************************************/ -/* Finding Textures */ -/***************************************************************************/ - -#define MAXPATH 256 -#define PATHSEP ';' -#define FILESEP '\\' -#define MAXCONTENTS 25 -#define RESPATH "Software\\Microsoft\\Direct3D" - -static int PathListInitialised = FALSE; - -/* - * PathList structure - * A list of directories in which to search for the texture. - */ -static struct { - int count; - char *contents[MAXCONTENTS]; -} PathList; - -/* - * D3DAppIAddPathList - * Add this string to the search path list - */ -static void -D3DAppIAddPathList(const char *path) -{ - char *p; - char *elt; - int len; - - while (path) { - p = LSTRCHR(path, PATHSEP); - if (p) - len = p - path; - else - len = lstrlen(path); - elt = (char *) malloc(len + 1); - if (elt == NULL) - return; - lstrcpyn(elt, path, len + 1); - elt[len] = '\0'; - PathList.contents[PathList.count] = elt; - PathList.count++; - if (p) - path = p + 1; - else - path = NULL; - if (PathList.count == MAXCONTENTS) - return; - } - return; -} - -/* - * D3DAppIInitialisePathList - * Create a search path with the D3DPATH env. var and D3D Path registry entry - */ -static void -D3DAppIInitialisePathList() -{ - long result; - HKEY key; - DWORD type, size; - static char buf[512]; - char* path; - - if (PathListInitialised) - return; - PathListInitialised = TRUE; - - PathList.count = 0; - path = getenv("D3DPATH"); - D3DAppIAddPathList("."); - if (path != NULL) { - D3DAppIAddPathList(path); - return; - } - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, RESPATH, 0, KEY_READ, &key); - if (result == ERROR_SUCCESS) { - size = sizeof(buf); - result = RegQueryValueEx(key, "D3D Path", NULL, &type, (LPBYTE) buf, - &size); - RegCloseKey(key); - if (result == ERROR_SUCCESS && type == REG_SZ) - D3DAppIAddPathList(buf); - } -} - - -/* - * D3DAppIFindFile - * Find and open a file using the current search path. - */ -static FILE* -D3DAppIFindFile(const char *name, const char *mode) -{ - FILE *fp; - char buf[MAXPATH]; - static char filesep[] = {FILESEP, 0}; - int i; - - D3DAppIInitialisePathList(); - - fp = fopen(name, mode); - if (fp != NULL) - return fp; - - for (i = 0; i < PathList.count; i++) { - lstrcpy(buf, PathList.contents[i]); - lstrcat(buf, filesep); - lstrcat(buf, name); - fp = fopen(buf, mode); - if (fp) - return fp; - } - return NULL; -} - -/* - * D3DAppIReleasePathList - * Release the path list for program termination - */ -void -D3DAppIReleasePathList(void) -{ - int i; - for (i = 0; i < PathList.count; i++) { - free(PathList.contents[i]); - PathList.contents[i] = NULL; - } - PathList.count = 0; - PathListInitialised = FALSE; -} - diff --git a/sdk/samples/msbld.mk b/sdk/samples/msbld.mk deleted file mode 100644 index 84f94ec..0000000 --- a/sdk/samples/msbld.mk +++ /dev/null @@ -1,33 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: msbld.mk -# Content: Master makefile for Microsoft Visual C++ 2.0 or higher -# For controlling what gets built (debug, retail, clean) -# -############################################################################ - -goal: debug.mak - -all : debug.mak retail.mak - -debug retail: $@.mak - -!ifndef MAKENAME -MAKENAME = default.mk -!endif - -debug.mak retail.mak: - @if not exist $(@B)\nul md $(@B) - @cd $(@B) - @nmake -nologo -f ..\$(MAKENAME) DEBUG="$(@B)" - @cd .. - @echo *** Done making $(@B) *** - -clean: debug.cln retail.cln - -debug.cln retail.cln: - @if exist $(@B)\nul del $(@B) < ..\yes >nul - @if exist $(@B)\nul rd $(@B) >nul - @echo *** $(@B) is clean *** diff --git a/sdk/samples/mssdk.mk b/sdk/samples/mssdk.mk deleted file mode 100644 index 79f14ad..0000000 --- a/sdk/samples/mssdk.mk +++ /dev/null @@ -1,111 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: mssdk.mk -# Content: Rules for building the components of the SDK. -# For use with MSVC 2.0 or higher -# -############################################################################ - -!if "$(GSDKROOT)" == "" -GSDKROOT=..\..\.. -!endif - -############################################################################# -# -# Set up include & lib path -# -############################################################################# -INCLUDE=$(GSDKROOT)\inc;$(INCLUDE) -LIB=$(GSDKROOT)\lib;$(LIB) - -############################################################################# -# -# new suffixes -# -############################################################################# -.SUFFIXES: -.SUFFIXES: .asm .c .cpp .exe .dll .h .inc .lib .sym .rc .res - -############################################################################# -# -# C compiler definitions -# -############################################################################# -CC =cl -CFLAGS = $(CFLAGS) -W3 -WX -c -Zp -CFLAGS =$(CFLAGS) -Gf4ys -DIS_32 -DWIN32 -!ifndef LOGO -CFLAGS =$(CFLAGS) -nologo -!endif - -############################################################################# -# -# Linker definitions -# -############################################################################# -LINK =link -link -LFLAGS =$(LFLAGS) -nodefaultlib -align:0x1000 -!ifndef LOGO -LFLAGS =$(LFLAGS) -nologo -!endif - -############################################################################# -# -# resource compiler definitions -# -############################################################################# -RCFLAGS =$(RCFLAGS) -I.. -RCFLAGS =$(RCFLAGS) -DWIN32 -DIS_32 -RC = rc - -############################################################################# -# -# assembler definitions -# -############################################################################# -ASM = ml -AFLAGS =$(AFLAGS) -DIS_32 -DWIN32 -AFLAGS =$(AFLAGS) -W3 -WX -Zd -c -Cx -DMASM6 - -############################################################################# -# -# librarian definitions -# -############################################################################# -LIBEXE = lib - -############################################################################# -# -# targets -# -############################################################################# - -goal: $(GOALS) - -{..}.c{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\$(@B).c -<< - -{..\..\misc}.c{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\..\misc\$(@B).c -<< - -{..}.cpp{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\$(@B).cpp -<< - -{..\..\misc}.cpp{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\..\misc\$(@B).cpp -<< - -{..}.asm{}.obj: - $(ASM) $(AFLAGS) -Fo$(@B).obj ..\$(@B).asm - -{..}.rc{}.res: - $(RC) $(RCFLAGS) -r -Fo$(@B).res ..\$(@B).rc diff --git a/sdk/samples/mstream/debug.c b/sdk/samples/mstream/debug.c deleted file mode 100644 index 16668aa..0000000 --- a/sdk/samples/mstream/debug.c +++ /dev/null @@ -1,356 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.c - * Content: debug code - * - ***************************************************************************/ - -#ifdef DEBUG - -#include -#include -#include -#include "debug.h" - - -// -// since we don't UNICODE our debugging messages, use the ASCII entry -// points regardless of how we are compiled. -// -#ifdef _WIN32 - #include -#else - #define lstrcatA lstrcat - #define lstrlenA lstrlen - #define GetProfileIntA GetProfileInt - #define OutputDebugStringA OutputDebugString - #define wsprintfA wsprintf - #define MessageBoxA MessageBox -#endif - -// -// -// -BOOL __gfDbgEnabled = TRUE; // master enable -UINT __guDbgLevel = 0; // current debug level - - -//--------------------------------------------------------------------------; -// -// void DbgVPrintF -// -// Description: -// -// -// Arguments: -// LPSTR szFormat: -// -// va_list va: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL DbgVPrintF -( - LPSTR szFormat, - va_list va -) -{ - char ach[DEBUG_MAX_LINE_LEN]; - BOOL fDebugBreak = FALSE; - BOOL fPrefix = TRUE; - BOOL fCRLF = TRUE; - - ach[0] = '\0'; - - for (;;) - { - switch (*szFormat) - { - case '!': - fDebugBreak = TRUE; - szFormat++; - continue; - - case '`': - fPrefix = FALSE; - szFormat++; - continue; - - case '~': - fCRLF = FALSE; - szFormat++; - continue; - } - - break; - } - - if (fDebugBreak) - { - ach[0] = '\007'; - ach[1] = '\0'; - } - - if (fPrefix) - { - lstrcatA(ach, DEBUG_MODULE_NAME ": "); - } - -#ifdef _WIN32 - wvsprintfA(ach + lstrlenA(ach), szFormat, va); -#else - wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va); -#endif - - if (fCRLF) - { - lstrcatA(ach, "\r\n"); - } - - OutputDebugStringA(ach); - - if (fDebugBreak) - { - DebugBreak(); - } -} // DbgVPrintF() - - -//--------------------------------------------------------------------------; -// -// void dprintf -// -// Description: -// dprintf() is called by the DPF() macro if DEBUG is defined at compile -// time. It is recommended that you only use the DPF() macro to call -// this function--so you don't have to put #ifdef DEBUG around all -// of your code. -// -// Arguments: -// UINT uDbgLevel: -// -// LPSTR szFormat: -// -// Return (void): -// No value is returned. -// -//--------------------------------------------------------------------------; - -void FAR CDECL dprintf -( - UINT uDbgLevel, - LPSTR szFormat, - ... -) -{ - va_list va; - - if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel)) - return; - - va_start(va, szFormat); - DbgVPrintF(szFormat, va); - va_end(va); -} // dprintf() - - -//--------------------------------------------------------------------------; -// -// BOOL DbgEnable -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (BOOL): -// Returns the previous debugging state. -// -//--------------------------------------------------------------------------; - -BOOL WINAPI DbgEnable -( - BOOL fEnable -) -{ - BOOL fOldState; - - fOldState = __gfDbgEnabled; - __gfDbgEnabled = fEnable; - - return (fOldState); -} // DbgEnable() - - -//--------------------------------------------------------------------------; -// -// UINT DbgSetLevel -// -// Description: -// -// -// Arguments: -// UINT uLevel: -// -// Return (UINT): -// Returns the previous debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgSetLevel -( - UINT uLevel -) -{ - UINT uOldLevel; - - uOldLevel = __guDbgLevel; - __guDbgLevel = uLevel; - - return (uOldLevel); -} // DbgSetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgGetLevel -// -// Description: -// -// -// Arguments: -// None. -// -// Return (UINT): -// Returns the current debugging level. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgGetLevel -( - void -) -{ - return (__guDbgLevel); -} // DbgGetLevel() - - -//--------------------------------------------------------------------------; -// -// UINT DbgInitialize -// -// Description: -// -// -// Arguments: -// BOOL fEnable: -// -// Return (UINT): -// Returns the debugging level that was set. -// -//--------------------------------------------------------------------------; - -UINT WINAPI DbgInitialize -( - BOOL fEnable -) -{ - UINT uLevel; - - uLevel = GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, (UINT)-1); - if ((UINT)-1 == uLevel) - { - // - // if the debug key is not present, then force debug output to - // be disabled. this way running a debug version of a component - // on a non-debugging machine will not generate output unless - // the debug key exists. - // - uLevel = 0; - fEnable = FALSE; - } - - DbgSetLevel(uLevel); - DbgEnable(fEnable); - - return (__guDbgLevel); -} // DbgInitialize() - - -//--------------------------------------------------------------------------; -// -// void _Assert -// -// Description: -// This routine is called if the ASSERT macro (defined in debug.h) -// tests and expression that evaluates to FALSE. This routine -// displays an "assertion failed" message box allowing the user to -// abort the program, enter the debugger (the "retry" button), or -// ignore the assertion and continue executing. The message box -// displays the file name and line number of the _Assert() call. -// -// Arguments: -// char * szFile: Filename where assertion occurred. -// int iLine: Line number of assertion. -// -//--------------------------------------------------------------------------; - -#ifndef _WIN32 -#pragma warning(disable:4704) -#endif - -void WINAPI _Assert -( - char * szFile, - int iLine -) -{ - static char ach[300]; // debug output (avoid stack overflow) - int id; -#ifndef _WIN32 - int iExitCode; -#endif - - wsprintfA(ach, "Assertion failed in file %s, line %d. [Press RETRY to debug.]", (LPSTR)szFile, iLine); - - id = MessageBoxA(NULL, ach, "Assertion Failed", - MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE ); - - switch (id) - { - - case IDABORT: // Kill the application. -#ifndef _WIN32 - iExitCode = 0; - _asm - { - mov ah, 4Ch - mov al, BYTE PTR iExitCode - int 21h - } -#else - FatalAppExit(0, TEXT("Good Bye")); -#endif // WIN16 - break; - - case IDRETRY: // Break into the debugger. - DebugBreak(); - break; - - case IDIGNORE: // Ignore assertion, continue executing. - break; - } -} // _Assert - -#ifndef _WIN32 -#pragma warning(default:4704) -#endif - -#endif // #ifdef DEBUG - diff --git a/sdk/samples/mstream/debug.h b/sdk/samples/mstream/debug.h deleted file mode 100644 index db520ab..0000000 --- a/sdk/samples/mstream/debug.h +++ /dev/null @@ -1,80 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: debug.h - * Content: debug header - * - ***************************************************************************/ -#ifndef __DEBUG_INCLUDED__ -#define __DEBUG_INCLUDED__ -#ifdef __cplusplus -extern "C" -{ -#endif - -// -// -// -// -#ifdef DEBUG - #define DEBUG_SECTION "Debug" // section name for - #define DEBUG_MODULE_NAME "MSTREAM" // key name and prefix for output - #define DEBUG_MAX_LINE_LEN 255 // max line length (bytes!) -#endif - - -// -// based code makes since only in win 16 (to try and keep stuff out of -// [fixed] data segments, etc)... -// -#ifndef BCODE -#ifdef _WIN32 - #define BCODE -#else - #define BCODE _based(_segname("_CODE")) -#endif -#endif - - - - -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; -// -// -// -//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - -#ifdef DEBUG - BOOL WINAPI DbgEnable(BOOL fEnable); - UINT WINAPI DbgGetLevel(void); - UINT WINAPI DbgSetLevel(UINT uLevel); - UINT WINAPI DbgInitialize(BOOL fEnable); - void WINAPI _Assert( char * szFile, int iLine ); - - void FAR CDECL dprintf(UINT uDbgLevel, LPSTR szFmt, ...); - - #define D(x) {x;} - #define DPF dprintf - #define DPI(sz) {static char BCODE ach[] = sz; OutputDebugStr(ach);} - #define ASSERT(x) if( !(x) ) _Assert( __FILE__, __LINE__) -#else - #define DbgEnable(x) FALSE - #define DbgGetLevel() 0 - #define DbgSetLevel(x) 0 - #define DbgInitialize(x) 0 - - #ifdef _MSC_VER - #pragma warning(disable:4002) - #endif - - #define D(x) - #define DPF() - #define DPI(sz) - #define ASSERT(x) -#endif - -#ifdef __cplusplus -} -#endif -#endif // __DEBUG_INCLUDED__ diff --git a/sdk/samples/mstream/default.mk b/sdk/samples/mstream/default.mk deleted file mode 100644 index 0945568..0000000 --- a/sdk/samples/mstream/default.mk +++ /dev/null @@ -1,47 +0,0 @@ -NAME = mstream -EXT = exe -GLOBAL_RECOMPILE = $(MANROOT)\recompdd.log - -IS_32 = 1 - -GOALS = $(PBIN)\$(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib crtdll.lib comctl32.lib comdlg32.lib \ - gdi32.lib winmm.lib - -OBJS = mstream.obj debug.obj mstrconv.obj mstrhelp.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -AOPT =-DDEBUG -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -AOPT = -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\..\proj.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/mstream/ico00001.ico b/sdk/samples/mstream/ico00001.ico deleted file mode 100644 index a047dfb..0000000 Binary files a/sdk/samples/mstream/ico00001.ico and /dev/null differ diff --git a/sdk/samples/mstream/makefile b/sdk/samples/mstream/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/mstream/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/mstream/midstuff.h b/sdk/samples/mstream/midstuff.h deleted file mode 100644 index d16de6e..0000000 --- a/sdk/samples/mstream/midstuff.h +++ /dev/null @@ -1,138 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: midstuff.h - * Content: MIDI structures and definitions used by the MSTREAM sample - * application in converting a MID file to a MIDI stream for - * playback using the midiStream API. - * - ***************************************************************************/ -#ifndef __MIDSTUFF_H__ -#define __MIDSTUFF_H__ - -// MIDI file constants -// -#define MThd 0x6468544D // Start of file -#define MTrk 0x6B72544D // Start of track - -#define MIDI_SYSEX ((BYTE)0xF0) // SysEx begin -#define MIDI_SYSEXEND ((BYTE)0xF7) // SysEx begin -#define MIDI_META ((BYTE)0xFF) // Meta event begin -#define MIDI_META_TEMPO ((BYTE)0x51) // Tempo change -#define MIDI_META_EOT ((BYTE)0x2F) // End-of-track - -#define MIDI_NOTEOFF ((BYTE)0x80) // + note + velocity -#define MIDI_NOTEON ((BYTE)0x90) // + note + velocity -#define MIDI_POLYPRESS ((BYTE)0xA0) // + pressure (2 bytes) -#define MIDI_CTRLCHANGE ((BYTE)0xB0) // + ctrlr + value -#define MIDI_PRGMCHANGE ((BYTE)0xC0) // + new patch -#define MIDI_CHANPRESS ((BYTE)0xD0) // + pressure (1 byte) -#define MIDI_PITCHBEND ((BYTE)0xE0) // + pitch bend (2 bytes) - -#define NUM_CHANNELS 16 - -#define MIDICTRL_VOLUME ((BYTE)0x07) -#define MIDICTRL_VOLUME_LSB ((BYTE)0x27) -#define MIDICTRL_PAN ((BYTE)0x0A) - -#define MIDIEVENT_CHANNEL(dw) (dw & 0x0000000F) -#define MIDIEVENT_TYPE(dw) (dw & 0x000000F0) -#define MIDIEVENT_DATA1(dw) ((dw & 0x0000FF00) >> 8) -#define MIDIEVENT_VOLUME(dw) ((dw & 0x007F0000) >> 16) - -// Macros for swapping hi/lo-endian data -// -#define WORDSWAP(w) (((w) >> 8) | \ - (((w) << 8) & 0xFF00)) - -#define DWORDSWAP(dw) (((dw) >> 24) | \ - (((dw) >> 8) & 0x0000FF00) | \ - (((dw) << 8) & 0x00FF0000) | \ - (((dw) << 24) & 0xFF000000)) - -// In debug builds, TRACKERR will show us where the parser died -// -#ifdef DEBUG -#define TRACKERR(p,sz) ShowTrackError(p,sz); -#else -#define TRACKERR(p,sz) -#endif - - -// Make a little distinction here so the various structure members are a bit -// more clearly labelled -- we have offsets and byte counts to keep track of -// that deal with both in-memory buffers and the file on disk - -#define FILEOFF DWORD - - -// These structures are stored in MIDI files; they need to be byte aligned. -// -#pragma pack(1) - -// Chunk header. dwTag is either MTrk or MThd. -// -typedef struct -{ - DWORD dwTag; // Type - DWORD dwChunkLength; // Length (hi-lo) -} MIDICHUNK; - -// Contents of MThd chunk. -typedef struct -{ - WORD wFormat; // Format (hi-lo) - WORD wTrackCount; // # tracks (hi-lo) - WORD wTimeDivision; // Time division (hi-lo) -} MIDIFILEHDR; - -#pragma pack() // End of need for byte-aligned structures - - -// Temporary event structure which stores event data until we're ready to -// dump it into a stream buffer -// -typedef struct -{ - DWORD tkEvent; // Absolute time of event - BYTE byShortData[4]; // Event type and parameters if channel msg - DWORD dwEventLength; // Length of data which follows if meta or sysex - LPBYTE pLongData; // -> Event data if applicable -} TEMPEVENT, *PTEMPEVENT; - -#define ITS_F_ENDOFTRK 0x00000001 - -// Description of a track open for read -// -typedef struct -{ - DWORD fdwTrack; // Track status - DWORD dwTrackLength; // Total bytes in track - DWORD dwLeftInBuffer; // Bytes left unread in track buffer - LPBYTE pTrackStart; // -> start of track data buffer - LPBYTE pTrackCurrent; // -> next byte to read in buffer - DWORD tkNextEventDue; // Absolute time of next event in track - BYTE byRunningStatus;// Running status from last channel msg - - FILEOFF foTrackStart; // Start of track -- used for walking the file - FILEOFF foNextReadStart;// File offset of next read from disk - DWORD dwLeftOnDisk; // Bytes left unread on disk -#ifdef DEBUG - DWORD nTrack; // # of this track for debugging -#endif -} INTRACKSTATE, *PINTRACKSTATE; - -// Description of the input MIDI file -// -typedef struct -{ - DWORD cbFileLength; // Total bytes in file - DWORD dwTimeDivision; // Original time division - DWORD dwFormat; // Original format - DWORD dwTrackCount; // Track count (specifies pitsTracks size) - INTRACKSTATE *pitsTracks; // -> array of tracks in this file -} INFILESTATE, *PINFILESTATE; - -#endif - diff --git a/sdk/samples/mstream/mstrconv.c b/sdk/samples/mstream/mstrconv.c deleted file mode 100644 index d602abe..0000000 --- a/sdk/samples/mstream/mstrconv.c +++ /dev/null @@ -1,1117 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: mstrconv.c - * Content: Converts a MIDI file into a midiStream, placing the results - * in a buffer that the MSTREAM sample application can use for - * playback with the midiStream* API under Win95. - * - ***************************************************************************/ -#include -#include - -#include -#include -#include - -#include "debug.h" -#include "mstream.h" -#include "midstuff.h" - -// Global stuff which is defined in the main module -// -extern char szTemp[256]; -extern char szDebug[256]; -extern char szAppTitle[64]; - -BOOL bInsertTempo = FALSE; - -// A few global variables used by this module only -// -static HANDLE hInFile = INVALID_HANDLE_VALUE; -INFILESTATE ifs; -static DWORD tkCurrentTime; - -// Tracks how many malloc blocks exist. If there are any and we decide to shut -// down, we must scan for them and free them. Malloc blocks are only created as -// temporary storgae blocks for extra parameter data associated with MIDI_SYSEX, -// MIDI_SYSEXEND, and MIDI_META events. -static DWORD dwMallocBlocks = 0; - -extern DWORD dwBufferTickLength, dwTempoMultiplier, dwCurrentTempo; -extern DWORD dwProgressBytes, dwVolumePercent; -extern BOOL bLooped; - -// Messages -// -static char szInitErrMem[] = "Out of memory.\n"; -static char szInitErrInFile[] = "Read error on input file or file is corrupt.\n"; -static char szNoTrackBuffMem[] = "Insufficient memory for track buffer allocation\n"; - -#ifdef DEBUG -static char gteBadRunStat[] = "Reference to missing running status."; -static char gteRunStatMsgTrunc[]= "Running status message truncated"; -static char gteChanMsgTrunc[] = "Channel message truncated"; -static char gteSysExLenTrunc[] = "SysEx event truncated (length)"; -static char gteSysExTrunc[] = "SysEx event truncated"; -static char gteMetaNoClass[] = "Meta event truncated (no class byte)"; -static char gteMetaLenTrunc[] = "Meta event truncated (length)"; -static char gteMetaTrunc[] = "Meta event truncated"; -static char gteNoMem[] = "Out of memory during malloc call"; -#endif - -// Prototypes -// -static int AddEventToStreamBuffer( PTEMPEVENT pteTemp, LPCONVERTINFO ); -static BOOL GetInFileData( LPVOID lpDest, DWORD cbToGet ); -static BOOL GetTrackByte( PINTRACKSTATE ptsTrack, LPBYTE lpbyByte ); -static BOOL GetTrackEvent( PINTRACKSTATE ptsTrack, PTEMPEVENT pteTemp ); -static BOOL GetTrackVDWord( PINTRACKSTATE ptsTrack, LPDWORD lpdw ); -static BOOL RefillTrackBuffer( PINTRACKSTATE ptsTrack ); -static BOOL RewindConverter( void ); - -#ifdef DEBUG -static void ShowTrackError( PINTRACKSTATE ptsTrack, char* szErr ); -#endif - -// ConverterInit -// -// Open the input file -// Allocate and read the entire input file into memory -// Validate the input file structure -// Allocate the input track structures and initialize them -// Initialize the output track structures -// -// Return TRUE on success -// Prints its own error message if something goes wrong -// -BOOL ConverterInit( LPSTR szInFile ) - { - BOOL fRet = TRUE; - DWORD cbRead, dwTag, cbHeader, dwToRead; - MIDIFILEHDR Header; - PINTRACKSTATE ptsTrack; - UINT idx; - - tkCurrentTime = 0; - - // Initialize things we'll try to free later if we fail - // - memset( &ifs, 0, sizeof(INFILESTATE)); - ifs.cbFileLength = 0; - ifs.pitsTracks = NULL; - - // Attempt to open the input and output files - // - hInFile = CreateFile( szInFile, GENERIC_READ, - FILE_SHARE_READ, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if( hInFile == INVALID_HANDLE_VALUE ) - { - wsprintf( szTemp, "Could not open \"%s\" for read.\n", szInFile ); - MessageBox( GetActiveWindow(), szTemp, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - -// Figure out how big the input file is. - if((( ifs.cbFileLength = GetFileSize( hInFile, NULL )) == (UINT)-1 )) - { - MessageBox( GetActiveWindow(), "File system error on input file.\n", - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - -// Set up to read from the memory buffer. Read and validate -// - MThd header -// - size of file header chunk -// - file header itself -// - if( GetInFileData( &dwTag, sizeof(DWORD)) - || ( dwTag != MThd ) - || GetInFileData( &cbHeader, sizeof(DWORD)) - || (( cbHeader = DWORDSWAP( cbHeader )) < sizeof(MIDIFILEHDR)) - || GetInFileData( &Header, cbHeader ) ) - { - MessageBox( GetActiveWindow(), szInitErrInFile, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - -// File header is stored in hi-lo order. Swap this into Intel order and save -// parameters in our native int size (32 bits) -// - ifs.dwFormat = (DWORD)WORDSWAP( Header.wFormat ); - ifs.dwTrackCount = (DWORD)WORDSWAP( Header.wTrackCount ); - ifs.dwTimeDivision = (DWORD)WORDSWAP( Header.wTimeDivision ); - -// We know how many tracks there are; allocate the structures for them and parse -// them. The parse merely looks at the MTrk signature and track chunk length -// in order to skip to the next track header. -// - ifs.pitsTracks = (PINTRACKSTATE)GlobalAllocPtr( GPTR, - ifs.dwTrackCount * sizeof(INTRACKSTATE)); - if( ifs.pitsTracks == NULL ) - { - MessageBox( GetActiveWindow(), szInitErrMem, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - - for( idx = 0, ptsTrack = ifs.pitsTracks; idx < ifs.dwTrackCount; - ++idx, ++ptsTrack ) - { - if(( ptsTrack->pTrackStart - = GlobalAllocPtr( GHND, TRACK_BUFFER_SIZE )) == NULL ) - { - MessageBox( GetActiveWindow(), szNoTrackBuffMem, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - - if( GetInFileData( &dwTag, sizeof(dwTag)) || ( dwTag != MTrk ) - || GetInFileData( &cbHeader, sizeof(cbHeader))) - { - MessageBox( GetActiveWindow(), szInitErrInFile, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - - cbHeader = DWORDSWAP( cbHeader ); - ptsTrack->dwTrackLength = cbHeader; // Total track length -/////////////////////////////////////////////////////////////////////////////// -// Here we need to determine if all track data will fit into a single one of -// our track buffers. If not, we need to read in a buffer full and come back -// for more later, saving the file offset to continue from and the amount left -// to read in the track structure. - - // Save the file offset of the beginning of this track - ptsTrack->foTrackStart = SetFilePointer( hInFile, 0, NULL, - FILE_CURRENT ); - - if( ptsTrack->dwTrackLength > TRACK_BUFFER_SIZE ) - dwToRead = TRACK_BUFFER_SIZE; - else - dwToRead = ptsTrack->dwTrackLength; - if( !ReadFile( hInFile, ptsTrack->pTrackStart, dwToRead, &cbRead, NULL ) - || ( cbRead != dwToRead )) - { - MessageBox( GetActiveWindow(), szInitErrInFile, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - // Save the number of bytes that didn't make it into the buffer - ptsTrack->dwLeftOnDisk = ptsTrack->dwTrackLength - cbRead; - ptsTrack->dwLeftInBuffer = cbRead; - // Save the current file offset so we can seek to it later - ptsTrack->foNextReadStart = SetFilePointer( hInFile, 0, - NULL, FILE_CURRENT ); - - // Setup pointer to the current position in the track - ptsTrack->pTrackCurrent = ptsTrack->pTrackStart; - ptsTrack->fdwTrack = 0; - ptsTrack->byRunningStatus = 0; - ptsTrack->tkNextEventDue = 0; - - // Handle bozo MIDI files which contain empty track chunks - // - if( !ptsTrack->dwLeftInBuffer && !ptsTrack->dwLeftOnDisk ) - { - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - continue; - } - - // We always preread the time from each track so the mixer code can - // determine which track has the next event with a minimum of work - // - if( GetTrackVDWord( ptsTrack, &ptsTrack->tkNextEventDue )) - { - MessageBox( GetActiveWindow(), szInitErrInFile, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Init_Cleanup; - } - // Step over any unread data, advancing to the beginning of the next - // track's data - SetFilePointer( hInFile, ptsTrack->foTrackStart + ptsTrack->dwTrackLength, - NULL, FILE_BEGIN ); - } // End of track initialization code - - fRet = FALSE; - - Init_Cleanup: - if( fRet ) - ConverterCleanup(); - - return( fRet ); - } - -// -// GetInFileData -// -// Gets the requested number of bytes of data from the input file and returns -// a pointer to them. -// -// Returns a pointer to the data or NULL if we'd read more than is -// there. -// -static BOOL GetInFileData( LPVOID lpDest, DWORD cbToGet ) - { - DWORD cbRead; - - if( !ReadFile( hInFile, lpDest, cbToGet, &cbRead, NULL ) - || ( cbRead != cbToGet )) - { - return( TRUE ); - } - - return( FALSE ); - } - - -// -// ConverterCleanup -// -// Free anything we ever allocated -// -void ConverterCleanup( void ) - { - DWORD idx; - - if( hInFile != INVALID_HANDLE_VALUE ) - { - CloseHandle( hInFile ); - hInFile = INVALID_HANDLE_VALUE; - } - - if( ifs.pitsTracks ) - { - // De-allocate all our track buffers - for( idx = 0; idx < ifs.dwTrackCount; idx++ ) - if( ifs.pitsTracks[idx].pTrackStart ) - GlobalFreePtr( ifs.pitsTracks[idx].pTrackStart ); - - GlobalFreePtr( ifs.pitsTracks ); - ifs.pitsTracks = NULL; - } - } - - -/*****************************************************************************/ -/* RewindConverter() */ -/* */ -/* This little function is an adaptation of the ConverterInit() code which */ -/* resets the tracks without closing and opening the file, thus reducing the */ -/* time it takes to loop back to the beginning when looping. */ -/*****************************************************************************/ -static BOOL RewindConverter( void ) - { - DWORD dwToRead, cbRead, idx; - BOOL fRet; - - PINTRACKSTATE ptsTrack; - - tkCurrentTime = 0; - - for( idx = 0, ptsTrack = ifs.pitsTracks; idx < ifs.dwTrackCount; - ++idx, ++ptsTrack ) - { -/////////////////////////////////////////////////////////////////////////////// -// Here we need to determine if all track data will fit into a single one of -// our track buffers. If not, we need to read in a buffer full and come back -// for more later, saving the file offset to continue from and the amount left -// to read in the track structure. - - SetFilePointer( hInFile, ptsTrack->foTrackStart, NULL, FILE_BEGIN ); - - if( ptsTrack->dwTrackLength > TRACK_BUFFER_SIZE ) - dwToRead = TRACK_BUFFER_SIZE; - else - dwToRead = ptsTrack->dwTrackLength; - if( !ReadFile( hInFile, ptsTrack->pTrackStart, dwToRead, &cbRead, NULL ) - || ( cbRead != dwToRead )) - { - MessageBox( GetActiveWindow(), szInitErrInFile, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Rewind_Cleanup; - } - // Save the number of bytes that didn't make it into the buffer - ptsTrack->dwLeftOnDisk = ptsTrack->dwTrackLength - cbRead; - ptsTrack->dwLeftInBuffer = cbRead; - // Save the current file offset so we can seek to it later - ptsTrack->foNextReadStart = SetFilePointer( hInFile, 0, - NULL, FILE_CURRENT ); - - // Setup pointer to the current position in the track - ptsTrack->pTrackCurrent = ptsTrack->pTrackStart; - ptsTrack->fdwTrack = 0; - ptsTrack->byRunningStatus = 0; - ptsTrack->tkNextEventDue = 0; - - - // Handle bozo MIDI files which contain empty track chunks - // - if( !ptsTrack->dwLeftInBuffer && !ptsTrack->dwLeftOnDisk ) - { - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - continue; - } - - // We always preread the time from each track so the mixer code can - // determine which track has the next event with a minimum of work - // - if( GetTrackVDWord( ptsTrack, &ptsTrack->tkNextEventDue )) - { - MessageBox( GetActiveWindow(), szInitErrInFile, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - goto Rewind_Cleanup; - } - // Step over any unread data, advancing to the beginning of the next - // track's data - SetFilePointer( hInFile, ptsTrack->foTrackStart + ptsTrack->dwTrackLength, - NULL, FILE_BEGIN ); - } // End of track initialization code - - fRet = FALSE; - - Rewind_Cleanup: - - if( fRet ) - return( TRUE ); - - return( FALSE ); - } - - -/*****************************************************************************/ -/* ConvertToBuffer() */ -/* */ -/* This function converts MIDI data from the track buffers setup by a */ -/* previous call to ConverterInit(). It will convert data until an error is */ -/* encountered or the output buffer has been filled with as much event data */ -/* as possible, not to exceed dwMaxLength. This function can take a couple */ -/* bit flags, passed through dwFlags. Information about the success/failure */ -/* of this operation and the number of output bytes actually converted will */ -/* be returned in the CONVERTINFO structure pointed at by lpciInfo. */ -/* */ -/*****************************************************************************/ -int ConvertToBuffer( DWORD dwFlags, LPCONVERTINFO lpciInfo ) - { - static INTRACKSTATE *ptsTrack, *ptsFound; - static DWORD dwStatus; - static DWORD tkNext; - static TEMPEVENT teTemp; - - int nChkErr; - DWORD idx; - - lpciInfo->dwBytesRecorded = 0; - - if( dwFlags & CONVERTF_RESET ) - { - dwProgressBytes = 0; - dwStatus = 0; - memset( &teTemp, 0, sizeof(TEMPEVENT)); - ptsTrack = ptsFound = NULL; - } - // If we were already done, then return with a warning... - if( dwStatus & CONVERTF_STATUS_DONE ) - { - if( bLooped ) - { - RewindConverter(); - dwProgressBytes = 0; - dwStatus = 0; - } - else - return( CONVERTERR_DONE ); - } - // The caller is asking us to continue, but we're already hosed because we - // previously identified something as corrupt, so complain louder this time. - else if( dwStatus & CONVERTF_STATUS_STUCK ) - { - return( CONVERTERR_STUCK ); - } - else if( dwStatus & CONVERTF_STATUS_GOTEVENT ) - { - // Turn off this bit flag - dwStatus ^= CONVERTF_STATUS_GOTEVENT; - - /* - * The following code for this case is duplicated from below, and is - * designed to handle a "straggler" event, should we have one left over - * from previous processing the last time this function was called. - */ - - // Don't add end of track event 'til we're done - // - if( teTemp.byShortData[0] == MIDI_META - && teTemp.byShortData[1] == MIDI_META_EOT ) - { - if( dwMallocBlocks ) - { - free( teTemp.pLongData ); - dwMallocBlocks--; - } - } - - else if(( nChkErr = AddEventToStreamBuffer( &teTemp, lpciInfo )) - != CONVERTERR_NOERROR ) - { - if( nChkErr == CONVERTERR_BUFFERFULL ) - { - // Do some processing and tell caller that this buffer's full - dwStatus |= CONVERTF_STATUS_GOTEVENT; - return( CONVERTERR_NOERROR ); - } - else if( nChkErr == CONVERTERR_METASKIP ) - { - // We skip by all meta events that aren't tempo changes... - } - else - { - DebugPrint( "Unable to add event to stream buffer." ); - if( dwMallocBlocks ) - { - free( teTemp.pLongData ); - dwMallocBlocks--; - } - return( TRUE ); - } - } - } - - for( ; ; ) - { - ptsFound = NULL; - tkNext = 0xFFFFFFFFL; - // Find nearest event due - // - for( idx = 0, ptsTrack = ifs.pitsTracks; idx < ifs.dwTrackCount; - ++idx, ++ptsTrack ) - { - if(( !( ptsTrack->fdwTrack & ITS_F_ENDOFTRK )) - && ( ptsTrack->tkNextEventDue < tkNext )) - { - tkNext = ptsTrack->tkNextEventDue; - ptsFound = ptsTrack; - } - } - - // None found? We must be done, so return to the caller with a smile. - // - if( !ptsFound ) - { - dwStatus |= CONVERTF_STATUS_DONE; - // Need to set return buffer members properly - return( CONVERTERR_NOERROR ); - } - - // Ok, get the event header from that track - // - if( GetTrackEvent( ptsFound, &teTemp )) - { - // Warn future calls that this converter is stuck at a corrupt spot - // and can't continue - dwStatus |= CONVERTF_STATUS_STUCK; - return( CONVERTERR_CORRUPT ); - } - - // Don't add end of track event 'til we're done - // - if( teTemp.byShortData[0] == MIDI_META - && teTemp.byShortData[1] == MIDI_META_EOT ) - { - if( dwMallocBlocks ) - { - free( teTemp.pLongData ); - dwMallocBlocks--; - } - continue; - } - - if(( nChkErr = AddEventToStreamBuffer( &teTemp, lpciInfo )) - != CONVERTERR_NOERROR ) - { - if( nChkErr == CONVERTERR_BUFFERFULL ) - { - // Do some processing and tell somebody this buffer is full... - dwStatus |= CONVERTF_STATUS_GOTEVENT; - return( CONVERTERR_NOERROR ); - } - else if( nChkErr == CONVERTERR_METASKIP ) - { - // We skip by all meta events that aren't tempo changes... - } - else - { - DebugPrint( "Unable to add event to stream buffer." ); - if( dwMallocBlocks ) - { - free( teTemp.pLongData ); - dwMallocBlocks--; - } - return( TRUE ); - } - } - } - - return( CONVERTERR_NOERROR ); - } - - -// -// GetTrackVDWord -// -// Attempts to parse a variable length DWORD from the given track. A VDWord -// in a MIDI file -// (a) is in lo-hi format -// (b) has the high bit set on every byte except the last -// -// Returns the DWORD in *lpdw and TRUE on success; else -// FALSE if we hit end of track first. Sets ITS_F_ENDOFTRK -// if we hit end of track. -// -static BOOL GetTrackVDWord( PINTRACKSTATE ptsTrack, LPDWORD lpdw ) - { - BYTE byByte; - DWORD dw = 0; - - if( ptsTrack->fdwTrack & ITS_F_ENDOFTRK ) - return( TRUE ); - - do - { - if( !ptsTrack->dwLeftInBuffer && !ptsTrack->dwLeftOnDisk ) - { - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - return( TRUE ); - } - - if( GetTrackByte( ptsTrack, &byByte )) - return( TRUE ); - - dw = ( dw << 7 ) | ( byByte & 0x7F ); - } while( byByte & 0x80 ); - - *lpdw = dw; - - return( FALSE ); - } - - -// -// GetTrackEvent -// -// Fills in the event struct with the next event from the track -// -// pteTemp->tkEvent will contain the absolute tick time of the event -// pteTemp->byShortData[0] will contain -// MIDI_META if the event is a meta event; -// in this case pteTemp->byShortData[1] will contain the meta class -// MIDI_SYSEX or MIDI_SYSEXEND if the event is a SysEx event -// Otherwise, the event is a channel message and pteTemp->byShortData[1] -// and pteTemp->byShortData[2] will contain the rest of the event. -// -// pteTemp->dwEventLength will contain -// The total length of the channel message in pteTemp->byShortData if -// the event is a channel message -// The total length of the paramter data pointed to by -// pteTemp->pLongData otherwise -// -// pteTemp->pLongData will point at any additional paramters if the -// event is a SysEx or meta event with non-zero length; else -// it will contain NULL -// -// Returns FALSE on success or TRUE on any kind of parse error -// Prints its own error message ONLY in the debug version -// -// Maintains the state of the input track (i.e. ptsTrack->dwLeftInBuffer, -// ptsTrack->pTrackPointers, and ptsTrack->byRunningStatus). -// -static BOOL GetTrackEvent( INTRACKSTATE *ptsTrack, PTEMPEVENT pteTemp ) - { - DWORD idx; - BYTE byByte; - UINT dwEventLength; - - // Clear out the temporary event structure to get rid of old data... - memset( pteTemp, 0, sizeof(TEMPEVENT)); - - // Already at end of track? There's nothing to read. - // - if(( ptsTrack->fdwTrack & ITS_F_ENDOFTRK ) - || ( !ptsTrack->dwLeftInBuffer && !ptsTrack->dwLeftOnDisk )) - return( TRUE ); - - // Get the first byte, which determines the type of event. - // - if( GetTrackByte( ptsTrack, &byByte )) - return( TRUE ); - - // If the high bit is not set, then this is a channel message - // which uses the status byte from the last channel message - // we saw. NOTE: We do not clear running status across SysEx or - // meta events even though the spec says to because there are - // actually files out there which contain that sequence of data. - // - if( !( byByte & 0x80 )) - { - // No previous status byte? We're hosed. - if( !ptsTrack->byRunningStatus ) - { - TRACKERR(ptsTrack, gteBadRunStat); - return( TRUE ); - } - - pteTemp->byShortData[0] = ptsTrack->byRunningStatus; - pteTemp->byShortData[1] = byByte; - - byByte = pteTemp->byShortData[0] & 0xF0; - pteTemp->dwEventLength = 2; - - // Only program change and channel pressure events are 2 bytes long; - // the rest are 3 and need another byte - // - if(( byByte != MIDI_PRGMCHANGE ) && ( byByte != MIDI_CHANPRESS )) - { - if( !ptsTrack->dwLeftInBuffer && !ptsTrack->dwLeftOnDisk ) - { - TRACKERR( ptsTrack, gteRunStatMsgTrunc ); - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - return( TRUE ); - } - - if( GetTrackByte( ptsTrack, &pteTemp->byShortData[2] )) - return( TRUE ); - ++pteTemp->dwEventLength; - } - } - else if(( byByte & 0xF0 ) != MIDI_SYSEX ) - { - // Not running status, not in SysEx range - must be - // normal channel message (0x80-0xEF) - // - pteTemp->byShortData[0] = byByte; - ptsTrack->byRunningStatus = byByte; - - // Strip off channel and just keep message type - // - byByte &= 0xF0; - - dwEventLength = ( byByte == MIDI_PRGMCHANGE || byByte == MIDI_CHANPRESS ) ? 1 : 2; - pteTemp->dwEventLength = dwEventLength + 1; - - if(( ptsTrack->dwLeftInBuffer + ptsTrack->dwLeftOnDisk ) < dwEventLength ) - { - TRACKERR( ptsTrack, gteChanMsgTrunc ); - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - return( TRUE ); - } - - if( GetTrackByte( ptsTrack, &pteTemp->byShortData[1] )) - return( TRUE ); - if( dwEventLength == 2 ) - if( GetTrackByte( ptsTrack, &pteTemp->byShortData[2] )) - return( TRUE ); - } - else if(( byByte == MIDI_SYSEX ) || ( byByte == MIDI_SYSEXEND )) - { - // One of the SysEx types. (They are the same as far as we're concerned; - // there is only a semantic difference in how the data would actually - // get sent when the file is played. We must take care to put the proper - // event type back on the output track, however.) - // - // Parse the general format of: - // BYTE bEvent (MIDI_SYSEX or MIDI_SYSEXEND) - // VDWORD cbParms - // BYTE abParms[cbParms] - // - pteTemp->byShortData[0] = byByte; - if( GetTrackVDWord( ptsTrack, &pteTemp->dwEventLength )) - { - TRACKERR( ptsTrack, gteSysExLenTrunc ); - return( TRUE ); - } - - if(( ptsTrack->dwLeftInBuffer + ptsTrack->dwLeftOnDisk ) - < pteTemp->dwEventLength ) - { - TRACKERR( ptsTrack, gteSysExTrunc ); - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - return( TRUE ); - } - - // Malloc a temporary memory block to hold the parameter data - if(( pteTemp->pLongData = malloc( pteTemp->dwEventLength )) == NULL ) - { - TRACKERR( ptsTrack, gteNoMem ); - return( TRUE ); - } - // Copy from the input buffer to the parameter data buffer - for( idx = 0; idx < pteTemp->dwEventLength; idx++ ) - if( GetTrackByte( ptsTrack, pteTemp->pLongData + idx )) - { - TRACKERR( ptsTrack, gteSysExTrunc ); - return( TRUE ); - } - // Increment our counter, which tells the program to look around for - // a malloc block to free, should it need to exit or reset before the - // block would normally be freed - dwMallocBlocks++; - } - else if( byByte == MIDI_META ) - { - // It's a meta event. Parse the general form: - // BYTE bEvent (MIDI_META) - // BYTE bClass - // VDWORD cbParms - // BYTE abParms[cbParms] - // - pteTemp->byShortData[0] = byByte; - - if( !ptsTrack->dwLeftInBuffer && !ptsTrack->dwLeftOnDisk ) - { - TRACKERR(ptsTrack, gteMetaNoClass ); - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - return( TRUE ); - } - - if( GetTrackByte( ptsTrack, &pteTemp->byShortData[1] )) - return( TRUE ); - - if( GetTrackVDWord( ptsTrack, &pteTemp->dwEventLength )) - { - TRACKERR( ptsTrack, gteMetaLenTrunc ); - return( TRUE ); - } - - // NOTE: It's perfectly valid to have a meta with no data - // In this case, dwEventLength == 0 and pLongData == NULL - // - if( pteTemp->dwEventLength ) - { - if(( ptsTrack->dwLeftInBuffer + ptsTrack->dwLeftOnDisk ) - < pteTemp->dwEventLength ) - { - TRACKERR( ptsTrack, gteMetaTrunc ); - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - return( TRUE ); - } - - // Malloc a temporary memory block to hold the parameter data - if(( pteTemp->pLongData = malloc( pteTemp->dwEventLength )) - == NULL ) - { - TRACKERR( ptsTrack, gteNoMem ); - return( TRUE ); - } - // Copy from the input buffer to the parameter data buffer - for( idx = 0; idx < pteTemp->dwEventLength; idx++ ) - if( GetTrackByte( ptsTrack, pteTemp->pLongData + idx )) - { - TRACKERR( ptsTrack, gteMetaTrunc ); - return( TRUE ); - } - // Increment our counter, which tells the program to look around for - // a malloc block to free, should it need to exit or reset before the - // block would normally be freed - dwMallocBlocks++; - } - - if( pteTemp->byShortData[1] == MIDI_META_EOT ) - ptsTrack->fdwTrack |= ITS_F_ENDOFTRK; - } - else - { - // Messages in this range are system messages and aren't supposed to - // be in a normal MIDI file. If they are, we've either misparsed or the - // authoring software is stupid. - // - return( TRUE ); - } - - // Event time was already stored as the current track time - // - pteTemp->tkEvent = ptsTrack->tkNextEventDue; - - // Now update to the next event time. The code above MUST properly - // maintain the end of track flag in case the end of track meta is - // missing. NOTE: This code is a continuation of the track event - // time pre-read which is done at the end of track initialization. - // - if( !( ptsTrack->fdwTrack & ITS_F_ENDOFTRK )) - { - DWORD tkDelta; - - if( GetTrackVDWord( ptsTrack, &tkDelta )) - return( TRUE ); - - ptsTrack->tkNextEventDue += tkDelta; - } - - return( FALSE ); - } - - -// -// GetTrackByte -// -// Retrieve the next byte from the track buffer, refilling the buffer from -// disk if necessary. -// -static BOOL GetTrackByte( PINTRACKSTATE ptsTrack, LPBYTE lpbyByte ) - { - if( !ptsTrack->dwLeftInBuffer ) - { - if( RefillTrackBuffer( ptsTrack )) - return( TRUE ); - } - - *lpbyByte = *ptsTrack->pTrackCurrent++; - ptsTrack->dwLeftInBuffer--; - return( FALSE ); - } - - -// -// RefillTrackBuffer() -// -// This function attempts to read in a buffer-full of data for a MIDI track. -// -BOOL RefillTrackBuffer( PINTRACKSTATE ptsTrack ) - { - DWORD dwBytesRead, dwResult; - BOOL bResult; - - if( ptsTrack->dwLeftOnDisk ) - { - ptsTrack->pTrackCurrent = ptsTrack->pTrackStart; - - // Seek to the proper place in the file, indicated by - // ptsTrack->foNextReadStart and read in the remaining data, - // up to a maximum of the buffer size. - - if(( dwResult = SetFilePointer( hInFile, - (long)ptsTrack->foNextReadStart, - 0L, FILE_BEGIN )) == 0xFFFFFFFF ) - { - MessageBox( GetActiveWindow(), - "Unable to seek to track buffer location in RefillTrackBuffer()!!", - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - return( TRUE ); - } - if( ptsTrack->dwLeftOnDisk > TRACK_BUFFER_SIZE ) - ptsTrack->dwLeftInBuffer = TRACK_BUFFER_SIZE; - else - ptsTrack->dwLeftInBuffer = ptsTrack->dwLeftOnDisk; - bResult = ReadFile( hInFile, ptsTrack->pTrackStart, - ptsTrack->dwLeftInBuffer, - &dwBytesRead, NULL ); - - ptsTrack->dwLeftOnDisk -= dwBytesRead; - ptsTrack->foNextReadStart = dwResult + dwBytesRead; - ptsTrack->dwLeftInBuffer = dwBytesRead; - - if( !bResult || ( bResult && !dwBytesRead ) - || ( bResult && dwBytesRead != ptsTrack->dwLeftInBuffer )) - { - MessageBox( GetActiveWindow(), - "Read operation failed prematurely!!", - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - ptsTrack->dwLeftInBuffer = dwBytesRead; - return( TRUE ); - } - else - return( FALSE ); - } - - return( TRUE ); - } - - -// -// AddEventToStreamBuffer -// -// Put the given event into the given stream buffer at the given location -// pteTemp must point to an event filled out in accordance with the -// description given in GetTrackEvent -// -// Returns FALSE on sucess or TRUE on an error condition -// Handles its own error notification by displaying to the appropriate -// output device (either our debugging window, or the screen). -// -static int AddEventToStreamBuffer( PTEMPEVENT pteTemp, CONVERTINFO *lpciInfo ) - { - DWORD tkNow, tkDelta; - MIDIEVENT *pmeEvent; - - pmeEvent = (MIDIEVENT *)( lpciInfo->mhBuffer.lpData - + lpciInfo->dwStartOffset - + lpciInfo->dwBytesRecorded ); - - // When we see a new, empty buffer, set the start time on it... - if( !lpciInfo->dwBytesRecorded ) - lpciInfo->tkStart = tkCurrentTime; - - // Use the above set start time to figure out how much longer we should fill - // this buffer before officially declaring it as "full" - if( tkCurrentTime - lpciInfo->tkStart > dwBufferTickLength ) - if( lpciInfo->bTimesUp ) - { - lpciInfo->bTimesUp = FALSE; - return( CONVERTERR_BUFFERFULL ); - } - else - lpciInfo->bTimesUp = TRUE; - - tkNow = tkCurrentTime; - - // Delta time is absolute event time minus absolute time - // already gone by on this track - tkDelta = pteTemp->tkEvent - tkCurrentTime; - - // Event time is now current time on this track - tkCurrentTime = pteTemp->tkEvent; - - if( bInsertTempo ) - { - bInsertTempo = FALSE; - - if( lpciInfo->dwMaxLength-lpciInfo->dwBytesRecorded < 3*sizeof(DWORD)) - { - // Cleanup from our write operation - return( CONVERTERR_BUFFERFULL ); - } - if( dwCurrentTempo ) - { - pmeEvent->dwDeltaTime = 0; - pmeEvent->dwStreamID = 0; - pmeEvent->dwEvent = ( dwCurrentTempo * 100 ) / dwTempoMultiplier; - pmeEvent->dwEvent |= (((DWORD)MEVT_TEMPO ) << 24 ) | MEVT_F_SHORT; - - lpciInfo->dwBytesRecorded += 3 * sizeof(DWORD); - pmeEvent += 3 * sizeof(DWORD); - } - } - - if( pteTemp->byShortData[0] < MIDI_SYSEX ) - { - // Channel message. We know how long it is, just copy it. - // Need 3 DWORD's: delta-t, stream-ID, event - if( lpciInfo->dwMaxLength-lpciInfo->dwBytesRecorded < 3*sizeof(DWORD)) - { - // Cleanup from our write operation - return( CONVERTERR_BUFFERFULL ); - } - - pmeEvent->dwDeltaTime = tkDelta; - pmeEvent->dwStreamID = 0; - pmeEvent->dwEvent = ( pteTemp->byShortData[0] ) - | (((DWORD)pteTemp->byShortData[1] ) << 8 ) - | (((DWORD)pteTemp->byShortData[2] ) << 16 ) - | MEVT_F_SHORT; - - if((( pteTemp->byShortData[0] & 0xF0) == MIDI_CTRLCHANGE ) - && ( pteTemp->byShortData[1] == MIDICTRL_VOLUME )) - { - // If this is a volume change, generate a callback so we can grab - // the new volume for our cache - pmeEvent->dwEvent |= MEVT_F_CALLBACK; - } - lpciInfo->dwBytesRecorded += 3 *sizeof(DWORD); - } - else if(( pteTemp->byShortData[0] == MIDI_SYSEX ) - || ( pteTemp->byShortData[0] == MIDI_SYSEXEND )) - { - DebugPrint( "AddEventToStreamBuffer: Ignoring SysEx event." ); - if( dwMallocBlocks ) - { - free( pteTemp->pLongData ); - dwMallocBlocks--; - } - } - else - { - // Better be a meta event. - // BYTE byEvent - // BYTE byEventType - // VDWORD dwEventLength - // BYTE pLongEventData[dwEventLength] - // - assert( pteTemp->byShortData[0] == MIDI_META ); - - // The only meta-event we care about is change tempo - // - if( pteTemp->byShortData[1] != MIDI_META_TEMPO ) - { - if( dwMallocBlocks ) - { - free( pteTemp->pLongData ); - dwMallocBlocks--; - } - return( CONVERTERR_METASKIP ); - } - - // We should have three bytes of parameter data... - assert( pteTemp->dwEventLength == 3 ); - - // Need 3 DWORD's: delta-t, stream-ID, event data - if( lpciInfo->dwMaxLength - lpciInfo->dwBytesRecorded < 3 *sizeof(DWORD)) - { - // Cleanup the temporary event if necessary and return - if( dwMallocBlocks ) - { - free( pteTemp->pLongData ); - dwMallocBlocks--; - } - return( CONVERTERR_BUFFERFULL ); - } - - pmeEvent->dwDeltaTime = tkDelta; - pmeEvent->dwStreamID = 0; - // Note: this is backwards from above because we're converting a single - // data value from hi-lo to lo-hi format... - pmeEvent->dwEvent = ( pteTemp->pLongData[2] ) - | (((DWORD)pteTemp->pLongData[1] ) << 8 ) - | (((DWORD)pteTemp->pLongData[0] ) << 16 ); - - /* This next step has absolutely nothing to do with the conversion of a - * MIDI file to a stream, it's simply put here to add the functionality - * of the tempo slider. If you don't need this, be sure to remove the - * next two lines. - */ - dwCurrentTempo = pmeEvent->dwEvent; - pmeEvent->dwEvent = (pmeEvent->dwEvent * 100 ) / dwTempoMultiplier; - - pmeEvent->dwEvent |= (((DWORD)MEVT_TEMPO ) << 24 ) | MEVT_F_SHORT; - - dwBufferTickLength = ( ifs.dwTimeDivision * 1000 * BUFFER_TIME_LENGTH ) / dwCurrentTempo; - wsprintf( szTemp, "dwBufferTickLength = %lu", dwBufferTickLength ); - DebugPrint( szTemp ); - - if( dwMallocBlocks ) - { - free( pteTemp->pLongData ); - dwMallocBlocks--; - } - lpciInfo->dwBytesRecorded += 3 *sizeof(DWORD); - } - - return( FALSE ); - } - - -#ifdef DEBUG -static void ShowTrackError( PINTRACKSTATE ptsTrack, LPSTR lpszErr ) - { - wsprintf( szTemp, "Track buffer offset %lu", - (DWORD)(ptsTrack->pTrackCurrent - ptsTrack->pTrackStart)); - DebugPrint( szTemp ); - wsprintf( szTemp, "Track total %lu Track left %lu", - ptsTrack->dwTrackLength, ptsTrack->dwLeftInBuffer ); - DebugPrint( szTemp ); - } - -#endif - diff --git a/sdk/samples/mstream/mstream.c b/sdk/samples/mstream/mstream.c deleted file mode 100644 index ab5daa1..0000000 --- a/sdk/samples/mstream/mstream.c +++ /dev/null @@ -1,925 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: mstream.c - * Content: Illustrates streaming data from a disk MIDI file to a - * MIDI stream buffer for playback. - * - ***************************************************************************/ -#include -#include -#include -#include -#include - -#include "resource.h" -#include "debug.h" -#include "midstuff.h" -#include "mstream.h" - -////////////////////////////////////////////////////////////////////////////// -// Lots of global variables - -char szAppClass[] = "MStreamWndClass"; -char szAppName[] = "MStream"; - -char szAppTitle[64]; -char szAppCaption[64]; -char szOpenFilter[128]; -char szOpenDLGTitle[64]; -char szProgress[64]; -char szTempo[64]; -char szVolume[64]; - -char szTemp[256]; -char szDebug[256]; -char szFileBuffer[MAX_PATH]; -char szFileTitle[MAX_PATH]; - -HWND hWndMain, hWndProgText, hWndProg, hWndVolText, hWndVol, hWndTempoText; -HWND hWndTempo, hWndLoopCheck, hWndPlay, hWndPause, hWndStop; - -HINSTANCE hInst; - -BOOL bFileOpen = FALSE, bPlaying = FALSE, bBuffersPrepared = FALSE; -BOOL bPaused = FALSE, bLooped = FALSE; -UINT uMIDIDeviceID = MIDI_MAPPER, uCallbackStatus; -int nTextControlHeight, nCurrentBuffer, nEmptyBuffers; -DWORD dwBufferTickLength, dwTempoMultiplier, dwCurrentTempo, dwProgressBytes; -DWORD dwVolumePercent, dwVolCache[NUM_CHANNELS]; - -HMIDISTRM hStream; -CONVERTINFO ciStreamBuffers[NUM_STREAM_BUFFERS]; - -// Private to this module... -static HANDLE hBufferReturnEvent; - -// From another module... -extern INFILESTATE ifs; - -/////////////////////////////////////////////////////////////////////////////// -// Module-scope function declarations - -static BOOL InitApp( HINSTANCE ); -static BOOL InitInstance( HINSTANCE, int ); -static void FreeBuffers( void ); - -/****************************************************************************** - * WinMain() - * - * Entry point for all Windows programs - performs initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) - { - MSG msg; - - hInst = hInstance; - - /* Make sure the common controls are loaded for our use */ - InitCommonControls(); - -// Turn debugging output on or off -#ifdef DEBUG - DbgInitialize( TRUE ); -#else - DbgInitialize( FALSE ); -#endif - - if( !hPrevInstance ) - if( !InitApp( hInstance )) - { - ErrorMessageBox( IDS_ERROR_APPINIT, MB_ICONSTOP ); - return( FALSE ); - } - - if( !InitInstance( hInstance, nCmdShow )) - { - ErrorMessageBox( IDS_ERROR_INSTANCEINIT, MB_ICONSTOP ); - return( FALSE ); - } - - while( GetMessage((LPMSG)&msg, NULL, 0, 0 )) - { - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } - - UnregisterClass( szAppClass, hInstance ); - return( msg.wParam ); - } /* End of WinMain() */ - - -/*****************************************************************************/ -/* InitApp() */ -/* */ -/* Inits things that only need to be created once for the this application */ -/* (like creating the window class). */ -/*****************************************************************************/ -static BOOL InitApp( HINSTANCE hInstance ) - { - WNDCLASS wc; - - /* Set up and register a window class */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpszClassName = szAppClass; - wc.lpfnWndProc = (WNDPROC)MainWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof( DWORD ); - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON3 )); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)( COLOR_WINDOW ); - wc.lpszMenuName = MAKEINTRESOURCE( IDR_MAINMENU ); - - if( !RegisterClass( &wc )) - { - ErrorMessageBox( IDS_ERROR_REGISTERCLASS, MB_ICONSTOP ); - return( FALSE ); - } - return( TRUE ); - } /* End of InitApp() */ - - -/*****************************************************************************/ -/* InitInstance() */ -/* */ -/* Performs initialization that must be done for each application instance. */ -/* */ -/*****************************************************************************/ -static BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) - { - HWND hWnd; - RECT crect; - UINT uCharsRead; - MMRESULT mmrRetVal; - - LoadString( hInstance, IDS_APP_TITLE, szAppTitle, sizeof(szAppTitle)); - LoadString( hInstance, IDS_APP_CAPTION, szAppCaption, sizeof(szAppCaption)); - LoadString( hInstance, IDS_TBTITLE_VOLUME, szVolume, sizeof(szVolume)); - LoadString( hInstance, IDS_TBTITLE_TEMPO, szTempo, sizeof(szTempo)); - LoadString( hInstance, IDS_TBTITLE_PROGRESS, - szProgress, sizeof(szProgress)); - LoadString( hInstance, IDS_OPEN_DLGTITLE, - szOpenDLGTitle, sizeof(szOpenDLGTitle)); -/* This is a little trick designed to allow us to load a common dialog box - * filter string, which is really a concatentation of several NULL-terminated - * strings. Note that while is is possible to enter something else into the - * resource as placeholders for the NULL characters, this has the undesireable - * effect of forcing us to search-and-replace byte-by-byte and doesn't make it - * as easy to internationalize our strings... - */ - memset( szOpenFilter, 0, sizeof(szOpenFilter)); - uCharsRead = LoadString( hInstance, IDS_OPEN_FILTER1, - szOpenFilter, sizeof(szOpenFilter)) + 1; - uCharsRead += LoadString( hInstance, IDS_OPEN_FILTER2, - &szOpenFilter[uCharsRead], - sizeof(szOpenFilter) - uCharsRead ) + 1; - uCharsRead += LoadString( hInstance, IDS_OPEN_FILTER3, - &szOpenFilter[uCharsRead], - sizeof(szOpenFilter) - uCharsRead ) + 1; - LoadString( hInstance, IDS_OPEN_FILTER4, - &szOpenFilter[uCharsRead], - sizeof(szOpenFilter) - uCharsRead ); - - /* Create an application window */ - hWnd = CreateWindow( szAppClass, /* class name */ - szAppCaption, /* caption for window */ - WS_OVERLAPPEDWINDOW, /* style */ - CW_USEDEFAULT, /* x position */ - CW_USEDEFAULT, /* y position */ - CW_USEDEFAULT, /* width */ - CW_USEDEFAULT, /* height */ - NULL, /* parent window */ - NULL, /* menu */ - hInstance, /* instance */ - NULL ); /* parms */ - - if( !hWnd ) - { - ErrorMessageBox( IDS_ERROR_MAINWNDCREATE, MB_ICONSTOP ); - return( FALSE ); - } - - hWndMain = hWnd; - GetClientRect( hWndMain, &crect ); - - /* Create some controls for things like volume, tempo, progress, etc. */ - if( CreateChildren( crect )) - return( FALSE ); - - // Resize window, now that we know the height of the static text controls - SetWindowPos( hWnd, NULL, 0, 0, - 2 * BORDER_SPACE_CX + TEMPO_TB_CX + 2 * CONTROL_SPACE_CX - + VOL_TB_CX + CHECK_CX, - 2 * BORDER_SPACE_CY + nTextControlHeight + TEXT_SPACE_CY - + CONTROL_SPACE_CY + BUTTON_CY + TEMPO_TB_CY, - SWP_NOMOVE | SWP_NOZORDER ); - - ShowWindow( hWnd, nCmdShow ); - UpdateWindow( hWnd ); - - if(( mmrRetVal = midiStreamOpen( &hStream, - &uMIDIDeviceID, - (DWORD)1, (DWORD)MidiProc, - (DWORD)0, - CALLBACK_FUNCTION )) != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - return( FALSE ); - } - - return( TRUE ); - } /* End of InitInstance() */ - - -/****************************************************************************/ -/* MainWindowProc() */ -/* */ -/* Messages for our main window are handled here */ -/* */ -/****************************************************************************/ -LRESULT CALLBACK MainWindowProc( HWND hWnd, unsigned uMsg, - WPARAM wParam, LPARAM lParam ) - { - LPMINMAXINFO lpMinMax; - DWORD dwCDErr = 0; - BOOL bResult = FALSE; - MMRESULT mmrRetVal; - - switch( uMsg ) - { - case WM_CREATE: - hBufferReturnEvent = CreateEvent( NULL, FALSE, - FALSE, "Wait For Buffer Return" ); - break; - - case WM_MSTREAM_UPDATEVOLUME: - SetChannelVolume( wParam, dwVolumePercent ); - break; - - case WM_MSTREAM_PROGRESS: - /* Set the Progress text */ - wsprintf( szTemp, "%s: %lu bytes", szProgress, dwProgressBytes ); - Static_SetText( hWndProgText, szTemp ); - break; - - case WM_COMMAND: - switch( LOWORD( wParam )) - { - case IDM_FILE_OPEN: - { - OPENFILENAME ofn; - /* - * Clear out and fill in an OPENFILENAME structure in preparation - * for creating a common dialog box to open a file. - */ - memset( &ofn, 0, sizeof(OPENFILENAME)); - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hWnd; - ofn.hInstance = hInst; - ofn.lpstrFilter = szOpenFilter; - ofn.nFilterIndex = 1; - szFileBuffer[0] = '\0'; - ofn.lpstrFile = szFileBuffer; - ofn.nMaxFile = sizeof(szFileBuffer); - ofn.lpstrFileTitle = szFileTitle; - ofn.nMaxFileTitle = sizeof(szFileTitle); - ofn.lpstrDefExt = "MID"; - ofn.lpstrTitle = szOpenDLGTitle; - ofn.Flags = OFN_FILEMUSTEXIST; - - bResult = GetOpenFileName( &ofn ); /* Do the dialog box */ - - /* - * A return of TRUE indicates that the user did not select a filename. - * The possible reasons are: Cancel was clicked, or an error occured. - * If Cancel was clicked, the CommDlgExtendedError() function will not - * return a valid code. For anything else, an error code will come back. - */ - if( bResult == FALSE ) - { - dwCDErr = CommDlgExtendedError(); - if( dwCDErr ) - { - /* Handle a common dialog box error */ - HandleCommDlgError( dwCDErr ); - } - else /* Clicked Cancel, so finish msg processing */ - return( 0 ); - } - else - { - if( bFileOpen ) - { -// Need to close the previous file before we open a new one. The best way to -// do this is by faking a menu command, so that we only have the actual code in -// one place and it can easily be changed. - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDM_FILE_CLOSE, 0 ), 0L ); - } - - if( StreamBufferSetup()) - { - // Error opening the MIDI file so abort - // The function already took care of notification - break; - } - else - { - bFileOpen = TRUE; - EnableWindow( hWndPlay, TRUE ); - BuildTitleBarText(); - } - } - } - break; - - case IDM_FILE_CLOSE: - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDC_STOP, - MSTREAM_STOPF_NOREOPEN ), 0L ); - BuildTitleBarText(); - break; - - case IDM_HELP_ABOUT: - DialogBox( hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWndMain, - (DLGPROC)DLG_About ); - break; - - case IDM_ACTIONS_PAUSE: - case IDC_PAUSE: - if( bPaused ) - midiStreamRestart( hStream ); - else - midiStreamPause( hStream ); - bPaused = !bPaused; - // If we're paused, the title bar will show (Paused) - BuildTitleBarText(); - break; - - case IDM_ACTIONS_LOOPED: - case IDC_LOOPCHECK: - Button_SetCheck( hWndLoopCheck, !bLooped ); - bLooped = !bLooped; - break; - - case IDM_ACTIONS_PLAY: - case IDC_PLAY: - // Clicking play while playback is paused will un-pause it - if( bPaused ) - { - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDC_PAUSE, 0 ), 0L ); - break; - } - // Clicking play while playing will restart from scratch - if( bPlaying ) - { - // Stop the file, allowing it to bve reset so that we - // can start it over again from the beginning - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDC_STOP, 0 ), 0L ); - } - - if( bFileOpen ) - { - // Clear the status of our callback so it will handle - // MOM_DONE callbacks once more - uCallbackStatus = 0; - if(( mmrRetVal = midiStreamRestart( hStream )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - break; - } - } - else - { - bPlaying = FALSE; - break; - } - - bPlaying = TRUE; - EnableWindow( hWndPause, TRUE ); - EnableWindow( hWndStop, TRUE ); - break; - - case IDM_ACTIONS_STOP: - case IDC_STOP: - if( bFileOpen || bPlaying - || ( uCallbackStatus != STATUS_CALLBACKDEAD )) - { - EnableWindow( hWndStop, FALSE ); - EnableWindow( hWndPause, FALSE ); - bPlaying = bPaused = FALSE; - if( uCallbackStatus != STATUS_CALLBACKDEAD && uCallbackStatus != STATUS_WAITINGFOREND ) - uCallbackStatus = STATUS_KILLCALLBACK; - - if(( mmrRetVal = midiStreamStop( hStream )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - break; - } - if(( mmrRetVal = midiOutReset( (HMIDIOUT)hStream )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - break; - } -// Wait for the callback thread to release this thread, which it will do by -// calling SetEvent() once all buffers are returned to it - if( WaitForSingleObject( hBufferReturnEvent, - DEBUG_CALLBACK_TIMEOUT ) - == WAIT_TIMEOUT ) - { -// Note, this is a risky move because the callback may be genuinely busy, but -// when we're debugging, it's safer and faster than freezing the application, -// which leaves the MIDI device locked up and forces a system reset... - DebugPrint( "Timed out waiting for MIDI callback" ); - uCallbackStatus = STATUS_CALLBACKDEAD; - } - } - - if( uCallbackStatus == STATUS_CALLBACKDEAD ) - { - uCallbackStatus = 0; - if( bFileOpen ) - { - ConverterCleanup(); - FreeBuffers(); - if( hStream ) - { - if(( mmrRetVal = midiStreamClose( hStream )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - } - hStream = NULL; - } - - EnableWindow( hWndPlay, FALSE ); - bFileOpen = FALSE; - } - - if(!( HIWORD(wParam) & MSTREAM_STOPF_NOREOPEN )) - { - if( StreamBufferSetup()) - { - // Error setting up for MIDI file - // Notification is already taken care of... - break; - } - else - { - bFileOpen = TRUE; - EnableWindow( hWndPlay, TRUE ); - } - } - BuildTitleBarText(); // Update the title bar - } - break; - - case IDM_FILE_EXIT: - DestroyWindow( hWnd ); - break; - } - break; - - case WM_INITMENU: - if( bFileOpen ) - { - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_PLAY, - MF_BYCOMMAND | MF_ENABLED ); - EnableMenuItem( GetMenu( hWnd ), IDM_FILE_CLOSE, - MF_BYCOMMAND | MF_ENABLED ); - } - else - { - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_PLAY, - MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( GetMenu( hWnd ), IDM_FILE_CLOSE, - MF_BYCOMMAND | MF_GRAYED ); - } - if( bLooped ) - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_LOOPED, - MF_BYCOMMAND | MF_ENABLED ); - else - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_LOOPED, - MF_BYCOMMAND | MF_GRAYED ); - if( bPlaying ) - { - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_PAUSE, - MF_BYCOMMAND | MF_ENABLED ); - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_STOP, - MF_BYCOMMAND | MF_ENABLED ); - } - else - { - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_PAUSE, - MF_BYCOMMAND | MF_GRAYED ); - EnableMenuItem( GetMenu( hWnd ), IDM_ACTIONS_STOP, - MF_BYCOMMAND | MF_GRAYED ); - } - break; - - case WM_GETMINMAXINFO: - /* - * We know exactly how big this window should be, and it's sort of a - * little pop-up control panel, so we can disable window sizing by - * forcing all the minimum and maximum sizes to be the calculated size. - */ - lpMinMax = (LPMINMAXINFO)lParam; - - lpMinMax->ptMaxSize.x = 2*CONTROL_SPACE_CX + 2*BORDER_SPACE_CX - + CHECK_CX + TEMPO_TB_CX + VOL_TB_CX - + 2*GetSystemMetrics( SM_CXBORDER ); - lpMinMax->ptMaxSize.y = 2*(BORDER_SPACE_CY - + GetSystemMetrics( SM_CYBORDER )) - + TEXT_SPACE_CY + nTextControlHeight - + TEMPO_TB_CY + BUTTON_CY - + CONTROL_SPACE_CY - + GetSystemMetrics( SM_CYMENU ) - + GetSystemMetrics( SM_CYCAPTION ); - - lpMinMax->ptMinTrackSize.x = lpMinMax->ptMaxTrackSize.x - = lpMinMax->ptMaxSize.x; - - lpMinMax->ptMinTrackSize.y = lpMinMax->ptMaxTrackSize.y - = lpMinMax->ptMaxSize.y; - break; - - case WM_HSCROLL: - if(((HWND)lParam == hWndTempo) && bFileOpen ) - { - HandleTempoScroll( (int)LOWORD(wParam), (int)HIWORD(wParam)); - } - else if(((HWND)lParam == hWndVol) && bFileOpen ) - { - HandleVolScroll( (int)LOWORD(wParam), (int)HIWORD(wParam)); - } - break; - - case WM_ENDSESSION: - // If the sesson is ending, we need to do our WM_DESTROY processing - if (!wParam) break; - // NOTE!!! we are falling through to the WM_CLOSE processing. - case WM_DESTROY: - // Stop anything that might be playing and send a flag which will - // tell the code not to automatically reload the file for replay. - if( hStream ) - SendMessage( hWnd, WM_COMMAND, - MAKEWPARAM( IDC_STOP, MSTREAM_STOPF_NOREOPEN ), 0 ); - - FreeBuffers(); - - if( hStream ) - { - if(( mmrRetVal = midiStreamClose( hStream )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - } - hStream = NULL; - } - - CloseHandle( hBufferReturnEvent ); - - PostQuitMessage( 0 ); - break; - - default: - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - } - return 0L; - } /* MainWindowProc */ - - -/*****************************************************************************/ -/* DLG_About() */ -/* */ -/* Dialog procedure for the Help...About... box which simply pops up a */ -/* little copyright message and brief program description. */ -/* */ -/*****************************************************************************/ -BOOL CALLBACK DLG_About( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) - { - switch( msg ) - { - case WM_INITDIALOG: - break; - - case WM_COMMAND: - switch( LOWORD(wParam)) - { - case IDOK: - EndDialog( hDlg, FALSE ); - return( TRUE ); - - default: - break; - } - break; - - default: - return( FALSE ); - } - - return( FALSE ); - } - - -/*****************************************************************************/ -/* FreeBuffers() */ -/* */ -/* This function unprepares and frees all our buffers -- something we must */ -/* do to work around a bug in MMYSYSTEM that prevents a device from playing */ -/* back properly unless it is closed and reopened after each stop. */ -/*****************************************************************************/ -void FreeBuffers( void ) - { - DWORD idx; - MMRESULT mmrRetVal; - - if( bBuffersPrepared ) - { - for( idx = 0; idx < NUM_STREAM_BUFFERS; idx++ ) - if(( mmrRetVal = midiOutUnprepareHeader( (HMIDIOUT)hStream, - &ciStreamBuffers[idx].mhBuffer, - sizeof(MIDIHDR))) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - } - bBuffersPrepared = FALSE; - } - // Free our stream buffers... - for( idx = 0; idx < NUM_STREAM_BUFFERS; idx++ ) - if( ciStreamBuffers[idx].mhBuffer.lpData ) - { - GlobalFreePtr( ciStreamBuffers[idx].mhBuffer.lpData ); - ciStreamBuffers[idx].mhBuffer.lpData = NULL; - } - } - - -/*****************************************************************************/ -/* StreamBufferSetup() */ -/* */ -/* This function uses the filename stored in the global character array to*/ -/* open a MIDI file. Then it goes about converting at least the first part of*/ -/* that file into a midiStream buffer for playback. */ -/*****************************************************************************/ -BOOL StreamBufferSetup( void ) - { - int nChkErr; - BOOL bFoundEnd = FALSE; - DWORD dwConvertFlag, idx; - - MMRESULT mmrRetVal; - MIDIPROPTIMEDIV mptd; - - if( !hStream ) - if(( mmrRetVal = midiStreamOpen( &hStream, - &uMIDIDeviceID, - (DWORD)1, (DWORD)MidiProc, - (DWORD)0, - CALLBACK_FUNCTION )) != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - return( TRUE ); - } - - for( idx = 0; idx < NUM_STREAM_BUFFERS; idx++ ) - { - ciStreamBuffers[idx].mhBuffer.dwBufferLength = OUT_BUFFER_SIZE; - if(( ciStreamBuffers[idx].mhBuffer.lpData - = GlobalAllocPtr( GHND, OUT_BUFFER_SIZE )) == NULL ) - { - // Buffers we already allocated will be killed by WM_DESTROY - // after we fail on the create by returning with -1 - return( -1 ); - } - } - if( ConverterInit( szFileBuffer )) - return( TRUE ); - - // Initialize the volume cache array to some pre-defined value - for( idx = 0; idx < NUM_CHANNELS; idx++ ) - dwVolCache[idx] = VOL_CACHE_INIT; - - mptd.cbStruct = sizeof(mptd); - mptd.dwTimeDiv = ifs.dwTimeDivision; - if(( mmrRetVal = midiStreamProperty( hStream, (LPBYTE)&mptd, - MIDIPROP_SET | MIDIPROP_TIMEDIV )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - ConverterCleanup(); - return( TRUE ); - } - - nEmptyBuffers = 0; - dwConvertFlag = CONVERTF_RESET; - - for( nCurrentBuffer = 0; nCurrentBuffer < NUM_STREAM_BUFFERS; - nCurrentBuffer++ ) - { - // Tell the converter to convert up to one entire buffer's length of output - // data. Also, set a flag so it knows to reset any saved state variables it - // may keep from call to call. - ciStreamBuffers[nCurrentBuffer].dwStartOffset = 0; - ciStreamBuffers[nCurrentBuffer].dwMaxLength = OUT_BUFFER_SIZE; - ciStreamBuffers[nCurrentBuffer].tkStart = 0; - ciStreamBuffers[nCurrentBuffer].bTimesUp = FALSE; - - if(( nChkErr = ConvertToBuffer( dwConvertFlag, - &ciStreamBuffers[nCurrentBuffer] )) - != CONVERTERR_NOERROR ) - { - if( nChkErr == CONVERTERR_DONE ) - { - bFoundEnd = TRUE; - } - else - { - DebugPrint( "Initial conversion pass failed" ); - ConverterCleanup(); - return( TRUE ); - } - } - ciStreamBuffers[nCurrentBuffer].mhBuffer.dwBytesRecorded - = ciStreamBuffers[nCurrentBuffer].dwBytesRecorded; - - if( !bBuffersPrepared ) - if(( mmrRetVal = midiOutPrepareHeader( (HMIDIOUT)hStream, - &ciStreamBuffers[nCurrentBuffer].mhBuffer, - sizeof(MIDIHDR))) != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - ConverterCleanup(); - return( TRUE ); - } - if(( mmrRetVal = midiStreamOut( hStream, - &ciStreamBuffers[nCurrentBuffer].mhBuffer, - sizeof(MIDIHDR))) != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - break; - } - dwConvertFlag = 0; - - if( bFoundEnd ) - break; - } - - bBuffersPrepared = TRUE; - nCurrentBuffer = 0; - UpdateFromControls(); - return( FALSE ); - } - - -/*****************************************************************************/ -/* MidiProc() */ -/* */ -/* This is the callback handler which continually refills MIDI data buffers*/ -/* as they're returned to us from the audio subsystem. */ -/*****************************************************************************/ -void CALLBACK MidiProc( HMIDIIN hMidi, UINT uMsg, DWORD dwInstance, - DWORD dwParam1, DWORD dwParam2 ) - { - static int nWaitingBuffers = 0; - MIDIEVENT *pme; - MIDIHDR *pmh; - - MMRESULT mmrRetVal; - int nChkErr; - - - switch( uMsg ) - { - case MOM_DONE: - if( uCallbackStatus == STATUS_CALLBACKDEAD ) - return; - - nEmptyBuffers++; - - if( uCallbackStatus == STATUS_WAITINGFOREND ) - { - if( nEmptyBuffers < NUM_STREAM_BUFFERS ) - { - return; - } - else - { - uCallbackStatus = STATUS_CALLBACKDEAD; - PostMessage( hWndMain, WM_COMMAND, - MAKEWPARAM( IDC_STOP, 0 ), 0L ); - SetEvent( hBufferReturnEvent ); - return; - } - } - - // This flag is set whenever the callback is waiting for all buffers to - // come back. - if( uCallbackStatus == STATUS_KILLCALLBACK ) - { - // Count NUM_STREAM_BUFFERS-1 being returned for the last time - if( nEmptyBuffers < NUM_STREAM_BUFFERS ) - { - return; - } - // Then send a stop message when we get the last buffer back... - else - { - // Change the status to callback dead - uCallbackStatus = STATUS_CALLBACKDEAD; - SetEvent( hBufferReturnEvent ); - return; - } - } - - dwProgressBytes - += ciStreamBuffers[nCurrentBuffer].mhBuffer.dwBytesRecorded; - PostMessage( hWndMain, WM_MSTREAM_PROGRESS, 0L, 0L ); - -/////////////////////////////////////////////////////////////////////////////// -// Fill an available buffer with audio data again... - - if( bPlaying && nEmptyBuffers ) - { - ciStreamBuffers[nCurrentBuffer].dwStartOffset = 0; - ciStreamBuffers[nCurrentBuffer].dwMaxLength = OUT_BUFFER_SIZE; - ciStreamBuffers[nCurrentBuffer].tkStart = 0; - ciStreamBuffers[nCurrentBuffer].dwBytesRecorded = 0; - ciStreamBuffers[nCurrentBuffer].bTimesUp = FALSE; - - if(( nChkErr = ConvertToBuffer( 0, - &ciStreamBuffers[nCurrentBuffer] )) - != CONVERTERR_NOERROR ) - { - if( nChkErr == CONVERTERR_DONE ) - { - // Don't include this one in the count - nWaitingBuffers = NUM_STREAM_BUFFERS - 1; - uCallbackStatus = STATUS_WAITINGFOREND; - return; - } - else - { - DebugPrint( "MidiProc() conversion pass failed!" ); - ConverterCleanup(); - return; - } - } - - ciStreamBuffers[nCurrentBuffer].mhBuffer.dwBytesRecorded - = ciStreamBuffers[nCurrentBuffer].dwBytesRecorded; - - if(( mmrRetVal = midiStreamOut( hStream, - &ciStreamBuffers[nCurrentBuffer].mhBuffer, - sizeof(MIDIHDR))) != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - ConverterCleanup(); - return; - } - nCurrentBuffer = ( nCurrentBuffer + 1 ) % NUM_STREAM_BUFFERS; - nEmptyBuffers--; - } - - break; - - case MOM_POSITIONCB: - pmh = (MIDIHDR *)dwParam1; - pme = (MIDIEVENT *)(pmh->lpData + pmh->dwOffset); - if( MIDIEVENT_TYPE( pme->dwEvent ) == MIDI_CTRLCHANGE ) - { - if( MIDIEVENT_DATA1( pme->dwEvent ) == MIDICTRL_VOLUME_LSB ) - { - DebugPrint( "Got an LSB volume event" ); - break; - } - if( MIDIEVENT_DATA1( pme->dwEvent ) != MIDICTRL_VOLUME ) - break; - - // Mask off the channel number and cache the volume data byte - dwVolCache[ MIDIEVENT_CHANNEL( pme->dwEvent )] - = MIDIEVENT_VOLUME( pme->dwEvent ); - // Post a message so that the main program knows to counteract - // the effects of the volume event in the stream with its own - // generated event which reflects the proper trackbar position. - PostMessage( hWndMain, WM_MSTREAM_UPDATEVOLUME, - MIDIEVENT_CHANNEL( pme->dwEvent ), 0L ); - } - break; - - default: - break; - } - - return; - } diff --git a/sdk/samples/mstream/mstream.def b/sdk/samples/mstream/mstream.def deleted file mode 100644 index 64c3af9..0000000 --- a/sdk/samples/mstream/mstream.def +++ /dev/null @@ -1,8 +0,0 @@ -NAME MSTREAM - -DESCRIPTION 'midiStream Conversion/Playback Example' - -EXPORTS - DLG_About - MainWindowProc - MidiProc diff --git a/sdk/samples/mstream/mstream.h b/sdk/samples/mstream/mstream.h deleted file mode 100644 index b21134a..0000000 --- a/sdk/samples/mstream/mstream.h +++ /dev/null @@ -1,145 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: MStream.h - * Content: Main header file for the MSTREAM sample application - * - ***************************************************************************/ -#ifndef __MSTREAM_INCLUDED__ -#define __MSTREAM_INCLUDED__ - -/*****************************************************************************/ -/* Controls for buffer size, etc. */ - -#define TRACK_BUFFER_SIZE 1024 -#define OUT_BUFFER_SIZE 1024 // Max stream buffer size in bytes -#define BUFFER_TIME_LENGTH 60 // Amount to fill in milliseconds -#define NUM_STREAM_BUFFERS 2 - -#define DEBUG_CALLBACK_TIMEOUT 2000 // Wait 2 seconds for callback - -/*****************************************************************************/ -/* A bunch of constants used for calculating position */ -/* and size of child controls for the main window. */ - -#define BORDER_SPACE_CX 10 -#define BORDER_SPACE_CY 10 -#define CONTROL_SPACE_CX 4 -#define CONTROL_SPACE_CY 4 -#define TEXT_SPACE_CY 3 -#define TEXT_SPACE_CX 2 - -#define BUTTON_CX 68 -#define BUTTON_CY 26 -#define CHECK_CX 68 -#define CHECK_CY 26 -#define BUTTON_SPACE_CX 4 -#define BUTTON_SPACE_CY 4 -#define CHECK_SPACE_CY 4 - -#define TEMPO_TB_CX 150 -#define TEMPO_TB_CY 32 -#define VOL_TB_CX 150 -#define VOL_TB_CY 32 - -#define TEMPO_TEXT_CX TEMPO_TB_CX -#define VOL_TEXT_CX VOL_TB_CX - -#define VOL_TB_MIN 0 -#define VOL_TB_MAX 1000 -#define VOL_PAGESIZE 10 -#define VOL_MIN 0 -#define VOL_MAX 127 -#define VOL_CACHE_INIT 100 -#define TEMPO_MIN 1 -#define TEMPO_MAX 500 -#define TEMPO_PAGESIZE 10 - - -#define WM_MSTREAM_PROGRESS (WM_USER + 100) -#define WM_MSTREAM_UPDATEVOLUME (WM_USER + 101) - -/*****************************************************************************/ -/* All sorts of bit flags and error codes for */ -/* communicating between various subsystems. */ - -#define MSTREAM_STOPF_NOREOPEN 0x0001 - -#define STREAMF_BUFFER_WARNING 0x00000002 - -#define CONVERTF_RESET 0x00000001 - -#define CONVERTF_STATUS_DONE 0x00000001 -#define CONVERTF_STATUS_STUCK 0x00000002 -#define CONVERTF_STATUS_GOTEVENT 0x00000004 - -#define CONVERTERR_NOERROR 0 // No error occured -#define CONVERTERR_CORRUPT -101 // The input file is corrupt -// The converter has already encountered a corrupt file and cannot convert any -// more of this file -- you must reset the converter -#define CONVERTERR_STUCK -102 -#define CONVERTERR_DONE -103 // Converter is done -#define CONVERTERR_BUFFERFULL -104 // The buffer is full -#define CONVERTERR_METASKIP -105 // Skipping unknown meta event - -#define STATUS_KILLCALLBACK 100 // Signals that the callback should die -#define STATUS_CALLBACKDEAD 200 // Signals callback is done processing -#define STATUS_WAITINGFOREND 300 // Callback's waiting for buffers to play - -#define VOLUME_BUFFER 3567 // Random value which acts as a buffer id - - -#ifdef DEBUG -#define DebugPrint( sz ) DPF( 3, sz ) -#else -#define DebugPrint( sz ) -#endif - - - -/* - * This structure is used to pass information to the ConvertToBuffer() - * system and then internally by that function to send information about the - * target stream buffer and current state of the conversion process to lower - * level conversion routines internal to the MSTRCONV module. See that source - * file for specific details. - */ -typedef struct _ConvertInfo -{ - MIDIHDR mhBuffer; // Standard Windows stream buffer header - DWORD dwStartOffset; // Start offset from mhStreamBuffer.lpStart - DWORD dwMaxLength; // Max length to convert on this pass - - DWORD dwBytesRecorded; // Used internally by the MSTRCONV module - DWORD tkStart; // Used internally by the MSTRCONV module - BOOL bTimesUp; // Used internally by the MSTRCONV module -} CONVERTINFO, *LPCONVERTINFO; - - -/*****************************************************************************/ -/* Function declarations */ - -LRESULT CALLBACK MainWindowProc( HWND, unsigned, WPARAM, LPARAM ); -BOOL CALLBACK DLG_About( HWND, UINT, WPARAM, LPARAM ); -void CALLBACK MidiProc( HMIDIIN, UINT, DWORD, DWORD, DWORD ); - -void BuildTitleBarText( void ); -void ErrorMessageBox( UINT, DWORD ); -void HandleTempoScroll( int, int ); -void HandleVolScroll( int, int ); -void MidiErrorMessageBox( MMRESULT ); -void SetAllChannelVolumes( DWORD dwVolumePercent ); -void SetChannelVolume( DWORD dwChannel, DWORD dwVolumePercent ); -void UpdateFromControls( void ); - -int CreateChildren( RECT ); -int HandleCommDlgError( DWORD ); -BOOL StreamBufferSetup( void ); - -BOOL ConverterInit( LPSTR szInFile ); -void ConverterCleanup( void ); -int ConvertToBuffer( DWORD, LPCONVERTINFO ); - -#endif /* __MSTREAM_INCLUDED__ */ - diff --git a/sdk/samples/mstream/mstream.mak b/sdk/samples/mstream/mstream.mak deleted file mode 100644 index 2ab6c58..0000000 --- a/sdk/samples/mstream/mstream.mak +++ /dev/null @@ -1,242 +0,0 @@ -# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -!IF "$(CFG)" == "" -CFG=Win32 Debug -!MESSAGE No configuration specified. Defaulting to Win32 Debug. -!ENDIF - -!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "MSTREAM.MAK" CFG="Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "Win32 Debug" -MTL=MkTypLib.exe -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "WinRel" -# PROP BASE Intermediate_Dir "WinRel" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "retail" -# PROP Intermediate_Dir "retail" -OUTDIR=.\retail -INTDIR=.\retail - -ALL : $(OUTDIR)/MSTREAM.exe $(OUTDIR)/MSTREAM.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c -CPP_PROJ=/nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ - /FR$(INTDIR)/ /Fp$(OUTDIR)/"MSTREAM.pch" /Fo$(INTDIR)/ /c -CPP_OBJS=.\retail/ -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -RSC_PROJ=/l 0x409 /fo$(INTDIR)/"MSTREAM.res" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"MSTREAM.bsc" -BSC32_SBRS= \ - $(INTDIR)/MSTRCONV.SBR \ - $(INTDIR)/MSTREAM.SBR \ - $(INTDIR)/DEBUG.SBR \ - $(INTDIR)/MSTRHELP.SBR - -$(OUTDIR)/MSTREAM.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:windows /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib uuid.lib comctl32.lib winmm.lib /NOLOGO /SUBSYSTEM:windows /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib\ - uuid.lib comctl32.lib winmm.lib /NOLOGO /SUBSYSTEM:windows /INCREMENTAL:no\ - /PDB:$(OUTDIR)/"MSTREAM.pdb" /MACHINE:I386 /DEF:".\MSTREAM.DEF"\ - /OUT:$(OUTDIR)/"MSTREAM.exe" -DEF_FILE=.\MSTREAM.DEF -LINK32_OBJS= \ - $(INTDIR)/MSTRCONV.OBJ \ - $(INTDIR)/MSTREAM.OBJ \ - $(INTDIR)/DEBUG.OBJ \ - $(INTDIR)/MSTREAM.res \ - $(INTDIR)/MSTRHELP.OBJ - -$(OUTDIR)/MSTREAM.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "WinDebug" -# PROP BASE Intermediate_Dir "WinDebug" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -OUTDIR=.\debug -INTDIR=.\debug - -ALL : $(OUTDIR)/MSTREAM.exe $(OUTDIR)/MSTREAM.bsc - -$(OUTDIR) : - if not exist $(OUTDIR)/nul mkdir $(OUTDIR) - -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /D "DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /D "DEBUG" /win32 -# ADD BASE CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c -# ADD CPP /nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "DEBUG" /FR /c -CPP_PROJ=/nologo /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D\ - "DEBUG" /FR$(INTDIR)/ /Fp$(OUTDIR)/"MSTREAM.pch" /Fo$(INTDIR)/\ - /Fd$(OUTDIR)/"MSTREAM.pdb" /c -CPP_OBJS=.\debug/ -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" /d "DEBUG" -RSC_PROJ=/l 0x409 /fo$(INTDIR)/"MSTREAM.res" /d "_DEBUG" /d "DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o$(OUTDIR)/"MSTREAM.bsc" -BSC32_SBRS= \ - $(INTDIR)/MSTRCONV.SBR \ - $(INTDIR)/MSTREAM.SBR \ - $(INTDIR)/DEBUG.SBR \ - $(INTDIR)/MSTRHELP.SBR - -$(OUTDIR)/MSTREAM.bsc : $(OUTDIR) $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:windows /DEBUG /MACHINE:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib uuid.lib comctl32.lib winmm.lib /NOLOGO /SUBSYSTEM:windows /INCREMENTAL:no /DEBUG /MACHINE:I386 -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib\ - uuid.lib comctl32.lib winmm.lib /NOLOGO /SUBSYSTEM:windows /INCREMENTAL:no\ - /PDB:$(OUTDIR)/"MSTREAM.pdb" /DEBUG /MACHINE:I386 /DEF:".\MSTREAM.DEF"\ - /OUT:$(OUTDIR)/"MSTREAM.exe" -DEF_FILE=.\MSTREAM.DEF -LINK32_OBJS= \ - $(INTDIR)/MSTRCONV.OBJ \ - $(INTDIR)/MSTREAM.OBJ \ - $(INTDIR)/DEBUG.OBJ \ - $(INTDIR)/MSTREAM.res \ - $(INTDIR)/MSTRHELP.OBJ - -$(OUTDIR)/MSTREAM.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -################################################################################ -# Begin Group "Source Files" - -################################################################################ -# Begin Source File - -SOURCE=.\MSTRCONV.C -DEP_MSTRC=\ - .\DEBUG.H\ - .\MSTREAM.H\ - .\MIDSTUFF.H - -$(INTDIR)/MSTRCONV.OBJ : $(SOURCE) $(DEP_MSTRC) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\MSTREAM.C -DEP_MSTRE=\ - \dev\inc\mmreg.h\ - .\DEBUG.H\ - .\MIDSTUFF.H\ - .\MSTREAM.H - -$(INTDIR)/MSTREAM.OBJ : $(SOURCE) $(DEP_MSTRE) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\MSTREAM.DEF -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\DEBUG.C -DEP_DEBUG=\ - .\DEBUG.H - -$(INTDIR)/DEBUG.OBJ : $(SOURCE) $(DEP_DEBUG) $(INTDIR) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\MSTREAM.RC -DEP_MSTREA=\ - .\ico00001.ico - -$(INTDIR)/MSTREAM.res : $(SOURCE) $(DEP_MSTREA) $(INTDIR) - $(RSC) $(RSC_PROJ) $(SOURCE) - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\MSTRHELP.C -DEP_MSTRH=\ - \dev\inc\mmreg.h\ - .\DEBUG.H\ - .\MIDSTUFF.H\ - .\MSTREAM.H - -$(INTDIR)/MSTRHELP.OBJ : $(SOURCE) $(DEP_MSTRH) $(INTDIR) - -# End Source File -# End Group -# End Project -################################################################################ diff --git a/sdk/samples/mstream/mstream.rc b/sdk/samples/mstream/mstream.rc deleted file mode 100644 index a7016e1..0000000 --- a/sdk/samples/mstream/mstream.rc +++ /dev/null @@ -1,253 +0,0 @@ -//Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "winver.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINMENU MENU PRELOAD DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Open...", IDM_FILE_OPEN - MENUITEM "&Close", IDM_FILE_CLOSE, GRAYED - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_FILE_EXIT - END - POPUP "&Actions" - BEGIN - MENUITEM "&Play", IDM_ACTIONS_PLAY - MENUITEM "P&ause", IDM_ACTIONS_PAUSE - MENUITEM "&Stop", IDM_ACTIONS_STOP - MENUITEM SEPARATOR - MENUITEM "&Looped", IDM_ACTIONS_LOOPED - END - POPUP "&Help" - BEGIN - MENUITEM "&About...", IDM_HELP_ABOUT - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 196, 93 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "About DSStream" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,73,73,50,14 - LTEXT "MidiStream Sample Application",IDC_STATIC,44,8,128,8 - ICON IDI_ICON3,IDC_STATIC,8,8,18,20 - LTEXT "Copyright \251 1995-1996 Microsoft Corporation",IDC_STATIC, - 44,18,128,8 - LTEXT "Illustrates real-time conversion of MIDI file data to MIDI stream data for playback using the midiStream API.", - IDC_STATIC,44,40,144,24 - CONTROL "",IDC_STATIC,"Static",SS_BLACKRECT,44,32,144,1 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -IDI_ICON3 ICON DISCARDABLE "ico00001.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Microsoft Corporation\0" - VALUE "FileDescription", "dsstream\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "dsstream\0" - VALUE "LegalCopyright", "Copyright \251 1995\0" - VALUE "OriginalFilename", "dsstream.exe\0" - VALUE "ProductName", "DirectSound Stream Playback Sample Application\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_CDERR_GENERAL_BASE "Common Dialog Subsystem Error" - IDS_CDERR_FINDRESFAILURE "Could not find a required resource." - IDS_CDERR_INITIALIZATION - "Initialization failed: Memory resources may be running low." - IDS_CDERR_LOADRESFAILURE "Could not load a required resource." - IDS_CDERR_LOCKRESFAILURE "Could not lock a required resource." - IDS_CDERR_LOADSTRFAILURE "Could not load a required string resource" - IDS_CDERR_MEMALLOCFAILURE - "Unable to allocate sufficient memory for internal data structures: memory resources may be running low." - IDS_CDERR_MEMLOCKFAILURE "Could not lock a memory resource." - IDS_CDERR_NOHINSTANCE "The caller attempted to use a dialog template with specifiying an instance handle" - IDS_CDERR_NOHOOK "The caller requested use of a hook procedure, but failed to provide one." - IDS_CDERR_NOTEMPLATE "The caller requested use of a dialog template, but failed to provide one." - IDS_CDERR_REGISTERMSGFAIL - "The common dialog subsystem was unable to register a private message using RegisterWindowMessage()." - IDS_CDERR_STRUCTSIZE "The common dialog subsystem received a structure with an improper size member." - IDS_CDERR_DIALOGFAILURE "Unable to create dialog box." - IDS_CDERR_TITLESTRING "Common Dialog Error!" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "MidiStream" - IDS_APP_CAPTION "MidiStream Sample Application" - IDS_APP_NAME "MStream" - IDS_OPEN_DLGTITLE "Open MIDI File for Playback" - IDS_OPEN_FILTER1 "MIDI Music Files (*.MID)" - IDS_OPEN_FILTER2 "*.MID" - IDS_OPEN_FILTER3 "All Files (*.*)" - IDS_OPEN_FILTER4 "*.*" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_APPINIT "Could not initialize application" - IDS_ERROR_INSTANCEINIT "Could not initialize an instance of this application" - IDS_ERROR_REGISTERCLASS "RegisterClass() failed while attempting to register the main application window class" - IDS_ERROR_MAINWNDCREATE "Could not create the main application window: CreateWindow() failed." - IDS_ERROR_NOMIDIMAPPER "The Microsoft MIDI Mapper device, which is required for MSTREAM playback, could not be opened. It is either in use or improperly configured." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ERROR_CHILDTEMPLATE "Unable to create the %s %s control -- CreateWindow() failed in CreateChildren(). Resources may be running low." - IDS_ERROR_TRACKBAR "Trackbar" - IDS_ERROR_BUTTON "Button" - IDS_ERROR_STATICTEXT "Static Text" - IDS_ERROR_GETTEXTEXTENT "Unable to determine text size while creating child controls: GetTextExtentPoint32() failed." - IDS_ERROR_CHECK "Checkbox" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TBTITLE_PAN "Pan" - IDS_TBTITLE_VOLUME "Volume" - IDS_TBTITLE_FREQUENCY "Frequency" - IDS_TBTITLE_PROGRESS "Progress" - IDS_BUTTON_PLAY "Play" - IDS_BUTTON_STOP "Stop" - IDS_CHECK_LOOPED "Looped" - IDS_TBTITLE_TEMPO "Tempo" - IDS_BUTTON_PAUSE "Pause" -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""winver.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/sdk/samples/mstream/mstrhelp.c b/sdk/samples/mstream/mstrhelp.c deleted file mode 100644 index 1b068fa..0000000 --- a/sdk/samples/mstream/mstrhelp.c +++ /dev/null @@ -1,502 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: mstream.c - * Content: Illustrates streaming data from a disk MIDI file to a - * midiStream buffer for playback. - * - ***************************************************************************/ -#include -#include -#include -#include -#include - -#include "debug.h" -#include "resource.h" -#include "midstuff.h" -#include "mstream.h" - -extern char szAppTitle[64]; -extern char szAppCaption[64]; -extern char szFileBuffer[64]; -extern char szFileTitle[64]; -extern char szTempo[64]; -extern char szVolume[64]; -extern char szProgress[64]; -extern char szTemp[256]; -extern char szDebug[256]; - -extern HWND hWndMain, hWndTempo, hWndVol, hWndProg, hWndPlay, hWndPause; -extern HWND hWndStop, hWndTempoText, hWndVolText, hWndLoopCheck, hWndProgText; -extern HINSTANCE hInst; -extern HMIDISTRM hStream; - -extern BOOL bFileOpen, bPlaying, bPaused, bInsertTempo; -extern int nTextControlHeight; -extern DWORD dwBufferTickLength, dwTempoMultiplier, dwCurrentTempo; -extern DWORD dwProgressBytes, dwVolumePercent, dwVolCache[NUM_CHANNELS]; - -#ifdef DEBUG -extern HWND hWndList; -#endif - -/*****************************************************************************/ -/* CreateChildren() */ -/* */ -/* This function creates a bunch of child controls for the main window. */ -/* Most of them are used for controling various things about a playing sound */ -/* file, like volume and panning. Returns FALSE if no errors, TRUE otherwise.*/ -/* */ -/*****************************************************************************/ -int CreateChildren( RECT crect ) - { - SIZE Size; - HDC hDC; - int x, y; - UINT uType; - char szTemplate[128], szType[32]; - LPSTR lpszControl; - - LoadString( hInst, IDS_ERROR_CHILDTEMPLATE, szTemplate, sizeof(szTemplate)); - - /* Don't handle failure for this one, because the app will still run fine */ - CreateWindow( "static", NULL, WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - 0, 0, crect.right, 2, hWndMain, (HMENU)0, hInst, NULL ); - - hDC = GetDC( hWndMain ); - if( !GetTextExtentPoint32( hDC, szProgress, strlen(szProgress), &Size )) - { - ErrorMessageBox( IDS_ERROR_GETTEXTEXTENT, MB_ICONEXCLAMATION ); - ReleaseDC( hWndMain, hDC ); - return( TRUE ); - } - ReleaseDC( hWndMain, hDC ); - nTextControlHeight = Size.cy; - - y = BORDER_SPACE_CY; - - /* STATIC control -- text label for the TEMPO trackbar */ - if(( hWndTempoText = CreateWindow( "static", szTempo, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX, - y, - TEMPO_TEXT_CX, nTextControlHeight, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szTempo; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - - /* Create the TEMPO trackbar */ - if(( hWndTempo = CreateWindow( TRACKBAR_CLASS, NULL, - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTTOM, - BORDER_SPACE_CX, - y + nTextControlHeight + TEXT_SPACE_CY, - TEMPO_TB_CX, TEMPO_TB_CY, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szTempo; - uType = IDS_ERROR_TRACKBAR; - goto DISPLAY_CREATE_FAILURE; - } - - dwTempoMultiplier = 100; - SendMessage( hWndTempo, TBM_SETRANGE, FALSE, - MAKELONG( TEMPO_MIN, TEMPO_MAX )); - SendMessage( hWndTempo, TBM_SETPOS, TRUE, dwTempoMultiplier ); - - /* STATIC control -- text label for the VOLUME trackbar */ - if(( hWndVolText = CreateWindow( "static", szVolume, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX + TEMPO_TB_CX - + CONTROL_SPACE_CX, - y, - VOL_TEXT_CX, nTextControlHeight, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szVolume; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - y += nTextControlHeight + TEXT_SPACE_CY; - - /* Create the VOLUME trackbar */ - if(( hWndVol = CreateWindow( TRACKBAR_CLASS, NULL, - WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTTOM, - BORDER_SPACE_CX + TEMPO_TB_CX - + CONTROL_SPACE_CX, - y, VOL_TB_CX, VOL_TB_CY, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szVolume; - uType = IDS_ERROR_TRACKBAR; - goto DISPLAY_CREATE_FAILURE; - } - - SendMessage( hWndVol, TBM_SETRANGE, FALSE, - MAKELONG( VOL_TB_MIN, VOL_TB_MAX )); - SendMessage( hWndVol, TBM_SETPOS, TRUE, VOL_TB_MAX ); - SendMessage( hWndVol, TBM_SETPAGESIZE, 0L, VOL_PAGESIZE ); - - x = BORDER_SPACE_CX + TEMPO_TB_CX + 2 * CONTROL_SPACE_CX + VOL_TB_CX; - y = BORDER_SPACE_CY; - - /* Create the LOOPED CHECKBOX */ - LoadString( hInst, IDS_CHECK_LOOPED, szTemp, sizeof(szTemp)); - if(( hWndLoopCheck = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | BS_CHECKBOX, - x, y, CHECK_CX, CHECK_CY, hWndMain, - (HMENU)IDC_LOOPCHECK, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_CHECK; - goto DISPLAY_CREATE_FAILURE; - } - - x = BORDER_SPACE_CX + TEMPO_TB_CX + VOL_TB_CX + 2 * CONTROL_SPACE_CX + CHECK_CX - - 3 * BUTTON_CX - 2 * BUTTON_SPACE_CX; - y = BORDER_SPACE_CY + nTextControlHeight + TEXT_SPACE_CY + TEMPO_TB_CY - + CONTROL_SPACE_CY; - - /* STATIC control -- text label for the progress trackbar. */ - if(( hWndProgText = CreateWindow( "static", szProgress, - WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, - BORDER_SPACE_CX, - y, - x - BORDER_SPACE_CX, nTextControlHeight, - hWndMain, (HMENU)0, hInst, NULL)) == NULL ) - { - lpszControl = szProgress; - uType = IDS_ERROR_STATICTEXT; - goto DISPLAY_CREATE_FAILURE; - } - - /* Create the PLAY BUTTON */ - LoadString( hInst, IDS_BUTTON_PLAY, szTemp, sizeof(szTemp)); - if(( hWndPlay = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | WS_DISABLED, - x, y, BUTTON_CX, BUTTON_CY, hWndMain, - (HMENU)IDC_PLAY, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_BUTTON; - goto DISPLAY_CREATE_FAILURE; - } - x += BUTTON_CX + BUTTON_SPACE_CX; - - /* Create the PAUSE BUTTON */ - LoadString( hInst, IDS_BUTTON_PAUSE, szTemp, sizeof(szTemp)); - if(( hWndPause = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | WS_DISABLED, - x, y, BUTTON_CX, BUTTON_CY, hWndMain, - (HMENU)IDC_PAUSE, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_BUTTON; - goto DISPLAY_CREATE_FAILURE; - } - x += BUTTON_CX + BUTTON_SPACE_CX; - - /* Create the STOP BUTTON */ - LoadString( hInst, IDS_BUTTON_STOP, szTemp, sizeof(szTemp)); - if(( hWndStop = CreateWindow( "button", szTemp, - WS_CHILD | WS_VISIBLE | WS_DISABLED, - x, y, BUTTON_CX, BUTTON_CY, hWndMain, - (HMENU)IDC_STOP, hInst, NULL )) == NULL ) - { - lpszControl = szTemp; - uType = IDS_ERROR_BUTTON; - goto DISPLAY_CREATE_FAILURE; - } - - UpdateFromControls(); - goto RETURN_NORMAL; - -DISPLAY_CREATE_FAILURE: - LoadString( hInst, uType, szType, sizeof(szType)); - wsprintf( szTemp, szTemplate, lpszControl, szType ); - MessageBox( GetActiveWindow(), szTemp, - szAppTitle, MB_OK | MB_ICONEXCLAMATION ); - return( TRUE ); - -RETURN_NORMAL: - return( FALSE ); - } - - -/********************************************************************************/ -/* HandleTempoScroll() */ -/* */ -/* Handles the tempo trackbar scroll when a WM_HSCROLL is received. */ -/* */ -/********************************************************************************/ -void HandleTempoScroll( int nCode, int nPos ) - { - long lTempo, lDelta; - - lTempo = (LONG)SendMessage( hWndTempo, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - - switch( nCode ) - { - case TB_LINEUP: - if( lTempo >= TEMPO_MIN-1 ) - lDelta = -1; - break; - case TB_LINEDOWN: - if( lTempo <= TEMPO_MAX+1 ) - lDelta = 1; - break; - case TB_PAGEUP: - if( lTempo >= TEMPO_MIN - TEMPO_PAGESIZE ) - lDelta = -TEMPO_PAGESIZE; - break; - case TB_PAGEDOWN: - if( lTempo <= TEMPO_MAX + TEMPO_PAGESIZE ) - lDelta = TEMPO_PAGESIZE; - break; - case TB_ENDTRACK: - return; - default: - lDelta = 0; - } - - if( lDelta ) - { - SendMessage( hWndTempo, TBM_SETPOS, TRUE, lTempo + lDelta ); - dwTempoMultiplier = (DWORD)( lTempo + lDelta ); - } - else - { - SendMessage( hWndTempo, TBM_SETPOS, TRUE, (long)nPos ); - dwTempoMultiplier = (DWORD)nPos; - } - - UpdateFromControls(); - } - - -/********************************************************************************/ -/* HandleVolScroll() */ -/* */ -/* Handles the volume trackbar scrolling when a WM_HSCROLL is received. */ -/* */ -/********************************************************************************/ -void HandleVolScroll( int nCode, int nPos ) - { - long lVol, lDelta; - - lVol = (LONG)SendMessage( hWndVol, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - - switch( nCode ) - { - case TB_LINEDOWN: - if( lVol <= VOL_TB_MAX - 1 ) - lDelta = 1; - break; - case TB_LINEUP: - if( lVol >= VOL_TB_MIN + 1 ) - lDelta = -1; - break; - case TB_PAGEDOWN: - if( lVol <= VOL_TB_MAX - VOL_PAGESIZE ) - lDelta = VOL_PAGESIZE; - break; - case TB_PAGEUP: - if( lVol >= VOL_TB_MIN + VOL_PAGESIZE ) - lDelta = -VOL_PAGESIZE; - break; - case TB_ENDTRACK: - return; - default: - lDelta = 0; - } - - if( lDelta ) - SendMessage( hWndVol, TBM_SETPOS, TRUE, (lVol + lDelta)); - else - SendMessage( hWndVol, TBM_SETPOS, TRUE, (long)nPos ); - - UpdateFromControls(); - } - - -/********************************************************************************/ -/* UpdateFromControls() */ -/* */ -/* This function gets all the required values from the DirectSoundBuffer and */ -/* updates the screen interface controls. */ -/* */ -/********************************************************************************/ -void UpdateFromControls( void ) - { - long lTempo; - - lTempo = (LONG)SendMessage( hWndTempo, TBM_GETPOS, (WPARAM)0, (LPARAM)0 ); - dwVolumePercent = (WORD)SendMessage( hWndVol, TBM_GETPOS, - (WPARAM)0, (LPARAM)0 ); - - /* Set the Volume text */ - wsprintf( szTemp, "%s: %lu%%", szVolume, dwVolumePercent / 10 ); - Static_SetText( hWndVolText, szTemp ); - if( hStream ) - SetAllChannelVolumes( dwVolumePercent ); - - /* Set the Tempo text */ - wsprintf( szTemp, "%s: %li%%", szTempo, lTempo ); - Static_SetText( hWndTempoText, szTemp ); - bInsertTempo = TRUE; - - /* Set the Progress text */ - wsprintf( szTemp, "%s: %lu bytes", szProgress, dwProgressBytes ); - Static_SetText( hWndProgText, szTemp ); - - return; - } - - -/****************************************************************************/ -/* ErrorMessageBox() */ -/* */ -/* A little routine to load error messages from the string resource table */ -/* and pop them up in a MessageBox() for the world to see. The dwMBFlags */ -/* parameter allows the caller to specify the type of icon to use. */ -/* */ -/****************************************************************************/ -void ErrorMessageBox( UINT uID, DWORD dwMBFlags ) - { - LoadString( hInst, uID, szTemp, sizeof(szTemp)); - MessageBox( GetActiveWindow(), szTemp, szAppTitle, MB_OK | dwMBFlags ); -#ifdef DEBUG - wsprintf( szDebug, "General error: %s", szTemp ); - DebugPrint( szDebug ); -#endif - } - - -/****************************************************************************/ -/* MidiErrorMessageBox() */ -/* */ -/* Calls the midiOutGetErrorText() function and displays the text which */ -/* corresponds to a midi subsystem error code. */ -/* */ -/****************************************************************************/ -void MidiErrorMessageBox( MMRESULT mmr ) - { - midiOutGetErrorText( mmr, szTemp, sizeof(szTemp)); - MessageBox( GetActiveWindow(), szTemp, szAppTitle, - MB_OK | MB_ICONSTOP ); -#ifdef DEBUG - wsprintf( szDebug, "Midi subsystem error: %s", szTemp ); - DebugPrint( szDebug ); -#endif - } - - -/*****************************************************************************/ -/* HandleCommDlgError() */ -/* */ -/* The function translates extended common dialog error codes into a */ -/* string resource ID, loads that string from our module, and displays it in */ -/* a message box. This implementation only covers the general CD error codes.*/ -/* */ -/*****************************************************************************/ -int HandleCommDlgError( DWORD dwError ) - { - char szTitle[128]; - UINT uMsgID; - - if( dwError == CDERR_DIALOGFAILURE ) - uMsgID = IDS_CDERR_DIALOGFAILURE; - else - uMsgID = (UINT)dwError + IDS_CDERR_GENERAL_BASE; - - LoadString( hInst, uMsgID, szTemp, sizeof(szTemp)); - LoadString( hInst, IDS_CDERR_TITLESTRING, szTitle, sizeof(szTitle)); - MessageBox( GetActiveWindow(), szTemp, szTitle, - MB_OK | MB_ICONEXCLAMATION ); - - return( 0 ); - } - - -/****************************************************************************/ -/* BuildTitleBarText() */ -/* */ -/* Helper function designed to updated the title bar text of the main */ -/* window to reflect the currently loaded file (if there is one). */ -/* */ -/****************************************************************************/ -void BuildTitleBarText( void ) - { - char szTitle[sizeof(szAppCaption) + MAX_PATH + sizeof( " - (Paused)")]; - - lstrcpy( szTitle, szAppCaption ); - if( bFileOpen ) - { - lstrcat( szTitle, " - " ); - lstrcat( szTitle, szFileTitle ); - } - if( bPaused ) - lstrcat( szTitle, " (Paused)" ); - SetWindowText( hWndMain, szTitle ); - } - - -/****************************************************************************/ -/* SetAllChannelVolumes() */ -/* */ -/* Given a percent in tenths of a percent, sets volume on all channels to */ -/* reflect the new value. */ -/****************************************************************************/ -void SetAllChannelVolumes( DWORD dwVolumePercent ) - { - DWORD dwEvent, dwStatus, dwVol, idx; - MMRESULT mmrRetVal; - - if( !bPlaying ) - return; - - - for( idx = 0, dwStatus = MIDI_CTRLCHANGE; idx < NUM_CHANNELS; idx++, - dwStatus++ ) - { - dwVol = ( dwVolCache[idx] * dwVolumePercent ) / 1000; - dwEvent = dwStatus | ((DWORD)MIDICTRL_VOLUME << 8) - | ((DWORD)dwVol << 16); - if(( mmrRetVal = midiOutShortMsg( (HMIDIOUT)hStream, dwEvent )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - return; - } - } - } - - -/****************************************************************************/ -/* SetChannelVolume() */ -/* */ -/* Given a percent in tenths of a percent, sets volume on a specified */ -/* channel to reflect the new value. */ -/****************************************************************************/ -void SetChannelVolume( DWORD dwChannel, DWORD dwVolumePercent ) - { - DWORD dwEvent, dwVol; - MMRESULT mmrRetVal; - - if( !bPlaying ) - return; - - dwVol = ( dwVolCache[dwChannel] * dwVolumePercent ) / 1000; - dwEvent = MIDI_CTRLCHANGE | dwChannel | ((DWORD)MIDICTRL_VOLUME << 8) - | ((DWORD)dwVol << 16); - if(( mmrRetVal = midiOutShortMsg( (HMIDIOUT)hStream, dwEvent )) - != MMSYSERR_NOERROR ) - { - MidiErrorMessageBox( mmrRetVal ); - return; - } - } diff --git a/sdk/samples/mstream/msvc.mk b/sdk/samples/mstream/msvc.mk deleted file mode 100644 index 52bd1aa..0000000 --- a/sdk/samples/mstream/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = mstream -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib comdlg32.lib gdi32.lib winmm.lib \ - comctl32.lib libc.lib - -OBJS = mstream.obj mstrconv.obj mstrhelp.obj debug.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/mstream/readme.txt b/sdk/samples/mstream/readme.txt deleted file mode 100644 index f1c1aad..0000000 --- a/sdk/samples/mstream/readme.txt +++ /dev/null @@ -1,154 +0,0 @@ - - MSTREAM - - Design Description and Notes - - The MSTREAM sample application is an example of how you can use the new -midiStream API that's built into Windows 95 to play MIDI data with low -latency and low processor overhead. - - The basic idea behind the implementation is to start the application and -initialize the user interface. After that's done, the following events occur. - -When a user selects and opens a file ------------------------------------- -Open a MIDI output device (the Microsoft MIDI Mapper in this case) -Open the file using buffered I/O and fill our buffers with data in MIDI stream - format -Prepare and queue the buffers using midiOutPrepareHeader and midiStreamOut -Wait until the user decides to do something else - -When PLAY is selected ---------------------- -Call midiStreamRestart to un-pause the device and begin playback -As buffers are returned, the callback function fills them with more data and -sends them back to be played by calling midiStreamOut() again. IT IS -IMPORTANT THAT YOU NOTE THAT IT IS NOT NECESSARY FOR YOU TO UNPREPARE AND -PREPARE BUFFERS EVERY TIME THEY ARE RETURNED. This is only a waste of time. -All you have to do is send them back into the subsystem with midiStreamOut(). -The API documentation is a bit confusing on this point. - -When PAUSE is selected ----------------------- -Call midiStreamPause() and wait for a PLAY or PAUSE to call midiStreamRestart(). -Note that pausing may make your audio sound kind of funny, since all notes are -turned off and some note on events may be lost when playback is restarted. - -When STOP is selected ---------------------- -Call midiStreamStop(). Since the callback function is in another thread, we -use a Win32 synchronization object, an event to block the main thread until -the callback thread has received all buffers. When this happens, we know it's -okay to go ahead and call midiStreamReset() and then to go ahead and free all -our buffers. Currently, the device is also closed using midiStreamClose(). -Then, if we are resetting the file to playback starting at its beginning point -the next time PLAY is hit, reopen the file by calling StreamBufferSetup(), -which is the workhorse function for opening a file and initializing the -the converter and the buffers. - -Note that the reason we must close and reopen the device is due to an apparent -bug in the Multimedia System which causes undesireable playback once a device -has been stopped. If you disable the code for closing the device, then the rest -of the code will automatically know it does not have to reopen the device. -However, the following may occur: After the first instance of playback followed -by a midiStreamStop() and a midiStreamReset(), there will be a pause equal in -length to the first playback period before playback begins once more with a call -to midiStreamRestart(). - -If Looped is selected ---------------------- -Notice that the converter has a little function in it called RewindConverter() -which is called by ConvertToBuffer() if the bLooped variable is TRUE. This -function resets the track state structures and performs most of the steps -originally executed in ConvertInit() with the notable exception of opening the -file and reading in file and track header data. It simply resets the tracks -to their initial state. - - -More on the buffering scheme ----------------------------- -Note that there is an OUT_BUFFER_SIZE and a BUFFER_TIME_LENGTH. The idea is -that the converter counts ticks and calculates when it has put at least -BUFFER_TIME_LENGTH milliseconds worth of events in the buffer. At this point, -it returns to the caller with a "full" buffer. At the very worst, there will -be as many events as can fit into OUT_BUFFER_SIZE bytes. Imagine that you have -to MIDI files loaded into memory somehow and you want to switch between them in -a hurry to correspond to some action the player performed like switching rooms. -All you have to do is start filling the next buffer with new data (assuming -they streams use similar patch sets, time division settings, etc.) and after -(NUM_STREAM_BUFFERS-1)*BUFFER_TIME_LENGTH milliseconds, the music will switch -over automatically. This theory is sort of illustrated by the tempo trackbar -control in this sample. This control sets a flag which forces the converter -code to start a new buffer, with the first event being a new tempo setting. -The tempo setting is calculated as a relative increase with respect to the -last real tempo event from the file. Of course, to implement the scheme -mentioned above requires some modification to the converter code so that it -will work with multiple MIDI files. - -Since the buffering scheme uses very small buffers, it is currently rather -sensitive to heavy activity which may prevent it from completing processing -in time. This can be solved by increasing the NUM_STREAM_BUFFERS constant, -but you must make a trade-off between latency and playback stability. - - -Known problems and possible improvements: ------------------------------------------ -It is more desireable to enumerate all possible MIDI output devices and then - either allow the user to use a specific device, or choose one which has - desireable capabilities. It is not recommended that you ship a product - which is hard-coded to use the MIDI Mapper only. For more on enumerating - MIDI output devices, see the MIDIPLYR sample application which is part of - the Win32 SDK. - -Instead of using the BUFFER_TIME_LENGTH, it would be possible to handle the - time signature META event in MIDI files and calculate the length of a - measure of music. Then you could change buffers at the end of each measure, - which would probably yield a smoother sounding transition. It may even be - possible to define system-exclusive events or other such extensions to the - MIDI converter code designed to provide your application with extra data - about when to switch between buffers or do other processing, though it is - not necessarily recommended that you modify the MIDI file format spec. For - more information on that spec, contact the International MIDI Association. - -You may wish to modify the way a change in tempo is handled, or remove this - code entirely. Right now, there is a chunk of code in the convert function - AddEventToStreamBuffer() which detects tempo events and stores the new tempo. - There is also code which will react to the tempo slider by calculating a new - tempo, truncating the current buffer, and starting the next buffer with a - tempo event reflecting the new desired tempo. It may be more desireable to - force any tempo changes which are not encoded in the file originally to take - effect only on buffer boundaries, instead of always creating a buffer - boundary. Proceeding under the above context of buffers equal in length to - measures of music, it may make more sense to only change tempo between each - measure. You can also send tempo change messages using the midiOutShortMsg() - function, similar to the way SetAllChannelVolumes() behaves. - -The volume control is a channel-wide, percentage-based control which relies on - a cache of volumes for each channel. As the converter encounters a volume - change message, it flags it for a callback. This causes the MidiProc() to - receive notification when that event is reached. MidiProc() then grabs a - copy of the new volume event and sends a MIDI short message to the proper - channel which reflects the current slider position. In other words, the - code saves the "full" or "raw" value and then modifies it so the volume - trackbar represents a percentage of that volume. Though it is not shown - here, this scheme could be broken down to allow for individual volume - control also. This idea could also be expanded to include the LSB volume - controller(39), which is not handled here. - -Further, by duplicating the volume code described above and making slight - modifications to the converter (to detect other events), it is possible to - handle pan, balance, or other controller messages using the exact same idea. - -Having said the above, it should be noted that attaching the volume change code - to a trackbar is for illustration purposes only. The implementation shown - and described works best for isolated volume events, like when your player - moves away from the sound source and you need to update volume. It should - not really be used for real-time scrolling because the method tends to flood - the MIDI output device with short messages, which interferes severly with - playback. - -BUG: If you are using an internal MIDI device which uses the OPL chipset, you - should be aware of a bug which seems to occur in most of these drivers. If - a volume channel message is sent to these drivers, they will not reflect the - change until a note on/off event occurs. This means long sustaining notes - will not reduce in volume. diff --git a/sdk/samples/mstream/resource.h b/sdk/samples/mstream/resource.h deleted file mode 100644 index 8e71fe7..0000000 --- a/sdk/samples/mstream/resource.h +++ /dev/null @@ -1,81 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by mstream.rc -// -#define IDR_MAINMENU 101 -#define IDC_PLAY 101 -#define IDD_ABOUTBOX 102 -#define IDC_STOP 102 -#define IDC_PAUSE 103 -#define IDI_ICON1 107 -#define IDI_ICON2 108 -#define IDI_ICON3 111 -#define IDS_TBTITLE_PAN 8192 -#define IDS_TBTITLE_VOLUME 8193 -#define IDS_TBTITLE_FREQUENCY 8194 -#define IDS_TBTITLE_PROGRESS 8195 -#define IDS_BUTTON_PLAY 8196 -#define IDS_BUTTON_STOP 8197 -#define IDS_CHECK_LOOPED 8198 -#define IDS_TBTITLE_TEMPO 8199 -#define IDS_BUTTON_PAUSE 8200 -#define IDS_APP_TITLE 8208 -#define IDS_APP_CAPTION 8209 -#define IDS_APP_NAME 8210 -#define IDS_OPEN_DLGTITLE 8211 -#define IDS_OPEN_FILTER1 8212 -#define IDS_OPEN_FILTER2 8213 -#define IDS_OPEN_FILTER3 8214 -#define IDS_OPEN_FILTER4 8215 -#define IDS_ERROR_APPINIT 8224 -#define IDS_ERROR_INSTANCEINIT 8225 -#define IDS_ERROR_REGISTERCLASS 8226 -#define IDS_ERROR_MAINWNDCREATE 8227 -#define IDS_ERROR_NOMIDIMAPPER 8228 -#define IDS_ERROR_CHILDTEMPLATE 8244 -#define IDS_ERROR_TRACKBAR 8245 -#define IDS_ERROR_BUTTON 8246 -#define IDS_ERROR_STATICTEXT 8247 -#define IDS_ERROR_GETTEXTEXTENT 8248 -#define IDS_ERROR_CHECK 8249 -#define IDS_CDERR_GENERAL_BASE 16384 -#define IDS_CDERR_FINDRESFAILURE 16385 -#define IDS_CDERR_INITIALIZATION 16386 -#define IDS_CDERR_LOADRESFAILURE 16387 -#define IDS_CDERR_LOCKRESFAILURE 16388 -#define IDS_CDERR_LOADSTRFAILURE 16389 -#define IDS_CDERR_MEMALLOCFAILURE 16390 -#define IDS_CDERR_MEMLOCKFAILURE 16391 -#define IDS_CDERR_NOHINSTANCE 16392 -#define IDS_CDERR_NOHOOK 16393 -#define IDS_CDERR_NOTEMPLATE 16394 -#define IDS_CDERR_REGISTERMSGFAIL 16395 -#define IDS_CDERR_STRUCTSIZE 16396 -#define IDS_CDERR_DIALOGFAILURE 16397 -#define IDS_CDERR_TITLESTRING 16398 -#define IDC_LOOPCHECK 40001 -#define IDM_FILE_EXIT 40002 -#define IDM_HELP_ABOUT 40003 -#define IDM_FILE_OPEN 40004 -#define IDM_FILE_CLOSE 40005 -#define IDM_PLAY 40006 -#define IDM_STOP 40007 -#define IDC_OPTIONS_LOOPED 40008 -#define IDM_ACTIONS_LOOPED 40008 -#define IDC_OPTIONS_MIDIOUTDEVICE 40009 -#define IDM_ACTIONS_PLAY 40010 -#define IDM_ACTIONS_PAUSE 40011 -#define IDM_ACTIONS_STOP 40012 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 113 -#define _APS_NEXT_COMMAND_VALUE 40013 -#define _APS_NEXT_CONTROL_VALUE 1004 -#define _APS_NEXT_SYMED_VALUE 104 -#endif -#endif diff --git a/sdk/samples/oct1/makefile b/sdk/samples/oct1/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/oct1/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/oct1/msvc.mk b/sdk/samples/oct1/msvc.mk deleted file mode 100644 index c33dba3..0000000 --- a/sdk/samples/oct1/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = oct1 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = oct1.obj d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj d3dmain.obj stats.obj d3dmath.obj lclib.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT = -DD3DDEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/oct1/oct1.c b/sdk/samples/oct1/oct1.c deleted file mode 100644 index 358b889..0000000 --- a/sdk/samples/oct1/oct1.c +++ /dev/null @@ -1,470 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: oct1.c - * - ***************************************************************************/ - -#include -#include -#include "d3ddemo.h" - -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -static D3DEXECUTEBUFFERDESC debDesc; -LPDIRECT3DLIGHT lpD3DLight; -LPDIRECT3DMATERIAL lpBmat, lpMat1, lpMat2; - -extern LPD3DVECTOR D3DVECTORNormalise(LPD3DVECTOR); - -/* - * Global projection, view, world and identity matricies - */ -D3DMATRIXHANDLE hProj; -D3DMATRIXHANDLE hView; -D3DMATRIXHANDLE hViewRot, hDViewRot; -D3DMATRIXHANDLE hViewPos; -D3DMATRIXHANDLE hWorld, hDWorld; - -D3DMATRIX proj = { - D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0) -}; - -D3DMATRIX viewpos = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0), D3DVAL(1.0) -}; -D3DMATRIX viewrot, view, dviewrot, dworld; -D3DMATRIX identity = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Octagon D3D Example"); -} - -BOOL -TickScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView) -{ - static int dir = 1; - - if (viewpos._43 < D3DVAL(4.0)) - dir = 0; - if (viewpos._43 > D3DVAL(12.0)) - dir = 1; - if (dir) - viewpos._43 -= D3DVAL(0.4); - else - viewpos._43 += D3DVAL(0.4); - if (lpDev->lpVtbl->SetMatrix(lpDev, hViewPos, &viewpos) != D3D_OK) - return FALSE; - return TRUE; -} - -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - /* - * Execute the instruction buffer - */ - if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, lpView, D3DEXECUTE_CLIPPED) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData) != D3D_OK) - return FALSE; - *lpExtent = d3dExData.dsStatus.drExtent; - if (!(TickScene(lpDev, lpView))) - return FALSE; - return TRUE; -} - -void -ReleaseScene(void) -{ - return; -} - -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - if (lpView && lpD3DLight) - lpView->lpVtbl->DeleteLight(lpView, lpD3DLight); - RELEASE(lpD3DLight); - RELEASE(lpD3DExBuf); - RELEASE(lpMat2); - RELEASE(lpBmat); -} - -BOOL -InitScene(void) -{ - return TRUE; -} - -#define NUM_VERTICES 6 -#define NUM_TRIANGLES 8 - -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - D3DVERTEX v[NUM_VERTICES]; - D3DLIGHT light; - LPVOID lpBufStart, lpInsStart, lpPointer; - LPD3DTRIANGLE lpTri; - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf; - size_t size; - int t[8][3] = { - 0, 1, 2, - 0, 2, 3, - 0, 3, 4, - 0, 4, 1, - 5, 2, 1, - 5, 3, 2, - 5, 4, 3, - 5, 1, 4 - }; - D3DMATERIAL bmat, mat1, mat2; - D3DMATERIALHANDLE hBmat, hMat1, hMat2; - D3DTEXTUREHANDLE bTex; - D3DTEXTUREHANDLE fooTex; - int i; - D3DVALUE ct, st; - - bTex = TextureHandle[1]; - fooTex = TextureHandle[0]; - memset(&bmat, 0, sizeof(D3DMATERIAL)); - bmat.dwSize = sizeof(D3DMATERIAL); - bmat.diffuse.r = (D3DVALUE)1.0; - bmat.diffuse.g = (D3DVALUE)1.0; - bmat.diffuse.b = (D3DVALUE)1.0; - bmat.ambient.r = (D3DVALUE)1.0; - bmat.ambient.g = (D3DVALUE)1.0; - bmat.ambient.b = (D3DVALUE)1.0; - bmat.hTexture = fooTex; - bmat.dwRampSize = 1; - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpBmat, NULL) != D3D_OK) { - return FALSE; - } - if (lpBmat->lpVtbl->SetMaterial(lpBmat, &bmat) != D3D_OK) { - return FALSE; - } - if (lpBmat->lpVtbl->GetHandle(lpBmat, lpDev, &hBmat) != D3D_OK) { - return FALSE; - } - if (lpView->lpVtbl->SetBackground(lpView, hBmat) != D3D_OK) { - return FALSE; - } - - /* - * Set the view, world and projection matrices - * Create a buffer for matrix set commands etc. - */ - MAKE_MATRIX(lpDev, hViewRot, identity); - MAKE_MATRIX(lpDev, hViewPos, viewpos); - MAKE_MATRIX(lpDev, hView, identity); - MAKE_MATRIX(lpDev, hProj, proj); - MAKE_MATRIX(lpDev, hWorld, identity); - ct = D3DVAL(cos(0.1)); - st = D3DVAL(sin(0.1)); - dviewrot = identity; - dviewrot._22 = ct; - dviewrot._23 = -st; - dviewrot._32 = st; - dviewrot._33 = ct; - MAKE_MATRIX(lpDev, hDViewRot, dviewrot); - dworld = identity; - dworld._11 = ct; - dworld._13 = -st; - dworld._31 = st; - dworld._33 = ct; - MAKE_MATRIX(lpDev, hDWorld, dworld); - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 4; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExCmdBuf, - NULL) != D3D_OK) - return FALSE; - /* - * lock it so it can be filled - */ - if (lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - lpInsStart = lpPointer; - OP_STATE_TRANSFORM(3, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_VIEW, hView, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_PROJECTION, hProj, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_AMBIENT, RGBA_MAKE(64, 64, 64, 64), lpPointer); - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char*)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - lpDev->lpVtbl->BeginScene(lpDev); - lpDev->lpVtbl->Execute(lpDev, lpD3DExCmdBuf, lpView, D3DEXECUTE_UNCLIPPED); - lpDev->lpVtbl->EndScene(lpDev); - /* - * We are done with the command buffer. - */ - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - /* - * Setup a material - */ - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpMat1, NULL) != D3D_OK) { - return FALSE; - } - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpMat2, NULL) != D3D_OK) { - return FALSE; - } - memset(&mat1, 0, sizeof(D3DMATERIAL)); - mat1.dwSize = sizeof(D3DMATERIAL); - - mat1.diffuse.r = (D3DVALUE)1.0; - mat1.diffuse.g = (D3DVALUE)0.0; - mat1.diffuse.b = (D3DVALUE)0.0; - mat1.diffuse.a = (D3DVALUE)1.0; - mat1.ambient.r = (D3DVALUE)1.0; - mat1.ambient.g = (D3DVALUE)0.0; - mat1.ambient.b = (D3DVALUE)0.0; - mat1.specular.r = (D3DVALUE)1.0; - mat1.specular.g = (D3DVALUE)1.0; - mat1.specular.b = (D3DVALUE)1.0; - mat1.power = (float)20.0; - mat1.dwRampSize = 16; - mat1.hTexture = bTex; - lpMat1->lpVtbl->SetMaterial(lpMat1, &mat1); - lpMat1->lpVtbl->GetHandle(lpMat1, lpDev, &hMat1); - memset(&mat2, 0, sizeof(D3DMATERIAL)); - mat2.dwSize = sizeof(D3DMATERIAL); - mat2.diffuse.r = (D3DVALUE)1.0; - mat2.diffuse.g = (D3DVALUE)1.0; - mat2.diffuse.b = (D3DVALUE)1.0; - mat2.diffuse.a = (D3DVALUE)1.0; - mat2.ambient.r = (D3DVALUE)1.0; - mat2.ambient.g = (D3DVALUE)1.0; - mat2.ambient.b = (D3DVALUE)1.0; - mat2.specular.r = (D3DVALUE)1.0; - mat2.specular.g = (D3DVALUE)1.0; - mat2.specular.b = (D3DVALUE)1.0; - mat2.power = (float)20.0; - mat2.dwRampSize = 16; - mat2.hTexture = bTex; - lpMat2->lpVtbl->SetMaterial(lpMat2, &mat2); - lpMat2->lpVtbl->GetHandle(lpMat2, lpDev, &hMat2); - /* - * Setup vertices - */ - memset(&v[0], 0, sizeof(D3DVERTEX) * NUM_VERTICES); - /* V 0 */ - v[0].x = D3DVALP(0.0, 12); - v[0].y = D3DVALP(1.0, 12); - v[0].z = D3DVALP(1.0, 12); - - v[0].nx = D3DVALP(0.0, 12); - v[0].ny = D3DVALP(1.0, 12); - v[0].nz = D3DVALP(0.0, 12); - - v[0].tu = D3DVAL(0.0); - v[0].tv = D3DVAL(0.0); - - /* V 1 */ - v[1].x = D3DVALP(1.0, 12); - v[1].y = D3DVALP(0.0, 12); - v[1].z = D3DVALP(0.0, 12); - - v[1].nx = D3DVALP(1.0, 12); - v[1].ny = D3DVALP(0.0, 12); - v[1].nz = D3DVALP(-1.0, 12); - - v[1].tu = D3DVAL(1.0); - v[1].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[1].nx); - - /* V 2 */ - v[2].x = D3DVALP(-1.0, 12); - v[2].y = D3DVALP(0.0, 12); - v[2].z = D3DVALP(0.0, 12); - - v[2].nx = D3DVALP(-1.0, 12); - v[2].ny = D3DVALP(0.0, 12); - v[2].nz = D3DVALP(-1.0, 12); - - v[2].tu = D3DVAL(0.0); - v[2].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[2].nx); - - /* V 3 */ - v[3].x = D3DVALP(-1.0, 12); - v[3].y = D3DVALP(0.0, 12); - v[3].z = D3DVALP(2.0, 12); - - v[3].nx = D3DVALP(-1.0, 12); - v[3].ny = D3DVALP(0.0, 12); - v[3].nz = D3DVALP(1.0, 12); - - v[3].tu = D3DVAL(1.0); - v[3].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[3].nx); - - /* V 4 */ - v[4].x = D3DVALP(1.0, 12); - v[4].y = D3DVALP(0.0, 12); - v[4].z = D3DVALP(2.0, 12); - - v[4].nx = D3DVALP(1.0, 12); - v[4].ny = D3DVALP(0.0, 12); - v[4].nz = D3DVALP(1.0, 12); - - v[4].tu = D3DVAL(0.0); - v[4].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[4].nx); - - /* V 5 */ - v[5].x = D3DVALP(0.0, 12); - v[5].y = D3DVALP(-1.0, 12); - v[5].z = D3DVALP(1.0, 12); - - v[5].nx = D3DVALP(0.0, 12); - v[5].ny = D3DVALP(-1.0, 12); - v[5].nz = D3DVALP(0.0, 12); - - v[5].tu = D3DVAL(0.0); - v[5].tv = D3DVAL(0.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[5].nx); - - /* - * Create an execute buffer - */ - size = sizeof(D3DVERTEX) * NUM_VERTICES; - size += sizeof(D3DSTATUS) * 1; - size += sizeof(D3DPROCESSVERTICES) * 2; - size += sizeof(D3DINSTRUCTION) * 10; - size += sizeof(D3DMATRIXMULTIPLY) * 3; - size += sizeof(D3DSTATE) * 5; - size += sizeof(D3DTRIANGLE) * NUM_TRIANGLES; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, - NULL) != D3D_OK) { - return FALSE; - } - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) { - return FALSE; - } - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - /* - * Copy vertices to execute buffer - */ - VERTEX_DATA(&v[0], NUM_VERTICES, lpPointer); - /* - * Setup instructions in execute buffer - */ - lpInsStart = lpPointer; - OP_MATRIX_MULTIPLY(3, lpPointer); - MATRIX_MULTIPLY_DATA(hViewRot, hDViewRot, hViewRot, lpPointer); - MATRIX_MULTIPLY_DATA(hViewRot, hViewPos, hView, lpPointer); - MATRIX_MULTIPLY_DATA(hWorld, hDWorld, hWorld, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, hMat1, lpPointer); - OP_SET_STATUS(D3DSETSTATUS_ALL, D3DSTATUS_DEFAULT, 2048, 2048, 0, 0, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 0, 5, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, hMat2, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 5, 1, lpPointer); - OP_STATE_RENDER(3, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, bTex, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPU, FALSE, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPV, FALSE, lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(NUM_TRIANGLES, lpPointer); - lpTri = (LPD3DTRIANGLE)lpPointer; - for (i = 0; i < NUM_TRIANGLES; i++) { - lpTri->v1 = t[i][0]; - lpTri->v2 = t[i][1]; - lpTri->v3 = t[i][2]; - lpTri->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - lpTri++; - } - lpPointer = (void*)lpTri; - OP_EXIT(lpPointer); - /* - * Setup the execute data - */ - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = NUM_VERTICES; - d3dExData.dwInstructionOffset = (ULONG) ((char *)lpInsStart - (char *)lpBufStart); - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char*)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - /* - * Setup lights - */ - memset(&light, 0, sizeof(D3DLIGHT)); - light.dwSize = sizeof(D3DLIGHT); - light.dltType = D3DLIGHT_DIRECTIONAL; - light.dcvColor.r = D3DVAL(1.0); - light.dcvColor.g = D3DVAL(1.0); - light.dcvColor.b = D3DVAL(1.0); - light.dcvColor.a = D3DVAL(1.0); - light.dvDirection.x = D3DVALP(0.0, 12); - light.dvDirection.y = D3DVALP(0.0, 12); - light.dvDirection.z = D3DVALP(1.0, 12); - if (lpD3D->lpVtbl->CreateLight(lpD3D, &lpD3DLight, NULL) != D3D_OK) { - return FALSE; - } - if (lpD3DLight->lpVtbl->SetLight(lpD3DLight, &light) != D3D_OK) { - return FALSE; - } - if (lpView->lpVtbl->AddLight(lpView, lpD3DLight) != D3D_OK) { - return FALSE; - } - return TRUE; -} diff --git a/sdk/samples/oct1/oct1.def b/sdk/samples/oct1/oct1.def deleted file mode 100644 index d50033e..0000000 --- a/sdk/samples/oct1/oct1.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME oct1.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/oct1/readme.txt b/sdk/samples/oct1/readme.txt deleted file mode 100644 index c401e85..0000000 --- a/sdk/samples/oct1/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -Oct1 -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Simple spinning shape constructed from vertex and triangle data within -the source. Two materials are used. The second material is only used -on one vertex. Spinning is done by updating and setting the matrix -each frame. The background material contains a texture. diff --git a/sdk/samples/oct2/makefile b/sdk/samples/oct2/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/oct2/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/oct2/msvc.mk b/sdk/samples/oct2/msvc.mk deleted file mode 100644 index 7090253..0000000 --- a/sdk/samples/oct2/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = oct2 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = oct2.obj d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj d3dmain.obj stats.obj d3dmath.obj lclib.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT = -DD3DDEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/oct2/oct2.c b/sdk/samples/oct2/oct2.c deleted file mode 100644 index b448611..0000000 --- a/sdk/samples/oct2/oct2.c +++ /dev/null @@ -1,447 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: oct2.c - * - ***************************************************************************/ - -#include -#include -#include "d3ddemo.h" - -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -static D3DEXECUTEBUFFERDESC debDesc; -LPDIRECT3DLIGHT lpD3DLight; -LPDIRECT3DMATERIAL lpBmat, lpMat2; - -extern LPD3DVECTOR D3DVECTORNormalise(LPD3DVECTOR); - -/* - * Global projection, view, world and identity matricies - */ -D3DMATRIXHANDLE hProj; -D3DMATRIXHANDLE hView; -D3DMATRIXHANDLE hViewRot, hDViewRot; -D3DMATRIXHANDLE hViewPos; -D3DMATRIXHANDLE hWorld, hDWorld; - -D3DMATRIX proj = { - D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0) -}; - -D3DMATRIX viewpos = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0), D3DVAL(1.0) -}; -D3DMATRIX viewrot, view, dviewrot, dworld; -D3DMATRIX identity = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Octagon II D3D Example"); -} - -BOOL -TickScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView) -{ - static int dir = 1; - - if (viewpos._43 < D3DVAL(4.0)) - dir = 0; - if (viewpos._43 > D3DVAL(12.0)) - dir = 1; - if (dir) - viewpos._43 -= D3DVAL(0.4); - else - viewpos._43 += D3DVAL(0.4); - if (lpDev->lpVtbl->SetMatrix(lpDev, hViewPos, &viewpos) != D3D_OK) - return FALSE; - return TRUE; -} - - - -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - /* - * Execute the instruction buffer - */ - if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, lpView, D3DEXECUTE_CLIPPED) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData) != D3D_OK) - return FALSE; - *lpExtent = d3dExData.dsStatus.drExtent; - if (!(TickScene(lpDev, lpView))) - return FALSE; - return TRUE; -} - -void -ReleaseScene(void) -{ - return; -} - -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - if (lpView) - lpView->lpVtbl->DeleteLight(lpView, lpD3DLight); - RELEASE(lpD3DLight); - RELEASE(lpD3DExBuf); - RELEASE(lpMat2); - RELEASE(lpBmat); -} - -BOOL -InitScene(void) -{ - return TRUE; -} - -#define NUM_VERTICES 6 -#define NUM_TRIANGLES 8 - -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - D3DVERTEX v[NUM_VERTICES]; - D3DLIGHT light; - LPVOID lpBufStart, lpInsStart, lpPointer; - LPD3DTRIANGLE lpTri; - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf; - size_t size; - int t[8][3] = { - 0, 1, 2, - 0, 2, 3, - 0, 3, 4, - 0, 4, 1, - 5, 2, 1, - 5, 3, 2, - 5, 4, 3, - 5, 1, 4 - }; - D3DMATERIAL bmat, mat2; - D3DMATERIALHANDLE hBmat, hMat2; - D3DTEXTUREHANDLE bTex; - int i; - D3DVALUE ct, st; - - memset(&bmat, 0, sizeof(D3DMATERIAL)); - bmat.dwSize = sizeof(D3DMATERIAL); - bmat.dwRampSize = 1; - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpBmat, NULL) != D3D_OK) { - return FALSE; - } - if (lpBmat->lpVtbl->SetMaterial(lpBmat, &bmat) != D3D_OK) { - return FALSE; - } - if (lpBmat->lpVtbl->GetHandle(lpBmat, lpDev, &hBmat) != D3D_OK) { - return FALSE; - } - if (lpView->lpVtbl->SetBackground(lpView, hBmat) != D3D_OK) { - return FALSE; - } - - /* - * Set the view, world and projection matrices - * Create a buffer for matrix set commands etc. - */ - MAKE_MATRIX(lpDev, hViewRot, identity); - MAKE_MATRIX(lpDev, hViewPos, viewpos); - MAKE_MATRIX(lpDev, hView, identity); - MAKE_MATRIX(lpDev, hProj, proj); - MAKE_MATRIX(lpDev, hWorld, identity); - ct = D3DVAL(cos(0.1)); - st = D3DVAL(sin(0.1)); - dviewrot = identity; - dviewrot._22 = ct; - dviewrot._23 = -st; - dviewrot._32 = st; - dviewrot._33 = ct; - MAKE_MATRIX(lpDev, hDViewRot, dviewrot); - dworld = identity; - dworld._11 = ct; - dworld._13 = -st; - dworld._31 = st; - dworld._33 = ct; - MAKE_MATRIX(lpDev, hDWorld, dworld); - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 4; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExCmdBuf, - NULL) != D3D_OK) - return FALSE; - /* - * lock it so it can be filled - */ - if (lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - lpInsStart = lpPointer; - OP_STATE_TRANSFORM(3, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_PROJECTION, hProj, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_VIEW, hView, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_AMBIENT, RGBA_MAKE(64, 64, 64, 64), lpPointer); - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char*)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - lpDev->lpVtbl->BeginScene(lpDev); - lpDev->lpVtbl->Execute(lpDev, lpD3DExCmdBuf, lpView, D3DEXECUTE_UNCLIPPED); - lpDev->lpVtbl->EndScene(lpDev); - /* - * We are done with the command buffer. - */ - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - /* - * Setup a material - */ - bTex = TextureHandle[1]; - memset(&mat2, 0, sizeof(D3DMATERIAL)); - mat2.dwSize = sizeof(D3DMATERIAL); - - mat2.diffuse.r = (D3DVALUE)0.5; - mat2.diffuse.g = (D3DVALUE)0.5; - mat2.diffuse.b = (D3DVALUE)0.5; - mat2.diffuse.a = (D3DVALUE)0.5; - mat2.ambient.r = (D3DVALUE)0.8; - mat2.ambient.g = (D3DVALUE)0.8; - mat2.ambient.b = (D3DVALUE)0.8; - mat2.specular.r = (D3DVALUE)1.0; - mat2.specular.g = (D3DVALUE)1.0; - mat2.specular.b = (D3DVALUE)1.0; - mat2.power = (float)20.0; - mat2.dwRampSize = 32; - mat2.hTexture = bTex; - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpMat2, NULL) != D3D_OK) { - return FALSE; - } - if (lpMat2->lpVtbl->SetMaterial(lpMat2, &mat2) != D3D_OK) { - return FALSE; - } - if (lpMat2->lpVtbl->GetHandle(lpMat2, lpDev, &hMat2) != D3D_OK) { - return FALSE; - } - /* - * Setup vertices - */ - memset(&v[0], 0, sizeof(D3DVERTEX) * NUM_VERTICES); - /* V 0 */ - v[0].x = D3DVALP(0.0, 12); - v[0].y = D3DVALP(1.0, 12); - v[0].z = D3DVALP(1.0, 12); - - v[0].nx = D3DVALP(0.0, 12); - v[0].ny = D3DVALP(1.0, 12); - v[0].nz = D3DVALP(0.0, 12); - - v[0].tu = D3DVAL(0.0); - v[0].tv = D3DVAL(0.0); - - /* V 1 */ - v[1].x = D3DVALP(1.0, 12); - v[1].y = D3DVALP(0.0, 12); - v[1].z = D3DVALP(0.0, 12); - - v[1].nx = D3DVALP(1.0, 12); - v[1].ny = D3DVALP(0.0, 12); - v[1].nz = D3DVALP(-1.0, 12); - - v[1].tu = D3DVAL(1.0); - v[1].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[1].nx); - - /* V 2 */ - v[2].x = D3DVALP(-1.0, 12); - v[2].y = D3DVALP(0.0, 12); - v[2].z = D3DVALP(0.0, 12); - - v[2].nx = D3DVALP(-1.0, 12); - v[2].ny = D3DVALP(0.0, 12); - v[2].nz = D3DVALP(-1.0, 12); - - v[2].tu = D3DVAL(0.0); - v[2].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[2].nx); - - /* V 3 */ - v[3].x = D3DVALP(-1.0, 12); - v[3].y = D3DVALP(0.0, 12); - v[3].z = D3DVALP(2.0, 12); - - v[3].nx = D3DVALP(-1.0, 12); - v[3].ny = D3DVALP(0.0, 12); - v[3].nz = D3DVALP(1.0, 12); - - v[3].tu = D3DVAL(1.0); - v[3].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[3].nx); - - /* V 4 */ - v[4].x = D3DVALP(1.0, 12); - v[4].y = D3DVALP(0.0, 12); - v[4].z = D3DVALP(2.0, 12); - - v[4].nx = D3DVALP(1.0, 12); - v[4].ny = D3DVALP(0.0, 12); - v[4].nz = D3DVALP(1.0, 12); - - v[4].tu = D3DVAL(0.0); - v[4].tv = D3DVAL(1.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[4].nx); - - /* V 5 */ - v[5].x = D3DVALP(0.0, 12); - v[5].y = D3DVALP(-1.0, 12); - v[5].z = D3DVALP(1.0, 12); - - v[5].nx = D3DVALP(0.0, 12); - v[5].ny = D3DVALP(-1.0, 12); - v[5].nz = D3DVALP(0.0, 12); - - v[5].tu = D3DVAL(0.0); - v[5].tv = D3DVAL(0.0); - - D3DVECTORNormalise((LPD3DVECTOR) & v[5].nx); - - /* - * Create an execute buffer - */ - size = sizeof(D3DVERTEX) * NUM_VERTICES; - size += sizeof(D3DPROCESSVERTICES) * 2; - size += sizeof(D3DSTATUS) * 1; - size += sizeof(D3DINSTRUCTION) * 10; - size += sizeof(D3DMATRIXMULTIPLY) * 3; - size += sizeof(D3DSTATE) * 5; - size += sizeof(D3DTRIANGLE) * NUM_TRIANGLES; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, - NULL) != D3D_OK) { - return FALSE; - } - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) { - return FALSE; - } - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - /* - * Copy vertices to execute buffer - */ - VERTEX_DATA(&v[0], NUM_VERTICES, lpPointer); - /* - * Setup instructions in execute buffer - */ - lpInsStart = lpPointer; - OP_MATRIX_MULTIPLY(3, lpPointer); - MATRIX_MULTIPLY_DATA(hViewRot, hDViewRot, hViewRot, lpPointer); - MATRIX_MULTIPLY_DATA(hViewRot, hViewPos, hView, lpPointer); - MATRIX_MULTIPLY_DATA(hWorld, hDWorld, hWorld, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, hMat2, lpPointer); - OP_SET_STATUS(D3DSETSTATUS_ALL, D3DSTATUS_DEFAULT, 2048, 2048, 0, 0, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 0, 5, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, hMat2, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 5, 1, lpPointer); - OP_STATE_RENDER(3, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, bTex, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPU, FALSE, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPV, FALSE, lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(NUM_TRIANGLES, lpPointer); - lpTri = (LPD3DTRIANGLE)lpPointer; - for (i = 0; i < NUM_TRIANGLES; i++) { - lpTri->v1 = t[i][0]; - lpTri->v2 = t[i][1]; - lpTri->v3 = t[i][2]; - lpTri->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - lpTri++; - } - lpPointer = (void*)lpTri; - OP_EXIT(lpPointer); - /* - * Setup the execute data - */ - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = NUM_VERTICES; - d3dExData.dwInstructionOffset = (ULONG) ((char *)lpInsStart - (char *)lpBufStart); - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char*)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - /* - * Setup lights - */ - memset(&light, 0, sizeof(D3DLIGHT)); - light.dwSize = sizeof(D3DLIGHT); - light.dltType = D3DLIGHT_DIRECTIONAL; - light.dcvColor.r = D3DVAL(1.0); - light.dcvColor.g = D3DVAL(1.0); - light.dcvColor.b = D3DVAL(1.0); - light.dcvColor.a = D3DVAL(1.0); - light.dvDirection.x = D3DVALP(0.0, 12); - light.dvDirection.y = D3DVALP(0.0, 12); - light.dvDirection.z = D3DVALP(1.0, 12); - if (lpD3D->lpVtbl->CreateLight(lpD3D, &lpD3DLight, NULL) != D3D_OK) { - return FALSE; - } - if (lpD3DLight->lpVtbl->SetLight(lpD3DLight, &light) != D3D_OK) { - return FALSE; - } - if (lpView->lpVtbl->AddLight(lpView, lpD3DLight) != D3D_OK) { - return FALSE; - } - return TRUE; -} diff --git a/sdk/samples/oct2/oct2.def b/sdk/samples/oct2/oct2.def deleted file mode 100644 index 40011d0..0000000 --- a/sdk/samples/oct2/oct2.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME oct2.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/oct2/readme.txt b/sdk/samples/oct2/readme.txt deleted file mode 100644 index 0fb86a7..0000000 --- a/sdk/samples/oct2/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -Oct2 -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Simple spinning shape constructed from vertex and triangle data within -the source. Two materials are used. The second material is only used -on one vertex. Spinning is done by updating and setting the matrix -each frame. - -Identical to oct1 except that the background does not contain a -texture. diff --git a/sdk/samples/palette/makefile b/sdk/samples/palette/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/palette/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/palette/msvc.mk b/sdk/samples/palette/msvc.mk deleted file mode 100644 index fae8360..0000000 --- a/sdk/samples/palette/msvc.mk +++ /dev/null @@ -1,40 +0,0 @@ -NAME = palette -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - gdi32.lib libc.lib - -OBJS = palette.obj lbprintf.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/palette/palette.cpp b/sdk/samples/palette/palette.cpp deleted file mode 100644 index c449677..0000000 --- a/sdk/samples/palette/palette.cpp +++ /dev/null @@ -1,477 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: palette.cpp - * Content: Does some basic palette manipulation - * - ***************************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "resource.h" -#include "lbprintf.h" - -static char szClass[32]="DDTest1Class"; -static char szCaption[32]="DirectDraw Palette Test"; - -/* - * DirectDraw objects we will use - */ -#define MAX_PALETTES 4 -LPDIRECTDRAW lpDD; -LPDIRECTDRAWSURFACE lpDDPSurf; -LPDIRECTDRAWPALETTE lpDDPal[MAX_PALETTES]; -LPDIRECTDRAWPALETTE lpDDPalCurr; - -HWND hWndMain; - -BOOL bIsExclusive = TRUE; -BOOL bActive; - - -/* - * doAttach - * - * attach palette to the primary surface - */ -static void doAttach( int index ) -{ - HRESULT ddrval; - - ddrval = lpDDPSurf->SetPalette( lpDDPal[index] ); - if( ddrval == DDERR_SURFACELOST ) - { - lpDDPSurf->Restore(); - ddrval = lpDDPSurf->SetPalette( lpDDPal[index] ); - } - if (!FAILED(ddrval)) - { - LBPrintfDDRC( ddrval, "doAttach1: SetPalette" ); - lpDDPalCurr = lpDDPal[index]; - } - else - { - LBPrintf( "Could not attach palette" ); - lpDDPalCurr = NULL; - } - -} /* doAttach */ - -/* - * doDetach - * - * detach the current palette from the primary surface - */ -static void doDetach( void ) -{ - HRESULT ddrval; - - ddrval = lpDDPSurf->SetPalette( NULL ); - if( ddrval == DDERR_SURFACELOST ) - { - lpDDPSurf->Restore(); - ddrval = lpDDPSurf->SetPalette( NULL ); - } - LBPrintfDDRC( ddrval, "doDetach: SetPalette" ); - lpDDPalCurr = NULL; - -} /* doDetach */ - -/* - * doCycle - * - * cycle the current palette's red entries by 10 - */ -static void doCycle( void ) -{ - if( lpDDPalCurr != NULL ) - { - #define ENTRIES 10 - #define BASE 0 - PALETTEENTRY pe[ENTRIES]; - HRESULT ddrval; - int i; - - /* - * display the original entries - */ - ddrval = lpDDPalCurr->GetEntries( 0, BASE, ENTRIES, pe ); - if( ddrval == DDERR_SURFACELOST ) - { - lpDDPSurf->Restore(); - ddrval = lpDDPalCurr->GetEntries( 0, BASE, ENTRIES, pe ); - } - LBPrintfDDRC( ddrval, "GetEntries" ); - LBPrintf( "Old Entries" ); - for( i=0;iSetEntries( 0, BASE, ENTRIES, pe ); - if( ddrval == DDERR_SURFACELOST ) - { - lpDDPSurf->Restore(); - ddrval = lpDDPalCurr->SetEntries( 0, BASE, ENTRIES, pe ); - } - LBPrintfDDRC( ddrval, "SetEntries" ); - - /* - * display the new values - */ - ddrval = lpDDPalCurr->GetEntries( 0, BASE, ENTRIES, pe ); - if( ddrval == DDERR_SURFACELOST ) - { - lpDDPSurf->Restore(); - ddrval = lpDDPalCurr->GetEntries( 0, BASE, ENTRIES, pe ); - } - LBPrintfDDRC( ddrval, "GetEntries" ); - LBPrintf( "New Entries" ); - for( i=0;iRelease(); - LBPrintfDDRC( ddrval, "Release" ); - lpDDPal[i] = NULL; - } - } - - /* - * No current palette any more. - */ - lpDDPalCurr = NULL; - - if( excl ) - { - ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - } - else - { - ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_NORMAL ); - } - - LBPrintfDDRC( ddrval, "SetCooperativeLevel" ); - - /* - * set up 4 palettes - */ - ppe[0].peRed = 0; - ppe[0].peGreen = 0; - ppe[0].peBlue = 0; - ppe[255].peRed = 255; - ppe[255].peGreen = 255; - ppe[255].peBlue = 255; - - for( i=1;i<255;i++ ) - { - ppe[i].peRed = 0; - ppe[i].peGreen = 0; - ppe[i].peBlue = 0; - } - ddrval = lpDD->CreatePalette( DDPCAPS_8BIT, ppe, &lpDDPal[0], NULL ); - LBPrintfDDRC( ddrval, "CreatePalette" ); - - for( i=1;i<255;i++ ) - { - ppe[i].peRed = 0; - ppe[i].peGreen = 255; - ppe[i].peBlue = 255; - } - ddrval = lpDD->CreatePalette( DDPCAPS_8BIT, ppe, &lpDDPal[1], NULL ); - LBPrintfDDRC( ddrval, "CreatePalette" ); - - for( i=1;i<255;i++ ) - { - ppe[i].peRed = 255; - ppe[i].peGreen = 255; - ppe[i].peBlue = 0; - } - ddrval = lpDD->CreatePalette( DDPCAPS_8BIT, ppe, &lpDDPal[2], NULL ); - LBPrintfDDRC( ddrval, "CreatePalette" ); - - for( i=1;i<255;i++ ) - { - ppe[i].peRed = 255; - ppe[i].peGreen = 0; - ppe[i].peBlue = 255; - } - ddrval = lpDD->CreatePalette( DDPCAPS_8BIT, ppe, &lpDDPal[3], NULL ); - LBPrintfDDRC( ddrval, "CreatePalette" ); - LocalFree( ppe ); - - for( i=0;iRelease(); - lpDDPal[i] = NULL; - } - } - - if( lpDDPSurf != NULL ) - { - lpDDPSurf->Release(); - lpDDPSurf = NULL; - } - lpDD->Release(); - lpDD = NULL; - } - PostQuitMessage( 0 ); - break; - - default: - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - } - return 0L; - -} /* WindowProc */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - HRESULT ddrval; - DDSURFACEDESC ddsd; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC) WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof( DWORD ); - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); - wc.lpszMenuName = MAKEINTRESOURCE( IDR_MENU ); - wc.lpszClassName = szClass; - if( !RegisterClass( &wc ) ) - { - return FALSE; - } - - /* - * create a window - */ - hWndMain = CreateWindow( - szClass, // class - szCaption, // caption - WS_OVERLAPPEDWINDOW, // style - CW_USEDEFAULT, // x pos - CW_USEDEFAULT, // y pos - CW_USEDEFAULT, // width - CW_USEDEFAULT, // height - NULL, // parent window - NULL, // menu - hInstance, // instance - NULL // parms - ); - - if( !hWndMain ) - { - return FALSE; - } - - LBCreate( hWndMain, 100 ); - - ShowWindow( hWndMain, nCmdShow ); - UpdateWindow( hWndMain ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - LBPrintfDDRC( ddrval, "DirectDrawCreate" ); - if( ddrval != DD_OK ) - { - DestroyWindow( hWndMain ); - return FALSE; - } - - ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_NORMAL ); - - /* - * create the primary surface - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - ddrval = lpDD->CreateSurface( &ddsd, &lpDDPSurf, NULL ); - LBPrintfDDRC( ddrval, "CreateSurface" ); - if( ddrval != DD_OK ) - { - lpDD->Release(); - DestroyWindow( hWndMain ); - return FALSE; - } - - /* - * set up palettes - */ - if( !resetExclusiveAndPalettes( bIsExclusive ) ) - { - lpDDPSurf->Release(); - lpDD->Release(); - DestroyWindow( hWndMain ); - return FALSE; - } - - return TRUE; - -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - hPrevInstance = hPrevInstance; - lpCmdLine = lpCmdLine; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while( GetMessage( &msg, NULL, NULL, NULL ) ) - { - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } - - return( msg.wParam ); - -} /* WinMain */ diff --git a/sdk/samples/palette/palette.def b/sdk/samples/palette/palette.def deleted file mode 100644 index ab1bedd..0000000 --- a/sdk/samples/palette/palette.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME PALETTE - -DESCRIPTION 'Palette Test program (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/palette/palette.rc b/sdk/samples/palette/palette.rc deleted file mode 100644 index 56886dc..0000000 --- a/sdk/samples/palette/palette.rc +++ /dev/null @@ -1,19 +0,0 @@ -#include "resource.h" - -IDR_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Exclusive", IDM_EXCLUSIVE - MENUITEM "&Attach Palette 1", IDM_ATTACH1 - MENUITEM "A&ttach Palette 2", IDM_ATTACH2 - MENUITEM "Attac&h Palette 3", IDM_ATTACH3 - MENUITEM "Attach &Palette 4", IDM_ATTACH4 - MENUITEM "&Detach Palette", IDM_DETACH - MENUITEM "&Cycle Palette", IDM_CYCLE - MENUITEM SEPARATOR - MENUITEM "C&lear", IDM_CLEAR - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_EXIT - END -END diff --git a/sdk/samples/palette/readme.txt b/sdk/samples/palette/readme.txt deleted file mode 100644 index 843ea94..0000000 --- a/sdk/samples/palette/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -This is a basic example to show how to use DirectDraw palettes. - -4 separate DirectDrawPalette objects are created, and they can be attached -to the primary surface just by selecting a menu item. Any given palette -can be cycled through its red values. The palettes can be created in -exclusive mode or not. diff --git a/sdk/samples/palette/resource.h b/sdk/samples/palette/resource.h deleted file mode 100644 index 41aeea1..0000000 --- a/sdk/samples/palette/resource.h +++ /dev/null @@ -1,10 +0,0 @@ -#define IDR_MENU 102 -#define IDM_EXIT 40001 -#define IDM_ATTACH1 40002 -#define IDM_ATTACH2 40003 -#define IDM_ATTACH3 40004 -#define IDM_ATTACH4 40005 -#define IDM_DETACH 40006 -#define IDM_CYCLE 40007 -#define IDM_CLEAR 40008 -#define IDM_EXCLUSIVE 40009 diff --git a/sdk/samples/quat/makefile b/sdk/samples/quat/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/quat/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/quat/msvc.mk b/sdk/samples/quat/msvc.mk deleted file mode 100644 index 824c368..0000000 --- a/sdk/samples/quat/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = quat -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = quat.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT = -DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/quat/quat.c b/sdk/samples/quat/quat.c deleted file mode 100644 index 44a2c9e..0000000 --- a/sdk/samples/quat/quat.c +++ /dev/null @@ -1,193 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: quat.c - * - ***************************************************************************/ - -/* - * demonstration of representation of orientation using quaternions - */ - -#include "rmdemo.h" - -#define PI2 6.28318 -#define XPOS 2.0 -#define INTERPOLATE_STEP 0.05 - -static D3DRMQUATERNION q; - -static int view_width, view_height; - -void ReadMouse(int* buttons, int* x, int* y); - -void CDECL -UserControl(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - int mx, my, mb; - LPDIRECT3DRMFRAME scene; - D3DVALUE angle; - D3DVECTOR vx = {D3DVAL(1), D3DVAL(0), D3DVAL(0)}, - vy = {D3DVAL(0), D3DVAL(1), D3DVAL(0)}; - D3DRMQUATERNION qx, qy; - D3DRMMATRIX4D mat; - - arg = arg; - - ReadMouse(&mb, &mx, &my); - angle = D3DMultiply((-D3DVAL(0.5) + D3DDivide(D3DVAL(my), - D3DVAL(view_height))), D3DVAL(PI2)); - D3DRMQuaternionFromRotation(&qx, &vx, angle); - angle = D3DMultiply((-D3DVAL(0.5) + D3DDivide(D3DVAL(mx), - D3DVAL(view_width))), D3DVAL(PI2)); - D3DRMQuaternionFromRotation(&qy, &vy, angle); - D3DRMQuaternionMultiply(&q, &qx, &qy); - D3DRMMatrixFromQuaternion(mat, &q); - frame->lpVtbl->AddTransform(frame, D3DRMCOMBINE_REPLACE, mat); - frame->lpVtbl->GetScene(frame, &scene); - frame->lpVtbl->SetPosition(frame, scene, D3DVAL(-XPOS), D3DVAL(0), - D3DVAL(0)); - - RELEASE(scene); -} - -void CDECL -Follow(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - LPDIRECT3DRMFRAME scene; - int mx, my, mb; - static D3DRMQUATERNION qstart = {D3DVAL(1), {D3DVAL(0), D3DVAL(0),D3DVAL(0)}}, - qend; - static D3DVALUE alpha = D3DVAL(0); - - arg = arg; - - ReadMouse(&mb, &mx, &my); - if (mb && alpha == D3DVAL(0)) { - qend = q; - alpha = D3DVAL(INTERPOLATE_STEP); - } - if (alpha > D3DVAL(0)) { - D3DRMQUATERNION interp; - D3DRMMATRIX4D mat; - - D3DRMQuaternionSlerp(&interp, &qstart, &qend, alpha); - D3DRMMatrixFromQuaternion(mat, &interp); - - if (alpha >= D3DVAL(1)) { - D3DRMMatrixFromQuaternion(mat, &qend); - alpha = D3DVAL(0); - qstart = qend; - } else - alpha += D3DVAL(INTERPOLATE_STEP); - - frame->lpVtbl->AddTransform(frame, D3DRMCOMBINE_REPLACE, mat); - frame->lpVtbl->GetScene(frame, &scene); - frame->lpVtbl->SetPosition(frame, scene, D3DVAL(XPOS), D3DVAL(0), D3DVAL(0)); - RELEASE(scene); - } -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT; - LPDIRECT3DRMFRAME lights = NULL; - LPDIRECT3DRMFRAME user = NULL; - LPDIRECT3DRMFRAME follower = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - LPDIRECT3DRMMESH mesh = NULL; - LPDIRECT3DRMLIGHT l1 = NULL; - LPDIRECT3DRMLIGHT l2 = NULL; - HRESULT rval; - - if (FAILED(dev->lpVtbl->SetQuality(dev, quality))) - goto generic_error; - - view_width = view->lpVtbl->GetWidth(view); - view_height = view->lpVtbl->GetHeight(view); - - /* - * initialize the lights in the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetOrientation(lights, scene, - D3DVAL(-1), D3DVAL(-1), D3DVAL(0), D3DVAL(0), D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(0.8), - D3DVAL(0.6), D3DVAL(0.7), &l1))) - goto generic_error; - if (FAILED(lights->lpVtbl->AddLight(lights, l1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &l2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, l2))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "dropship.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load dropship.x.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(0.1), - D3DVAL(0.08), D3DVAL(0.1)))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), - D3DVAL(-12)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &user))) - goto generic_error; - if (FAILED(user->lpVtbl->AddVisual(user, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &follower))) - goto generic_error; - if (FAILED(follower->lpVtbl->AddVisual(follower, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - - if (FAILED(follower->lpVtbl->SetPosition(follower, scene, D3DVAL(XPOS), D3DVAL(0), - D3DVAL(0)))) - goto generic_error; - - if (FAILED(user->lpVtbl->AddMoveCallback(user, UserControl, NULL))) - goto generic_error; - if (FAILED(follower->lpVtbl->AddMoveCallback(follower, Follow, NULL))) - goto generic_error; - - RELEASE(lights); - RELEASE(user); - RELEASE(follower); - RELEASE(mesh); - RELEASE(l1); - RELEASE(l2); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(lights); - RELEASE(user); - RELEASE(follower); - RELEASE(builder); - RELEASE(mesh); - RELEASE(l1); - RELEASE(l2); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bNoTextures = TRUE; - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Quaternion Direct3DRM Example"); -} diff --git a/sdk/samples/quat/quat.def b/sdk/samples/quat/quat.def deleted file mode 100644 index 4790760..0000000 --- a/sdk/samples/quat/quat.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME quat.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/quat/readme.txt b/sdk/samples/quat/readme.txt deleted file mode 100644 index 4ba8e32..0000000 --- a/sdk/samples/quat/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Quat -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Using quaternions to interpolate between two vectors in space. diff --git a/sdk/samples/readme.txt b/sdk/samples/readme.txt deleted file mode 100644 index 5a64963..0000000 --- a/sdk/samples/readme.txt +++ /dev/null @@ -1,65 +0,0 @@ -SDK Samples ------------ - -All SDK samples are designed to be built in the directory they are in. -Just ensure that your Win32 development environment is set up, and you -can go to any sample directory and do a make. - -There is a main make files each sample directory: -MAKEFILE - for use with Microsoft VC++ 2.0 or higher (NMAKE) - -There are 2 ways to build each sample, debug or retail. To build a -sample as retail with VC++, just type: - -nmake retail - -From the SAMPLES directory, you may also run the following batch files: - -MAKEALL.BAT - makes all examples with Microsoft VC++ - -Setup ------ -We have included the source code to a sample setup program for a game -and DirectX. This is found under the SETUP directory. Note that to build -your own custom setup program, all you need to do is edit the copy_list -at the start of DINSTALL.C to be your list of files, and then search for -"fox", and then for "bear", and change things appropriately. - -Once you are done this, create a game directory that includes your files, -the setup program you have built, and then xcopy /s the REDIST directory to -the root of your game directory, ie: - -XCOPY /S GAMESDKCDROMDRIVE:\REDIST\*.* D:\FUNGAME - -If you are building an autorun CD title, you can copy our AUTORUN.INF at -the root of the Game SDK CD to the root of your game directory -is called SETUP.EXE, you will not have to make any changes to this file. -If it is something else, then you can edit AUTORUN.INF appropriately. - - -Notes for users of Visual C++ 4.2 ---------------------------------- -Visual C++ 4.2 includes the DX2 header files and libraries. If you are -getting errors compiling the samples, make sure that the DX3 include -and lib paths come before the MSVC++ 4.2 include and libs. - - -Notes for users of Watcom C/C++ -------------------------------- -Watcom C/C++ v10.6 is required to compile the DXSDK samples. -v10.0 is not sufficient. The Microsoft Win32 SDK is also required -and is expected to be in \MSTOOLS on the same drive as your DXSDK -sample files. If the Win32 SDK is elsewhere, you can set the MSTOOLS -environment variable to point to its root directory (e.g. set -MSTOOLS=\MSTOOLS). - -The Watcom makefiles expect the WATCOM environment variable -to be set, as it should have been by the Watcom installation procedure. - -Only a subset of the samples have Watcom makefiles. These are: -ddex1 through ddex5, donut and stretch. -CD into the appropriate directory and type 'wmake /f makefile.wat'. -There is also a makeallw.bat file in the sdk\samples directory which -you can run to automatically build all these samples under Watcom. - -Watcom and Watcom C/C++ are trademarks of Powersoft, Watcom Division. diff --git a/sdk/samples/rockem/arena.x b/sdk/samples/rockem/arena.x deleted file mode 100644 index fad6f8e..0000000 --- a/sdk/samples/rockem/arena.x +++ /dev/null @@ -1,1450 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -Header { - 1; - 0; - 1; -} - -Mesh { - 164; - -509.760864;-418.136444;-863.679443;, - -466.708588;-418.137299;890.074646;, - -605.528442;-95.125122;678.490051;, - -998.383423;-418.136810;-48.462238;, - -880.561401;-418.136627;-474.215302;, - -738.448608;-418.136505;-676.000427;, - -139.410217;-418.136322;-996.193115;, - 205.181686;-418.136322;-987.733948;, - 483.728363;-418.136444;-888.068176;, - 818.229065;-418.136566;-599.525757;, - 986.405762;-418.136749;-243.946945;, - 1005.706177;-418.136932;148.922470;, - 818.229065;-418.137115;601.532104;, - 439.531586;-418.137299;912.321655;, - 156.429657;-418.137360;998.199402;, - -284.128326;-418.137299;965.702087;, - -801.209717;-418.137115;601.532104;, - -988.686340;-418.136932;148.922470;, - 997.246643;-188.884811;197.675293;, - 895.455627;-95.124893;223.171524;, - 742.920349;-95.125015;545.679260;, - 846.720764;-188.885056;561.077759;, - 648.046570;-188.885162;780.280945;, - 553.185669;-95.125153;735.414001;, - 348.130768;-188.885239;950.181030;, - 230.678268;-95.125198;887.949036;, - 57.975639;-188.885315;1007.896545;, - -125.652954;-95.125076;905.454468;, - -139.410217;-188.885284;998.199585;, - -331.111328;-188.885239;950.181030;, - -382.424255;-95.125160;827.563660;, - -631.026794;-188.885162;780.280945;, - -880.561401;-188.885025;476.221832;, - -836.237000;-95.124939;350.908905;, - -980.227173;-188.884811;197.675293;, - -895.941040;-95.124672;135.165833;, - -895.941040;-95.124680;-133.159500;, - -980.227173;-188.884689;-195.668777;, - -922.860046;-188.884583;-384.782928;, - -818.050415;-95.124565;-389.930847;, - -801.209717;-188.884430;-599.525757;, - -638.031372;-95.124420;-645.538086;, - -592.019043;-188.884384;-808.716370;, - -341.395660;-95.124344;-843.743652;, - -284.128326;-188.884277;-963.695496;, - -90.301964;-188.884277;-1002.249756;, - -36.355202;-95.124306;-912.242737;, - 253.460159;-188.884277;-976.892639;, - 273.930817;-95.124313;-873.972717;, - 609.038818;-188.884384;-808.716370;, - 622.547852;-95.124420;-676.483704;, - 721.349487;-188.884430;-711.836487;, - 853.256714;-95.124603;-348.902466;, - 939.879883;-188.884583;-384.782928;, - 1015.403198;-188.884735;-48.462208;, - 921.756226;-95.124718;-43.862041;, - -412.364868;-95.124382;-658.926392;, - -524.849854;-95.124451;-546.426147;, - -636.946472;-95.124504;-441.080963;, - -686.756287;-95.124550;-351.057495;, - -725.945435;-95.124588;-268.492096;, - 426.350616;-95.124367;-660.925049;, - 404.913300;-95.124359;-674.393066;, - -268.926666;-95.124496;-424.244751;, - -774.182434;-95.124657;-4.997503;, - -744.480225;-95.124634;-155.931580;, - -499.258789;-95.124687;-4.997503;, - -141.506195;-95.124588;-215.769913;, - -180.116196;-95.124619;-172.606064;, - -230.511444;-95.124680;-109.106934;, - 262.796906;-95.124489;-439.001526;, - -255.041565;-95.124763;-4.997503;, - -240.241516;-95.124725;-60.986412;, - 527.804749;-95.124420;-573.076050;, - -121.273987;-95.124832;75.974876;, - -141.310745;-95.124779;1.196889;, - -121.274124;-95.124725;-73.581116;, - -66.532890;-95.124695;-128.322464;, - 8.245086;-95.124680;-148.359268;, - 136.553513;-95.124634;-229.900833;, - 83.023079;-95.124702;-128.322647;, - -339.386353;-95.125191;702.153198;, - -239.844910;-95.125069;478.473114;, - -127.782547;-95.124924;226.657135;, - -63.752640;-95.124924;244.517105;, - 189.934555;-95.124672;-177.455978;, - 237.352859;-95.124695;-130.869339;, - 157.801254;-95.124771;1.196710;, - 83.023346;-95.124847;130.716019;, - 8.245354;-95.124870;150.752762;, - -66.532639;-95.124870;130.716110;, - 137.764450;-95.124733;-73.581451;, - -194.079697;-95.125153;743.516235;, - -87.321465;-95.125099;777.463013;, - 8.329406;-95.124916;264.622955;, - 72.383354;-95.124886;246.850861;, - 144.492859;-95.124840;226.843842;, - 272.529541;-95.124718;5.989942;, - 255.981567;-95.124702;-58.392082;, - 137.764587;-95.124802;75.974716;, - -36.737411;-95.125107;779.131714;, - 75.287613;-95.125145;779.404297;, - 246.068604;-95.125175;737.264404;, - 262.455902;-95.124985;440.721069;, - 372.871857;-95.125175;693.328247;, - 395.254669;-95.125168;681.496704;, - 546.636292;-95.124756;-22.868746;, - 753.291687;-95.124664;-195.022186;, - 729.310852;-95.124596;-304.452942;, - 705.464294;-95.124565;-349.093567;, - 649.686829;-95.124504;-446.248199;, - 790.122864;-95.124741;-48.503696;, - 8.329406;-92.201492;264.622955;, - 125.697510;-92.201477;774.895813;, - -112.442253;-92.201477;774.316345;, - 144.492859;-92.201309;226.843719;, - 395.254669;-92.201469;681.496643;, - -339.386353;-92.201485;702.153015;, - -127.782547;-92.201309;226.657028;, - -141.506195;-92.201347;-215.769928;, - -223.580521;-92.201324;-124.015350;, - -651.477112;-92.201118;-419.781830;, - -734.782532;-92.201363;-244.270538;, - -774.182434;-92.201332;-4.997512;, - -255.041565;-92.201332;-4.997512;, - -412.364868;-92.201378;-658.926453;, - 237.352859;-92.201401;-130.869324;, - 620.578003;-92.201149;-487.649506;, - 739.146057;-92.201248;-281.124725;, - 136.553482;-92.201172;-229.900818;, - 404.913361;-92.201088;-674.393250;, - 790.122986;-92.201355;-48.503719;, - 272.529480;-92.201271;5.989976;, - 157.801254;-92.277321;1.196713;, - 137.764587;-92.277328;75.974716;, - 8.245265;-92.277321;1.196759;, - 83.023346;-92.277336;130.716019;, - 8.245354;-92.277344;150.752762;, - -66.532639;-92.277336;130.716110;, - -121.273987;-92.277328;75.974876;, - -141.310745;-92.277321;1.196893;, - -121.274124;-92.277290;-73.581116;, - -66.532890;-92.277283;-128.322464;, - 8.245086;-92.277275;-148.359268;, - 83.023079;-92.277283;-128.322647;, - 137.764450;-92.277290;-73.581451;, - -605.528442;-95.125153;678.490051;, - 895.455627;-95.124893;223.171524;, - 742.920349;-95.125015;545.679260;, - 553.185669;-95.125153;735.414001;, - 230.678268;-95.125198;887.949036;, - -125.652954;-95.125076;905.454468;, - -382.424255;-95.125191;827.563660;, - -836.237000;-95.124939;350.908905;, - -895.941040;-95.124672;135.165833;, - -895.941040;-95.124680;-133.159500;, - -818.050415;-95.124565;-389.930847;, - -638.031372;-95.124420;-645.538086;, - -341.395660;-95.124374;-843.743652;, - -36.355202;-95.124306;-912.242737;, - 273.930817;-95.124313;-873.972717;, - 622.547852;-95.124420;-676.483704;, - 853.256714;-95.124603;-348.902466;, - 921.756226;-95.124718;-43.862041;; - - 222; - 3;37,4,3;, - 3;38,4,37;, - 3;40,4,38;, - 3;40,5,4;, - 3;42,5,40;, - 3;42,0,5;, - 3;44,0,42;, - 3;44,6,0;, - 3;45,6,44;, - 3;45,7,6;, - 3;47,7,45;, - 3;47,8,7;, - 3;49,8,47;, - 3;49,9,8;, - 3;51,9,49;, - 3;53,9,51;, - 3;53,10,9;, - 3;54,10,53;, - 3;54,11,10;, - 3;18,11,54;, - 3;18,12,11;, - 3;21,12,18;, - 3;22,12,21;, - 3;22,13,12;, - 3;24,13,22;, - 3;24,14,13;, - 3;26,14,24;, - 3;26,15,14;, - 3;28,15,26;, - 3;29,15,28;, - 3;31,1,29;, - 3;29,1,15;, - 3;31,16,1;, - 3;32,16,31;, - 3;32,17,16;, - 3;34,17,32;, - 3;37,3,34;, - 3;34,3,17;, - 3;54,19,18;, - 3;19,20,18;, - 3;18,20,21;, - 3;20,23,21;, - 3;21,23,22;, - 3;24,22,23;, - 3;23,25,24;, - 3;26,24,25;, - 3;27,26,25;, - 3;28,26,27;, - 3;27,30,28;, - 3;28,30,29;, - 3;31,29,30;, - 3;2,31,30;, - 3;32,31,2;, - 3;2,33,32;, - 3;34,32,33;, - 3;35,34,33;, - 3;35,36,34;, - 3;37,34,36;, - 3;38,37,36;, - 3;39,38,36;, - 3;38,39,40;, - 3;41,40,39;, - 3;42,40,41;, - 3;41,43,42;, - 3;44,42,43;, - 3;43,46,44;, - 3;44,46,45;, - 3;45,46,47;, - 3;46,48,47;, - 3;49,47,48;, - 3;50,49,48;, - 3;51,49,50;, - 3;50,52,51;, - 3;53,51,52;, - 3;54,53,55;, - 3;55,53,52;, - 3;19,54,55;, - 3;83,82,81;, - 3;84,83,81;, - 3;81,92,94;, - 3;94,84,81;, - 3;92,93,95;, - 3;95,94,92;, - 3;96,95,93;, - 3;93,100,103;, - 3;103,96,93;, - 3;100,101,103;, - 3;102,104,105;, - 3;101,102,103;, - 3;105,103,102;, - 3;112,114,113;, - 3;112,113,115;, - 3;115,113,116;, - 3;114,112,117;, - 3;117,112,118;, - 3;119,121,120;, - 3;120,121,122;, - 3;120,122,123;, - 3;120,123,124;, - 3;121,119,125;, - 3;126,128,127;, - 3;126,127,129;, - 3;129,127,130;, - 3;128,126,131;, - 3;131,126,132;, - 3;133,135,134;, - 3;134,135,136;, - 3;136,135,137;, - 3;137,135,138;, - 3;138,135,139;, - 3;139,135,140;, - 3;140,135,141;, - 3;141,135,142;, - 3;142,135,143;, - 3;143,135,144;, - 3;144,135,145;, - 3;145,135,133;, - 3;121,125,57;, - 3;56,57,125;, - 3;121,57,58;, - 3;58,59,121;, - 3;59,122,121;, - 3;59,60,122;, - 3;125,63,56;, - 3;60,123,122;, - 3;60,65,123;, - 3;119,63,125;, - 3;127,73,130;, - 3;130,73,61;, - 3;130,61,62;, - 3;123,64,66;, - 3;65,64,123;, - 3;119,67,63;, - 3;66,124,123;, - 3;71,124,66;, - 3;119,120,67;, - 3;68,67,120;, - 3;69,68,120;, - 3;120,72,69;, - 3;70,130,62;, - 3;70,129,130;, - 3;79,129,70;, - 3;71,120,124;, - 3;120,71,72;, - 3;127,110,73;, - 3;129,79,85;, - 3;139,74,90;, - 3;90,138,139;, - 3;139,140,74;, - 3;140,141,75;, - 3;74,140,75;, - 3;76,75,141;, - 3;141,142,76;, - 3;77,76,142;, - 3;142,143,77;, - 3;143,144,78;, - 3;77,143,78;, - 3;144,145,80;, - 3;78,144,80;, - 3;117,81,92;, - 3;117,118,81;, - 3;118,83,82;, - 3;118,112,83;, - 3;81,118,82;, - 3;83,112,84;, - 3;84,112,94;, - 3;98,126,86;, - 3;126,129,86;, - 3;85,86,129;, - 3;134,99,133;, - 3;133,99,87;, - 3;136,137,88;, - 3;137,138,89;, - 3;88,137,89;, - 3;89,138,90;, - 3;145,133,91;, - 3;145,91,80;, - 3;133,87,91;, - 3;92,114,117;, - 3;114,92,93;, - 3;100,114,93;, - 3;112,115,94;, - 3;115,95,94;, - 3;115,116,96;, - 3;95,115,96;, - 3;116,103,96;, - 3;132,126,97;, - 3;97,126,98;, - 3;134,136,99;, - 3;99,136,88;, - 3;100,113,114;, - 3;113,100,101;, - 3;113,101,102;, - 3;102,116,113;, - 3;104,116,102;, - 3;103,116,105;, - 3;106,132,97;, - 3;116,104,105;, - 3;106,131,132;, - 3;131,111,107;, - 3;107,128,131;, - 3;107,108,128;, - 3;128,108,109;, - 3;109,127,128;, - 3;127,109,110;, - 3;111,131,106;, - 3;156,155,157;, - 3;157,155,158;, - 3;158,155,159;, - 3;159,155,160;, - 3;160,155,161;, - 3;161,155,154;, - 3;161,154,153;, - 3;161,153,146;, - 3;161,146,152;, - 3;161,152,151;, - 3;161,151,150;, - 3;161,150,149;, - 3;161,149,162;, - 3;162,149,148;, - 3;162,148,147;, - 3;162,147,163;; - - MeshMaterialList { - 3; - 222; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2; - Material { - 1.000000;1.000000;0.000000;1.000000;; - 29.000000; - 0.768627;0.768627;0.768627;; - 0.000000;0.000000;0.000000;; - TextureFilename { - "gdk_fill.ppm"; - } - } - Material { - 0.066667;0.066667;0.066667;1.000000;; - 25.000000; - 1.000000;1.000000;1.000000;; - 0.000000;0.000000;0.000000;; - } - Material { - 1.000000;1.000000;1.000000;1.000000;; - 15.000000; - 0.000000;0.000000;0.000000;; - 0.000000;0.000000;0.000000;; - TextureFilename { - "gdk_fill.ppm"; - } - } - } - MeshNormals { - 281; - -0.478434;-0.023088;-0.877820;, - -0.513663;-0.019389;0.857773;, - -0.501055;0.722024;0.477100;, - -0.997321;0.003663;-0.073064;, - -0.910930;-0.039890;-0.410627;, - -0.724168;-0.010650;-0.689541;, - -0.170866;-0.031963;-0.984776;, - 0.146440;-0.008894;-0.989180;, - 0.478056;-0.014197;-0.878215;, - 0.807875;-0.032077;-0.588481;, - 0.971451;-0.033798;-0.234820;, - 0.989704;-0.037440;0.138148;, - 0.782155;-0.051683;0.620936;, - 0.477863;-0.040690;0.877491;, - 0.139034;-0.024856;0.989976;, - -0.188979;-0.046382;0.980885;, - -0.797178;-0.046338;0.601964;, - -0.965095;-0.040664;0.258724;, - 0.972871;-0.013218;0.230969;, - 0.669600;0.711620;0.212679;, - 0.697325;0.701086;0.149052;, - 0.617521;0.692520;0.372939;, - 0.844771;-0.010578;0.535024;, - 0.557100;0.717609;0.417943;, - 0.628008;-0.017369;0.778013;, - 0.437782;0.708062;0.554071;, - 0.422888;0.712077;0.560457;, - 0.328933;0.017757;0.944186;, - 0.265524;0.701979;0.660850;, - 0.154368;0.733160;0.662304;, - 0.024493;-0.047537;0.998569;, - 0.047594;0.715499;0.696991;, - -0.070257;0.728736;0.681181;, - -0.146855;-0.047353;0.988024;, - -0.134349;0.722061;0.678659;, - -0.374975;0.021236;0.926792;, - -0.268212;0.707827;0.653485;, - -0.282169;0.713143;0.641723;, - -0.646881;0.012618;0.762486;, - -0.446610;0.688458;0.571458;, - -0.889469;-0.022954;0.456419;, - -0.608299;0.702579;0.369262;, - -0.638423;0.719843;0.272475;, - -0.991217;0.023119;0.130210;, - -0.708505;0.690417;0.146100;, - -0.708948;0.699138;0.092735;, - -0.705655;0.701385;-0.100544;, - -0.981950;-0.026561;-0.187267;, - -0.705655;0.701385;-0.100544;, - -0.918966;-0.015847;-0.394019;, - -0.647672;0.708630;-0.279935;, - -0.612996;0.724978;-0.314074;, - -0.803183;0.014182;-0.595564;, - -0.569734;0.703672;-0.424557;, - -0.479766;0.730301;-0.486298;, - -0.602316;0.017757;-0.798060;, - -0.412756;0.697934;-0.585253;, - -0.284138;0.725851;-0.626423;, - -0.329137;-0.003467;-0.944276;, - -0.207799;0.712127;-0.670593;, - -0.032572;0.005332;-0.999455;, - -0.040220;0.703908;-0.709152;, - -0.035844;0.722861;-0.690063;, - 0.282509;0.028433;-0.958843;, - 0.153227;0.696015;-0.701487;, - 0.243429;0.723633;-0.645831;, - 0.545231;-0.007880;-0.838249;, - 0.371191;0.710825;-0.597449;, - 0.452377;0.734999;-0.505105;, - 0.749174;-0.007881;-0.662326;, - 0.541288;0.713241;-0.445302;, - 0.619892;0.717664;-0.317320;, - 0.913974;0.021393;-0.405209;, - 0.649879;0.707079;-0.278741;, - 0.997868;0.000082;-0.065269;, - 0.699072;0.714950;-0.012055;, - 0.705797;0.707079;-0.043472;, - -0.707155;-0.000015;-0.707059;, - 0.853247;-0.000011;-0.521507;, - -0.599156;0.517366;-0.611018;, - -0.796240;0.200626;-0.570746;, - -0.889629;0.000009;-0.456685;, - -0.932439;-0.167941;-0.319927;, - 0.519032;0.445579;-0.729428;, - 0.531977;-0.000064;-0.846759;, - -0.856075;-0.000014;-0.516851;, - 0.853247;-0.000011;-0.521507;, - 0.000000;0.000003;1.000000;, - -0.981182;-0.000000;-0.193086;, - -0.857495;-0.489219;-0.159271;, - 0.000000;0.000003;1.000000;, - 0.853247;-0.000003;-0.521507;, - 0.745330;0.000003;0.666696;, - 0.680916;0.444080;0.582362;, - 0.906795;0.000010;0.421571;, - -0.856075;-0.000014;-0.516851;, - 0.000000;0.000003;1.000000;, - 0.966793;0.000001;0.255561;, - 0.871114;-0.444071;0.209672;, - 0.672864;-0.142847;-0.725843;, - -0.707106;-0.000000;0.707108;, - -0.965926;-0.000000;0.258820;, - -0.965926;0.000000;-0.258818;, - -0.965926;-0.000001;0.258820;, - -0.965926;0.000000;-0.258818;, - -0.707108;0.000000;-0.707106;, - -0.707108;0.000000;-0.707106;, - -0.258820;0.000000;-0.965926;, - 0.258818;0.000000;-0.965926;, - -0.258820;0.000000;-0.965926;, - -0.856075;-0.000006;-0.516851;, - -0.700824;-0.000011;0.713334;, - 0.707106;0.000000;-0.707108;, - 0.258818;0.000000;-0.965926;, - -0.907564;0.114928;-0.403881;, - -0.273784;0.000060;0.961791;, - -0.913617;-0.000025;-0.406575;, - -0.208608;-0.973583;-0.092835;, - -0.913617;-0.000015;-0.406575;, - -0.907564;0.114928;-0.403881;, - -0.913617;-0.000015;-0.406575;, - 0.268675;-0.000035;-0.963231;, - -0.000000;1.000000;0.000001;, - 0.268676;-0.000038;-0.963231;, - -0.700824;-0.000011;0.713334;, - -0.866368;-0.000003;0.499407;, - 0.965926;-0.000000;0.258819;, - 0.965926;0.000000;-0.258820;, - 0.258820;-0.000000;0.965926;, - 0.707107;0.000001;0.707106;, - -0.258818;-0.000000;0.965926;, - 0.258820;-0.000001;0.965926;, - -0.707106;-0.000000;0.707108;, - -0.258818;-0.000000;0.965926;, - 0.965926;0.000000;-0.258820;, - 0.707106;0.000000;-0.707108;, - -0.000000;1.000000;0.000000;, - -0.248834;-0.482049;0.840066;, - -0.000001;1.000000;0.000000;, - -0.141809;-0.168636;0.975424;, - -0.000000;1.000000;0.000000;, - 0.000685;-0.000000;-1.000000;, - -0.000001;1.000000;0.000000;, - -0.267355;0.000003;-0.963598;, - -0.000001;1.000000;0.000000;, - 0.875644;-0.000020;-0.482957;, - -0.267354;-0.000040;-0.963598;, - -0.968520;-0.000023;0.248936;, - 0.104704;-0.000009;0.994503;, - -0.968520;-0.000001;0.248937;, - 0.965926;-0.000000;0.258819;, - 0.707107;-0.000000;0.707106;, - 0.000000;1.000000;0.000000;, - -0.013766;0.743938;0.668107;, - 0.000000;1.000000;0.000001;, - 0.094418;-0.100648;0.990432;, - 0.000001;1.000000;0.000002;, - 0.292164;-0.142842;0.945641;, - 0.000000;1.000000;0.000000;, - 0.875644;-0.000009;-0.482958;, - 0.000001;1.000000;0.000002;, - 0.372181;0.445604;0.814198;, - 0.000001;1.000000;0.000002;, - 0.875644;-0.000009;-0.482958;, - 0.467327;0.000018;0.884085;, - 0.104704;-0.000009;0.994503;, - 0.851901;-0.482114;-0.204529;, - 0.915645;-0.168639;-0.364904;, - 0.585462;0.743957;-0.322121;, - 0.810531;-0.100646;-0.576983;, - 0.969828;-0.000042;-0.243791;, - 0.104704;0.000003;0.994503;, - 0.000000;1.000000;-0.000000;, - 0.000685;-0.000018;-1.000000;, - 0.000000;1.000000;-0.000000;, - 0.172030;0.431894;0.885366;, - 0.000000;1.000000;-0.000000;, - -0.097626;0.320694;0.942138;, - -0.000001;1.000000;0.000000;, - -0.267355;0.000000;-0.963598;, - 0.875644;-0.000020;-0.482957;, - 0.000000;1.000000;0.000000;, - 0.875644;-0.000020;-0.482957;, - 0.372181;0.445601;0.814200;, - -0.000000;1.000000;-0.000000;, - -0.248834;-0.482049;0.840066;, - -0.913617;-0.000025;-0.406575;, - 0.000001;1.000000;0.000001;, - -0.913617;-0.000025;-0.406575;, - 0.268675;-0.000035;-0.963231;, - 0.000000;1.000000;0.000000;, - 0.853247;0.000001;-0.521507;, - 0.745330;0.000003;0.666696;, - 0.000000;1.000000;0.000000;, - 0.890720;0.000005;0.454553;, - 0.000000;1.000000;0.000000;, - -0.774106;0.285676;-0.564934;, - -0.000000;1.000000;0.000001;, - -0.932438;-0.167945;-0.319927;, - -0.000000;1.000000;-0.000000;, - -0.857489;-0.489230;-0.159269;, - 0.000000;0.000003;1.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;0.000003;1.000000;, - 0.966793;0.000001;0.255561;, - 0.000001;1.000000;-0.000000;, - -0.707155;-0.000023;-0.707059;, - 0.853247;-0.000011;-0.521507;, - -0.000000;1.000000;0.000001;, - -0.866368;-0.000003;0.499407;, - -0.000000;1.000000;0.000001;, - 0.680725;0.431920;-0.591657;, - -0.000000;1.000000;0.000001;, - 0.864722;0.320713;-0.386522;, - 0.000001;1.000000;0.000002;, - -0.856075;0.000000;-0.516851;, - -0.700824;-0.000011;0.713334;, - 0.000000;1.000000;0.000000;, - 0.519033;0.445576;-0.729429;, - -0.856075;-0.000014;-0.516851;, - -0.000000;1.000000;0.000000;, - 0.104704;0.000004;0.994503;, - 0.851901;-0.482114;-0.204529;, - 0.000000;1.000000;-0.000001;, - -0.968520;-0.000023;0.248936;, - 0.104704;-0.000009;0.994503;, - 0.000000;1.000000;0.000000;, - 0.965926;-0.000000;0.258819;, - 0.965926;0.000000;-0.258820;, - 0.000000;1.000000;0.000000;, - 0.965926;-0.000000;0.258819;, - 0.707107;-0.000000;0.707106;, - 0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.258820;-0.000000;0.965926;, - 0.707107;-0.000000;0.707106;, - -0.000000;1.000000;0.000000;, - 0.258820;-0.000000;0.965926;, - -0.258818;-0.000000;0.965926;, - 0.000000;1.000000;0.000000;, - -0.707106;-0.000000;0.707108;, - -0.258818;-0.000000;0.965926;, - 0.000000;1.000000;0.000000;, - -0.707106;-0.000000;0.707108;, - -0.965926;-0.000000;0.258820;, - 0.000000;1.000000;0.000000;, - -0.965926;-0.000000;0.258820;, - -0.965926;0.000000;-0.258818;, - 0.000000;1.000000;0.000000;, - -0.965926;0.000000;-0.258818;, - -0.707108;0.000000;-0.707106;, - 0.000000;1.000000;0.000000;, - -0.707108;0.000000;-0.707106;, - -0.258820;0.000000;-0.965926;, - -0.000000;1.000000;0.000000;, - -0.258820;0.000000;-0.965926;, - 0.258818;0.000000;-0.965926;, - 0.000000;1.000000;0.000000;, - 0.258818;0.000000;-0.965926;, - 0.707106;0.000000;-0.707108;, - -0.000000;1.000000;0.000000;, - 0.707106;0.000000;-0.707108;, - 0.965926;0.000000;-0.258820;, - 0.000000;1.000000;0.000001;, - 0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - 0.000000;1.000000;0.000001;, - -0.000001;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - -0.000000;1.000000;-0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - -0.000000;1.000000;0.000000;, - -0.000000;1.000000;0.000000;, - 0.000000;1.000000;0.000001;, - 0.000000;1.000000;0.000001;, - -0.000001;1.000000;0.000001;; - - 222; - 3;47,4,3;, - 3;49,4,47;, - 3;52,4,49;, - 3;52,5,4;, - 3;55,5,52;, - 3;55,0,5;, - 3;58,0,55;, - 3;58,6,0;, - 3;60,6,58;, - 3;60,7,6;, - 3;63,7,60;, - 3;63,8,7;, - 3;66,8,63;, - 3;66,9,8;, - 3;69,9,66;, - 3;72,9,69;, - 3;72,10,9;, - 3;74,10,72;, - 3;74,11,10;, - 3;18,11,74;, - 3;18,12,11;, - 3;22,12,18;, - 3;24,12,22;, - 3;24,13,12;, - 3;27,13,24;, - 3;27,14,13;, - 3;30,14,27;, - 3;30,15,14;, - 3;33,15,30;, - 3;35,15,33;, - 3;38,1,35;, - 3;35,1,15;, - 3;38,16,1;, - 3;40,16,38;, - 3;40,17,16;, - 3;43,17,40;, - 3;47,3,43;, - 3;43,3,17;, - 3;75,20,19;, - 3;20,21,19;, - 3;19,21,23;, - 3;21,26,23;, - 3;23,26,25;, - 3;28,25,26;, - 3;26,29,28;, - 3;31,28,29;, - 3;32,31,29;, - 3;34,31,32;, - 3;32,37,34;, - 3;34,37,36;, - 3;39,36,37;, - 3;2,39,37;, - 3;41,39,2;, - 3;2,42,41;, - 3;44,41,42;, - 3;45,44,42;, - 3;45,46,44;, - 3;48,44,46;, - 3;50,48,46;, - 3;51,50,46;, - 3;50,51,53;, - 3;54,53,51;, - 3;56,53,54;, - 3;54,57,56;, - 3;59,56,57;, - 3;57,62,59;, - 3;59,62,61;, - 3;61,62,64;, - 3;62,65,64;, - 3;67,64,65;, - 3;68,67,65;, - 3;70,67,68;, - 3;68,71,70;, - 3;73,70,71;, - 3;75,73,76;, - 3;76,73,71;, - 3;20,75,76;, - 3;119,117,114;, - 3;122,119,114;, - 3;114,136,140;, - 3;140,122,114;, - 3;136,138,142;, - 3;142,140,136;, - 3;144,142,138;, - 3;138,152,158;, - 3;158,144,138;, - 3;152,154,158;, - 3;156,160,162;, - 3;154,156,158;, - 3;162,158,156;, - 3;172,176,174;, - 3;172,174,178;, - 3;178,174,181;, - 3;176,172,184;, - 3;184,172,187;, - 3;190,195,193;, - 3;193,195,197;, - 3;193,197,199;, - 3;193,199,202;, - 3;195,190,205;, - 3;208,212,210;, - 3;208,210,214;, - 3;214,210,217;, - 3;212,208,220;, - 3;220,208,223;, - 3;226,232,229;, - 3;229,232,233;, - 3;233,232,236;, - 3;236,232,239;, - 3;239,232,242;, - 3;242,232,245;, - 3;245,232,248;, - 3;248,232,251;, - 3;251,232,254;, - 3;254,232,257;, - 3;257,232,260;, - 3;260,232,226;, - 3;196,206,79;, - 3;77,79,206;, - 3;196,79,80;, - 3;80,81,196;, - 3;81,198,196;, - 3;81,82,198;, - 3;207,86,78;, - 3;82,200,198;, - 3;82,89,200;, - 3;191,86,207;, - 3;211,99,218;, - 3;218,99,83;, - 3;218,83,84;, - 3;201,87,90;, - 3;89,88,200;, - 3;191,91,86;, - 3;90,203,201;, - 3;96,203,90;, - 3;192,194,92;, - 3;93,92,194;, - 3;94,93,194;, - 3;194,98,94;, - 3;95,219,85;, - 3;95,215,219;, - 3;110,215,95;, - 3;97,194,204;, - 3;194,97,98;, - 3;211,169,99;, - 3;216,111,124;, - 3;243,100,132;, - 3;132,240,243;, - 3;244,246,101;, - 3;247,249,102;, - 3;101,246,103;, - 3;104,102,249;, - 3;250,252,105;, - 3;106,105,252;, - 3;253,255,107;, - 3;256,258,108;, - 3;107,255,109;, - 3;259,261,112;, - 3;108,258,113;, - 3;185,115,137;, - 3;186,188,116;, - 3;188,120,118;, - 3;189,173,121;, - 3;116,188,118;, - 3;121,173,123;, - 3;123,173,141;, - 3;149,209,125;, - 3;209,216,125;, - 3;124,125,216;, - 3;230,150,227;, - 3;227,150,126;, - 3;234,237,128;, - 3;238,241,130;, - 3;128,237,131;, - 3;130,241,133;, - 3;262,228,134;, - 3;261,135,112;, - 3;228,127,134;, - 3;137,177,185;, - 3;177,137,139;, - 3;153,177,139;, - 3;173,179,141;, - 3;179,143,141;, - 3;180,182,145;, - 3;143,179,146;, - 3;182,159,145;, - 3;224,209,147;, - 3;147,209,149;, - 3;231,235,151;, - 3;151,235,129;, - 3;153,175,177;, - 3;175,153,155;, - 3;175,155,157;, - 3;157,183,175;, - 3;161,183,157;, - 3;159,182,163;, - 3;165,225,148;, - 3;183,161,164;, - 3;165,221,225;, - 3;222,170,166;, - 3;166,213,222;, - 3;166,167,213;, - 3;213,167,168;, - 3;168,211,213;, - 3;211,168,169;, - 3;171,221,165;, - 3;273,272,274;, - 3;274,272,275;, - 3;275,272,276;, - 3;276,272,277;, - 3;277,272,278;, - 3;278,272,271;, - 3;278,271,270;, - 3;278,270,263;, - 3;278,263,269;, - 3;278,269,268;, - 3;278,268,267;, - 3;278,267,266;, - 3;278,266,279;, - 3;279,266,265;, - 3;279,265,264;, - 3;279,264,280;; - } - MeshTextureCoords { - 164; - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.268884;0.856707;, - 0.207531;0.795346;, - 0.146390;0.737888;, - 0.119222;0.688786;, - 0.097847;0.643752;, - 0.726345;0.857798;, - 0.714652;0.865143;, - 0.347119;0.728705;, - 0.071537;0.500034;, - 0.087737;0.582358;, - 0.221489;0.500034;, - 0.416618;0.614996;, - 0.395559;0.591453;, - 0.368072;0.556819;, - 0.637138;0.736753;, - 0.354693;0.500034;, - 0.362765;0.530572;, - 0.781681;0.809882;, - 0.427654;0.455869;, - 0.416725;0.496656;, - 0.427653;0.537442;, - 0.457511;0.567299;, - 0.498297;0.578228;, - 0.568281;0.622703;, - 0.539083;0.567300;, - 0.308688;0.114332;, - 0.362981;0.236334;, - 0.424104;0.373683;, - 0.459027;0.363941;, - 0.597396;0.594098;, - 0.623260;0.568689;, - 0.579870;0.496656;, - 0.539084;0.426012;, - 0.498297;0.415083;, - 0.457511;0.426012;, - 0.568941;0.537442;, - 0.387943;0.091771;, - 0.446172;0.073256;, - 0.498343;0.352975;, - 0.533280;0.362668;, - 0.572611;0.373581;, - 0.642446;0.494041;, - 0.633420;0.529157;, - 0.568941;0.455869;, - 0.473762;0.072346;, - 0.534864;0.072197;, - 0.628014;0.095181;, - 0.636952;0.256925;, - 0.697176;0.119146;, - 0.709384;0.125599;, - 0.791953;0.509782;, - 0.904669;0.603680;, - 0.891589;0.663366;, - 0.878582;0.687715;, - 0.848160;0.740706;, - 0.924758;0.523764;, - 0.498343;0.352975;, - 0.562359;0.074656;, - 0.432471;0.074972;, - 0.572611;0.373581;, - 0.709384;0.125599;, - 0.308688;0.114332;, - 0.424104;0.373683;, - 0.416618;0.614996;, - 0.371852;0.564950;, - 0.138464;0.726270;, - 0.093027;0.630541;, - 0.071537;0.500034;, - 0.354693;0.500034;, - 0.268884;0.856707;, - 0.623260;0.568689;, - 0.832283;0.763288;, - 0.896953;0.650643;, - 0.568281;0.622703;, - 0.714652;0.865143;, - 0.924758;0.523764;, - 0.642446;0.494041;, - 0.579870;0.496656;, - 0.568941;0.455869;, - 0.498297;0.496656;, - 0.539084;0.426012;, - 0.498297;0.415083;, - 0.457511;0.426012;, - 0.427654;0.455869;, - 0.416725;0.496656;, - 0.427653;0.537442;, - 0.457511;0.567299;, - 0.498297;0.578228;, - 0.539083;0.567300;, - 0.568941;0.537442;, - 0.163232;0.126306;, - 0.985206;0.375649;, - 0.901675;0.199037;, - 0.797771;0.095133;, - 0.621159;0.011602;, - 0.426023;0.002015;, - 0.285410;0.044670;, - 0.036891;0.305697;, - 0.004196;0.423843;, - 0.004196;0.570785;, - 0.046850;0.711399;, - 0.145433;0.851375;, - 0.307878;0.959917;, - 0.474925;0.997429;, - 0.644845;0.976471;, - 0.835756;0.868322;, - 0.962097;0.688931;, - 0.999609;0.521883;; - } -} diff --git a/sdk/samples/rockem/block1.wav b/sdk/samples/rockem/block1.wav deleted file mode 100644 index 40e874b..0000000 Binary files a/sdk/samples/rockem/block1.wav and /dev/null differ diff --git a/sdk/samples/rockem/block2.wav b/sdk/samples/rockem/block2.wav deleted file mode 100644 index cbb0452..0000000 Binary files a/sdk/samples/rockem/block2.wav and /dev/null differ diff --git a/sdk/samples/rockem/block3.wav b/sdk/samples/rockem/block3.wav deleted file mode 100644 index a61bcc1..0000000 Binary files a/sdk/samples/rockem/block3.wav and /dev/null differ diff --git a/sdk/samples/rockem/cboo.wav b/sdk/samples/rockem/cboo.wav deleted file mode 100644 index d358e7a..0000000 Binary files a/sdk/samples/rockem/cboo.wav and /dev/null differ diff --git a/sdk/samples/rockem/cloop.wav b/sdk/samples/rockem/cloop.wav deleted file mode 100644 index 4bf936c..0000000 Binary files a/sdk/samples/rockem/cloop.wav and /dev/null differ diff --git a/sdk/samples/rockem/control.cpp b/sdk/samples/rockem/control.cpp deleted file mode 100644 index 562c06b..0000000 --- a/sdk/samples/rockem/control.cpp +++ /dev/null @@ -1,1215 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: control.cpp - * - ***************************************************************************/ - -// Includes.... -#include "rm.h" -#include "control.h" -#include "directx.h" - -// Defines.... -#define MOVE_NORMAL D3DVAL(10) -#define MOVE_FAST D3DVAL(20) - -#define MIN_DIST_TO_OPPONENT D3DVAL(100) - -#define PLAYER_MOVE_FORWARD VK_UP -#define PLAYER_MOVE_BACKWARD VK_DOWN -#define PLAYER_BLOCK VK_CONTROL -#define PLAYER_ATTACK VK_SPACE - -#define CAM_BOTH_IN_VIEW VK_F1 -#define CAM_OVER_THE_SHOULDER VK_F2 -#define CAM_PILOT VK_F3 - -#define NUM_BOB_FRAMES D3DVAL(30) -#define NUM_DEAD_FRAMES D3DVAL(66) -#define NUM_PUNCH_FRAMES D3DVAL(29) -#define NUM_BEEN_HIT_FRAMES D3DVAL(14) -#define NUM_BLOCKING_FRAMES D3DVAL(16) -#define NUM_VICTORY_FRAMES D3DVAL(55) - -#define BOB_START D3DVAL(1) -#define DEAD_START D3DVAL(94) -#define DEAD_HIT_GROUND D3DVAL(115) -#define PUNCH_START D3DVAL(31) -#define PUNCH_ARM_COCKED D3DVAL(50) -#define BLOCK_START D3DVAL(77) -#define BEEN_HIT_START D3DVAL(62) -#define HEAD_RETURNING D3DVAL(68) -#define VICTORY_START D3DVAL(161) - -#define EDGE_LEFT D3DVAL(-600) -#define EDGE_RIGHT D3DVAL(600) - -// Globals.... - -// States -AppState g_appState = DOING_INTRO; -PlayerState g_oppState = CAUTIOUS; -CameraState g_camState = BOTH_IN_VIEW; - -PlayerActionState g_player1State = BOBBING; -PlayerActionState g_player2State = BOBBING; - -AnimArgs g_player1AnimArgs; -AnimArgs g_player2AnimArgs; - -BOOL g_bPlayer1Attacking = FALSE; -BOOL g_bPlayer1Blocking = FALSE; - -DWORD g_player1health = 100; -DWORD g_player2health = 100; - -// Timed lengths for each animation in milliseconds -#define BOB_TIME_MS D3DVAL(500) -#define PUNCH_TIME_MS D3DVAL(600) -#define BLOCK_TIME_MS D3DVAL(500) -#define HIT_TIME_MS D3DVAL(500) -#define DEAD_TIME_MS D3DVAL(4000) -#define VICTORY_TIME_MS D3DVAL(3000) - -// Timing deltas, used for scaling animation to frame rate -D3DVALUE g_bobDelta = NUM_BOB_FRAMES / BOB_TIME_MS; -D3DVALUE g_attackDelta = NUM_PUNCH_FRAMES / PUNCH_TIME_MS; -D3DVALUE g_blockDelta = NUM_BLOCKING_FRAMES / BLOCK_TIME_MS; -D3DVALUE g_hitDelta = NUM_BEEN_HIT_FRAMES / HIT_TIME_MS; -D3DVALUE g_deadDelta = NUM_DEAD_FRAMES / DEAD_TIME_MS; -D3DVALUE g_victoryDelta = NUM_DEAD_FRAMES / DEAD_TIME_MS; - -// Externals.... -extern LPDIRECT3DRM g_lpD3DRM; -extern LPDIRECT3DRMFRAME g_lpScene; -extern LPDIRECT3DRMFRAME g_lpCamera; -extern LPDIRECT3DRMFRAME g_lpPlayer1; -extern LPDIRECT3DRMFRAME g_lpPlayer1HeadFrame; -extern LPDIRECT3DRMFRAME g_lpPlayer2; -extern LPDIRECT3DRMFRAME g_lpPlayer2HeadFrame; -extern LPDIRECT3DRMFRAME g_lpTmp; -extern LPDIRECT3DRMANIMATION g_lpAnim; -extern LPDIRECT3DRMMESHBUILDER g_lpRedDebris; -extern LPDIRECT3DRMMESHBUILDER g_lpBlueDebris; -extern Debris g_debris[NUM_DEBRIS]; -extern LPDIRECTSOUND3DLISTENER g_lpDs3dListener; // Defined in DIRECTX.CPP - - -//---------------------------------------------------------------------- -// -// Function : IsKeyDown() -// -// Purpose : Returns TRUE if specified key is being pressed -// -//---------------------------------------------------------------------- - -BOOL IsKeyDown(int virtKeyCode) -{ - if (GetAsyncKeyState(virtKeyCode) & 0x8000) return TRUE; - - return FALSE; -} - -//---------------------------------------------------------------------- -// -// Function : Player1AnimationCallback() -// -// Purpose : Animation call back for player 1 -// -//---------------------------------------------------------------------- - -void CDECL Player1AnimationCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta) -{ - D3DVALUE time = g_player1AnimArgs.time; - D3DVECTOR player1pos; - D3DVECTOR player2pos; - - // Booleans to help with sound playing - static BOOL bHitGround = FALSE; - static BOOL bPlayedWhoosh = FALSE; - - // Get the players positions - g_lpPlayer1->GetPosition(g_lpScene, &player1pos); - g_lpPlayer2->GetPosition(g_lpScene, &player2pos); - - // Compute distance between players - D3DVALUE curDist = player2pos.z - player1pos.z; - - // Do something based upon the state of player 1 - switch (g_player1State) - { - case BOBBING : - { - // Forward the bobbing animation time - g_player1AnimArgs.lpAnimSet->SetTime(time); - time += (g_bobDelta * delta); - - // Reset if animation has ended - if (time > BOB_START + NUM_BOB_FRAMES) time = BOB_START; - - // Record the new time - g_player1AnimArgs.time = time; - } - break; - - case PUNCHING : - { - // Forward the punching animation time - g_player1AnimArgs.lpAnimSet->SetTime(time); - time += (g_attackDelta * delta); - - // Play a whoosh sound if player 1's arm has gone back and is about to punch - if ((time > PUNCH_ARM_COCKED) && (!bPlayedWhoosh)) - { - // Play the whoosh - PlaySoundDS(rand() % 2 == 0 ? WHOOSH1 : WHOOSH2,player1pos); - bPlayedWhoosh = TRUE; - } - - // If the punch has played, see if we hit the opponent - if (time > PUNCH_START + NUM_PUNCH_FRAMES) - { - // Reset player 1's state to BOBBING - time = BOB_START; - g_player1State = BOBBING; - bPlayedWhoosh = FALSE; - - // Play a servo sound - PlaySoundDS(SERVO_DOWN_1,player1pos); - - // Now, decide whether we have hit the other player - if (curDist < MIN_DIST_TO_OPPONENT + D3DVAL(20)) - { - // The opponent may be blocking - if ((g_player2State == BLOCKING) && - (g_player2AnimArgs.time > BLOCK_START + (NUM_BLOCKING_FRAMES / D3DVAL(2)))) - { - // The opponent blocked the punch, so play the block sound - PlaySoundDS(BLOCK1 + (rand() % 3),player2pos); - break; - } - - // We're within the striking distance - if (g_player2health == 0) return; - - // Add some debris into the scene to register a hit and play a sound - D3DVECTOR debrisOrg = player1pos; - D3DVECTOR debrisVel = { D3DVAL(0), D3DVAL(0), D3DVAL(-10) }; - - debrisOrg.x += D3DVAL(40); - debrisOrg.y += D3DVAL(40); - debrisOrg.z += D3DVAL(90); - - // Add some debris - AddDebris(debrisOrg, debrisVel, g_lpRedDebris); - - // Decrease the opponents health - if (g_player2health > 0) g_player2health -= 10; - - if (g_player2health == 0) - { - // The opponent has died! - g_player2State = DEAD; - g_player2AnimArgs.time = DEAD_START; - g_player2AnimArgs.lpAnimSet->SetTime(DEAD_START); - PlaySoundDS(HEAD_SPRING,player2pos); - - // And the player has victory! - g_player1State = VICTORY; - g_player1AnimArgs.time = VICTORY_START; - g_player1AnimArgs.lpAnimSet->SetTime(VICTORY_START); - - PlaySoundDS(VICTORY_YEAH,player1pos); - - return; - } - - // Play a punch sound - PlaySoundDS(rand() % 2 == 0 ? PLAYER1_PUNCH1 : PLAYER1_PUNCH2,player2pos); - - // Recalculate the power bars - RecalcPowerBars(g_player1health, g_player2health); - - // Make sure we force the camera to the correct place - PositionCamera(); - - // Setup the opponents animation and state - g_player2State = BEEN_HIT; - g_player2AnimArgs.time = BEEN_HIT_START; - g_player2AnimArgs.lpAnimSet->SetTime(BEEN_HIT_START); - - // What should the opponent do? - if (rand() % 10 < 2) - { - // Make the opponent defensive - g_oppState = DEFENSIVE; - } - - // Play the ouch sound - PlaySoundDS(PLAYER2_OUCH,player1pos); - } - } - - // Record the new animation time - g_player1AnimArgs.time = time; - } - break; - - case BLOCKING : - { - // Forward the blocking animation time - g_player1AnimArgs.lpAnimSet->SetTime(time); - - // Hold the block up if CTRL is held down - if (GetAsyncKeyState(PLAYER_BLOCK) & 0x8000) - { - if (time < BLOCK_START + (NUM_BLOCKING_FRAMES / 2)) time += (g_blockDelta * delta); - } - else - { - time += (g_blockDelta * delta); - } - - // Reset player 1's state to BOBBING if the animation has ended - if (time > BLOCK_START + NUM_BLOCKING_FRAMES) - { - time = BOB_START; - g_player1State = BOBBING; - } - - // Record the new animation time - g_player1AnimArgs.time = time; - } - break; - - case BEEN_HIT : - { - // Forward the been hit animation time - g_player1AnimArgs.lpAnimSet->SetTime(time); - time += (g_hitDelta * delta); - - if (player1pos.z > EDGE_LEFT) g_lpPlayer1->SetPosition(g_lpScene, player1pos.x, player1pos.y, player1pos.z - D3DVAL(5)); - PositionCamera(); - - // Reset player 1's state to BOBBING if the animation has ended - if (time > BEEN_HIT_START + NUM_BEEN_HIT_FRAMES) - { - time = BOB_START; - g_player1State = BOBBING; - } - - // Record the new animation time - g_player1AnimArgs.time = time; - } - break; - - case DEAD : - { - // Forward the death animation time - g_player1AnimArgs.lpAnimSet->SetTime(time); - time += (g_deadDelta * delta); - - // Play a crash sound if the animation has passes the DEAD_HIT_GROUND frame - if ((time > DEAD_HIT_GROUND) && (!bHitGround)) - { - bHitGround = TRUE; - PlaySoundDS(BLOCK3,player1pos); - } - - // Reset player 1's state to BOBBING if the animation has ended - if (time > DEAD_START + NUM_DEAD_FRAMES) - { - time = BOB_START; - g_player1State = BOBBING; - g_player1health = 100; - bHitGround = FALSE; - - RecalcPowerBars(g_player1health, g_player2health); - } - - // Record the new animation time - g_player1AnimArgs.time = time; - - // Position the camera correctly - PositionCamera(); - } - break; - - case VICTORY : - { - // Forward the victory animation time - g_player1AnimArgs.lpAnimSet->SetTime(time); - time += (g_victoryDelta * delta); - - if (time > VICTORY_START + NUM_VICTORY_FRAMES) - { - time = BOB_START; - g_player1State = BOBBING; - } - g_player1AnimArgs.time = time; - - PositionCamera(); - } - break; - } -} - -//---------------------------------------------------------------------- -// -// Function : Player2AnimationCallback() -// -// Purpose : Animation call back for player 2 -// -//---------------------------------------------------------------------- - -void CDECL Player2AnimationCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta) -{ - D3DVALUE time = g_player2AnimArgs.time; - D3DVECTOR player1pos; - D3DVECTOR player2pos; - - // Booleans to help with sound playing - static BOOL bHitGround = FALSE; - static BOOL bPlayedWhoosh = FALSE; - - // Get the players positions - g_lpPlayer1->GetPosition(g_lpScene, &player1pos); - g_lpPlayer2->GetPosition(g_lpScene, &player2pos); - - // Compute distance between players - D3DVALUE curDist = player2pos.z - player1pos.z; - - // Do something based upon the state of player 1 - switch (g_player2State) - { - case BOBBING : - { - // Forward the bobbing animation time - g_player2AnimArgs.lpAnimSet->SetTime(time); - time += (g_bobDelta * delta); - - // Reset if animation has ended - if (time > BOB_START + NUM_BOB_FRAMES) time = BOB_START; - - // Record the new time - g_player2AnimArgs.time = time; - } - break; - - case PUNCHING : - { - // Forward the punching animation time - g_player2AnimArgs.lpAnimSet->SetTime(time); - time += (g_attackDelta * delta); - - // Play a whoosh sound if player 2's arm has gone back and is about to punch - if ((time > PUNCH_ARM_COCKED) && (!bPlayedWhoosh)) - { - // Play the whoosh - PlaySoundDS(rand() % 2 == 0 ? WHOOSH1 : WHOOSH2,player2pos); - bPlayedWhoosh = TRUE; - } - - // If the punch has played, see if we hit the opponent - if (time > PUNCH_START + NUM_PUNCH_FRAMES) - { - time = BOB_START; - g_player2State = BOBBING; - bPlayedWhoosh = FALSE; - - // Play a servo sound - PlaySoundDS(SERVO_DOWN_2,player2pos); - - // Now, decide whether we have hit the other player - if (curDist < MIN_DIST_TO_OPPONENT + D3DVAL(20)) - { - // The opponent may be blocking - if ((g_player1State == BLOCKING) && - (g_player1AnimArgs.time > BLOCK_START + (NUM_BLOCKING_FRAMES / D3DVAL(2)))) - { - // The opponent blocked the punch, so play the block sound - PlaySoundDS(BLOCK1 + (rand() % 3),player1pos); - break; - } - - // We're within the striking distance - if (g_player1health <= 0) return; - - // We're within the striking distance - // Add some debris into the scene to register a hit and play a sound - D3DVECTOR debrisOrg = player1pos; - D3DVECTOR debrisVel = { D3DVAL(0), D3DVAL(0), D3DVAL(10) }; - - debrisOrg.x += D3DVAL(-40); - debrisOrg.y += D3DVAL(40); - debrisOrg.z += D3DVAL(-10); - - // Add some debris - AddDebris(debrisOrg, debrisVel, g_lpBlueDebris); - - // Play a punch sound - PlaySoundDS(rand() % 2 == 0 ? PLAYER2_PUNCH1 : PLAYER2_PUNCH2,player1pos); - - // Decrease the opponents health - if (g_player1health > 0) g_player1health -= 10; - - if (g_player1health == 0) - { - // The player has died! - g_player1State = DEAD; - g_player1AnimArgs.time = DEAD_START; - g_player1AnimArgs.lpAnimSet->SetTime(DEAD_START); - PlaySoundDS(HEAD_SPRING,player1pos); - - // And the opponent has victory! - g_player2State = VICTORY; - g_player2AnimArgs.time = VICTORY_START; - g_player2AnimArgs.lpAnimSet->SetTime(VICTORY_START); - - // The crowd is not happy.... - PlaySoundDS(VICTORY_BOO,player2pos); - - return; - } - - // Recalculate the power bars - RecalcPowerBars(g_player1health, g_player2health); - - // Force a camera positional update - PositionCamera(); - - if (g_player1State != BEEN_HIT) - { - // Change player 1's state to BEEN_HIT, - g_player1State = BEEN_HIT; - - // And set the animation time - g_player1AnimArgs.time = BEEN_HIT_START; - g_player1AnimArgs.lpAnimSet->SetTime(BEEN_HIT_START); - } - - // Play the ouch sound - PlaySoundDS(PLAYER1_OUCH,player1pos); - } - } - - // Record the new animation time - g_player2AnimArgs.time = time; - } - break; - - case BEEN_HIT : - { - // Forward the been hit animation time - g_player2AnimArgs.lpAnimSet->SetTime(time); - time += (g_hitDelta * delta); - - // Move the player - if (player2pos.z < EDGE_RIGHT) g_lpPlayer2->SetPosition(g_lpScene, player2pos.x, player2pos.y, player2pos.z + D3DVAL(5)); - - // Force a camera position update - PositionCamera(); - - // Reset to BOBBING if animation has ended - if (time > BEEN_HIT_START + NUM_BEEN_HIT_FRAMES) - { - time = BOB_START; - g_player2State = BOBBING; - } - - // Record the new animation time - g_player2AnimArgs.time = time; - } - break; - - case BLOCKING : - { - // Forward the blocking animation time - g_player2AnimArgs.lpAnimSet->SetTime(time); - time += (g_blockDelta * delta); - - // Reset to BOBBING if animation has ended - if (time > BLOCK_START + NUM_BLOCKING_FRAMES) - { - time = BOB_START; - g_player2State = BOBBING; - g_oppState = AGGRESSIVE; - } - - // Record the new animation time - g_player2AnimArgs.time = time; - } - break; - - case DEAD : - { - // Forward the death animation time - g_player2AnimArgs.lpAnimSet->SetTime(time); - time += (g_deadDelta * delta); - - // Play the BLOCK3 sound when the opponent hits the ground - if ((time > DEAD_HIT_GROUND) && (!bHitGround)) - { - bHitGround = TRUE; - PlaySoundDS(BLOCK3,player2pos); - } - - // Reset to BOBBING if the animation has ended - if (time > DEAD_START + NUM_DEAD_FRAMES) - { - time = BOB_START; - g_player2State = BOBBING; - g_player2health = 100; - bHitGround = FALSE; - - // Recalculate the power bars - RecalcPowerBars(g_player1health, g_player2health); - } - // Record the new animation time - g_player2AnimArgs.time = time; - - // Force a camera position update - PositionCamera(); - } - break; - - case VICTORY : - { - // Forward the victory animation time - g_player2AnimArgs.lpAnimSet->SetTime(time); - time += (g_victoryDelta * delta); - - if (time > VICTORY_START + NUM_VICTORY_FRAMES) - { - time = BOB_START; - g_player2State = BOBBING; - } - - // Record the new animation time - g_player2AnimArgs.time = time; - - // Force a camera position update - PositionCamera(); - } - break; - } -} - -//---------------------------------------------------------------------- -// -// Function : CheckInputAndUpdate() -// -// Purpose : Checks input, updates scene, moves player(s) -// -//---------------------------------------------------------------------- - -void CheckInputAndUpdate() -{ - D3DVECTOR player1pos; - D3DVECTOR player2pos; - D3DVECTOR camPos; - - // Run intro - if (g_appState == DOING_INTRO) - { - RunIntro(); - return; - } - - // Transition camera - if (g_appState == BETWEEN_CAM_VIEWS) - { - TransitionCamera(); - return; - } - - // Get the players positions - g_lpPlayer1->GetPosition(g_lpScene, &player1pos); - g_lpPlayer2->GetPosition(g_lpScene, &player2pos); - - // Get the camera's position - g_lpCamera->GetPosition(g_lpScene, &camPos); - - // Calculate distance between players - D3DVALUE curDist = player2pos.z - player1pos.z; - - // Move player forward - if ((IsKeyDown(PLAYER_MOVE_FORWARD)) && (g_player1State != VICTORY) && (g_player1State != DEAD)) - { - // Make sure the player can only move so close to the opponent - if (curDist > MIN_DIST_TO_OPPONENT) - { - // Move the player - g_lpPlayer1->SetPosition(g_lpScene, player1pos.x, player1pos.y, player1pos.z + MOVE_NORMAL); - - // Force a camera position update - PositionCamera(); - - // Play a servo sound - PlaySoundDS(SERVO_UP_3,player1pos); - - // Play a walk sound - PlaySoundDS(PLAYER1_WALK,player1pos); - } - } - - // Move player backward - if ((IsKeyDown(PLAYER_MOVE_BACKWARD)) && (g_player1State != VICTORY) && (g_player1State != DEAD)) - { - // Make sure the player can't run off the arena - if (player1pos.z > EDGE_LEFT) - { - // Move the player - g_lpPlayer1->SetPosition(g_lpScene, player1pos.x, player1pos.y, player1pos.z - MOVE_NORMAL); - - // Force a camera position update - PositionCamera(); - - // Play a servo sound - PlaySoundDS(SERVO_UP_3,player1pos); - - // Play a walk sound - PlaySoundDS(PLAYER1_WALK,player1pos); - } - } - - // Initiate a player attack - if ((!g_bPlayer1Attacking) && (!g_bPlayer1Blocking) && (IsKeyDown(PLAYER_ATTACK))) - { - if ((g_player1State != PUNCHING) && (g_player1State != DEAD) && (g_player1State != VICTORY)) - { - // Set the player state to punching - g_player1State = PUNCHING; - - // Set up the correct time for the animation - g_player1AnimArgs.time = D3DVAL(PUNCH_START); - g_player1AnimArgs.lpAnimSet->SetTime(D3DVAL(PUNCH_START)); - - g_bPlayer1Attacking = TRUE; - - // Play a servo sound - PlaySoundDS(SERVO_UP_1,player1pos); - } - } - - // Reset the attacking flag if the PLAYER_ATTACK key is not pressed anymore - if ((g_bPlayer1Attacking) && (!IsKeyDown(PLAYER_ATTACK))) - { - g_bPlayer1Attacking = FALSE; - } - - // Initiate a player block - if ((!g_bPlayer1Blocking) && (!g_bPlayer1Attacking) && (IsKeyDown(PLAYER_BLOCK))) - { - if ((g_player1State != BLOCKING) && (g_player1State != DEAD) && (g_player1State != VICTORY)) - { - // Set the player state to blocking - g_player1State = BLOCKING; - - // Set up the correct time for the animation - g_player1AnimArgs.time = D3DVAL(BLOCK_START); - g_player1AnimArgs.lpAnimSet->SetTime(D3DVAL(BLOCK_START)); - - // Don't allow any more blocking - g_bPlayer1Blocking = TRUE; - - // Play a servo sound - PlaySoundDS(SERVO_UP_1,player1pos); - } - } - - // Reset the blocking flag if the PLAYER_BLOCK key is no longer held down - if ((g_bPlayer1Blocking) && (!IsKeyDown(PLAYER_BLOCK))) - { - g_bPlayer1Blocking = FALSE; - } - - // Transition to the BOTH_IN_VIEW camera view - if ((IsKeyDown(CAM_BOTH_IN_VIEW)) && (g_camState != BOTH_IN_VIEW)) - { - // Create transition animation - if (!FAILED(g_lpD3DRM->CreateAnimation(&g_lpAnim))) - { - // Setup the animation options - g_lpAnim->SetOptions(D3DRMANIMATION_OPEN | - D3DRMANIMATION_LINEARPOSITION | - D3DRMANIMATION_POSITION); - - // Make midway vector between both players, this is what the camera will focus on - D3DVECTOR vMidPoint; - vMidPoint.x = 0.0f; - vMidPoint.y = 0.0f; - vMidPoint.z = (player1pos.z + player2pos.z) / D3DVAL(2); - - // Calculate vector that will keep both players in sight - D3DVECTOR vNewCam; - vNewCam.x = (float)abs((int)player2pos.z - (int)player1pos.z) + D3DVAL(300); - vNewCam.y = camPos.y; - vNewCam.z = vMidPoint.z; - - // Add the keyframes to the animation - g_lpAnim->AddPositionKey(D3DVAL(0), camPos.x, camPos.y, camPos.z); - g_lpAnim->AddPositionKey(D3DVAL(1), vNewCam.x, vNewCam.y, vNewCam.z); - - // Setup the initial position - g_lpTmp->SetPosition(g_lpScene, vMidPoint.x, vMidPoint.y, vMidPoint.z); - - // And attach the camera to the animation - g_lpAnim->SetFrame(g_lpCamera); - - g_appState = BETWEEN_CAM_VIEWS; - } - else - { - // Create animation failed so just set the camera position - g_lpCamera->SetPosition(g_lpScene, D3DVAL(200), D3DVAL(100), player1pos.z + MOVE_NORMAL - D3DVAL(400)); - g_lpCamera->LookAt(g_lpPlayer2, g_lpScene, D3DRMCONSTRAIN_Z); - PositionCamera(); - } - - g_camState = BOTH_IN_VIEW; - } - - // Transition to the OVER_SHOULDER camera view - if ((IsKeyDown(CAM_OVER_THE_SHOULDER)) && (g_camState != OVER_SHOULDER)) - { - if (!FAILED(g_lpD3DRM->CreateAnimation(&g_lpAnim))) - { - // Setup the animation options - g_lpAnim->SetOptions(D3DRMANIMATION_OPEN | - D3DRMANIMATION_LINEARPOSITION | - D3DRMANIMATION_POSITION); - - // Add the keyframes to the animation - g_lpAnim->AddPositionKey(D3DVAL(0), camPos.x, camPos.y, camPos.z); - g_lpAnim->AddPositionKey(D3DVAL(1), D3DVAL(200), D3DVAL(100), player1pos.z - D3DVAL(300)); - - // Setup the initial position - g_lpTmp->SetPosition(g_lpScene, player2pos.x, player2pos.y, player2pos.z); - - // And attach the camera to the animation - g_lpAnim->SetFrame(g_lpCamera); - - g_appState = BETWEEN_CAM_VIEWS; - } - else - { - // Create animation failed so just set the camera position - PositionCamera(); - } - - g_camState = OVER_SHOULDER; - } - - // Transition to the PILOT_VIEW camera view - if ((IsKeyDown(CAM_PILOT)) && (g_camState != PILOT_VIEW)) - { - PositionCamera(); - g_camState = PILOT_VIEW; - } - - // Update the opponent - UpdateOpponent(); - - // Update any debris in the world - UpdateDebris(); -} - -//---------------------------------------------------------------------- -// -// Function : UpdateOpponent() -// -// Purpose : Updates opponent -// -//---------------------------------------------------------------------- - -void UpdateOpponent() -{ - D3DVECTOR player1pos; - D3DVECTOR player2pos; - - if (g_player2State != BOBBING) return; - - // Random value to determine what the opponent should do based upon its state - int r = rand() % 100; - - // Get the players positions - g_lpPlayer1->GetPosition(g_lpScene, &player1pos); - g_lpPlayer2->GetPosition(g_lpScene, &player2pos); - - // Calculate distance betweens players - D3DVALUE curDist = player2pos.z - player1pos.z; - - // There is always a chance to block the player - if ((r < 15) && (g_player1State == PUNCHING) && (g_player2State == BOBBING)) - { - // Set the opponents state to BLOCKING ans start the animation - g_player2State = BLOCKING; - g_player2AnimArgs.time = BLOCK_START; - g_player2AnimArgs.lpAnimSet->SetTime(BLOCK_START); - - // Play a servo sound - PlaySoundDS(SERVO_UP_2,player2pos); - return; - } - - switch (g_oppState) - { - case DEFENSIVE: - { - // Decide whether to move opponent backwards - if (r < 25) - { - // Move the opponent backwards - g_lpPlayer2->SetPosition(g_lpScene, player2pos.x, player2pos.y, player2pos.z + MOVE_NORMAL); - - // Play a walk sound - PlaySoundDS(PLAYER2_WALK,player2pos); - - // Play a servo sound - PlaySoundDS(SERVO_DOWN_3,player2pos); - } - PositionCamera(); - - // Decide whether to go from DEFENSIVE to cautious - if (r < 10) g_oppState = CAUTIOUS; - } - break; - - case CAUTIOUS: - { - // Decide whether to go from CAUTIOUS to AGGRESSIVE - if (r < 5) - { - // Make the opponent become aggresive - g_oppState = AGGRESSIVE; - } - } - break; - - case AGGRESSIVE: - { - // Decide whether to move the opponent towards the player - if (r < 50) - { - // Move the opponent towards the player - if (curDist > MIN_DIST_TO_OPPONENT) - { - g_lpPlayer2->SetPosition(g_lpScene, player2pos.x, player2pos.y, player2pos.z - MOVE_NORMAL); - PositionCamera(); - - // Play a walk sound - PlaySoundDS(PLAYER2_WALK,player2pos); - - // Play a servo sound - PlaySoundDS(SERVO_DOWN_3,player2pos); - } - } - - // Decide whether or not to attack the player - if ((r < 15) && (g_player2State == BOBBING) && - (g_player1State != DEAD) && (curDist < MIN_DIST_TO_OPPONENT + D3DVAL(50))) - { - // Set the opponent's state to PUNCHING - g_player2State = PUNCHING; - g_player2AnimArgs.time = PUNCH_START; - g_player2AnimArgs.lpAnimSet->SetTime(PUNCH_START); - - // Play a servo sound - PlaySoundDS(SERVO_UP_2,player2pos); - } - - // Decide whether or not to move the opponent backwards out of the way if the player - // is punching - if ((g_player1State == PUNCHING) && (r > 50) && (g_player2State == BOBBING) && (curDist < MIN_DIST_TO_OPPONENT + 50)) - { - // Move the opponent out of the way, making sure its still in the arena - if (player2pos.z < EDGE_RIGHT) - { - g_lpPlayer2->SetPosition(g_lpScene, player2pos.x, player2pos.y, player2pos.z + D3DVAL(5)); - - // Play a servo sound - PlaySoundDS(SERVO_DOWN_3,player1pos); - } - } - } - break; - } -} - -//---------------------------------------------------------------------- -// -// Function : RunIntro() -// -// Purpose : Moves camera along path -// -//---------------------------------------------------------------------- - -void RunIntro() -{ - static D3DVALUE time = D3DVAL(0.0f); - D3DVECTOR d3dvPos; // D3DVECTOR used for 3D position of sound - d3dvPos.x = D3DVAL(0); // set the sound at (0,0,0).. - d3dvPos.y = D3DVAL(0); - d3dvPos.z = D3DVAL(0); - - // Play the intro sound - if (time == D3DVAL(0.0f)) - { - PlaySoundDS(INTRO,d3dvPos); - PlaySoundDS(CROWD_LOOP,d3dvPos, DSBPLAY_LOOPING); - SetTimer(NULL,NULL,10000,PlayRandomWave); - } - - // Foward the intro animation - time += D3DVAL(0.04); - - // Set the animation time - g_lpAnim->SetTime(time); - - // Always look at the origin of the g_lpScene frame - g_lpCamera->LookAt(g_lpTmp, g_lpScene, D3DRMCONSTRAIN_Z); - - // If time has exceeded 1.0 the intro is done, and we can start the demo - if (time >= D3DVAL(1.0f)) - { - g_appState = PLAYING_DEMO; - g_lpAnim->Release(); - g_lpAnim = NULL; - PositionCamera(); - } -} - -//---------------------------------------------------------------------- -// -// Function : PostionCamera() -// -// Purpose : Positions camera based upon camera state -// -//---------------------------------------------------------------------- - -void PositionCamera() -{ - D3DVECTOR player1pos; - D3DVECTOR player2pos; - D3DVECTOR camPos; - - // Don't position the camera if we are transitioning between camera views - if (g_appState == BETWEEN_CAM_VIEWS) return; - - // Get the players positions - g_lpPlayer1->GetPosition(g_lpScene, &player1pos); - g_lpPlayer2->GetPosition(g_lpScene, &player2pos); - - // Get the camera's position - g_lpCamera->GetPosition(g_lpScene, &camPos); - - switch (g_camState) - { - case OVER_SHOULDER: - { - // Position the camera such that it looks over the shoulder of the player and - // keeps the opponent in view - g_lpCamera->SetPosition(g_lpScene, camPos.x, camPos.y, D3DVAL(player1pos.z) + MOVE_NORMAL - 300); - g_lpCamera->LookAt(g_lpPlayer2, g_lpScene, D3DRMCONSTRAIN_Z); - if (g_lpDs3dListener) - { - // Set the listener position to where the camera is - g_lpDs3dListener->SetPosition(camPos.x, camPos.y, D3DVAL(player1pos.z) + MOVE_NORMAL - 300,DS3D_DEFERRED); - // Change listener's orientation vector - g_lpDs3dListener->SetOrientation(D3DVAL(0),D3DVAL(0),D3DVAL(1),D3DVAL(0),D3DVAL(1),D3DVAL(0),DS3D_DEFERRED); - } - } - break; - - case BOTH_IN_VIEW: - { - // Position the camera such that it looks at both players all the time - - // Make midway point, this is what the camera will focus on - D3DVECTOR vMidPoint; - vMidPoint.x = 0.0f; - vMidPoint.y = 0.0f; - vMidPoint.z = (player1pos.z + player2pos.z) / D3DVAL(2); - - // Calculate vector that will keep both players in sight - D3DVECTOR vNewCam; - vNewCam.x = (float)abs((int)player2pos.z - (int)player1pos.z) + D3DVAL(300); - vNewCam.y = camPos.y; - vNewCam.z = vMidPoint.z; - - g_lpCamera->SetPosition(g_lpScene, vNewCam.x, vNewCam.y, vNewCam.z); - - g_lpTmp->SetPosition(g_lpScene, vMidPoint.x, vMidPoint.y, vMidPoint.z); - g_lpCamera->LookAt(g_lpTmp, g_lpScene, D3DRMCONSTRAIN_Z); - if (g_lpDs3dListener) - { - // Set the listener position to where the camera is - g_lpDs3dListener->SetPosition(vNewCam.x, vNewCam.y, vNewCam.z,DS3D_DEFERRED); - // Change listener's orientation vector - g_lpDs3dListener->SetOrientation(-D3DVAL(1),D3DVAL(0),D3DVAL(0),D3DVAL(0),D3DVAL(1),D3DVAL(0),DS3D_DEFERRED); - } - } - break; - - case PILOT_VIEW: - { - // Position the camera such that it looks through the eyes of the player - // and fixes on the origin of the head frame of the opponent - - g_lpCamera->SetPosition(g_lpPlayer1HeadFrame, D3DVAL(0), D3DVAL(-10), D3DVAL(0)); - g_lpTmp->SetPosition(g_lpPlayer2HeadFrame, D3DVAL(0), D3DVAL(-10), D3DVAL(0)); - g_lpCamera->LookAt(g_lpTmp, g_lpScene, D3DRMCONSTRAIN_Z); - if (g_lpDs3dListener) - { - // Set the listener position to where the camera is - g_lpDs3dListener->SetPosition(player1pos.x, D3DVAL(0), player1pos.z,DS3D_DEFERRED); - // Change listener's orientation vector - g_lpDs3dListener->SetOrientation(D3DVAL(0),D3DVAL(0),D3DVAL(1),D3DVAL(0),D3DVAL(1),D3DVAL(0),DS3D_DEFERRED); - } - } - break; - } - // Commit the changes to the listener's orientation and position.. - if (g_lpDs3dListener) - g_lpDs3dListener->CommitDeferredSettings(); -} - -//---------------------------------------------------------------------- -// -// Function : TransitionCamera() -// -// Purpose : Positions camera based upon camera state -// -//---------------------------------------------------------------------- - -void TransitionCamera() -{ - static D3DVALUE time = D3DVAL(0.0f); - - // Forward the transition animation time - time += D3DVAL(0.04); - - // Set the time for the transitional animation - g_lpAnim->SetTime(time); - - // Look at the g_lpScene frame - g_lpCamera->LookAt(g_lpTmp, g_lpScene, D3DRMCONSTRAIN_Z); - - // If the animation has ended, run the demo - if (time >= D3DVAL(1.0f)) - { - g_appState = PLAYING_DEMO; - g_lpAnim->Release(); - g_lpAnim = NULL; - time = D3DVAL(0); - PositionCamera(); - } - - // Update debris so any debris in the scene doesn't just sit there doing nothing - UpdateDebris(); -} - -//---------------------------------------------------------------------- -// -// Function : AddDebris() -// -// Purpose : Adds some debris to the scene -// -//---------------------------------------------------------------------- - -void AddDebris(D3DVECTOR vOrg, D3DVECTOR vVel, LPDIRECT3DRMMESHBUILDER pDebris) -{ - // vOrg is the origin of the debris, find first open spot and add 5 bits of debris - int count = 0; - - for (int i = 0; i < NUM_DEBRIS; i ++) - { - // Find some debris that is not in use yet - if (!g_debris[i].m_bInUse) - { - // Add some debris - g_debris[i].m_pFrame->AddVisual(pDebris); - g_debris[i].m_pFrame->SetPosition(g_lpScene, vOrg.x, vOrg.y, vOrg.z); - g_debris[i].m_pFrame->SetRotation(g_lpScene, D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5)); - g_debris[i].m_life = 0; - - // Setup velocity and acceleration - g_debris[i].m_vel.x = D3DVAL(-10 + (rand() % 20)) + vVel.x; - g_debris[i].m_vel.y = D3DVAL(8) + D3DVAL(rand() % 10) + vVel.y; - g_debris[i].m_vel.z = D3DVAL(-10 + (rand() % 20)) + vVel.z; - - g_debris[i].m_acc.x = D3DVAL(0); - g_debris[i].m_acc.y = D3DVAL(-2); - g_debris[i].m_acc.z = D3DVAL(0); - - // This piece of debris is now in use - g_debris[i].m_bInUse = TRUE; - g_debris[i].m_pMeshBuilder = pDebris; - - count ++; - } - - // Return if we've added NUM_HIT_DEBRIS bits of debris - if (count == NUM_HIT_DEBRIS) return; - } -} - -//---------------------------------------------------------------------- -// -// Function : UpdateDebris() -// -// Purpose : Updates debris -// -//---------------------------------------------------------------------- - -void UpdateDebris() -{ - D3DVECTOR vPos; - - // Go through the array of debris and update any debris that is in use - - for (int i = 0; i < NUM_DEBRIS; i ++) - { - if (g_debris[i].m_bInUse) - { - // If the debris's life has not yet expired - if (g_debris[i].m_life < DEBRIS_LIFE) - { - // Move the debris - g_debris[i].m_pFrame->GetPosition(g_lpScene, &vPos); - - g_debris[i].m_vel.x += g_debris[i].m_acc.x; - g_debris[i].m_vel.y += g_debris[i].m_acc.y; - g_debris[i].m_vel.z += g_debris[i].m_acc.z; - - vPos.x += g_debris[i].m_vel.x; - vPos.y += g_debris[i].m_vel.y; - vPos.z += g_debris[i].m_vel.z; - - // Check to see whether the debris is below the floor - if (vPos.y < D3DVAL(-60)) - { - // Bounce the debris - vPos.y = D3DVAL(-60); - g_debris[i].m_vel.y = -g_debris[i].m_vel.y / D3DVAL(1.5); - } - - // Update the position of the debris - g_debris[i].m_pFrame->SetPosition(g_lpScene, vPos.x, vPos.y, vPos.z); - } - else - { - // Remove the debris from the world - g_debris[i].m_pFrame->DeleteVisual(g_debris[i].m_pMeshBuilder); - g_debris[i].m_bInUse = FALSE; - } - - // Age the debris - g_debris[i].m_life ++; - } - } -} - diff --git a/sdk/samples/rockem/control.h b/sdk/samples/rockem/control.h deleted file mode 100644 index 0fab8d2..0000000 --- a/sdk/samples/rockem/control.h +++ /dev/null @@ -1,72 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: control.h - * - ***************************************************************************/ - -#ifndef __CONTROL_H_ -#define __CONTROL_H_ - -// Type to define what app is currently doing -typedef enum -{ - DOING_INTRO, - PLAYING_DEMO, - BETWEEN_CAM_VIEWS, -} -AppState; - -// Type to define what state the opponent is in -typedef enum -{ - DEFENSIVE, - CAUTIOUS, - AGGRESSIVE, -} -PlayerState; - -// Type to define what kind of camera angles were using -typedef enum -{ - OVER_SHOULDER, - BOTH_IN_VIEW, - PILOT_VIEW, -} -CameraState; - -// Type to define what action the player is doing -typedef enum -{ - BOBBING, - WALKING, - PUNCHING, - BLOCKING, - BEEN_HIT, - DEAD, - VICTORY, - DISABLED, -} -PlayerActionState; - -// Structures -struct AnimArgs -{ - LPDIRECT3DRMANIMATIONSET lpAnimSet; - D3DVALUE time; -}; - -void Player1AnimationCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta); -void Player2AnimationCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta); - -void CheckInputAndUpdate(); -void UpdateOpponent(); -void UpdateDebris(); -void RunIntro(); -void PositionCamera(); -void TransitionCamera(); -void AddDebris(D3DVECTOR vOrg, D3DVECTOR vVel, LPDIRECT3DRMMESHBUILDER pDebris); - -#endif - diff --git a/sdk/samples/rockem/cyeah.wav b/sdk/samples/rockem/cyeah.wav deleted file mode 100644 index eb73ff4..0000000 Binary files a/sdk/samples/rockem/cyeah.wav and /dev/null differ diff --git a/sdk/samples/rockem/d3dbld.mk b/sdk/samples/rockem/d3dbld.mk deleted file mode 100644 index b7fd310..0000000 --- a/sdk/samples/rockem/d3dbld.mk +++ /dev/null @@ -1,33 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: d3dbld.mk -# Content: Master makefile for Microsoft Visual C++ 2.0 -# For controlling what gets built (debug, retail, clean) -# -############################################################################ - -goal: debug.mak - -all : debug.mak retail.mak - -debug retail: $@.mak - -!ifndef MAKENAME -MAKENAME = default.mk -!endif - -debug.mak retail.mak: - @if not exist $(@B)\nul md $(@B) - @cd $(@B) - @nmake -nologo -f ..\$(MAKENAME) DEBUG="$(@B)" - @cd .. - @echo *** Done making $(@B) *** - -clean: debug.cln retail.cln - -debug.cln retail.cln: - @if exist $(@B)\nul del $(@B) < yes >nul - @if exist $(@B)\nul rd $(@B) >nul - @echo *** $(@B) is clean *** diff --git a/sdk/samples/rockem/d3dsdk.mk b/sdk/samples/rockem/d3dsdk.mk deleted file mode 100644 index d20ed6b..0000000 --- a/sdk/samples/rockem/d3dsdk.mk +++ /dev/null @@ -1,115 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: d3dsdk.mk -# Content: Rules for building the components of the SDK. -# For use with MSVC 2.0 or higher -# -############################################################################ - -!if "$(GSDKROOT)" == "" -GSDKROOT=\dxsdk\sdk -!endif - -############################################################################# -# -# Set up include & lib path -# -############################################################################# -INCLUDE=$(GSDKROOT)\inc;..\..\misc;$(INCLUDE) -LIB=$(GSDKROOT)\lib;$(LIB) - -############################################################################# -# -# new suffixes -# -############################################################################# -.SUFFIXES: -.SUFFIXES: .asm .c .cpp .exe .dll .h .inc .lib .sym .rc .res - -############################################################################# -# -# C compiler definitions -# -############################################################################# -CC =cl -CFLAGS = $(CFLAGS) -W1 -WX -c -Zp -CFLAGS =$(CFLAGS) -G5 -DIS_32 -DWIN32 -!ifndef LOGO -CFLAGS =$(CFLAGS) -nologo -!endif - -############################################################################# -# -# Linker definitions -# -############################################################################# -LINK =link -link -LFLAGS =$(LFLAGS) -nodefaultlib -align:0x1000 -!ifndef LOGO -LFLAGS =$(LFLAGS) -nologo -!endif - -############################################################################# -# -# resource compiler definitions -# -############################################################################# -RCFLAGS =$(RCFLAGS) -I.. -RCFLAGS =$(RCFLAGS) -DWIN32 -DIS_32 -RC = rc - -############################################################################# -# -# assembler definitions -# -############################################################################# -ASM = ml -AFLAGS =$(AFLAGS) -DIS_32 -DWIN32 -AFLAGS =$(AFLAGS) -W3 -WX -Zd -c -Cx -DMASM6 - -############################################################################# -# -# librarian definitions -# -############################################################################# -LIBEXE = lib - -############################################################################# -# -# targets -# -############################################################################# - -goal: $(GOALS) - -{..}.c{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\$(@B).c -<< - -{..\..\misc}.c{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\..\misc\$(@B).c -<< - -{..}.cpp{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\$(@B).cpp -<< - -{..\..\misc}.cpp{}.obj: - @$(CC) @<< -$(CFLAGS) -Fo$(@B).obj ..\..\misc\$(@B).cpp -<< - -{..}.asm{}.obj: - $(ASM) $(AFLAGS) -Fo$(@B).obj ..\$(@B).asm - -{..}.rc{}.res: - $(RC) $(RCFLAGS) -r -Fo$(@B).res ..\$(@B).rc - -{..\..\misc}.rc{}.res: - $(RC) $(RCFLAGS) -r -Fo$(@B).res ..\..\misc\$(@B).rc - diff --git a/sdk/samples/rockem/debris_b.x b/sdk/samples/rockem/debris_b.x deleted file mode 100644 index c4a3159..0000000 --- a/sdk/samples/rockem/debris_b.x +++ /dev/null @@ -1,236 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -Header { - 1; - 0; - 1; -} - -Mesh { - 10; - 0.082451;-0.082450;-6.700000;, - 0.082451;0.082451;-6.700000;, - -0.082451;0.082451;-6.700000;, - -0.082451;-0.082450;-6.700000;, - 3.349999;-3.350001;-0.000000;, - 3.350000;3.350000;0.000000;, - -3.349999;3.350001;0.000000;, - -3.350002;-3.349998;-0.000000;, - 0.000000;0.000000;-6.700000;, - 0.000000;-0.000000;-0.000000;; - - 16; - 3;0,8,1;, - 3;1,8,2;, - 3;2,8,3;, - 3;3,8,0;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,5,9;, - 3;5,6,9;, - 3;6,7,9;, - 3;7,4,9;; - - MeshMaterialList { - 1; - 1; - 0;; - Material { - 0.274510;0.325490;0.905882;1.000000;; - 30.000000; - 0.768627;0.768627;0.768627;; - 0.000000;0.000000;0.000000;; - } - } - MeshNormals { - 26; - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;0.000000;-1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;-0.000000;1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.000000;-0.000000;1.000000;; - - 16; - 3;0,24,3;, - 3;3,24,6;, - 3;6,24,9;, - 3;9,24,0;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,17,25;, - 3;17,20,25;, - 3;20,23,25;, - 3;23,14,25;; - } - MeshTextureCoords { - 10; - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;; - } -} diff --git a/sdk/samples/rockem/debris_r.x b/sdk/samples/rockem/debris_r.x deleted file mode 100644 index 8e1fad2..0000000 --- a/sdk/samples/rockem/debris_r.x +++ /dev/null @@ -1,236 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -Header { - 1; - 0; - 1; -} - -Mesh { - 10; - 0.082451;-0.082450;-6.700000;, - 0.082451;0.082451;-6.700000;, - -0.082451;0.082451;-6.700000;, - -0.082451;-0.082450;-6.700000;, - 3.349999;-3.350001;-0.000000;, - 3.350000;3.350000;0.000000;, - -3.349999;3.350001;0.000000;, - -3.350002;-3.349998;-0.000000;, - 0.000000;0.000000;-6.700000;, - 0.000000;-0.000000;-0.000000;; - - 16; - 3;0,8,1;, - 3;1,8,2;, - 3;2,8,3;, - 3;3,8,0;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,5,9;, - 3;5,6,9;, - 3;6,7,9;, - 3;7,4,9;; - - MeshMaterialList { - 1; - 1; - 0;; - Material { - 0.905882;0.274510;0.274510;1.000000;; - 29.000000; - 0.768627;0.768627;0.768627;; - 0.000000;0.000000;0.000000;; - } - } - MeshNormals { - 26; - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;0.000000;-1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;0.000000;-1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.898808;-0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.898808;-0.000000;-0.438343;, - 0.000000;0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.898808;-0.438343;, - -0.898808;0.000000;-0.438343;, - 0.000000;-0.000000;1.000000;, - -0.898808;0.000000;-0.438343;, - -0.000000;-0.898808;-0.438343;, - 0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.000000;-0.000000;1.000000;; - - 16; - 3;0,24,3;, - 3;3,24,6;, - 3;6,24,9;, - 3;9,24,0;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,17,25;, - 3;17,20,25;, - 3;20,23,25;, - 3;23,14,25;; - } - MeshTextureCoords { - 10; - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;, - 0.000000;0.000000;; - } -} diff --git a/sdk/samples/rockem/defend1.wav b/sdk/samples/rockem/defend1.wav deleted file mode 100644 index ff34787..0000000 Binary files a/sdk/samples/rockem/defend1.wav and /dev/null differ diff --git a/sdk/samples/rockem/defend2.wav b/sdk/samples/rockem/defend2.wav deleted file mode 100644 index a83ac59..0000000 Binary files a/sdk/samples/rockem/defend2.wav and /dev/null differ diff --git a/sdk/samples/rockem/demech.x b/sdk/samples/rockem/demech.x deleted file mode 100644 index 1e7dcd3..0000000 --- a/sdk/samples/rockem/demech.x +++ /dev/null @@ -1,3819 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -template FrameTransformMatrix { - - Matrix4x4 frameMatrix; -} - -template Frame { - <3D82AB46-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template FloatKeys { - <10DD46A9-775B-11cf-8F52-0040333594A3> - DWORD nValues; - array FLOAT values[nValues]; -} - -template TimedFloatKeys { - - DWORD time; - FloatKeys tfkeys; -} - -template AnimationKey { - <10DD46A8-775B-11cf-8F52-0040333594A3> - DWORD keyType; - DWORD nKeys; - array TimedFloatKeys keys[nKeys]; -} - -template AnimationOptions { - - DWORD openclosed; - DWORD positionquality; -} - -template Animation { - <3D82AB4F-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template AnimationSet { - <3D82AB50-62DA-11cf-AB39-0020AF71E433> - [Animation] -} - -Header { - 1; - 0; - 1; -} - -Material x3ds_mat_01MECHHAND { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHHN.GIF"; - } -} -Material x3ds_mat_02MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHLA.GIF"; - } -} -Material x3ds_mat_01GROIN { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHGR.GIF"; - } -} -Material x3ds_mat_02MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHLL.GIF"; - } -} -Material x3ds_mat_01MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHUL.GIF"; - } -} -Material x3ds_mat_01HEAD { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHHD.GIF"; - } -} -Material x3ds_mat_REDPLASTIC { - 1.000000, 0.368627, 0.368627, 1.000000;; - 30.800001; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; -} -Material x3ds_mat_01BACK { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHBK.GIF"; - } -} -Material x3ds_mat_01MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHUA.GIF"; - } -} -Material x3ds_mat_01CHEST { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "DEMECHCH.GIF"; - } -} - -Frame x3ds_xGroin { - FrameTransformMatrix { - -1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 0.000000, 35.534382, 1.024473, 1.000000;; - } - Mesh xGroin { - - 31; - -2.000033; -0.000005; -10.091250;, - -0.555553; -0.000005; -10.091250;, - 1.666685; -0.000005; -10.091250;, - -1.192545; -7.018511; -6.581248;, - -3.066506; -0.638034; -6.581249;, - -2.555453; 5.104383; -6.581252;, - -0.851815; 7.018551; -6.581251;, - 0.851807; 7.018506; -6.581251;, - 1.192535; -7.018467; -6.581248;, - -2.333362; -11.356153; 3.071271;, - -6.000067; -1.032373; 3.071292;, - -5.000066; 8.258989; 3.071267;, - -1.666681; 11.356154; 3.071267;, - 1.666685; 11.356243; 3.071267;, - 5.000067; 8.259121; 3.071267;, - 6.000000; -1.032373; 3.071269;, - 2.333369; -11.356200; 3.071271;, - -7.000063; -10.455877; 5.703794;, - -17.999998; -1.012086; 5.703773;, - -15.000134; 7.487371; 5.703790;, - -5.000066; 10.320596; 5.703789;, - 15.000134; 7.487412; 5.703790;, - 17.999998; -1.012087; 5.703768;, - 7.000071; -10.455922; 5.703794;, - -5.833399; -8.955485; 10.091297;, - -15.000132; -0.814138; 10.091291;, - -12.499999; 6.513076; 10.091294;, - -4.166667; 8.955388; 10.091293;, - 12.500134; 6.513030; 10.091294;, - 15.000134; -0.814141; 10.091295;, - 5.833402; -8.955529; 10.091297;; - - 53; - 3;1,4,0;, - 3;1,3,4;, - 3;0,5,1;, - 3;0,4,5;, - 3;1,5,6;, - 3;1,7,2;, - 3;1,6,7;, - 3;2,3,1;, - 3;2,8,3;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,12,6;, - 3;5,11,12;, - 3;6,13,7;, - 3;6,12,13;, - 3;7,13,14;, - 3;7,15,2;, - 3;7,14,15;, - 3;2,16,8;, - 3;2,15,16;, - 3;8,9,3;, - 3;8,16,9;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,20,13;, - 3;13,21,14;, - 3;14,22,15;, - 3;14,21,22;, - 3;15,23,16;, - 3;15,22,23;, - 3;16,17,9;, - 3;16,23,17;, - 3;17,25,18;, - 3;17,24,25;, - 3;18,26,19;, - 3;18,25,26;, - 3;19,27,20;, - 3;19,26,27;, - 3;20,27,13;, - 3;13,28,21;, - 3;13,27,28;, - 3;21,29,22;, - 3;21,28,29;, - 3;22,30,23;, - 3;22,29,30;, - 3;23,24,17;, - 3;23,30,24;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01GROIN} - } - MeshNormals { - 64; - -0.000000;-0.983877;-0.178844;, - -0.599572;0.408149;-0.688424;, - -0.560307;-0.381698;-0.735094;, - 0.000000;0.508170;-0.861257;, - -0.000000;-0.447290;-0.894389;, - 0.559687;0.421739;-0.713363;, - -0.000000;-0.447290;-0.894389;, - 0.937160;-0.239286;-0.253915;, - -0.880351;-0.277520;-0.384663;, - 0.000009;-0.721590;-0.692320;, - -0.680092;-0.595592;-0.427487;, - -0.956486;0.091041;-0.277212;, - -0.776351;0.298631;-0.555067;, - -0.612329;0.585593;-0.531164;, - -0.595762;0.530237;-0.603255;, - 0.000019;0.721585;-0.692326;, - 0.573074;0.533170;-0.622347;, - 0.634858;0.683287;-0.360658;, - 0.000013;-0.721591;-0.692319;, - 0.969727;-0.158439;-0.185813;, - -0.603915;-0.361812;-0.710196;, - 0.000004;-0.998923;-0.046402;, - -0.776502;-0.254344;-0.576501;, - -0.537039;0.077572;-0.839983;, - -0.815733;0.081072;-0.572719;, - -0.490500;0.710156;-0.505063;, - -0.643035;0.648313;-0.407671;, - -0.000027;0.999717;-0.023791;, - -0.010253;0.995713;0.091928;, - 0.398539;0.900274;-0.175139;, - 0.488511;0.525776;-0.696359;, - 0.507328;0.077991;-0.858217;, - 0.768552;0.139116;-0.624480;, - 0.584865;-0.268944;-0.765246;, - 0.845605;-0.234038;-0.479769;, - -0.000010;-0.998923;-0.046406;, - -0.654640;-0.753300;0.063125;, - -0.000009;-0.946205;0.323569;, - -0.582828;-0.600451;-0.547512;, - -0.943651;0.328188;0.042606;, - -0.654989;0.198844;-0.729006;, - -0.275500;0.960845;0.029596;, - -0.400693;0.869473;-0.288898;, - -0.014416;0.942381;0.334230;, - 0.328385;0.846238;-0.419578;, - 0.943441;0.328186;0.047052;, - 0.657040;0.204764;-0.725514;, - 0.655845;-0.753077;-0.052365;, - 0.593011;-0.504799;-0.627309;, - -0.000003;-0.946198;0.323589;, - -0.609542;-0.686312;0.396779;, - -0.000003;-0.946203;0.323573;, - -0.598574;-0.685369;0.414704;, - -0.799848;0.272917;0.534565;, - -0.802248;0.278457;0.528072;, - -0.263482;0.899018;0.349777;, - -0.132000;0.918501;0.372736;, - -0.028788;0.952884;0.301966;, - 0.168538;0.913545;0.370176;, - 0.807613;0.275554;0.521374;, - 0.802809;0.278603;0.527141;, - 0.596840;-0.672007;0.438393;, - 0.597512;-0.684374;0.417866;, - -0.000004;-0.946204;0.323572;; - 53; - 3;2,10,0;, - 3;2,8,10;, - 3;1,12,3;, - 3;1,11,12;, - 3;2,13,14;, - 3;3,16,5;, - 3;3,15,16;, - 3;6,9,4;, - 3;6,18,9;, - 3;8,22,10;, - 3;8,20,22;, - 3;11,24,12;, - 3;11,23,24;, - 3;13,26,14;, - 3;13,25,26;, - 3;15,28,16;, - 3;15,27,28;, - 3;17,29,30;, - 3;16,32,5;, - 3;16,31,32;, - 3;7,34,19;, - 3;7,33,34;, - 3;18,21,9;, - 3;18,35,21;, - 3;20,38,22;, - 3;20,36,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,43,28;, - 3;29,44,30;, - 3;31,46,32;, - 3;31,45,46;, - 3;33,48,34;, - 3;33,47,48;, - 3;35,37,21;, - 3;35,49,37;, - 3;36,52,38;, - 3;36,50,52;, - 3;39,54,40;, - 3;39,53,54;, - 3;41,56,42;, - 3;41,55,56;, - 3;43,57,28;, - 3;29,58,44;, - 3;29,56,58;, - 3;45,60,46;, - 3;45,59,60;, - 3;47,62,48;, - 3;47,61,62;, - 3;49,51,37;, - 3;49,63,51;; - } - MeshTextureCoords { - 31; - 0.546412;0.933469;, - 0.511654;0.933469;, - 0.458180;0.933469;, - 0.526982;0.782985;, - 0.572075;0.782985;, - 0.559777;0.782985;, - 0.518783;0.782985;, - 0.477788;0.782985;, - 0.469589;0.782985;, - 0.554433;0.369152;, - 0.642665;0.369151;, - 0.618602;0.369152;, - 0.538391;0.369152;, - 0.458180;0.369152;, - 0.377969;0.369152;, - 0.353907;0.369152;, - 0.442138;0.369152;, - 0.666728;0.256288;, - 0.931421;0.256289;, - 0.859233;0.256288;, - 0.618602;0.256288;, - 0.137338;0.256288;, - 0.065150;0.256289;, - 0.329843;0.256288;, - 0.638654;0.068183;, - 0.859233;0.068183;, - 0.799074;0.068183;, - 0.598548;0.068183;, - 0.197495;0.068183;, - 0.137338;0.068183;, - 0.357917;0.068183;; - } - } - - Frame x3ds_xChest { - FrameTransformMatrix { - -1.000000, 0.000000, 0.000000, 0.000000, - -0.000000, -1.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.426950, -1.024468, 11.366159, 1.000000;; - } - Mesh xChest { - - 40; - -5.406384; -9.499996; -0.774913;, - -14.573050; -1.772723; -0.774910;, - -12.073050; 5.181822; -0.774907;, - -3.739717; 7.500004; -0.774907;, - 4.593616; 7.500004; -0.774907;, - 12.926949; 5.181822; -0.774910;, - 15.426949; -1.772723; -0.774914;, - 6.260283; -9.499996; -0.774913;, - -8.859015; -15.499998; 25.225092;, - -23.451246; -1.491749; 25.225090;, - -19.471548; 11.115673; 25.225096;, - -6.205883; 15.318148; 25.225096;, - 7.059781; 15.318148; 25.225096;, - 20.325445; 11.115673; 25.225096;, - 24.305143; -1.491749; 25.225090;, - 9.712914; -15.499998; 25.225092;, - -10.054240; -15.499997; 34.225082;, - -33.573051; -1.863631; 34.225082;, - -22.032743; 10.409095; 34.225082;, - -7.059614; 14.500003; 34.225082;, - 7.913515; 14.500003; 34.225082;, - 22.886644; 10.409095; 34.225082;, - 34.426949; -1.863631; 34.225082;, - 10.908140; -15.499997; 34.225082;, - -10.850827; -11.500252; 40.225082;, - -39.573051; -2.106037; 47.225090;, - -23.739717; 8.348755; 42.225098;, - -7.628605; 9.167019; 40.225098;, - 8.482507; 9.167019; 40.225098;, - 24.593618; 8.348755; 42.225090;, - 40.426949; -2.106037; 47.225090;, - 11.704728; -11.500252; 40.225082;, - -8.517495; -9.499994; 43.225082;, - -18.573050; -2.227266; 43.225090;, - -14.573050; 4.318189; 43.225098;, - -5.961939; 6.500007; 43.225098;, - 6.815839; 6.500007; 43.225090;, - 15.426950; 4.318189; 43.225090;, - 19.426950; -2.227266; 43.225090;, - 9.371394; -9.499994; 43.225082;; - - 70; - 3;0,9,1;, - 3;1,9,2;, - 3;0,8,9;, - 3;9,10,2;, - 3;2,11,3;, - 3;2,10,11;, - 3;3,12,4;, - 3;3,11,12;, - 3;4,13,5;, - 3;4,12,13;, - 3;5,14,6;, - 3;5,13,14;, - 3;6,15,7;, - 3;6,14,15;, - 3;7,8,0;, - 3;7,15,8;, - 3;8,17,9;, - 3;8,16,17;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,21,13;, - 3;12,20,21;, - 3;13,22,14;, - 3;13,21,22;, - 3;14,23,15;, - 3;14,22,23;, - 3;15,16,8;, - 3;15,23,16;, - 3;16,25,17;, - 3;16,24,25;, - 3;17,26,18;, - 3;17,25,26;, - 3;18,27,19;, - 3;18,26,27;, - 3;19,28,20;, - 3;19,27,28;, - 3;20,29,21;, - 3;20,28,29;, - 3;21,30,22;, - 3;21,29,30;, - 3;22,31,23;, - 3;22,30,31;, - 3;23,24,16;, - 3;23,31,24;, - 3;24,33,25;, - 3;24,32,33;, - 3;25,34,26;, - 3;25,33,34;, - 3;26,35,27;, - 3;26,34,35;, - 3;27,36,28;, - 3;27,35,36;, - 3;28,37,29;, - 3;28,36,37;, - 3;29,38,30;, - 3;29,37,38;, - 3;30,39,31;, - 3;30,38,39;, - 3;31,32,24;, - 3;31,39,32;, - 3;37,39,38;, - 3;36,39,37;, - 3;36,32,39;, - 3;35,32,36;, - 3;35,33,32;, - 3;34,33,35;; - MeshMaterialList { - 2; - 70; - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_01BACK} - {x3ds_mat_01CHEST} - } - MeshNormals { - 88; - -0.650995;-0.723751;-0.228890;, - 0.000000;-0.974391;-0.224860;, - -0.630534;-0.747987;-0.207225;, - -0.894967;0.321720;-0.309080;, - -0.899082;0.303417;-0.315579;, - -0.272342;0.915691;-0.295533;, - -0.255614;0.918875;-0.300549;, - 0.000000;0.957642;-0.287961;, - 0.000000;0.957642;-0.287961;, - 0.272548;0.916640;-0.292383;, - 0.256974;0.923763;-0.283949;, - 0.899082;0.303417;-0.315579;, - 0.894967;0.321720;-0.309080;, - 0.649687;-0.721872;-0.238346;, - 0.623476;-0.739614;-0.253474;, - 0.000000;-0.974391;-0.224860;, - -0.592597;-0.735803;-0.327753;, - 0.000000;-0.993577;-0.113156;, - -0.627516;-0.684776;-0.370547;, - -0.846659;0.369049;-0.383368;, - -0.915063;0.288852;-0.281468;, - -0.288159;0.954384;-0.078204;, - -0.286130;0.941081;-0.180268;, - -0.000000;0.994932;-0.100550;, - 0.000000;0.994932;-0.100550;, - 0.288029;0.953917;-0.084156;, - 0.284948;0.937354;-0.200430;, - 0.805421;0.413325;-0.424806;, - 0.840105;0.278624;-0.465394;, - 0.612424;-0.738201;-0.282836;, - 0.664713;-0.722563;-0.189894;, - 0.000000;-0.993577;-0.113156;, - -0.405419;-0.910419;0.082297;, - 0.000000;-0.957096;0.289770;, - -0.528719;-0.784443;-0.324201;, - -0.656992;0.692463;-0.298087;, - -0.789210;0.537054;-0.297861;, - -0.169555;0.935537;0.309874;, - -0.269038;0.931504;0.244784;, - -0.000000;0.917665;0.397355;, - 0.000000;0.917665;0.397355;, - 0.167433;0.931814;0.322007;, - 0.275612;0.957904;0.080362;, - 0.660560;0.741019;-0.120626;, - 0.729124;0.541464;-0.418562;, - 0.446769;-0.890468;-0.086398;, - 0.573798;-0.817112;-0.055524;, - -0.000000;-0.957096;0.289770;, - -0.136334;-0.572759;0.808307;, - 0.000000;-0.832067;0.554676;, - -0.195803;-0.806978;0.557179;, - -0.175779;0.515191;0.838856;, - -0.544400;0.783128;0.300564;, - -0.005950;0.707002;0.707186;, - -0.061460;0.847479;0.527259;, - -0.000000;0.747432;0.664339;, - 0.000000;0.747432;0.664339;, - 0.013296;0.633065;0.773985;, - 0.045031;0.769592;0.636946;, - 0.179371;0.455292;0.872087;, - 0.488614;0.794147;0.361368;, - 0.133669;-0.718562;0.682496;, - 0.323520;-0.890918;0.318748;, - 0.000000;-0.832067;0.554676;, - -0.415209;-0.574084;0.705712;, - 0.000000;-0.832017;0.554750;, - 0.000000;-0.000000;1.000000;, - -0.125496;-0.398449;0.908565;, - 0.185278;-0.113227;0.976141;, - 0.000000;-0.000001;1.000000;, - 0.124763;0.127164;0.984004;, - -0.039366;0.155367;0.987072;, - 0.000000;-0.000001;1.000000;, - 0.001540;0.487185;0.873297;, - 0.000000;0.747367;0.664412;, - 0.000001;-0.000001;1.000000;, - 0.000000;0.747366;0.664413;, - 0.173828;0.686055;0.706479;, - -0.000000;-0.000000;1.000000;, - 0.042888;0.569361;0.820968;, - 0.085553;0.052282;0.994961;, - -0.000001;-0.000000;1.000000;, - -0.050303;0.118343;0.991698;, - -0.182465;0.252282;0.950295;, - -0.000001;-0.000000;1.000000;, - -0.044699;-0.323568;0.945148;, - 0.000000;-0.832017;0.554750;, - -0.000001;-0.000000;1.000000;; - 70; - 3;0,18,2;, - 3;3,19,4;, - 3;0,16,18;, - 3;19,20,4;, - 3;5,22,6;, - 3;5,21,22;, - 3;7,24,8;, - 3;7,23,24;, - 3;9,26,10;, - 3;9,25,26;, - 3;11,28,12;, - 3;11,27,28;, - 3;13,30,14;, - 3;13,29,30;, - 3;15,17,1;, - 3;15,31,17;, - 3;16,34,18;, - 3;16,32,34;, - 3;19,36,20;, - 3;19,35,36;, - 3;21,38,22;, - 3;21,37,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,44,28;, - 3;27,43,44;, - 3;29,46,30;, - 3;29,45,46;, - 3;31,33,17;, - 3;31,47,33;, - 3;32,50,34;, - 3;32,48,50;, - 3;35,52,36;, - 3;35,51,52;, - 3;37,54,38;, - 3;37,53,54;, - 3;39,56,40;, - 3;39,55,56;, - 3;41,58,42;, - 3;41,57,58;, - 3;43,60,44;, - 3;43,59,60;, - 3;45,62,46;, - 3;45,61,62;, - 3;47,49,33;, - 3;47,63,49;, - 3;48,67,50;, - 3;48,64,67;, - 3;51,70,52;, - 3;51,68,70;, - 3;53,73,54;, - 3;53,71,73;, - 3;55,76,56;, - 3;55,74,76;, - 3;57,79,58;, - 3;57,77,79;, - 3;59,82,60;, - 3;59,80,82;, - 3;61,85,62;, - 3;61,83,85;, - 3;63,65,49;, - 3;63,86,65;, - 3;81,87,84;, - 3;78,87,81;, - 3;78,66,87;, - 3;75,66,78;, - 3;75,69,66;, - 3;72,69,75;; - } - MeshTextureCoords { - 40; - 0.427128;1.000148;, - 0.312615;1.000148;, - 0.343846;1.000148;, - 0.447949;1.000148;, - 0.552051;1.000148;, - 0.656154;1.000148;, - 0.687385;1.000148;, - 0.572872;1.000148;, - 0.383997;0.458321;, - 0.201706;0.458321;, - 0.251421;0.458321;, - 0.417140;0.458321;, - 0.582860;0.458321;, - 0.748579;0.458321;, - 0.798294;0.458321;, - 0.616003;0.458321;, - 0.369065;0.270766;, - 0.075261;0.270766;, - 0.219426;0.270766;, - 0.406475;0.270766;, - 0.593525;0.270766;, - 0.780574;0.270766;, - 0.924739;0.270766;, - 0.630935;0.270766;, - 0.359114;0.145729;, - 0.000307;-0.000148;, - 0.198102;0.104050;, - 0.399367;0.145729;, - 0.600633;0.145729;, - 0.801898;0.104050;, - 0.999693;-0.000148;, - 0.640886;0.145729;, - 0.388263;0.083210;, - 0.262646;0.083210;, - 0.312615;0.083210;, - 0.420188;0.083210;, - 0.579812;0.083210;, - 0.687385;0.083210;, - 0.737354;0.083210;, - 0.611737;0.083210;; - } - } - - Frame x3ds_xRU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - -22.158115, 0.000006, 34.682274, 1.000000;; - } - Mesh xRU_Arm { - - 12; - -5.501477; 0.000004; -2.449525;, - -2.458304; 6.273185; -0.692550;, - 3.628045; 6.273181; 2.821392;, - 6.671256; -0.000001; 4.578400;, - 3.628039; -6.273170; 2.821389;, - -2.458306; -6.273180; -0.692544;, - 8.608694; 0.000001; -22.981846;, - 10.805939; 4.394533; -21.713266;, - 15.200456; 4.394531; -19.176115;, - 17.397690; -0.000002; -17.907520;, - 15.200446; -4.394547; -19.176085;, - 10.805936; -4.394485; -21.713276;; - - 20; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - -0.716210;0.493166;-0.493793;, - -0.719557;-0.487560;-0.494492;, - -0.499999;-0.000001;0.866026;, - -0.718101;0.487469;-0.496693;, - 0.037713;0.997151;-0.065320;, - -0.499999;-0.000001;0.866026;, - 0.037713;0.997151;-0.065320;, - 0.785986;0.493148;0.372868;, - -0.499999;-0.000001;0.866026;, - 0.788019;0.487565;0.375908;, - 0.785740;-0.493168;0.373360;, - -0.500000;0.000001;0.866026;, - 0.789195;-0.487476;0.373548;, - 0.037714;-0.997151;-0.065321;, - -0.500000;-0.000001;0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.715906;-0.493147;-0.494252;, - -0.499998;0.000002;0.866027;, - -0.714286;0.498840;-0.490870;, - -0.715906;-0.493147;-0.494252;, - 0.499999;0.000001;-0.866026;, - -0.716210;0.493166;-0.493793;, - 0.037713;0.997151;-0.065320;, - 0.499996;-0.000007;-0.866027;, - 0.037713;0.997151;-0.065320;, - 0.783919;0.498709;0.369811;, - 0.499996;-0.000007;-0.866027;, - 0.785986;0.493148;0.372868;, - 0.782250;-0.498838;0.373156;, - 0.499996;-0.000007;-0.866027;, - 0.785740;-0.493168;0.373360;, - 0.037701;-0.997152;-0.065325;, - 0.499999;-0.000002;-0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.712222;-0.498712;-0.493989;, - 0.500003;0.000001;-0.866024;; - 20; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_xRL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - 13.822151, 0.000003, -20.565968, 1.000000;; - } - Mesh xRL_Arm { - - 24; - 8.013477; 0.000005; -35.874058;, - 12.494552; 9.237302; -33.286903;, - 21.456678; 9.237297; -28.112616;, - 25.937769; -0.000003; -25.525463;, - 21.456680; -9.237155; -28.112616;, - 12.494545; -9.237296; -33.286919;, - -4.837206; 0.000002; -3.067563;, - -2.639963; 4.394546; -1.798980;, - 1.754547; 4.394532; 0.738177;, - 3.951795; -0.000002; 2.006753;, - 1.754554; -4.394534; 0.738174;, - -2.639967; -4.394532; -1.798978;, - 5.120436; -0.663049; -1.830179;, - 10.395203; -0.663048; -7.844885;, - 9.816457; -0.663051; 4.948281;, - 5.120435; 0.336947; -1.830175;, - 10.395203; 0.336951; -7.844885;, - 9.816456; 0.336949; 4.948285;, - 15.652800; -0.663047; -15.309710;, - 20.927570; -0.663046; -21.324427;, - 20.348825; -0.663049; -8.531265;, - 15.652801; 0.336953; -15.309710;, - 20.927568; 0.336950; -21.324423;, - 20.348825; 0.336947; -8.531264;; - - 32; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;, - 3;12,13,14;, - 3;13,17,14;, - 3;13,16,17;, - 3;14,15,12;, - 3;14,17,15;, - 3;16,15,17;, - 3;18,19,20;, - 3;19,23,20;, - 3;19,22,23;, - 3;20,21,18;, - 3;20,23,21;, - 3;22,21,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 64; - -0.811971;0.490075;-0.317063;, - -0.814533;-0.484496;-0.319062;, - 0.500000;0.000000;-0.866025;, - -0.815268;0.484377;-0.317359;, - -0.068845;0.990475;0.119243;, - 0.500000;0.000000;-0.866025;, - -0.068845;0.990475;0.119243;, - 0.679969;0.490008;0.545467;, - 0.500000;0.000000;-0.866025;, - 0.683580;0.484497;0.545876;, - 0.680568;-0.490079;0.544656;, - 0.500000;0.000001;-0.866025;, - 0.682472;-0.484384;0.547362;, - -0.068833;-0.990476;0.119249;, - 0.500000;-0.000000;-0.866025;, - -0.068833;-0.990476;0.119249;, - -0.812373;-0.490007;-0.316139;, - 0.500001;0.000001;-0.866025;, - -0.808639;0.495752;-0.316753;, - -0.812373;-0.490007;-0.316139;, - -0.500002;0.000000;0.866024;, - -0.811971;0.490075;-0.317063;, - -0.068842;0.990475;0.119244;, - -0.499998;0.000000;0.866027;, - -0.068845;0.990475;0.119243;, - 0.676328;0.495497;0.545035;, - -0.499998;0.000000;0.866027;, - 0.679969;0.490008;0.545467;, - 0.678635;-0.495752;0.541927;, - -0.499998;0.000000;0.866027;, - 0.680568;-0.490079;0.544656;, - -0.068843;-0.990476;0.119239;, - -0.499999;-0.000001;0.866026;, - -0.068833;-0.990476;0.119249;, - -0.810178;-0.495497;-0.313201;, - -0.499996;0.000000;0.866028;, - -0.000000;-1.000000;-0.000000;, - -0.822008;-0.000003;0.569476;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045193;, - -0.000001;1.000000;0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - -0.000000;-1.000000;-0.000000;, - -0.822007;0.000001;0.569477;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;0.000001;0.569477;, - -0.822007;0.000001;0.569477;, - 0.000001;1.000000;0.000000;, - 0.998978;0.000002;0.045192;, - 0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;-0.000001;0.569477;, - 0.000001;1.000000;0.000000;; - 32; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;, - 3;36,38,40;, - 3;39,47,41;, - 3;39,45,47;, - 3;42,43,37;, - 3;42,48,43;, - 3;46,44,49;, - 3;50,52,54;, - 3;53,61,55;, - 3;53,59,61;, - 3;56,57,51;, - 3;56,62,57;, - 3;60,58,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xR_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 17.201626, -0.532497, -26.974564, 1.000000;; - } - Mesh xR_Hand { - - 8; - -6.156250; -13.356396; -4.582500;, - 6.843750; -13.356392; -4.582499;, - 3.756248; -0.356396; -2.650548;, - -3.068748; -0.356396; -2.650548;, - -6.156250; -13.356396; 4.582500;, - 6.843750; -13.356392; 4.582499;, - 3.756248; -0.356396; 2.650487;, - -3.068748; -0.356396; 2.650487;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032627;0.773816;, - 0.032627;0.773815;, - 0.231505;-0.195808;, - 0.231505;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777202;-0.195808;, - 0.777202;-0.195808;; - } - } - } - } - } - - Frame x3ds_xLU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - 22.800379, 0.000008, 34.682274, 1.000000;; - } - Mesh xLU_Arm { - - 12; - 5.988962; 0.000003; 0.629320;, - 2.475010; 6.273185; 0.629320;, - -4.552896; 6.273124; 0.629312;, - -8.066902; 0.000002; 0.629321;, - -4.552895; -6.273167; 0.629311;, - 2.475007; -6.273119; 0.629326;, - 4.035431; 0.000003; -24.207542;, - 1.498257; 4.394476; -24.207481;, - -3.576344; 4.394535; -24.207447;, - -6.113496; 0.000003; -24.207460;, - -3.576342; -4.394542; -24.207460;, - 1.498262; -4.394542; -24.207493;; - - 20; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - 0.867150;0.493170;-0.069530;, - 0.870399;-0.487563;-0.068461;, - -0.000001;-0.000001;1.000000;, - 0.870241;0.487469;-0.071097;, - -0.000009;0.997152;-0.075422;, - -0.000001;-0.000001;1.000000;, - -0.000009;0.997152;-0.075422;, - -0.867118;0.493150;-0.070072;, - -0.000001;-0.000001;1.000000;, - -0.870397;0.487569;-0.068456;, - -0.867151;-0.493168;-0.069524;, - 0.000000;0.000001;1.000000;, - -0.870238;-0.487476;-0.071089;, - 0.000007;-0.997152;-0.075422;, - 0.000000;-0.000001;1.000000;, - 0.000007;-0.997152;-0.075422;, - 0.867118;-0.493148;-0.070077;, - -0.000002;0.000002;1.000000;, - 0.864021;0.498848;-0.067959;, - 0.867118;-0.493148;-0.070077;, - -0.000022;0.000001;-1.000000;, - 0.867150;0.493170;-0.069530;, - 0.000011;0.997151;-0.075427;, - -0.000007;0.000007;-1.000000;, - -0.000009;0.997152;-0.075422;, - -0.863800;0.498709;-0.071685;, - -0.000007;0.000007;-1.000000;, - -0.867118;0.493150;-0.070072;, - -0.864027;-0.498838;-0.067955;, - -0.000007;0.000007;-1.000000;, - -0.867151;-0.493168;-0.069524;, - -0.000001;-0.997152;-0.075423;, - -0.000002;-0.000001;-1.000000;, - 0.000007;-0.997152;-0.075422;, - 0.863799;-0.498711;-0.071691;, - -0.000006;0.000001;-1.000000;; - 20; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_xLL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.446584, 0.000005, -24.389263, 1.000000;; - } - Mesh xLL_Arm { - - 24; - 9.756407; 0.000006; -35.407063;, - 4.582108; 9.237305; -35.407040;, - -5.766471; 9.237184; -35.407040;, - -10.940788; 0.000005; -35.407043;, - -5.766469; -9.237268; -35.407063;, - 4.582115; -9.237293; -35.407051;, - 4.482169; 0.000002; -0.570457;, - 1.945006; 4.394486; -0.570453;, - -3.129325; 4.394474; -0.570462;, - -5.666486; 0.000001; -0.570473;, - -3.129334; -4.394471; -0.570465;, - 1.945009; -4.394471; -0.570457;, - -4.525237; -0.663046; -4.414725;, - -6.085963; -0.663051; -12.261003;, - -11.981339; -0.663046; -0.892426;, - -4.525237; 0.336950; -4.414725;, - -6.085961; 0.336952; -12.261005;, - -11.981338; 0.336954; -0.892433;, - -6.906761; -0.663049; -21.354527;, - -8.467486; -0.663040; -29.200804;, - -14.362860; -0.663049; -17.832241;, - -6.906761; 0.336958; -21.354527;, - -8.467486; 0.336956; -29.200804;, - -14.362861; 0.336954; -17.832237;; - - 32; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;, - 3;13,12,14;, - 3;17,13,14;, - 3;16,13,17;, - 3;15,14,12;, - 3;17,14,15;, - 3;15,16,17;, - 3;19,18,20;, - 3;23,19,20;, - 3;22,19,23;, - 3;21,20,18;, - 3;23,20,21;, - 3;21,22,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 64; - 0.861718;0.490078;0.131402;, - 0.864937;-0.484496;0.130951;, - -0.000000;0.000002;-1.000000;, - 0.864723;0.484376;0.132795;, - -0.000012;0.990475;0.137689;, - -0.000000;0.000002;-1.000000;, - -0.000012;0.990475;0.137689;, - -0.861601;0.490013;0.132404;, - -0.000000;0.000002;-1.000000;, - -0.864933;0.484503;0.130952;, - -0.861717;-0.490079;0.131403;, - -0.000001;0.000001;-1.000000;, - -0.864721;-0.484379;0.132795;, - -0.000003;-0.990475;0.137691;, - -0.000001;0.000002;-1.000000;, - -0.000003;-0.990475;0.137691;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000002;-1.000000;, - 0.858676;0.495758;0.130003;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000000;1.000000;, - 0.861718;0.490078;0.131402;, - -0.000003;0.990475;0.137691;, - -0.000002;-0.000002;1.000000;, - -0.000012;0.990475;0.137689;, - -0.858232;0.495502;0.133849;, - -0.000002;-0.000002;1.000000;, - -0.861601;0.490013;0.132404;, - -0.858676;-0.495757;0.130005;, - -0.000002;-0.000002;1.000000;, - -0.861717;-0.490079;0.131403;, - -0.000000;-0.990475;0.137691;, - -0.000003;0.000000;1.000000;, - -0.000003;-0.990475;0.137691;, - 0.858232;-0.495502;0.133850;, - -0.000002;-0.000000;1.000000;, - 0.000000;-1.000000;0.000001;, - 0.427141;0.000000;0.904185;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000000;0.904185;, - 0.427141;0.000000;0.904185;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000000;-0.460352;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000006;0.904185;, - 0.000001;1.000000;0.000000;, - -0.000001;-1.000000;-0.000001;, - 0.427140;-0.000000;0.904185;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000000;0.904185;, - 0.427140;-0.000000;0.904185;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000000;-0.460352;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000003;0.904185;, - -0.000001;1.000000;-0.000000;; - 32; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;, - 3;38,36,40;, - 3;47,39,41;, - 3;45,39,47;, - 3;43,42,37;, - 3;48,42,43;, - 3;44,46,49;, - 3;52,50,54;, - 3;61,53,55;, - 3;59,53,61;, - 3;57,56,51;, - 3;62,56,57;, - 3;58,60,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xL_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -1.719950, -0.532492, -32.044582, 1.000000;; - } - Mesh xL_Hand { - - 8; - -6.357616; -13.356400; -4.582500;, - 6.642384; -13.356396; -4.582499;, - 3.554882; -0.356400; -2.650548;, - -3.270115; -0.356400; -2.650548;, - -6.357616; -13.356400; 4.582500;, - 6.642384; -13.356396; 4.582499;, - 3.554882; -0.356399; 2.650487;, - -3.270115; -0.356399; 2.650487;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032628;0.773816;, - 0.032628;0.773815;, - 0.231506;-0.195808;, - 0.231506;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777203;-0.195808;, - 0.777203;-0.195808;; - } - } - } - } - } - - Frame x3ds_xHead { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - 0.000000, 0.000000, -1.000000, 0.000000, - 0.000000, 0.320932, 43.031708, 1.000000;; - } - Mesh xHead { - - 14; - 0.425325; 1.962787; -19.572998;, - 8.670237; -5.947898; -18.382002;, - 11.100914; 4.408364; -18.855011;, - 1.451953; 10.441894; -18.855013;, - -9.223644; 5.996317; -18.855013;, - -8.846230; -4.605626; -18.382004;, - -0.560038; -8.044583; -15.549453;, - 8.843442; -3.382582; -2.678222;, - 11.100921; 4.408369; -3.122056;, - 1.451952; 10.441850; -3.122057;, - -9.223644; 5.996321; -3.121079;, - -8.571328; -2.049199; -2.677742;, - -0.522815; -9.619122; -0.089201;, - 0.425325; -0.037214; 3.679871;; - - 24; - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;0,6,5;, - 3;0,1,6;, - 3;1,8,7;, - 3;1,2,8;, - 3;2,9,8;, - 3;2,3,9;, - 3;3,10,9;, - 3;3,4,10;, - 3;4,11,10;, - 3;4,5,11;, - 3;5,12,11;, - 3;5,6,12;, - 3;6,7,12;, - 3;6,1,7;, - 3;13,11,12;, - 3;13,10,11;, - 3;13,9,10;, - 3;13,8,9;, - 3;13,7,8;, - 3;13,12,7;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01HEAD} - } - MeshNormals { - 60; - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - 0.081687;-0.064598;-0.994562;, - -0.201835;-0.348186;-0.915439;, - 0.967436;-0.252527;0.017281;, - 0.263240;-0.952568;0.152705;, - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - 0.973545;-0.228497;-0.000000;, - 0.530181;0.847885;-0.000000;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - 0.530184;0.847883;0.000002;, - -0.384421;0.923158;0.000003;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - -0.384425;0.923156;-0.000000;, - -0.998267;-0.057694;0.011560;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.999136;-0.034537;0.023112;, - -0.542700;-0.839759;0.016782;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - -0.354072;-0.930491;-0.093913;, - 0.406709;-0.912942;0.033536;, - 0.960443;-0.276327;0.034547;, - 0.406709;-0.912942;0.033536;, - 0.568127;-0.118223;0.814405;, - 0.465161;-0.363520;0.807142;, - 0.967436;-0.252527;0.017281;, - 0.530181;0.847885;-0.000000;, - 0.310171;0.496038;0.811012;, - 0.568127;-0.118223;0.814405;, - 0.530181;0.847885;-0.000000;, - -0.384421;0.923158;0.000003;, - -0.227200;0.545780;0.806538;, - 0.310171;0.496038;0.811012;, - -0.384421;0.923158;0.000003;, - -0.996729;-0.080813;0.000000;, - -0.576846;-0.001758;0.816851;, - -0.227200;0.545780;0.806538;, - -0.998267;-0.057694;0.011560;, - -0.700901;-0.701945;0.126536;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.542700;-0.839759;0.016782;, - 0.535392;-0.840126;-0.086851;, - -0.514933;-0.269185;0.813870;, - 0.465161;-0.363520;0.807142;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.227200;0.545780;0.806538;, - 0.310171;0.496038;0.811012;, - 0.568127;-0.118223;0.814405;, - 0.465161;-0.363520;0.807142;; - 24; - 3;0,10,6;, - 3;1,14,11;, - 3;2,18,15;, - 3;3,22,19;, - 3;4,26,23;, - 3;5,7,27;, - 3;8,34,30;, - 3;8,12,34;, - 3;13,38,35;, - 3;13,16,38;, - 3;17,42,39;, - 3;17,20,42;, - 3;21,46,43;, - 3;21,24,46;, - 3;25,50,47;, - 3;25,28,50;, - 3;29,31,51;, - 3;29,9,31;, - 3;54,48,52;, - 3;55,44,49;, - 3;56,40,45;, - 3;57,36,41;, - 3;58,32,37;, - 3;59,53,33;; - } - MeshTextureCoords { - 14; - 0.023465;0.004861;, - 0.658502;0.065512;, - 0.821431;0.041424;, - 0.999136;0.041424;, - 0.180988;0.041424;, - 0.342098;0.065512;, - 0.493676;0.209760;, - 0.695904;0.865226;, - 0.821431;0.842624;, - 0.999136;0.842624;, - 0.180988;0.842657;, - 0.305883;0.865234;, - 0.497409;0.997055;, - 0.480761;1.188995;; - } - } - - Frame x3ds_xSpike01 { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - 23.054602, 0.275466, -15.502022, 1.000000;; - } - Mesh xSpike01 { - - 11; - 20.302296; 3.477874; -0.000000;, - 20.272556; 3.517951; -0.047165;, - 20.272556; 3.517951; 0.047166;, - 12.276608; -2.642800; 0.000000;, - 11.329418; -1.366189; -1.502582;, - 11.329418; -1.366188; 1.502582;, - -22.691582; -3.647179; -0.000001;, - -22.691582; -0.615793; -2.957998;, - -22.691582; -0.615791; 2.957999;, - 20.282467; 3.504585; 0.000000;, - -22.691582; -1.626259; 0.000000;; - - 18; - 3;0,9,1;, - 3;1,9,2;, - 3;2,9,0;, - 3;0,4,3;, - 3;0,1,4;, - 3;1,5,4;, - 3;1,2,5;, - 3;2,3,5;, - 3;2,0,3;, - 3;3,7,6;, - 3;3,4,7;, - 3;4,8,7;, - 3;4,5,8;, - 3;5,6,8;, - 3;5,3,6;, - 3;6,7,10;, - 3;7,8,10;, - 3;8,6,10;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 26; - -0.802935;-0.596066;-0.000210;, - -0.416581;0.546239;0.726693;, - -0.416545;0.546192;-0.726749;, - -0.802935;-0.596066;-0.000210;, - -0.416558;0.546177;0.726753;, - 0.479311;-0.877645;0.000000;, - -0.803289;-0.595589;0.000000;, - 0.479311;-0.877645;0.000000;, - -0.416582;0.546239;-0.726693;, - -0.152721;0.683170;0.714112;, - -0.224967;0.667993;-0.709348;, - -0.219854;0.670684;0.708411;, - 0.236642;-0.971597;0.000000;, - 0.236642;-0.971597;0.000000;, - -0.154600;0.681720;-0.715092;, - -0.020056;0.698250;0.715573;, - -0.018467;0.727343;-0.686026;, - 1.000000;0.000000;0.000000;, - -0.015613;0.729119;0.684209;, - -0.022052;-0.999757;0.000000;, - 1.000000;0.000000;0.000000;, - -0.022052;-0.999757;0.000000;, - -0.015212;0.698309;-0.715635;, - 1.000000;0.000000;0.000000;, - -0.802935;-0.596066;-0.000210;, - 1.000000;0.000000;0.000000;; - 18; - 3;0,24,3;, - 3;3,24,6;, - 3;6,24,0;, - 3;1,11,9;, - 3;1,4,11;, - 3;5,13,12;, - 3;5,7,13;, - 3;8,10,14;, - 3;8,2,10;, - 3;9,18,15;, - 3;9,11,18;, - 3;12,21,19;, - 3;12,13,21;, - 3;14,16,22;, - 3;14,10,16;, - 3;17,20,25;, - 3;20,23,25;, - 3;23,17,25;; - } - } - } - - Frame x3ds_Spike02 { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - -22.163496, 4.231537, -15.502023, 1.000000;; - } - Mesh Spike02 { - - 11; - -20.302298; 3.477874; -0.000000;, - -20.272558; 3.517951; -0.047165;, - -20.272558; 3.517951; 0.047166;, - -12.276606; -2.642800; 0.000000;, - -11.329420; -1.366189; -1.502582;, - -11.329420; -1.366188; 1.502582;, - 22.691582; -3.647179; -0.000001;, - 22.691582; -0.615793; -2.957998;, - 22.691582; -0.615791; 2.957999;, - -20.282469; 3.504585; 0.000000;, - 22.691582; -1.626259; 0.000000;; - - 18; - 3;9,0,1;, - 3;9,1,2;, - 3;9,2,0;, - 3;4,0,3;, - 3;1,0,4;, - 3;5,1,4;, - 3;2,1,5;, - 3;3,2,5;, - 3;0,2,3;, - 3;7,3,6;, - 3;4,3,7;, - 3;8,4,7;, - 3;5,4,8;, - 3;6,5,8;, - 3;3,5,6;, - 3;7,6,10;, - 3;8,7,10;, - 3;6,8,10;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 26; - 0.802935;-0.596066;-0.000210;, - 0.416581;0.546239;0.726693;, - 0.416545;0.546192;-0.726749;, - 0.802935;-0.596066;-0.000210;, - 0.416558;0.546177;0.726753;, - -0.479311;-0.877645;0.000000;, - 0.803289;-0.595589;-0.000000;, - -0.479311;-0.877645;0.000000;, - 0.416582;0.546239;-0.726693;, - 0.152721;0.683170;0.714111;, - 0.224967;0.667994;-0.709348;, - 0.219854;0.670684;0.708411;, - -0.236642;-0.971597;0.000000;, - -0.236642;-0.971597;0.000000;, - 0.154600;0.681720;-0.715092;, - 0.020056;0.698250;0.715573;, - 0.018467;0.727343;-0.686026;, - -1.000000;0.000000;0.000000;, - 0.015613;0.729119;0.684209;, - 0.022052;-0.999757;0.000000;, - -1.000000;0.000000;0.000000;, - 0.022052;-0.999757;0.000000;, - 0.015212;0.698309;-0.715635;, - -1.000000;0.000000;0.000000;, - 0.802935;-0.596066;-0.000210;, - -1.000000;0.000000;0.000000;; - 18; - 3;24,0,3;, - 3;24,3,6;, - 3;24,6,0;, - 3;11,1,9;, - 3;4,1,11;, - 3;13,5,12;, - 3;7,5,13;, - 3;10,8,14;, - 3;2,8,10;, - 3;18,9,15;, - 3;11,9,18;, - 3;21,12,19;, - 3;13,12,21;, - 3;16,14,22;, - 3;10,14,16;, - 3;20,17,25;, - 3;23,20,25;, - 3;17,23,25;; - } - } - } - } - } - - Frame x3ds_xRU_Leg { - FrameTransformMatrix { - -0.996195, 0.000000, -0.087156, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 0.087156, -0.000000, -0.996195, 0.000000, - 6.849589, 0.163909, 2.374461, 1.000000;; - } - Mesh xRU_Leg { - - 8; - -11.013890; -7.083223; -1.154131;, - 3.719292; -7.083223; -1.154224;, - 3.719293; 7.083232; -1.154223;, - -11.013890; 7.083232; -1.154134;, - -10.314070; -5.595806; 40.157955;, - 3.019466; -5.595746; 40.157955;, - 3.019406; 5.595754; 40.157948;, - -10.314070; 5.595694; 40.157944;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - -0.000006;0.000000;-1.000000;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;0.000005;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.999857;-0.000000;0.016939;, - -0.000005;0.999352;0.035982;, - -0.000006;-0.000000;-1.000000;, - 0.000000;0.999352;0.035984;, - -0.999857;0.000000;0.016937;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;, - 0.000005;-0.999352;0.035981;, - 0.999857;0.000005;0.016937;, - -0.000000;0.000001;1.000000;, - 0.999857;0.000005;0.016937;, - -0.000005;0.999352;0.035982;, - -0.000000;0.000001;1.000000;, - -0.000005;0.999352;0.035982;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_xRL_Leg { - FrameTransformMatrix { - 0.996195, -0.000000, -0.087156, 0.000000, - -0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - -3.359494, 0.259708, 38.976967, 1.000000;; - } - Mesh xRL_Leg { - - 26; - 9.229027; -71.518196; -17.699999;, - -10.562513; -71.518204; -17.699999;, - -8.726734; 0.601814; -5.908439;, - 7.393265; 0.601810; -5.908437;, - 11.931103; -75.798187; 11.700004;, - -13.264593; -75.798187; 11.699999;, - -8.726734; 0.601814; 5.908560;, - 7.393263; 0.601810; 5.908562;, - -9.401619; -8.003811; 0.055164;, - -9.401621; -19.983799; 0.055164;, - -21.381618; -5.008812; 0.055162;, - -9.401619; -8.003811; 1.552658;, - -9.401621; -19.983799; 1.552658;, - -21.381618; -5.008812; 1.552657;, - -9.406624; -28.501522; 0.062683;, - -9.406624; -40.501522; 0.062684;, - -21.406624; -25.501520; 0.062688;, - -9.406624; -28.501522; 1.562678;, - -9.406624; -40.501522; 1.562678;, - -21.406624; -25.501520; 1.562676;, - -9.411629; -50.486736; 0.070203;, - -9.411633; -62.506737; 0.070203;, - -21.431629; -47.481735; 0.070202;, - -9.411629; -50.486736; 1.572698;, - -9.411633; -62.506737; 1.572698;, - -21.431629; -47.481735; 1.572697;; - - 30; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;6,1,5;, - 3;2,1,6;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;, - 3;8,9,10;, - 3;9,13,10;, - 3;9,12,13;, - 3;10,11,8;, - 3;10,13,11;, - 3;12,11,13;, - 3;14,15,16;, - 3;15,19,16;, - 3;15,18,19;, - 3;16,17,14;, - 3;16,19,17;, - 3;18,17,19;, - 3;20,21,22;, - 3;21,25,22;, - 3;21,24,25;, - 3;22,23,20;, - 3;22,25,23;, - 3;24,23,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 66; - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - 0.995537;0.039363;-0.085767;, - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - -0.998354;0.039138;-0.041929;, - -0.000000;0.161357;-0.986896;, - -0.999676;0.025446;0.000000;, - 0.000000;1.000000;0.000000;, - 0.000000;0.161357;-0.986896;, - 0.000000;1.000000;0.000000;, - 0.997858;0.049375;-0.042925;, - 0.000000;-0.989569;-0.144059;, - 0.997858;0.049375;-0.042925;, - -0.000000;0.075587;0.997139;, - 0.000000;-0.989569;-0.144059;, - -0.995087;0.052754;-0.083776;, - -0.000000;0.075587;0.997139;, - -0.998354;0.039138;-0.041929;, - 0.000000;1.000000;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;1.000000;0.000000;, - 0.998241;0.059291;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970143;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;-0.000000;, - 0.242536;0.970143;-0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - -0.000000;-0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;; - 30; - 3;6,0,3;, - 3;9,0,6;, - 3;15,1,12;, - 3;4,1,15;, - 3;18,5,16;, - 3;7,5,18;, - 3;21,8,19;, - 3;10,8,21;, - 3;13,11,22;, - 3;2,11,13;, - 3;20,14,23;, - 3;17,14,20;, - 3;24,26,28;, - 3;27,35,29;, - 3;27,33,35;, - 3;30,31,25;, - 3;30,36,31;, - 3;34,32,37;, - 3;38,40,42;, - 3;41,49,43;, - 3;41,47,49;, - 3;44,45,39;, - 3;44,50,45;, - 3;48,46,51;, - 3;52,54,56;, - 3;55,63,57;, - 3;55,61,63;, - 3;58,59,53;, - 3;58,64,59;, - 3;62,60,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xR_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - -0.849463, -62.299637, -2.502151, 1.000000;; - } - Mesh xR_Foot { - - 8; - -37.191723; -17.003931; 4.286171;, - 7.580331; -17.003948; 6.445354;, - 5.179023; -0.329530; 4.340307;, - -27.147438; -7.877935; 1.341817;, - -37.191738; -17.003931; -4.286145;, - 7.580253; -17.003933; -6.445303;, - 5.179095; -0.329522; -4.340269;, - -27.147472; -7.877943; -1.341796;; - - 10; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 20; - -0.123025;0.309552;0.942890;, - -0.000000;-1.000000;0.000000;, - -0.672464;0.740130;0.000001;, - -0.047832;0.118323;0.991822;, - -0.000000;-1.000000;-0.000001;, - -0.123025;0.309552;0.942890;, - -0.227388;0.973804;-0.000001;, - -0.192728;0.486970;0.851890;, - -0.227389;0.973804;0.000000;, - -0.672466;0.740128;0.000006;, - -0.000000;-1.000000;0.000000;, - -0.672466;0.740128;0.000006;, - -0.123024;0.309551;-0.942891;, - -0.000000;-1.000000;0.000000;, - -0.047831;0.118323;-0.991822;, - -0.227388;0.973804;-0.000001;, - -0.123024;0.309551;-0.942891;, - -0.227388;0.973804;-0.000001;, - -0.672466;0.740128;0.000006;, - -0.192727;0.486968;-0.851891;; - 10; - 3;5,0,3;, - 3;7,0,5;, - 3;13,1,10;, - 3;4,1,13;, - 3;17,6,15;, - 3;8,6,17;, - 3;11,9,18;, - 3;2,9,11;, - 3;16,12,19;, - 3;14,12,16;; - } - } - } - } - } - - Frame x3ds_xLU_Leg { - FrameTransformMatrix { - -0.996195, 0.000000, 0.087156, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - -0.087156, -0.000000, -0.996195, 0.000000, - -5.995696, 0.163911, 2.695590, 1.000000;; - } - Mesh xLU_Leg { - - 8; - -2.905127; -7.083223; -0.791073;, - 11.828092; -7.083163; -0.790935;, - 11.828092; 7.083232; -0.790933;, - -2.905124; 7.083232; -0.791067;, - -2.205291; -5.595747; 40.521160;, - 11.128267; -5.595746; 40.521164;, - 11.128268; 5.595754; 40.521152;, - -2.205273; 5.595753; 40.521152;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - 0.000009;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.000004;-0.999352;0.035981;, - 0.999857;-0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.999857;-0.000000;0.016937;, - -0.000000;0.999352;0.035983;, - 0.000009;0.000000;-1.000000;, - -0.000000;0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.000001;1.000000;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.999352;0.035983;, - -0.000000;0.000001;1.000000;, - -0.000000;0.999352;0.035983;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_xLL_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, 0.087156, 0.000000, - 0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 3.943336, 0.259716, 39.672768, 1.000000;; - } - Mesh xLL_Leg { - - 26; - -9.017391; -71.197044; -17.699999;, - 10.774149; -71.197052; -17.699999;, - 8.938375; 0.922958; -5.908498;, - -7.181622; 0.922955; -5.908498;, - -11.719472; -75.477051; 11.700000;, - 13.476221; -75.477051; 11.700000;, - 8.938375; 0.922958; 5.908501;, - -7.181622; 0.922955; 5.908501;, - 9.618265; -7.680378; 0.062687;, - 9.618269; -19.680382; 0.062687;, - 21.618265; -4.680378; 0.062687;, - 9.618265; -7.680378; 1.562681;, - 9.618269; -19.680382; 1.562681;, - 21.618265; -4.680378; 1.562681;, - 9.618265; -28.180374; 0.062689;, - 9.618265; -40.180374; 0.062689;, - 21.618265; -25.180378; 0.062694;, - 9.618265; -28.180374; 1.562683;, - 9.618265; -40.180374; 1.562683;, - 21.618265; -25.180378; 1.562684;, - 9.618269; -50.180374; 0.062691;, - 9.618265; -62.180374; 0.062691;, - 21.618269; -47.180374; 0.062691;, - 9.618269; -50.180374; 1.562685;, - 9.618265; -62.180374; 1.562685;, - 21.618269; -47.180374; 1.562685;; - - 30; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;, - 3;9,8,10;, - 3;13,9,10;, - 3;12,9,13;, - 3;11,10,8;, - 3;13,10,11;, - 3;11,12,13;, - 3;15,14,16;, - 3;19,15,16;, - 3;18,15,19;, - 3;17,16,14;, - 3;19,16,17;, - 3;17,18,19;, - 3;21,20,22;, - 3;25,21,22;, - 3;24,21,25;, - 3;23,22,20;, - 3;25,22,23;, - 3;23,24,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 66; - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - -0.995537;0.039364;-0.085767;, - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - 0.998354;0.039138;-0.041929;, - 0.000000;0.161356;-0.986896;, - 0.999676;0.025446;0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;0.161356;-0.986896;, - -0.000000;1.000000;0.000000;, - -0.997857;0.049375;-0.042925;, - -0.000000;-0.989569;-0.144060;, - -0.997857;0.049375;-0.042925;, - -0.000000;0.075588;0.997139;, - -0.000000;-0.989569;-0.144060;, - 0.995087;0.052753;-0.083776;, - 0.000000;0.075588;0.997139;, - 0.998354;0.039138;-0.041929;, - -0.000000;1.000000;0.000000;, - -0.000000;0.075588;0.997139;, - -0.000000;1.000000;0.000000;, - -0.998241;0.059291;0.000000;, - -0.000000;0.075588;0.997139;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242535;0.970143;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;; - 30; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;, - 3;26,24,28;, - 3;35,27,29;, - 3;33,27,35;, - 3;31,30,25;, - 3;36,30,31;, - 3;32,34,37;, - 3;40,38,42;, - 3;49,41,43;, - 3;47,41,49;, - 3;45,44,39;, - 3;50,44,45;, - 3;46,48,51;, - 3;54,52,56;, - 3;63,55,57;, - 3;61,55,63;, - 3;59,58,53;, - 3;64,58,59;, - 3;60,62,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_xL_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - 1.061086, -63.263023, -2.697744, 1.000000;; - } - Mesh xL_Foot { - - 8; - -36.996124; -15.719404; -4.210043;, - 7.775687; -15.719419; -6.330903;, - 5.374388; 0.954521; -4.263234;, - -26.951843; -6.593406; -1.317977;, - -36.995773; -15.719404; 4.210084;, - 7.775620; -15.719404; 6.330931;, - 5.374463; 0.954529; 4.263263;, - -26.951632; -6.593413; 1.317985;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_REDPLASTIC} - } - MeshNormals { - 20; - -0.121241;0.305074;-0.944580;, - 0.000000;-1.000000;0.000000;, - -0.672469;0.740125;0.000028;, - -0.046996;0.116259;-0.992106;, - -0.000000;-1.000000;0.000001;, - -0.121241;0.305074;-0.944580;, - -0.227378;0.973807;0.000001;, - -0.190220;0.480642;-0.856037;, - -0.227375;0.973807;0.000021;, - -0.672460;0.740133;0.000056;, - 0.000000;-1.000000;0.000000;, - -0.672460;0.740133;0.000056;, - -0.121242;0.305075;0.944579;, - 0.000000;-1.000000;0.000000;, - -0.046997;0.116259;0.992106;, - -0.227378;0.973807;0.000001;, - -0.121242;0.305075;0.944579;, - -0.227378;0.973807;0.000001;, - -0.672460;0.740133;0.000056;, - -0.190222;0.480644;0.856035;; - 10; - 3;0,5,3;, - 3;0,7,5;, - 3;1,13,10;, - 3;1,4,13;, - 3;6,17,15;, - 3;6,8,17;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,16,19;, - 3;12,14,16;; - } - } - } - } - } -} -AnimationSet x3ds_animset_0 { - Animation x3ds_anim_0 { - {x3ds_xGroin} - AnimationKey { - 0; - 9; - 0; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 77; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 85; 4; -0.000000, -0.000000, -0.675590, -0.737277;;, - 93; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 115; 4; 0.000000, -0.000000, 0.000000, -1.000000;;, - 135; 4; 0.000000, -0.000000, 0.000000, -1.000000;;, - 160; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 161; 4; -0.000000, -0.000000, -0.707107, -0.707107;;, - 216; 4; -0.000000, -0.000000, -0.707107, -0.707107;;; - } - AnimationKey { - 1; - 5; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 93; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 29; - 0; 3; 0.000000, 35.534382, 1.024473;;, - 1; 3; 0.000000, 23.889210, 1.024473;;, - 15; 3; 0.000000, 18.884680, 2.903347;;, - 30; 3; 0.000000, 23.889210, 1.024473;;, - 33; 3; 0.000000, 23.889210, 1.024473;;, - 43; 3; 0.000000, 20.962900, 1.024473;;, - 52; 3; 0.000000, 25.059750, 1.024473;;, - 61; 3; 0.000000, 23.518040, 5.044694;;, - 68; 3; 0.000000, 18.818790, 12.939010;;, - 76; 3; 0.000000, 23.518040, 5.044694;;, - 77; 3; 0.000000, 23.518040, 5.044694;;, - 93; 3; 0.000000, 23.518040, 5.044694;;, - 100; 3; 0.000000, 29.812460, 75.539871;;, - 104; 3; 0.000000, 19.677170, 97.369331;;, - 115; 3; 0.000000, -67.336800, 139.859100;;, - 135; 3; 0.000000, -67.336998, 139.859100;;, - 145; 3; 0.000000, -13.702706, 104.629173;;, - 146; 3; 0.000000, -12.018229, 99.536301;;, - 160; 3; 0.000000, 23.518040, 5.044694;;, - 161; 3; 0.000000, 23.518040, 5.044694;;, - 175; 3; 0.000000, 33.713287, -37.066116;;, - 178; 3; 0.000000, 24.016308, -39.583458;;, - 181; 3; 0.000000, 33.713287, -37.066116;;, - 184; 3; 0.000000, 24.016308, -39.583458;;, - 187; 3; 0.000000, 33.713287, -37.066116;;, - 190; 3; 0.000000, 24.016308, -39.583458;;, - 193; 3; 0.000000, 33.713287, -37.066116;;, - 207; 3; 0.000000, 33.713287, -37.066116;;, - 216; 3; 0.000000, 23.518040, 5.044694;;; - } - } - - Animation x3ds_anim_1 { - {x3ds_xChest} - AnimationKey { - 0; - 23; - 0; 4; 0.000000, -0.000000, -0.000000, -1.000000;;, - 1; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 15; 4; 0.317305, 0.000000, -0.000000, -0.948324;;, - 30; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 31; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 43; 4; -0.095846, -0.000000, -0.000000, -0.995396;;, - 52; 4; 0.442381, 0.058240, 0.116812, -0.887278;;, - 61; 4; 0.258819, -0.000000, -0.000000, -0.965926;;, - 68; 4; 0.332019, -0.072538, -0.264839, -0.902420;;, - 76; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 77; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 85; 4; 0.535255, 0.003802, -0.087074, -0.840182;;, - 93; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 95; 4; 0.221903, -0.017679, -0.071612, -0.972275;;, - 102; 4; 0.122182, -0.024167, -0.140528, -0.982212;;, - 115; 4; -0.000001, 0.000000, -0.000000, -1.000000;;, - 135; 4; -0.000001, -0.000000, 0.529919, -0.848048;;, - 139; 4; 0.030693, 0.002685, 0.581681, -0.812834;;, - 160; 4; 0.258820, -0.000000, -0.000000, -0.965926;;, - 161; 4; 0.258820, -0.000000, -0.000001, -0.965926;;, - 175; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 207; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 216; 4; 0.258820, -0.000000, -0.000001, -0.965926;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 0.426950, -1.024470, 11.366163;;, - 77; 3; 0.426950, -1.024470, 11.366163;;, - 115; 3; 0.426950, -1.024470, 11.366163;;, - 135; 3; 0.426950, -1.024470, 11.366163;;; - } - } - - Animation x3ds_anim_2 { - {x3ds_xRU_Arm} - AnimationKey { - 0; - 30; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.065263, 0.113039, 0.495722, -0.858616;;, - 15; 4; -0.056193, 0.117811, 0.426828, -0.894864;;, - 30; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 31; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 43; 4; 0.053090, 0.119242, -0.403256, -0.905730;;, - 52; 4; -0.220806, -0.041267, 0.855768, -0.466049;;, - 61; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 68; 4; -0.025312, 0.111794, -0.475054, -0.872459;;, - 76; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 77; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 85; 4; 0.133832, 0.353720, 0.308203, -0.872916;;, - 93; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 96; 4; -0.200990, -0.200282, 0.412420, -0.865679;;, - 97; 4; -0.132674, -0.082403, 0.416033, -0.895837;;, - 98; 4; -0.201870, -0.265437, 0.361052, -0.870881;;, - 99; 4; -0.134623, -0.131057, 0.365286, -0.911739;;, - 100; 4; -0.228976, -0.420777, 0.283694, -0.830683;;, - 115; 4; -0.000001, -0.398748, 0.000001, -0.917061;;, - 135; 4; -0.078327, -0.125349, -0.524098, -0.838734;;, - 139; 4; -0.071913, -0.092789, -0.291009, -0.949491;;, - 160; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 161; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 175; 4; -0.165429, -0.450070, 0.634668, -0.606026;;, - 178; 4; -0.307408, -0.362634, 0.387903, -0.789638;;, - 182; 4; -0.174187, -0.394643, 0.618206, -0.657068;;, - 185; 4; -0.280338, -0.279007, 0.343836, -0.851671;;, - 188; 4; -0.185051, -0.307103, 0.545153, -0.757794;;, - 192; 4; -0.218786, -0.219812, 0.386801, -0.868447;;, - 216; 4; -0.065264, 0.113036, 0.495726, -0.858615;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -22.158115, 0.000001, 34.682266;;, - 77; 3; -22.158115, 0.000001, 34.682266;;, - 115; 3; -22.158115, 0.000001, 34.682266;;, - 135; 3; -22.158115, 0.000001, 34.682266;;; - } - } - - Animation x3ds_anim_3 { - {x3ds_xRL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 15; 4; 0.909961, 0.414693, -0.000000, -0.000000;;, - 30; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 31; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 43; 4; 0.622515, 0.782608, 0.000000, -0.000000;;, - 52; 4; 0.998630, 0.052336, -0.000000, -0.000000;;, - 61; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 68; 4; 0.987688, 0.156435, -0.000000, -0.000000;;, - 76; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 77; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 85; 4; 0.673714, 0.675106, -0.106243, 0.281164;;, - 93; 4; 0.866025, 0.500000, 0.000000, -0.000000;;, - 96; 4; 0.846469, 0.531913, 0.010984, -0.020921;;, - 115; 4; 1.000000, -0.000001, -0.000000, 0.000000;;, - 135; 4; 0.913546, 0.406736, -0.000000, 0.000000;;, - 139; 4; 0.981076, 0.193621, -0.000000, -0.000000;;, - 160; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 161; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 175; 4; 0.898794, 0.438370, -0.000000, 0.000000;;, - 178; 4; 0.668687, 0.743544, -0.000000, 0.000000;;, - 182; 4; 0.826796, 0.562503, -0.000000, 0.000000;;, - 185; 4; 0.651408, 0.758727, -0.000000, 0.000000;;, - 188; 4; 0.705617, 0.708593, -0.000000, 0.000000;;, - 192; 4; 0.616021, 0.787730, -0.000000, 0.000000;;, - 216; 4; 0.866010, 0.500027, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 13.822151, 0.000000, -20.565975;;, - 77; 3; 13.822151, 0.000000, -20.565975;;, - 115; 3; 13.822151, 0.000000, -20.565975;;, - 135; 3; 13.822151, 0.000000, -20.565975;;; - } - } - - Animation x3ds_anim_4 { - {x3ds_xR_Hand} - AnimationKey { - 0; - 11; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 52; 4; 0.085633, 0.098509, -0.650446, -0.748253;;, - 68; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 77; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 85; 4; 0.095461, 0.089019, -0.725097, -0.676164;;, - 93; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 160; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 161; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 216; 4; 0.083025, 0.100717, -0.630637, -0.765023;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 17.201632, -0.532498, -26.974579;;, - 77; 3; 17.201632, -0.532498, -26.974579;;, - 115; 3; 17.201632, -0.532498, -26.974579;;, - 135; 3; 17.201632, -0.532498, -26.974579;;; - } - } - - Animation x3ds_anim_5 { - {x3ds_xLU_Arm} - AnimationKey { - 0; - 31; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.017037, 0.129409, 0.129410, -0.982963;;, - 15; 4; -0.027138, 0.127674, 0.206133, -0.969779;;, - 30; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 31; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 43; 4; -0.326088, 0.265924, 0.458283, -0.782897;;, - 52; 4; 0.023797, -0.004380, -0.508650, -0.860633;;, - 61; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 68; 4; 0.039250, 0.124485, -0.298134, -0.945558;;, - 76; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 77; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 85; 4; 0.014321, -0.216242, 0.302516, -0.928180;;, - 93; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 96; 4; 0.012473, 0.472295, 0.098587, -0.875821;;, - 97; 4; -0.005733, 0.314325, 0.091301, -0.944897;;, - 98; 4; 0.002467, 0.403792, 0.085230, -0.910869;;, - 99; 4; -0.005563, 0.316457, 0.079674, -0.945239;;, - 100; 4; 0.010565, 0.509467, 0.073742, -0.857260;;, - 115; 4; -0.000001, 0.566409, -0.000008, -0.824124;;, - 135; 4; 0.176893, 0.283087, -0.499530, -0.799400;;, - 139; 4; 0.283098, 0.024951, -0.406064, -0.868531;;, - 160; 4; -0.017038, 0.129412, 0.129402, -0.982964;;, - 161; 4; -0.017038, 0.129412, 0.129403, -0.982964;;, - 175; 4; 0.405692, 0.534219, 0.553941, -0.493126;;, - 178; 4; 0.585778, 0.368487, 0.379184, -0.614249;;, - 182; 4; 0.448058, 0.532485, 0.549044, -0.462877;;, - 185; 4; 0.592036, 0.367183, 0.377829, -0.609849;;, - 188; 4; 0.502752, 0.483163, 0.496528, -0.516967;;, - 192; 4; 0.598794, 0.362383, 0.372267, -0.609543;;, - 207; 4; 0.476089, 0.472560, 0.479925, -0.565420;;, - 216; 4; -0.017039, 0.129409, 0.129408, -0.982964;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 22.800381, -0.000005, 34.682266;;, - 77; 3; 22.800381, -0.000005, 34.682266;;, - 115; 3; 22.800381, -0.000005, 34.682266;;, - 135; 3; 22.800381, -0.000005, 34.682266;;; - } - } - - Animation x3ds_anim_6 { - {x3ds_xLL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.819152, 0.573576, -0.000000, -0.000000;;, - 15; 4; 0.848048, 0.529919, -0.000000, -0.000000;;, - 30; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 31; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 43; 4; 0.737277, 0.675591, -0.000000, -0.000000;;, - 52; 4; 0.642787, 0.766045, 0.000000, -0.000000;;, - 61; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 68; 4; 0.939693, 0.342020, -0.000000, -0.000000;;, - 76; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 77; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 85; 4; 0.441186, 0.831001, 0.214867, -0.261961;;, - 93; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 96; 4; 0.932169, 0.360972, -0.014558, 0.023425;;, - 115; 4; 1.000000, -0.000000, -0.000000, -0.000000;;, - 135; 4; 0.874620, 0.484809, -0.000000, -0.000000;;, - 139; 4; 0.980002, 0.198988, -0.000000, -0.000000;;, - 160; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 161; 4; 0.819152, 0.573577, -0.000000, 0.000000;;, - 175; 4; 0.902585, 0.430511, -0.000000, 0.000000;;, - 178; 4; 0.674571, 0.738210, -0.000000, 0.000000;;, - 182; 4; 0.836374, 0.548160, -0.000000, 0.000000;;, - 185; 4; 0.666576, 0.745437, -0.000000, 0.000000;;, - 188; 4; 0.756143, 0.654407, -0.000000, 0.000000;;, - 192; 4; 0.686772, 0.726874, -0.000000, 0.000000;;, - 216; 4; 0.819140, 0.573595, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -0.446586, 0.000001, -24.389267;;, - 77; 3; -0.446586, 0.000001, -24.389267;;, - 115; 3; -0.446586, 0.000001, -24.389267;;, - 135; 3; -0.446586, 0.000001, -24.389267;;; - } - } - - Animation x3ds_anim_7 { - {x3ds_xL_Hand} - AnimationKey { - 0; - 10; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 68; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 77; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 85; 4; 0.099989, 0.083901, -0.759491, -0.637289;;, - 93; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 160; 4; 0.088182, 0.096234, -0.669811, -0.730970;;, - 161; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 216; 4; 0.088182, 0.096234, -0.669810, -0.730970;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -1.719951, -0.532492, -32.044598;;, - 77; 3; -1.719951, -0.532492, -32.044598;;, - 115; 3; -1.719951, -0.532492, -32.044598;;, - 135; 3; -1.719951, -0.532492, -32.044598;;; - } - } - - Animation x3ds_anim_8 { - {x3ds_xHead} - AnimationKey { - 0; - 26; - 0; 4; -0.000000, -0.999048, 0.043619, -0.000000;;, - 6; 4; -0.000000, -0.997564, -0.069756, -0.000000;;, - 15; 4; -0.000000, -0.999657, -0.026177, -0.000000;;, - 26; 4; -0.000000, -0.999391, 0.034899, -0.000000;;, - 52; 4; 0.057153, -0.973623, -0.220877, -0.002109;;, - 61; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 68; 4; -0.328848, -0.929469, 0.165640, 0.022582;;, - 76; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 77; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 85; 4; 0.130447, -0.990841, 0.034601, 0.004555;;, - 93; 4; 0.000000, -0.999391, 0.034900, -0.000000;;, - 115; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 135; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 175; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 177; 4; 0.121753, -0.991602, 0.043296, 0.005316;;, - 179; 4; -0.017436, -0.998896, 0.043614, -0.000761;;, - 181; 4; 0.139040, -0.989326, 0.043196, 0.006071;;, - 183; 4; -0.034867, -0.998440, 0.043594, -0.001522;;, - 185; 4; 0.121752, -0.991602, 0.043296, 0.005316;;, - 187; 4; -0.026153, -0.998706, 0.043606, -0.001142;;, - 189; 4; 0.142432, -0.972455, -0.180232, 0.039500;;, - 191; 4; -0.109249, -0.975409, -0.173314, -0.081269;;, - 193; 4; 0.130401, -0.990501, 0.043248, 0.005694;;, - 195; 4; -0.043578, -0.998097, 0.043579, -0.001903;;, - 197; 4; 0.173153, -0.983648, 0.043642, 0.023447;;, - 199; 4; -0.065922, -0.988029, 0.137452, 0.023655;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 8; - 0; 3; 0.000000, 0.320922, 43.031700;;, - 93; 3; 0.000000, 0.320922, 43.031700;;, - 115; 3; 0.000000, 0.320922, 43.031700;;, - 135; 3; 0.000000, 0.320922, 43.031700;;, - 160; 3; 0.000000, 0.320922, 43.031700;;, - 161; 3; 0.000000, 0.320922, 43.031700;;, - 175; 3; 0.000000, 0.320922, 43.031700;;, - 216; 3; 0.000000, 0.320922, 43.031700;;; - } - } - - Animation x3ds_anim_9 { - {x3ds_xSpike01} - AnimationKey { - 0; - 6; - 0; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 77; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 93; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 115; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 135; 4; 0.706433, -0.706434, 0.030844, 0.030844;;, - 175; 4; 0.706433, -0.706434, 0.030844, 0.030844;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 23.054602, 0.275461, -15.502029;;, - 77; 3; 23.054602, 0.275461, -15.502029;;, - 115; 3; 23.054602, 0.275461, -15.502029;;, - 135; 3; 23.054602, 0.275461, -15.502029;;; - } - } - - Animation x3ds_anim_10 { - {x3ds_Spike02} - AnimationKey { - 0; - 6; - 0; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 77; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 93; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 115; 4; 0.706434, -0.706434, 0.030844, 0.030844;;, - 135; 4; 0.706433, -0.706434, 0.030844, 0.030844;;, - 175; 4; 0.706433, -0.706434, 0.030844, 0.030844;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -22.163496, 4.231531, -15.502030;;, - 77; 3; -22.163496, 4.231531, -15.502030;;, - 115; 3; -22.163496, 4.231531, -15.502030;;, - 135; 3; -22.163496, 4.231531, -15.502030;;; - } - } - - Animation x3ds_anim_11 { - {x3ds_xRU_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 21; 4; 0.124791, -0.009789, -0.874977, 0.467703;;, - 30; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 37; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 43; 4; 0.125169, 0.001125, -0.912411, 0.389664;;, - 52; 4; 0.125097, 0.004401, -0.922298, 0.365647;;, - 61; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 68; 4; 0.125154, 0.002217, -0.915776, 0.381687;;, - 76; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 77; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 85; 4; 0.124485, 0.013117, -0.945558, 0.300420;;, - 93; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 100; 4; 0.240075, 0.038409, -0.943098, 0.226838;;, - 115; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 135; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 139; 4; 0.230082, -0.060758, -0.927524, 0.288220;;, - 146; 4; 0.215704, -0.060817, -0.923441, 0.311497;;, - 150; 4; 0.209892, -0.016602, -0.963089, 0.167717;;, - 160; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 161; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 175; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 178; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 181; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 184; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 187; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 190; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 193; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 207; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 216; 4; 0.124939, 0.007674, -0.931554, 0.341378;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 6.849594, 0.163909, 2.374462;;, - 77; 3; 6.849594, 0.163909, 2.374462;;, - 115; 3; 6.849594, 0.163909, 2.374462;;, - 135; 3; 6.849594, 0.163909, 2.374462;;; - } - } - - Animation x3ds_anim_12 { - {x3ds_xRL_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 1; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 11; 4; 0.438280, 0.897779, -0.019136, -0.039198;;, - 21; 4; 0.422215, 0.905446, -0.018434, -0.039533;;, - 26; 4; 0.439586, 0.897141, -0.019193, -0.039170;;, - 30; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 37; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 43; 4; 0.484348, 0.873787, -0.021147, -0.038150;;, - 52; 4; 0.499524, 0.865201, -0.021810, -0.037775;;, - 61; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 68; 4; 0.573030, 0.818373, -0.025019, -0.035731;;, - 76; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 77; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 93; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 115; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 135; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 139; 4; 0.319106, 0.946715, -0.013933, -0.041334;;, - 146; 4; 0.007542, 0.999020, -0.000329, -0.043618;;, - 150; 4; -0.025078, 0.998734, 0.001095, -0.043606;;, - 160; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 161; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 175; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 178; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 181; 4; 0.655435, 0.753991, -0.028617, -0.032920;;, - 184; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 187; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 190; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 193; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 207; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 216; 4; 0.536789, 0.842588, -0.023437, -0.036788;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -3.359494, 0.259702, 38.976971;;, - 77; 3; -3.359494, 0.259702, 38.976971;;, - 115; 3; -3.359494, 0.259702, 38.976971;;, - 135; 3; -3.359494, 0.259702, 38.976971;;; - } - } - - Animation x3ds_anim_13 { - {x3ds_xR_Foot} - AnimationKey { - 0; - 29; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 11; 4; 0.693619, 0.137449, 0.693620, -0.137448;;, - 21; 4; 0.703851, 0.067776, 0.703851, -0.067776;;, - 26; 4; 0.702932, 0.076726, 0.702932, -0.076726;;, - 30; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 37; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 52; 4; 0.700211, 0.098511, 0.700211, -0.098511;;, - 61; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 68; 4; 0.690345, 0.153046, 0.690346, -0.153046;;, - 76; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 77; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 93; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 115; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 135; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 139; 4; 0.636494, 0.308019, 0.636494, -0.308019;;, - 146; 4; 0.705581, -0.046427, 0.705581, 0.046427;;, - 150; 4; 0.682577, -0.184629, 0.682578, 0.184629;;, - 160; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 161; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 175; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 178; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 181; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 184; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 187; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 190; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 193; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 207; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 216; 4; 0.701057, 0.092298, 0.701057, -0.092298;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; -0.849455, -62.299629, -3.801312;;, - 115; 3; -0.849455, -62.299629, -3.801312;;, - 135; 3; -0.849455, -62.299629, -3.801312;;; - } - } - - Animation x3ds_anim_14 { - {x3ds_xLU_Leg} - AnimationKey { - 0; - 30; - 0; 4; -0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; -0.128543, 0.007574, -0.976382, -0.173483;;, - 11; 4; -0.134779, 0.015787, -0.981832, -0.132631;;, - 21; 4; -0.128729, 0.003084, -0.969733, -0.207452;;, - 30; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 37; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 43; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 52; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 61; 4; -0.128543, 0.007574, -0.976383, -0.173482;;, - 68; 4; -0.128751, 0.001960, -0.967886, -0.215906;;, - 76; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 77; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 85; 4; -0.128751, 0.001960, -0.967886, -0.215907;;, - 93; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 100; 4; -0.098715, 0.012488, -0.994248, -0.039635;;, - 115; 4; -0.199368, -0.000000, -0.979925, -0.000000;;, - 135; 4; -0.180689, 0.084257, -0.888113, 0.414134;;, - 139; 4; -0.148626, 0.124737, -0.776470, 0.599538;;, - 160; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 161; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 175; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 178; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 181; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 184; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 187; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 190; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 193; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 207; 4; -0.124735, 0.031962, -0.991546, 0.016007;;, - 212; 4; -0.128488, 0.008447, -0.977538, -0.166852;;, - 216; 4; -0.128542, 0.007575, -0.976383, -0.173479;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -5.995693, 0.163913, 2.695592;;, - 77; 3; -5.995690, 0.163913, 2.695592;;, - 115; 3; -5.995690, 0.163913, 2.695592;;, - 135; 3; -5.995690, 0.163913, 2.695592;;; - } - } - - Animation x3ds_anim_15 { - {x3ds_xLL_Leg} - AnimationKey { - 0; - 34; - 0; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 1; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 6; 4; 0.551866, 0.832791, 0.024095, 0.036360;;, - 11; 4; 0.510806, 0.858589, 0.022302, 0.037487;;, - 21; 4; 0.521998, 0.851831, 0.022791, 0.037192;;, - 26; 4; 0.541375, 0.839649, 0.023637, 0.036660;;, - 30; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 37; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 43; 4; 0.522001, 0.851829, 0.022791, 0.037192;;, - 52; 4; 0.544120, 0.837873, 0.023757, 0.036582;;, - 61; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 68; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 76; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 77; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 93; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 104; 4; 0.564968, 0.823959, 0.024667, 0.035975;;, - 115; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 135; 4; 0.087073, 0.995247, 0.003802, 0.043453;;, - 139; 4; -0.244382, 0.968698, -0.010670, 0.042294;;, - 155; 4; 0.218585, 0.974843, 0.009544, 0.042563;;, - 160; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 161; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 168; 4; 0.350698, 0.935472, 0.015312, 0.040844;;, - 172; 4; 0.439930, 0.896972, 0.019208, 0.039163;;, - 175; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 178; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 181; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 184; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 187; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 190; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 193; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 207; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 212; 4; 0.495151, 0.867712, 0.021619, 0.037885;;, - 216; 4; 0.580152, 0.813340, 0.025330, 0.035511;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 3.943333, 0.259710, 39.672764;;, - 77; 3; 3.943333, 0.259710, 39.672764;;, - 115; 3; 3.943333, 0.259710, 39.672764;;, - 135; 3; 3.943333, 0.259710, 39.672764;;; - } - } - - Animation x3ds_anim_16 { - {x3ds_xL_Foot} - AnimationKey { - 0; - 34; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 6; 4; 0.680588, -0.191834, 0.680588, 0.191834;;, - 11; 4; 0.677475, -0.202553, 0.677475, 0.202553;;, - 21; 4; 0.676210, -0.206736, 0.676210, 0.206736;;, - 26; 4; 0.677620, -0.202065, 0.677621, 0.202065;;, - 30; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 37; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 43; 4; 0.681390, -0.188966, 0.681390, 0.188966;;, - 52; 4; 0.690346, -0.153046, 0.690346, 0.153046;;, - 61; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 68; 4; 0.679364, -0.196123, 0.679364, 0.196123;;, - 76; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 77; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 93; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 100; 4; 0.705872, 0.041770, 0.705872, -0.041770;;, - 104; 4; 0.698511, 0.109917, 0.698512, -0.109917;;, - 115; 4; 0.707107, -0.000002, 0.707107, 0.000002;;, - 135; 4; 0.612373, 0.353552, 0.612373, -0.353552;;, - 139; 4; 0.672346, 0.218976, 0.672346, -0.218976;;, - 155; 4; 0.659223, -0.255782, 0.659223, 0.255782;;, - 160; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 161; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 168; 4; 0.705347, 0.049859, 0.705347, -0.049859;;, - 172; 4; 0.706854, -0.018889, 0.706854, 0.018889;;, - 175; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 178; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 181; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 184; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 187; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 190; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 193; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 207; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 216; 4; 0.687562, -0.165103, 0.687562, 0.165103;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; 1.061092, -63.263000, -4.043970;;, - 115; 3; 1.061092, -63.263000, -4.043970;;, - 135; 3; 1.061092, -63.263000, -4.043970;;; - } - } - -} - diff --git a/sdk/samples/rockem/demechbk.ppm b/sdk/samples/rockem/demechbk.ppm deleted file mode 100644 index eb79012..0000000 Binary files a/sdk/samples/rockem/demechbk.ppm and /dev/null differ diff --git a/sdk/samples/rockem/demechbt.ppm b/sdk/samples/rockem/demechbt.ppm deleted file mode 100644 index 175a1a3..0000000 Binary files a/sdk/samples/rockem/demechbt.ppm and /dev/null differ diff --git a/sdk/samples/rockem/demechch.ppm b/sdk/samples/rockem/demechch.ppm deleted file mode 100644 index c71d873..0000000 Binary files a/sdk/samples/rockem/demechch.ppm and /dev/null differ diff --git a/sdk/samples/rockem/demechgr.ppm b/sdk/samples/rockem/demechgr.ppm deleted file mode 100644 index ed3ebeb..0000000 Binary files a/sdk/samples/rockem/demechgr.ppm and /dev/null differ diff --git a/sdk/samples/rockem/demechh1.ppm b/sdk/samples/rockem/demechh1.ppm deleted file mode 100644 index 043967e..0000000 Binary files a/sdk/samples/rockem/demechh1.ppm and /dev/null differ diff --git a/sdk/samples/rockem/demechh2.ppm b/sdk/samples/rockem/demechh2.ppm deleted file mode 100644 index 1c0c79a..0000000 Binary files a/sdk/samples/rockem/demechh2.ppm and /dev/null differ diff --git a/sdk/samples/rockem/demechhd.ppm b/sdk/samples/rockem/demechhd.ppm deleted file mode 100644 index 95cbfd4..0000000 --- a/sdk/samples/rockem/demechhd.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 32 -255 -ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$L$$L$$L,,L$$L,,L$$L$$L,,L$$L$$L$$L$$L$$L$$L$$L$$L$$L,,L$$L$$L$$L$$L$$L,,ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒT,,L,,ÔÔÜÔÜÔ$$ÜÔÜÔÜ$$ô<<́44Ü$$ÜÔÔÔÔÔÔÔT$$L$$ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL,,L$$L$$L$$L$$L$$L$$L,,L,,L$$L$$L,,L,,L$$L$$L,,L$$L$$L,,L,,L$$L,,L$$L$$L$$L$$L,,L$$L,,ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$L$$L$$L,,L,,L$$L,,L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L$$L,,L,,L$$L,,L$$ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL,,ŒŒŒL$$ŒŒŒŒŒŒ””ŒŒŒŒŒŒ”Œ ŒŒŒL$$ŒŒŒL$$ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$Ố<<ä44L$$ÔÜÔÜÔ$$ÜÔÔǗ<<́44Ô$$ÔÔÜÔÔÔÔL$$ÔÜ$$́44L,,ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒL$$Ǘ44́< c2) - { - VideoMode tmp; - - // Swap the two video modes - tmp = g_vidModes[k]; - g_vidModes[k] = g_vidModes[k + 1]; - g_vidModes[k + 1] = tmp; - - // Keep g_dwCurrMode up to date - if (g_dwCurrMode == k) - { - g_dwCurrMode = k + 1; - } - else if (g_dwCurrMode == k + 1) - { - g_dwCurrMode = k; - } - } - } - } -} - -//---------------------------------------------------------------------- -// -// Function : DDEnumCallBack() -// -// Purpose : Call back to enumerate installed DirectDraw devices -// -//---------------------------------------------------------------------- - -BOOL FAR PASCAL DDEnumCallback(GUID FAR* lpGUID, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext) -{ - LPDIRECTDRAW lpDD; - DDCAPS DriverCaps, HELCaps; - - // Make sure the guid is valid - if (lpGUID) - { - // Try to create a DirectDraw object - TRY_DD(DirectDrawCreate(lpGUID, &lpDD, NULL)) - - // Get the DirectDraw capabilities - memset(&DriverCaps, 0, sizeof(DDCAPS)); - DriverCaps.dwSize = sizeof(DDCAPS); - - memset(&HELCaps, 0, sizeof(DDCAPS)); - HELCaps.dwSize = sizeof(DDCAPS); - - TRY_DD(lpDD->GetCaps(&DriverCaps, &HELCaps)) - - // Does this driver have 3D hardware capabilites? - if (DriverCaps.dwCaps & DDCAPS_3D) - { - *(LPDIRECTDRAW*)lpContext = lpDD; - return DDENUMRET_CANCEL; - } - - *(LPDIRECTDRAW*)lpContext = NULL; - lpDD->Release(); - } - - // Yahoo! - return DDENUMRET_OK; -} - -//---------------------------------------------------------------------- -// -// Function : DDEnumDisplayModesCallBack() -// -// Purpose : Call back function to receive display mode information -// -//---------------------------------------------------------------------- - -HRESULT CALLBACK DDEnumDisplayModesCallback(LPDDSURFACEDESC pddsd, LPVOID Context) -{ - // While each mode gets enumerated we have to decide whether - // the 3D device and mode are compatible - if (g_deviceInfo.lpHWGuid) - { - // Make sure there is enough video ram to support this mode - //if hardware is in use - DWORD dwBitDepthMultiplier; - - switch(pddsd->ddpfPixelFormat.dwRGBBitCount) - { - case 8 : dwBitDepthMultiplier = 1; break; - case 16 : dwBitDepthMultiplier = 2; break; - case 24 : dwBitDepthMultiplier = 3; break; - case 32 : dwBitDepthMultiplier = 4; break; - } - - DWORD dwVidRamNeeded = ((pddsd->dwWidth * pddsd->dwHeight) * dwBitDepthMultiplier) * 3; - - if (dwVidRamNeeded > (g_driverCaps.dwVidMemFree + g_dwGDIMem)) - return DDENUMRET_OK; - - // Make sure the Direct3D device can render at a given bit depth - switch (pddsd->ddpfPixelFormat.dwRGBBitCount) - { - case 8 : - { - if (!(g_deviceInfo.HWDeviceDesc.dwDeviceRenderBitDepth & DDBD_8)) return DDENUMRET_OK; - } - break; - - case 16 : - { - if (!(g_deviceInfo.HWDeviceDesc.dwDeviceRenderBitDepth & DDBD_16)) return DDENUMRET_OK; - } - break; - - case 24 : - { - if (!(g_deviceInfo.HWDeviceDesc.dwDeviceRenderBitDepth & DDBD_24)) return DDENUMRET_OK; - } - break; - - case 32 : - { - if (!(g_deviceInfo.HWDeviceDesc.dwDeviceRenderBitDepth & DDBD_32)) return DDENUMRET_OK; - } - break; - } - - // If we have hardware, start up in 640x480x16 if possible - if ((pddsd->dwWidth == 640) && (pddsd->dwHeight == 480) && (pddsd->ddpfPixelFormat.dwRGBBitCount == 16)) - { - g_dwCurrMode = g_dwNumModes; - } - } - - // Record the video mode information - g_vidModes[g_dwNumModes].width = pddsd->dwWidth; - g_vidModes[g_dwNumModes].height = pddsd->dwHeight; - g_vidModes[g_dwNumModes].bpp = pddsd->ddpfPixelFormat.dwRGBBitCount; - - g_dwNumModes ++; - - return DDENUMRET_OK; -} - -//------------------------------------------------------------------ -// -// Function : D3DEnumDriverCallBack() -// -// Purpose : Enumeration Function -// -//------------------------------------------------------------------ - -HRESULT WINAPI D3DEnumDeviceCallBack(LPGUID lpGuid, - LPSTR lpDeviceDescription, - LPSTR lpDeviceName, - LPD3DDEVICEDESC lpHWDesc, - LPD3DDEVICEDESC lpHELDesc, - LPVOID lpContext) -{ - static BOOL bFoundHardwareDevice = FALSE; - - // No need to enumerate if we already found the device that supports - if (bFoundHardwareDevice) return D3DENUMRET_OK; - - D3DDeviceInfo* pInfo = (D3DDeviceInfo *)lpContext; - - // Is this a hardware device? - if (lpHWDesc->dcmColorModel & pInfo->cm) - { - // Driver needs to pass some tests.... - - // Make sure the driver has ZBuffering capabilities - if ((lpHWDesc->dwDeviceZBufferBitDepth & DDBD_16) || - (lpHWDesc->dwDeviceZBufferBitDepth & DDBD_24) || - (lpHWDesc->dwDeviceZBufferBitDepth & DDBD_32)) - { - // Record the HAL description for later use - memcpy(&pInfo->HWDeviceDesc, lpHWDesc, sizeof(D3DDEVICEDESC)); - - // Record the guid for later use - pInfo->lpHWGuid = lpGuid; - - // No need to keep looking for any more devices - bFoundHardwareDevice = TRUE; - } - - // Yahoo! - return D3DENUMRET_OK; - } - - // Is this a software device? - if (lpHELDesc->dcmColorModel & pInfo->cm) - { - // Record the HEL description for later use - memcpy(&pInfo->SWDeviceDesc, lpHELDesc, sizeof(D3DDEVICEDESC)); - - // Record the guid for later use - pInfo->lpSWGuid = lpGuid; - - g_lpD3DDeviceGuid = lpGuid; - } - - return D3DENUMRET_OK; -} - -//---------------------------------------------------------------------- -// -// Function : InitD3DDevice() -// -// Purpose : Performs initialisation for correct Direct3D device -// RGB, MONO, HAL etc -// -//---------------------------------------------------------------------- - -BOOL InitD3DDevice() -{ - memset(&g_deviceInfo, 0, sizeof(D3DDeviceInfo)); - - // Use RGB colour if in hardware, RAMP if in software - - // Record the colour model that we wish to search for in the structure passed - // to the enumeration call back - g_deviceInfo.cm = g_bHardware3D ? D3DCOLOR_RGB : D3DCOLOR_MONO;; - - // Enumerate the drivers - TRY_D3D(g_lpD3D->EnumDevices(D3DEnumDeviceCallBack, &g_deviceInfo)) - - // Test to see whether we have hardware or software - if (g_deviceInfo.lpHWGuid) - { - // We have a hardware driver! - - // Use a video memory based ZBuffer - g_dwZBufferMemType = DDSCAPS_VIDEOMEMORY; - - // Use 16 bit ZBuffering if possible, higher if not - if (g_deviceInfo.HWDeviceDesc.dwDeviceZBufferBitDepth & DDBD_16) - { - g_dwZBufferBitDepth = 16; - } - else if (g_deviceInfo.HWDeviceDesc.dwDeviceZBufferBitDepth & DDBD_24) - { - g_dwZBufferBitDepth = 24; - } - else if (g_deviceInfo.HWDeviceDesc.dwDeviceZBufferBitDepth & DDBD_32) - { - g_dwZBufferBitDepth = 32; - } - else - { - g_dwZBufferBitDepth = 0; - } - - // Use Hardware device - g_lpD3DDeviceGuid = g_deviceInfo.lpHWGuid; - } - else - { - // We have a software driver! - - // Use a system memory based ZBuffer - g_dwZBufferMemType = DDSCAPS_SYSTEMMEMORY; - - // And force the bit depth to 16 - g_dwZBufferBitDepth = 16; - - // Default to the software device - g_lpD3DDeviceGuid = g_deviceInfo.lpSWGuid; - } - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : InitDirectX() -// -// Purpose : Initialises DirectX (DirectDraw, Direct3D, Direct3DRM, DirectSound) -// -//---------------------------------------------------------------------- - -BOOL InitDirectX() -{ - FILE *fp; - BYTE pal[768]; - HRESULT rval; - DDSURFACEDESC ddsd; - - // Enumerate DirectDraw drivers to see what is installed, preferring one with - // Hardware 3D capabilities - TRY_DD(DirectDrawEnumerate(DDEnumCallback, &g_lpDD)) - - // If g_lpDD is NULL, there isn't a DirectDraw device with hardware 3D capabilities, - // so create a device using the HEL - if (!g_lpDD) - { - TRY_DD(DirectDrawCreate(NULL, &g_lpDD, NULL)) - } - - // NOTE : Exclusive mode would normally be set here but because of the splash - // screen being displayed it isn't. The reason is that the splash screen uses - // 640x480x8 and that mode may not be available if we are using a hardware 3D - // DirectDraw device. - - // Zero out caps structures - memset(&g_driverCaps, 0, sizeof(DDCAPS)); - g_driverCaps.dwSize = sizeof(DDCAPS); - - memset(&g_HELcaps, 0, sizeof(DDCAPS)); - g_HELcaps.dwSize = sizeof(DDCAPS); - - // Get the current display mode as we can use that memory when full - // screen exclusive - memset(&ddsd, 0, sizeof ddsd); - ddsd.dwSize = sizeof ddsd; - TRY_DD(g_lpDD->GetDisplayMode(&ddsd)); - g_dwGDIMem = ddsd.lPitch * ddsd.dwHeight * - (ddsd.ddpfPixelFormat.dwRGBBitCount / 8); - - // Get hardware capabilities - TRY_DD(g_lpDD->GetCaps(&g_driverCaps, &g_HELcaps)) - - // Global to determine whether we have hardware 3D capabilities or not - g_bHardware3D = g_driverCaps.dwCaps & DDCAPS_3D; - - // Create Direct3D object - TRY_D3D(g_lpDD->QueryInterface(IID_IDirect3D, (LPVOID *)&g_lpD3D)) - - // Enumerate Direct3D devices, preferring hardware rendering over software - if (!InitD3DDevice()) - { - RegError("Error locating suitable Direct3D driver!"); - return FALSE; - } - - // Enumerate all the display modes, this is done after locating the 3D device so - // that any mode that is not compatible with the 3D device does not get added to - // the list of valid modes. - TRY_DD(g_lpDD->EnumDisplayModes(0, NULL, NULL, DDEnumDisplayModesCallback)) - - // Sort display modes into lowest width * height first - SortDisplayModes(); - - // Create Direct3D RM object - TRY_D3DRM(Direct3DRMCreate(&g_lpD3DRM)) - - // Set default amount of texture colours - g_lpD3DRM->SetDefaultTextureColors(16); - - // Set default amount of texture shades - g_lpD3DRM->SetDefaultTextureShades(16); - - // Create DirectSound object - rval = DirectSoundCreate(NULL, &g_lpDS, NULL); - - // Determine whether sound is present - g_bSoundPresent = rval == DS_OK ? TRUE : FALSE; - - if (g_bSoundPresent) - { - // Set the DirectSound cooperative level - TRY_DS(g_lpDS->SetCooperativeLevel(g_hWnd, DSSCL_NORMAL)) - - // Create the Direct 3D Sound Buffer - g_3DSoundBuffer = CreateSoundBuffer3D(); - if(g_3DSoundBuffer == NULL) - { - RegError("Not able to create Direct 3D Sound Buffer"); - return FALSE; - } - // Query interface for Direct 3D Sound Listener object - if(DS_OK != g_3DSoundBuffer->QueryInterface(IID_IDirectSound3DListener, (void**)&g_lpDs3dListener)) - { - RegError("Not able to create Direct 3D Sound Listener object"); - return FALSE; - } - // Set the Direct 3D Sound Rolloff Factor - g_lpDs3dListener->SetRolloffFactor(.01,DS3D_DEFERRED); - // Change listener's orientation - g_lpDs3dListener->SetOrientation(-D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0), D3DVAL(1), D3DVAL(0),DS3D_DEFERRED); - // Commit the changes to Rolloff Factor and orientation - g_lpDs3dListener->CommitDeferredSettings(); - - // Null out all the sound pointers - for (int i = 0; i < NUM_SOUNDS; i ++) - { - g_lpSounds[i] = NULL; - } - - // Load the sounds - if (!CreateBufferFromWaveFile("INTRO.WAV", INTRO)) - { - RegError("Couldn't load INTRO.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("PUNCH1.WAV", PLAYER1_PUNCH1)) - { - RegError("Couldn't load PUNCH1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("PUNCH3.WAV", PLAYER1_PUNCH2)) - { - RegError("Couldn't load PUNCH3.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("PUNCH2.WAV", PLAYER2_PUNCH1)) - { - RegError("Couldn't load PUNCH2.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("PUNCH4.WAV", PLAYER2_PUNCH2)) - { - RegError("Couldn't load PUNCH4.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("WALK0.WAV", PLAYER1_WALK)) - { - RegError("Couldn't load WALK0.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("WALK1.WAV", PLAYER2_WALK)) - { - RegError("Couldn't load WALK1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("WHOOSH1.WAV", WHOOSH1)) - { - RegError("Couldn't load WHOOSH1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("WHOOSH2.WAV", WHOOSH2)) - { - RegError("Couldn't load WHOOSH2.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("DEFEND1.WAV", PLAYER1_OUCH)) - { - RegError("Couldn't load DEFEND1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("DEFEND2.WAV", PLAYER2_OUCH)) - { - RegError("Couldn't load DEFEND2.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("HEAD.WAV", HEAD_SPRING)) - { - RegError("Couldn't load HEAD.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("BLOCK1.WAV", BLOCK1)) - { - RegError("Couldn't load BLOCK1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("BLOCK2.WAV", BLOCK2)) - { - RegError("Couldn't load BLOCK2.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("BLOCK3.WAV", BLOCK3)) - { - RegError("Couldn't load BLOCK3.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("CLOOP.WAV", CROWD_LOOP)) - { - RegError("Couldn't load CLOOP.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("CBOO.WAV", VICTORY_BOO)) - { - RegError("Couldn't load CBOO.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("CYEAH.WAV", VICTORY_YEAH)) - { - RegError("Couldn't load CYEAH.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("REVUP1.WAV", SERVO_UP_1)) - { - RegError("Couldn't load REVUP1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("REVUP2.WAV", SERVO_UP_2)) - { - RegError("Couldn't load REVUP2.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("REVUP3.WAV", SERVO_UP_3)) - { - RegError("Couldn't load REVUP3.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("REVDN1.WAV", SERVO_DOWN_1)) - { - RegError("Couldn't load REVDOWN1.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("REVDN2.WAV", SERVO_DOWN_2)) - { - RegError("Couldn't load REVDOWN2.WAV!"); - return FALSE; - } - - if (!CreateBufferFromWaveFile("REVDN3.WAV", SERVO_DOWN_3)) - { - RegError("Couldn't load REVDOWN3.WAV!"); - return FALSE; - } - if (!CreateBufferFromWaveFile("RANDOM1.WAV", RANDOM1)) - { - RegError("Couldn't load RANDOM1.WAV!"); - return FALSE; - } - if (!CreateBufferFromWaveFile("RANDOM2.WAV", RANDOM2)) - { - RegError("Couldn't load RANDOM2.WAV!"); - return FALSE; - } - if (!CreateBufferFromWaveFile("RANDOM3.WAV", RANDOM3)) - { - RegError("Couldn't load RANDOM3.WAV!"); - return FALSE; - } - if (!CreateBufferFromWaveFile("RANDOM4.WAV", RANDOM4)) - { - RegError("Couldn't load RANDOM4.WAV!"); - return FALSE; - } - if (!CreateBufferFromWaveFile("RANDOM5.WAV", RANDOM5)) - { - RegError("Couldn't load RANDOM5.WAV!"); - return FALSE; - } - if (!CreateBufferFromWaveFile("RANDOM6.WAV", RANDOM6)) - { - RegError("Couldn't load RANDOM6.WAV!"); - return FALSE; - } - } - - // Load Rockem3D's palette - fp = fopen("ROCKEM3D.PAL", "rb"); - if (!fp) - { - RegError("Couldn't load ROCKEM3D.PAL!"); - return FALSE; - } - - // Read in the raw rgb's - fread(pal, 768, 1, fp); - - // Close the file - fclose(fp); - - // Set up palette - g_rPal[0].peFlags = D3DPAL_READONLY; - g_rPal[253].peFlags = D3DPAL_READONLY; - g_rPal[254].peFlags = D3DPAL_READONLY; - g_rPal[255].peFlags = D3DPAL_READONLY; - - for (int i = 1; i < 253; i++) - { - g_rPal[i].peRed = pal[i * 3]; - g_rPal[i].peGreen = pal[(i * 3) + 1]; - g_rPal[i].peBlue = pal[(i * 3) + 2]; - g_rPal[i].peFlags = D3DPAL_READONLY; - } - - // Set the entries 253 and 254 to a colour for the power bars - g_rPal[253].peRed = 0; - g_rPal[253].peGreen = 0; - g_rPal[253].peBlue = 255; - - g_rPal[254].peRed = 255; - g_rPal[254].peGreen = 0; - g_rPal[254].peBlue = 0; - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : SetDirectDrawExclusiveMode() -// -// Purpose : Sets exclusive mode for DirectDraw -// -//---------------------------------------------------------------------- - -BOOL SetDirectDrawExclusiveMode() -{ - TRY_DD(g_lpDD->SetCooperativeLevel(g_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX)) - - // Yahoo! - return TRUE; -} - - -//---------------------------------------------------------------------- -// -// Function : TermDirectX() -// -// Purpose : Destroys all the DirectX objects -// -//---------------------------------------------------------------------- - -void TermDirectX() -{ - // Destroy everything in the reverse order in which they were created - int i; - - // Destroy rendering device - if (g_lpD3DDevice) - { - g_lpD3DDevice->Release(); - g_lpD3DDevice = NULL; - } - - // Destroy all surfaces - if (g_lpZBuffer) - { - g_lpZBuffer->Release(); - g_lpZBuffer = NULL; - } - - if (g_lpBackBuffer) - { - g_lpBackBuffer->Release(); - g_lpBackBuffer = NULL; - } - - if (g_lpPrimary) - { - g_lpPrimary->Release(); - g_lpPrimary = NULL; - } - - // Restore the original video mode - if(g_lpDD) - g_lpDD->RestoreDisplayMode(); - - // Destroy sounds - for (i = 0; i < NUM_SOUNDS; i ++) - { - if (g_lpSounds[i]) - { - g_lpSounds[i]->Release(); - g_lpSounds[i] = NULL; - } - } - - // Destroy DirectSound3D buffers - for (i = 0; i < NUM_SOUNDS; i ++) - { - if (g_lp3dSounds[i]) - { - g_lp3dSounds[i]->Release(); - g_lp3dSounds[i] = NULL; - } - } - - // Destroy DirectSound3D Listener object - if (g_lpDs3dListener) - { - g_lpDs3dListener->Release(); - g_lpDs3dListener = NULL; - } - // Destroy DirectSound3D Primary buffer - if (g_3DSoundBuffer) - { - g_3DSoundBuffer->Release(); - g_3DSoundBuffer = NULL; - } - - // Destroy DirectSound object - if (g_lpDS) - { - g_lpDS->Release(); - g_lpDS = NULL; - } - - // Destroy Direct3D RM object - if (g_lpD3DRM) - { - g_lpD3DRM->Release(); - g_lpD3DRM = NULL; - } - - // Destroy Direct3D object - if (g_lpD3D) - { - g_lpD3D->Release(); - g_lpD3D = NULL; - } - - // Destroy DirectDraw object - if (g_lpDD) - { - g_lpDD->Release(); - g_lpDD = NULL; - } -} - -//---------------------------------------------------------------------- -// -// Function : EnterVideoMode() -// -// Purpose : Calls EnterVideoModeWHBD with mode information -// -//---------------------------------------------------------------------- - -BOOL EnterVideoMode(int mode) -{ - int width = g_vidModes[mode].width; - int height = g_vidModes[mode].height; - int bitdepth = g_vidModes[mode].bpp; - g_dwCurrMode = mode; - - // Try to enter video mode described by width, height and bitdepth - return EnterVideoModeWHBD(width, height, bitdepth); -} - -//---------------------------------------------------------------------- -// -// Function : EnterVideoModeWHBD() -// -// Purpose : Switches video mode and creates all neccessary structures -// required for rendering -// -//---------------------------------------------------------------------- - -BOOL EnterVideoModeWHBD(int width, int height, int bitdepth) -{ - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - - // Destroy all existing viewports, devices and surfaces - - // Destroy Direct3D RM viewport - if (g_lpD3DRMViewport) - { - g_lpD3DRMViewport->Release(); - g_lpD3DRMViewport = NULL; - } - - // Destroy Direct3D RM device - if (g_lpD3DRMDevice) - { - g_lpD3DRMDevice->Release(); - g_lpD3DRMDevice = NULL; - } - - // Destroy Direct3D device - if (g_lpD3DDevice) - { - g_lpD3DDevice->Release(); - g_lpD3DDevice = NULL; - } - - // Destroy ZBuffer - if (g_lpZBuffer) - { - g_lpZBuffer->Release(); - g_lpZBuffer = NULL; - } - - // Destroy Primary surface - if (g_lpPrimary) - { - g_lpPrimary->Release(); - g_lpPrimary = NULL; - } - - // Switch video mode - TRY_DD(g_lpDD->SetDisplayMode(width, height, bitdepth)) - - // First, create complex flipping primary surface - - // Fill out surface description - memset(&ddsd, sizeof(DDSURFACEDESC), 0); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_3DDEVICE; - ddsd.dwBackBufferCount = 1; - - // Create the primary surface with 1 back buffer - TRY_DD(g_lpDD->CreateSurface(&ddsd, &g_lpPrimary, NULL)) - - // Get pointer to back buffer - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - TRY_DD(g_lpPrimary->GetAttachedSurface(&ddscaps, &g_lpBackBuffer)) - - // Only create a ZBuffer if g_dwZBufferBitDepth > 0 - if (g_dwZBufferBitDepth) - { - // Then, create Z-Buffer. The g_dwZBufferMemType and g_dwZBufferBitDepth variables - // are set up when the Direct3D device enumeration is done at runtime - memset(&ddsd, sizeof(DDSURFACEDESC), 0); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_ZBUFFERBITDEPTH;; - ddsd.dwWidth = width; - ddsd.dwHeight = height; - ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER | g_dwZBufferMemType; - ddsd.dwZBufferBitDepth = g_dwZBufferBitDepth; - - // Create the ZBuffer - TRY_DD(g_lpDD->CreateSurface(&ddsd, &g_lpZBuffer, NULL)) - - // Attach ZBuffer to the back buffer - TRY_DD(g_lpBackBuffer->AddAttachedSurface(g_lpZBuffer)) - } - - // Retrieve the caps of the primary surface - TRY_DD(g_lpPrimary->GetCaps(&ddscaps)) - - // Create and attach palette (only if we in 8-bit palettized colour modes) - if ((bitdepth == 8) && (ddscaps.dwCaps & DDCAPS_PALETTE)) - { - // Create the palette - TRY_DD(g_lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_INITIALIZE, g_rPal, &g_lpPalette, NULL)) - - // Set the back buffer's palette - TRY_DD(g_lpBackBuffer->SetPalette(g_lpPalette)) - - // Set the primary surface's palette - TRY_DD(g_lpPrimary->SetPalette(g_lpPalette)) - } - - // Create Direct3D device - TRY_D3D(g_lpBackBuffer->QueryInterface(*g_lpD3DDeviceGuid, (LPVOID *)&g_lpD3DDevice)) - - // Create Direct3D RM Device from Direct3D Device - TRY_D3DRM(g_lpD3DRM->CreateDeviceFromD3D(g_lpD3D, g_lpD3DDevice, &g_lpD3DRMDevice)) - - // Set the buffer count to 2 so D3DRM can keep track of extents for fullscreen flipping surface - TRY_D3DRM(g_lpD3DRMDevice->SetBufferCount(2)) - - // Render using gouraud shading - g_lpD3DRMDevice->SetQuality(D3DRMRENDER_GOURAUD); - - // And no dithering please (NOTE : dithering is for looks not speed!) - g_lpD3DRMDevice->SetDither(FALSE); - - // Set texture quality - g_lpD3DRMDevice->SetTextureQuality(D3DRMTEXTURE_NEAREST); - - // Set the number of shades for lighting - g_lpD3DRMDevice->SetShades(8); - - // Create RM viewport from device and camera (camera has already been initialised - // by InitScene() in RM.CPP) - TRY_D3DRM(g_lpD3DRM->CreateViewport(g_lpD3DRMDevice, - g_lpCamera, - 0, - 0, - width, - height, - &g_lpD3DRMViewport)) - - // Set the back clipping plane to be something fairly large - g_lpD3DRMViewport->SetBack(D3DVAL(30000.0f)); - - // Diddle with the lights depending on what driver we are using - switch (g_deviceInfo.cm) - { - case D3DCOLOR_MONO : - { - // Enable the directional light only to hit the players, not the arena - g_lpDir->SetEnableFrame(g_lpPlayers); - } - break; - - case D3DCOLOR_RGB : - { - // Enable the directional light to hit all objects - g_lpDir->SetEnableFrame(g_lpScene); - } - break; - } - - // Record video mode information - g_vidModeX = width; - g_vidModeY = height; - g_vidModeBIT = bitdepth; - - // And calculate values for the power bars - g_xratio = (float)width / 1000.0f; - g_yratio = (float)height / 1000.0f; - - g_lbar1 = (DWORD)(float)(50.0f * g_xratio); - g_wbar1 = (DWORD)(float)(400.0f * g_xratio); - g_lbar2 = (DWORD)(float)(550.0f * g_xratio); - g_wbar2 = g_wbar1; - g_hbar1 = (DWORD)(float)(30.0f * g_yratio); - g_hbar2 = (DWORD)(float)(20.0f * g_yratio); - - // Finally, calculate the height of the current font - HDC hDC; - hDC = ::GetDC(g_hWnd); - - TEXTMETRIC txtMetric; - GetTextMetrics(hDC, &txtMetric); - - ::ReleaseDC(g_hWnd, hDC); - - g_dwFontHeight = txtMetric.tmHeight; - g_dwAveCharWidth = txtMetric.tmAveCharWidth; - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : EnterPrevVideoMode() -// -// Purpose : Enters previous mode in vidModes[] -// -//---------------------------------------------------------------------- - -BOOL EnterPrevVideoMode() -{ - if (g_dwCurrMode > 0) - { - return EnterVideoMode(-- g_dwCurrMode); - } - - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : EnterNextVideoMode() -// -// Purpose : Enters nextmode in vidModes[] -// -//---------------------------------------------------------------------- - -BOOL EnterNextVideoMode() -{ - if (g_dwCurrMode < g_dwNumModes - 1) - { - return EnterVideoMode(++ g_dwCurrMode); - } - - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : EnterLowestVideoMode() -// -// Purpose : Enters lowest mode in vidModes[] -// -//---------------------------------------------------------------------- - -BOOL EnterLowestVideoMode() -{ - return EnterVideoMode(0); -} - -//---------------------------------------------------------------------- -// -// Function : EnterHighestVideoMode() -// -// Purpose : Enters highest mode in vidModes[] -// -//---------------------------------------------------------------------- - -BOOL EnterHighestVideoMode() -{ - return EnterVideoMode(g_dwNumModes - 1); -} - -//---------------------------------------------------------------------- -// -// Function : ReenterVideoMode() -// -// Purpose : Re-enters current video mode -// -//---------------------------------------------------------------------- - -BOOL ReenterCurrentVideoMode() -{ - return EnterVideoMode(g_dwCurrMode); -} - -//---------------------------------------------------------------------- -// -// Function : CleanUp() -// -// Purpose : Destroys all surfaces and rendering devices -// -//---------------------------------------------------------------------- - -void CleanUp() -{ - // Destroy everything in the reverse order that they were created - - // Destroy viewport - if (g_lpD3DRMViewport) - { - g_lpD3DRMViewport->Release(); - g_lpD3DRMViewport = NULL; - } - - // Destroy rendering devices - if (g_lpD3DRMDevice) - { - g_lpD3DRMDevice->Release(); - g_lpD3DRMDevice = NULL; - } - - if (g_lpD3DDevice) - { - g_lpD3DDevice->Release(); - g_lpD3DDevice = NULL; - } - - // Destroy all surfaces - if (g_lpZBuffer) - { - g_lpZBuffer->Release(); - g_lpZBuffer = NULL; - } - - if (g_lpBackBuffer) - { - g_lpBackBuffer->Release(); - g_lpBackBuffer = NULL; - } - - if (g_lpPrimary) - { - g_lpPrimary->Release(); - g_lpPrimary = NULL; - } - - // Destroy palette - if (g_lpPalette) - { - g_lpPalette->Release(); - g_lpPalette = NULL; - } - - // Restore the original video mode - g_lpDD->RestoreDisplayMode(); -} - -//---------------------------------------------------------------------- -// -// Function : DoSplashScreen() -// -// Purpose : Draws splash screen (if possible) -// -//---------------------------------------------------------------------- - -BOOL DoSplashScreen(DWORD delay) -{ - LPDIRECTDRAWSURFACE backbuffer = NULL; - DDSURFACEDESC ddsd; - DDSCAPS ddscaps; - HRESULT rval; - DWORD dwStart; - int i; - FILE *fp; - BYTE rgbs[768], scanbuf[640]; - void *lpSurf; - BYTE *pSurf; - DWORD dummy; - - delay; - - // Create a DirectDraw device - rval = DirectDrawCreate(NULL, &g_lpSplashDD, NULL); - if (rval != DD_OK) goto fail; - - // Set cooperative level - rval = g_lpSplashDD->SetCooperativeLevel(g_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); - if (rval != DD_OK) goto fail; - - // Attempt to enter 640x480x8 - // Switch video mode - rval = g_lpSplashDD->SetDisplayMode(640, 480, 8); - if (rval != DD_OK) goto fail; - - // Create complex flipping primary surface - - // Clear surface caps structure - memset(&ddscaps, 0, sizeof(DDSCAPS)); - - // Fill out surface description - memset(&ddsd, sizeof(DDSURFACEDESC), 0); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; - ddsd.dwBackBufferCount = 1; - - // Create the primary surface with 1 back buffer - rval = g_lpSplashDD->CreateSurface(&ddsd, &g_lpSplashPrimary, NULL); - if (rval != DD_OK) goto fail; - - // Get pointer to back buffer - ddscaps.dwCaps = DDSCAPS_BACKBUFFER; - rval = g_lpSplashPrimary->GetAttachedSurface(&ddscaps, &backbuffer); - if (rval != DD_OK) goto fail; - - // Open the splash screen file - fp = fopen("ROCKEM3D.BIN", "rb"); - if (!fp) goto fail; - - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - - // Lock the backbuffer to get a pointer to it - rval = backbuffer->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR, NULL); - if (rval != DD_OK) goto fail; - - // Read the image into the backbuffer - lpSurf = ddsd.lpSurface; - - // Read in lines of image, accounting for pitch - pSurf = (BYTE *)lpSurf; - - // Read first dword from .BIN file, that corresponds to WIDTH and HEIGHT (two words) - fread(&dummy, 4, 1, fp); - - for (i = 0; i < 480; i ++) - { - fread(scanbuf, 640, 1, fp); - memcpy(pSurf, scanbuf, 640); - pSurf += ddsd.lPitch; - } - - // Close the file - fclose(fp); - - // Unlock the surface - rval = backbuffer->Unlock(lpSurf); - if (rval != DD_OK) goto fail; - - // Set up the palette - fp = fopen("SPLASH.PAL", "rb"); - if (!fp) goto fail; - - fread(rgbs, 768, 1, fp); - fclose(fp); - - // Set up the PALETTEENTRY's from the 768 byte RGB array - PALETTEENTRY ppe[256]; - for (i = 0; i < 256; i ++) - { - ppe[i].peRed = rgbs[i * 3]; - ppe[i].peGreen = rgbs[(i * 3) + 1]; - ppe[i].peBlue = rgbs[(i * 3) + 2]; - ppe[i].peFlags = PC_NOCOLLAPSE; - } - - // Create the palette - //rval = g_lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_INITIALIZE, ppe, &g_lpPalette, NULL); - rval = g_lpSplashDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_INITIALIZE, ppe, &g_lpSplashPalette, NULL); - if (rval != DD_OK) goto fail; - - // Set the backbuffer's palette - rval = g_lpSplashPrimary->SetPalette(g_lpSplashPalette); - if (rval != DD_OK) goto fail; - - // And flip the splash screen into view - rval = g_lpSplashPrimary->Flip(NULL, DDFLIP_WAIT); - if (rval != DD_OK) goto fail; - - // Wait for delay milliseconds or a specific keypress - dwStart = timeGetTime(); - - while (timeGetTime() - dwStart < delay) - { - if (GetAsyncKeyState(VK_SPACE) & 0x8000) break; - if (GetAsyncKeyState(VK_RETURN) & 0x8000) break; - if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) break; - if ((GetAsyncKeyState(VK_MENU) & 0x8000) && (GetAsyncKeyState(VK_F4) & 0x8000)) break; - } - - backbuffer->Release(); - - // Yahoo! - return TRUE; - - fail: - - // Close file - if (fp) - { - fclose(fp); - } - - // Release palette - if (g_lpSplashPalette) - { - g_lpSplashPalette->Release(); - g_lpSplashPalette = NULL; - } - - // Release primary surface - if (g_lpSplashPrimary) - { - g_lpSplashPrimary->Release(); - g_lpSplashPrimary = NULL; - } - - if (g_lpSplashDD) - { - g_lpSplashDD->Release(); - g_lpSplashDD = NULL; - } - - // Yahoo! - return FALSE; -} - - -//---------------------------------------------------------------------- -// -// Function : ReleaseSplashScreen() -// -// Purpose : Releases the splash screen -// -//---------------------------------------------------------------------- - -void ReleaseSplashScreen() -{ - // Release palette - if (g_lpSplashPalette) - { - g_lpSplashPalette->Release(); - g_lpSplashPalette = NULL; - } - - // Release primary surface - if (g_lpSplashPrimary) - { - g_lpSplashPrimary->Release(); - g_lpSplashPrimary = NULL; - } - - if (g_lpSplashDD) - { - g_lpSplashDD->Release(); - g_lpSplashDD = NULL; - } -} - - -//---------------------------------------------------------------------- -// -// Function : RestoreSurfaces() -// -// Purpose : Restores all surfaces if they somehow got lost (Alt-Tab) -// -//---------------------------------------------------------------------- - -BOOL RestoreSurfaces() -{ - // Attempt to restore primary surface - if (g_lpPrimary) - { - if (g_lpPrimary->IsLost()) TRY_DD(g_lpPrimary->Restore()) - } - - // Attempt to restore zbuffer - if (g_lpZBuffer) - { - if (g_lpZBuffer->IsLost()) TRY_DD(g_lpZBuffer->Restore()) - } - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : CreateSoundBuffer() -// -// Purpose : Creates a DirectSound buffer -// -//---------------------------------------------------------------------- - -BOOL CreateSoundBuffer(DWORD dwBuf, DWORD dwBufSize, DWORD dwFreq, DWORD dwBitsPerSample, DWORD dwBlkAlign, BOOL bStereo) -{ - PCMWAVEFORMAT pcmwf; - DSBUFFERDESC dsbdesc; - - // Set up wave format structure. - memset( &pcmwf, 0, sizeof(PCMWAVEFORMAT) ); - pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM; - pcmwf.wf.nChannels = bStereo ? 2 : 1; - pcmwf.wf.nSamplesPerSec = dwFreq; - pcmwf.wf.nBlockAlign = (WORD)dwBlkAlign; - pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign; - pcmwf.wBitsPerSample = (WORD)dwBitsPerSample; - - // Set up DSBUFFERDESC structure. - memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); // Zero it out. - dsbdesc.dwSize = sizeof(DSBUFFERDESC); - dsbdesc.dwFlags = DSBCAPS_CTRL3D; // Needed creation flag for Direct 3D Sound - dsbdesc.dwBufferBytes = dwBufSize; - dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; - - TRY_DS(g_lpDS->CreateSoundBuffer(&dsbdesc, &g_lpSounds[dwBuf], NULL)) - - // Query for the 3D Sound Buffer interface. - TRY_DS(g_lpSounds[dwBuf]->QueryInterface(IID_IDirectSound3DBuffer, (void**) &g_lp3dSounds[dwBuf])); - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : ReadData() -// -// Purpose : Reads in data from a wave file -// -//---------------------------------------------------------------------- - -BOOL ReadData(LPDIRECTSOUNDBUFFER lpDSB, FILE* pFile, DWORD dwSize, DWORD dwPos) -{ - // Seek to correct position in file (if necessary) - if (dwPos != 0xffffffff) - { - if (fseek(pFile, dwPos, SEEK_SET) != 0) - { - return FALSE; - } - } - - // Lock data in buffer for writing - LPVOID pData1; - DWORD dwData1Size; - LPVOID pData2; - DWORD dwData2Size; - HRESULT rval; - - rval = lpDSB->Lock(0, dwSize, &pData1, &dwData1Size, &pData2, &dwData2Size, DSBLOCK_FROMWRITECURSOR); - if (rval != DS_OK) - { - return FALSE; - } - - // Read in first chunk of data - if (dwData1Size > 0) - { - if (fread(pData1, dwData1Size, 1, pFile) != 1) - { - char holder[256]; - wsprintf(holder,"Data1 : %d, dwdata: %d, pFile: %d",pData1,dwData1Size,pFile); - OutputDebugString(holder); - return FALSE; - } - } - - // read in second chunk if necessary - if (dwData2Size > 0) - { - if (fread(pData2, dwData2Size, 1, pFile) != 1) - { - return FALSE; - } - } - - // Unlock data in buffer - rval = lpDSB->Unlock(pData1, dwData1Size, pData2, dwData2Size); - if (rval != DS_OK) - { - return FALSE; - } - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : CreateSoundBufferFromWaveFile() -// -// Purpose : Creates a DirectSound buffer from a wave file -// -//---------------------------------------------------------------------- - -BOOL CreateBufferFromWaveFile(char* FileName, DWORD dwBuf) -{ - // Open the wave file - FILE* pFile = fopen(FileName,"rb"); - if (pFile == NULL) return FALSE; - - // Read in the wave header - WaveHeader wavHdr; - if (fread(&wavHdr, sizeof(wavHdr), 1, pFile) != 1) - { - fclose(pFile); - return NULL; - } - - // Figure out the size of the data region - DWORD dwSize = wavHdr.dwDSize; - - // Is this a stereo or mono file? - BOOL bStereo = wavHdr.wChnls > 1 ? TRUE : FALSE; - - // Create the sound buffer for the wave file - if (!CreateSoundBuffer(dwBuf, dwSize, wavHdr.dwSRate, wavHdr.BitsPerSample, wavHdr.wBlkAlign, bStereo)) - { - // Close the file - fclose(pFile); - - return FALSE; - } - - // Read the data for the wave file into the sound buffer - if (!ReadData(g_lpSounds[dwBuf], pFile, dwSize, sizeof(wavHdr))) - { - fclose(pFile); - return FALSE; - } - - // Close out the wave file - fclose(pFile); - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : StopAllSounds() -// -// Purpose : Stops all sounds -// -//---------------------------------------------------------------------- - -BOOL StopAllSounds() -{ - // Make sure we have a valid sound buffer - for (int i = 0; i < NUM_SOUNDS; i ++) - { - if (g_lpSounds[i]) - { - DWORD dwStatus; - TRY_DS(g_lpSounds[i]->GetStatus(&dwStatus)); - - if ((dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) - { - // Play the sound - TRY_DS(g_lpSounds[i]->Stop()) - } - } - } - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : PlaySoundDS() -// -// Purpose : Plays a sound using direct sound -// -// D3DVECTOR -//---------------------------------------------------------------------- - -BOOL PlaySoundDS(DWORD dwSound,D3DVECTOR d3dvPos, DWORD dwFlags) -{ - - if (g_bSoundPaused) return TRUE; - - if (!g_bSoundPresent) return TRUE; - - // Make sure the sound is valid - if (dwSound >= NUM_SOUNDS) return FALSE; - - // Make sure we have a valid sound buffer - if (g_lpSounds[dwSound]) - { - DWORD dwStatus; - TRY_DS(g_lpSounds[dwSound]->GetStatus(&dwStatus)); - - if ((dwStatus & DSBSTATUS_PLAYING) != DSBSTATUS_PLAYING) - { - // Set the 3D position of the sound, using supplied position vector. - TRY_DS(g_lp3dSounds[dwSound]->SetPosition(d3dvPos.x, d3dvPos.y, d3dvPos.z, DS3D_IMMEDIATE)); - // Play the sound - TRY_DS(g_lpSounds[dwSound]->Play(0, 0, dwFlags)); - } - } - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : RecalcPowerBars() -// -// Purpose : Calculates width of power bars based upon current -// screen resolution -// -//---------------------------------------------------------------------- - -void RecalcPowerBars(DWORD player1health, DWORD player2health) -{ - g_wbar1 = (DWORD)(float)((400.0f * ((float)player1health / 100.0f)) * g_xratio); - g_wbar2 = (DWORD)(float)((400.0f * ((float)player2health / 100.0f)) * g_xratio); -} - - - -//---------------------------------------------------------------------- -// -// Function : CreateSoundBuffer3D() -// -// Purpose : Creates a 3D sound buffer and returns the sound buffer -// -//---------------------------------------------------------------------- - -IDirectSoundBuffer *CreateSoundBuffer3D() -{ - IDirectSoundBuffer *pDSB = NULL; - DSBUFFERDESC dsBD = {0}; - - ZeroMemory( &dsBD, sizeof(DSBUFFERDESC)); - dsBD.dwSize = sizeof(dsBD); - dsBD.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; - dsBD.dwBufferBytes = 0; //must be zero for primary buffer.. - - if (g_lpDS->CreateSoundBuffer(&dsBD, &pDSB, NULL) != DS_OK) - pDSB = NULL; - - return pDSB; -} - -//---------------------------------------------------------------------- -// -// Function : PlayRandomWave() -// -// Purpose : Creates a random wave at a random spot -// -//---------------------------------------------------------------------- - -int CALLBACK PlayRandomWave() -{ - D3DVECTOR d3dPosition; // DSVECTOR used for the positon of the wave... - - int RandomWave[]={RANDOM1,RANDOM2,RANDOM3,RANDOM4,RANDOM5,RANDOM6}; - - g_lpCamera->GetPosition(g_lpScene, &d3dPosition); - // fill in the position generated for the wave file. - d3dPosition.x += (rand() % 2 == 0 ? (rand() % 250) : -(rand() % 250)); - d3dPosition.z += (rand() % 2 == 0 ? (rand() % 250) : -(rand() % 250)); - - PlaySoundDS(RandomWave[rand() % (sizeof(RandomWave) / sizeof(RandomWave[0]))],d3dPosition); - return TRUE; -} diff --git a/sdk/samples/rockem/directx.h b/sdk/samples/rockem/directx.h deleted file mode 100644 index 73ba9fb..0000000 --- a/sdk/samples/rockem/directx.h +++ /dev/null @@ -1,148 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: directx.h - * - ***************************************************************************/ - -#ifndef __DIRECTX_H_ -#define __DIRECTX_H_ - -// Includes.... -#include "d3drmwin.h" -#include "dsound.h" -#include "stdio.h" - -// Defines.... -#define NUM_SOUNDS 30 - -#define INTRO 0 -#define PLAYER1_PUNCH1 1 -#define PLAYER1_PUNCH2 2 -#define PLAYER2_PUNCH1 3 -#define PLAYER2_PUNCH2 4 -#define PLAYER1_WALK 5 -#define PLAYER2_WALK 6 -#define WHOOSH1 7 -#define WHOOSH2 8 -#define PLAYER1_OUCH 9 -#define PLAYER2_OUCH 10 -#define HEAD_SPRING 11 -#define BLOCK1 12 -#define BLOCK2 13 -#define BLOCK3 14 -#define VICTORY_BOO 15 -#define VICTORY_YEAH 16 -#define CROWD_LOOP 17 -#define SERVO_DOWN_1 18 -#define SERVO_DOWN_2 19 -#define SERVO_DOWN_3 20 -#define SERVO_UP_1 21 -#define SERVO_UP_2 22 -#define SERVO_UP_3 23 -#define RANDOM1 24 -#define RANDOM2 25 -#define RANDOM3 26 -#define RANDOM4 27 -#define RANDOM5 28 -#define RANDOM6 29 - -#define NUM_VID_MODES 50 - -// Macros - -// The following macros are used for proper error handling for DirectDraw, -// DirectSound, Direct3D and Direct3D retained mode -#define TRY_DD(exp) { { HRESULT rval = exp; if (rval != DD_OK) { TraceErrorDD(rval, __FILE__, __LINE__); return FALSE; } } } -#define TRY_DS(exp) { { HRESULT rval = exp; if (rval != DS_OK) { TraceErrorDS(rval, __FILE__, __LINE__); return FALSE; } } } -#define TRY_D3D(exp) { { HRESULT rval = exp; if (rval != D3D_OK) { TraceErrorD3D(rval, __FILE__, __LINE__); return FALSE; } } } -#define TRY_D3DRM(exp) { { HRESULT rval = exp; if (rval != D3DRM_OK) { TraceErrorD3DRM(rval, __FILE__, __LINE__); return FALSE; } } } - -// Structures.... -typedef struct _D3DDeviceInfo -{ - D3DCOLORMODEL cm; - LPGUID lpHWGuid; - D3DDEVICEDESC HWDeviceDesc; - LPGUID lpSWGuid; - D3DDEVICEDESC SWDeviceDesc; -} D3DDeviceInfo; - -#pragma pack(1) -struct WaveHeader -{ - BYTE RIFF[4]; // "RIFF" - DWORD dwSize; // Size of data to follow - BYTE WAVE[4]; // "WAVE" - BYTE fmt_[4]; // "fmt " - DWORD dw16; // 16 - WORD wOne_0; // 1 - WORD wChnls; // Number of Channels - DWORD dwSRate; // Sample Rate - DWORD BytesPerSec; // Sample Rate - WORD wBlkAlign; // 1 - WORD BitsPerSample; // Sample size - BYTE DATA[4]; // "DATA" - DWORD dwDSize; // Number of Samples -}; -#pragma pack() - -struct VideoMode -{ - int width; - int height; - int bpp; - BOOL bUsable; -}; - -// Prototypes.... - -// Error handling -void TraceErrorDD(HRESULT hErr, char *sFile, int nLine); -void TraceErrorDS(HRESULT hErr, char *sFile, int nLine); -void TraceErrorD3D(HRESULT hErr, char *sFile, int nLine); -void TraceErrorD3DRM(HRESULT hErr, char *sFile, int nLine); - -// Callbacks -BOOL FAR PASCAL DDEnumCallback(GUID FAR* lpGUID, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext); -HRESULT CALLBACK DDEnumDisplayModesCallback(LPDDSURFACEDESC pddsd, LPVOID Context); -HRESULT WINAPI D3DEnumDeviceCallBack(LPGUID lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, - LPD3DDEVICEDESC lpHWDesc, LPD3DDEVICEDESC lpHELDesc, LPVOID lpContext); - -// Initialisation -BOOL InitD3DDevice(); - -BOOL InitDirectX(); -BOOL SetDirectDrawExclusiveMode(); - -// Termination -void TermDirectX(); - -void SortDisplayModes(); - -BOOL EnterVideoMode(int mode); -BOOL EnterVideoModeWHBD(int width, int height, int bitdepth); -BOOL EnterNextVideoMode(); -BOOL EnterPrevVideoMode(); -BOOL EnterLowestVideoMode(); -BOOL EnterHighestVideoMode(); -BOOL ReenterCurrentVideoMode(); -void CleanUp(); - -BOOL DoSplashScreen(DWORD delay); -void ReleaseSplashScreen(); - -BOOL RestoreSurfaces(); - -BOOL CreateSoundBuffer(DWORD dwBuf, DWORD dwBufSize, DWORD dwFreq, DWORD dwBitsPerSample, DWORD dwBlkAlign, BOOL bStereo, BOOL bStaticBuf); -BOOL ReadData(LPDIRECTSOUNDBUFFER lpDSB, FILE* pFile, DWORD dwSize, DWORD dwPos); -BOOL CreateBufferFromWaveFile(char* FileName, DWORD dwBuf); -BOOL StopAllSounds(); -BOOL PlaySoundDS(DWORD dwSound, D3DVECTOR d3dvPos, DWORD dwFlags = 0); -IDirectSoundBuffer *CreateSoundBuffer3D(void); -int CALLBACK PlayRandomWave(void); -void RecalcPowerBars(DWORD player1health, DWORD player2health); - -#endif - diff --git a/sdk/samples/rockem/gdk_fill.ppm b/sdk/samples/rockem/gdk_fill.ppm deleted file mode 100644 index ddaa32a..0000000 --- a/sdk/samples/rockem/gdk_fill.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 64 -255 -üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüüüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘüôǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘǘüäüäüäüäüäüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäǘüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüäüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÜüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÜüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜüÔǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜǜüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄǜüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄüÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼üÄü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü¼ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü¼ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü´ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¬ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœü¤üœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœüœü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”üœü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”ü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒü”üŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒüŒü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„üŒü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü„ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ü|ütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütü|ütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütütülütülütülütülütülütülütülütülütülütülütülütülütülütülütülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülülüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdülüdülüdülüdülüdülüdülüdülüdülüdülüdülüdülüdülüdülüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdüdü\üdü\üdü\üdü\üdü\üdü\üdü\üdü\üdü\üdü\üdü\üdü\üdü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\ü\üTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTü\üTü\üTü\üTü\üTü\üTü\üTü\üTü\üTü\üTü\üTü\üTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüTüLüTüLüTüLüTüLüTüLüTüLüTüLüTüLüTüLüTüLüTüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüLüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüLüDüLüDüLüDüLüDüLüDüLüDüLüDüLüDüLüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDüDü<üDü<üDü<üDü<üDü<üDü<üDü<üDü<üDü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü<ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü<ü4ü<ü4ü<ü4ü<ü4ü<ü4ü<ü4ü<ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü4ü,ü4ü,ü4ü,ü4ü,ü4ü,ü4ü,ü4ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü,ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü,ü$ü,ü$ü,ü$ü,ü$ü,ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$ü$üü$üü$üü$üü$üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü üü üü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü ü üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü \ No newline at end of file diff --git a/sdk/samples/rockem/head.wav b/sdk/samples/rockem/head.wav deleted file mode 100644 index 711c9eb..0000000 Binary files a/sdk/samples/rockem/head.wav and /dev/null differ diff --git a/sdk/samples/rockem/intro.wav b/sdk/samples/rockem/intro.wav deleted file mode 100644 index f1c05e7..0000000 Binary files a/sdk/samples/rockem/intro.wav and /dev/null differ diff --git a/sdk/samples/rockem/makefile b/sdk/samples/rockem/makefile deleted file mode 100644 index fda903f..0000000 --- a/sdk/samples/rockem/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include d3dbld.mk diff --git a/sdk/samples/rockem/midi.cpp b/sdk/samples/rockem/midi.cpp deleted file mode 100644 index 8d0b8c7..0000000 --- a/sdk/samples/rockem/midi.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: midi.cpp - * - ***************************************************************************/ - -// Includes.... -#include "windows.h" -#include "midi.h" -#include "stdio.h" - -// Externals.... -extern HWND g_hWnd; - -//------------------------------------------------------------------ -// -// Function : PlayMidi() -// -// Purpose : Plays a midi file -// -//------------------------------------------------------------------ - -BOOL PlayMidi(char *sFileName) -{ - char buf[256]; - - sprintf(buf, "open %s type sequencer alias MUSIC", sFileName); - - if (mciSendString("close all", NULL, 0, NULL) != 0) - { - return(FALSE); - } - - if (mciSendString(buf, NULL, 0, NULL) != 0) - { - return(FALSE); - } - - if (mciSendString("play MUSIC from 0", NULL, 0, g_hWnd) != 0) - { - return(FALSE); - } - - // Yahoo! - return TRUE; -} - -//------------------------------------------------------------------ -// -// Function : PauseMidi() -// -// Purpose : Pauses midi file -// -//------------------------------------------------------------------ - -BOOL PauseMidi() -{ - // Pause if we're not already paused... - if (mciSendString("stop MUSIC", NULL, 0, NULL) != 0) - { - return(FALSE); - } - - - // Yahoo! - return TRUE; -} - -//------------------------------------------------------------------ -// -// Function : ResumeMidi() -// -// Purpose : Resumes playing of a midi file -// -//------------------------------------------------------------------ - -BOOL ResumeMidi() -{ - // Resume midi - if (mciSendString("play MUSIC notify", NULL, 0, g_hWnd) != 0) - { - return(FALSE); - } - - // Yahoo! - return TRUE; -} - -//------------------------------------------------------------------ -// -// Function : StopMidi -// -// Purpose : Stops a midi file playing -// -//------------------------------------------------------------------ - -BOOL StopMidi() -{ - if (mciSendString("close all", NULL, 0, NULL) != 0) - { - return(FALSE); - } - - // Yahoo! - return TRUE; -} - -//------------------------------------------------------------------ -// -// Function : ReplayMidi() -// -// Purpose : Replays a midi file -// -//------------------------------------------------------------------ - -BOOL ReplayMidi() -{ - // Replay midi - if (mciSendString("play MUSIC from 0 notify", NULL, 0, g_hWnd) != 0) - { - return(FALSE); - } - - // Yahoo! - return TRUE; -} - diff --git a/sdk/samples/rockem/midi.h b/sdk/samples/rockem/midi.h deleted file mode 100644 index 523fb41..0000000 --- a/sdk/samples/rockem/midi.h +++ /dev/null @@ -1,19 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: midi.h - * - ***************************************************************************/ - -#ifndef __MIDI_H -#define __MIDI_H - -BOOL PlayMidi(char *sFileName); -BOOL PauseMidi(); -BOOL ResumeMidi(); -BOOL StopMidi(); -BOOL ReplayMidi(); - -#endif - diff --git a/sdk/samples/rockem/msvc.mk b/sdk/samples/rockem/msvc.mk deleted file mode 100644 index c2f03d6..0000000 --- a/sdk/samples/rockem/msvc.mk +++ /dev/null @@ -1,40 +0,0 @@ -NAME = rockem3d -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - dsound.lib comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = control.obj directx.obj midi.obj rm.obj winmain.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -Ox -LOPT =-debug:none -ROPT = -!endif -RES = rockem3d.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/rockem/punch.wav b/sdk/samples/rockem/punch.wav deleted file mode 100644 index cf99981..0000000 Binary files a/sdk/samples/rockem/punch.wav and /dev/null differ diff --git a/sdk/samples/rockem/punch1.wav b/sdk/samples/rockem/punch1.wav deleted file mode 100644 index f0ff8ad..0000000 Binary files a/sdk/samples/rockem/punch1.wav and /dev/null differ diff --git a/sdk/samples/rockem/punch2.wav b/sdk/samples/rockem/punch2.wav deleted file mode 100644 index eaa2690..0000000 Binary files a/sdk/samples/rockem/punch2.wav and /dev/null differ diff --git a/sdk/samples/rockem/punch3.wav b/sdk/samples/rockem/punch3.wav deleted file mode 100644 index c4cedfc..0000000 Binary files a/sdk/samples/rockem/punch3.wav and /dev/null differ diff --git a/sdk/samples/rockem/punch4.wav b/sdk/samples/rockem/punch4.wav deleted file mode 100644 index 7db7faf..0000000 Binary files a/sdk/samples/rockem/punch4.wav and /dev/null differ diff --git a/sdk/samples/rockem/random1.wav b/sdk/samples/rockem/random1.wav deleted file mode 100644 index 0b808e5..0000000 Binary files a/sdk/samples/rockem/random1.wav and /dev/null differ diff --git a/sdk/samples/rockem/random2.wav b/sdk/samples/rockem/random2.wav deleted file mode 100644 index 4f7b4aa..0000000 Binary files a/sdk/samples/rockem/random2.wav and /dev/null differ diff --git a/sdk/samples/rockem/random3.wav b/sdk/samples/rockem/random3.wav deleted file mode 100644 index 8bb4a65..0000000 Binary files a/sdk/samples/rockem/random3.wav and /dev/null differ diff --git a/sdk/samples/rockem/random4.wav b/sdk/samples/rockem/random4.wav deleted file mode 100644 index 2a3a0fb..0000000 Binary files a/sdk/samples/rockem/random4.wav and /dev/null differ diff --git a/sdk/samples/rockem/random5.wav b/sdk/samples/rockem/random5.wav deleted file mode 100644 index 0317639..0000000 Binary files a/sdk/samples/rockem/random5.wav and /dev/null differ diff --git a/sdk/samples/rockem/random6.wav b/sdk/samples/rockem/random6.wav deleted file mode 100644 index 4cd138d..0000000 Binary files a/sdk/samples/rockem/random6.wav and /dev/null differ diff --git a/sdk/samples/rockem/readme.txt b/sdk/samples/rockem/readme.txt deleted file mode 100644 index 361c5b6..0000000 --- a/sdk/samples/rockem/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -Rockem 3D Sample Game ---------------------- - -This game demonstrates many of the features of Direct X, including DirectDraw, -Direct 3D & DirectSound. It also demonstrates DirectSound3D. -It is important to note that this game is not optimised for raw speed. It -is meant to give a clear demonstration of how the DirectX technologies can -be used. - -When you build this sample, it will create a rockem3d.exe file in either -the retail or debug subdirectories, depending on which version you built. -However, you must then copy the .exe up one directory to the Rockem sample -root (i.e. c:\dxsdk\sdk\samples\rockem). This is because rockem also needs -to find its .wav files and other resources from that dir. - -The commands which this game recognizes are listed on the opening screen. - - ESC - Quit - F1 - Camera side view - F2 - Camera behind view - F3 - Camera head view - F5 - Toggle stats - F6 - Go up a video mode - F7 - Go down a video mode - END - Highest video mode - HOME - Lowest video mode - Control - M - Toggle music - Control - S - Toggle sound - Control - Block - SpaceBar - Attack - Up Arrow - Move forward - Down Arrow - Move backwards diff --git a/sdk/samples/rockem/resource.h b/sdk/samples/rockem/resource.h deleted file mode 100644 index f3e43d3..0000000 --- a/sdk/samples/rockem/resource.h +++ /dev/null @@ -1,30 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: resource.h - * - ***************************************************************************/ - -#define IDR_ACCEL 104 -#define IDR_MENU 105 -#define IDI_ICON1 106 -#define IDI_ICON2 108 -#define ID_FILE_EXIT 40001 -#define ID_VIEW_640X480 40002 -#define ID_VIEW_640X400 40003 -#define ID_VIEW_320X240 40004 -#define ID_VIEW_320X200 40005 -#define ID_VIEW_FULLSCREEN 40006 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 111 -#define _APS_NEXT_COMMAND_VALUE 40007 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif - diff --git a/sdk/samples/rockem/revdn1.wav b/sdk/samples/rockem/revdn1.wav deleted file mode 100644 index b58f1a3..0000000 Binary files a/sdk/samples/rockem/revdn1.wav and /dev/null differ diff --git a/sdk/samples/rockem/revdn2.wav b/sdk/samples/rockem/revdn2.wav deleted file mode 100644 index ec19555..0000000 Binary files a/sdk/samples/rockem/revdn2.wav and /dev/null differ diff --git a/sdk/samples/rockem/revdn3.wav b/sdk/samples/rockem/revdn3.wav deleted file mode 100644 index 2840af1..0000000 Binary files a/sdk/samples/rockem/revdn3.wav and /dev/null differ diff --git a/sdk/samples/rockem/revup1.wav b/sdk/samples/rockem/revup1.wav deleted file mode 100644 index 6058df1..0000000 Binary files a/sdk/samples/rockem/revup1.wav and /dev/null differ diff --git a/sdk/samples/rockem/revup2.wav b/sdk/samples/rockem/revup2.wav deleted file mode 100644 index c33e3cf..0000000 Binary files a/sdk/samples/rockem/revup2.wav and /dev/null differ diff --git a/sdk/samples/rockem/revup3.wav b/sdk/samples/rockem/revup3.wav deleted file mode 100644 index 384aa59..0000000 Binary files a/sdk/samples/rockem/revup3.wav and /dev/null differ diff --git a/sdk/samples/rockem/rm.cpp b/sdk/samples/rockem/rm.cpp deleted file mode 100644 index 1bbcfd2..0000000 --- a/sdk/samples/rockem/rm.cpp +++ /dev/null @@ -1,426 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rm.cpp - * - ***************************************************************************/ - -// Includes.... -#include "rm.h" -#include "directx.h" -#include "mmsystem.h" -#include "stdio.h" -#include "control.h" - -// Globals.... -LPDIRECT3DRMFRAME g_lpScene = NULL; // Scene frame -LPDIRECT3DRMFRAME g_lpCamera = NULL; // Camera frame -LPDIRECT3DRMFRAME g_lpArena = NULL; // Arena frame -LPDIRECT3DRMFRAME g_lpBackground = NULL; // Background frame - -LPDIRECT3DRMFRAME g_lpPlayers = NULL; // Encapsulating frame -LPDIRECT3DRMFRAME g_lpPlayer1 = NULL; // Human player -LPDIRECT3DRMFRAME g_lpPlayer1HeadFrame = NULL;// Human player head frame -LPDIRECT3DRMANIMATIONSET g_lpPlayer1AnimSet = NULL;// Human player animation set -LPDIRECT3DRMFRAME g_lpPlayer2 = NULL; // Computer player -LPDIRECT3DRMFRAME g_lpPlayer2HeadFrame = NULL;// Computer player head frame -LPDIRECT3DRMANIMATIONSET g_lpPlayer2AnimSet = NULL;// Computer player animation set - -LPDIRECT3DRMFRAME g_lpTmp = NULL; // Temporary frame - -LPDIRECT3DRMLIGHT g_lpDir; // Global light frame - -LPDIRECT3DRMMESHBUILDER g_lpRedDebris = NULL; // Red debris model -LPDIRECT3DRMMESHBUILDER g_lpBlueDebris = NULL; // Blue debris model -Debris g_debris[NUM_DEBRIS]; // Debris - -LPDIRECT3DRMANIMATION g_lpAnim = NULL; // Intro anim - -// Timing stuff -D3DVALUE g_timingDelta = D3DVAL(0.0f); - -// Frame rate stuff -DWORD g_dwLastTime = 0; -DWORD g_dwCurTime = 0; -DWORD g_dwFpsTime = 0; -DWORD g_dwDeltaTime = 0; -DWORD g_dwFramesRendered = 0; -DWORD g_dwFps = 0; - -// Externals.... -extern BOOL g_bShowStats; // Defined in WINMAIN.CPP -extern BOOL g_bHardware3D; // Defined in DIRECTX.CPP -extern LPDIRECT3DRM g_lpD3DRM; // Defined in DIRECTX.CPP -extern LPDIRECT3DRMVIEWPORT g_lpD3DRMViewport; // Defined in DIRECTX.CPP -extern LPDIRECT3DRMDEVICE g_lpD3DRMDevice; // Defined in DIRECTX.CPP -extern LPDIRECTDRAWSURFACE g_lpPrimary; // Defined in DIRECTX.CPP -extern LPDIRECTDRAWSURFACE g_lpBackBuffer; // Defined in DIRECTX.CPP -extern LPDIRECTDRAWSURFACE g_lpZBuffer; // Defined in DIRECTX.CPP -extern DWORD g_vidModeX; // Defined in DIRECTX.CPP -extern DWORD g_vidModeY; // Defined in DIRECTX.CPP -extern DWORD g_vidModeBIT; // Defined in DIRECTX.CPP -extern DWORD g_dwFontHeight; // Defined in DIRECTX.CPP -extern DWORD g_dwAveCharWidth; // Defined in DIRECTX.CPP - -extern DWORD g_player1health; // Defined in CONTROL.CPP -extern DWORD g_player2health; // Defined in CONTROL.CPP - -extern DWORD g_lbar1; // Defined in DIRECTX.CPP -extern DWORD g_wbar1; // Defined in DIRECTX.CPP -extern DWORD g_lbar2; // Defined in DIRECTX.CPP -extern DWORD g_wbar2; // Defined in DIRECTX.CPP -extern DWORD g_hbar1; // Defined in DIRECTX.CPP -extern DWORD g_hbar2; // Defined in DIRECTX.CPP - -extern AnimArgs g_player1AnimArgs; -extern AnimArgs g_player2AnimArgs; - -//---------------------------------------------------------------------- -// -// Function : InitScene -// -// Purpose : Initialises Direct3D RM objects and loads scene for demo -// -//---------------------------------------------------------------------- - -BOOL InitScene() -{ - LPDIRECT3DRMLIGHT pAmb; - LPDIRECT3DRMFRAME pLight; - LPDIRECT3DRMMESHBUILDER pMeshBuilder; - - // Create the scene (parent) frame - TRY_D3DRM(g_lpD3DRM->CreateFrame(NULL, &g_lpScene)) - - // Create the camera (child of g_lpScene) - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpScene, &g_lpCamera)) - - // Create the arena frame - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpScene, &g_lpArena)) - - // Create the frame that encapsulates both players - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpScene, &g_lpPlayers)) - - // Create player frames - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpPlayers, &g_lpPlayer1)) - - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpPlayers, &g_lpPlayer2)) - - // Create temporary frame - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpScene, &g_lpTmp)) - - // Create lights and position in world - TRY_D3DRM(g_lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT, D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2), &pAmb)) - - TRY_D3DRM(g_lpD3DRM->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVAL(0.7), D3DVAL(0.7), D3DVAL(0.7), &g_lpDir)) - - // Create ambient light frame - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpScene, &pLight)) - - // Add the light to the frame - TRY_D3DRM(pLight->AddLight(pAmb)) - - // Release the light frame - pLight->Release(); - - // Create directional light frame - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpScene, &pLight)) - - // Set position and orientation of directional light - pLight->SetPosition(g_lpScene, D3DVAL(1000), D3DVAL(1000), D3DVAL(1000)); - pLight->SetOrientation(g_lpScene, D3DVAL(-1.0), D3DVAL(-1.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0)); - - // Add the light to the frame - TRY_D3DRM(pLight->AddLight(g_lpDir)) - - // Enable lights only for any object that is a child of g_lpPlayers - TRY_D3DRM(g_lpDir->SetEnableFrame(g_lpPlayers)) - - // Release the light frame - pLight->Release(); - - // Create mesh builder for arena - TRY_D3DRM(g_lpD3DRM->CreateMeshBuilder(&pMeshBuilder)) - - // Load the arena - TRY_D3DRM(pMeshBuilder->Load("ARENA.X", NULL, D3DRMLOAD_FROMFILE, LoadTextures, NULL)) - - // Make sure we use perspective correct! - pMeshBuilder->SetPerspective(TRUE); - - // Add the mesh to the scene - TRY_D3DRM(g_lpArena->AddVisual(pMeshBuilder)) - - g_lpArena->SetZbufferMode(D3DRMZBUFFER_DISABLE); - - // Release the mesh builder - pMeshBuilder->Release(); - - // Load player 1's model - TRY_D3DRM(g_lpD3DRM->CreateAnimationSet(&g_lpPlayer1AnimSet)) - - // Load the model and animation - TRY_D3DRM(g_lpPlayer1AnimSet->Load("SKMECH.X", NULL, D3DRMLOAD_FROMFILE, LoadTextures, NULL, g_lpPlayer1)) - - // Add animation callback for player 1 - g_player1AnimArgs.lpAnimSet = g_lpPlayer1AnimSet; - g_player1AnimArgs.time = D3DVAL(0); - TRY_D3DRM(g_lpPlayer1->AddMoveCallback(Player1AnimationCallback, NULL)) - - // Setup the initial position of player 1 - g_lpPlayer1->SetPosition(g_lpScene, D3DVAL(0), D3DVAL(0), D3DVAL(-200)); - - // Load player 2's model - TRY_D3DRM(g_lpD3DRM->CreateAnimationSet(&g_lpPlayer2AnimSet)) - - // Load the model and animation - TRY_D3DRM(g_lpPlayer2AnimSet->Load("DEMECH.X", NULL, D3DRMLOAD_FROMFILE, LoadTextures, NULL, g_lpPlayer2)) - - // Add animation callback for player 2 - g_player2AnimArgs.lpAnimSet = g_lpPlayer2AnimSet; - g_player2AnimArgs.time = D3DVAL(0); - TRY_D3DRM(g_lpPlayer2->AddMoveCallback(Player2AnimationCallback, NULL)) - - for (int i = 0; i < NUM_DEBRIS; i ++) - { - TRY_D3DRM(g_lpD3DRM->CreateFrame(g_lpPlayers, &g_debris[i].m_pFrame)) - - g_debris[i].m_bInUse = FALSE; - } - - // Load the red debris - TRY_D3DRM(g_lpD3DRM->CreateMeshBuilder(&g_lpRedDebris)) - - TRY_D3DRM(g_lpRedDebris->Load("debris_r.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL)) - - // Load the blue debris - TRY_D3DRM(g_lpD3DRM->CreateMeshBuilder(&g_lpBlueDebris)) - - TRY_D3DRM(g_lpBlueDebris->Load("debris_b.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL)) - - // Setup the initial position of player 2 - g_lpPlayer2->SetPosition(g_lpScene, D3DVAL(0), D3DVAL(0), D3DVAL(200)); - - // Create the intro path - TRY_D3DRM(g_lpD3DRM->CreateAnimation(&g_lpAnim)) - - // Setup the animation options - g_lpAnim->SetOptions(D3DRMANIMATION_OPEN | - D3DRMANIMATION_LINEARPOSITION | - D3DRMANIMATION_POSITION); - - // Add the starting position (as a keyframe) - g_lpAnim->AddPositionKey(D3DVAL(0), D3DVAL(200), D3DVAL(2000), D3DVAL(0)); - - // Add the ending position (as a keyframe) - g_lpAnim->AddPositionKey(D3DVAL(1), D3DVAL(700), D3DVAL(100), D3DVAL(0)); - - // Make the camera follow this animation - g_lpAnim->SetFrame(g_lpCamera); - - // Retrieve player 1 and player 2's head frames - LPDIRECT3DRMOBJECT tmp; - - TRY_D3DRM(g_lpD3DRM->GetNamedObject("x3ds_Head", &tmp)) - g_lpPlayer1HeadFrame = (LPDIRECT3DRMFRAME)tmp; - - TRY_D3DRM(g_lpD3DRM->GetNamedObject("x3ds_xHead", &tmp)) - g_lpPlayer2HeadFrame = (LPDIRECT3DRMFRAME)tmp; - - // Yahoo! - return TRUE; -} - -//---------------------------------------------------------------------- -// -// Function : TermScene -// -// Purpose : Destroys scene -// -//---------------------------------------------------------------------- - -void TermScene() -{ - // Destroy the scene frame - if (g_lpScene) - { - g_lpScene->Release(); - g_lpScene = NULL; - } - - // Destroy the animation sets - if (g_lpPlayer1AnimSet) - { - g_lpPlayer1AnimSet->Release(); - g_lpPlayer1AnimSet = NULL; - } - - if (g_lpPlayer2AnimSet) - { - g_lpPlayer2AnimSet->Release(); - g_lpPlayer2AnimSet = NULL; - } -} - -//---------------------------------------------------------------------- -// -// Function : RenderScene -// -// Purpose : Renders scene -// -//---------------------------------------------------------------------- - -BOOL RenderScene() -{ - static BOOL b = FALSE; - - // Verify both surfaces - if (!g_lpPrimary) return FALSE; - - if (!g_lpZBuffer) return FALSE; - - // Perform some timing stuff - g_dwCurTime = timeGetTime(); - g_dwDeltaTime = g_dwCurTime - g_dwLastTime; - g_dwLastTime = g_dwCurTime; - g_dwFpsTime += g_dwDeltaTime; - - // Move the scene - g_lpScene->Move(D3DVAL(g_dwDeltaTime)); - - if (b) { - b = FALSE; - TRY_D3DRM(g_lpD3DRMViewport->ForceUpdate(0, 0, g_vidModeX, g_vidModeY)) - } - - // Restore the primary surface if it has been lost - if (g_lpPrimary->IsLost()) - { - HRESULT rval = g_lpPrimary->Restore(); - if (rval != DD_OK) return TRUE; - TRY_D3DRM(g_lpD3DRMViewport->ForceUpdate(0, 0, g_vidModeX, g_vidModeY)) - b = TRUE; - } - - // Restore the ZBuffer if it has been lost - if (g_lpZBuffer->IsLost()) - { - HRESULT rval = g_lpZBuffer->Restore(); - if (rval != DD_OK) return TRUE; - TRY_D3DRM(g_lpD3DRMViewport->ForceUpdate(0, 0, g_vidModeX, g_vidModeY)) - } - - // Clear the viewport ready for rendering - TRY_D3DRM(g_lpD3DRMViewport->Clear()) - - // Render the scene - TRY_D3DRM(g_lpD3DRMViewport->Render(g_lpScene)) - - g_dwFramesRendered ++; - - // Show stats if necessary - if (g_bShowStats) - { - // String to hold stats - char sStats[256]; - - // If 2 seconds have elapsed, calculate the frame rate - if (g_dwFpsTime > 2000) - { - g_dwFps = g_dwFramesRendered / 2; - g_dwFramesRendered = 0; - g_dwFpsTime = 0; - } - - // Copy info into stat string - sprintf(sStats, "SX:%d, SY:%d, SBD:%d FPS:%d, %s", g_vidModeX, g_vidModeY, g_vidModeBIT, g_dwFps, g_bHardware3D ? "(H)" : "(S)"); - - // Get a DC to the backbuffer (very useful!) - HDC hDC; - g_lpBackBuffer->GetDC(&hDC); - if (!hDC) return FALSE; - - // Use TextOut to draw the text onto the surface - DWORD dwStringPixelWidth = strlen(sStats) * g_dwAveCharWidth; - - SetBkMode( hDC, TRANSPARENT ); - SetTextColor( hDC, RGB(255,255,255) ); - TextOut(hDC, (g_vidModeX >> 1) - (dwStringPixelWidth >> 1), g_vidModeY - g_dwFontHeight, sStats, strlen(sStats)); - - // Must release DC before calling Flip() - g_lpBackBuffer->ReleaseDC(hDC); - } - - // Draw the power bars - DDBLTFX ddBltFx; - memset(&ddBltFx, 0, sizeof(DDBLTFX)); - ddBltFx.dwSize = sizeof(DDBLTFX); - - RECT rcBar1 = { g_lbar1, g_hbar1, g_lbar1 + g_wbar1, g_hbar1 + g_hbar2 }; - RECT rcBar2 = { g_lbar2, g_hbar1, g_lbar2 + g_wbar2, g_hbar1 + g_hbar2 }; - - switch (g_vidModeBIT) - { - case 8 : ddBltFx.dwFillColor = 253; break; - case 16 : ddBltFx.dwFillColor = 1 << 4; break; - case 24 : ddBltFx.dwFillColor = 1 << 7; break; - } - if (g_player1health > 0) { - TRY_DD(g_lpBackBuffer->Blt(&rcBar1, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddBltFx)) - TRY_D3DRM(g_lpD3DRMViewport->ForceUpdate(rcBar1.left, rcBar1.top, rcBar1.right, rcBar1.bottom)) - } - - switch (g_vidModeBIT) - { - case 8 : ddBltFx.dwFillColor = 254; break; - case 16 : ddBltFx.dwFillColor = 1 << 5 << 5 << 4; break; - case 24 : ddBltFx.dwFillColor = 1 << 8 << 8 << 7; break; - } - if (g_player2health > 0) { - TRY_DD(g_lpBackBuffer->Blt(&rcBar2, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddBltFx)) - TRY_D3DRM(g_lpD3DRMViewport->ForceUpdate(rcBar2.left, rcBar2.top, rcBar2.right, rcBar2.bottom)) - } - - // And update the device - TRY_D3DRM(g_lpD3DRMDevice->Update()) - - // Finally, flip the back buffer onto the primary surface, displaying - // the last rendered frame - TRY_DD(g_lpPrimary->Flip(NULL, DDFLIP_WAIT)) - - // Yahoo! - return TRUE; -} - -//------------------------------------------------------------------ -// -// Function : LoadTextures -// -// Purpose : Loads an individual texture -// -// NOTE : Textures must have a size divisible by 2 (e.g. 128x64, 256x256) -// -//------------------------------------------------------------------ - -HRESULT LoadTextures(char *sName, void *pArg, LPDIRECT3DRMTEXTURE *hTexture) -{ - char *sTmpName = sName; - - // Find the extension - while(sTmpName[0] != '.') sTmpName ++; - - // Add .ppm to the picture file used by 3D Studio (.TGA, .GIF, .CEL etc) - strcpy(sTmpName, ".ppm"); - - // Load the texture - if (FAILED(g_lpD3DRM->LoadTexture(sName, hTexture))) return -1; - - if (!strcmp(sName, "gdk_fill.ppm")) - { - (*hTexture)->SetShades(1); - } - - return 0; -} - diff --git a/sdk/samples/rockem/rm.h b/sdk/samples/rockem/rm.h deleted file mode 100644 index 81499b5..0000000 --- a/sdk/samples/rockem/rm.h +++ /dev/null @@ -1,40 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rm.h - * - ***************************************************************************/ - -#ifndef __RM_H_ -#define __RM_H_ - -// Includes.... -#include "d3drmwin.h" - -// Defines.... -#define NUM_DEBRIS 25 -#define DEBRIS_LIFE 75 -#define NUM_HIT_DEBRIS 4 - -// Structures -struct Debris -{ - LPDIRECT3DRMFRAME m_pFrame; - LPDIRECT3DRMMESHBUILDER m_pMeshBuilder; - BOOL m_bInUse; - D3DVECTOR m_vel; - D3DVECTOR m_acc; - int m_life; -}; - -// Prototypes.... -BOOL InitScene(); -void TermScene(); - -BOOL RenderScene(); - -HRESULT LoadTextures(char *sName, void *pArg, LPDIRECT3DRMTEXTURE *hTexture); - -#endif - diff --git a/sdk/samples/rockem/rockem3d.bin b/sdk/samples/rockem/rockem3d.bin deleted file mode 100644 index a2f52af..0000000 Binary files a/sdk/samples/rockem/rockem3d.bin and /dev/null differ diff --git a/sdk/samples/rockem/rockem3d.ico b/sdk/samples/rockem/rockem3d.ico deleted file mode 100644 index 69c67aa..0000000 Binary files a/sdk/samples/rockem/rockem3d.ico and /dev/null differ diff --git a/sdk/samples/rockem/rockem3d.mid b/sdk/samples/rockem/rockem3d.mid deleted file mode 100644 index b111a02..0000000 Binary files a/sdk/samples/rockem/rockem3d.mid and /dev/null differ diff --git a/sdk/samples/rockem/rockem3d.pal b/sdk/samples/rockem/rockem3d.pal deleted file mode 100644 index 0da6e81..0000000 Binary files a/sdk/samples/rockem/rockem3d.pal and /dev/null differ diff --git a/sdk/samples/rockem/rockem3d.rc b/sdk/samples/rockem/rockem3d.rc deleted file mode 100644 index 0e1599d..0000000 --- a/sdk/samples/rockem/rockem3d.rc +++ /dev/null @@ -1,34 +0,0 @@ -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Microsoft Inc.\0" - VALUE "FileDescription", "RockEm3D\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "RockEm3D\0" - VALUE "LegalCopyright", "Copyright © 1996\0" - VALUE "OriginalFilename", "RockEm3D.exe\0" - VALUE "ProductName", "Microsoft RockEm '3D\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -ROCKEM3D ICON DISCARDABLE "rockem3d.ico" diff --git a/sdk/samples/rockem/skmech.x b/sdk/samples/rockem/skmech.x deleted file mode 100644 index 1d7aa99..0000000 --- a/sdk/samples/rockem/skmech.x +++ /dev/null @@ -1,3565 +0,0 @@ -xof 0302txt 0064 -template Header { - <3D82AB43-62DA-11cf-AB39-0020AF71E433> - WORD major; - WORD minor; - DWORD flags; -} - -template Vector { - <3D82AB5E-62DA-11cf-AB39-0020AF71E433> - FLOAT x; - FLOAT y; - FLOAT z; -} - -template Coords2d { - - FLOAT u; - FLOAT v; -} - -template Matrix4x4 { - - array FLOAT matrix[16]; -} - -template ColorRGBA { - <35FF44E0-6C7C-11cf-8F52-0040333594A3> - FLOAT red; - FLOAT green; - FLOAT blue; - FLOAT alpha; -} - -template ColorRGB { - - FLOAT red; - FLOAT green; - FLOAT blue; -} - -template IndexedColor { - <1630B820-7842-11cf-8F52-0040333594A3> - DWORD index; - ColorRGBA indexColor; -} - -template Boolean { - <4885AE61-78E8-11cf-8F52-0040333594A3> - WORD truefalse; -} - -template Boolean2d { - <4885AE63-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template MaterialWrap { - <4885AE60-78E8-11cf-8F52-0040333594A3> - Boolean u; - Boolean v; -} - -template TextureFilename { - - STRING filename; -} - -template Material { - <3D82AB4D-62DA-11cf-AB39-0020AF71E433> - ColorRGBA faceColor; - FLOAT power; - ColorRGB specularColor; - ColorRGB emissiveColor; - [...] -} - -template MeshFace { - <3D82AB5F-62DA-11cf-AB39-0020AF71E433> - DWORD nFaceVertexIndices; - array DWORD faceVertexIndices[nFaceVertexIndices]; -} - -template MeshFaceWraps { - <4885AE62-78E8-11cf-8F52-0040333594A3> - DWORD nFaceWrapValues; - Boolean2d faceWrapValues; -} - -template MeshTextureCoords { - - DWORD nTextureCoords; - array Coords2d textureCoords[nTextureCoords]; -} - -template MeshMaterialList { - - DWORD nMaterials; - DWORD nFaceIndexes; - array DWORD faceIndexes[nFaceIndexes]; - [Material] -} - -template MeshNormals { - - DWORD nNormals; - array Vector normals[nNormals]; - DWORD nFaceNormals; - array MeshFace faceNormals[nFaceNormals]; -} - -template MeshVertexColors { - <1630B821-7842-11cf-8F52-0040333594A3> - DWORD nVertexColors; - array IndexedColor vertexColors[nVertexColors]; -} - -template Mesh { - <3D82AB44-62DA-11cf-AB39-0020AF71E433> - DWORD nVertices; - array Vector vertices[nVertices]; - DWORD nFaces; - array MeshFace faces[nFaces]; - [...] -} - -template FrameTransformMatrix { - - Matrix4x4 frameMatrix; -} - -template Frame { - <3D82AB46-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template FloatKeys { - <10DD46A9-775B-11cf-8F52-0040333594A3> - DWORD nValues; - array FLOAT values[nValues]; -} - -template TimedFloatKeys { - - DWORD time; - FloatKeys tfkeys; -} - -template AnimationKey { - <10DD46A8-775B-11cf-8F52-0040333594A3> - DWORD keyType; - DWORD nKeys; - array TimedFloatKeys keys[nKeys]; -} - -template AnimationOptions { - - DWORD openclosed; - DWORD positionquality; -} - -template Animation { - <3D82AB4F-62DA-11cf-AB39-0020AF71E433> - [...] -} - -template AnimationSet { - <3D82AB50-62DA-11cf-AB39-0020AF71E433> - [Animation] -} - -Header { - 1; - 0; - 1; -} - -Material x3ds_mat_BLUEPLASTIC { - 0.043137, 0.152941, 0.650980, 1.000000;; - 23.600000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; -} -Material x3ds_mat_01MECHHAND { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHHN.GIF"; - } -} -Material x3ds_mat_02MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHLA.GIF"; - } -} -Material x3ds_mat_01GROIN { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHGR.GIF"; - } -} -Material x3ds_mat_02MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHLL.GIF"; - } -} -Material x3ds_mat_01MECHLEG { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHUL.GIF"; - } -} -Material x3ds_mat_01HEAD { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHJD.GIF"; - } -} -Material x3ds_mat_01BACK { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHBK.GIF"; - } -} -Material x3ds_mat_01MECHARM { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.599998; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHUA.GIF"; - } -} -Material x3ds_mat_01CHEST { - 1.000000, 1.000000, 1.000000, 1.000000;; - 30.400000; - 1.00, 1.00, 1.00;; - 0.00, 0.00, 0.00;; - TextureFilename { - "SKMECHCH.GIF"; - } -} - -Frame x3ds_Groin { - FrameTransformMatrix { - 1.000000, -0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, -1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 0.000000, 35.534382, 1.024473, 1.000000;; - } - Mesh Groin { - - 31; - -2.000034; -0.000005; -10.091249;, - -0.555553; -0.000005; -10.091249;, - 1.666685; -0.000005; -10.091249;, - -1.192545; -7.018517; -6.581245;, - -3.066506; -0.638034; -6.581247;, - -2.555454; 5.104384; -6.581249;, - -0.851815; 7.018556; -6.581249;, - 0.851807; 7.018508; -6.581249;, - 1.192535; -7.018472; -6.581245;, - -2.333362; -11.356157; 3.071276;, - -6.000068; -1.032373; 3.071294;, - -5.000067; 8.258990; 3.071271;, - -1.666681; 11.356154; 3.071271;, - 1.666685; 11.356246; 3.071271;, - 5.000068; 8.259124; 3.071271;, - 6.000000; -1.032373; 3.071272;, - 2.333369; -11.356207; 3.071276;, - -7.000064; -10.455878; 5.703798;, - -17.999998; -1.012086; 5.703774;, - -15.000135; 7.487373; 5.703794;, - -5.000067; 10.320599; 5.703794;, - 15.000135; 7.487417; 5.703794;, - 17.999998; -1.012087; 5.703772;, - 7.000072; -10.455922; 5.703798;, - -5.833400; -8.955488; 10.091302;, - -15.000134; -0.814139; 10.091294;, - -12.499999; 6.513080; 10.091298;, - -4.166667; 8.955393; 10.091298;, - 12.500135; 6.513032; 10.091298;, - 15.000135; -0.814141; 10.091298;, - 5.833403; -8.955536; 10.091299;; - - 53; - 3;1,4,0;, - 3;1,3,4;, - 3;0,5,1;, - 3;0,4,5;, - 3;1,5,6;, - 3;1,7,2;, - 3;1,6,7;, - 3;2,3,1;, - 3;2,8,3;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,12,6;, - 3;5,11,12;, - 3;6,13,7;, - 3;6,12,13;, - 3;7,13,14;, - 3;7,15,2;, - 3;7,14,15;, - 3;2,16,8;, - 3;2,15,16;, - 3;8,9,3;, - 3;8,16,9;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,20,13;, - 3;13,21,14;, - 3;14,22,15;, - 3;14,21,22;, - 3;15,23,16;, - 3;15,22,23;, - 3;16,17,9;, - 3;16,23,17;, - 3;17,25,18;, - 3;17,24,25;, - 3;18,26,19;, - 3;18,25,26;, - 3;19,27,20;, - 3;19,26,27;, - 3;20,27,13;, - 3;13,28,21;, - 3;13,27,28;, - 3;21,29,22;, - 3;21,28,29;, - 3;22,30,23;, - 3;22,29,30;, - 3;23,24,17;, - 3;23,30,24;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01GROIN} - } - MeshNormals { - 64; - -0.000000;-0.983877;-0.178844;, - -0.599572;0.408149;-0.688424;, - -0.560307;-0.381698;-0.735093;, - 0.000000;0.508170;-0.861257;, - -0.000000;-0.447290;-0.894389;, - 0.559687;0.421739;-0.713363;, - -0.000000;-0.447290;-0.894389;, - 0.937160;-0.239286;-0.253915;, - -0.880351;-0.277520;-0.384663;, - 0.000009;-0.721590;-0.692320;, - -0.680092;-0.595592;-0.427487;, - -0.956486;0.091041;-0.277212;, - -0.776351;0.298631;-0.555067;, - -0.612329;0.585592;-0.531163;, - -0.595763;0.530237;-0.603254;, - 0.000020;0.721585;-0.692326;, - 0.573074;0.533170;-0.622347;, - 0.634858;0.683287;-0.360657;, - 0.000014;-0.721592;-0.692319;, - 0.969727;-0.158439;-0.185813;, - -0.603915;-0.361813;-0.710196;, - 0.000004;-0.998923;-0.046402;, - -0.776502;-0.254344;-0.576501;, - -0.537039;0.077572;-0.839983;, - -0.815733;0.081073;-0.572719;, - -0.490500;0.710156;-0.505063;, - -0.643035;0.648313;-0.407671;, - -0.000027;0.999717;-0.023792;, - -0.010253;0.995713;0.091927;, - 0.398539;0.900274;-0.175139;, - 0.488511;0.525776;-0.696359;, - 0.507328;0.077991;-0.858217;, - 0.768552;0.139116;-0.624480;, - 0.584865;-0.268944;-0.765246;, - 0.845605;-0.234038;-0.479769;, - -0.000011;-0.998923;-0.046406;, - -0.654640;-0.753300;0.063125;, - -0.000010;-0.946205;0.323569;, - -0.582828;-0.600451;-0.547512;, - -0.943651;0.328187;0.042606;, - -0.654989;0.198844;-0.729006;, - -0.275500;0.960845;0.029596;, - -0.400693;0.869473;-0.288898;, - -0.014416;0.942382;0.334229;, - 0.328384;0.846238;-0.419578;, - 0.943441;0.328185;0.047052;, - 0.657040;0.204764;-0.725514;, - 0.655845;-0.753077;-0.052365;, - 0.593011;-0.504799;-0.627309;, - -0.000003;-0.946197;0.323591;, - -0.609542;-0.686312;0.396779;, - -0.000003;-0.946203;0.323573;, - -0.598574;-0.685369;0.414704;, - -0.799848;0.272917;0.534565;, - -0.802248;0.278457;0.528072;, - -0.263482;0.899018;0.349777;, - -0.132000;0.918501;0.372736;, - -0.028788;0.952884;0.301965;, - 0.168538;0.913545;0.370176;, - 0.807613;0.275554;0.521374;, - 0.802809;0.278602;0.527141;, - 0.596840;-0.672007;0.438393;, - 0.597512;-0.684374;0.417866;, - -0.000004;-0.946204;0.323571;; - 53; - 3;2,10,0;, - 3;2,8,10;, - 3;1,12,3;, - 3;1,11,12;, - 3;2,13,14;, - 3;3,16,5;, - 3;3,15,16;, - 3;6,9,4;, - 3;6,18,9;, - 3;8,22,10;, - 3;8,20,22;, - 3;11,24,12;, - 3;11,23,24;, - 3;13,26,14;, - 3;13,25,26;, - 3;15,28,16;, - 3;15,27,28;, - 3;17,29,30;, - 3;16,32,5;, - 3;16,31,32;, - 3;7,34,19;, - 3;7,33,34;, - 3;18,21,9;, - 3;18,35,21;, - 3;20,38,22;, - 3;20,36,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,43,28;, - 3;29,44,30;, - 3;31,46,32;, - 3;31,45,46;, - 3;33,48,34;, - 3;33,47,48;, - 3;35,37,21;, - 3;35,49,37;, - 3;36,52,38;, - 3;36,50,52;, - 3;39,54,40;, - 3;39,53,54;, - 3;41,56,42;, - 3;41,55,56;, - 3;43,57,28;, - 3;29,58,44;, - 3;29,56,58;, - 3;45,60,46;, - 3;45,59,60;, - 3;47,62,48;, - 3;47,61,62;, - 3;49,51,37;, - 3;49,63,51;; - } - MeshTextureCoords { - 31; - 0.546412;0.933469;, - 0.511654;0.933469;, - 0.458180;0.933469;, - 0.526982;0.782985;, - 0.572075;0.782985;, - 0.559777;0.782985;, - 0.518783;0.782985;, - 0.477788;0.782985;, - 0.469589;0.782985;, - 0.554433;0.369152;, - 0.642665;0.369151;, - 0.618602;0.369152;, - 0.538391;0.369152;, - 0.458180;0.369152;, - 0.377969;0.369152;, - 0.353907;0.369152;, - 0.442138;0.369152;, - 0.666728;0.256288;, - 0.931421;0.256289;, - 0.859233;0.256288;, - 0.618602;0.256288;, - 0.137338;0.256288;, - 0.065150;0.256289;, - 0.329843;0.256288;, - 0.638654;0.068183;, - 0.859233;0.068183;, - 0.799074;0.068183;, - 0.598548;0.068183;, - 0.197495;0.068183;, - 0.137338;0.068183;, - 0.357917;0.068183;; - } - } - - Frame x3ds_Chest { - FrameTransformMatrix { - 1.000000, 0.000000, 0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.426950, 1.024469, 11.366162, 1.000000;; - } - Mesh Chest { - - 40; - -5.406384; -9.499996; -0.774913;, - -14.573050; -1.772723; -0.774910;, - -12.073050; 5.181822; -0.774907;, - -3.739717; 7.500004; -0.774907;, - 4.593616; 7.500004; -0.774907;, - 12.926949; 5.181822; -0.774910;, - 15.426949; -1.772723; -0.774914;, - 6.260283; -9.499996; -0.774913;, - -8.859015; -15.499998; 25.225092;, - -23.451246; -1.491749; 25.225090;, - -19.471548; 11.115673; 25.225096;, - -6.205883; 15.318148; 25.225096;, - 7.059781; 15.318148; 25.225096;, - 20.325445; 11.115673; 25.225096;, - 24.305143; -1.491749; 25.225090;, - 9.712914; -15.499998; 25.225092;, - -10.054240; -15.499997; 34.225082;, - -33.573051; -1.863631; 34.225082;, - -22.032743; 10.409095; 34.225082;, - -7.059614; 14.500003; 34.225082;, - 7.913515; 14.500003; 34.225082;, - 22.886644; 10.409095; 34.225082;, - 34.426949; -1.863631; 34.225082;, - 10.908140; -15.499997; 34.225082;, - -10.850827; -11.500252; 40.225082;, - -31.573050; -2.106038; 41.225090;, - -23.739717; 8.348755; 42.225098;, - -7.628605; 9.167019; 40.225098;, - 8.482507; 9.167019; 40.225098;, - 24.593618; 8.348755; 42.225090;, - 32.426949; -2.106038; 41.225090;, - 11.704728; -11.500252; 40.225082;, - -8.517495; -9.499994; 43.225082;, - -18.573050; -2.227266; 43.225090;, - -14.573050; 4.318189; 43.225098;, - -5.961939; 6.500007; 43.225098;, - 6.815839; 6.500007; 43.225090;, - 15.426950; 4.318189; 43.225090;, - 19.426950; -2.227266; 43.225090;, - 9.371394; -9.499994; 43.225082;; - - 70; - 3;0,9,1;, - 3;1,9,2;, - 3;0,8,9;, - 3;9,10,2;, - 3;2,11,3;, - 3;2,10,11;, - 3;3,12,4;, - 3;3,11,12;, - 3;4,13,5;, - 3;4,12,13;, - 3;5,14,6;, - 3;5,13,14;, - 3;6,15,7;, - 3;6,14,15;, - 3;7,8,0;, - 3;7,15,8;, - 3;8,17,9;, - 3;8,16,17;, - 3;9,18,10;, - 3;9,17,18;, - 3;10,19,11;, - 3;10,18,19;, - 3;11,20,12;, - 3;11,19,20;, - 3;12,21,13;, - 3;12,20,21;, - 3;13,22,14;, - 3;13,21,22;, - 3;14,23,15;, - 3;14,22,23;, - 3;15,16,8;, - 3;15,23,16;, - 3;16,25,17;, - 3;16,24,25;, - 3;17,26,18;, - 3;17,25,26;, - 3;18,27,19;, - 3;18,26,27;, - 3;19,28,20;, - 3;19,27,28;, - 3;20,29,21;, - 3;20,28,29;, - 3;21,30,22;, - 3;21,29,30;, - 3;22,31,23;, - 3;22,30,31;, - 3;23,24,16;, - 3;23,31,24;, - 3;24,33,25;, - 3;24,32,33;, - 3;25,34,26;, - 3;25,33,34;, - 3;26,35,27;, - 3;26,34,35;, - 3;27,36,28;, - 3;27,35,36;, - 3;28,37,29;, - 3;28,36,37;, - 3;29,38,30;, - 3;29,37,38;, - 3;30,39,31;, - 3;30,38,39;, - 3;31,32,24;, - 3;31,39,32;, - 3;37,39,38;, - 3;36,39,37;, - 3;36,32,39;, - 3;35,32,36;, - 3;35,33,32;, - 3;34,33,35;; - MeshMaterialList { - 2; - 70; - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_01BACK} - {x3ds_mat_01CHEST} - } - MeshNormals { - 88; - -0.650995;-0.723751;-0.228890;, - 0.000000;-0.974391;-0.224860;, - -0.630534;-0.747987;-0.207225;, - -0.894967;0.321720;-0.309080;, - -0.899082;0.303417;-0.315579;, - -0.272342;0.915691;-0.295533;, - -0.255614;0.918875;-0.300549;, - 0.000000;0.957642;-0.287961;, - 0.000000;0.957642;-0.287961;, - 0.272548;0.916640;-0.292383;, - 0.256974;0.923763;-0.283949;, - 0.899082;0.303417;-0.315579;, - 0.894967;0.321720;-0.309080;, - 0.649687;-0.721872;-0.238346;, - 0.623476;-0.739614;-0.253474;, - 0.000000;-0.974391;-0.224860;, - -0.592597;-0.735803;-0.327753;, - 0.000000;-0.993577;-0.113156;, - -0.627516;-0.684776;-0.370547;, - -0.846659;0.369049;-0.383368;, - -0.915063;0.288852;-0.281468;, - -0.288159;0.954384;-0.078204;, - -0.286130;0.941081;-0.180268;, - -0.000000;0.994932;-0.100550;, - 0.000000;0.994932;-0.100550;, - 0.288029;0.953917;-0.084156;, - 0.284948;0.937354;-0.200430;, - 0.805421;0.413325;-0.424806;, - 0.840105;0.278624;-0.465394;, - 0.612424;-0.738201;-0.282836;, - 0.664713;-0.722563;-0.189894;, - 0.000000;-0.993577;-0.113156;, - -0.460440;-0.868344;0.184319;, - 0.000000;-0.957096;0.289770;, - -0.546338;-0.811570;-0.207047;, - -0.753038;0.645392;-0.128076;, - -0.789210;0.537054;-0.297861;, - -0.169555;0.935537;0.309874;, - -0.269038;0.931504;0.244784;, - -0.000000;0.917665;0.397355;, - 0.000000;0.917665;0.397355;, - 0.167433;0.931814;0.322007;, - 0.275612;0.957904;0.080362;, - 0.753370;0.657303;0.019667;, - 0.778010;0.578988;-0.243874;, - 0.468713;-0.883303;0.009149;, - 0.573798;-0.817112;-0.055524;, - -0.000000;-0.957096;0.289770;, - -0.309902;-0.616721;0.723613;, - 0.000000;-0.832067;0.554676;, - -0.357822;-0.755836;0.548339;, - -0.413278;0.254886;0.874205;, - -0.677530;0.516275;0.523844;, - -0.005950;0.707002;0.707186;, - -0.061460;0.847479;0.527259;, - -0.000000;0.747432;0.664339;, - 0.000000;0.747432;0.664339;, - 0.013296;0.633065;0.773985;, - 0.045031;0.769592;0.636946;, - 0.446324;0.289292;0.846821;, - 0.686668;0.532100;0.495334;, - 0.318002;-0.685018;0.655458;, - 0.392151;-0.818553;0.419747;, - 0.000000;-0.832067;0.554676;, - -0.415209;-0.574084;0.705712;, - 0.000000;-0.832017;0.554750;, - 0.000000;-0.000000;1.000000;, - -0.283804;-0.500875;0.817667;, - -0.150574;0.092016;0.984307;, - 0.000000;-0.000001;1.000000;, - -0.131964;0.040870;0.990412;, - -0.039366;0.155367;0.987072;, - 0.000000;-0.000001;1.000000;, - 0.001540;0.487185;0.873297;, - 0.000000;0.747367;0.664412;, - 0.000001;-0.000001;1.000000;, - 0.000000;0.747366;0.664413;, - 0.173828;0.686055;0.706479;, - -0.000000;-0.000000;1.000000;, - 0.042888;0.569361;0.820968;, - 0.085553;0.052282;0.994961;, - -0.000001;-0.000000;1.000000;, - 0.118785;0.035793;0.992275;, - 0.150620;-0.208254;0.966408;, - -0.000001;-0.000000;1.000000;, - 0.223800;-0.466352;0.855821;, - 0.000000;-0.832017;0.554750;, - -0.000001;-0.000000;1.000000;; - 70; - 3;0,18,2;, - 3;3,19,4;, - 3;0,16,18;, - 3;19,20,4;, - 3;5,22,6;, - 3;5,21,22;, - 3;7,24,8;, - 3;7,23,24;, - 3;9,26,10;, - 3;9,25,26;, - 3;11,28,12;, - 3;11,27,28;, - 3;13,30,14;, - 3;13,29,30;, - 3;15,17,1;, - 3;15,31,17;, - 3;16,34,18;, - 3;16,32,34;, - 3;19,36,20;, - 3;19,35,36;, - 3;21,38,22;, - 3;21,37,38;, - 3;23,40,24;, - 3;23,39,40;, - 3;25,42,26;, - 3;25,41,42;, - 3;27,44,28;, - 3;27,43,44;, - 3;29,46,30;, - 3;29,45,46;, - 3;31,33,17;, - 3;31,47,33;, - 3;32,50,34;, - 3;32,48,50;, - 3;35,52,36;, - 3;35,51,52;, - 3;37,54,38;, - 3;37,53,54;, - 3;39,56,40;, - 3;39,55,56;, - 3;41,58,42;, - 3;41,57,58;, - 3;43,60,44;, - 3;43,59,60;, - 3;45,62,46;, - 3;45,61,62;, - 3;47,49,33;, - 3;47,63,49;, - 3;48,67,50;, - 3;48,64,67;, - 3;51,70,52;, - 3;51,68,70;, - 3;53,73,54;, - 3;53,71,73;, - 3;55,76,56;, - 3;55,74,76;, - 3;57,79,58;, - 3;57,77,79;, - 3;59,82,60;, - 3;59,80,82;, - 3;61,85,62;, - 3;61,83,85;, - 3;63,65,49;, - 3;63,86,65;, - 3;81,87,84;, - 3;78,87,81;, - 3;78,66,87;, - 3;75,66,78;, - 3;75,69,66;, - 3;72,69,75;; - } - MeshTextureCoords { - 40; - 0.427128;1.000148;, - 0.312615;1.000148;, - 0.343846;1.000148;, - 0.447949;1.000148;, - 0.552051;1.000148;, - 0.656154;1.000148;, - 0.687385;1.000148;, - 0.572872;1.000148;, - 0.383997;0.458321;, - 0.201706;0.458321;, - 0.251421;0.458321;, - 0.417140;0.458321;, - 0.582860;0.458321;, - 0.748579;0.458321;, - 0.798294;0.458321;, - 0.616003;0.458321;, - 0.369065;0.270766;, - 0.075261;0.270766;, - 0.219426;0.270766;, - 0.406475;0.270766;, - 0.593525;0.270766;, - 0.780574;0.270766;, - 0.924739;0.270766;, - 0.630935;0.270766;, - 0.359114;0.145729;, - 0.000307;-0.000148;, - 0.198102;0.104050;, - 0.399367;0.145729;, - 0.600633;0.145729;, - 0.801898;0.104050;, - 0.999693;-0.000148;, - 0.640886;0.145729;, - 0.388263;0.083210;, - 0.262646;0.083210;, - 0.312615;0.083210;, - 0.420188;0.083210;, - 0.579812;0.083210;, - 0.687385;0.083210;, - 0.737354;0.083210;, - 0.611737;0.083210;; - } - } - - Frame x3ds_RU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - -22.158115, 0.000006, 34.682274, 1.000000;; - } - Mesh RU_Arm { - - 12; - -5.501477; 0.000004; -2.449525;, - -2.458304; 6.273188; -0.692550;, - 3.628045; 6.273185; 2.821392;, - 6.671256; -0.000001; 4.578400;, - 3.628039; -6.273173; 2.821389;, - -2.458306; -6.273183; -0.692544;, - 8.608694; 0.000001; -22.981846;, - 10.805939; 4.394536; -21.713266;, - 15.200456; 4.394535; -19.176115;, - 17.397690; -0.000002; -17.907520;, - 15.200446; -4.394550; -19.176085;, - 10.805936; -4.394485; -21.713276;; - - 20; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - -0.716210;0.493166;-0.493793;, - -0.719558;-0.487559;-0.494492;, - -0.499999;-0.000001;0.866026;, - -0.718101;0.487469;-0.496693;, - 0.037713;0.997151;-0.065320;, - -0.499999;-0.000001;0.866026;, - 0.037713;0.997151;-0.065320;, - 0.785987;0.493148;0.372868;, - -0.499999;-0.000001;0.866026;, - 0.788019;0.487564;0.375908;, - 0.785740;-0.493168;0.373360;, - -0.500000;0.000002;0.866026;, - 0.789195;-0.487476;0.373548;, - 0.037714;-0.997151;-0.065321;, - -0.500000;-0.000002;0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.715906;-0.493147;-0.494252;, - -0.499998;0.000002;0.866027;, - -0.714286;0.498840;-0.490870;, - -0.715906;-0.493147;-0.494252;, - 0.499999;0.000001;-0.866026;, - -0.716210;0.493166;-0.493793;, - 0.037713;0.997151;-0.065320;, - 0.499996;-0.000007;-0.866027;, - 0.037713;0.997151;-0.065320;, - 0.783919;0.498709;0.369812;, - 0.499996;-0.000007;-0.866027;, - 0.785987;0.493148;0.372868;, - 0.782250;-0.498838;0.373156;, - 0.499996;-0.000007;-0.866027;, - 0.785740;-0.493168;0.373360;, - 0.037701;-0.997152;-0.065325;, - 0.499999;-0.000002;-0.866026;, - 0.037714;-0.997151;-0.065321;, - -0.712222;-0.498712;-0.493989;, - 0.500003;0.000001;-0.866024;; - 20; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_RL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - 13.822151, 0.000003, -20.565968, 1.000000;; - } - Mesh RL_Arm { - - 24; - 8.013477; 0.000005; -35.874058;, - 12.494552; 9.237309; -33.286903;, - 21.456678; 9.237304; -28.112616;, - 25.937769; -0.000003; -25.525463;, - 21.456680; -9.237155; -28.112616;, - 12.494545; -9.237303; -33.286919;, - -4.837206; 0.000002; -3.067563;, - -2.639963; 4.394549; -1.798980;, - 1.754547; 4.394535; 0.738177;, - 3.951795; -0.000002; 2.006753;, - 1.754554; -4.394537; 0.738174;, - -2.639967; -4.394535; -1.798978;, - 5.120436; -0.663049; -1.830179;, - 10.395203; -0.663048; -7.844885;, - 9.816457; -0.663051; 4.948281;, - 5.120435; 0.336947; -1.830175;, - 10.395203; 0.336952; -7.844885;, - 9.816456; 0.336949; 4.948285;, - 15.652800; -0.663047; -15.309710;, - 20.927570; -0.663046; -21.324427;, - 20.348825; -0.663049; -8.531265;, - 15.652801; 0.336953; -15.309710;, - 20.927568; 0.336950; -21.324423;, - 20.348825; 0.336947; -8.531264;; - - 32; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;, - 3;12,13,14;, - 3;13,17,14;, - 3;13,16,17;, - 3;14,15,12;, - 3;14,17,15;, - 3;16,15,17;, - 3;18,19,20;, - 3;19,23,20;, - 3;19,22,23;, - 3;20,21,18;, - 3;20,23,21;, - 3;22,21,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 64; - -0.811971;0.490075;-0.317063;, - -0.814533;-0.484496;-0.319062;, - 0.500000;0.000000;-0.866025;, - -0.815268;0.484377;-0.317359;, - -0.068845;0.990475;0.119243;, - 0.500000;0.000000;-0.866025;, - -0.068845;0.990475;0.119243;, - 0.679969;0.490008;0.545467;, - 0.500000;0.000000;-0.866025;, - 0.683580;0.484497;0.545876;, - 0.680568;-0.490079;0.544656;, - 0.500000;0.000001;-0.866025;, - 0.682472;-0.484384;0.547362;, - -0.068832;-0.990476;0.119249;, - 0.500000;-0.000000;-0.866025;, - -0.068832;-0.990476;0.119249;, - -0.812373;-0.490007;-0.316139;, - 0.500001;0.000001;-0.866025;, - -0.808639;0.495752;-0.316753;, - -0.812373;-0.490007;-0.316139;, - -0.500002;0.000000;0.866024;, - -0.811971;0.490075;-0.317063;, - -0.068842;0.990475;0.119244;, - -0.499998;0.000000;0.866027;, - -0.068845;0.990475;0.119243;, - 0.676328;0.495497;0.545035;, - -0.499998;0.000000;0.866027;, - 0.679969;0.490008;0.545467;, - 0.678635;-0.495752;0.541927;, - -0.499998;0.000000;0.866027;, - 0.680568;-0.490079;0.544656;, - -0.068843;-0.990476;0.119239;, - -0.499999;-0.000001;0.866026;, - -0.068832;-0.990476;0.119249;, - -0.810178;-0.495496;-0.313202;, - -0.499996;0.000000;0.866028;, - -0.000000;-1.000000;-0.000000;, - -0.822008;-0.000003;0.569476;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045193;, - -0.000001;1.000000;0.000000;, - 0.998978;0.000001;0.045192;, - -0.822008;-0.000003;0.569476;, - -0.000001;1.000000;0.000000;, - -0.000000;-1.000000;-0.000000;, - -0.822007;0.000001;0.569477;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.000000;-1.000000;-0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;0.000001;0.569477;, - -0.822007;0.000001;0.569477;, - 0.000001;1.000000;0.000000;, - 0.998978;0.000002;0.045192;, - 0.000001;1.000000;0.000000;, - 0.998978;-0.000000;0.045192;, - -0.822007;-0.000001;0.569477;, - 0.000001;1.000000;0.000000;; - 32; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;, - 3;36,38,40;, - 3;39,47,41;, - 3;39,45,47;, - 3;42,43,37;, - 3;42,48,43;, - 3;46,44,49;, - 3;50,52,54;, - 3;53,61,55;, - 3;53,59,61;, - 3;56,57,51;, - 3;56,62,57;, - 3;60,58,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_R_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - 17.201626, -0.532497, -26.974564, 1.000000;; - } - Mesh R_Hand { - - 8; - -6.156250; -13.356396; -4.582500;, - 6.843750; -13.356392; -4.582499;, - 3.756248; -0.356396; -2.650550;, - -3.068748; -0.356396; -2.650550;, - -6.156250; -13.356396; 4.582500;, - 6.843750; -13.356392; 4.582499;, - 3.756248; -0.356396; 2.650486;, - -3.068748; -0.356396; 2.650486;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032627;0.773816;, - 0.032627;0.773815;, - 0.231505;-0.195808;, - 0.231505;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777202;-0.195808;, - 0.777202;-0.195808;; - } - } - } - } - } - - Frame x3ds_LU_Arm { - FrameTransformMatrix { - -0.965926, -0.000000, -0.258819, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - -0.258819, -0.000000, 0.965926, 0.000000, - 22.800379, 0.000008, 34.682274, 1.000000;; - } - Mesh LU_Arm { - - 12; - 5.988949; 0.000003; 0.629316;, - 2.474997; 6.273188; 0.629317;, - -4.552909; 6.273124; 0.629308;, - -8.066915; 0.000002; 0.629317;, - -4.552907; -6.273170; 0.629307;, - 2.474994; -6.273119; 0.629322;, - 4.035422; 0.000003; -24.207560;, - 1.498248; 4.394476; -24.207499;, - -3.576368; 4.394538; -24.207462;, - -6.113520; 0.000003; -24.207476;, - -3.576366; -4.394546; -24.207474;, - 1.498253; -4.394546; -24.207510;; - - 20; - 3;0,7,1;, - 3;0,6,7;, - 3;1,8,2;, - 3;1,7,8;, - 3;2,9,3;, - 3;2,8,9;, - 3;3,10,4;, - 3;3,9,10;, - 3;4,11,5;, - 3;4,10,11;, - 3;5,6,0;, - 3;5,11,6;, - 3;2,0,1;, - 3;3,0,2;, - 3;4,0,3;, - 3;5,0,4;, - 3;8,7,9;, - 3;9,7,10;, - 3;10,7,11;, - 3;11,7,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHARM} - } - MeshNormals { - 36; - 0.867150;0.493170;-0.069529;, - 0.870399;-0.487563;-0.068461;, - -0.000001;-0.000001;1.000000;, - 0.870241;0.487469;-0.071097;, - -0.000009;0.997152;-0.075422;, - -0.000001;-0.000001;1.000000;, - -0.000009;0.997152;-0.075422;, - -0.867118;0.493150;-0.070072;, - -0.000001;-0.000001;1.000000;, - -0.870397;0.487569;-0.068456;, - -0.867152;-0.493168;-0.069523;, - 0.000000;0.000001;1.000000;, - -0.870238;-0.487476;-0.071088;, - 0.000007;-0.997152;-0.075421;, - 0.000000;-0.000001;1.000000;, - 0.000007;-0.997152;-0.075421;, - 0.867118;-0.493148;-0.070077;, - -0.000002;0.000002;1.000000;, - 0.864021;0.498848;-0.067959;, - 0.867118;-0.493148;-0.070077;, - -0.000022;0.000001;-1.000000;, - 0.867150;0.493170;-0.069529;, - 0.000012;0.997151;-0.075427;, - -0.000007;0.000007;-1.000000;, - -0.000009;0.997152;-0.075422;, - -0.863800;0.498709;-0.071684;, - -0.000007;0.000007;-1.000000;, - -0.867118;0.493150;-0.070072;, - -0.864027;-0.498838;-0.067955;, - -0.000007;0.000007;-1.000000;, - -0.867152;-0.493168;-0.069523;, - -0.000001;-0.997152;-0.075423;, - -0.000002;-0.000002;-1.000000;, - 0.000007;-0.997152;-0.075421;, - 0.863799;-0.498710;-0.071691;, - -0.000007;0.000001;-1.000000;; - 20; - 3;0,21,3;, - 3;0,18,21;, - 3;4,24,6;, - 3;4,22,24;, - 3;7,27,9;, - 3;7,25,27;, - 3;10,30,12;, - 3;10,28,30;, - 3;13,33,15;, - 3;13,31,33;, - 3;16,19,1;, - 3;16,34,19;, - 3;8,2,5;, - 3;11,2,8;, - 3;14,2,11;, - 3;17,2,14;, - 3;26,23,29;, - 3;29,23,32;, - 3;32,23,35;, - 3;35,23,20;; - } - MeshTextureCoords { - 12; - 0.250000;-0.011257;, - 0.081267;-0.011257;, - 0.918734;-0.011257;, - 0.750000;-0.011257;, - 0.581266;-0.011257;, - 0.418733;-0.011257;, - 0.250000;1.011257;, - 0.083334;1.011257;, - 0.916666;1.011257;, - 0.750000;1.011257;, - 0.583334;1.011257;, - 0.416666;1.011257;; - } - } - - Frame x3ds_LL_Arm { - FrameTransformMatrix { - 1.000000, -0.000000, -0.000000, 0.000000, - -0.000000, 1.000000, 0.000000, 0.000000, - -0.000000, -0.000000, 1.000000, 0.000000, - -0.446584, 0.000005, -24.389263, 1.000000;; - } - Mesh LL_Arm { - - 24; - 9.756407; 0.000006; -35.407063;, - 4.582108; 9.237311; -35.407040;, - -5.766471; 9.237184; -35.407040;, - -10.940788; 0.000005; -35.407043;, - -5.766469; -9.237275; -35.407063;, - 4.582115; -9.237300; -35.407051;, - 4.482169; 0.000002; -0.570457;, - 1.945006; 4.394486; -0.570453;, - -3.129325; 4.394474; -0.570462;, - -5.666486; 0.000001; -0.570473;, - -3.129334; -4.394471; -0.570465;, - 1.945009; -4.394471; -0.570457;, - -4.525237; -0.663046; -4.414725;, - -6.085963; -0.663051; -12.261003;, - -11.981339; -0.663046; -0.892426;, - -4.525237; 0.336950; -4.414725;, - -6.085961; 0.336952; -12.261005;, - -11.981338; 0.336954; -0.892433;, - -6.906761; -0.663049; -21.354527;, - -8.467486; -0.663040; -29.200804;, - -14.362860; -0.663049; -17.832241;, - -6.906761; 0.336958; -21.354527;, - -8.467486; 0.336956; -29.200804;, - -14.362861; 0.336954; -17.832237;; - - 32; - 3;7,0,1;, - 3;6,0,7;, - 3;8,1,2;, - 3;7,1,8;, - 3;9,2,3;, - 3;8,2,9;, - 3;10,3,4;, - 3;9,3,10;, - 3;11,4,5;, - 3;10,4,11;, - 3;6,5,0;, - 3;11,5,6;, - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;7,8,9;, - 3;7,9,10;, - 3;7,10,11;, - 3;7,11,6;, - 3;13,12,14;, - 3;17,13,14;, - 3;16,13,17;, - 3;15,14,12;, - 3;17,14,15;, - 3;15,16,17;, - 3;19,18,20;, - 3;23,19,20;, - 3;22,19,23;, - 3;21,20,18;, - 3;23,20,21;, - 3;21,22,23;; - MeshMaterialList { - 2; - 32; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHARM} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 64; - 0.861718;0.490078;0.131402;, - 0.864937;-0.484496;0.130951;, - -0.000000;0.000002;-1.000000;, - 0.864723;0.484376;0.132795;, - -0.000012;0.990475;0.137689;, - -0.000000;0.000002;-1.000000;, - -0.000012;0.990475;0.137689;, - -0.861601;0.490013;0.132404;, - -0.000000;0.000002;-1.000000;, - -0.864933;0.484503;0.130952;, - -0.861717;-0.490079;0.131403;, - -0.000001;0.000001;-1.000000;, - -0.864721;-0.484379;0.132795;, - -0.000003;-0.990475;0.137691;, - -0.000001;0.000002;-1.000000;, - -0.000003;-0.990475;0.137691;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000002;-1.000000;, - 0.858676;0.495758;0.130003;, - 0.861603;-0.490010;0.132403;, - 0.000001;-0.000000;1.000000;, - 0.861718;0.490078;0.131402;, - -0.000003;0.990475;0.137691;, - -0.000002;-0.000002;1.000000;, - -0.000012;0.990475;0.137689;, - -0.858232;0.495502;0.133849;, - -0.000002;-0.000002;1.000000;, - -0.861601;0.490013;0.132404;, - -0.858676;-0.495757;0.130005;, - -0.000002;-0.000002;1.000000;, - -0.861717;-0.490079;0.131403;, - -0.000000;-0.990475;0.137691;, - -0.000003;0.000000;1.000000;, - -0.000003;-0.990475;0.137691;, - 0.858232;-0.495502;0.133850;, - -0.000002;-0.000000;1.000000;, - 0.000000;-1.000000;0.000001;, - 0.427141;0.000000;0.904185;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.000000;-1.000000;0.000001;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000000;0.904185;, - 0.427141;0.000000;0.904185;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000000;-0.460352;, - 0.000001;1.000000;0.000000;, - -0.887737;-0.000002;-0.460352;, - 0.427141;0.000006;0.904185;, - 0.000001;1.000000;0.000000;, - -0.000001;-1.000000;-0.000001;, - 0.427140;-0.000000;0.904185;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - -0.000001;-1.000000;-0.000001;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000000;0.904185;, - 0.427140;-0.000000;0.904185;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000000;-0.460352;, - -0.000001;1.000000;-0.000000;, - -0.887737;0.000001;-0.460352;, - 0.427140;-0.000003;0.904185;, - -0.000001;1.000000;-0.000000;; - 32; - 3;21,0,3;, - 3;18,0,21;, - 3;24,4,6;, - 3;22,4,24;, - 3;27,7,9;, - 3;25,7,27;, - 3;30,10,12;, - 3;28,10,30;, - 3;33,13,15;, - 3;31,13,33;, - 3;19,16,1;, - 3;34,16,19;, - 3;2,8,5;, - 3;2,11,8;, - 3;2,14,11;, - 3;2,17,14;, - 3;23,26,29;, - 3;23,29,32;, - 3;23,32,35;, - 3;23,35,20;, - 3;38,36,40;, - 3;47,39,41;, - 3;45,39,47;, - 3;43,42,37;, - 3;48,42,43;, - 3;44,46,49;, - 3;52,50,54;, - 3;61,53,55;, - 3;59,53,61;, - 3;57,56,51;, - 3;62,56,57;, - 3;58,60,63;; - } - MeshTextureCoords { - 24; - 0.250000;2.476449;, - 0.081266;2.476449;, - 0.918734;2.476449;, - 0.750000;2.476449;, - 0.581266;2.476449;, - 0.418734;2.476449;, - 0.250000;1.042238;, - 0.083334;1.042238;, - 0.916666;1.042238;, - 0.750000;1.042238;, - 0.583334;1.042238;, - 0.416666;1.042238;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_L_Hand { - FrameTransformMatrix { - -0.965926, 0.000000, -0.258819, 0.000000, - -0.258819, -0.000000, 0.965925, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -1.719950, -0.532492, -32.044582, 1.000000;; - } - Mesh L_Hand { - - 8; - -6.357616; -13.356400; -4.582500;, - 6.642384; -13.356396; -4.582499;, - 3.554882; -0.356400; -2.650550;, - -3.270115; -0.356400; -2.650550;, - -6.357616; -13.356400; 4.582500;, - 6.642384; -13.356396; 4.582499;, - 3.554882; -0.356399; 2.650486;, - -3.270115; -0.356399; 2.650486;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHHAND} - } - MeshNormals { - 20; - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.000000;-1.000000;-0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.146997;-0.989137;, - 0.972937;0.231073;-0.000000;, - 0.000000;0.146997;-0.989137;, - -0.972937;0.231073;-0.000000;, - 0.000000;-1.000000;0.000000;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;, - 0.000000;-1.000000;0.000000;, - 0.972937;0.231073;0.000000;, - -0.000000;0.147002;0.989136;, - 0.972937;0.231073;0.000000;, - 0.000000;0.147002;0.989136;, - -0.972937;0.231073;-0.000000;, - 0.000000;0.147002;0.989136;; - 10; - 3;0,6,3;, - 3;0,8,6;, - 3;1,13,10;, - 3;1,4,13;, - 3;5,16,14;, - 3;5,7,16;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,17,19;, - 3;12,15,17;; - } - MeshTextureCoords { - 8; - 0.032628;0.773816;, - 0.032628;0.773815;, - 0.231506;-0.195808;, - 0.231506;-0.195808;, - 0.976087;0.773816;, - 0.976087;0.773815;, - 0.777203;-0.195808;, - 0.777203;-0.195808;; - } - } - } - } - } - - Frame x3ds_Head { - FrameTransformMatrix { - 0.996195, -0.087156, 0.000000, 0.000000, - -0.087156, -0.996195, -0.000000, 0.000000, - 0.000000, 0.000000, -1.000000, 0.000000, - 0.000000, 0.320932, 43.031708, 1.000000;; - } - Mesh Head { - - 14; - 0.425325; 1.962787; -19.572998;, - 8.670237; -5.947898; -18.382002;, - 11.100914; 4.408364; -18.855011;, - 1.451953; 10.441894; -18.855013;, - -9.223644; 5.996317; -18.855013;, - -8.846230; -4.605626; -18.382004;, - -0.560038; -8.044583; -15.549453;, - 8.843442; -3.382582; -2.678222;, - 11.100921; 4.408369; -3.122056;, - 1.451952; 10.441850; -3.122057;, - -9.223644; 5.996321; -3.121026;, - -8.571328; -2.049199; -2.677688;, - -0.522815; -9.619122; -0.089148;, - 0.425325; -0.037214; 3.679924;; - - 24; - 3;0,2,1;, - 3;0,3,2;, - 3;0,4,3;, - 3;0,5,4;, - 3;0,6,5;, - 3;0,1,6;, - 3;1,8,7;, - 3;1,2,8;, - 3;2,9,8;, - 3;2,3,9;, - 3;3,10,9;, - 3;3,4,10;, - 3;4,11,10;, - 3;4,5,11;, - 3;5,12,11;, - 3;5,6,12;, - 3;6,7,12;, - 3;6,1,7;, - 3;13,11,12;, - 3;13,10,11;, - 3;13,9,10;, - 3;13,8,9;, - 3;13,7,8;, - 3;13,12,7;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01HEAD} - } - MeshNormals { - 60; - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - 0.081687;-0.064598;-0.994562;, - -0.201835;-0.348186;-0.915439;, - 0.967436;-0.252527;0.017281;, - 0.263240;-0.952568;0.152705;, - 0.081687;-0.064598;-0.994562;, - 0.049012;0.078380;-0.995718;, - 0.973545;-0.228497;-0.000000;, - 0.530181;0.847885;-0.000000;, - 0.049012;0.078380;-0.995718;, - -0.036962;0.088760;-0.995367;, - 0.530184;0.847883;0.000002;, - -0.384421;0.923158;0.000003;, - -0.036962;0.088760;-0.995367;, - -0.093941;-0.047711;-0.994434;, - -0.384425;0.923156;-0.000000;, - -0.998267;-0.057694;0.011560;, - -0.093941;-0.047711;-0.994434;, - 0.153237;-0.381582;-0.911545;, - -0.999136;-0.034537;0.023112;, - -0.542700;-0.839759;0.016782;, - 0.153237;-0.381582;-0.911545;, - -0.201835;-0.348186;-0.915439;, - -0.354072;-0.930491;-0.093912;, - 0.406709;-0.912942;0.033537;, - 0.960443;-0.276327;0.034547;, - 0.406709;-0.912942;0.033537;, - 0.568130;-0.118225;0.814402;, - 0.465164;-0.363520;0.807140;, - 0.967436;-0.252527;0.017281;, - 0.530181;0.847885;-0.000000;, - 0.310173;0.496041;0.811010;, - 0.568130;-0.118225;0.814402;, - 0.530181;0.847885;-0.000000;, - -0.384421;0.923158;0.000003;, - -0.227197;0.545783;0.806537;, - 0.310173;0.496041;0.811010;, - -0.384421;0.923158;0.000003;, - -0.996729;-0.080813;0.000000;, - -0.576846;-0.001758;0.816851;, - -0.227197;0.545783;0.806537;, - -0.998267;-0.057694;0.011560;, - -0.700901;-0.701945;0.126535;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.542700;-0.839759;0.016782;, - 0.535392;-0.840126;-0.086851;, - -0.514933;-0.269185;0.813870;, - 0.465164;-0.363520;0.807140;, - -0.514933;-0.269185;0.813870;, - -0.576846;-0.001758;0.816851;, - -0.227197;0.545783;0.806537;, - 0.310173;0.496041;0.811010;, - 0.568130;-0.118225;0.814402;, - 0.465164;-0.363520;0.807140;; - 24; - 3;0,10,6;, - 3;1,14,11;, - 3;2,18,15;, - 3;3,22,19;, - 3;4,26,23;, - 3;5,7,27;, - 3;8,34,30;, - 3;8,12,34;, - 3;13,38,35;, - 3;13,16,38;, - 3;17,42,39;, - 3;17,20,42;, - 3;21,46,43;, - 3;21,24,46;, - 3;25,50,47;, - 3;25,28,50;, - 3;29,31,51;, - 3;29,9,31;, - 3;54,48,52;, - 3;55,44,49;, - 3;56,40,45;, - 3;57,36,41;, - 3;58,32,37;, - 3;59,53,33;; - } - MeshTextureCoords { - 14; - 0.023465;0.004861;, - 0.658502;0.065512;, - 0.821431;0.041424;, - 0.999136;0.041424;, - 0.180988;0.041424;, - 0.342098;0.065512;, - 0.493676;0.209760;, - 0.695904;0.865226;, - 0.821431;0.842624;, - 0.999136;0.842624;, - 0.180988;0.842657;, - 0.305883;0.865234;, - 0.497409;0.997055;, - 0.480761;1.188995;; - } - } - } - } - - Frame x3ds_RU_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, -0.087156, 0.000000, - -0.000000, -1.000000, -0.000000, 0.000000, - -0.087156, 0.000000, -0.996195, 0.000000, - -6.849588, -0.163910, 2.374464, 1.000000;; - } - Mesh RU_Leg { - - 8; - -11.013890; -7.083223; -1.154131;, - 3.719295; -7.083223; -1.154224;, - 3.719296; 7.083232; -1.154223;, - -11.013890; 7.083232; -1.154134;, - -10.314070; -5.595809; 40.157955;, - 3.019470; -5.595746; 40.157955;, - 3.019406; 5.595754; 40.157948;, - -10.314070; 5.595690; 40.157944;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - -0.000006;0.000000;-1.000000;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;0.000006;0.016937;, - -0.000006;0.000000;-1.000000;, - 0.999857;-0.000000;0.016939;, - -0.000005;0.999352;0.035982;, - -0.000006;-0.000000;-1.000000;, - 0.000000;0.999352;0.035984;, - -0.999857;0.000000;0.016937;, - 0.000005;-0.999352;0.035981;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;, - 0.000005;-0.999352;0.035981;, - 0.999857;0.000006;0.016937;, - -0.000000;0.000001;1.000000;, - 0.999857;0.000006;0.016937;, - -0.000005;0.999352;0.035982;, - -0.000000;0.000001;1.000000;, - -0.000005;0.999352;0.035982;, - -0.999857;0.000000;0.016937;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_RL_Leg { - FrameTransformMatrix { - 0.996195, -0.000000, -0.087156, 0.000000, - -0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - -3.359494, 0.259708, 38.976967, 1.000000;; - } - Mesh RL_Leg { - - 26; - 9.229027; -71.518196; -17.699999;, - -10.562513; -71.518204; -17.699999;, - -8.726734; 0.601814; -5.908435;, - 7.393265; 0.601810; -5.908433;, - 11.931103; -75.798187; 11.700004;, - -13.264593; -75.798187; 11.699999;, - -8.726734; 0.601814; 5.908564;, - 7.393263; 0.601810; 5.908566;, - -9.401619; -8.003811; 0.055164;, - -9.401621; -19.983799; 0.055164;, - -21.381618; -5.008812; 0.055162;, - -9.401619; -8.003811; 1.552658;, - -9.401621; -19.983799; 1.552658;, - -21.381618; -5.008812; 1.552657;, - -9.406624; -28.501522; 0.062683;, - -9.406624; -40.501522; 0.062684;, - -21.406624; -25.501520; 0.062688;, - -9.406624; -28.501522; 1.562678;, - -9.406624; -40.501522; 1.562678;, - -21.406624; -25.501520; 1.562676;, - -9.411629; -50.486736; 0.070203;, - -9.411633; -62.506737; 0.070203;, - -21.431629; -47.481735; 0.070202;, - -9.411629; -50.486736; 1.572698;, - -9.411633; -62.506737; 1.572698;, - -21.431629; -47.481735; 1.572697;; - - 30; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;6,1,5;, - 3;2,1,6;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;, - 3;8,9,10;, - 3;9,13,10;, - 3;9,12,13;, - 3;10,11,8;, - 3;10,13,11;, - 3;12,11,13;, - 3;14,15,16;, - 3;15,19,16;, - 3;15,18,19;, - 3;16,17,14;, - 3;16,19,17;, - 3;18,17,19;, - 3;20,21,22;, - 3;21,25,22;, - 3;21,24,25;, - 3;22,23,20;, - 3;22,25,23;, - 3;24,23,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 66; - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - 0.995537;0.039363;-0.085767;, - -0.000000;0.161357;-0.986896;, - 0.000000;-0.989569;-0.144059;, - -0.998354;0.039138;-0.041929;, - -0.000000;0.161357;-0.986896;, - -0.999676;0.025446;0.000000;, - 0.000000;1.000000;0.000000;, - 0.000000;0.161357;-0.986896;, - 0.000000;1.000000;0.000000;, - 0.997858;0.049375;-0.042925;, - 0.000000;-0.989569;-0.144059;, - 0.997858;0.049375;-0.042925;, - -0.000000;0.075587;0.997139;, - 0.000000;-0.989569;-0.144059;, - -0.995087;0.052754;-0.083776;, - -0.000000;0.075587;0.997139;, - -0.998354;0.039138;-0.041929;, - 0.000000;1.000000;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;1.000000;0.000000;, - 0.998241;0.059291;0.000000;, - -0.000000;0.075587;0.997139;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970143;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;-0.000000;, - 0.242536;0.970143;-0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - -0.000000;-0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - -0.000000;-0.000000;-1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - -0.780869;-0.624695;-0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - 0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.000000;0.000000;-1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - -0.780869;-0.624695;-0.000001;, - 0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;; - 30; - 3;6,0,3;, - 3;9,0,6;, - 3;15,1,12;, - 3;4,1,15;, - 3;18,5,16;, - 3;7,5,18;, - 3;21,8,19;, - 3;10,8,21;, - 3;13,11,22;, - 3;2,11,13;, - 3;20,14,23;, - 3;17,14,20;, - 3;24,26,28;, - 3;27,35,29;, - 3;27,33,35;, - 3;30,31,25;, - 3;30,36,31;, - 3;34,32,37;, - 3;38,40,42;, - 3;41,49,43;, - 3;41,47,49;, - 3;44,45,39;, - 3;44,50,45;, - 3;48,46,51;, - 3;52,54,56;, - 3;55,63,57;, - 3;55,61,63;, - 3;58,59,53;, - 3;58,64,59;, - 3;62,60,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_R_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - -0.849463, -62.299637, -2.502151, 1.000000;; - } - Mesh R_Foot { - - 8; - -37.191723; -17.003931; 4.286171;, - 7.580331; -17.003948; 6.445354;, - 5.179023; -0.329503; 4.340307;, - -27.147438; -7.877935; 1.341817;, - -37.191738; -17.003931; -4.286145;, - 7.580253; -17.003933; -6.445300;, - 5.179095; -0.329495; -4.340262;, - -27.147472; -7.877943; -1.341796;; - - 10; - 3;2,0,1;, - 3;3,0,2;, - 3;5,0,4;, - 3;1,0,5;, - 3;7,2,6;, - 3;3,2,7;, - 3;4,3,7;, - 3;0,3,4;, - 3;6,4,7;, - 3;5,4,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 20; - -0.123025;0.309552;0.942890;, - -0.000000;-1.000000;0.000000;, - -0.672464;0.740130;0.000001;, - -0.047832;0.118323;0.991822;, - -0.000000;-1.000000;-0.000001;, - -0.123025;0.309552;0.942890;, - -0.227389;0.973804;-0.000001;, - -0.192729;0.486970;0.851889;, - -0.227389;0.973804;0.000000;, - -0.672466;0.740128;0.000006;, - -0.000000;-1.000000;0.000000;, - -0.672466;0.740128;0.000006;, - -0.123024;0.309552;-0.942891;, - -0.000000;-1.000000;0.000000;, - -0.047831;0.118323;-0.991822;, - -0.227389;0.973804;-0.000001;, - -0.123024;0.309552;-0.942891;, - -0.227389;0.973804;-0.000001;, - -0.672466;0.740128;0.000006;, - -0.192728;0.486969;-0.851891;; - 10; - 3;5,0,3;, - 3;7,0,5;, - 3;13,1,10;, - 3;4,1,13;, - 3;17,6,15;, - 3;8,6,17;, - 3;11,9,18;, - 3;2,9,11;, - 3;16,12,19;, - 3;14,12,16;; - } - } - } - } - } - - Frame x3ds_LU_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, 0.087156, 0.000000, - 0.000000, -1.000000, -0.000000, 0.000000, - 0.087156, 0.000000, -0.996195, 0.000000, - 5.995695, -0.163910, 2.695593, 1.000000;; - } - Mesh LU_Leg { - - 8; - -2.905133; -7.083223; -0.791073;, - 11.828092; -7.083160; -0.790935;, - 11.828092; 7.083232; -0.790933;, - -2.905131; 7.083232; -0.791068;, - -2.205294; -5.595747; 40.521160;, - 11.128267; -5.595746; 40.521164;, - 11.128268; 5.595754; 40.521152;, - -2.205276; 5.595753; 40.521152;; - - 12; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_01MECHLEG} - } - MeshNormals { - 24; - 0.000009;0.000000;-1.000000;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.000004;-0.999352;0.035981;, - 0.999857;-0.000000;0.016938;, - 0.000009;0.000000;-1.000000;, - 0.999857;-0.000000;0.016937;, - -0.000000;0.999352;0.035983;, - 0.000009;0.000000;-1.000000;, - -0.000000;0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - 0.000000;-0.999352;0.035982;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;, - 0.000000;-0.999352;0.035982;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.000001;1.000000;, - 0.999857;-0.000000;0.016938;, - -0.000000;0.999352;0.035983;, - -0.000000;0.000001;1.000000;, - -0.000000;0.999352;0.035983;, - -0.999857;0.000002;0.016938;, - -0.000000;0.000001;1.000000;; - 12; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;; - } - MeshTextureCoords { - 8; - 0.384951;0.041750;, - 0.616604;0.041750;, - 0.856692;0.041750;, - 0.141781;0.041750;, - 0.384951;0.914882;, - 0.616604;0.914882;, - 0.856692;0.914882;, - 0.141781;0.914882;; - } - } - - Frame x3ds_LL_Leg { - FrameTransformMatrix { - 0.996195, 0.000000, 0.087156, 0.000000, - 0.087156, -0.000000, -0.996195, 0.000000, - 0.000000, 1.000000, -0.000000, 0.000000, - 3.943336, 0.259716, 39.672768, 1.000000;; - } - Mesh LL_Leg { - - 26; - -9.017391; -71.197044; -17.699999;, - 10.774149; -71.197052; -17.699999;, - 8.938375; 0.922958; -5.908498;, - -7.181622; 0.922955; -5.908498;, - -11.719472; -75.477051; 11.700000;, - 13.476221; -75.477051; 11.700000;, - 8.938375; 0.922958; 5.908501;, - -7.181622; 0.922955; 5.908501;, - 9.618265; -7.680378; 0.062687;, - 9.618269; -19.680382; 0.062687;, - 21.618265; -4.680378; 0.062687;, - 9.618265; -7.680378; 1.562681;, - 9.618269; -19.680382; 1.562681;, - 21.618265; -4.680378; 1.562681;, - 9.618265; -28.180374; 0.062689;, - 9.618265; -40.180374; 0.062689;, - 21.618265; -25.180378; 0.062694;, - 9.618265; -28.180374; 1.562683;, - 9.618265; -40.180374; 1.562683;, - 21.618265; -25.180378; 1.562684;, - 9.618269; -50.180374; 0.062691;, - 9.618265; -62.180374; 0.062691;, - 21.618269; -47.180374; 0.062691;, - 9.618269; -50.180374; 1.562685;, - 9.618265; -62.180374; 1.562685;, - 21.618269; -47.180374; 1.562685;; - - 30; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;1,6,5;, - 3;1,2,6;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;, - 3;9,8,10;, - 3;13,9,10;, - 3;12,9,13;, - 3;11,10,8;, - 3;13,10,11;, - 3;11,12,13;, - 3;15,14,16;, - 3;19,15,16;, - 3;18,15,19;, - 3;17,16,14;, - 3;19,16,17;, - 3;17,18,19;, - 3;21,20,22;, - 3;25,21,22;, - 3;24,21,25;, - 3;23,22,20;, - 3;25,22,23;, - 3;23,24,25;; - MeshMaterialList { - 2; - 30; - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1; - {x3ds_mat_02MECHLEG} - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 66; - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - -0.995537;0.039364;-0.085767;, - 0.000000;0.161356;-0.986896;, - -0.000000;-0.989569;-0.144060;, - 0.998354;0.039138;-0.041929;, - 0.000000;0.161356;-0.986896;, - 0.999676;0.025446;0.000000;, - -0.000000;1.000000;0.000000;, - -0.000000;0.161356;-0.986896;, - -0.000000;1.000000;0.000000;, - -0.997857;0.049375;-0.042925;, - -0.000000;-0.989569;-0.144060;, - -0.997857;0.049375;-0.042925;, - -0.000000;0.075588;0.997139;, - -0.000000;-0.989569;-0.144060;, - 0.995087;0.052753;-0.083776;, - 0.000000;0.075588;0.997139;, - 0.998354;0.039138;-0.041929;, - -0.000000;1.000000;0.000000;, - -0.000000;0.075588;0.997139;, - -0.000000;1.000000;0.000000;, - -0.998241;0.059291;0.000000;, - -0.000000;0.075588;0.997139;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242535;0.970143;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242535;0.970143;0.000000;, - -0.000000;0.000000;1.000000;, - 0.000000;0.000000;-1.000000;, - -0.242536;0.970142;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - 0.000000;0.000000;-1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.000000;-0.000000;1.000000;, - 0.780869;-0.624695;0.000000;, - -0.242536;0.970142;0.000000;, - -0.000000;-0.000000;1.000000;; - 30; - 3;0,6,3;, - 3;0,9,6;, - 3;1,15,12;, - 3;1,4,15;, - 3;5,18,16;, - 3;5,7,18;, - 3;8,21,19;, - 3;8,10,21;, - 3;11,13,22;, - 3;11,2,13;, - 3;14,20,23;, - 3;14,17,20;, - 3;26,24,28;, - 3;35,27,29;, - 3;33,27,35;, - 3;31,30,25;, - 3;36,30,31;, - 3;32,34,37;, - 3;40,38,42;, - 3;49,41,43;, - 3;47,41,49;, - 3;45,44,39;, - 3;50,44,45;, - 3;46,48,51;, - 3;54,52,56;, - 3;63,55,57;, - 3;61,55,63;, - 3;59,58,53;, - 3;64,58,59;, - 3;60,62,65;; - } - MeshTextureCoords { - 26; - 0.424682;0.899973;, - 0.582679;0.899974;, - 0.647431;0.013392;, - 0.363113;0.013392;, - 0.131246;0.952588;, - 0.861902;0.952588;, - 0.838511;0.013392;, - 0.151531;0.013392;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;, - 0.000000;1.000000;; - } - } - - Frame x3ds_L_Foot { - FrameTransformMatrix { - -0.000000, 0.000000, 1.000000, 0.000000, - -0.000000, 1.000000, -0.000000, 0.000000, - -1.000000, -0.000000, -0.000000, 0.000000, - 1.061086, -63.263023, -2.697744, 1.000000;; - } - Mesh L_Foot { - - 8; - -36.996124; -15.719404; -4.210043;, - 7.775673; -15.719419; -6.330903;, - 5.374375; 0.954521; -4.263234;, - -26.951843; -6.593406; -1.317977;, - -36.995773; -15.719404; 4.210084;, - 7.775607; -15.719404; 6.330931;, - 5.374449; 0.954529; 4.263263;, - -26.951618; -6.593413; 1.317985;; - - 10; - 3;0,2,1;, - 3;0,3,2;, - 3;0,5,4;, - 3;0,1,5;, - 3;2,7,6;, - 3;2,3,7;, - 3;3,4,7;, - 3;3,0,4;, - 3;4,6,7;, - 3;4,5,6;; - MeshMaterialList { - 1; - 1; - 0;; - {x3ds_mat_BLUEPLASTIC} - } - MeshNormals { - 20; - -0.121241;0.305074;-0.944580;, - 0.000000;-1.000000;0.000000;, - -0.672469;0.740125;0.000028;, - -0.046996;0.116259;-0.992106;, - -0.000000;-1.000000;0.000001;, - -0.121241;0.305074;-0.944580;, - -0.227378;0.973807;0.000001;, - -0.190220;0.480642;-0.856037;, - -0.227375;0.973807;0.000022;, - -0.672459;0.740134;0.000060;, - 0.000000;-1.000000;0.000000;, - -0.672459;0.740134;0.000060;, - -0.121242;0.305076;0.944579;, - 0.000000;-1.000000;0.000000;, - -0.046997;0.116259;0.992106;, - -0.227378;0.973807;0.000001;, - -0.121242;0.305076;0.944579;, - -0.227378;0.973807;0.000001;, - -0.672459;0.740134;0.000060;, - -0.190222;0.480645;0.856035;; - 10; - 3;0,5,3;, - 3;0,7,5;, - 3;1,13,10;, - 3;1,4,13;, - 3;6,17,15;, - 3;6,8,17;, - 3;9,11,18;, - 3;9,2,11;, - 3;12,16,19;, - 3;12,14,16;; - } - } - } - } - } -} -AnimationSet x3ds_animset_0 { - Animation x3ds_anim_0 { - {x3ds_Groin} - AnimationKey { - 0; - 11; - 0; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 77; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 85; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 93; 4; 0.707107, 0.707107, 0.000000, 0.000000;;, - 115; 4; 0.000000, 1.000000, 0.000000, -0.000000;;, - 135; 4; 0.000000, 1.000000, 0.000000, -0.000000;;, - 160; 4; 0.707107, 0.707106, -0.000000, -0.000000;;, - 161; 4; -0.707107, -0.707106, 0.000000, 0.000000;;, - 175; 4; -0.705815, -0.705815, -0.042718, -0.042718;;, - 193; 4; -0.706998, -0.706997, -0.012419, -0.012419;;, - 216; 4; -0.707107, -0.707106, 0.000001, 0.000001;;; - } - AnimationKey { - 1; - 5; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 93; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 29; - 0; 3; 0.000000, 35.534382, 1.024473;;, - 1; 3; 0.000000, 23.889210, 1.024473;;, - 15; 3; 0.000000, 18.884680, 2.903347;;, - 30; 3; 0.000000, 23.889210, 1.024473;;, - 33; 3; 0.000000, 23.889210, 1.024473;;, - 43; 3; 0.000000, 20.962900, 1.024473;;, - 52; 3; 0.000000, 25.059750, 1.024473;;, - 61; 3; 0.000000, 23.518040, 5.044694;;, - 68; 3; 0.000000, 18.818790, 12.939010;;, - 76; 3; 0.000000, 23.518040, 5.044694;;, - 77; 3; 0.000000, 23.518040, 5.044694;;, - 93; 3; 0.000000, 23.518040, 5.044694;;, - 100; 3; 0.000000, 29.812460, -75.539803;;, - 104; 3; 0.000000, 19.677170, -97.369301;;, - 115; 3; 0.000000, -67.336800, -156.016006;;, - 135; 3; 0.000000, -67.336800, -139.858002;;, - 145; 3; 0.000000, -13.702700, -104.629097;;, - 146; 3; 0.000000, -12.018200, -99.536301;;, - 160; 3; 0.000000, 23.518040, -5.044694;;, - 161; 3; 0.000000, 23.518040, -5.044694;;, - 175; 3; 0.000000, 33.713280, 22.388664;;, - 178; 3; 0.000000, 24.016300, 24.758060;;, - 181; 3; 0.000000, 33.713280, 26.460903;;, - 184; 3; 0.000000, 24.016300, 25.572514;;, - 187; 3; 0.000000, 33.713280, 26.460907;;, - 190; 3; 0.000000, 24.016300, 26.386951;;, - 193; 3; 0.000000, 33.713280, 26.460903;;, - 207; 3; 0.000000, 33.713280, 26.460907;;, - 216; 3; 0.000000, 23.518040, -5.044694;;; - } - } - - Animation x3ds_anim_1 { - {x3ds_Chest} - AnimationKey { - 0; - 23; - 0; 4; 0.000000, -0.000000, -0.000000, -1.000000;;, - 1; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 15; 4; 0.317305, 0.000000, -0.000000, -0.948324;;, - 30; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 31; 4; 0.258819, 0.000000, -0.000000, -0.965926;;, - 43; 4; -0.095846, -0.000000, -0.000000, -0.995396;;, - 52; 4; 0.442381, 0.058240, 0.116812, -0.887278;;, - 61; 4; 0.258819, -0.000000, -0.000000, -0.965926;;, - 68; 4; 0.332019, -0.072538, -0.264839, -0.902420;;, - 76; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 77; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 85; 4; 0.535255, 0.003802, -0.087074, -0.840182;;, - 93; 4; 0.258819, -0.000000, -0.000001, -0.965926;;, - 95; 4; 0.221903, -0.017679, -0.071612, -0.972275;;, - 102; 4; 0.122182, -0.024167, -0.140528, -0.982212;;, - 115; 4; -0.000001, 0.000000, -0.000000, -1.000000;;, - 135; 4; -0.000001, -0.000000, 0.529919, -0.848048;;, - 139; 4; 0.030693, 0.002685, 0.581681, -0.812834;;, - 160; 4; 0.258820, -0.000000, -0.000000, -0.965926;;, - 161; 4; 0.258820, -0.000000, -0.000001, -0.965926;;, - 175; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 207; 4; -0.017452, -0.000000, -0.000000, -0.999848;;, - 216; 4; 0.258820, -0.000000, -0.000001, -0.965926;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 0.426950, -1.024470, 11.366163;;, - 77; 3; 0.426950, -1.024470, 11.366163;;, - 115; 3; 0.426950, -1.024470, 11.366163;;, - 135; 3; 0.426950, -1.024470, 11.366163;;; - } - } - - Animation x3ds_anim_2 { - {x3ds_RU_Arm} - AnimationKey { - 0; - 30; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.065263, 0.113039, 0.495722, -0.858616;;, - 15; 4; -0.056193, 0.117811, 0.426828, -0.894864;;, - 30; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 31; 4; -0.065263, 0.113039, 0.495723, -0.858616;;, - 43; 4; 0.053090, 0.119242, -0.403256, -0.905730;;, - 52; 4; -0.220806, -0.041267, 0.855768, -0.466049;;, - 61; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 68; 4; -0.025312, 0.111794, -0.475054, -0.872459;;, - 76; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 77; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 85; 4; 0.133832, 0.353720, 0.308203, -0.872916;;, - 93; 4; -0.065263, 0.113039, 0.495722, -0.858617;;, - 96; 4; -0.200990, -0.200282, 0.412420, -0.865679;;, - 97; 4; -0.132674, -0.082403, 0.416033, -0.895837;;, - 98; 4; -0.201870, -0.265437, 0.361052, -0.870881;;, - 99; 4; -0.134623, -0.131057, 0.365286, -0.911739;;, - 100; 4; -0.228976, -0.420777, 0.283694, -0.830683;;, - 115; 4; -0.000001, -0.398748, 0.000001, -0.917061;;, - 135; 4; -0.078327, -0.125349, -0.524098, -0.838734;;, - 139; 4; -0.071913, -0.092789, -0.291009, -0.949491;;, - 160; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 161; 4; -0.065263, 0.113040, 0.495724, -0.858616;;, - 175; 4; -0.165429, -0.450070, 0.634668, -0.606026;;, - 178; 4; -0.307408, -0.362634, 0.387903, -0.789638;;, - 182; 4; -0.174187, -0.394643, 0.618206, -0.657068;;, - 185; 4; -0.280338, -0.279007, 0.343836, -0.851671;;, - 188; 4; -0.185051, -0.307103, 0.545153, -0.757794;;, - 192; 4; -0.218786, -0.219812, 0.386801, -0.868447;;, - 216; 4; -0.065263, 0.113040, 0.495724, -0.858616;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -22.158115, 0.000001, 34.682266;;, - 77; 3; -22.158115, 0.000001, 34.682266;;, - 115; 3; -22.158115, 0.000001, 34.682266;;, - 135; 3; -22.158115, 0.000001, 34.682266;;; - } - } - - Animation x3ds_anim_3 { - {x3ds_RL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 15; 4; 0.909961, 0.414693, -0.000000, -0.000000;;, - 30; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 31; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 43; 4; 0.622515, 0.782608, 0.000000, -0.000000;;, - 52; 4; 0.998630, 0.052336, -0.000000, -0.000000;;, - 61; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 68; 4; 0.987688, 0.156435, -0.000000, -0.000000;;, - 76; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 77; 4; 0.866025, 0.500000, -0.000000, -0.000000;;, - 85; 4; 0.673714, 0.675106, -0.106243, 0.281164;;, - 93; 4; 0.866025, 0.500000, 0.000000, -0.000000;;, - 96; 4; 0.846469, 0.531913, 0.010984, -0.020921;;, - 115; 4; 1.000000, -0.000001, -0.000000, 0.000000;;, - 135; 4; 0.913546, 0.406736, -0.000000, 0.000000;;, - 139; 4; 0.981076, 0.193621, -0.000000, -0.000000;;, - 160; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 161; 4; 0.866026, 0.499999, -0.000000, 0.000000;;, - 175; 4; 0.898794, 0.438370, -0.000000, 0.000000;;, - 178; 4; 0.668687, 0.743544, -0.000000, 0.000000;;, - 182; 4; 0.826796, 0.562503, -0.000000, 0.000000;;, - 185; 4; 0.651408, 0.758727, -0.000000, 0.000000;;, - 188; 4; 0.705617, 0.708593, -0.000000, 0.000000;;, - 192; 4; 0.616021, 0.787730, -0.000000, 0.000000;;, - 216; 4; 0.866026, 0.499999, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 13.822151, 0.000000, -20.565975;;, - 77; 3; 13.822151, 0.000000, -20.565975;;, - 115; 3; 13.822151, 0.000000, -20.565975;;, - 135; 3; 13.822151, 0.000000, -20.565975;;; - } - } - - Animation x3ds_anim_4 { - {x3ds_R_Hand} - AnimationKey { - 0; - 11; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 52; 4; 0.085633, 0.098509, -0.650446, -0.748253;;, - 68; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 77; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 85; 4; 0.095461, 0.089019, -0.725097, -0.676164;;, - 93; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701058;;, - 160; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 161; 4; 0.083025, 0.100717, -0.630637, -0.765023;;, - 216; 4; 0.083025, 0.100717, -0.630637, -0.765023;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 17.201632, -0.532498, -26.974579;;, - 77; 3; 17.201632, -0.532498, -26.974579;;, - 115; 3; 17.201632, -0.532498, -26.974579;;, - 135; 3; 17.201632, -0.532498, -26.974579;;; - } - } - - Animation x3ds_anim_5 { - {x3ds_LU_Arm} - AnimationKey { - 0; - 31; - 0; 4; -0.000000, 0.130526, 0.000000, -0.991445;;, - 1; 4; -0.017037, 0.129409, 0.129410, -0.982963;;, - 15; 4; -0.027138, 0.127674, 0.206133, -0.969779;;, - 30; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 31; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 43; 4; -0.326088, 0.265924, 0.458283, -0.782897;;, - 52; 4; 0.023797, -0.004380, -0.508650, -0.860633;;, - 61; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 68; 4; 0.039250, 0.124485, -0.298134, -0.945558;;, - 76; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 77; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 85; 4; 0.014321, -0.216242, 0.302516, -0.928180;;, - 93; 4; -0.017037, 0.129409, 0.129409, -0.982963;;, - 96; 4; 0.012473, 0.472295, 0.098587, -0.875821;;, - 97; 4; -0.005733, 0.314325, 0.091301, -0.944897;;, - 98; 4; 0.002467, 0.403792, 0.085230, -0.910869;;, - 99; 4; -0.005563, 0.316457, 0.079674, -0.945239;;, - 100; 4; 0.010565, 0.509467, 0.073742, -0.857260;;, - 115; 4; -0.000001, 0.566409, -0.000008, -0.824124;;, - 135; 4; 0.176893, 0.283087, -0.499530, -0.799400;;, - 139; 4; 0.283098, 0.024951, -0.406064, -0.868531;;, - 160; 4; -0.017038, 0.129412, 0.129402, -0.982964;;, - 161; 4; -0.017038, 0.129412, 0.129403, -0.982964;;, - 175; 4; 0.405692, 0.534219, 0.553941, -0.493126;;, - 178; 4; 0.585778, 0.368487, 0.379184, -0.614249;;, - 182; 4; 0.448058, 0.532485, 0.549044, -0.462877;;, - 185; 4; 0.592036, 0.367183, 0.377829, -0.609849;;, - 188; 4; 0.502752, 0.483163, 0.496528, -0.516967;;, - 192; 4; 0.598794, 0.362383, 0.372267, -0.609543;;, - 207; 4; 0.476089, 0.472560, 0.479925, -0.565420;;, - 216; 4; -0.017038, 0.129412, 0.129402, -0.982964;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 22.800381, -0.000005, 34.682266;;, - 77; 3; 22.800381, -0.000005, 34.682266;;, - 115; 3; 22.800381, -0.000005, 34.682266;;, - 135; 3; 22.800381, -0.000005, 34.682266;;; - } - } - - Animation x3ds_anim_6 { - {x3ds_LL_Arm} - AnimationKey { - 0; - 26; - 0; 4; 1.000000, 0.000000, -0.000000, -0.000000;;, - 1; 4; 0.819152, 0.573576, -0.000000, -0.000000;;, - 15; 4; 0.848048, 0.529919, -0.000000, -0.000000;;, - 30; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 31; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 43; 4; 0.737277, 0.675591, -0.000000, -0.000000;;, - 52; 4; 0.642787, 0.766045, 0.000000, -0.000000;;, - 61; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 68; 4; 0.939693, 0.342020, -0.000000, -0.000000;;, - 76; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 77; 4; 0.819152, 0.573577, -0.000000, -0.000000;;, - 85; 4; 0.441186, 0.831001, 0.214867, -0.261961;;, - 93; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 96; 4; 0.932169, 0.360972, -0.014558, 0.023425;;, - 115; 4; 1.000000, -0.000000, -0.000000, -0.000000;;, - 135; 4; 0.874620, 0.484809, -0.000000, -0.000000;;, - 139; 4; 0.980002, 0.198988, -0.000000, -0.000000;;, - 160; 4; 0.819152, 0.573576, -0.000000, 0.000000;;, - 161; 4; 0.819152, 0.573577, -0.000000, 0.000000;;, - 175; 4; 0.902585, 0.430511, -0.000000, 0.000000;;, - 178; 4; 0.674571, 0.738210, -0.000000, 0.000000;;, - 182; 4; 0.836374, 0.548160, -0.000000, 0.000000;;, - 185; 4; 0.666576, 0.745437, -0.000000, 0.000000;;, - 188; 4; 0.756143, 0.654407, -0.000000, 0.000000;;, - 192; 4; 0.686772, 0.726874, -0.000000, 0.000000;;, - 216; 4; 0.819152, 0.573576, -0.000000, 0.000000;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -0.446586, 0.000001, -24.389267;;, - 77; 3; -0.446586, 0.000001, -24.389267;;, - 115; 3; -0.446586, 0.000001, -24.389267;;, - 135; 3; -0.446586, 0.000001, -24.389267;;; - } - } - - Animation x3ds_anim_7 { - {x3ds_L_Hand} - AnimationKey { - 0; - 10; - 0; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 68; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 77; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 85; 4; 0.099989, 0.083901, -0.759491, -0.637289;;, - 93; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 115; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 135; 4; 0.092296, 0.092296, -0.701057, -0.701057;;, - 160; 4; 0.088182, 0.096234, -0.669811, -0.730970;;, - 161; 4; 0.088182, 0.096234, -0.669810, -0.730970;;, - 216; 4; 0.088182, 0.096234, -0.669810, -0.730970;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -1.719951, -0.532492, -32.044598;;, - 77; 3; -1.719951, -0.532492, -32.044598;;, - 115; 3; -1.719951, -0.532492, -32.044598;;, - 135; 3; -1.719951, -0.532492, -32.044598;;; - } - } - - Animation x3ds_anim_8 { - {x3ds_Head} - AnimationKey { - 0; - 26; - 0; 4; -0.000000, -0.999048, 0.043619, -0.000000;;, - 6; 4; -0.000000, -0.997564, -0.069756, -0.000000;;, - 15; 4; -0.000000, -0.999657, -0.026177, -0.000000;;, - 26; 4; -0.000000, -0.999391, 0.034899, -0.000000;;, - 52; 4; 0.057153, -0.973623, -0.220877, -0.002109;;, - 61; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 68; 4; -0.328848, -0.929469, 0.165640, 0.022582;;, - 76; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 77; 4; -0.000000, -0.999391, 0.034900, -0.000000;;, - 85; 4; 0.130447, -0.990841, 0.034601, 0.004555;;, - 93; 4; 0.000000, -0.999391, 0.034900, -0.000000;;, - 115; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 135; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 175; 4; -0.000000, -0.999048, 0.043621, -0.000000;;, - 177; 4; 0.121753, -0.991602, 0.043296, 0.005316;;, - 179; 4; -0.017436, -0.998896, 0.043614, -0.000761;;, - 181; 4; 0.139040, -0.989326, 0.043196, 0.006071;;, - 183; 4; -0.034867, -0.998440, 0.043594, -0.001522;;, - 185; 4; 0.121752, -0.991602, 0.043296, 0.005316;;, - 187; 4; -0.026153, -0.998706, 0.043606, -0.001142;;, - 189; 4; 0.142432, -0.972455, -0.180232, 0.039500;;, - 191; 4; -0.109249, -0.975409, -0.173314, -0.081269;;, - 193; 4; 0.130401, -0.990501, 0.043248, 0.005694;;, - 195; 4; -0.043578, -0.998097, 0.043579, -0.001903;;, - 197; 4; 0.173153, -0.983648, 0.043642, 0.023447;;, - 199; 4; -0.065922, -0.988029, 0.137452, 0.023655;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 8; - 0; 3; 0.000000, 0.320922, 43.031700;;, - 93; 3; 0.000000, 0.320922, 43.031700;;, - 115; 3; 0.000000, 0.320922, 43.031700;;, - 135; 3; 0.000000, 0.320922, 43.031700;;, - 160; 3; 0.000000, 0.320922, 43.031700;;, - 161; 3; 0.000000, 0.320922, 43.031700;;, - 175; 3; 0.000000, 0.320922, 43.031700;;, - 216; 3; 0.000000, 0.320922, 43.031700;;; - } - } - - Animation x3ds_anim_9 { - {x3ds_RU_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 21; 4; 0.124791, -0.009789, -0.874977, 0.467703;;, - 30; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 37; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 43; 4; 0.125169, 0.001125, -0.912411, 0.389664;;, - 52; 4; 0.125097, 0.004401, -0.922298, 0.365647;;, - 61; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 68; 4; 0.125154, 0.002217, -0.915776, 0.381687;;, - 76; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 77; 4; 0.124939, 0.007674, -0.931554, 0.341379;;, - 85; 4; 0.124485, 0.013117, -0.945558, 0.300420;;, - 93; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 100; 4; 0.240075, 0.038409, -0.943098, 0.226838;;, - 115; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 135; 4; 0.250380, -0.000000, -0.968148, -0.000000;;, - 139; 4; 0.230082, -0.060758, -0.927524, 0.288220;;, - 146; 4; 0.215704, -0.060817, -0.923441, 0.311497;;, - 150; 4; 0.209892, -0.016602, -0.963089, 0.167717;;, - 160; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 161; 4; 0.124939, 0.007674, -0.931554, 0.341378;;, - 175; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 178; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 181; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 184; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 187; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 190; 4; 0.124460, 0.013347, -0.946112, 0.298672;;, - 193; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 207; 4; 0.116047, 0.046921, -0.991735, 0.028151;;, - 216; 4; 0.124939, 0.007674, -0.931554, 0.341378;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 6.849594, 0.163909, 2.374462;;, - 77; 3; 6.849594, 0.163909, 2.374462;;, - 115; 3; 6.849594, 0.163909, 2.374462;;, - 135; 3; 6.849594, 0.163909, 2.374462;;; - } - } - - Animation x3ds_anim_10 { - {x3ds_RL_Leg} - AnimationKey { - 0; - 30; - 0; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 1; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 11; 4; 0.438280, 0.897779, -0.019136, -0.039198;;, - 21; 4; 0.422215, 0.905446, -0.018434, -0.039533;;, - 26; 4; 0.439586, 0.897141, -0.019193, -0.039170;;, - 30; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 37; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 43; 4; 0.484348, 0.873787, -0.021147, -0.038150;;, - 52; 4; 0.499524, 0.865201, -0.021810, -0.037775;;, - 61; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 68; 4; 0.573030, 0.818373, -0.025019, -0.035731;;, - 76; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 77; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 93; 4; 0.536788, 0.842589, -0.023437, -0.036788;;, - 115; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 135; 4; 0.706434, 0.706434, -0.030844, -0.030844;;, - 139; 4; 0.319106, 0.946715, -0.013933, -0.041334;;, - 146; 4; 0.007542, 0.999020, -0.000329, -0.043618;;, - 150; 4; -0.025078, 0.998734, 0.001095, -0.043606;;, - 160; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 161; 4; 0.536789, 0.842588, -0.023437, -0.036788;;, - 175; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 178; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 181; 4; 0.655435, 0.753991, -0.028617, -0.032920;;, - 184; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 187; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 190; 4; 0.267123, 0.962675, -0.011663, -0.042031;;, - 193; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 207; 4; 0.655436, 0.753991, -0.028617, -0.032920;;, - 216; 4; 0.536789, 0.842588, -0.023437, -0.036788;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -3.359494, 0.259702, 38.976971;;, - 77; 3; -3.359494, 0.259702, 38.976971;;, - 115; 3; -3.359494, 0.259702, 38.976971;;, - 135; 3; -3.359494, 0.259702, 38.976971;;; - } - } - - Animation x3ds_anim_11 { - {x3ds_R_Foot} - AnimationKey { - 0; - 29; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 11; 4; 0.693619, 0.137449, 0.693620, -0.137448;;, - 21; 4; 0.703851, 0.067776, 0.703851, -0.067776;;, - 26; 4; 0.702932, 0.076726, 0.702932, -0.076726;;, - 30; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 37; 4; 0.701057, 0.092296, 0.701058, -0.092296;;, - 52; 4; 0.700211, 0.098511, 0.700211, -0.098511;;, - 61; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 68; 4; 0.690345, 0.153046, 0.690346, -0.153046;;, - 76; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 77; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 93; 4; 0.701057, 0.092296, 0.701057, -0.092296;;, - 115; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 135; 4; 0.707107, -0.000000, 0.707107, 0.000000;;, - 139; 4; 0.636494, 0.308019, 0.636494, -0.308019;;, - 146; 4; 0.705581, -0.046427, 0.705581, 0.046427;;, - 150; 4; 0.682577, -0.184629, 0.682578, 0.184629;;, - 160; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 161; 4; 0.701057, 0.092298, 0.701057, -0.092298;;, - 175; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 178; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 181; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 184; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 187; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 190; 4; 0.691481, -0.147833, 0.691481, 0.147833;;, - 193; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 207; 4; 0.706676, -0.024676, 0.706676, 0.024676;;, - 216; 4; 0.701057, 0.092298, 0.701057, -0.092298;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; -0.849455, -62.299629, -3.801312;;, - 115; 3; -0.849455, -62.299629, -3.801312;;, - 135; 3; -0.849455, -62.299629, -3.801312;;; - } - } - - Animation x3ds_anim_12 { - {x3ds_LU_Leg} - AnimationKey { - 0; - 30; - 0; 4; -0.043619, -0.000000, -0.999048, 0.000000;;, - 1; 4; -0.128543, 0.007574, -0.976382, -0.173483;;, - 11; 4; -0.134779, 0.015787, -0.981832, -0.132631;;, - 21; 4; -0.128729, 0.003084, -0.969733, -0.207452;;, - 30; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 37; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 43; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 52; 4; -0.128201, 0.012056, -0.981842, -0.139302;;, - 61; 4; -0.128543, 0.007574, -0.976383, -0.173482;;, - 68; 4; -0.128751, 0.001960, -0.967886, -0.215906;;, - 76; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 77; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 85; 4; -0.128751, 0.001960, -0.967886, -0.215907;;, - 93; 4; -0.128543, 0.007574, -0.976383, -0.173483;;, - 100; 4; -0.098715, 0.012488, -0.994248, -0.039635;;, - 115; 4; -0.199368, -0.000000, -0.979925, -0.000000;;, - 135; 4; -0.180689, 0.084257, -0.888113, 0.414134;;, - 139; 4; -0.148626, 0.124737, -0.776470, 0.599538;;, - 160; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 161; 4; -0.128542, 0.007574, -0.976383, -0.173482;;, - 175; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 178; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 181; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 184; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 187; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 190; 4; -0.112759, 0.062175, -0.955955, 0.263761;;, - 193; 4; -0.124735, 0.031962, -0.991546, 0.016008;;, - 207; 4; -0.124735, 0.031962, -0.991546, 0.016007;;, - 212; 4; -0.128488, 0.008447, -0.977538, -0.166852;;, - 216; 4; -0.128542, 0.007575, -0.976383, -0.173479;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; -5.995693, 0.163913, 2.695592;;, - 77; 3; -5.995690, 0.163913, 2.695592;;, - 115; 3; -5.995690, 0.163913, 2.695592;;, - 135; 3; -5.995690, 0.163913, 2.695592;;; - } - } - - Animation x3ds_anim_13 { - {x3ds_LL_Leg} - AnimationKey { - 0; - 34; - 0; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 1; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 6; 4; 0.551866, 0.832791, 0.024095, 0.036360;;, - 11; 4; 0.510806, 0.858589, 0.022302, 0.037487;;, - 21; 4; 0.521998, 0.851831, 0.022791, 0.037192;;, - 26; 4; 0.541375, 0.839649, 0.023637, 0.036660;;, - 30; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 37; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 43; 4; 0.522001, 0.851829, 0.022791, 0.037192;;, - 52; 4; 0.544120, 0.837873, 0.023757, 0.036582;;, - 61; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 68; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 76; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 77; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 93; 4; 0.580150, 0.813341, 0.025330, 0.035511;;, - 104; 4; 0.564968, 0.823959, 0.024667, 0.035975;;, - 115; 4; 0.706434, 0.706434, 0.030844, 0.030844;;, - 135; 4; 0.087073, 0.995247, 0.003802, 0.043453;;, - 139; 4; -0.244382, 0.968698, -0.010670, 0.042294;;, - 155; 4; 0.218585, 0.974843, 0.009544, 0.042563;;, - 160; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 161; 4; 0.580151, 0.813340, 0.025330, 0.035511;;, - 168; 4; 0.350698, 0.935472, 0.015312, 0.040844;;, - 172; 4; 0.439930, 0.896972, 0.019208, 0.039163;;, - 175; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 178; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 181; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 184; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 187; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 190; 4; 0.300421, 0.952809, 0.013117, 0.041600;;, - 193; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 207; 4; 0.674949, 0.736575, 0.029469, 0.032160;;, - 212; 4; 0.495151, 0.867712, 0.021619, 0.037885;;, - 216; 4; 0.580152, 0.813340, 0.025330, 0.035511;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 4; - 0; 3; 3.943333, 0.259710, 39.672764;;, - 77; 3; 3.943333, 0.259710, 39.672764;;, - 115; 3; 3.943333, 0.259710, 39.672764;;, - 135; 3; 3.943333, 0.259710, 39.672764;;; - } - } - - Animation x3ds_anim_14 { - {x3ds_L_Foot} - AnimationKey { - 0; - 34; - 0; 4; 0.707107, 0.000000, 0.707107, -0.000000;;, - 1; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 6; 4; 0.680588, -0.191834, 0.680588, 0.191834;;, - 11; 4; 0.677475, -0.202553, 0.677475, 0.202553;;, - 21; 4; 0.676210, -0.206736, 0.676210, 0.206736;;, - 26; 4; 0.677620, -0.202065, 0.677621, 0.202065;;, - 30; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 37; 4; 0.687569, -0.165071, 0.687569, 0.165071;;, - 43; 4; 0.681390, -0.188966, 0.681390, 0.188966;;, - 52; 4; 0.690346, -0.153046, 0.690346, 0.153046;;, - 61; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 68; 4; 0.679364, -0.196123, 0.679364, 0.196123;;, - 76; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 77; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 93; 4; 0.687569, -0.165070, 0.687570, 0.165070;;, - 100; 4; 0.705872, 0.041770, 0.705872, -0.041770;;, - 104; 4; 0.698511, 0.109917, 0.698512, -0.109917;;, - 115; 4; 0.707107, -0.000002, 0.707107, 0.000002;;, - 135; 4; 0.612373, 0.353552, 0.612373, -0.353552;;, - 139; 4; 0.672346, 0.218976, 0.672346, -0.218976;;, - 155; 4; 0.659223, -0.255782, 0.659223, 0.255782;;, - 160; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 161; 4; 0.687569, -0.165072, 0.687569, 0.165072;;, - 168; 4; 0.705347, 0.049859, 0.705347, -0.049859;;, - 172; 4; 0.706854, -0.018889, 0.706854, 0.018889;;, - 175; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 178; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 181; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 184; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 187; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 190; 4; 0.690338, -0.153079, 0.690338, 0.153079;;, - 193; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 207; 4; 0.706864, -0.018543, 0.706864, 0.018543;;, - 216; 4; 0.687569, -0.165072, 0.687569, 0.165072;;; - } - AnimationKey { - 1; - 4; - 0; 3; 1.000000, 1.000000, 1.000000;;, - 77; 3; 1.000000, 1.000000, 1.000000;;, - 115; 3; 1.000000, 1.000000, 1.000000;;, - 135; 3; 1.000000, 1.000000, 1.000000;;; - } - AnimationKey { - 2; - 3; - 0; 3; 1.061092, -63.263000, -4.043970;;, - 115; 3; 1.061092, -63.263000, -4.043970;;, - 135; 3; 1.061092, -63.263000, -4.043970;;; - } - } - -} - diff --git a/sdk/samples/rockem/skmechbk.ppm b/sdk/samples/rockem/skmechbk.ppm deleted file mode 100644 index 3bc590d..0000000 --- a/sdk/samples/rockem/skmechbk.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 128 -255 -,<DDDLDLDLDLDDDDDDLDLLDDLLDDDDL$$TDDLL$$LLDLDLDLDLDD$<DLDDDDDDDDDDDDDLDDDLDLDLDLDLDLDLDLDLD$DDDDLDLDLLDDDDDDLDLDLDLDLDLDLLLLLDLLLLLLLL$<LD́üüüüüüüüüüüüüüüüüüüüüüüüüüǜ̀̀ÔÔÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLDüüTTüTTüTTüTTüTTüTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTüTTüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLüüTTüTTü\\ü\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLDüüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLLDüüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLüüTTüTTü\\üTTüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLĹüTTüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLüüTTüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDDLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüüüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüüDLLüüTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüüDLDüüTTüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDLLüüTTüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüLüüüDLLüüTTüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüDüüüDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüô$<LLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüü$<LDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüLüüôDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüü LLüüôDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüôLLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüLLüüôDLLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüüüüüüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüLLüüôDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDDLüüüüüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüTüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüüLDüüôDDLüüü \üüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüDLüüüDLDüüüDüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜüüüüüüüüüüüüüüüüüüüüüLDLüüôLDLüüüLüüüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüǘLLLüüôDLDüüüDüüüüüüüüüüüüüüüüüüüLDLLL””œÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüü DLLDüüüDLLüüüLüüüüüüüüüüüüüüüüüDL DD LDLœœœ¤¤¤ÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüDLDLüüüDLDüüüLäüüüüüüüüüüüüüüüDLLDLDLD””œœœœÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüLDLDLLüüôDLDüüüLäüüüüüüüüüüüüüüüDLLDLDLD””œœœœÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüLDLDLLüüôDLLüüü DLüüüüüüüüüüüüüôü DL DLDLLD”””œœœœœœœœœÜÜÜÜÜÜüüüüüüüüüüüLDLL LLLD LDLLDüüôLLLüüüLLüüüüüüüüüüüüüLLLDLDLLLL””œœœœœœœœœœœœœ¤¤¤LüüüüüüüüLLLLDDLDLLDLDDLüüôDDLüüüLDüüüüüüüüüüüüLDLDLDLLDLDœœœœœœ”””œœœ”””””œDDüüüüüüL DLDLDLDDLDL DLLDüüüDLLüüüLLLüüüüüüüüüüDLLLLDLDDLLL””œœœœœœœœœœœœœœœœDLLLüü LLLLD LDL DLDLLLLDDLüüôLDLüüüDLLDüüüüüüüL DL DLDDLDLDLDLœœœœœœœœœ”””œœœœœœL LDLDDLLDDLDLLLD LDL DDLL DüüüDLLüüü LLL LLüüüüLDLDDLD LDLL DL DLD”””œœœœœœœœœœœœ”””LDLLDLDDLDLLDLDLLLLDLDDLüôôDLDüüüLDLDLDDLLLL DLLLLDL DLLLDDL”””œœœ”””œœœ”””””œLLL LLDLLLL LLLDDLDL DLD LLLüôüDLDüüüLDLDLDDLLLL DLLLLDL DLLLDDL”””œœœ”””œœœ”””””œLLL LLDLLLL LLLDDLDL DLD LLLüôüDLLüüüL DDLDLDLDLDLL DL DLLLLDLDLD””œœœœœœœœœœœœœœœœDDLDLLL LDDLDLLLLLDLDLDLDüôôLLDüüüLDLDDLLLLDLDLLDLDLDDLDLDLœœœœœœœœœ”””œœœœœœLLLLD LDLDLDLDLLDDLDL DLL LüôôLLLüüüLDDLD LDLDL LLDDLLD DL LDD LLL”””œœœœœœœœœœœœ”””LDLDLDLLLLL¤¤¤¤¤¤¤LLLDDLüôôDLDüüüLLL LLLLDLDLDLLDLDLDDLDLDLœœœœœœœœœœœœ”””””œDD LLLLDLD¤¤¤¤¤¤¤¤¤¤DLLLLôüüDLLüüüLDDLDLDLLDDLDDL LLLLLDLDLD”””œœœœœœ”””œœœœœœDLLLDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDLDüôôLDLüüüüLLDDLLL¤¤¤¤¤LDLDLDLDDLDLœœœœœœ”””œœœœœœ””œLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLD LôüüDLDüüüüLLL LLD¤¤¤¤¤¤¤LDLDLLLDLLD””œœœœœœœœœœ”””œœœLœ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLLüôüüDLDüüüüLLL LLD¤¤¤¤¤¤¤LDLDLLLDLLD””œœœœœœœœœœ”””œœœLœ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLLüôüüDLLüüüüDLDDL¤¤¤¤¤¤¤¤¤LLLDDLLLLLœœœ”””””œœœœœœœ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤L DLüüôôDLDüüüüü LLLL¤¤¤¤¤¤¤¤¤¤DDLLDDLDLœœœœœœœœœ¤¤¤´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDDüôüüDLLüüüüüLDLD¤¤¤¤¤¤¤¤¤¤œLLDLLDDL¤¤¤œœœ´´´´´´¼¼¼´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDLüôôôLLDüüüüüDLDL¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LL LüôüôDLDüüüüüLDDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDLüüô ́äüüôüüüüL LDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´¼¼¼´´´¼¼¼´´´¼¼¼¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLLüôüôüüüüüüüüDLLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤”LDLüôüüüüüüüüüüDLLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤”LDLüôüüüüüüüüüüLDDL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLDDüüôôüüüüüüüüLLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´¼¼¼´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DDL LüüüüüüüüüüüüLDLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´¼¼¼´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤œLDLüüüüüüüüüüüüüDLLDœ¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LDDLüüüüüüüüüüüüüüLDLL¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´¼¼¼´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤L DLDüüüüüüüüüüüüüüLLLLœ¤¤¤¤¤¤¤¤¤¤¤œ¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤DLDLüüüüüüüüüüüüüüüDLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLDLLüüüüüüüüüüüüüüüDLLD¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´´´´¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤LLDLLüüüüüüüüüüüüüüüLDDLD¤¤¤¤¤¤L DL DL DDLDL¤¤¤œœœœœœœœœ”””¤¤¤LDLDLLDLL¤¤¤¤¤¤¤œLLL LüüüüüüüüüüüüüüüüLLLDLD¤¤¤LDLDDLLLLDLDœœœ””œœœœœœœœœœœœœDLDLDL LLDLD¤¤¤¤¤LLLDLüüüüüüüüüüüüüüüü LDD LL DLDLDLDLDLDLLLLLœœœœœœ”””œœœœœœ””œLLDDLLDD LDLD”¤LDLDLDüüüüüüüüüüüüüüüüüüLLDLDDLDLDLDLDLDLDDLœœœ”””œœœœœœ”””œœœD LLL LLLLLLLL LLLLLLLLüüüüüüüüüüüüüüüüüüüDLDLDLLLLLDDLLDDLLDœœœœœœ”””œœœœœœ”””LDDDDDD DDDDDLDLDDLDLüüüüüüüüüüüüüüüüüüüLLLD LDLDL LLL LLLLL LLœœœœœœœœœœœœ”””¤¤¤LLLLLLLLLL LLLDDLDLLLüüüüüüüüüüüüüüüüüüüüDDLDLD LüüüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüǘLDDL LüüüüüüüüüüüüüüüüüüüüüDDLDLD LüüüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüǘLDDL Lüüüüüüüüüüüüüüüüüüüüü LDLLLLüüüüüüüüüüüüäääÜÜÜÜÜÜÜÜÜÜÜÜäääüüüüüüüüüüüüüüDD LDüüüüüüüüüüüüüüüüüüüüüüüLDLüüüüDDLDDLLDDLDLDLDLDDDDLLDDLLD́üüüLDLüüüüüüüüüüüüüüüüüüüüüüüT LüüüüLDLDLLDLDDDLDLDLDLDLLDDLDLLLLDüüüLLüüüüüüüüüüüüüüüüüüüüüüüüüüüüLDLLLDLDLDLDDDDDDDDDDDDLDLDDDDLD́üüüüüüüüüüüüüüüüüüüüüüüüLüüüǘDDLŒ ´”´”´Œ ´Œ´Œ ´Œ´Œ ´Œ´Œ´Œ´”´”´Œ´”´Œ´”´Œ´Œ´Œ´Œ´Œ´Œ´Œ´”´”´Œ ´DLDDüüüüLüüüüüüüüüüüüüüüüüüüLDüüüDLLD”´”´”´”´”´”´”´”´”´”´´´´´´´´´´´´´´´´´´´”´”´”´Œ´”´”´Œ´Œ´”´”´”´DDDLüüüLLüüüüüüüüüüüüüüüüüüüü \üüüLLŒ¬”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´Œ ´¼¼¼´´´´´´´´´´´´´´´”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´”´”´$<LLTü\DLüüüüüüüüüüüüüüüüüüüü \üüüLLŒ¬”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´Œ ´¼¼¼´´´´´´´´´´´´´´´”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´”´”´”´$<LLTü\DLüüüüüüüüüüüüüüüüüüüüüDLLDDŒ ´Œ´Œ´¤ü¤ü¤ü¤ü¤ü¤üœüœü¤üÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔܤü¤ü¤ü¤üœü¤üœüœü¤üœü”¤„¬”´DDLDL \üüüüüüüüüüüüüüüüüüüüüüLDDL”´”´”´¤üœü¤ü¤üœü¤ü¤üœü¤üœüÜÜÜÔÔÜÔÔÔÜÜÜÔÔÔÜÜܤüœü¤üœü¤ü¤üœü¤ü¤üœü”üŒ´Œ´”´DLL \üüüüüüüüüüüüüüüüüüüüüüüü \\<d”´Œ ´œüDd”¬¬<üœü¤üœüœü¤üœü¤üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœüœü¤ü¤ü¤ü¤ü¤ü¤üœü¤üœüŒ´„¬Œ´DLüüüüüüüüüüüüüüüüüüüüüüüüüüüü„¬”Äœü¤ü<\Œ´¼Lü¤ü¤ü¤ü¤üœü¤üœüÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜœüœü¤üœü¤üœü¤üœü¤üœüœüœüŒ´Œ´Œ¬üüüüüüüüüüüüüüüüüüüüüüüüüüüüüŒ´Œ´¤ü<dŒ´Œ´¬<ü¤üœü¤üœü¤üœüœü¤ü¤üœüœüœüœüœü¤ü¤ü¤üœü¤üœüœü¤üŒ´œüœüœüŒ ´Œ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüüŒ´Œ¬<dD\Œ´Œ¬¼Lü¬<ü¤üœü¤üœü¤üœüœüœüœüœüœüœüœüœü¤üœü¤ü¤üœü¤ü¤üŒ ´Œ´œüœüœü„¬üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”¤œüL dD\Œ¬Œ ´¬<ü¬<ü¤ü¤ü¤ü¤ü¤üœüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔܤü¤ü¤ü¤ü¤ü¤ü¤ü¤üœüŒ´”´œüœüœüŒ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”¤œüL dD\Œ¬Œ ´¬<ü¬<ü¤ü¤ü¤ü¤ü¤üœüÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔܤü¤ü¤ü¤ü¤ü¤ü¤ü¤üœüŒ´”´œüœüœüŒ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœüDd<\Œ´Œ´¬<ü¼Lü¤üœüœü¤üœü¤üÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜܤü¤üœüœü¤üœü¤üœü¤ü”´Œ´”´œü”üŒ´üüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœüL dD\Œ´”´¼Lü¬<üœü¤ü¤ü¤ü¤ü¤üÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜœü¤üœü¤üœüœü¤ü¤ü¤üŒ´Œ´Œ´D\D\”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœü<\Dd”¬Œ´´Dô¬<ü¤ü¤ü¤üœü¤üœüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔ¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü”´Œ¬”´D\<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\D\Œ´”´´Dü´Düœü¤üœü¤üœü¤üÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜܤüœü¤ü¤üœü¤üœü¤ü¤üŒ´”´Œ´<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœü<\L dŒ´Œ´¬<ü´Dü¤ü¤ü¤üœü¤üœüÜÜÜÔÔÜÜÜÜÔÔÜÜÜÜÜÜܤü¤ü¤ü¤ü¤ü¤üœüœü¤ü”´Œ´Œ´D\<dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüDdD\Œ¬Œ´´Dô´Dü¤üœü¤ü¤ü¤ü¤üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœü¤üœü¤üœü¤üœü¤üŒ´Œ´Œ¬Œ´D\Dd”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ´Œ´´Dü´Dü´Dü¤ü¤üœüœü¤üœüœüœü”üœü”üœüœü¤üœü¤ü¤ü¤ü¤üŒ´Œ ´Œ´Œ ´D\<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ´Œ´´Dü´Dü´Dü¤ü¤üœüœü¤üœüœüœü”üœü”üœüœü¤üœü¤ü¤ü¤ü¤üŒ´Œ ´Œ´Œ ´D\<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüL dD\Œ´„¬´Dü¬<ü´Dü¬Düœü¤ü¤üœüœüœüœüœüœüœüœü¤ü¤ü¤üœü¤üœü¤üŒ ´Œ´”´Œ´<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ¬Œ´¬<ü¼Lü´Dü¬<ü¤üœüœü¤üÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜܤü¤üœü¤üœüœü¤üŒ´Œ´Œ¬Œ´”´D\<dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”üL dD\Œ´Œ´´Dü¬<ü¬<ü´Dü¤ü¤ü¤ü¤üÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜœüœü¤üœü¤üœü¤ü”´Œ´Œ ´Œ´Œ ´<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ ´Œ¬”´Œ¬¬<ü´Dô´Dü´Düœü¤üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔ¤üœü¤ü¤üœü¤üœüŒ ´”´”´Œ´Œ´D\Ddœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\L dŒ´”´Œ ´Œ´Œ ´´Tô¬<ü¬Dü´Dü¤üÔÔÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜœü¤üœüœü¤üœü¤üŒ´Œ¬Œ´”¬”´<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü”üœü<\DdŒ´Œ´Œ´Œ´”´Œ´Œ´´Dô¬Dü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜܤü¤ü¤ü¤üœü¤üœüŒ´”´Œ´Œ´Œ´D\DdœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüDd<\Œ´Œ ´Œ´”´Œ´Œ´Œ ´Œ´Œ¬¬<ǜ̀̀ÜÜÜÜÜÜÔÔÜÜÜÜÔÔܤü¤üœüœü¤ü¤ü¤üŒ ´Œ´”´Œ´”´<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüDd<\Œ´Œ ´Œ´”´Œ´Œ´Œ ´Œ´Œ¬¬<ǜ̀̀ÜÜÜÜÜÜÔÔÜÜÜÜÔÔܤü¤üœüœü¤ü¤ü¤üŒ ´Œ´”´Œ´”´<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ´”´Œ ´Œ´Œ ´Œ¬Œ´”´Œ ´Œ´Œ´Œ¬œüœüœü¤ü¤üœü¤ü¤üœüœü”´”´Œ¬Œ´Œ¬Œ´Dd<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\L dŒ´Œ´”´Œ´Œ´”´”´Œ¬Œ´”´Œ´Œ´œ́œüœüœüœü¤ü¤ü¤ü¤ü”´Œ ´Œ´Œ´Œ´”´Dd<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<\DdŒ ´”´Œ´Œ´Œ´Œ´Œ ´”´Œ´Œ´´´´´´´´´´´´´´´´´¬¼¤üœü¤üŒ´Œ´Œ´Œ´Œ¬”´Œ´Œ´D\L d<\”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\L dŒ´Œ´”´Œ´Œ´Œ´Œ´Œ´”¬Œ´´´´¼¼¼¼¼¼´´´´´´´´´Œ´”´Œ¬”´Œ´Œ ´”´Œ´Œ ´”´Œ´Dd<\L dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœü<dD\Œ´”´Œ¬”´”´Œ ´Œ´”´Œ´Œ´´´´´´´´´´´´´´´´´´´”´Œ ´”´Œ´”´Œ´Œ¬”´Œ´Œ´Œ ´L d<\DdœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüL d<\D\Œ ´Œ´Œ´Œ´Œ´Œ´Œ´Œ ´”´´´´´´´´´´´´´´´´´´´Œ¬Œ´Œ´Œ´Œ´”´Œ´Œ ´Œ´Œ´D\D\<dL dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüD\<d<dD\Œ´Œ´Œ´Œ´Œ ´”´”´Œ´Œ´„¬Œ$´Œ´Œ´Œ$´Œ´Œ´Œ¬Œ´”´Œ´Œ´”´Œ´L d<\<\DdD\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüD\<d<dD\Œ´Œ´Œ´Œ´Œ ´”´”´Œ´Œ´„¬Œ$´Œ´Œ´Œ$´Œ´Œ´Œ¬Œ´”´Œ´Œ´”´Œ´L d<\<\DdD\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”ü<\L dL d<\D\L dL dŒ´Œ´Œ´Œ´Œ´Œ´Œ´Œ´„¬Œ´Œ´„¬Œ´Œ ´Œ¬Œ ´Œ´”´Œ´„¬D\DdL d<\L d”üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœüœüD\<d<dD\D\<d<\D\D\Œ´Œ´Œ´Œ$´Œ´Œ´Œ´Œ´Œ´Œ¬Œ´”´Œ´”´Œ´Œ´D\Dd<dD\<\Dd<\œüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüœü”üD\DdL d<\<\L dL d<d<dL dL dŒ¬´´´´´´´´´´´´´´´´´´Œ´Œ´Œ´Œ´Œ´DdD\<\L dL dD\D\<dL dœüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü¤äœüD\DdDdD\D\D\D\D\D\D\D\<dœœœœœœœœœœœœœœœœœœDdL d<\<\Dd<\L dL d<\D\DdL d<\D\œüüüüüüüüüüüüüüD\L dD\L dDd<dL dL d<dDdL dL dDd<dL dL d<\L dL d<\<\L dL d<d<dL dL d<d<\L dœœœœœœœœœœœœœœœœœœD\<\DdDdD\L dD\D\DdL d<\D\<dL dL d<dDdL dL dDd<dL dL d<dDdL dL dD\DdD\D\D\D\D\D\D\D\D\D\D\D\D\D\D\DdD\D\DdDdD\D\D\D\D\D\D\DdD\<\D\D\<\Dd<\DdD\DdD\DdD\DdDdD\D\DdD\D\D\D\D\D\D\D\D\D\D\D\D\D\D\D\DdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdD\DdD\DdD\DdD\DdD\D\DdD\DdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdD\DdD\DdD\DdD\DdD\D\DdD\DdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDd \ No newline at end of file diff --git a/sdk/samples/rockem/skmechbt.ppm b/sdk/samples/rockem/skmechbt.ppm deleted file mode 100644 index 3f6819d..0000000 Binary files a/sdk/samples/rockem/skmechbt.ppm and /dev/null differ diff --git a/sdk/samples/rockem/skmechch.ppm b/sdk/samples/rockem/skmechch.ppm deleted file mode 100644 index 4c6c0dc..0000000 --- a/sdk/samples/rockem/skmechch.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 128 -255 -LL LLLLLLLLLLLLLLLLLLLLLLL LLL LDœœœœœœ”””œœœœœœLLLLLLLLLLLLLLLLLLLLLLLLL LLL DLDLLLLL LLL LLL LLLLL LLL LLL LLLLLLœœœœœœœœœœœœœœœLLLLLLL LLL LLL LLLLL LLL LLL LLLLLLLTTüTTü\\üTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\üTTü¼¼¼œœœ”””œœœ¼¼¼\\ü\\üTTü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTüTTüLLL\\üTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü\\üTTüTTü\\ü\\üTTü\\ü´´´œœœœœœœœœ´´´TTüTTü\\üTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üTTüTTü\\üTTüTTü\\ü\\üTTüTTü\\ü\\üLLDTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTü\\üTTüTTü´´´œœœ”””œœœ´´´\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüLLDTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTü\\üTTüTTü´´´œœœ”””œœœ´´´\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüLLL\\üTTüüüüüüüüüüüüüüüüüüüüüüüüTTüTTü\\ü´´´œœœœœœœœœ´´´TTü\\üTTüüüüüüüüüüüüüüüüüüüüüüüüTTüTTüDLDTTü\\üüüüüüüüüüüüüüüüüüüüüüüüüTTüTTü´´´œœœœœœœœœ´´´\\üTTüüüüüüüüüüüüüüüüüüüüüüüüüüTTüLLLTTüTTüüüüüüüüüüüüüüüüüüüüüüüüüü\\ü´´´œœœ”””œœœ´´´TTüüüüüüüüüüüüüüüüüüüüüüüüüüüTTüLœœœœœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜ´´´´´´œœœœœœœœœ´´´´´´ÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ´´´œœœœœœœœœ´´´´´´ÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´´´´œœœ”””œœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜ´´´œœœœœœœœœ´´´´´´ÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´´´´œœœ”””œœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜ´´´œœœœœœ”””´´´´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ´´´´´´œœœœœœœœœ´´´´´´ÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœ””œ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœ””œ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜ´´´œœœœœœœœœ´´´ÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜ´´´œœœDL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LLLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´¬¼œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤ LDLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´¬¼üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LLL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LLL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ””œœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤DLL\\üüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ¼¼¼üüüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLTTüüüüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüüü¤Lœœœ¤¤¤œœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ”””¤¤¤œœœ¤¤¤œœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔ”””¤¤¤œœœ”””œœœÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔ´´´œœœ”””œœœ´´´ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœœœœœœœœœœœœœœœÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜœœœœœœœœœœœœ”””ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ”””œœœœœœœœœœœœÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜœœœœœœœœœœœœœœœÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ””œœœœœœœœœœœœœÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ””œœœœœœœœœœ””œÜÜÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜœœœ¤¤¤LDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ””œœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLLD¤üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü ¬LLLDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´¬¼üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´¬¼üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLL L¤üüüüüüüüüüüüüüüüüüüüüüüüüü´¬¼œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü ¬ LLLDL ¬üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü¤LDLLL¤üüüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœœœœœœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüüü¤DLLLL¤¤üüüüüüüüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüüüüüüüü¤¤DDœœœœœœœœœœœœœœœÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔœœœœœœœœœœœœœœœœœœœœœœœœœœœÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔœœœœœœœœœœœœœœœ”””œœœ”””œœœœœœÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜœœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””ÜÜÜÔÔÔÔÔÔÜÜÜÔÔÔÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÔÔÔÔÔÔÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜÔÔÔ”””œœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœœœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´´´œœœ”””œœœ´´´ÔÔÔÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜœœœœœœœœœœœœ”””œœœœœœœœœœœœ””œ””œ””œ”””œœœ””œ””œ¤¤¤ÔÔÔÜÜÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜ´´´œœœœœœœœœ´´´ÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÔÔÜÜÜÜÜÜÜÔÔÜÜÜÜÔÔÔÜÜÜ””œ”””””œœœœœœœœœœ””œœœœ ¬¤LL DL ¬¤¤¤ ¬üüüüüüüüüüüüüüüüüüü´´´œœœ”””œœœ´´´üüüüüüüüüüüüüüüüüüü ¬¤¤¤¤ DL LLL¤¤LLLL D¤¤¤¤¤¤üüüüüüüüüüüüüüüü ¬´´´œœœœœœœœœ´´´¤üüüüüüüüüüüüüüüü¤¤¤¤¤¤LD DL D¤ ¬¤ L DLDLD¤¤ ¬¤ ¬¤¤üüüüüüüüüüüüüü¤´´´”””œœœ”””´¬¼¤üüüüüüüüüüüüüü ¬ ¬¤¤ ¬¤ ¬LL LDLL¤ ¬¤ L DLDLD¤¤ ¬¤ ¬¤¤üüüüüüüüüüüüüü¤´´´”””œœœ”””´¬¼¤üüüüüüüüüüüüüü ¬ ¬¤¤ ¬¤ ¬LL LDLL¤¤¤LLL LLLLL¤¤¤¤¤ ¬ ¬üüüüüüüüüüü ¬ ¬´´´œœœœœœœœœ´´´¤¤üüüüüüüüüüü ¬¤¤¤¤¤¤LLLLLLLœ¤ ¬¤LL DLLLLL DL¤¤¤¤¤ ¬¤¤¤¤¤ ¬¤¤¤¤¤Dœœœœœœœœœ””œœœœ D ¬¤¤¤ ¬¤¤¤ ¬¤¤¤¤¤ ¬ ¬œ DLLLLLDD L¤¬¬¤ LDL DLLLLLLLœ¤ ¬¤¤ ¬¤¤ ¬¤¤¤¤¤ LDL””œœœœœœœœœœœœœLLL¤ ¬¤¤¤¤¤ ¬¤¤ ¬¤¤ DLLLDLD DLLL¤ü¤¤D LLLLDLLD L DLLLLLLLLLLLLLLLLDLDLDLDDLLLLLLLLLLLLLLLLDLLL LLL DL ¬ü¤¬¤DLL LLLLLLLLLLLLLLLL LL LL LL LL$$L$$T$$L$$TLL LL LL LL LLLLLLLLLLLLL LLDDLLLüü¤¬¤DLL LLLLLLLLLLLLLLLL LL LL LL LL$$L$$T$$L$$TLL LL LL LL LLLLLLLLLLLLL LLDDLLLüü ¬¤¤LLDLLL ¬¤¤ ¬¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´´´´´´´´´´´´´´´¬¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ LLDLüüœ¤¤ DLLL L¤¤¤ ¬¤ ¬ ¬¤¤ ¬ ¬¤¤ ¬¤¤ ¬ ¬¤¤ ¬ ¬´´´´´´´´´´´´´´´¤¤ ¬ ¬¤¤ ¬ ¬¤ ¬ ¬¤¤ ¬ ¬¤¤ ¬¤ ¬¤¤¤LLL Lüüü¤¤LLDL¤¤ ¬üüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÔÔÔÔÔÜüüüüüüüüüüüüüüüüüüüüü ¬¤ DLLLüüüü¤LDL L¤ ¬üüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüü¤LLLLüüüü¤LDL L¤ ¬üüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüü¤LLLLüüüüü$<LDLL\\üüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÜÜÜÔÔÔÔÔÜüüüüüüüüüüüüüüüüüüüüüüüD LL LüüüüüüüLDLTTüüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüüL¤”üüüüüüüüLLLTTüTTüüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÔÔÜüüüüüüüüüüüüüüüüüüüüüüüD ¬¤üüüüüüüüü ¬ LLTTüüüüüüüüüüüüüüüüüüüüüÔÔÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüü LL¤üüüüüüüüüü¤LDTTüTTüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüL ¬¤üüüüüüüüüü¤LDTTüTTüüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüüL ¬¤üüüüüüüüüüü¤LTTü\\üTTüüüüüüüüüüüüüüüüüüüÜÜÜÜÜÜÔÔÔÜÜÜÜÜÜüüüüüüüüüüüüüüüüüüüüüTTüL¤¤üüüüüüüüüüü ¬”LTTü\\üüüüüTTü\\ü\\üTTüTTü\\üTTü\\üTTüTTü\\ü\\üTTüTTüÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜTTüTTü\\ü\\üTTüTTüTTüTTü\\üTTü\\üTTüTTü\\üüüüüüü\\üDL ¬üüüüüüüüüüüü¤¤LTTü\\üTTüüüTTüTTüTTüTTü\\üTTüTTü\\üTTü\\üTTüTTüTTüTTüTTüÜÜÜÜÜÜÜÜÜÔÔÔÜÜÜTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTü\\üüüüTTüTTü LL¤üüüüüüüüüüüü¤¤LLTTü\\üTTüTTüTTüTTü\\üTTüTTüDLDDDDDDLDLLDLLDDL LLLL LDLDDLTTüTTüTTü\\üüTTü\\üTTüL¤üüüüüüüüüüüüü¤¤LLTTü\\üTTüTTüTTüTTü\\üTTüTTüDLDDDDDDLDLLDLLDDL LLLL LDLDDLTTüTTüTTü\\üüTTü\\üTTüL¤üüüüüüüüüüüüüü ¬DLDTTü\\ü\\üTTü\\üTTüDLLL DL LLLLDD LD LLLDDLDLDLLLDLLLLTTüTTüTTüTTüTTüTTüTTü D¤üüüüüüüüüüüüüüü¤LDTTüTTüTTüTTüTTü$DLD¤¤¤¤¤¤¤¤ ¬¤¤¤¤¤¤ ¬¤¤¤ ¬ ¬¤¤¤¤¤¤DLLLTTü\\üTTüTTüL¬¤üüüüüüüüüüüüüüü¤DLTTü\\ü\\üTTüDL¤¤ ¬¤ ¬¤ ¬¤¤¤¤¤¤¤¤¤¤¤ ¬¤¤¤¤¤¤¤ ¬¤ ¬¤ ¬LDTTüTTüTTüLL¤¤üüüüüüüüüüüüüüü ¬¤LLTTüTTüTTüL L¤<dD\DdD\D\DdL dD\<\L dDd<\D\DdD\<d<\D\D\Dd<\D\L d<\L dD\L dD\¤¤D LLTTü LDL¤ ¬üüüüüüüüüüüüüüüü ¬¤LD LLL¤D\L dLdL dDdDdL dDdL dL dDdD\L dDdD\DdD\L dLdL dL dL dL dDdDdL dD\D\DdL d¤¤LLLLLL ¬üüüüüüüüüüüüüüüüü ¬¤LD LLL¤D\L dLdL dDdDdL dDdL dL dDdD\L dDdD\DdD\L dLdL dL dL dL dDdDdL dD\D\DdL d¤¤LLLLLL ¬üüüüüüüüüüüüüüüüü¬¤DLLL ¬¤DdL dŒ ´”´”´”´”´”´”´”´”´”´œœœ”””œœœ”””œœœ”´Œ ´”´”´”´”´”´”´”´”´”´”´D\<d¤¤L DL L¤üüüüüüüüüüüüüüüüüüü ¬ ¬DLD¤<\LT”´”´Œ ´”´”´Œ ´Œ ´”´”´Œ ´”´œœœœœœœœœœœœœœœ”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´Œ ´”´Œ ´L dDdL dœ¤LD¤¤üüüüüüüüüüüüüüüüüüüü¤¤¤¤DdL dŒ ´”´¤ü¤üœüœü¤üœü¤ü¤üœü¤ü´¬¼´´´¼¼¼´´´´¬¼¤üœü¤üœü¤üœü¤üœü¤ü¤ü¤ü”¬”´D\<\L d¤ ¬ ¬¤ ¬üüüüüüüüüüüüüüüüüüüü ¬¤¤¤D\L\”´”´œü¤ü¤ü¤ü¤ü¤üœüœü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤üœü¤üœü¤üœü¤üœü¤üœü¤üŒ ´”´L\L d¤¤¤¤üüüüüüüüüüüüüüüüüüüüüü ¬¤L dDd”´Œ ´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´”´D\<d¤¤ ¬üüüüüüüüüüüüüüüüüüüüüüü ¬¤L dDd”´Œ ´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´”´D\<d¤¤ ¬üüüüüüüüüüüüüüüüüüüüüüüü<dL d”´”´¤ü¤ü¬<ü´Dô´Dü´Dô¬<ü´Dü¬<ü´Dô¬<ü´DôÜÜÜÔÔÔÜÜÜÜÜÜÜÜÜ´Dô¬<ü¼Lü´Dü¬<ü¬<ü´Dü´Dô¬<ü´Dü´Dü´Dü´Dü”¬”´D\¤ ¬üüüüüüüüüüüüüüüüüüüüüüüüüL dD\”´Œ ´¤ü¬<ü¬<ü´Dü¬<ü¬<ü´Dü¬<ü´Dô´Dü¬<ü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜܬ<ü¬<ü´Dü´Dü´Dü´Dô´Dü´Dü¬<ü´Dü¬<ü´Dü´Dô´DüŒ´L düüüüüüüüüüüüüüüüüüüüüüüüüüüDdL d”´¤ü¬<ü¼Lü´Dü¬<ü´Dü¬<ü´Dü´Dü¬Dü´Dü´Dü´DüÜÜÜÔÔÜÜÜÜÔÔÔÜÜܬDü´Dü´Dô¬Dü¬<ü¬<ü´Dü¬<ü´Dü´Dü¬Dü´Dü¬<ü´Dü”´D\üüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\Œ ´¤ü¬<ü¬DüD\Dd<\D\DdL dD\<\L dDd<\D\<dL dL dDd<dL dL dD\Dd<\D\<\L dL dD\´Dü¬<ü”¬L düüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\Œ ´¤ü¬<ü¬DüD\Dd<\D\DdL dD\<\L dDd<\D\<dL dL dDd<dL dL dD\Dd<\D\<\L dL dD\´Dü¬<ü”¬L düüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d”´´Dü¬<üDdL dDdL dDdL dDdL dDdL dD\L dD\D\D\D\D\D\L dD\L dL dLdDdL dDdD\L dL d´Dü¬<üD\üüüüüüüüüüüüüüüüüüüüüüüüüüü<\L dŒ ´´DüDdD\”´”´”´”´”´”´”´”´”´”´œœœœœœœœœœœœœœœŒ ´”´”´”´”´”´Œ ´”´”´”´”´”´DdD\´DüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d”´¬DüD\L d”´Œ ´”´”´Œ ´Œ ´”´”´Œ ´Œ ´œœœœœœœœœœœœœœœ”´Œ ´”´”´”´”´”´”´Œ ´”´”´Œ ´L\L d¬<üDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dŒ´L dDd”´”¤¤ü¤ü¤ü¤üœü¤üœü¤ü¤ü¼¼¼´´´´´´´´´´¬¼œü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü”´L\D\<düüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL dD\”´”´¤ü¤üœüœü¤ü¤üœü¤üœüœü´´´´´´´´´´´´´´´¤ü¤üœüœü¤ü¤üœüœü¤üœü¤ü¤üŒ ´”´L d<\üüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL dD\”´”´¤ü¤üœüœü¤ü¤üœü¤üœüœü´´´´´´´´´´´´´´´¤ü¤üœüœü¤ü¤üœüœü¤üœü¤ü¤üŒ ´”´L d<\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\Ld”´Œ ´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤üœü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´DdL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d”´¤ü´Dü¬<ü´Dü´Dü¬<ü´Dô¬<ü´Dü´Dü´DüÜÜÜÜÜÜÔÔÜÜÜÜÜÜܬ<ü¬<ü´Dü¬<ü´Dü´Dü¬<ü¬<ü´Dü¬<ü´Dü¬<üœüœüŒ´DdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\Ld¤ü¤ü¬<ü´Dü¬<ü´Dü¬<ü¬<ü´Dü´Dü¬<ü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜܬDü´Dü´Dü´Dü¬<ü´Dü¬<ü¬<ü´Dü´Dü´Dü¬<üœüœü”¬L düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d¤ü¬<ü¬<üDdD\D\DdL dDdL dD\L d<\<\L d<\DdD\<\L dDdD\<\DdD\L d<\D\¬<ü¬<ü¤üœüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d¤ü¬<ü¬<üDdD\D\DdL dDdL dD\L d<\<\L d<\DdD\<\L dDdD\<\DdD\L d<\D\¬<ü¬<ü¤üœüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\Dd¤ü¬DüL dD\DdDdL dL dD\DdLdDd<\D\DdD\D\DdL dDdL dDdL dDdL dDdL dL dDd¬<ü´Dü”üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüDdL d¤ü´DôD\DdŒ ´”´”´”´”´”´Œ ´”´œœœœœœ”””œœœœœœ”´”´”´”´”´”´”´”´”´”´L\L d´Dü¬<üœüDdüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\¬<ü´DüL d”´”´”´Œ ´Œ ´”´”´”´”´œœœœœœœœœœœœœœœ”´Œ ´”´”´Œ ´Œ ´”´”´Œ ´”´”´L\D\¬<ü¬<ü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d´DüD\”¬”´”´œü¤üœü¤üœü¤ü¤ü´´´¼¼¼´´´´´´´´´¤$́œü¤ü¤ü¤ü¤üœü¤üœü¤üŒ ´”´L dDd´DüD\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL\¬DüL d”´Œ ´œü¤üœü¤ü¤ü¤üœü¤ü´¬¼´´´¼¼¼´´´´¬¼œü¤ü¤üœü¤ü¤ü¤ü¤üœü¤ü¤ü”´D\Dd¬<üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dL\¬DüL d”´Œ ´œü¤üœü¤ü¤ü¤üœü¤ü´¬¼´´´¼¼¼´´´´¬¼œü¤ü¤üœü¤ü¤ü¤ü¤üœü¤ü¤ü”´D\Dd¬<üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d´DüL dŒ´¤üœüœü¤ü¤üœüœü¤ü¤ü´´´´´´´´´´´´´´´œüœü¤ü¤üœü¤üœü¤üœü¤ü¤üœü”´L d´DüD\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüDd¬<ü<\¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü´´´´´´´´´´´´´´´¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü¤ü”´<\D\<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\L d¤ü¤ü¬<ü¬<ü´Dô¬<ü´Dô´Dü´Dô´DüÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ´Dô´Dü´Dô´Dü´Dü¬<ü´Dü´Dü¬<ü¼Lü¼Lü¬<üœüL dDdL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¤ü¬<ü´Dü´Dü´Dü´Dü¬<ü¬<ü´Dü¬<üÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜ´Dü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dô´Dü¬<ü¬<ü´Dôœüœü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¤ü¬<ü´Dü´Dü´Dü´Dü¬<ü¬<ü´Dü¬<üÜÜÜÔÔÔÜÜÜÔÔÔÜÜÜ´Dü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dô´Dü¬<ü¬<ü´Dôœüœü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüDdD\¤ü¬<ü´Dü¬<ü´Dü¬<ü´Dü´Dü¬<ü¬<üÜÜÜÜÜÜÜÜÜÜÜÜÜÜܬ<ü¬<ü´Dü´Dü¬<ü¬<ü´Dü¬<ü´Dü¬Dü´Dü¬<ü¬<ü¤üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<\L d¬<ü¼Lü¬<üL d<\D\DdL d<\D\DdL d<\L dDdD\Dd<\D\DdDd<\DdD\L dDd´Dü´Dü¬<üL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL d<d¬<ü¬<üLdL dDdDdL dDdL dD\DdDdD\D\DdDdL dL dL dD\D\L dL dDdL dL dD\´Dü´DôD\üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüD\L d¼Lü¬<üD\”´”¬”´”´”´”´”´œœœ”””œœœœœœœœœŒ ´”´”´”´”´”´”´”´”´”´D\Dd´Dü¬Dü<düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¬<ü´DüD\”¤”´Œ ´”´”´Œ ´”´œœœœœœœœœœœœœœœ”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´Œ ´L d<\¬<ü´DüL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü<dL d¬<ü´DüD\”¤”´Œ ´”´”´Œ ´”´œœœœœœœœœœœœœœœ”´”´Œ ´Œ ´”´”´Œ ´Œ ´”´Œ ´L d<\¬<ü´DüL düüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüL dD\¬<ü¬DüDdœüœüœüœüœüœüœü´´´¼¼¼´´´´´´¼¼¼œüœüœüœüœüœüœüœüœüœü<dL d¬<ü¬DüDdüüüüüüüüüüüüüüDdD\Dd<\Dd<\Dd<\Dd<\DdL dDdL dDdL dDdL dDdL dDdL d<\œü”ü”üœüœüœüœü´¬¼´´´´¬¼´´´´¬¼œü”üœüœüœüœü”ü”üœü”üDdD\<\DdL d<\D\L dDdD\L dDdD\<\DdL d<\D\L dDdL dD\D\L dL dD\D\L dL dD\L dL dD\D\L dL dD\D\L dL dD\L dL dD\D\L dL dD\D\D\D\D\D\D\DdL dD\D\L dL dD\D\L dD\D\L dL dD\D\L dL dD\D\L dD\D\L dL dD\D\L dL dD\LdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDdLdDd \ No newline at end of file diff --git a/sdk/samples/rockem/skmechgr.ppm b/sdk/samples/rockem/skmechgr.ppm deleted file mode 100644 index b6d1cf6..0000000 Binary files a/sdk/samples/rockem/skmechgr.ppm and /dev/null differ diff --git a/sdk/samples/rockem/skmechhn.ppm b/sdk/samples/rockem/skmechhn.ppm deleted file mode 100644 index ce1be9c..0000000 Binary files a/sdk/samples/rockem/skmechhn.ppm and /dev/null differ diff --git a/sdk/samples/rockem/skmechjd.ppm b/sdk/samples/rockem/skmechjd.ppm deleted file mode 100644 index dd47891..0000000 Binary files a/sdk/samples/rockem/skmechjd.ppm and /dev/null differ diff --git a/sdk/samples/rockem/skmechla.ppm b/sdk/samples/rockem/skmechla.ppm deleted file mode 100644 index a77499a..0000000 Binary files a/sdk/samples/rockem/skmechla.ppm and /dev/null differ diff --git a/sdk/samples/rockem/skmechll.ppm b/sdk/samples/rockem/skmechll.ppm deleted file mode 100644 index 2873eb8..0000000 --- a/sdk/samples/rockem/skmechll.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -64 128 -255 -œœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœüüüüüüüüüüüüüüüüüüüüüœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœüüL LLLLLLLLL LLLLLLLüüœœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœüü LL LLL LLL LLL LLL LL Lüüœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””üüL¤ ¬¤ ¬¤ ¬ ¬¤¤¤ ¬¤¤¤”Lüüœœœ”””œœœœœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœüüL¤ ¬ ¬¤¤ ¬ ¬ ¬ ¬ ¬ ¬¤ ¬ ¬ ¬Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœüüLüüüüüüüüüüüüüüü Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœ”””üô LTTüTTü\\ü\\üTTüTTüTTüTTüTTüTTüTTüTTü\\üTTü\\üLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœ”””œœœ”””œœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ””””””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœǘL\\ü\\üTTüTTü\\ü\\ü\\ü\\ü\\ü\\ü\\ü\\ü\\ü\\üTTü Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœǘ LTTüTTü\\üTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüTTüLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœüäLüüüüüüüüüüüüüüü Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœǘLüüüüüüüüüüüüüüüLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœ””””””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœœœœœœœ”””œœœüü Lœ ¬ ¬¤ ¬¤ ¬ ¬ ¬ ¬ ¬¤¤ ¬¤Lüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœ”””œœœœœœœœœœœœ”””œœœ”””œœœœœœ””””””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœüüLLLLL LLLLLLLLLL L Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœœœœ”””œœœœœœ”””œœœ”””œœœ”””œœœüü L LL L LL LL LLL LLL LLLüüœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœüüL¤¤¤¤ ¬¤¤¤¤¤¤¤¤¤ ¬ Lüüœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœüüL¤ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¬ ¬Lüüœœœ”””œœœœœœ”””œœœœœœ”””œœœ”””œœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœüüLüüüüüüüüüüüüüôü Lüüœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ””””””œœœœœœœœœœœœ”””œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœüüL\\üTTü\\üTTüTTüTTüTTü\\üTTüTTü\\üTTüTTü\\üTTü Lüüœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœüü LTTü\\ü\\ü\\ü\\ü\\ü\\üTTü\\ü\\üTTü\\üTTü\\üTTüLüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœüüLTTüTTüTTüTTüTTüTTü\TüTTü\TüTTü\TüTTüTTü\\üTTü Lüüœœœœœœœœœœœœœœœœœœ”””œœœ””””””œœœ””””””œœœ””””””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ””””””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœüü Lüüüüüüü üôüüüüüüLüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””œœœ”””œœœ”””œœœœœœ””””””œœœœœœœœœœœœœœœ”””œœœ”””œœœœœœ”””œœœœœœœœœüüLüüüüüüüüǘüüüü ́Lüüœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœüüL ¬¤ ¬ ¬¤ ¬ ¬¤ ¬ ¬¤ ¬ ¬¤œLüüœœœ”””œœœœœœœœœ””””””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ”””œœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœüüL LL LLLLL$<$<$<$<$<LD LLüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœüü LLLLL LLLL L LL L LLL$Düüœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””œœœ””””””œœœ””””””œœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœœœœ”””œœœœœœœœœœœœ”””œœœœœœ”””œœœœœœüüüL ¬¤¤¤¤¤ ¬¤¤ ¬¤¤¤ Lüüüœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ””œüüü L¤ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤¤ ¬Lüüüœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœœœœ””””””œœœœœœœœœœœœœœœœœœœœœœœœœœœ””œœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœ”””œœœœœœ”””œœœœœœüüüDüüüüüüüüüüüüü Lüüüœœœ””œœœœœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœ””œœœœœœœ””œœœœŒ„„„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€„„„€€€„„„„„„€€€€€€üüüLüüüüüüüüüüüüüLüüü€€€„„„„„„€€€„„„€€€„„„€€€„„„€€€„„„€€€€€€„„„€€€€€€€€€„„„€€€€€€„„„LLLLLLTTTLLLLLLTTTLLLLLLLLLTTTTTTLLLTTTTTTLLLTTTTTTLLLTTTTTTLLLLLLTLLLLLLLLL LLLLLL LL LLLLLLLLLTTTTTTLLLTTTLLLTTTLLLTTTLLLTTTTTTLLLTTTTTTLLLLLLLLLLLLTTTTTTLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL LLL LLL LLLL L LL L LLLLL \LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL„„„„„„€€€€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€€€€„„„LL ¬ ¬œüüüüTTü\\ü\\üüüüüœ ¬ ¬ DL€€€„„„€€€„„„€€€„„„„„„„„„€€€„„„€€€„„„„„„€€€„„„€€€„„„€€€„„„€€€„„„„„„„„„„„„„„„„„„„„„„„„„„„€€€„„„€€€€€€„„„€€€„„„„„„„„„„„„€€€„„„„„„„„„LL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬¤ ¬L D„„„„„„„„„€€€€€€„„„€€€€€€€€€€€€„„„„„„€€€„„„„„„„„„„„„„„„„„„€€€„„„œœœœœœœœœ””””””œœœœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœ DL¤¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬¤LLœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœœœœœœœ”””œœœœœœ”””œœœ”””œœœ”””œœœ”””œœœœœœœœœ”””œœœ”””œœœœœœ”””œœœL L¤¤ ¬üüüüTTü\\ü\\üüüüü¤ ¬¤ LLœœœ”””œœœœœœœœœœœœœœœœœœ””””””œœœ””””””œœœ””””””œœœ””””””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ””””””œœœœœœ””œ”””œœœ””œ””œœœœ””œ””œœœœ””œ””œ””œ””œ””œ””œœœœœœœ””œœœœLL ¬ ¬ ¬üüüü\\ü\\üTTüüüüü¤¤ ¬LLœœœœœœ””œ””œœœœ””œ””œ””œ””œ””œœœœ””œœœœ””œ””œ””œ””œœœœœœœ”””œœœœœœœœœLLLTTTTTTLLLTTTTTTLLLTTTTTTLLLLLLLLLTTTLLLLLLTTTLLLLLLTTT”””L L ¬¤¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœLLLLLLTTTLLLTTTTTTLLLTTTLLLLLLTTTLLLTTTLLLLLLTTTLLLLLLTTTœœœœœœœœœLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLTTTLLLLLLLLLLLLLLLLLLTTTLLLœœœLL¤¤ ¬üüüüTTü\\ü\\üüüüü ¬¤ ¬ DL””œTTTLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLTTTLLL””œœœœœœœLLLLLL LLLLLLL LLLLLL DTLLLLLL””œDL ¬¤ ¬üüüü\\üTTü\\üüüüü ¬¤¤TLœœœLLLLLLL DLLLLLLLLLLLLLLLLLLLœœœœœœ””œLLLLLLL¤ ¬¤ ¬¤¤ ¬¤¤ ¬¤¤LLLLLLLL””œLL ¬ ¬ ¬üüüü\\üTTü\\üüüüü ¬¤ ¬LTœœœLLLLLLLL¤ ¬¤ ¬¤¤¤ ¬¤¤¤”LLLLTTT”””œœœœœœLLLLLL L¤ ¬ ¬¤¤¤ ¬ ¬ ¬ ¬¤ ¬LLTTTLLLœœœL L¤¤ ¬üüüüTTü\\ü\\üüüüü ¬¤ ¬ DL””œLLLTTTLL ¬¤ ¬¤ ¬ ¬ ¬ ¬¤ ¬¬ ¬ LLLLLLLœœœœœœœœœLLLLLLLüüüüüüüüüüüü LLLLLLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬¤L DœœœLLLLLLL LüüüüüüüüüüüüLLLLTTT””œœœœœœœLLLTTTLüüüüüüüüüüüüLLLLLTTT””” LL ¬¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬ ¬ DL”””LLLTTTLLüüüüüüüüüüüü LLLLLLLœœœœœœ”””LLLLLLLTTü\\ü\\üTTü\\ü\\üTTü\\ü\\üTTüTTüTTüLLTTTLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬¤ ¬L LœœœLLLLLLLLTTü\\ü\\üTTüTTüTTüTTüTTü\\üTTüTTüTTüLLLLTTT”””œœœœœœTTTLLL L\\üTTü\\üTTü\\ü\\ü\\üTTüTTü\\ü\\üTTüLLLLLLLL””” LL¤¤ ¬üüüüTTü\\ü\\üüüüü ¬¤¤LL””œLLLTTTLLTTüTTüTTü\\ü\\ü\\ü\\üTTü\\üTTü\\üTTüLLLLLLLœœœœœœœœœLLLLLL LüüüüüüüüüüüüLTLLLLLLœœœLL ¬¤ ¬üüüü\\ü\\üTTüüüüü ¬¤ ¬ DL””œLLLTTTLLüüüüüüüüüǘüLTTTLLLœœœœœœœœœLLLTTTLüüüüüüüüüüüüL \TTTLLLœœœL L ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬¤ LLœœœLLLLLLL DüüüüüüüüüüüüLLLLLLLœœœœœœœœœLLLLLL L¤ ¬ ¬¤ ¬ ¬¤¤¤ ¬¤ ¬ DTLLLLLLœœœLL¤¤ ¬üüüüTTü\\ü\\üüüüü¤ ¬ ¬LLœœœLLLLLLLL ¬ ¬¤¤¤¤¤¤ ¬¤¤¤ DLLLLLLœœœœœœ”””LLLTTTTœ ¬ ¬¤ ¬ ¬ ¬ ¬ ¬¤ ¬ ¬LLTTTLLL”””LD ¬ ¬¤üüüü\\üTTü\\üüüüü ¬¤ ¬L DœœœLLLTTTL D ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤¤ ¬LTTTLLLœœœœœœœœœLLLLLL LLLL LLLLLL LLL LLLLLLLLœœœ LD ¬¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬ ¬LLœœœLLLLLLL LLLLLLLLLLL LLLLLLLLLœœœœœœœœœLLLLLLL LLL LLL LLLL LLLLTTTLLL””œLD ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬¤ LLœœœLLLLLLLLLL LLL LLL LLLL LLLLLLLœœœœœœœœœLLLLLLLœ ¬¤ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤¤LLTTTLLL””œLL¤¤ ¬üüüü\\üTTü\\üüüüü ¬¤ ¬L D””œLLLTTTL D ¬¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬ ¬¤ LLLLTTT”””œœœœœœLLLLLL Lüüüüüüüüüüüü LTLLLLLLœœœ LL ¬¤ ¬üüüü\\ü\\üTTüüüüü¤ ¬ ¬LLœœœLLLLLLLLüüüüüüüüüüôüLLLLLLLœœœœœœœœœLLLTTTLüüüüüüüüüüüüLLTTTLLLœœœLL¤¤ ¬üüüü\\üTTü\\üüüüü ¬ ¬ ¬L DœœœLLLTTTL Lüüüüüüüüüü üüLLLLLLLœœœ”””œœœLLLLLLL\\üTTüTTüTTü\\ü\\üTTü\\ü\\üTTü\\üTTüLLLLLLLL””” LD ¬ ¬¤üüüüTTü\\ü\\üüüüü ¬¤ ¬TLœœœLLLLLLLL\\üTTüTTüTTü\\üTTü\\ü\\üTTü\\üTTüTTüLLLLLLLœœœœœœœœœLLLLLLLTTü\\ü\\ü\\üTTüTTü\\üTTüTTü\\üTTüTTüLLLLLLLLœœœLL¤¤ ¬üüüü\\üTTü\\üüüüü ¬ ¬ ¬ DLœœœLLLLLLLLTTü\\ü\\ü\\üTTü\\üTTüTTü\\ü\\ü\\üTTüLTTTLLLœœœœœœœœœTTTLLLLTTüTTüTTüTTüTTü\TüTTü\Tü\TüTTü\\üTTüLLTTTLLLœœœLL ¬¤ ¬üüüü\\ü\\üTTüüüüü ¬¤¤LLœœœLLLTTTLL\\üTTüTTüTTüTTü\TüTTüTTüTTüTTüTTüTTüLLLLLLLœœœœ””œœœLLLTTTLüüüüüüüüüôüüLLLLLLLLœœœLL ¬ ¬ ¬üüüüTTü\\ü\\üüüüü ¬¤¤ LLœœœTTTLLL LLôüüüüüüüüüüäLTTTLLLœœœœœœœœœLLLLLL L¤ ¬ ¬¤ ¬ ¬¤ ¬ ¬¤ ¬¤ LLLLLLLL””œL D ¬¤ ¬üüüü\\üTTü\\üüüüü ¬¤¬LL”””LLLLLLLL ¬ ¬¤ ¬ ¬¤ ¬ ¬¤¤¤ ¬DLLLLLLœœœœœœ”””TTTLLLLœ¤¤ ¬¤ ¬¤ ¬ ¬¤ ¬ ¬LLTTTLLLœœœ LL¤ ¬ ¬üüüü\\ü\\üTTüüüüü ¬¤ ¬ DLœœœLLLTTTL D¤¤ ¬¤¤ ¬ ¬ ¬¤ ¬ ¬¤LLLLLLL””œœœœœœœLLLLLL LDLL LLDD$<$<$<DDLLLLLLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœLLLLLLLL LL L$<$<$<$<D$<DDL LTTTLLLœœœœœœœœœLLLLLLLLLLLLLLLLLLLLLLLLLLLœœœL L¤ ¬ ¬üüüüTTü\\ü\\üüüüü¤¤ ¬ DLœœœLLLLLLLLLLLLLLLLLLLL LLLLLLLœœœœœœœœœLLLLLLLLLTTTLLLTTTLLLLLLTTTLLLTTTTTTLLLLLLLLLLLLLLLLLLLLLœœœLL ¬ ¬¤üüüü\\üTTü\\üüüüü¤ ¬ ¬L L”””TTTLLLLLLTTTLLLLLLLLLTTTLLLLLLLLLTTTLLLLLLLLLLLLTTTLLLLLLœœœœœœ”””LLLLLLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLLLLœœœLT ¬ ¬¤üüüü\\üTTü\\üüüüü¤ ¬ ¬LLœœœLLLTTTœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœ””””””œœœ”””LLLTTTœœœœœœœœœLLLTTTœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœLLLLLLœœœ DL ¬ ¬ ¬üüüüTTü\\ü\\üüüüü¤ ¬ ¬ DLœœœLLLLLLœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœ”””œœœœœœœœœœœœLLLLLL”””œœœœœœLLLLLLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLTTTœœœL D ¬ ¬¤üüüü\\üTTü\\üüüüü ¬ ¬ ¬LLœœœLLLTTTœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLTTTœœœœœœœœœTTTLLLœœœ”””œœœœœœœœœœœœœœœ”””œœœœœœ”””œœœœœœœœœœœœTTTLLLœœœ DL¤¤ ¬üüüü\\ü\\üTTüüüüü¤¤ ¬ DLœœœLLLLLLœœœ”””œœœœœœœœœ””””””œœœ””””””œœœ”””œœœœœœœœœLLLLLLœœœœœœ””œLLLLLLœœœœœœœœœœœœ”””œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœLLLLLLœœœL D ¬¤ ¬üüüü\\üTTü\\üüüüü ¬ ¬¤ DLœœœLLLTTTœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœ”””LLLTTT”””œœœœœœLLLTTTœœœœœœ””œœœœ”””œœœ”””œœœœœœœœœœœœœœœœœœœœœœœœLLLLLLœœœLL ¬¤¤üüüü\\üTTüTTüüüüüœ¤ ¬L LœœœLLLTTTœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ”””œœœLLLLLLœœœœœœœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœL DLLL LL LL LLLLL LL LLLLLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€TTTLLLœœœL LLL LL LLLLL LL LL LLLD LLœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€LLLLLLœœœœœœœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœLTLdDdLdL dL dDdL dL dDdL dL dLdL dL dLdL dDdLLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€TTTLLLœœœL DDdL dL dL dL dL dL dL dL dL dL dL dL dL dL dDdDd LLœœœLLLTTT„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€LLLLLLœœœœœœœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœ DLL dŒÄŒÄŒ̀Œ̀Œ̀Œ̀”ČԌ̀Œ̀Œ̀Œ̀Œ̀Œ̀ŒÄL dLLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLLLL„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœ DLL d¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üDd LLœœœLLLLLL€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„TTTLLLœœœœœœœœœLLLLLL„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœL DDd¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üLdLLœœœLLLTTT„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœœœœœœœTTTLLL€€€„„„€€€„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLTTT””” LLL d¼Lü¬<ü´Dü¬<ü´Dü´Dü´Dü¬<ü´Dü´Dü¬<ü´Dü´Dü¬<ü¼LüDd DLœœœLLLLLL„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„LLLLLLœœœœœœ”””LLLTTT„„„€€€„„„€€€„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„€€€LLLLLLœœœLLDd¬<ü´Dü¬<ü¬<ü´Dü¬<ü´Dü´Dü´Dü´Dü´Dü´Dü´Dü´Dü¬<üL\ LLœœœLLLTTT„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„„„„€€€„„„TTTLLLœœœœœœœœœTTTLLL€€€„„„€€€„„„„„„€€€€€€„„„€€€€€€„„„€€€€€€„„„„„„LLLLLLœœœL LL d¼Lü¬<ü´Dü´Dü¬<ü¼Lü´Dü¬<ü´Dü´Dü¬<ü´Dü´Dü¬<ü´DüL dLDœœœLLLLLL„„„€€€€€€€€€„„„€€€€€€„„„„„„€€€„„„€€€€€€„„„„„„LLLLLLœœœœœœœœœLLLLLL€€€€€€„„„€€€€€€„„„€€€€€€€€€€€€€€€€€€„„„€€€„„„TTTLLLœœœLLDd¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üL dL LœœœLLLTTT„„„„„„„„„€€€„„„€€€€€€€€€€€€„„„€€€€€€€€€€€€€€€LLLLLLœœœœœœœœœLLLLLLllllllTTTllllllllllllllllllllllllllllllTTTlllTTTLLLœœœLLL dŒÄŒ̀Œ̀ŒÄŒ̀Œ̀Œ̀Œ̀Œ̀”ÄŒ̀Œ̀Œ̀ŒÄŒÄDd LLœœœLLLTTTlllTTTlllTTTlllllllllllllllllllllllllllllllllLLLLLLœœœœœœœœœLLLLLLlllllllllllllllTTTTTTllllllllllllTTTlllllllllLLLLLLœœœLLL dŒ̀ŒÄŒÄŒ̀ŒÄŒÄŒÄŒÄŒÄŒÄŒÄŒÄŒÄŒ̀ŒÄL dLLœœœLLLLLLllllllllllllllllllllllllllllllTTTllllllllllllLLLLLLœœœœœœœœœLLLLLLlllTTTlllTTTllllllllllllllllllllllllTTTllllllLLLLLLœœœD DDdL dDdL dLdL dLdLdL dLdLdL dLdL dL\L dL dLLœœœLLLTTTllllllTTTlllTTTlllllllllTTTllllllllllllTTTlllLLLTTTœœœœœœœœœLLLLLLllllllllllllllllllTTTllllllllllllTTTlllllllllLLLLLLœœœ LLL dL dLdL dL dDdL dL dDdL dL dDdL dL dDdL dDd LLœœœLLLLLLllllllllllllllllllTTTllllllllllllllllllllllllLLLLLL”””œœœœœœLLLTTTllllllTTTlllllllllllllllTTTTTTlllllllllllllllLLLLLLœœœLLL dL dL dL dL dL dL dL dL dL dL dL dL dL dL dLdL\LLœœœLLLLLLlllTTTlllllllllTTTlllllllllTTTlllTTTlllllllllLLLTTTœœœœœœœœœLLLLLLlllllllllllllllTTTlllllllllllllllllllllTTTlllLLLTTT””œ LLL dŒÄŒÄŒ̀Œ̀Œ̀Œ̀”ČԌ̀Œ̀Œ̀Œ̀Œ̀Œ̀ŒÄDd LL””œTTTLLLllllllllllllllllllllllllTTTlllllllllTTTllllllLLLLLLœœœœœœœœœLLLLLLllllllllllllllllllllllllTTTTTTlllllllllllllllLLLLLLœœœL LL d¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üDd LLœœœLLLLLLllllllTTTllllllllllllllllllllllllllllllTTTlllLLLLLL”””œœœœœœLLLLLLlllllllllllllllTTTlllllllllllllllllllllTTTlllTTTLLLœœœLLD\¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üLdLLœœœLLLLLLllllllllllllTTTlllTTTllllllllllllTTTlllllllllLLLTTTœœœœœœœœœTTTLLLlllTTTllllllllllllTTTlllllllllTTTllllllllllllLLLLLL”””LLL d¼Lü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dü¬<ü¬<ü´Dü´Dü¬<ü´Dü´DüLd LLœœœLLLLLLlllllllllllllllllllllllllllllllllllllllllllllLLLLLLœœœœœœ””œLLLLLLlllllllllTTTlllllllllllllllllllllllllllllllllLLLTTTœœœL LDd¬<ü¬<ü¼Lü´Dü´Dü¬<ü¬<ü´Dü´Dü´Dü´Dü¬<ü´Dü¬<ü´DüD\LLœœœLLLTTTlllTTTlllllllllTTTllllllTTTlllTTTlllTTTllllllLLLTTT”””œœœœœœLLLLLLllllllTTTlllllllllTTTllllllllllllllllllllllllLLLLLLœœœLLL d¼Lü¬<ü´Dü´Dü´Dü¬<ü´Dü¬<ü´Dü¬<ü´Dü´Dü´Dü¬<ü´DüLd LLœœœLLLLLLlllllllllTTTllllllTTTllllllllllllllllllllllllLLLLLLœœœœœœœœœLLLTTTllllllllllllTTTllllllllllllllllllTTTlllTTTlllLLLLLLœœœLLL d¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬ü¬üDdLLœœœLLLLLLlllllllllllllllllllllllllllllllllTTTlllTTTlllLLLLLL”””œœœœœœLLLLLLlllllllllTTTlllllllllllllllTTTlllllllllllllllLLLLLLœœœLLL dŒ̀Œ̀ŒÄŒ̀ŒÄŒ̀Œ̀Œ̀ŒÄŒÄŒ̀Œ̀Œ̀Œ̀”ÄDdLLœœœLLLLLLlllllllllllllllllllllllllllTTTlllllllllllllllLLLLLLœœœœœœ”””LLLTTTllllllTTTlllllllllllllllTTTllllllllllllllllllLLLLLLœœœLDL dŒÄŒÄŒ̀Œ̀ŒÄŒ̀ŒÄŒ̀ŒÄŒÄŒÄŒÄŒÄŒÄŒÄDd DL”””TTTLLLllllllllllllllllllllllllTTTllllllllllllllllllLLLLLLœœœœœœœœœLLLLLLllllllllllllTTTlllllllllllllllTTTllllllTTTlllTTTLLLœœœLDLdL dDdL dL dDdL dL dDdL dL dLdL dL dLdDdL dL LœœœLLLLLLlllTTTllllllTTTlllllllllllllllTTTllllllTTTlllTTTLLL”””œœœœœœLLLLLLlllllllllllllllllllllllllllllllllllllllllllllLLLLLLœœœ L$ 0) { }; - if (!g_bMusicPaused) ResumeMidi(); - } - else - { - ShowCursor(TRUE); - PauseMidi(); - } - } - break; - - case WM_CLOSE: - { - DestroyWindow(g_hWnd); - } - break; - - case WM_DESTROY: - { - // Stop midi music - StopMidi(); - - // Destroy scene - TermScene(); - - // Terminate all the DirectX objects, surfaces devices etc - TermDirectX(); - - // Show the mouse - ShowCursor(TRUE); - - // If an error occured, show it - if (g_bErrorOccured) - { - MessageBeep(0); - MessageBox(NULL, g_sError, "Error!", MB_OK); - } - - // Time to leave this mortal coil - PostQuitMessage(0); - } - break; - - case MCI_NOTIFY: - { - if (wParam == MCI_NOTIFY_SUCCESSFUL) - { - ReplayMidi(); - } - } - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); -} - -//------------------------------------------------------------------ -// -// Function : WinMain() -// -// Purpose : Entry point to application -// -//------------------------------------------------------------------ - -int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - // Set global handle - g_hInst = hInst; - - // Initialise window class - if (!InitClass(hInst)) return 1; - - // Initialise window - if (!InitWindow(hInst, nCmdShow)) return 1; - - // Initialise DirectX objects (Termination is handled in WM_DESTROY) - if (!InitDirectX()) - { - DestroyWindow(g_hWnd); - return 1; - } - - // Show the splash screen - DoSplashScreen(2000); - - // Load the scene - if (!InitScene()) - { - DestroyWindow(g_hWnd); - return 1; - } - - // Release the splash screen - ReleaseSplashScreen(); - - // Set DirectDraw exclusive mode here so that the splash could stay - // up during initialisation if we are using a different DirectDraw device - // that could not support 640x480x8 for hardware rendering. - if (!SetDirectDrawExclusiveMode()) - { - RegError("Could not set exclusive mode!"); - return FALSE; - } - - // Hide the mouse - ShowCursor(FALSE); - - // Enter video mode set in g_dwCurMode - if (!EnterVideoMode(g_dwCurrMode)) - { - DestroyWindow(g_hWnd); - return 1; - } - - // Load accelerators - HACCEL hAccel = LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCEL)); - - // Start the music! - PlayMidi("RockEm3D.mid"); - - // Pump messages via a PeekMessage loop - while (TRUE) - { - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - { - PostQuitMessage(msg.wParam); - return 1; - } - - if (hAccel && (msg.hwnd == g_hWnd)) - { - TranslateAccelerator(g_hWnd, hAccel, &msg); - } - - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - // Perform any neccessary updating during idle time - if (g_bActive) - { - // Update everything - CheckInputAndUpdate(); - - // Render the current scene - if (!RenderScene()) - { - DestroyWindow(g_hWnd); - return 1; - } - } - } - - // Exit WinMain and terminate the app.... - return msg.wParam; -} - diff --git a/sdk/samples/rockem/winmain.h b/sdk/samples/rockem/winmain.h deleted file mode 100644 index 4e7131e..0000000 --- a/sdk/samples/rockem/winmain.h +++ /dev/null @@ -1,20 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: winmain.h - * - ***************************************************************************/ - -#ifndef __WINMAIN_H -#define __WINMAIN_H - -void RegError(char *sErr); - -BOOL InitClass(HINSTANCE hInst); -BOOL InitWindow(HINSTANCE hInst, int nCmdShow); -long FAR PASCAL WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); -int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow); - -#endif - diff --git a/sdk/samples/rockem/yes b/sdk/samples/rockem/yes deleted file mode 100644 index 975fbec..0000000 --- a/sdk/samples/rockem/yes +++ /dev/null @@ -1 +0,0 @@ -y diff --git a/sdk/samples/scrawl/makefile b/sdk/samples/scrawl/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/scrawl/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/scrawl/msvc.mk b/sdk/samples/scrawl/msvc.mk deleted file mode 100644 index 4e2d2b5..0000000 --- a/sdk/samples/scrawl/msvc.mk +++ /dev/null @@ -1,41 +0,0 @@ -NAME = scrawl -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib comctl32.lib \ - dinput.lib dxguid.lib - -OBJS = scrawl.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/scrawl/readme.txt b/sdk/samples/scrawl/readme.txt deleted file mode 100644 index 07f309d..0000000 --- a/sdk/samples/scrawl/readme.txt +++ /dev/null @@ -1,20 +0,0 @@ -Basic demonstration of DirectInput mouse usage. Lets you draw on the -screen with the mouse. Note that this is not entirely well-suited -to DirectInput because the app acts pretty much like a normal Windows -application, but at least you can see how the calls are made. - -This sample program demonstrates the following: - -* Creating interfaces to DirectInputDevice objects. - -* Acquiring and unacquiring devices. - -* Reading buffered device data. - -* Event notifications for device activity. - -* Restricting the mouse to an arbitrary region. - -* Scaling raw mouse coordinates before using them. - -* Use of relative axis mode. diff --git a/sdk/samples/scrawl/scrawl.cpp b/sdk/samples/scrawl/scrawl.cpp deleted file mode 100644 index 286c4e0..0000000 --- a/sdk/samples/scrawl/scrawl.cpp +++ /dev/null @@ -1,1061 +0,0 @@ -/************************************************************************** - - SCRAWL.CPP - A dumb drawing app demo for DirectInput - - Collects mouse data in various modes to demonstrate how it's done. - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#include -#include -#include -#include - -#include "scrawl.h" - -/**************************************************************************** - * - * This is an incredibly dump app. It just lets you "draw" on - * a monochrome bitmap via DirectInput. The purpose is not to - * dazzle you with mind-altering brilliance. It's just to show - * how to use the DirectInput mouse interface. - * - ****************************************************************************/ - -/**************************************************************************** - * - * Manifest constants - * - ****************************************************************************/ - -#define DINPUT_BUFFERSIZE 16 - -#define DINPUT_CXBITMAP 512 -#define DINPUT_CYBITMAP 300 - -/**************************************************************************** - * - * Global variables - * - ****************************************************************************/ - -const char c_szAppName[] = "Scrawl"; /* My name */ - -HINSTANCE g_hinst; /* My instance handle */ -BOOL g_fActive; /* Am I the active window? */ - -int g_x = DINPUT_CXBITMAP / 2; /* Virtual x-coordinate */ -int g_y = DINPUT_CYBITMAP / 2; /* Virtual y-coordinate */ - -int g_dxFuzz; /* Leftover x-fuzz from scaling */ -int g_dyFuzz; /* Leftover y-fuzz from scaling */ -int g_iSensitivity; /* Mouse sensitivity */ - -HDC g_hdc; /* Memory DC our picture lives in */ -HBITMAP g_hbm; /* Our picture */ -HBITMAP g_hbmDeselect; /* Stock bitmap for deselecting */ - -HCURSOR g_hcurCross; /* Crosshairs */ -int g_cxCross; /* Width of crosshairs cursor */ -int g_cyCross; /* Height of crosshairs cursor */ -int g_dxCrossHot; /* Hotspot location of crosshairs */ -int g_dyCrossHot; /* Hotspot location of crosshairs */ -int g_fShowCursor = 1; /* Should the cursor be shown? */ - -/**************************************************************************** - * - * DirectInput globals - * - ****************************************************************************/ - -LPDIRECTINPUT g_pdi; -LPDIRECTINPUTDEVICE g_pMouse; - -HANDLE g_hevtMouse; - -/**************************************************************************** - * - * Complain - * - * Whine and moan. - * - ****************************************************************************/ - -void CDECL -Complain(HWND hwndOwner, HRESULT hr, LPCSTR pszFormat, ...) -{ - va_list ap; - char szBuf[1024]; - char *pszBuf; - - va_start(ap, pszFormat); - - pszBuf = szBuf + wsprintf(szBuf, pszFormat, ap); - - va_end(ap); - - wsprintf(pszBuf, "\n\nError = %08x", hr); - - MessageBox(hwndOwner, szBuf, c_szAppName, MB_OK); -} - -/**************************************************************************** - * - * DIInit - * - * Initialize the DirectInput variables. - * - ****************************************************************************/ - -BOOL DIInit(HWND hwnd) -{ - HRESULT hr; - - /* - * Register with DirectInput and get an IDirectInput to play with. - */ - hr = DirectInputCreate(g_hinst, DIRECTINPUT_VERSION, &g_pdi, NULL); - - if (FAILED(hr)) { - Complain(hwnd, hr, "DirectInputCreate"); - return FALSE; - } - - /* - * Obtain an interface to the system mouse device. - */ - hr = g_pdi->CreateDevice(GUID_SysMouse, &g_pMouse, NULL); - - if (FAILED(hr)) { - Complain(hwnd, hr, "CreateDevice(SysMouse)"); - return FALSE; - } - - /* - * Set the data format to "mouse format". - */ - hr = g_pMouse->SetDataFormat(&c_dfDIMouse); - - if (FAILED(hr)) { - Complain(hwnd, hr, "SetDataFormat(SysMouse, dfDIMouse)"); - return FALSE; - } - - - /* - * Set the cooperativity level. - */ - hr = g_pMouse->SetCooperativeLevel(hwnd, - DISCL_EXCLUSIVE | DISCL_FOREGROUND); - - if (FAILED(hr)) { - Complain(hwnd, hr, "SetCooperativeLevel(SysMouse)"); - return FALSE; - } - - - /* - * Create the handle that tells us new data is available. - */ - g_hevtMouse = CreateEvent(0, 0, 0, 0); - - if (g_hevtMouse == NULL) { - Complain(hwnd, GetLastError(), "CreateEvent"); - return FALSE; - } - - /* - * Associate the event with the device. - */ - hr = g_pMouse->SetEventNotification(g_hevtMouse); - - if (FAILED(hr)) { - Complain(hwnd, hr, "SetEventNotification(SysMouse)"); - return FALSE; - } - - /* - * Set the buffer size to DINPUT_BUFFERSIZE elements. - * The buffer size is a DWORD property associated with the device. - */ - DIPROPDWORD dipdw = - { - { - sizeof(DIPROPDWORD), // diph.dwSize - sizeof(DIPROPHEADER), // diph.dwHeaderSize - 0, // diph.dwObj - DIPH_DEVICE, // diph.dwHow - }, - DINPUT_BUFFERSIZE, // dwData - }; - - hr = g_pMouse->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph); - - if (FAILED(hr)) { - Complain(hwnd, hr, "Set buffer size(SysMouse)"); - return FALSE; - } - - return TRUE; - -} - -/**************************************************************************** - * - * DITerm - * - * Terminate our usage of DirectInput. - * - ****************************************************************************/ - -void DITerm(void) -{ - if (g_pdi) g_pdi ->Release(), g_pdi = NULL; - if (g_pMouse) g_pMouse->Release(), g_pMouse = NULL; - - if (g_hevtMouse) CloseHandle(g_hevtMouse), g_hevtMouse = NULL; -} - -/**************************************************************************** - * - * InvalidateCursorRect - * - * Invalidate the rectangle that contains the cursor. - * - * The coordinates are in client coordinates. - * - ****************************************************************************/ - -void InvalidateCursorRect(HWND hwnd) -{ - RECT rc = { g_x - g_dxCrossHot, g_y - g_dyCrossHot, - g_x - g_dxCrossHot + g_cxCross, g_y - g_dyCrossHot + g_cyCross }; - - InvalidateRect(hwnd, &rc, 0); -} - -/**************************************************************************** - * - * UpdateCursorPosition - * - * Move our private cursor in the requested direction, subject - * to clipping, scaling, and all that other stuff. - * - * This does not redraw the cursor. You need to do that yourself. - * - ****************************************************************************/ - -void UpdateCursorPosition(int dx, int dy) -{ - - /* - * Pick up any leftover fuzz from last time. This is important - * when scaling down mouse motions. Otherwise, the user can - * drag to the right extremely slow for the length of the table - * and not get anywhere. - */ - dx += g_dxFuzz; g_dxFuzz = 0; - dy += g_dyFuzz; g_dyFuzz = 0; - - switch (g_iSensitivity) { - - case 1: /* High sensitivity: Magnify! */ - dx *= 2; - dy *= 2; - break; - - case -1: /* Low sensitivity: Scale down */ - g_dxFuzz = dx % 2; /* remember the fuzz for next time */ - g_dyFuzz = dy % 2; - dx /= 2; - dy /= 2; - break; - - default: - case 0: /* No sensitivity */ - ; /* No adjustments needed */ - } - - g_x += dx; - g_y += dy; - - /* Clip the cursor to our client area */ - if (g_x < 0) g_x = 0; - if (g_x >= DINPUT_CXBITMAP) g_x = DINPUT_CXBITMAP - 1; - - if (g_y < 0) g_y = 0; - if (g_y >= DINPUT_CYBITMAP) g_y = DINPUT_CYBITMAP - 1; - -} - -/**************************************************************************** - * - * Scrawl_SyncAcquire - * - * Acquire or unacquire the devices, depending on the the g_fActive - * flag. This synchronizes the devices with our internal view of - * the world. - * - * Also repaint the cursor so that it hides/shows in sync with - * acquisition. - * - ****************************************************************************/ - -void -Scrawl_SyncAcquire(HWND hwnd) -{ - if (g_fActive) { - if (g_pMouse) g_pMouse->Acquire(); - } else { - if (g_pMouse) g_pMouse->Unacquire(); - } - - InvalidateCursorRect(hwnd); -} - -/**************************************************************************** - * - * Private messages - * - * WM_SYNCACQUIRE forces us to re-synchronize our acquisition - * with the world. - * - ****************************************************************************/ - -#define WM_SYNCACQUIRE (WM_USER + 0) - -/**************************************************************************** - * - * Scrawl_OnClear - * - * Wipe out the bitmap. - * - ****************************************************************************/ - -void Scrawl_OnClear(HWND hwnd) -{ - /* - * Start out all black. - */ - PatBlt(g_hdc, 0, 0, DINPUT_CXBITMAP, DINPUT_CYBITMAP, BLACKNESS); - - if (hwnd) { - InvalidateRect(hwnd, 0, 0); - } -} - -/**************************************************************************** - * - * Scrawl_OnCreate - * - * Set up the window by appending our custom commands to the System - * menu. - * - ****************************************************************************/ - -BOOL Scrawl_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) -{ - HMENU hmenu = GetSystemMenu(hwnd, FALSE); - - AppendMenu(hmenu, MF_ENABLED | MF_STRING, IDC_CLEAR, "C&lear\tDel"); - AppendMenu(hmenu, MF_ENABLED | MF_STRING, IDC_ABOUT, "&About\tF1"); - - AppendMenu(hmenu, MF_ENABLED | MF_STRING | MF_POPUP, - (UINT)LoadMenu(g_hinst, - MAKEINTRESOURCE(IDM_SENSITIVITY)), - "Sensitivit&y"); - - return 1; -} - -/**************************************************************************** - * - * Scrawl_OnInitMenuPopup - * - * Initialize the sensitivity item accordingly. - * - ****************************************************************************/ - -void -Scrawl_OnInitMenuPopup(HWND hwnd, HMENU hmenu, UINT item, BOOL fSystemMenu) -{ - int iSensitivity; - for (iSensitivity = -1; iSensitivity <= 1; iSensitivity++) { - if (g_iSensitivity == iSensitivity) { - CheckMenuItem(hmenu, IDC_SENSITIVITY_NORMAL + iSensitivity, - MF_BYCOMMAND | MF_CHECKED); - } else { - CheckMenuItem(hmenu, IDC_SENSITIVITY_NORMAL + iSensitivity, - MF_BYCOMMAND | MF_UNCHECKED); - } - } - -} - -/**************************************************************************** - * - * Scrawl_OnKeyDown - * - * See if it's one of our accelerators. - * - ****************************************************************************/ - -void Scrawl_OnKeyDown(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags) -{ - switch (vk) { - case '1': - case '2': - case '3': - PostMessage(hwnd, WM_SYSCOMMAND, IDC_SENSITIVITY_NORMAL + - vk - '2', 0); - break; - - case VK_DELETE: - PostMessage(hwnd, WM_SYSCOMMAND, IDC_CLEAR, 0); - break; - - case VK_F1: - PostMessage(hwnd, WM_SYSCOMMAND, IDC_ABOUT, 0); - break; - - } -} - -/**************************************************************************** - * - * Scrawl_OnPaint - * - * Blt out our bitmap and draw our cursor on top of it. - * - ****************************************************************************/ - -void -Scrawl_OnPaint(HWND hwnd) -{ - PAINTSTRUCT ps; - HDC hdc = BeginPaint(hwnd, &ps); - - if (hdc) { - - BitBlt(hdc, - ps.rcPaint.left, - ps.rcPaint.top, - ps.rcPaint.right - ps.rcPaint.left, - ps.rcPaint.bottom - ps.rcPaint.top, - g_hdc, - ps.rcPaint.left, - ps.rcPaint.top, - SRCCOPY); - - if (g_fActive && g_fShowCursor) { - DrawIcon(hdc, g_x - g_dxCrossHot, - g_y - g_dyCrossHot, g_hcurCross); - } - - EndPaint(hwnd, &ps); - } -} - -/**************************************************************************** - * - * Scrawl_OnButton0Down_FlushMotion - * - * Flush out any motion that we are holding. - * - ****************************************************************************/ - -typedef struct BUTTON0INFO { - - HDC hdcWindow; - BOOL fMoved; - DWORD dwSeqLastSeen; - -} BUTTON0INFO, *PBUTTON0INFO; - -void Scrawl_OnButton0Down_FlushMotion(PBUTTON0INFO pb0i) -{ - if (pb0i->fMoved) { - pb0i->fMoved = 0; - pb0i->dwSeqLastSeen = 0; - LineTo(pb0i->hdcWindow, g_x, g_y); - LineTo(g_hdc, g_x, g_y); - } - -} - -/**************************************************************************** - * - * Scrawl_OnButton0Down - * - * Enter draw mode. - * - * If we are drawing a curve, then read buffered data and draw - * lines from point to point. By reading buffered data, we can - * track the motion of the mouse accurately without coalescing. - * - * This function illustrates how a non-message-based program can - * process buffered data directly from a device, processing - * messages only occasionally (as required by Windows). - * - * This function also illustrates how an application can piece - * together buffered data elements based on the sequence number. - * A single mouse action (e.g., moving diagonally) is reported - * as a series of events, all with the same sequence number. - * Zero is never a valid DirectInput sequence number, so it is - * safe to use it as a sentinel value. - * - ****************************************************************************/ - -void Scrawl_OnButton0Down(HWND hwnd) -{ - BUTTON0INFO b0i; - - /* Hide the cursor while scrawling */ - g_fShowCursor = FALSE; - InvalidateCursorRect(hwnd); - UpdateWindow(hwnd); - - /* - * For performance, draw directly onto the window's DC instead of - * invalidating and waiting for the WM_PAINT message. Of course, - * we always draw onto our bitmap, too, since that's what really - * counts. - */ - - /* BUGBUG -- select a decent pen, too */ - b0i.hdcWindow = GetDC(hwnd); - MoveToEx(b0i.hdcWindow, g_x, g_y, 0); - MoveToEx(g_hdc, g_x, g_y, 0); - - /* BUGBUG -- save old pen */ - SelectObject(b0i.hdcWindow, GetStockObject(WHITE_PEN)); - SelectObject(g_hdc, GetStockObject(WHITE_PEN)); - - b0i.fMoved = 0; - b0i.dwSeqLastSeen = 0; - - /* - * Keep reading data elements until we see a "mouse button up" event. - */ - BOOL fDone = 0; - while (!fDone) { - DIDEVICEOBJECTDATA od; - - DWORD dwElements = 1; - - HRESULT hr = g_pMouse->GetDeviceData( - sizeof(DIDEVICEOBJECTDATA), &od, - &dwElements, 0); - - /* Unable to read data */ - if (FAILED(hr)) { - break; - } - - /* - * If no data available, finish the element we had been - * collecting, and then process our message queue so - * the system don't think we're hung. - */ - if (dwElements == 0) { - - /* If there is a partial motion, flush it out */ - Scrawl_OnButton0Down_FlushMotion(&b0i); - - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - /* If it's a quit message, we're outta here */ - if (msg.message == WM_QUIT) { - fDone = TRUE; - /* - * Re-post the quit message so the - * outer loop will see it and exit. - */ - PostQuitMessage(msg.wParam); - break; - } else { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - continue; - } - - /* If this is the start of a new event, flush out the old one */ - if (od.dwSequence != b0i.dwSeqLastSeen) { - Scrawl_OnButton0Down_FlushMotion(&b0i); - b0i.dwSeqLastSeen = od.dwSequence; - } - - /* Look at the element to see what happened */ - - switch (od.dwOfs) { - - /* DIMOFS_X: Mouse horizontal motion */ - case DIMOFS_X: - UpdateCursorPosition(od.dwData, 0); - b0i.fMoved = 1; - break; - - - /* DIMOFS_Y: Mouse vertical motion */ - case DIMOFS_Y: - UpdateCursorPosition(0, od.dwData); - b0i.fMoved = 1; - break; - - /* DIMOFS_BUTTON0: Button 0 pressed or released */ - case DIMOFS_BUTTON0: - - if (!(od.dwData & 0x80)) { /* Button released */ - fDone = 1; - Scrawl_OnButton0Down_FlushMotion(&b0i); /* Flush out dregs */ - } - break; - - } - } - - ReleaseDC(hwnd, b0i.hdcWindow); - - /* Re-show the cursor now that scrawling is finished */ - g_fShowCursor = TRUE; - InvalidateCursorRect(hwnd); -} - - -/**************************************************************************** - * - * Scrawl_OnButton1Up - * - * Pop up a context menu. - * - ****************************************************************************/ - -void Scrawl_OnButton1Up(HWND hwnd) -{ - POINT pt = { g_x, g_y }; - ClientToScreen(hwnd, &pt); - - /* - * Unacquire the devices so the user can interact with the menu. - * - * Put the Windows cursor at the same location as our virtual cursor. - * - * Hide the cursor while moving it so you don't get annoying flicker. - */ - - ShowCursor(FALSE); - g_fActive = FALSE; - Scrawl_SyncAcquire(hwnd); - SetCursorPos(pt.x, pt.y); - ShowCursor(TRUE); - - HMENU hmenuPopup = GetSystemMenu(hwnd, FALSE); - - UINT idc = TrackPopupMenuEx(hmenuPopup, - TPM_RIGHTBUTTON | TPM_RETURNCMD, - pt.x, pt.y, hwnd, 0); - - PostMessage(hwnd, WM_SYSCOMMAND, idc, 0L); - -} - -/**************************************************************************** - * - * Scrawl_OnMouseInput - * - * The mouse moved while nothing was happening. Walk the event list - * and update the mouse position for each event. If we see a button - * event, then stop pulling events and leave the elements in the - * input buffer for the drawing handler to pull. - * - * - ****************************************************************************/ - -void -Scrawl_OnMouseInput(HWND hwnd) -{ - /* Invalidate the old cursor so it will be erased */ - InvalidateCursorRect(hwnd); - - /* - * Attempt to read one data element. Continue as long as - * device data is available. - */ - BOOL fDone = 0; - while (!fDone) { - DIDEVICEOBJECTDATA od; - - DWORD dwElements = 1; - - HRESULT hr = g_pMouse->GetDeviceData( - sizeof(DIDEVICEOBJECTDATA), &od, - &dwElements, 0); - - if (hr == DIERR_INPUTLOST) { - /* - * We had acquisition, but lost it. Try to reacquire it. - * - * WARNING! DO NOT ATTEMPT TO REACQUIRE IF YOU GET - * DIERR_NOTACQUIRED! Otherwise, you're extremely likely - * to get caught in an infinite loop: The acquire will fail, - * and you'll get another DIERR_NOTACQUIRED so you'll - * try to aquire again, and that'll fail, etc. - */ - PostMessage(hwnd, WM_SYNCACQUIRE, 0, 0L); - break; - } - - /* Unable to read data or no data available */ - if (FAILED(hr) || dwElements == 0) { - break; - } - - /* Look at the element to see what happened */ - - switch (od.dwOfs) { - - /* DIMOFS_X: Mouse horizontal motion */ - case DIMOFS_X: UpdateCursorPosition(od.dwData, 0); break; - - - /* DIMOFS_Y: Mouse vertical motion */ - case DIMOFS_Y: UpdateCursorPosition(0, od.dwData); break; - - /* DIMOFS_BUTTON0: Button 0 pressed or released */ - case DIMOFS_BUTTON0: - - if (od.dwData & 0x80) { /* Button pressed */ - fDone = 1; - Scrawl_OnButton0Down(hwnd); /* Go into button-down mode */ - } - break; - - /* DIMOFS_BUTTON1: Button 1 pressed or released */ - case DIMOFS_BUTTON1: - - if (!(od.dwData & 0x80)) { /* Button released */ - fDone = 1; - Scrawl_OnButton1Up(hwnd); /* Context menu time */ - } - } - - } - - /* Invalidate the new cursor so it will be drawn */ - InvalidateCursorRect(hwnd); - -} - -/**************************************************************************** - * - * ScrawlWndProc - * - * Application window procedure. - * - ****************************************************************************/ - -LONG CALLBACK ScrawlWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) -{ - - switch (msg) { - - HANDLE_MSG(hwnd, WM_CREATE, Scrawl_OnCreate); - - HANDLE_MSG(hwnd, WM_PAINT, Scrawl_OnPaint); - - HANDLE_MSG(hwnd, WM_INITMENUPOPUP, Scrawl_OnInitMenuPopup); - - HANDLE_MSG(hwnd, WM_KEYDOWN, Scrawl_OnKeyDown); - - /* - * Reacquire the mouse and keyboard when we are the active window. - * Unacquire them when we stop being the active window. - */ - case WM_ACTIVATE: - g_fActive = wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE; - Scrawl_SyncAcquire(hwnd); - break; - - /* - * Unacquire the devices if a menu appears, so that the user can - * interact with the menu in the normal manner. - * - * From Windows' point of view, we are still the active window - * when a menu appears, but we want to act like the menu deactivated - * us. - */ - case WM_ENTERMENULOOP: - case WM_ENTERSIZEMOVE: - g_fActive = FALSE; - Scrawl_SyncAcquire(hwnd); - break; - - /* - * Reacquire the devices when the menu goes away. - * - * SUBTLETY 1: Windows actually sends the WM_EXITMENULOOP message - * before all the menu-related stuff is finished, so post ourselves - * a private message to reacquire after the menu has been torn - * down for real. - * - * SUBTLETY 2: Don't assume that just because the menu is going - * away that you are still the active window. You might not be. - */ - case WM_EXITMENULOOP: - case WM_EXITSIZEMOVE: - g_fActive = GetActiveWindow() == hwnd; - PostMessage(hwnd, WM_SYNCACQUIRE, 0, 0L); - break; - - case WM_SYNCACQUIRE: - Scrawl_SyncAcquire(hwnd); - break; - - case WM_SYSCOMMAND: - - LRESULT lRc; - switch (GET_WM_COMMAND_ID(wParam, lParam)) { - case IDC_CLEAR: - Scrawl_OnClear(hwnd); - lRc = 0; - break; - - case IDC_ABOUT: - MessageBox(hwnd, "Scrawl DirectInput Sample v1.0", - c_szAppName, MB_OK); - lRc = 0; - break; - - /* - * Eat the screen-saver notification. - */ - case SC_SCREENSAVE: - lRc = 0; - break; - - case IDC_SENSITIVITY_LOW: - case IDC_SENSITIVITY_NORMAL: - case IDC_SENSITIVITY_HIGH: - g_iSensitivity = (signed short)GET_WM_COMMAND_ID(wParam, lParam) - - IDC_SENSITIVITY_NORMAL; - lRc = 0; - break; - - default: - lRc = DefWindowProc(hwnd, msg, wParam, lParam); - break; - } - - /* - * The WM_SYSCOMMAND might've been a WM_CLOSE, in which case - * our window no longer exists. So be careful. - */ - if (IsWindow(hwnd)) { - Scrawl_SyncAcquire(hwnd); - } - return lRc; - - - case WM_DESTROY: - PostQuitMessage(0); - break; - - } - - return DefWindowProc(hwnd, msg, wParam, lParam); -} - -/**************************************************************************** - * - * AppInit - * - * Set up everything the application needs to get started. - * - ****************************************************************************/ - -HWND AppInit(HINSTANCE hinst, int nCmdShow) -{ - - /* Save instance handle for people who care */ - g_hinst = hinst; - - /* - * Get our crosshairs cursor and extract the the width and - * hotspot location so we can draw it manually. - */ - g_hcurCross = LoadCursor(NULL, IDC_CROSS); - - ICONINFO ii; - - GetIconInfo(g_hcurCross, &ii); - - BITMAP bm; - - GetObject(ii.hbmMask, sizeof(BITMAP), &bm); - - if (ii.hbmMask) DeleteObject(ii.hbmMask); - if (ii.hbmColor) DeleteObject(ii.hbmColor); - - g_dxCrossHot = ii.xHotspot; - g_dyCrossHot = ii.yHotspot; - - g_cxCross = bm.bmWidth; - g_cyCross = bm.bmHeight; - - /* - * Create our scrawl bitmap and set it up. - */ - HDC hdc = GetDC(0); - g_hdc = CreateCompatibleDC(hdc); - ReleaseDC(0, hdc); - - if (!g_hdc) return NULL; - - g_hbm = CreateBitmap(DINPUT_CXBITMAP, DINPUT_CYBITMAP, 1, 1, 0); - - if (!g_hbm) return NULL; - - g_hbmDeselect = SelectObject(g_hdc, g_hbm); - - Scrawl_OnClear(0); - - /* - * Set up the window class. - */ - WNDCLASS wc; - - wc.hCursor = LoadCursor(0, IDC_ARROW); - wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_MAIN)); - wc.lpszMenuName = NULL; - wc.lpszClassName = c_szAppName; - wc.hbrBackground = 0; - wc.hInstance = hinst; - wc.style = 0; - wc.lpfnWndProc = ScrawlWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - - if (!RegisterClass(&wc)) { - return NULL; - } - - DWORD dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - DWORD dwExStyle = WS_EX_APPWINDOW; - - RECT rc = { 0, 0, DINPUT_CXBITMAP, DINPUT_CYBITMAP }; - - AdjustWindowRectEx(&rc, dwStyle, FALSE, dwExStyle); - - HWND hwnd = CreateWindowEx( - dwExStyle, // ExStyle - c_szAppName, // Class name - c_szAppName, // Caption - dwStyle, // Style - CW_USEDEFAULT, CW_USEDEFAULT, // Position - rc.right - rc.left, // cx - rc.bottom - rc.top, // cy - 0, // Parent window (no parent) - 0, // use class menu - g_hinst, // handle to module instance - 0 // no params to pass on - ); - - if (!DIInit(hwnd)) { - DestroyWindow(hwnd); - return NULL; - } - - ShowWindow(hwnd, nCmdShow); - - return hwnd; -} - -/**************************************************************************** - * - * WinMain - * - * Application entry point. - * - * The main message loop illustrates how a message-driven program - * can use event notifications to be signalled when new data is - * available from a device. - * - ****************************************************************************/ - -int PASCAL -WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR szCmdLine, int nCmdShow) -{ - MSG msg; - msg.wParam = 0; /* In case something goes horribly wrong */ - - HWND hwnd = AppInit(hinst, nCmdShow); - - if (hwnd) { - - /* - * Since we use notification handles, we need to use - * MsgWaitForMultipleObjects to wait for the event or - * a message, whichever comes first. - */ - - BOOL fDone = FALSE; - - while (!fDone) { - - DWORD dw = MsgWaitForMultipleObjects(1, &g_hevtMouse, 0, INFINITE, - QS_ALLINPUT); - - switch (dw) { - - /* WAIT_OBJECT_0 + 0 means that g_hevtMouse was signalled */ - case WAIT_OBJECT_0 + 0: - Scrawl_OnMouseInput(hwnd); - break; - - /* WAIT_OBJECT_0 + 1 means that we have messages to process */ - case WAIT_OBJECT_0 + 1: - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - - /* If it's a quit message, we're outta here */ - if (msg.message == WM_QUIT) { - fDone = TRUE; - } else { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - break; - } - } - } - - DITerm(); - - if (g_hdc) { - if (g_hbmDeselect) { - SelectObject(g_hdc, g_hbmDeselect); - } - DeleteDC(g_hdc); - } - - if (g_hbm) { - DeleteObject(g_hbm); - } - - return msg.wParam; - -} diff --git a/sdk/samples/scrawl/scrawl.h b/sdk/samples/scrawl/scrawl.h deleted file mode 100644 index e3b895d..0000000 --- a/sdk/samples/scrawl/scrawl.h +++ /dev/null @@ -1,31 +0,0 @@ -/************************************************************************** - - SCRAWL.H - A dumb drawing app demo for DirectInput - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - - - -#include - -#define IDI_MAIN 1 - -#define IDM_SENSITIVITY 1 - -#define IDC_CLEAR 64 -#define IDC_ABOUT 65 - -#define IDC_SENSITIVITY_LOW 96 -#define IDC_SENSITIVITY_NORMAL 97 -#define IDC_SENSITIVITY_HIGH 98 diff --git a/sdk/samples/scrawl/scrawl.ico b/sdk/samples/scrawl/scrawl.ico deleted file mode 100644 index f5eb65e..0000000 Binary files a/sdk/samples/scrawl/scrawl.ico and /dev/null differ diff --git a/sdk/samples/scrawl/scrawl.rc b/sdk/samples/scrawl/scrawl.rc deleted file mode 100644 index cd85d2d..0000000 --- a/sdk/samples/scrawl/scrawl.rc +++ /dev/null @@ -1,27 +0,0 @@ -/************************************************************************** - - SCRAWL.RC - A dumb drawing app demo for DirectInput - - **************************************************************************/ -/************************************************************************** - - (C) Copyright 1995-1996 Microsoft Corp. All rights reserved. - - You have a royalty-free right to use, modify, reproduce and - distribute the Sample Files (and/or any modified version) in - any way you find useful, provided that you agree that - Microsoft has no warranty obligations or liability for any - Sample Application Files which are modified. - - **************************************************************************/ - -#include "scrawl.h" - -IDI_MAIN ICON SCRAWL.ICO - -IDM_SENSITIVITY MENU -BEGIN - MENUITEM "&Low\t1", IDC_SENSITIVITY_LOW - MENUITEM "&Normal\t2", IDC_SENSITIVITY_NORMAL - MENUITEM "&High\t3", IDC_SENSITIVITY_HIGH -END diff --git a/sdk/samples/setup/dinstall.c b/sdk/samples/setup/dinstall.c deleted file mode 100644 index 66b55a3..0000000 --- a/sdk/samples/setup/dinstall.c +++ /dev/null @@ -1,587 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: dinstall.c - * Content: Game SDK sample setup program - ***************************************************************************/ - -#include -#include // for SHFileOperation -#include // for SHBroweForFolder -#include "dsetup.h" -#include "dinstall.h" - -/* - * global constants and macros - */ -#define BUFFER_SIZE 512 - -#define LoadStrFromRes(uID,lpBuffer) \ -LoadString (GetModuleHandle(NULL),\ - (uID),\ - (lpBuffer),\ - sizeof((lpBuffer))); - - -/* - * list of files that will be copied from the source directory to - * to the directory the game is created in - */ -static char* copy_list [] = -{ - "ROCKEM3D.EXE", - "ARENA.X", - "BLOCK1.WAV", - "BLOCK2.WAV", - "BLOCK3.WAV", - "CBOO.WAV", - "CLOOP.WAV", - "CYEAH.WAV", - "DEBRIS_B.X", - "DEBRIS_R.X", - "DEFEND1.WAV", - "DEFEND2.WAV", - "DEMECH.X", - "DEMECHBK.PPM", - "DEMECHBT.PPM", - "DEMECHCH.PPM", - "DEMECHGR.PPM", - "DEMECHH1.PPM", - "DEMECHH2.PPM", - "DEMECHHD.PPM", - "DEMECHHN.PPM", - "DEMECHLA.PPM", - "DEMECHLL.PPM", - "DEMECHUA.PPM", - "DEMECHUL.PPM", - "GDK_FILL.PPM", - "HEAD.WAV", - "INTRO.WAV", - "PUNCH.WAV", - "PUNCH1.WAV", - "PUNCH2.WAV", - "PUNCH3.WAV", - "PUNCH4.WAV", - "REVDN1.WAV", - "REVDN2.WAV", - "REVDN3.WAV", - "REVUP1.WAV", - "REVUP2.WAV", - "REVUP3.WAV", - "RANDOM1.WAV", - "RANDOM2.WAV", - "RANDOM3.WAV", - "RANDOM4.WAV", - "RANDOM5.WAV", - "RANDOM6.WAV", - "ROCKEM3D.BIN", - "ROCKEM3D.MID", - "ROCKEM3D.PAL", - "SKMECH.X", - "SKMECHBK.PPM", - "SKMECHBT.PPM", - "SKMECHCH.PPM", - "SKMECHGR.PPM", - "SKMECHHN.PPM", - "SKMECHJD.PPM", - "SKMECHLA.PPM", - "SKMECHLL.PPM", - "SKMECHUA.PPM", - "SKMECHUL.PPM", - "SPLASH.PAL", - "WALK0.WAV", - "WALK1.WAV", - "WHOOSH1.WAV", - "WHOOSH2.WAV", -}; - -static char szTitle[BUFFER_SIZE]; - -/* - * prototypes - */ -BOOL FAR PASCAL masterDlgProc( HWND hdlg,DWORD message,DWORD wparam,DWORD lparam ); - -/* - * globals - */ -static HANDLE hinst; -static char GameDirectory[MAX_PATH]; // where the user wants the game -static char SetupDirectory[MAX_PATH]; // where the user ran setup from - -/* - * support functions - */ -void catpath(char *dst, char *src) -{ - int len = lstrlen(dst); - if (len > 0 && (dst[len-1] != '\\' && dst[len-1] != '/')) - lstrcat(dst,"\\"); - lstrcat(dst,src); - - // SHFileOperation needs a double null string. - len = lstrlen(dst); - dst[len+1] = 0; -} - -/* - * set a bitmap into a static control - */ -void SetBitmap(HWND hDlg, int id, char *szBitmap, int w, int h) -{ - HBITMAP hbm; - HWND hwnd; - - hwnd = GetDlgItem(hDlg, id); - - if (hwnd == NULL) - return; - - hbm = (HBITMAP)LoadImage(hinst, szBitmap, IMAGE_BITMAP, w, h, - LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS | LR_CREATEDIBSECTION); - - if (hbm) - hbm = (HBITMAP)SendMessage(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbm); - - if (hbm) - DeleteObject(hbm); -} - -void SetInfoText(HWND hDlg, char *sz, ...) -{ - char ach[128]; - wvsprintf(ach, sz, (void*)(&sz+1)); - SetDlgItemText(hDlg, IDC_INFO, ach); -} - -void _SHFree(void *p) -{ - IMalloc *pm; - SHGetMalloc(&pm); - if (pm) - { - pm->lpVtbl->Free(pm,p); - pm->lpVtbl->Release(pm); - } -} - -/* - * build a shortcut in the start menu - */ -void MakeShortcut() -{ - char buf[512]; - char szSetupIni[MAX_PATH]; - char szExeFile[MAX_PATH]; - int len; - int fh; - char szGroupName[BUFFER_SIZE]; - char szLinkName[BUFFER_SIZE]; - - static char setup_ini[] = - "[progman.groups]\r\n" - "groupX=%s\r\n" - "[groupX]\r\n" - "\"%s\",\"%s\",,,,\"%s\"\r\n"; - - GetWindowsDirectory(szSetupIni, sizeof(szSetupIni)); - catpath(szSetupIni, "SETUP.INI"); - - lstrcpy(buf, GameDirectory); - catpath(buf, copy_list[0]); - GetShortPathName(buf, szExeFile, sizeof(szExeFile)); - -// lstrcpy(buf, GameDirectory); -// GetShortPathName(buf, szWork, sizeof(szWork)); - - LoadStrFromRes( IDS_GROUP_NAME, szGroupName ); - LoadStrFromRes( IDS_LINK_NAME, szLinkName ); - len = wsprintf(buf, setup_ini, szGroupName, szLinkName, - szExeFile, GameDirectory); - - fh = _lcreat(szSetupIni, 0); - - if (fh != -1) - { - _lwrite(fh, buf, len); - _lclose(fh); - WinExec("grpconv -o", SW_HIDE); - } -} - -/* - * dlg proc for wizard dialog box, the setup is controlled from here. - */ -BOOL FAR PASCAL masterDlgProc(HWND hDlg,DWORD dwMessage,DWORD wParam,DWORD lParam) -{ - int result; - static int system_restart; - static int current_dialog; - static int busy; - - char src[MAX_PATH]; - char dst[MAX_PATH]; - SHFILEOPSTRUCT fileop; - - char szBuffer[BUFFER_SIZE]; - - switch(dwMessage) - { - case WM_INITDIALOG: - busy = 0; - current_dialog = 0; - - LoadStrFromRes( IDS_TITLE, szTitle ); - SetWindowText( hDlg, szTitle ); - EnableWindow( GetDlgItem(hDlg, IDC_B), FALSE ); - EnableWindow( GetDlgItem(hDlg, IDC_H), FALSE ); - - /* - * set the signon bitmap into our static control - */ - LoadStrFromRes( IDS_SIGNON_BITMAP_NAME, szBuffer ); - SetBitmap( hDlg, IDC_STATIC, szBuffer, 175, 195 ); - - /* - * limit the size of the input of this text field to the length of a path - * put the default directory to install the game into in it - * select the whole thing to make it easy for people to replace it - * set the focus to it - */ - SendDlgItemMessage( hDlg, IDC_EDIT, EM_LIMITTEXT, MAX_PATH, 0L); - LoadStrFromRes( IDS_DEFAULT_GAME_DIR, szBuffer ); - SetDlgItemText( hDlg, IDC_EDIT, szBuffer ); - SendDlgItemMessage( hDlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256) ); - SetFocus( GetDlgItem(hDlg, IDC_EDIT) ); - /* - * return 0 here indicating we have set the focus for the dialog box - * and it doesn't need to help us - */ - return 0; - - case WM_SETCURSOR: - if (busy) - { - SetCursor(LoadCursor(NULL, IDC_WAIT)); - return TRUE; - } - break; - - case WM_COMMAND: - switch(wParam) - { - case IDOK: - if( busy > 0 ) - { - /* - * busy bit keeps us from taking input while we are off doing - * things that can create other dialog boxes and end up causing - * us to be reentered. - */ - break; - } - else if( current_dialog == 0 ) - { - int i; - - busy++; - EnableWindow(GetDlgItem(hDlg,IDOK), FALSE); - EnableWindow(GetDlgItem(hDlg,IDCANCEL), FALSE); - SetCursor(LoadCursor(NULL, IDC_WAIT)); - - /* - * get the directory the user typed - */ - GetWindowText( GetDlgItem( hDlg,IDC_EDIT ), GameDirectory, sizeof(GameDirectory)); - - /* - * verify that the typed in directory is valid - * by having the SHELL copy WIN.INI to this directory - * it will also create the directory for us. - */ - LoadStrFromRes( IDS_CREATE_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer); - - GetWindowsDirectory(src, sizeof(src)); - catpath(src,"WIN.INI"); - - lstrcpy(dst,GameDirectory); - catpath(dst,"SMAG.INI"); - - fileop.hwnd = hDlg; - fileop.wFunc = FO_COPY; - fileop.pFrom = src; - fileop.pTo = dst; - fileop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION; - - if (SHFileOperation(&fileop) != 0) - { - // failed, the shell gave the user a error. - SetInfoText(hDlg, ""); - EnableWindow(GetDlgItem(hDlg,IDOK), TRUE); - EnableWindow(GetDlgItem(hDlg,IDCANCEL), TRUE); - busy--; - break; - } - - /* - * the directory is valid now delete the bogus file - */ - fileop.hwnd = hDlg; - fileop.wFunc = FO_DELETE; - fileop.pFrom = dst; - fileop.pTo = NULL; - fileop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION; - - SHFileOperation(&fileop); - SetInfoText(hDlg, ""); - - /* - * check if there is enough space to install the game - * NOTE: there is always enough space at the moment :-) - */ - LoadStrFromRes( IDS_DISK_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer); - if( 0 ) - { - /* your code goes here */ - } - SetInfoText(hDlg, ""); - - /* - * now setup DirectX - */ - LoadStrFromRes( IDS_INSTALL_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer); - - result = DirectXSetup( hDlg, NULL, DSETUP_DIRECTX ); - - SetInfoText(hDlg, ""); - - if( result < 0 ) - { - if (result == DSETUPERR_NOTPREINSTALLEDONNT) - { - // - // DirectX comes preinstalled on NT, and can only - // be installed in an NT release or Service Pack. - // If this error code is returned, then the required - // version of DirectX is not preinstalled on this - // NT machine. The user will have to go get - // the NT version or Service Pack required, or this - // game will not run. Note that any application - // can redistribute an NT Service Pack as long as - // it is distributed in its entirety. Check out - // ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes - // - LoadStrFromRes( IDS_NTFAILED_MSG, szBuffer ); - MessageBox( hDlg, szBuffer, szTitle, 0 ); - } - else - { - LoadStrFromRes( IDS_FAILED_MSG, szBuffer ); - MessageBox( hDlg, szBuffer, szTitle, 0 ); - } - EndDialog(hDlg, result); - break; - } - - /* - * check if there is enough space to install the game - * NOTE: there is always enough space at the moment :-) - */ - LoadStrFromRes( IDS_DISK_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer); - if( 0 ) - { - /* your code goes here */ - } - SetInfoText(hDlg, ""); - - /* - * now copy the files. - */ - system_restart = result; - - LoadStrFromRes( IDS_COPYING_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer); - for( i = 0; i < sizeof( copy_list )/sizeof( copy_list[0] ); i++ ) - { - lstrcpy( src, SetupDirectory ); - catpath( src, copy_list[i] ); - - lstrcpy( dst, GameDirectory ); - catpath( dst, copy_list[i] ); - - LoadStrFromRes( IDS_CURRENT_FILE_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer, copy_list[i]); - - fileop.hwnd = hDlg; - fileop.wFunc = FO_COPY; - fileop.pFrom = src; - fileop.pTo = dst; - fileop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION; - - while (result = SHFileOperation(&fileop)) - { - char errorText[MAX_PATH+BUFFER_SIZE]; - - LoadStrFromRes( IDS_SETUP_FAILURE_MSG, szBuffer ); - wsprintf(errorText, szBuffer, copy_list[i] ); - result = MessageBox( hDlg, errorText, szTitle, MB_RETRYCANCEL ); - - if( result == IDCANCEL ) - { - result = -1; - break; - } - } - - if( result == 0 ) - { - SetFileAttributes( dst, FILE_ATTRIBUTE_NORMAL ); - } - } - SetInfoText(hDlg, ""); - - LoadStrFromRes( IDS_STARTUP_MSG, szBuffer ); - SetInfoText(hDlg, szBuffer); - MakeShortcut(); - SetInfoText(hDlg, ""); - - if( result >= 0 ) - { - /* - * hide current controls - */ - ShowWindow( GetDlgItem(hDlg, IDC_EDIT), SW_HIDE ); - ShowWindow( GetDlgItem(hDlg, IDC_DIRECTIONS1), SW_HIDE ); - ShowWindow( GetDlgItem(hDlg, IDC_DIRECTIONS2), SW_HIDE ); - ShowWindow( GetDlgItem(hDlg, IDC_EDITTEXT), SW_HIDE ); - ShowWindow( GetDlgItem(hDlg, IDC_INFO), SW_HIDE ); - ShowWindow( GetDlgItem(hDlg, IDC_BROWSE), SW_HIDE ); - - if( system_restart ) - { - /* - * show new dialogs - */ - ShowWindow( GetDlgItem(hDlg, IDC_REBOOT1), SW_SHOW ); - ShowWindow( GetDlgItem(hDlg, IDC_REBOOT2), SW_SHOW ); - LoadStrFromRes( IDS_REBOOT_BUTTON, szBuffer ); - SetWindowText( GetDlgItem(hDlg, IDOK), szBuffer ); - - /* - * set the reboot bitmap into our static control - */ - LoadStrFromRes( IDS_REBOOT_BITMAP_NAME, szBuffer ); - SetBitmap(hDlg, IDC_STATIC, szBuffer, 270, 195); - current_dialog++; - } - else - { - ShowWindow( GetDlgItem(hDlg, IDC_SUCCESS), SW_SHOW ); - LoadStrFromRes( IDS_FINISH_BUTTON, szBuffer ); - SetWindowText( GetDlgItem(hDlg, IDOK), szBuffer ); - current_dialog++; - EnableWindow(GetDlgItem(hDlg,IDOK), TRUE); - busy--; - break; - } - } - - EnableWindow(GetDlgItem(hDlg,IDOK), TRUE); - EnableWindow(GetDlgItem(hDlg,IDCANCEL), TRUE); - busy--; - - if( result < 0 ) - { - EndDialog( hDlg, result ); - } - } - else if (current_dialog == 1) - { - /* - * restart windows, kill apps that aren't responding, reboot - */ - if( system_restart ) - { - ExitWindowsEx( EWX_REBOOT, 0 ); - } - else - { - EndDialog( hDlg, 0 ); - } - } - break; - - case IDCANCEL: - if( !busy ) - { - /* - * only allow cancel if we aren't doing anything else - */ - EndDialog( hDlg, -1 ); - } - break; - - case IDC_BROWSE: - if( current_dialog == 0 ) - { - BROWSEINFO bi; - LPITEMIDLIST pidl; - char ach[MAX_PATH]; - - bi.hwndOwner = hDlg; - bi.pidlRoot = NULL; - bi.pszDisplayName = ach; - bi.lpszTitle = NULL; - bi.ulFlags = BIF_RETURNONLYFSDIRS; - bi.lpfn = NULL; - bi.lParam = 0; - bi.iImage = 0; - - pidl = SHBrowseForFolder(&bi); - - if (pidl) - { - SHGetPathFromIDList(pidl, ach); - SetDlgItemText(hDlg, IDC_EDIT, ach); - _SHFree(pidl); - } - } - break; - } - } - return 0; -} - -/* **************************************************************** */ -int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow) -{ - TCHAR * p; - TCHAR * x; - hinst = hInstance; - - /* - * get our fullpath name and strip the file name - */ - GetModuleFileName(hInstance, SetupDirectory, sizeof(SetupDirectory)); - - for (x=p=SetupDirectory; *p; p=AnsiNext(p)) - { - if (*p == '\\' || *p == '/') - x = p; - } - *x = 0; - - /* - * do the setup thing, it is all one big dialog box that you show - * and hide things from depending on the screen - * we just sign on, ask where to install, and install - */ - DialogBox( hInstance, "DLG_MASTER", NULL, (DLGPROC)masterDlgProc ); - - return 0; -} /* WinMain */ diff --git a/sdk/samples/setup/dinstall.def b/sdk/samples/setup/dinstall.def deleted file mode 100644 index da9102d..0000000 --- a/sdk/samples/setup/dinstall.def +++ /dev/null @@ -1,12 +0,0 @@ -NAME DINSTALL - -DESCRIPTION 'Windows 95 DirectX(tm) Setup' - -CODE LOADONCALL DISCARDABLE -DATA PRELOAD SINGLE FIXED - -HEAPSIZE 1024 -STACKSIZE 8192 - -EXPORTS - diff --git a/sdk/samples/setup/dinstall.h b/sdk/samples/setup/dinstall.h deleted file mode 100644 index 247247d..0000000 --- a/sdk/samples/setup/dinstall.h +++ /dev/null @@ -1,45 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: dinstall.h - * Content: Game SDK sample setup program - ***************************************************************************/ - - -#ifndef __DINSTALL_H__ -#define __DINSTALL_H__ - -#define IDC_EDIT 1000 -#define IDC_EDITTEXT 1001 -#define IDC_STATIC 1002 -#define IDC_REBOOT1 1003 -#define IDC_REBOOT2 1004 -#define IDC_DIRECTIONS1 1005 -#define IDC_DIRECTIONS2 1006 -#define IDC_H 1007 -#define IDC_B 1008 -#define IDC_INFO 1009 -#define IDC_SUCCESS 1010 -#define IDC_BROWSE 1011 - -/* angusm */ -#define IDS_DEFAULT_GAME_DIR 100 -#define IDS_TITLE 101 -#define IDS_GROUP_NAME 102 -#define IDS_LINK_NAME 103 - -#define IDS_FINISH_BUTTON 116 -#define IDS_REBOOT_BUTTON 117 -#define IDS_SIGNON_BITMAP_NAME 118 -#define IDS_REBOOT_BITMAP_NAME 119 -#define IDS_CREATE_MSG 120 -#define IDS_DISK_MSG 121 -#define IDS_INSTALL_MSG 122 -#define IDS_FAILED_MSG 123 -#define IDS_COPYING_MSG 124 -#define IDS_CURRENT_FILE_MSG 125 -#define IDS_SETUP_FAILURE_MSG 126 -#define IDS_STARTUP_MSG 127 -#define IDS_NTFAILED_MSG 128 -#endif diff --git a/sdk/samples/setup/dinstall.rc b/sdk/samples/setup/dinstall.rc deleted file mode 100644 index dd2e057..0000000 --- a/sdk/samples/setup/dinstall.rc +++ /dev/null @@ -1,102 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. - * - * File: dinstall.h - * Content: Game SDK sample setup program - ***************************************************************************/ - -#include "windows.h" -#include "dinstall.h" - -SETUP_ICON ICON DISCARDABLE "..\\setup.ico" -reboot BITMAP MOVEABLE PURE "..\\reboot.bmp" -signon BITMAP MOVEABLE PURE "..\\signon.bmp" - -DLG_MASTER DIALOG DISCARDABLE 5,50,405,150 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Microsoft Windows 95 Game SDK" -FONT 8, "Helv" -BEGIN - CONTROL "",IDC_STATIC,"Static",SS_BITMAP,15,4,120,120 - CONTROL "",-1,"Static",SS_BLACKFRAME,15,125,370,1 - PUSHBUTTON "Next >",IDOK,270,130,50,14,WS_GROUP | WS_VISIBLE - PUSHBUTTON "Cancel",IDCANCEL,335,130,50,14,WS_VISIBLE - PUSHBUTTON "&Help",IDC_H,155,130,50,14,WS_VISIBLE - PUSHBUTTON "< &Back",IDC_B,220,130,50,14,WS_VISIBLE - - ; TELL USER WHAT WE ARE DOING AND ASK FOR GAME PATH - LTEXT "Setup will install Microsoft DirectX(tm) and 'Rockem 3D.'", - IDC_DIRECTIONS1,155,6,203,15,WS_VISIBLE - LTEXT "You may enter the directory that you would like 'Rockem 3D' installed in.", - IDC_DIRECTIONS2,155,31,203,15,WS_VISIBLE - LTEXT "Game Directory:",IDC_EDITTEXT,155,56,55,8,WS_VISIBLE - EDITTEXT IDC_EDIT,215,55,130,12,ES_AUTOHSCROLL | - ES_OEMCONVERT | WS_VISIBLE - - PUSHBUTTON "Browse...",IDC_BROWSE,350,54,40,14,WS_VISIBLE - - LTEXT "",IDC_INFO,155,80,200,16,WS_VISIBLE - - ; ASK PERMISSION TO REBOOT - LTEXT "In order to complete the installation of the game it will be necessary to restart your system. Press the Reboot button to restart Windows 95 now.", - IDC_REBOOT1,195, 6,175,38,NOT WS_VISIBLE - LTEXT "If you do not restart Windows 95 now, the drivers required to make DirectX(tm) work will not be available until the next restart.", - IDC_REBOOT2,195,40,175,30,NOT WS_VISIBLE - - ; SETUP WAS SUCCESSFULL - LTEXT "Setup has completed successfuly.", - IDC_SUCCESS,195, 6,175,38,NOT WS_VISIBLE - -END - -/* angusm */ -STRINGTABLE MOVEABLE DISCARDABLE -LANGUAGE LANG_ENGLISH,SUBLANG_NEUTRAL -BEGIN - IDS_DEFAULT_GAME_DIR, "C:\\DirectX Games\\Rockem" - IDS_TITLE, "Rockem 3D Setup" - IDS_GROUP_NAME, "DirectX Games" - IDS_LINK_NAME, "Rockem" - IDS_FINISH_BUTTON, "&Finish" - IDS_REBOOT_BUTTON, "&Reboot" - IDS_SIGNON_BITMAP_NAME, "signon" - IDS_REBOOT_BITMAP_NAME, "reboot" - IDS_CREATE_MSG, "Creating directory.." - IDS_DISK_MSG, "Checking disk space." - IDS_INSTALL_MSG, "Installing DirectX." - IDS_FAILED_MSG, "DirectX failed to install. The game was not installed." - IDS_NTFAILED_MSG, "Install failed. The DirectX version which is preinstalled with your copy of Windows NT is lower than the version required by this game. To get updated DirectX Windows NT components, check out: ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes" - IDS_COPYING_MSG, "Copying files." - IDS_CURRENT_FILE_MSG, "Copying %s" - IDS_SETUP_FAILURE_MSG, "Setup Failure: %s could not be copied." - IDS_STARTUP_MSG, "Creating StartMenu shortcut" -END - -STRINGTABLE MOVEABLE DISCARDABLE -LANGUAGE LANG_JAPANESE,SUBLANG_NEUTRAL -BEGIN - IDS_DEFAULT_GAME_DIR, "C:\\DirectX Games\\Rockem" - IDS_TITLE, "Rockem 3D Setup" - IDS_GROUP_NAME, "DirectX Games" - IDS_LINK_NAME, "Rockem" - IDS_FINISH_BUTTON, "&Finish" - IDS_REBOOT_BUTTON, "&Reboot" - IDS_SIGNON_BITMAP_NAME, "signon" - IDS_REBOOT_BITMAP_NAME, "reboot" - IDS_CREATE_MSG, "Creating directory.." - IDS_DISK_MSG, "Checking disk space." - IDS_INSTALL_MSG, "Installing DirectX." - IDS_FAILED_MSG, "DirectX failed to install. The game was not installed." - IDS_NTFAILED_MSG, "Install failed. The DirectX version which is preinstalled with your copy of Windows NT is lower than the version required by this game. To get updated DirectX Windows NT components, check out: ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes" - IDS_COPYING_MSG, "Copying files." - IDS_CURRENT_FILE_MSG, "Copying %s" - IDS_SETUP_FAILURE_MSG, "Setup Failure: %s could not be copied." - IDS_STARTUP_MSG, "Creating StartMenu shortcut" -END - - - - - - diff --git a/sdk/samples/setup/makefile b/sdk/samples/setup/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/setup/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/setup/msvc.mk b/sdk/samples/setup/msvc.mk deleted file mode 100644 index 4877007..0000000 --- a/sdk/samples/setup/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = dinstall -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib shell32.lib \ - comdlg32.lib gdi32.lib winmm.lib dsetup.lib libc.lib - -OBJS = dinstall.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/setup/readme.txt b/sdk/samples/setup/readme.txt deleted file mode 100644 index 6ebdf45..0000000 --- a/sdk/samples/setup/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -Setup - -This sample is an example of how to use DirectXSetup API's to install -DirectX subsystem and DirectX drivers. It also serves as a working template -for ISV's to install a game. - -Note that this program will not run until the redist directory (on the CD) -is copied into the same directory as setup.exe. The whole tree must be -copied in order to setup correctly. diff --git a/sdk/samples/setup/reboot.bmp b/sdk/samples/setup/reboot.bmp deleted file mode 100644 index ca41886..0000000 Binary files a/sdk/samples/setup/reboot.bmp and /dev/null differ diff --git a/sdk/samples/setup/setup.ico b/sdk/samples/setup/setup.ico deleted file mode 100644 index 69c67aa..0000000 Binary files a/sdk/samples/setup/setup.ico and /dev/null differ diff --git a/sdk/samples/setup/signon.bmp b/sdk/samples/setup/signon.bmp deleted file mode 100644 index 30dfc5c..0000000 Binary files a/sdk/samples/setup/signon.bmp and /dev/null differ diff --git a/sdk/samples/shadow/makefile b/sdk/samples/shadow/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/shadow/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/shadow/msvc.mk b/sdk/samples/shadow/msvc.mk deleted file mode 100644 index 51f250e..0000000 --- a/sdk/samples/shadow/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = shadow -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = shadow.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/shadow/readme.txt b/sdk/samples/shadow/readme.txt deleted file mode 100644 index a45659c..0000000 --- a/sdk/samples/shadow/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Shadow -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Creating a shadow of a mesh object. diff --git a/sdk/samples/shadow/shadow.c b/sdk/samples/shadow/shadow.c deleted file mode 100644 index 4bb0427..0000000 --- a/sdk/samples/shadow/shadow.c +++ /dev/null @@ -1,125 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: shadow.c - * - ***************************************************************************/ - -#include "rmdemo.h" - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT; - LPDIRECT3DRMFRAME lights = NULL; - LPDIRECT3DRMMESHBUILDER teapot_builder = NULL; - LPDIRECT3DRMMESH teapot_mesh = NULL; - LPDIRECT3DRMVISUAL teapot_shadow = NULL; - LPDIRECT3DRMFRAME teapot = NULL; - LPDIRECT3DRMLIGHT shadow_light = NULL; - LPDIRECT3DRMLIGHT l2 = NULL; - HRESULT rval; - - view = view; /* not used */ - - if (FAILED(dev->lpVtbl->SetQuality(dev, quality))) - goto generic_error; - if (FAILED(scene->lpVtbl->SetSceneBackgroundRGB(scene, D3DVAL(1), D3DVAL(1), - D3DVAL(1)))) - goto generic_error; - - /* - * initialize the lights in the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights))) - goto generic_error; - if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(2), D3DVAL(5), - -D3DVAL(10)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9), - D3DVAL(0.8), D3DVAL(0.7), &shadow_light))) - goto generic_error; - if (FAILED(lights->lpVtbl->AddLight(lights, shadow_light))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &l2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, l2))) - goto generic_error; - - /* - * load mesh file - */ - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &teapot_builder))) - goto generic_error; - rval = teapot_builder->lpVtbl->Load(teapot_builder, "teapot.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load teapot.x.\n"); - goto ret_with_error; - } - if (FAILED(teapot_builder->lpVtbl->CreateMesh(teapot_builder, &teapot_mesh))) - goto generic_error; - RELEASE(teapot_builder); - - /* - * create a teapot frame within the scene - */ - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &teapot))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateShadow(lpD3DRM, (LPDIRECT3DRMVISUAL) teapot_mesh, - shadow_light, D3DVAL(0), D3DVAL(-3), D3DVAL(0), D3DVAL(0), D3DVAL(1), - D3DVAL(0), &teapot_shadow))) - goto generic_error; - - /* - * add the loaded mesh into the frame - */ - if (FAILED(teapot->lpVtbl->AddVisual(teapot, (LPDIRECT3DRMVISUAL) teapot_mesh))) - goto generic_error; - if (FAILED(teapot->lpVtbl->AddVisual(teapot, teapot_shadow))) - goto generic_error; - - /* - * set up the frames position, orientation and rotation - */ - - if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(10)))) - goto generic_error; - if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0), D3DVAL(0), D3DVAL(1), D3DVAL(0), - D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(teapot->lpVtbl->SetRotation(teapot, scene, D3DVAL(0), D3DVAL(1), D3DVAL(1), - D3DVAL(0.02)))) - goto generic_error; - - RELEASE(lights); - RELEASE(teapot_mesh); - RELEASE(teapot_shadow); - RELEASE(teapot); - RELEASE(shadow_light); - RELEASE(l2); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(lights); - RELEASE(teapot_builder); - RELEASE(teapot_mesh); - RELEASE(teapot_shadow); - RELEASE(teapot); - RELEASE(shadow_light); - RELEASE(l2); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bNoTextures = TRUE; - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Shadow Direct3DRM Example"); -} diff --git a/sdk/samples/shadow/shadow.def b/sdk/samples/shadow/shadow.def deleted file mode 100644 index f81e343..0000000 --- a/sdk/samples/shadow/shadow.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME shadow.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/sphere/makefile b/sdk/samples/sphere/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/sphere/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/sphere/msvc.mk b/sdk/samples/sphere/msvc.mk deleted file mode 100644 index d3b2478..0000000 --- a/sdk/samples/sphere/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = sphere -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj lclib.obj d3dmain.obj stats.obj sphere.obj d3dmath.obj d3dsphr.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT =-DD3DDEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/sphere/readme.txt b/sdk/samples/sphere/readme.txt deleted file mode 100644 index 1e25d63..0000000 --- a/sdk/samples/sphere/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -Sphere -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -A simple spinning sphere with one material. The spinning is done -through a matrix multiply within the execute buffer. diff --git a/sdk/samples/sphere/sphere.c b/sdk/samples/sphere/sphere.c deleted file mode 100644 index ef640b5..0000000 --- a/sdk/samples/sphere/sphere.c +++ /dev/null @@ -1,345 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: sphere.c - * - ***************************************************************************/ - -#include -#include -#include -#include "d3ddemo.h" - -/* - * Globals to keep track of execute buffer - */ -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -static D3DEXECUTEBUFFERDESC debDesc; -/* - * Gobals for materials and lights - */ -LPDIRECT3DMATERIAL lpbmat; -LPDIRECT3DMATERIAL lpmat; -LPDIRECT3DLIGHT lpD3DLight; -/* - * Global projection, view, world and identity matricies - */ -D3DMATRIXHANDLE hProj; -D3DMATRIXHANDLE hView; -D3DMATRIXHANDLE hWorld; -D3DMATRIXHANDLE hDWorld; - -D3DMATRIX proj = { - D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0) -}; -D3DMATRIX view = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(7.0), D3DVAL(1.0) -}; -D3DMATRIX world= { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; -D3DMATRIX identity = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; - -/* - * A structure which holds the object's data - */ -struct { - D3DMATERIALHANDLE hmat; /* material handle */ - D3DTEXTUREHANDLE hTex; /* texture map handles */ - LPD3DVERTEX lpV; /* object's vertices */ - LPD3DTRIANGLE lpTri; /* object's triangles */ - int num_vertices, num_faces; -} objData; - -#define PI 3.14159265359 -#define DS 0.08 /* amount to spin world each time */ - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Sphere D3D Example"); -} - -/* - * Each frame, renders the scene and calls mod_buffer to modify the object - * for the next frame. - */ -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - /* - * Execute the instruction buffer - */ - if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, - lpView, D3DEXECUTE_UNCLIPPED) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData)!= D3D_OK) - return FALSE; - *lpExtent = d3dExData.dsStatus.drExtent; - - return TRUE; -} - -BOOL -InitScene(void) -{ - /* - * Generate the sphere. - */ - if (!(GenerateSphere((float)2.2, 18, 20, (float)1.0, (float)1.0, - (float)1.0, &objData.lpV, &objData.lpTri, - &objData.num_vertices, &objData.num_faces))) - return FALSE; - return TRUE; -} - -void -ReleaseScene(void) -{ - if (objData.lpV) - free(objData.lpV); - if (objData.lpTri) - free(objData.lpTri); -} - -/* - * Release the memory allocated for the scene and all D3D objects created. - */ -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - if (lpView) - lpView->lpVtbl->DeleteLight(lpView, lpD3DLight); - RELEASE(lpD3DLight); - RELEASE(lpD3DExBuf); - RELEASE(lpmat); - RELEASE(lpbmat); -} - -/* - * Builds the scene and initializes the execute buffer for rendering. Returns 0 on failure. - */ -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - /* Pointers into the exectue buffer. */ - LPVOID lpBufStart, lpInsStart, lpPointer; - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf; - size_t size; - - /* Light and materials */ - D3DLIGHT light; - D3DMATERIAL bmat; - D3DMATERIALHANDLE hbmat; - D3DMATERIAL mat; - - D3DMATRIX dworld; - float ct, st; - - /* - * Set the view, world and projection matrices - */ - MAKE_MATRIX(lpDev, hView, view); - MAKE_MATRIX(lpDev, hProj, proj); - MAKE_MATRIX(lpDev, hWorld, world); - /* - * Create a buffer for matrix set commands etc. - */ - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 4; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExCmdBuf, - NULL) != D3D_OK) - return FALSE; - if (lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - lpInsStart = lpPointer; - OP_STATE_TRANSFORM(3, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_VIEW, hView, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_PROJECTION, hProj, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_AMBIENT, RGBA_MAKE(10, 10, 10, 10), lpPointer); - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char*)lpPointer - (char*)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - lpDev->lpVtbl->BeginScene(lpDev); - lpDev->lpVtbl->Execute(lpDev, lpD3DExCmdBuf, lpView, D3DEXECUTE_UNCLIPPED); - lpDev->lpVtbl->EndScene(lpDev); - /* - * We are done with the command buffer. - */ - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - /* - * Set background to black material - */ - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpbmat, NULL) != D3D_OK) - return FALSE; - memset(&bmat, 0, sizeof(D3DMATERIAL)); - bmat.dwSize = sizeof(D3DMATERIAL); - bmat.dwRampSize = 1; - lpbmat->lpVtbl->SetMaterial(lpbmat, &bmat); - lpbmat->lpVtbl->GetHandle(lpbmat, lpDev, &hbmat); - lpView->lpVtbl->SetBackground(lpView, hbmat); - /* - * Create a material, set its description and obtain a handle to it. - */ - objData.hTex = TextureHandle[1]; - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpmat, NULL) != D3D_OK) - return FALSE; - memset(&mat, 0, sizeof(D3DMATERIAL)); - mat.dwSize = sizeof(D3DMATERIAL); - mat.diffuse.r = (D3DVALUE)1.0; - mat.diffuse.g = (D3DVALUE)1.0; - mat.diffuse.b = (D3DVALUE)1.0; - mat.diffuse.a = (D3DVALUE)1.0; - mat.ambient.r = (D3DVALUE)0.0; - mat.ambient.g = (D3DVALUE)0.0; - mat.ambient.b = (D3DVALUE)1.0; - mat.specular.r = (D3DVALUE)1.0; - mat.specular.g = (D3DVALUE)1.0; - mat.specular.b = (D3DVALUE)1.0; - mat.power = (float)40.0; - mat.dwRampSize = 32; - mat.hTexture = objData.hTex; - lpmat->lpVtbl->SetMaterial(lpmat, &mat); - lpmat->lpVtbl->GetHandle(lpmat, lpDev, &objData.hmat); - /* - * Create the matrix which spins the sphere - */ - ct = D3DVAL(cos(DS)); - st = D3DVAL(sin(DS)); - dworld = identity; - dworld._11 = ct; - dworld._13 = -st; - dworld._31 = st; - dworld._33 = ct; - MAKE_MATRIX(lpDev, hDWorld, dworld); - /* - * Create the main execute buffer - */ - size = sizeof(D3DVERTEX) * objData.num_vertices; - size += sizeof(D3DPROCESSVERTICES) * 1; - size += sizeof(D3DSTATUS) * 1; - size += sizeof(D3DINSTRUCTION) * 8; - size += sizeof(D3DSTATE) * 5; - size += sizeof(D3DMATRIXMULTIPLY) * 1; - size += sizeof(D3DTRIANGLE) * objData.num_faces; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, - NULL) != D3D_OK) - return FALSE; - /* - * lock it so it can be filled - */ - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - VERTEX_DATA(objData.lpV, objData.num_vertices, lpPointer); - /* - * Save the location of the first instruction and add instructions to - * execute buffer. - */ - lpInsStart = lpPointer; - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, objData.hmat, lpPointer); - OP_MATRIX_MULTIPLY(1, lpPointer); - MATRIX_MULTIPLY_DATA(hDWorld, hWorld, hWorld, lpPointer); - - OP_SET_STATUS(D3DSETSTATUS_ALL, D3DSTATUS_DEFAULT, 2048, 2048, 0, 0, lpPointer); - - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 0, objData.num_vertices, lpPointer); - OP_STATE_RENDER(2, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, objData.hTex, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPU, TRUE, lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(objData.num_faces, lpPointer); - TRIANGLE_LIST_DATA(objData.lpTri, objData.num_faces, lpPointer); - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = objData.num_vertices; - d3dExData.dwInstructionOffset = (ULONG)((char*)lpInsStart - (char*)lpBufStart); - d3dExData.dwInstructionLength = (ULONG)((char*)lpPointer - (char*)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - /* - * Create the light - */ - memset(&light, 0, sizeof(D3DLIGHT)); - light.dwSize = sizeof(D3DLIGHT); - light.dltType = D3DLIGHT_DIRECTIONAL; - light.dcvColor.r = D3DVAL(0.9); - light.dcvColor.g = D3DVAL(0.9); - light.dcvColor.b = D3DVAL(0.9); - light.dcvColor.a = D3DVAL(1.0); - light.dvDirection.x = D3DVALP(0.0, 12); - light.dvDirection.y = D3DVALP(0.0, 12); - light.dvDirection.z = D3DVALP(1.0, 12); - light.dvAttenuation0 = (float)1.0; - light.dvAttenuation1 = (float)0.0; - light.dvAttenuation2 = (float)0.0; - if (lpD3D->lpVtbl->CreateLight(lpD3D, &lpD3DLight, NULL) != D3D_OK) - return FALSE; - if (lpD3DLight->lpVtbl->SetLight(lpD3DLight, &light) != D3D_OK) - return FALSE; - if (lpView->lpVtbl->AddLight(lpView, lpD3DLight) != D3D_OK) - return FALSE; - - return TRUE; -} - - diff --git a/sdk/samples/sphere/sphere.def b/sdk/samples/sphere/sphere.def deleted file mode 100644 index 1975472..0000000 --- a/sdk/samples/sphere/sphere.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME sphere.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/stretch/donut.bmp b/sdk/samples/stretch/donut.bmp deleted file mode 100644 index 2b9595b..0000000 Binary files a/sdk/samples/stretch/donut.bmp and /dev/null differ diff --git a/sdk/samples/stretch/makefile b/sdk/samples/stretch/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/stretch/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/stretch/makefile.wat b/sdk/samples/stretch/makefile.wat deleted file mode 100644 index b705d4b..0000000 --- a/sdk/samples/stretch/makefile.wat +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=watcom.mk -!include ..\watbld.mk diff --git a/sdk/samples/stretch/msvc.mk b/sdk/samples/stretch/msvc.mk deleted file mode 100644 index dfe6eff..0000000 --- a/sdk/samples/stretch/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = stretch -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = stretch.obj ddutil.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/stretch/readme.txt b/sdk/samples/stretch/readme.txt deleted file mode 100644 index fd3c988..0000000 --- a/sdk/samples/stretch/readme.txt +++ /dev/null @@ -1,17 +0,0 @@ -This program demonstrated clipped blting and stretched clipped blting. It -is a non-exclusive mode application that displays a rotating donut in a -window. Clipped blting can be demonstrated by moving another window partially -or completely in front of the stretch window. The rotating donut does not -overwrite the clipping window. - -The size of the rotating donut can be changed with menu selections. Any -other size than 1x1 demonstrates stretch blting. The window can also be -resized by grabbing any one of the corners with the mouse. - -Another menu option can be used to change the rate of rotation of the donut. - -This is not an exclusive mode application and so it is incapable of setting -the display mode. Therefore, it must be executed on an 8 bit per pixel -display. It will not work correctly with other pixel depths. - - diff --git a/sdk/samples/stretch/resource.h b/sdk/samples/stretch/resource.h deleted file mode 100644 index 53f8e85..0000000 --- a/sdk/samples/stretch/resource.h +++ /dev/null @@ -1,29 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by STRETCH.RC -// -#define IDR_MENU 1 -#define ID_FILE_EXIT 10001 -#define ID_ROTATION_STOP 40001 -#define ID_ROTATION_SLOW 40011 -#define ID_ROTATION_FAST 40012 -#define ID_SIZE_1X1 40002 -#define ID_SIZE_2X1 40003 -#define ID_SIZE_3X1 40004 -#define ID_SIZE_1X2 40005 -#define ID_SIZE_2X2 40006 -#define ID_SIZE_3X2 40007 -#define ID_SIZE_1X3 40008 -#define ID_SIZE_2X3 40009 -#define ID_SIZE_3X3 40010 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40011 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/sdk/samples/stretch/stretch.cpp b/sdk/samples/stretch/stretch.cpp deleted file mode 100644 index 231587b..0000000 --- a/sdk/samples/stretch/stretch.cpp +++ /dev/null @@ -1,386 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - * - * File: donut.cpp - * - ***************************************************************************/ - -#define NAME "Stretch" -#define TITLE "Stretch" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "resource.h" -#include "ddutil.h" - -#define SIZEX 64 -#define SIZEY 64 -char *szBitmap = "DONUT"; - -HWND hwnd; -DWORD UpdateDelay = 13; -HPALETTE HPal = NULL; - -LPDIRECTDRAW lpDD; // DirectDraw object -LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface -LPDIRECTDRAWSURFACE lpDDSOne; // Offscreen surface 1 -LPDIRECTDRAWCLIPPER lpClipper; // clipper for primary -LPDIRECTDRAWPALETTE lpDDPal; // DirectDraw palette -BOOL bActive; // is application active? - -/* - * restoreAll - * - * restore all lost objects - */ -BOOL restoreAll( void ) -{ - return lpDDSPrimary->Restore() == DD_OK && - lpDDSOne->Restore() == DD_OK && - DDReLoadBitmap(lpDDSOne, szBitmap) == DD_OK; - -} /* restoreAll */ - -/* - * updateFrame - * - * Decide what needs to be blitted next, wait for flip to complete, - * then flip the buffers. - */ -void updateFrame( void ) -{ - static DWORD lastTickCount = 0; - static int currentFrame = 0; - static BOOL haveBackground = FALSE; - DWORD thisTickCount; - RECT rcRect; - RECT destRect; - HRESULT ddrval; - POINT pt; - - thisTickCount = GetTickCount(); - if((thisTickCount - lastTickCount) <= UpdateDelay) - { - return; - } - - // Move to next frame; - lastTickCount = thisTickCount; - currentFrame++; - if(currentFrame > 59) - { - currentFrame = 0; - } - - // Blit the stuff for the next frame - rcRect.left = currentFrame%10*64; - rcRect.top = currentFrame/10*64; - rcRect.right = currentFrame%10*64 + 64; - rcRect.bottom = currentFrame/10*64 + 64; - - GetClientRect( hwnd, &destRect ); - if (destRect.right < 128) destRect.right = 64; - if (destRect.bottom < 64) destRect.bottom = 64; - - pt.x = pt.y = 0; - ClientToScreen( hwnd, &pt ); - OffsetRect(&destRect, pt.x, pt.y); - - while( 1 ) - { - ddrval = lpDDSPrimary->Blt( &destRect, lpDDSOne, &rcRect, 0, NULL ); - - if( ddrval == DD_OK ) - { - break; - } - if( ddrval == DDERR_SURFACELOST ) - { - if(!restoreAll()) - { - return; - } - } - if( ddrval != DDERR_WASSTILLDRAWING ) - { - return; - } - } - if(ddrval != DD_OK) - { - return; - } -} /* updateFrame */ - - -/* - * finiObjects - * - * finished with all objects we use; release them - */ -static void finiObjects( void ) -{ - if( lpDD != NULL ) - { - if( lpDDSPrimary != NULL ) - { - lpDDSPrimary->Release(); - lpDDSPrimary = NULL; - } - if( lpDDSOne != NULL ) - { - lpDDSOne->Release(); - lpDDSOne = NULL; - } - if( lpDDPal != NULL ) - { - lpDDPal->Release(); - lpDDPal = NULL; - } - lpDD->Release(); - lpDD = NULL; - } -} /* finiObjects */ - -long FAR PASCAL WindowProc( HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam ) -{ - RECT rc; - - switch( message ) - { - case WM_ACTIVATEAPP: - bActive = wParam; - break; - - case WM_PALETTECHANGED: - if ((HWND)wParam == hWnd) - break; - // fall through to WM_QUERYNEWPALETTE - case WM_QUERYNEWPALETTE: - // install our palette here - if (lpDDPal) - { - lpDDSPrimary->SetPalette(lpDDPal); - } - // reload the bitmap into the surface because the palette - // has changed.. - DDReLoadBitmap(lpDDSOne, szBitmap); - break; - - - case WM_CREATE: - break; - - case WM_GETMINMAXINFO: - ((MINMAXINFO*)lParam)->ptMinTrackSize.x = SIZEX; - ((MINMAXINFO*)lParam)->ptMinTrackSize.y = SIZEY; - return 0; - - case WM_KEYDOWN: - switch( wParam ) - { - case VK_ESCAPE: - case VK_F12: - PostMessage(hWnd, WM_CLOSE, 0, 0); - break; - } - break; - - case WM_DESTROY: - finiObjects(); - PostQuitMessage( 0 ); - break; - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case ID_ROTATION_STOP: - UpdateDelay = 0x7fffffff; - break; - case ID_ROTATION_SLOW: - UpdateDelay = 200; - break; - case ID_ROTATION_FAST: - UpdateDelay = 13; - break; - case ID_FILE_EXIT: - PostMessage( hWnd, WM_CLOSE, 0, 0L ); - break; - - case ID_SIZE_1X1: SetRect(&rc, 0, 0, SIZEX*1, SIZEY*1); goto size_me; - case ID_SIZE_2X1: SetRect(&rc, 0, 0, SIZEX*2, SIZEY*1); goto size_me; - case ID_SIZE_3X1: SetRect(&rc, 0, 0, SIZEX*3, SIZEY*1); goto size_me; - case ID_SIZE_1X2: SetRect(&rc, 0, 0, SIZEX*1, SIZEY*2); goto size_me; - case ID_SIZE_2X2: SetRect(&rc, 0, 0, SIZEX*2, SIZEY*2); goto size_me; - case ID_SIZE_3X2: SetRect(&rc, 0, 0, SIZEX*3, SIZEY*2); goto size_me; - case ID_SIZE_1X3: SetRect(&rc, 0, 0, SIZEX*1, SIZEY*3); goto size_me; - case ID_SIZE_2X3: SetRect(&rc, 0, 0, SIZEX*2, SIZEY*3); goto size_me; - case ID_SIZE_3X3: SetRect(&rc, 0, 0, SIZEX*3, SIZEY*3); goto size_me; -size_me: - AdjustWindowRectEx(&rc, GetWindowLong(hWnd, GWL_STYLE), - GetMenu(hWnd) != NULL, GetWindowLong(hWnd, GWL_EXSTYLE)); - SetWindowPos(hWnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, - SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); - break; - } - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* WindowProc */ - -/* - * This function is called if the initialization function fails - */ -BOOL initFail( HWND hwnd ) -{ - finiObjects(); - MessageBox( hwnd, "DirectDraw Init FAILED", TITLE, MB_OK ); - DestroyWindow( hwnd ); - return FALSE; - -} /* initFail */ - -/* - * doInit - do work required for every instance of the application: - * create the window, initialize data - */ -static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - DDSURFACEDESC ddsd; - HRESULT ddrval; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); - wc.lpszClassName = NAME; - RegisterClass( &wc ); - - /* - * create a window - */ - hwnd = CreateWindowEx( - 0, - NAME, - TITLE, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, - CW_USEDEFAULT, - 128, - 128, - NULL, - NULL, - hInstance, - NULL ); - - if( !hwnd ) - { - return FALSE; - } - - PostMessage(hwnd, WM_COMMAND, ID_SIZE_1X1, 0); - - ShowWindow( hwnd, nCmdShow ); - UpdateWindow( hwnd ); - - /* - * create the main DirectDraw object - */ - ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_NORMAL ); - - // Create the primary surface - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - - ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // create a clipper for the primary surface - ddrval = lpDD->CreateClipper( 0, &lpClipper, NULL ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - ddrval = lpClipper->SetHWnd( 0, hwnd ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - ddrval = lpDDSPrimary->SetClipper( lpClipper ); - if( ddrval != DD_OK ) - { - return initFail(hwnd); - } - - // load our palette - lpDDPal = DDLoadPalette(lpDD, szBitmap); - - // make sure to set the palette before loading bitmaps. - if (lpDDPal) - lpDDSPrimary->SetPalette(lpDDPal); - - // load our bitmap - lpDDSOne = DDLoadBitmap(lpDD, szBitmap, 0, 0); - - if( lpDDSOne == NULL ) - { - return initFail(hwnd); - } - - return TRUE; -} /* doInit */ - -/* - * WinMain - initialization, message loop - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - MSG msg; - - if( !doInit( hInstance, nCmdShow ) ) - { - return FALSE; - } - - while( 1 ) - { - if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( !GetMessage( &msg, NULL, 0, 0 ) ) - return msg.wParam; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else - { - updateFrame(); - } - } -} /* WinMain */ diff --git a/sdk/samples/stretch/stretch.def b/sdk/samples/stretch/stretch.def deleted file mode 100644 index a95935a..0000000 --- a/sdk/samples/stretch/stretch.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME stretch.exe - -DESCRIPTION 'Stretch and clipped blt test (C) Microsoft 1995' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/stretch/stretch.rc b/sdk/samples/stretch/stretch.rc deleted file mode 100644 index 5d57fb8..0000000 --- a/sdk/samples/stretch/stretch.rc +++ /dev/null @@ -1,82 +0,0 @@ -//Microsoft Visual C++ generated resource script. -// - -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmaps -// -DONUT BITMAP DONUT.BMP - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU MENU DISCARDABLE -BEGIN -// POPUP "&File" -// BEGIN -// MENUITEM "E&xit", ID_FILE_EXIT -// END - POPUP "&Size" - BEGIN - MENUITEM "1x1", ID_SIZE_1X1 - MENUITEM "2x1", ID_SIZE_2X1 - MENUITEM "3x1", ID_SIZE_3X1 - MENUITEM "1x2", ID_SIZE_1X2 - MENUITEM "2x2", ID_SIZE_2X2 - MENUITEM "3x2", ID_SIZE_3X2 - MENUITEM "1x3", ID_SIZE_1X3 - MENUITEM "2x3", ID_SIZE_2X3 - MENUITEM "3x3", ID_SIZE_3X3 - END - POPUP "&Rotation" - BEGIN - MENUITEM "&Stop", ID_ROTATION_STOP - MENUITEM "Slo&w", ID_ROTATION_SLOW - MENUITEM "&Fast", ID_ROTATION_FAST - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resrc1.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""resource.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -///////////////////////////////////////////////////////////////////////////// -#endif // APSTUDIO_INVOKED - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/sdk/samples/stretch/watcom.mk b/sdk/samples/stretch/watcom.mk deleted file mode 100644 index 3e4c552..0000000 --- a/sdk/samples/stretch/watcom.mk +++ /dev/null @@ -1,33 +0,0 @@ -NAME = stretch -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =..\..\..\lib\ddraw.lib - -OBJS = stretch.obj ddutil.obj - -SYS = nt_win - -!ifdef DEBUG -COPT =-DDEBUG -d2 -LOPT = debug all -ROPT =-DDEBUG -!else -COPT =-oaxt -d1 -LOPT = -ROPT = -!endif - -DEF = $(NAME).def -RES = $(NAME).res - -CFLAGS =$(COPT) -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -!include ..\..\watsdk.mk - -$(NAME).$(EXT): $(OBJS) $(NAME).lnk $(RES) - $(LINK) $(LFLAGS) @$(NAME).lnk - $(RC) $(RES) diff --git a/sdk/samples/tex1/makefile b/sdk/samples/tex1/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/tex1/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/tex1/msvc.mk b/sdk/samples/tex1/msvc.mk deleted file mode 100644 index 3491841..0000000 --- a/sdk/samples/tex1/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = tex1 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = tex1.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/tex1/readme.txt b/sdk/samples/tex1/readme.txt deleted file mode 100644 index 6698314..0000000 --- a/sdk/samples/tex1/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Tex1 -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Loading a simple texture mapped mesh object. diff --git a/sdk/samples/tex1/tex1.c b/sdk/samples/tex1/tex1.c deleted file mode 100644 index 5fa5a9a..0000000 --- a/sdk/samples/tex1/tex1.c +++ /dev/null @@ -1,135 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: tex1.c - * - ***************************************************************************/ - -/* - * A texture mapping example using a cylindrical mapping. - */ - -#include "rmdemo.h" - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMMESH mesh = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMTEXTURE tex = NULL; - LPDIRECT3DRMMATERIAL mat = NULL; - LPDIRECT3DRMWRAP wrap = NULL; - LPDIRECT3DRMLIGHT l1 = NULL; - LPDIRECT3DRMLIGHT l2 = NULL; - D3DRMBOX box; - D3DVALUE miny, maxy; - D3DVALUE height; - HRESULT rval; - - dev; - view; - camera; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.2), - D3DVAL(0.2), D3DVAL(0.2), &l1))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, l1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetOrientation(frame, scene, -D3DVAL(1), -D3DVAL(1), - D3DVAL(1), D3DVAL(0), D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1), - D3DVAL(1), D3DVAL(1), &l2))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddLight(frame, l2))) - goto generic_error; - RELEASE(frame); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetPosition(frame, scene, D3DVAL(0), D3DVAL(0), D3DVAL(15)))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetRotation(frame, scene, D3DVAL(1.1), D3DVAL(0.3), - D3DVAL(0.0), D3DVAL(0.04)))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "sphere4.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere4.x.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex7.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load tex7.ppm.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(lpD3DRM->lpVtbl->CreateMaterial(lpD3DRM, D3DVAL(10.0), &mat))) - goto generic_error; - - if (FAILED(builder->lpVtbl->SetTexture(builder, tex))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetMaterial(builder, mat))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetColorRGB(builder, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0)))) - goto generic_error; - - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - - if (FAILED(mesh->lpVtbl->GetBox(mesh, &box))) - goto generic_error; - maxy = box.max.y; - miny = box.min.y; - height = maxy - miny; - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_CYLINDER, NULL, D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DDivide(miny, height), D3DVAL(1.0), - D3DDivide(-D3DVAL(1.0), height), &wrap))) - goto generic_error; - - if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT)mesh))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddVisual(frame, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - - RELEASE(frame); - RELEASE(wrap); - RELEASE(mesh); - RELEASE(tex); - RELEASE(mat); - RELEASE(l1); - RELEASE(l2); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(mesh); - RELEASE(builder); - RELEASE(frame); - RELEASE(tex); - RELEASE(mat); - RELEASE(wrap); - RELEASE(l1); - RELEASE(l2); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Texture Mapping Direct3DRM Example"); -} diff --git a/sdk/samples/tex1/tex1.def b/sdk/samples/tex1/tex1.def deleted file mode 100644 index 9e2cc85..0000000 --- a/sdk/samples/tex1/tex1.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME tex1.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/tex3/makefile b/sdk/samples/tex3/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/tex3/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/tex3/msvc.mk b/sdk/samples/tex3/msvc.mk deleted file mode 100644 index 7d9583e..0000000 --- a/sdk/samples/tex3/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = tex3 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = tex3.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT = -DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/tex3/readme.txt b/sdk/samples/tex3/readme.txt deleted file mode 100644 index db1d2e1..0000000 --- a/sdk/samples/tex3/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Tex3 -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Using texture wraps for special effects. diff --git a/sdk/samples/tex3/tex3.c b/sdk/samples/tex3/tex3.c deleted file mode 100644 index 87091eb..0000000 --- a/sdk/samples/tex3/tex3.c +++ /dev/null @@ -1,192 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: tex3.c - * - ***************************************************************************/ - -/* - * A texture mapping example using a spherical mapping, relative to a - * frame. - */ - -#include "rmdemo.h" - -void CDECL -applyWrap(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg; - LPDIRECT3DRMVISUALARRAY visuals; - LPDIRECT3DRMVISUAL v; - int count, i; - LPDIRECT3DRMMESH mesh; - - frame->lpVtbl->GetVisuals(frame, &visuals); - count = visuals->lpVtbl->GetSize(visuals); - - for (i = 0; i < count; i++) { - visuals->lpVtbl->GetElement(visuals, i, &v); - - if (SUCCEEDED(v->lpVtbl->QueryInterface(v, &IID_IDirect3DRMMesh, &mesh))) { - wrap->lpVtbl->ApplyRelative(wrap, frame, (LPDIRECT3DRMOBJECT)mesh); - mesh->lpVtbl->Release(mesh); - } - v->lpVtbl->Release(v); - } - - visuals->lpVtbl->Release(visuals); -} - -void CDECL -cleanupWrap(LPDIRECT3DRMOBJECT obj, void* arg) -{ - LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg; - obj; - - wrap->lpVtbl->Release(wrap); -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMMESH mesh = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMFRAME axis = NULL; - LPDIRECT3DRMFRAME child = NULL; - LPDIRECT3DRMTEXTURE tex = NULL; - LPDIRECT3DRMWRAP wrap = NULL; - LPDIRECT3DRMLIGHT l1 = NULL; - LPDIRECT3DRMLIGHT l2 = NULL; - HRESULT rval; - - dev; - view; - camera; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.2), - D3DVAL(0.2), D3DVAL(0.2), &l1))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, l1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetOrientation(frame, scene, -D3DVAL(1), -D3DVAL(1), - D3DVAL(1), D3DVAL(0), D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1), - D3DVAL(1), D3DVAL(1), &l2))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddLight(frame, l2))) - goto generic_error; - RELEASE(frame); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetPosition(frame, scene, D3DVAL(0), D3DVAL(0), D3DVAL(15)))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetRotation(frame, scene, D3DVAL(1.1), D3DVAL(0.3), - D3DVAL(0.0), D3DVAL(0.04)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "sphere3.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere3.x.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - if (FAILED(frame->lpVtbl->AddVisual(frame, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - RELEASE(mesh); - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_SPHERE, frame, - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(1.0), &wrap))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, frame, &axis))) - goto generic_error; - if (FAILED(axis->lpVtbl->SetRotation(axis, frame, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.04)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, axis, &child))) - goto generic_error; - if (FAILED(child->lpVtbl->SetPosition(child, axis, D3DVAL(3), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(child->lpVtbl->SetRotation(child, axis, D3DVAL(1), D3DVAL(1), D3DVAL(0), - D3DVAL(0.04)))) - goto generic_error; - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "checker.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load checker.ppm.\n%s", D3DRMErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(tex->lpVtbl->SetColors(tex, 2))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetDecalScale(tex, TRUE))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetDecalOrigin(tex, 128, 128))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - if (FAILED(builder->lpVtbl->Load(builder, "tpot2.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL))) - goto generic_error; - if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(2), D3DVAL(2), D3DVAL(2)))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetTexture(builder, tex))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetQuality(builder, D3DRMRENDER_GOURAUD))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - - if (FAILED(child->lpVtbl->AddVisual(child, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - if (FAILED(child->lpVtbl->AddMoveCallback(child, applyWrap, (void *) wrap))) - goto generic_error; - if (FAILED(child->lpVtbl->AddDestroyCallback(child, cleanupWrap, wrap))) - goto generic_error; - - RELEASE(mesh); - RELEASE(frame); - RELEASE(axis); - RELEASE(child); - RELEASE(tex); - RELEASE(l1); - RELEASE(l2); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(mesh); - RELEASE(builder); - RELEASE(frame); - RELEASE(axis); - RELEASE(child); - RELEASE(tex); - RELEASE(wrap); - RELEASE(l1); - RELEASE(l2); - return FALSE; -} - -void -OverrideDefaults(Defaults *defaults) -{ - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Texture Mapping III Direct3DRM Example"); -} diff --git a/sdk/samples/tex3/tex3.def b/sdk/samples/tex3/tex3.def deleted file mode 100644 index 402e206..0000000 --- a/sdk/samples/tex3/tex3.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME tex3.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/tex4/makefile b/sdk/samples/tex4/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/tex4/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/tex4/msvc.mk b/sdk/samples/tex4/msvc.mk deleted file mode 100644 index 79ccd15..0000000 --- a/sdk/samples/tex4/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = tex4 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = tex4.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/tex4/readme.txt b/sdk/samples/tex4/readme.txt deleted file mode 100644 index 1b22792..0000000 --- a/sdk/samples/tex4/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Tex4 -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Another example of using texture wraps for special effects. diff --git a/sdk/samples/tex4/tex4.c b/sdk/samples/tex4/tex4.c deleted file mode 100644 index aee7f0c..0000000 --- a/sdk/samples/tex4/tex4.c +++ /dev/null @@ -1,198 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: tex4.c - * - ***************************************************************************/ - -/* - * A texture mapping example using a spherical mapping relative to the - * camera. The texture is also used as a background for the scene. - */ - -#include "rmdemo.h" - -void CDECL -applyWrap(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg; - LPDIRECT3DRMVISUALARRAY visuals; - LPDIRECT3DRMVISUAL v; - int count, i; - LPDIRECT3DRMMESH mesh; - - frame->lpVtbl->GetVisuals(frame, &visuals); - count = visuals->lpVtbl->GetSize(visuals); - - for (i = 0; i < count; i++) { - visuals->lpVtbl->GetElement(visuals, i, &v); - - if (SUCCEEDED(v->lpVtbl->QueryInterface(v, &IID_IDirect3DRMMesh, &mesh))) { - wrap->lpVtbl->ApplyRelative(wrap, frame, (LPDIRECT3DRMOBJECT)mesh); - mesh->lpVtbl->Release(mesh); - } - v->lpVtbl->Release(v); - } - - visuals->lpVtbl->Release(visuals); -} - -void CDECL -cleanupWrap(LPDIRECT3DRMOBJECT obj, void *arg) -{ - LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg; - obj; - - wrap->lpVtbl->Release(wrap); -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMMESH mesh = NULL; - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMFRAME axis = NULL; - LPDIRECT3DRMFRAME child = NULL; - LPDIRECT3DRMTEXTURE tex = NULL; - LPDIRECT3DRMWRAP wrap = NULL; - LPDIRECT3DRMLIGHT light1 = NULL; - LPDIRECT3DRMLIGHT light2 = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - HRESULT rval; - dev; - view; - camera; - - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.2), - D3DVAL(0.2), D3DVAL(0.2), &light1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1), - D3DVAL(1), D3DVAL(1), &light2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, light1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetOrientation(frame, scene, -D3DVAL(1), -D3DVAL(1), - D3DVAL(1), D3DVAL(0), D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddLight(frame, light2))) - goto generic_error; - RELEASE(frame); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetPosition(frame, scene, D3DVAL(0), D3DVAL(0), D3DVAL(15)))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetRotation(frame, scene, D3DVAL(1.1), D3DVAL(0.3), - D3DVAL(0.0), D3DVAL(0.04)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "sphere3.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere3.x.\n"); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - if (FAILED(frame->lpVtbl->AddVisual(frame, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - RELEASE(mesh); - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_SPHERE, camera, - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(5.0), D3DVAL(5.0), - &wrap))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, frame, &axis))) - goto generic_error; - if (FAILED(axis->lpVtbl->SetRotation(axis, frame, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.04)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, axis, &child))) - goto generic_error; - if (FAILED(child->lpVtbl->SetPosition(child, axis, D3DVAL(3), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(child->lpVtbl->SetRotation(child, axis, D3DVAL(1), D3DVAL(1), D3DVAL(0), - D3DVAL(0.04)))) - goto generic_error; - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "lake.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load lake.ppm.\n"); - goto ret_with_error; - } - if (FAILED(tex->lpVtbl->SetColors(tex, 32))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetDecalScale(tex, TRUE))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetDecalOrigin(tex, 128, 128))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "tpot2.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load tpot2.x.\n"); - goto ret_with_error; - } - - if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(2), D3DVAL(2), D3DVAL(2)))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetTexture(builder, tex))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetQuality(builder, D3DRMRENDER_GOURAUD))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - - if (FAILED(child->lpVtbl->AddVisual(child, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - if (FAILED(child->lpVtbl->AddMoveCallback(child, applyWrap, (void *) wrap))) - goto generic_error; - if (FAILED(child->lpVtbl->AddDestroyCallback(child, cleanupWrap, wrap))) - goto generic_error; - if (FAILED(scene->lpVtbl->SetSceneBackgroundImage(scene, tex))) - goto generic_error; - - RELEASE(mesh); - RELEASE(frame); - RELEASE(axis); - RELEASE(child); - RELEASE(tex); - RELEASE(light1); - RELEASE(light2); - - /* don't release the wrap */ - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(mesh); - RELEASE(frame); - RELEASE(axis); - RELEASE(child); - RELEASE(tex); - RELEASE(wrap); - RELEASE(light1); - RELEASE(light2); - RELEASE(builder); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Texture Mapping IV Direct3DRM Example"); -} diff --git a/sdk/samples/tex4/tex4.def b/sdk/samples/tex4/tex4.def deleted file mode 100644 index 8c03274..0000000 --- a/sdk/samples/tex4/tex4.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME tex4.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/tex5/makefile b/sdk/samples/tex5/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/tex5/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/tex5/msvc.mk b/sdk/samples/tex5/msvc.mk deleted file mode 100644 index a733249..0000000 --- a/sdk/samples/tex5/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = tex5 -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = tex5.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/tex5/readme.txt b/sdk/samples/tex5/readme.txt deleted file mode 100644 index 8834b72..0000000 --- a/sdk/samples/tex5/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Tex5 -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Using a Wrap for Chrome mapping and a Texture map as decal. diff --git a/sdk/samples/tex5/tex5.c b/sdk/samples/tex5/tex5.c deleted file mode 100644 index ba43129..0000000 --- a/sdk/samples/tex5/tex5.c +++ /dev/null @@ -1,206 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: tex5.c - * - ***************************************************************************/ - -/* - * A texture mapping example showing the use of chrome mapping and decals. - */ - -#include "rmdemo.h" - -void CDECL -applyWrap(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg; - LPDIRECT3DRMVISUALARRAY visuals; - LPDIRECT3DRMVISUAL v; - int count, i; - - frame->lpVtbl->GetVisuals(frame, &visuals); - if (visuals) { - count = visuals->lpVtbl->GetSize(visuals); - - for (i = 0; i < count; i++) { - visuals->lpVtbl->GetElement(visuals, i, &v); - wrap->lpVtbl->ApplyRelative(wrap, frame, (LPDIRECT3DRMOBJECT) v); - v->lpVtbl->Release(v); - } - - visuals->lpVtbl->Release(visuals); - } -} - -void CDECL -toggleDecalScale(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - LPDIRECT3DRMTEXTURE decal = (LPDIRECT3DRMTEXTURE) arg; - static int i = 0; - - i++; - if (i == 20) { - int scale; - - i = 0; - - scale = decal->lpVtbl->GetDecalScale(decal); - decal->lpVtbl->SetDecalScale(decal, !scale); - } -} - -void CDECL -cleanupWrap(LPDIRECT3DRMOBJECT obj, void* arg) -{ - LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg; - obj; - - wrap->lpVtbl->Release(wrap); -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMMESH mesh = NULL; - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMFRAME axis = NULL; - LPDIRECT3DRMFRAME orbit = NULL; - LPDIRECT3DRMTEXTURE tex = NULL; - LPDIRECT3DRMWRAP wrap = NULL; - LPDIRECT3DRMLIGHT light1 = NULL; - LPDIRECT3DRMLIGHT light2 = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - HRESULT rval; - - dev; - view; - camera; - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.2), - D3DVAL(0.2), D3DVAL(0.2), &light1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1), - D3DVAL(1), D3DVAL(1), &light2))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, light1))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetOrientation(frame, scene, -D3DVAL(1), -D3DVAL(1), - D3DVAL(1), D3DVAL(0), D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddLight(frame, light2))) - goto generic_error; - RELEASE(frame); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetPosition(frame, scene, D3DVAL(0), D3DVAL(0), D3DVAL(15)))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetOrientation(frame, scene, D3DVAL(0), D3DVAL(1.0), D3DVAL(0), - D3DVAL(0), D3DVAL(0), D3DVAL(1)))) - goto generic_error; - if (FAILED(frame->lpVtbl->SetRotation(frame, scene, D3DVAL(0), D3DVAL(0.9), D3DVAL(1.0), - D3DVAL(0.04)))) - goto generic_error; - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "lake.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load lake.ppm.\n"); - goto ret_with_error; - } - if (FAILED(tex->lpVtbl->SetColors(tex, 256))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetShades(tex, 1))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetDecalScale(tex, TRUE))) - goto generic_error; - if (FAILED(tex->lpVtbl->SetDecalOrigin(tex, 128, 128))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "torus.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load torus.x.\n"); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->SetTexture(builder, tex))) - goto generic_error; - if (FAILED(builder->lpVtbl->SetQuality(builder, D3DRMRENDER_GOURAUD))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh))) - goto generic_error; - RELEASE(builder); - - - if (FAILED(mesh->lpVtbl->SetGroupColorRGB(mesh, 0, D3DVAL(0.7), D3DVAL(0.3), D3DVAL(0.3)))) - goto generic_error; - if (FAILED(mesh->lpVtbl->SetGroupColorRGB(mesh, 1, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0)))) - goto generic_error; - - if (FAILED(frame->lpVtbl->AddVisual(frame, (LPDIRECT3DRMVISUAL) mesh))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap - (lpD3DRM, D3DRMWRAP_CHROME, camera, - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - -D3DVAL(1.0), &wrap))) - goto generic_error; - - if (FAILED(frame->lpVtbl->AddMoveCallback(frame, applyWrap, (void *) wrap))) - goto generic_error; - if (FAILED(frame->lpVtbl->AddDestroyCallback(frame, cleanupWrap, wrap))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, frame, &axis))) - goto generic_error; - if (FAILED(axis->lpVtbl->SetRotation(axis, frame, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.04)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, axis, &orbit))) - goto generic_error; - if (FAILED(orbit->lpVtbl->SetPosition(orbit, axis, D3DVAL(2.6), D3DVAL(0), D3DVAL(0)))) - goto generic_error; - if (FAILED(orbit->lpVtbl->AddVisual(orbit, (LPDIRECT3DRMVISUAL) tex))) - goto generic_error; - //orbit->lpVtbl->AddMoveCallback(orbit, toggleDecalScale, (void*) tex); - if (FAILED(scene->lpVtbl->SetSceneBackgroundImage(scene, tex))) - goto generic_error; - - RELEASE(mesh); - RELEASE(frame); - RELEASE(axis); - RELEASE(orbit); - RELEASE(tex); - RELEASE(light1); - RELEASE(light2); - /* don't release the wrap */ - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(mesh); - RELEASE(frame); - RELEASE(axis); - RELEASE(orbit); - RELEASE(tex); - RELEASE(wrap); - RELEASE(light1); - RELEASE(light2); - RELEASE(builder); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Texture Mapping V Direct3DRM Example"); -} diff --git a/sdk/samples/tex5/tex5.def b/sdk/samples/tex5/tex5.def deleted file mode 100644 index 55bbe32..0000000 --- a/sdk/samples/tex5/tex5.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME tex5.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/trans/makefile b/sdk/samples/trans/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/trans/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/trans/msvc.mk b/sdk/samples/trans/msvc.mk deleted file mode 100644 index 4470f30..0000000 --- a/sdk/samples/trans/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = trans -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = trans.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/trans/readme.txt b/sdk/samples/trans/readme.txt deleted file mode 100644 index 65b3cb4..0000000 --- a/sdk/samples/trans/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -Trans -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Using transparent texture maps in various ways. diff --git a/sdk/samples/trans/trans.c b/sdk/samples/trans/trans.c deleted file mode 100644 index 3970bd0..0000000 --- a/sdk/samples/trans/trans.c +++ /dev/null @@ -1,334 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: trans.c - * - ***************************************************************************/ - -#include "rmdemo.h" - -unsigned char check[] = { - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, - 2, 3, 3, 2, 1, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, -}; - -D3DRMPALETTEENTRY checkPal[] = { - {0, 0, 0, D3DRMPALETTE_READONLY}, - {127, 255, 127, D3DRMPALETTE_READONLY}, - {0, 0, 255, D3DRMPALETTE_READONLY}, - {255, 255, 127, D3DRMPALETTE_READONLY}, - {255, 255, 255, D3DRMPALETTE_READONLY}, -}; - -D3DRMIMAGE checkImage = { - 32, 32, - 1, 1, - 8, FALSE, - 32, - check, NULL, - 0xff, 0xff, 0xff, 0xff, - 5, checkPal, -}; - -static void CDECL mutateTexture(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta) -{ - LPDIRECT3DRMTEXTURE tex = (LPDIRECT3DRMTEXTURE) arg; - static int col = -1; - static int delay = 10; - static int count = 0; - int i; - - if (--delay) - return; - delay = 10; - - if (col >= 0) - for (i = 0; i < sizeof(check); i++) - if (check[i] == 4) - check[i] = col; - - count++; - col = count & 3; - - for (i = 0; i < sizeof(check); i++) - if (check[i] == col) - check[i] = 4; - - tex->lpVtbl->Changed(tex, TRUE, FALSE); -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - LPDIRECT3DRMFRAME box1 = NULL; - LPDIRECT3DRMFRAME box2 = NULL; - LPDIRECT3DRMFRAME sphere = NULL; - LPDIRECT3DRMFRAME decal = NULL; - LPDIRECT3DRMFRAME light = NULL; - LPDIRECT3DRMMESH obj = NULL; - LPDIRECT3DRMLIGHT dlight = NULL; - LPDIRECT3DRMLIGHT alight = NULL; - LPDIRECT3DRMTEXTURE tex = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - LPDIRECT3DRMWRAP wrap = NULL; - LPDIRECT3DRMTEXTURE sphereTex = NULL; - LPDIRECT3DRMTEXTURE decalTex = NULL; - LPDIRECT3DRMMATERIAL mat = NULL; - D3DRMBOX box; - D3DVALUE miny, maxy; - D3DVALUE height; - HRESULT rval; - - view = view; - dev = dev; - camera = camera; /* unused */ - - if (FAILED(scene->lpVtbl->SetSceneBackground(scene, D3DRGB(D3DVAL(0.2), D3DVAL(0.2), - D3DVAL(0.2))))) - goto generic_error; - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &light))) - goto generic_error; - if (FAILED(light->lpVtbl->SetPosition(light, scene, D3DVAL(2.0), D3DVAL(3.0), - D3DVAL(8.0)))) - goto generic_error; - if (FAILED(light->lpVtbl->SetOrientation(light, scene, D3DVAL(-1.0), D3DVAL(-1.0), - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1), - D3DVAL(1), D3DVAL(1), &dlight))) - goto generic_error; - if (FAILED(light->lpVtbl->AddLight(light, dlight))) - goto generic_error; - RELEASE(dlight); - RELEASE(light); - - if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &alight))) - goto generic_error; - if (FAILED(scene->lpVtbl->AddLight(scene, alight))) - goto generic_error; - RELEASE(alight); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &box1))) - goto generic_error; - if (FAILED(box1->lpVtbl->SetRotation(box1, scene, D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(-0.02)))) - goto generic_error; - if (FAILED(box1->lpVtbl->SetPosition(box1, scene, D3DVAL(2.0), D3DVAL(0.0), D3DVAL(7.0)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "ncube.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load ncube.x.\n"); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->SetPerspective(builder, TRUE))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &obj))) - goto generic_error; - RELEASE(builder); - if (FAILED(lpD3DRM->lpVtbl->CreateTexture(lpD3DRM, &checkImage, &tex))) - goto generic_error; - if (FAILED(obj->lpVtbl->SetGroupTexture(obj, D3DRMGROUP_ALLGROUPS, tex))) - goto generic_error; - if (FAILED(obj->lpVtbl->SetGroupMapping(obj, D3DRMGROUP_ALLGROUPS, D3DRMMAP_PERSPCORRECT))) - goto generic_error; - if (FAILED(box1->lpVtbl->AddVisual(box1, (LPDIRECT3DRMVISUAL) obj))) - goto generic_error; - if (FAILED(box1->lpVtbl->AddMoveCallback(box1, mutateTexture, tex))) - goto generic_error; - RELEASE(obj); - RELEASE(tex); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &box2))) - goto generic_error; - if (FAILED(box2->lpVtbl->SetRotation(box2, scene, D3DVAL(0.1), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.1)))) - goto generic_error; - if (FAILED(box2->lpVtbl->SetPosition(box2, box1, D3DVAL(-4.0), D3DVAL(0.0), D3DVAL(0.0)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "ncube.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load ncube.x.\n"); - goto ret_with_error; - } - //builder->lpVtbl->Scale(builder, D3DVAL(2.0), D3DVAL(2.0), D3DVAL(2.0)); - if (FAILED(builder->lpVtbl->SetPerspective(builder, TRUE))) - goto generic_error; - if (FAILED(builder->lpVtbl->CreateMesh(builder, &obj))) - goto generic_error; - RELEASE(builder); - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "checker.ppm", &tex); - if (rval != D3DRM_OK) { - Msg("Failed to load checker.ppm.\n"); - goto ret_with_error; - } - if (FAILED(tex->lpVtbl->SetDecalTransparency(tex, TRUE))) - goto generic_error; - - if (FAILED(obj->lpVtbl->SetGroupTexture(obj, D3DRMGROUP_ALLGROUPS, tex))) - goto generic_error; - if (FAILED(obj->lpVtbl->SetGroupMapping(obj, D3DRMGROUP_ALLGROUPS, D3DRMMAP_PERSPCORRECT))) - goto generic_error; - if (FAILED(box2->lpVtbl->AddVisual(box2, (LPDIRECT3DRMVISUAL) obj))) - goto generic_error; - RELEASE(obj); - RELEASE(tex); - RELEASE(box2); - - if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder))) - goto generic_error; - rval = builder->lpVtbl->Load(builder, "sphere3.x", NULL, - D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere3.x.\n"); - goto ret_with_error; - } - if (FAILED(builder->lpVtbl->CreateMesh(builder, &obj))) - goto generic_error; - RELEASE(builder); - if (FAILED(obj->lpVtbl->GetBox(obj, &box))) - goto generic_error; - maxy = box.max.y; - miny = box.min.y; - height = maxy - miny; - - if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_CYLINDER, NULL, - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), - D3DVAL(0.0), D3DDivide(miny, height), - D3DVAL(1.0), D3DDivide(D3DVAL(-1.0),height), - &wrap))) - goto generic_error; - if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT) obj))) - goto generic_error; - RELEASE(wrap); - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex3.ppm", &sphereTex); - if (rval != D3DRM_OK) { - Msg("Failed to load tex3.ppm.\n"); - goto ret_with_error; - } - if (FAILED(sphereTex->lpVtbl->SetColors(sphereTex, 16))) - goto generic_error; - if (FAILED(obj->lpVtbl->SetGroupTexture(obj, D3DRMGROUP_ALLGROUPS, sphereTex))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateMaterial(lpD3DRM, D3DVAL(16.0), &mat))) - goto generic_error; - if (FAILED(obj->lpVtbl->SetGroupMaterial(obj, D3DRMGROUP_ALLGROUPS, mat))) - goto generic_error; - RELEASE(sphereTex); - RELEASE(mat); - - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &sphere))) - goto generic_error; - if (FAILED(sphere->lpVtbl->AddVisual(sphere, (LPDIRECT3DRMVISUAL) obj))) - goto generic_error; - RELEASE(obj); - if (FAILED(sphere->lpVtbl->SetPosition(sphere, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(8.0)))) - goto generic_error; - if (FAILED(sphere->lpVtbl->SetRotation(sphere, scene, D3DVAL(-0.1), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.02)))) - goto generic_error; - if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, sphere, &decal))) - goto generic_error; - - rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "checker.ppm", &decalTex); - if (rval != D3DRM_OK) { - Msg("Failed to load checker.ppm.\n"); - goto ret_with_error; - } - if (FAILED(decalTex->lpVtbl->SetDecalScale(decalTex, TRUE))) - goto generic_error; - if (FAILED(decalTex->lpVtbl->SetDecalSize(decalTex, D3DVAL(2.0), D3DVAL(2.0)))) - goto generic_error; - if (FAILED(decalTex->lpVtbl->SetDecalOrigin(decalTex, 4, 4))) - goto generic_error; - if (FAILED(decalTex->lpVtbl->SetDecalTransparency(decalTex, TRUE))) - goto generic_error; - if (FAILED(decal->lpVtbl->SetPosition(decal, sphere, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(2.0)))) - goto generic_error; - if (FAILED(decal->lpVtbl->AddVisual(decal, (LPDIRECT3DRMVISUAL) decalTex))) - goto generic_error; - RELEASE(decalTex); - - RELEASE(box1); - RELEASE(decal); - RELEASE(sphere); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); -ret_with_error: - RELEASE(box1); - RELEASE(box2); - RELEASE(sphere); - RELEASE(decal); - RELEASE(light); - RELEASE(obj); - RELEASE(dlight); - RELEASE(alight); - RELEASE(tex); - RELEASE(builder); - RELEASE(wrap); - RELEASE(sphereTex); - RELEASE(decalTex); - RELEASE(mat); - return FALSE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->bConstRenderQuality = TRUE; - lstrcpy(defaults->Name, "Transparency Direct3DRM Example"); -} diff --git a/sdk/samples/trans/trans.def b/sdk/samples/trans/trans.def deleted file mode 100644 index d40c6d6..0000000 --- a/sdk/samples/trans/trans.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME trans.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/triangle/makefile b/sdk/samples/triangle/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/triangle/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/triangle/msvc.mk b/sdk/samples/triangle/msvc.mk deleted file mode 100644 index ef79e50..0000000 --- a/sdk/samples/triangle/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = triangle -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = triangle.obj d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj d3dmain.obj stats.obj lclib.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT =-DD3DEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/triangle/readme.txt b/sdk/samples/triangle/readme.txt deleted file mode 100644 index bc45222..0000000 --- a/sdk/samples/triangle/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ -Triangle -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -One triangle on a textured background. The triangle is created by -specifying the screen coordinates for the vertices using TLVERTEXs. - -The top left vertex, the first vertex in the triangle data, has a -diffuse color of blue. Switching between flat and gouraud shading -changes the effect this vertex has on the lighting across the -triangle. When flat shading, the first vertex specifies the lighting -for the entire triangle. When gouraud shading, the lighting is -interpolated across the triangle. Lighting is different in the two -software renderers. The RAMP driver does not modulate the texture's -color with the material color. - -The rhw value of the top right vertex is larger than the other -two; it is closer to the eye. Turning perspective correction on and -off changes the interpolation of the texture across the triangle. diff --git a/sdk/samples/triangle/triangle.c b/sdk/samples/triangle/triangle.c deleted file mode 100644 index 566fc26..0000000 --- a/sdk/samples/triangle/triangle.c +++ /dev/null @@ -1,222 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: triangle.c - * - ***************************************************************************/ - -#include -#include -#include "d3ddemo.h" - -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -LPDIRECT3DMATERIAL lpBmat, lpMat1; -#define NUM_VERTICES 3 -#define NUM_TRIANGLES 1 - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Triangle D3D Example"); - defaults->rs.bPerspCorrect = FALSE; - defaults->bResizingDisabled = TRUE; -} - -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - /* - * Execute the instruction buffer - */ - if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, - lpView, D3DEXECUTE_UNCLIPPED) != D3D_OK) - return FALSE; - if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData) != D3D_OK) - return FALSE; - *lpExtent = d3dExData.dsStatus.drExtent; - return TRUE; -} - -void -ReleaseScene(void) -{ - return; -} - -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - lpView; - RELEASE(lpD3DExBuf); - RELEASE(lpMat1); - RELEASE(lpBmat); -} - -BOOL -InitScene(void) -{ - return TRUE; -} - -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - LPVOID lpBufStart, lpInsStart, lpPointer; - D3DEXECUTEBUFFERDESC debDesc; - size_t size; - D3DTLVERTEX src_v[NUM_VERTICES]; - int t[8][3] = { - 0, 1, 2, - }; - D3DMATERIAL bmat, mat; - D3DMATERIALHANDLE hBmat, hMat1; - - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpBmat, NULL) != D3D_OK) { - return FALSE; - } - memset(&bmat, 0, sizeof(D3DMATERIAL)); - bmat.dwSize = sizeof(D3DMATERIAL); - bmat.diffuse.r = (D3DVALUE)1.0; - bmat.diffuse.g = (D3DVALUE)1.0; - bmat.diffuse.b = (D3DVALUE)1.0; - bmat.ambient.r = (D3DVALUE)1.0; - bmat.ambient.g = (D3DVALUE)1.0; - bmat.ambient.b = (D3DVALUE)1.0; - bmat.hTexture = TextureHandle[0]; - bmat.dwRampSize = 1; - lpBmat->lpVtbl->SetMaterial(lpBmat, &bmat); - lpBmat->lpVtbl->GetHandle(lpBmat, lpDev, &hBmat); - lpView->lpVtbl->SetBackground(lpView, hBmat); - - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpMat1, NULL) != D3D_OK) { - return FALSE; - } - memset(&mat, 0, sizeof(D3DMATERIAL)); - mat.dwSize = sizeof(D3DMATERIAL); - mat.diffuse.r = (D3DVALUE)1.0; - mat.diffuse.g = (D3DVALUE)1.0; - mat.diffuse.b = (D3DVALUE)1.0; - mat.ambient.r = (D3DVALUE)1.0; - mat.ambient.g = (D3DVALUE)1.0; - mat.ambient.b = (D3DVALUE)1.0; -#define SPECULAR -#ifdef SPECULAR - mat.specular.r = (D3DVALUE)1.0; - mat.specular.g = (D3DVALUE)1.0; - mat.specular.b = (D3DVALUE)1.0; - mat.power = (float)40.0; -#else - mat.specular.r = (D3DVALUE)0.0; - mat.specular.g = (D3DVALUE)0.0; - mat.specular.b = (D3DVALUE)0.0; - mat.power = (float)0.0; -#endif - mat.hTexture = TextureHandle[1]; - mat.dwRampSize = 16; - lpMat1->lpVtbl->SetMaterial(lpMat1, &mat); - lpMat1->lpVtbl->GetHandle(lpMat1, lpDev, &hMat1); - /* - * Setup vertices - */ - memset(&src_v[0], 0, sizeof(D3DVERTEX) * NUM_VERTICES); - /* V 0 */ - src_v[0].sx = D3DVAL(10.0); - src_v[0].sy = D3DVAL(10.0); - src_v[0].sz = D3DVAL(0.1); - src_v[0].rhw = D3DVAL(1.0); - src_v[0].color = RGBA_MAKE(255, 0, 255, 255); - src_v[0].specular = RGB_MAKE(0, 0, 255); - src_v[0].tu = D3DVAL(0.0); - src_v[0].tv = D3DVAL(0.0); - /* V 1 */ - src_v[1].sx = D3DVAL(300.0); - src_v[1].sy = D3DVAL(50.0); - src_v[1].sz = D3DVAL(0.9); - src_v[1].rhw = D3DVAL(2.0); - src_v[1].color = RGBA_MAKE(255, 255, 255, 255); - src_v[1].specular = RGB_MAKE(0, 0, 0); - src_v[1].tu = D3DVAL(1.0); - src_v[1].tv = D3DVAL(1.0); - /* V 2 */ - src_v[2].sx = D3DVAL(150.0); - src_v[2].sy = D3DVAL(180.0); - src_v[2].sz = D3DVAL(0.6); - src_v[2].rhw = D3DVAL(1.0); - src_v[2].color = RGBA_MAKE(255, 255, 0, 255); - src_v[2].specular = RGB_MAKE(0, 0, 0); - src_v[2].tu = D3DVAL(0.0); - src_v[2].tv = D3DVAL(1.0); - /* - * Create an execute buffer - */ - size = sizeof(D3DVERTEX) * NUM_VERTICES; - size += sizeof(D3DINSTRUCTION) * 6; - size += sizeof(D3DSTATE) * 2; - size += sizeof(D3DPROCESSVERTICES); - size += sizeof(D3DTRIANGLE) * 1; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, - NULL) != D3D_OK) { - return FALSE; - } - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) { - return FALSE; - } - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - /* - * Copy vertices to execute buffer - */ - VERTEX_DATA(&src_v[0], NUM_VERTICES, lpPointer); - /* - * Setup instructions in execute buffer - */ - lpInsStart = lpPointer; - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, hMat1, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_COPY | - D3DPROCESSVERTICES_UPDATEEXTENTS, 0, NUM_VERTICES, lpPointer); - OP_STATE_RENDER(1, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, TextureHandle[1], lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(1, lpPointer); - ((LPD3DTRIANGLE)lpPointer)->v1 = 0; - ((LPD3DTRIANGLE)lpPointer)->v2 = 1; - ((LPD3DTRIANGLE)lpPointer)->v3 = 2; - ((LPD3DTRIANGLE)lpPointer)->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - lpPointer = ((char*)lpPointer) + sizeof(D3DTRIANGLE); - OP_EXIT(lpPointer); - /* - * Setup the execute data - */ - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = NUM_VERTICES; - d3dExData.dwInstructionOffset = (ULONG) ((char *)lpInsStart - (char *)lpBufStart); - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char *)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - - return TRUE; -} - diff --git a/sdk/samples/triangle/triangle.def b/sdk/samples/triangle/triangle.def deleted file mode 100644 index c1f314f..0000000 --- a/sdk/samples/triangle/triangle.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME triangle.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/tunnel/makefile b/sdk/samples/tunnel/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/tunnel/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/tunnel/msvc.mk b/sdk/samples/tunnel/msvc.mk deleted file mode 100644 index 42c2091..0000000 --- a/sdk/samples/tunnel/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = tunnel -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj lclib.obj d3dmain.obj stats.obj tunnel.obj d3dmath.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT =-DD3DDEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/tunnel/readme.txt b/sdk/samples/tunnel/readme.txt deleted file mode 100644 index ab0f4c5..0000000 --- a/sdk/samples/tunnel/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -Tunnel -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Camera moves through a tunnel generated around a spline. Only a small -section of the tunnel is placed in the execute buffer at a time. -After each frame, the buffer is locked and the tunnel vertices updated -to include the next section. - -Triflags are set so the segments of the tunnel are drawn as quads -rather than triangles when rendered in wireframe. diff --git a/sdk/samples/tunnel/tunnel.c b/sdk/samples/tunnel/tunnel.c deleted file mode 100644 index 7dcd8d1..0000000 --- a/sdk/samples/tunnel/tunnel.c +++ /dev/null @@ -1,717 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: tunnel.c - * - ***************************************************************************/ - -#include -#include -#include -#include "d3ddemo.h" - -/* - * External funtions which perform much of the math. - */ -extern LPD3DVECTOR D3DVECTORNormalise(LPD3DVECTOR v); -extern LPD3DVECTOR D3DVECTORCrossProduct(LPD3DVECTOR lpd, LPD3DVECTOR lpa, - LPD3DVECTOR lpb); -extern LPD3DMATRIX D3DMATRIXInvert(LPD3DMATRIX d, LPD3DMATRIX a); -extern LPD3DMATRIX D3DMATRIXSetRotation(LPD3DMATRIX lpM, LPD3DVECTOR lpD, - LPD3DVECTOR lpU); -extern void spline(LPD3DVECTOR p, float t, LPD3DVECTOR p1, LPD3DVECTOR p2, - LPD3DVECTOR p3, LPD3DVECTOR p4); - -/* - * Globals to keep track of execute buffer - */ -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -static D3DEXECUTEBUFFERDESC debDesc; - -/* - * More globals - */ -LPDIRECT3DMATERIAL lpbmat; -LPDIRECT3DMATERIAL lpmat; /* Material object */ - -/* - * Global projection, view, world and identity matricies - */ -D3DMATRIXHANDLE hProj; -D3DMATRIX proj = { - D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0) -}; -D3DMATRIXHANDLE hView; -D3DMATRIX view = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0), D3DVAL(1.0) -}; -D3DMATRIXHANDLE hWorld; -D3DMATRIX world = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; -D3DMATRIX identity = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; - -#define PI 3.14159265359 - -/* - * These defines describe the section of the tube in the execute buffer at - * one time. (Note, tube and tunnel are used interchangeably). - */ -#define SEGMENTS 20 /* Number of segments in memory at one time. Each - * segment is made up oftriangles spanning between - * two rings. - */ -#define SIDES 8 /* Number of sides on each ring. */ -#define TEX_RINGS 5 /* Number of rings to stretch the texture over. */ -#define NUM_V (SIDES*(SEGMENTS+1)) // Number of vertices in memory at once -#define NUM_TRI (SIDES*SEGMENTS*2) // Number of triangles in memory -#define TUBE_R 1.0 /* Radius of the tube. */ -#define SPLINE_POINTS 50 /* Number of spline points to initially - * calculate. The section in memory represents - * only a fraction of this. - */ -/* - * Movement and track scalars given in terms of position along the spline - * curve. - */ -#define SEGMENT_LENGTH 0.05 /* Length of each segment along curve. */ -#define SPEED 0.02 /* Amount to increment camera position along - * curve for each frame. - */ -#define DEPTH 0.8 /* How close the camera can get to the end of - * track before new segments are added. - */ -#define PATH_LENGTH (SPLINE_POINTS - 1) /*Total length of the tunnel.*/ - -/* - * A global structure holding the tube data. - */ -static struct { - LPD3DVERTEX lpV; /* Points to the vertices. */ - LPD3DTRIANGLE lpTri; /* Points to the triangles which make up the - * segments. - */ - int TriOffset; /* Offset into the execute buffer were the - * triangle list is found. - */ - LPD3DVECTOR lpPoints; /* Points to the points defining the spline - * curve. - */ - D3DMATERIALHANDLE hMat; /* Handle for the material on the tube. */ - D3DTEXTUREHANDLE hTex; /* Handle for the texture on the material.*/ - D3DLIGHT light; /* Structure defining the light. */ - LPDIRECT3DLIGHT lpD3DLight; /* Object pointer for the light. */ - D3DVECTOR cameraP, cameraD, cameraN; /* Vectors defining the camera - * position, direction and up. - */ - float cameraPos; /* Camera position along the - * spline curve. - */ - D3DVECTOR endP, endD, endN; /* Vectors defining the position, - * direction and up at the foremost end of - * the section in memory. - */ - float endPos; /* Position along the spline curve of the end. */ - int currentRing, currentSegment; /* Numbers of the ring and tube at - * the back end of the section. - */ -} tube; - - -/* - * Creates a matrix which is equivalent to having the camera at a - * specified position. This matrix can be used to convert vertices to - * camera coordinates. lpP Position of the camera. lpD Direction of - * view. lpN Up vector. lpM Matrix to update. - */ -void -PositionCamera(LPD3DVECTOR lpP, LPD3DVECTOR lpD, LPD3DVECTOR lpN, - LPD3DMATRIX lpM) -{ - D3DMATRIX tmp; - - /* - * Set the rotation part of the matrix and invert it. Vertices must be - * inverse rotated to achieve the same result of a corresponding - * camera rotation. - */ - tmp._14 = tmp._24 = tmp._34 = tmp._41 = tmp._42 = tmp._43 = (float)0.0; - tmp._44 = (float)1.0; - D3DMATRIXSetRotation(&tmp, lpD, lpN); - D3DMATRIXInvert(lpM, &tmp); - /* - * Multiply the rotation matrix by a translation transform. The - * translation matrix must be applied first (left of rotation). - */ - lpM->_41=-(lpM->_11 * lpP->x + lpM->_21 * lpP->y + lpM->_31 * lpP->z); - lpM->_42=-(lpM->_12 * lpP->x + lpM->_22 * lpP->y + lpM->_32 * lpP->z); - lpM->_43=-(lpM->_13 * lpP->x + lpM->_23 * lpP->y + lpM->_33 * lpP->z); -} - -/* - * Updates the given position, direction and normal vectors to a given - * position on the spline curve. The given up vector is used to determine - * the new up vector. - */ -void -MoveToPosition(float position, LPD3DVECTOR lpP, LPD3DVECTOR lpD, - LPD3DVECTOR lpN) -{ - LPD3DVECTOR lpSplinePoint[4]; - D3DVECTOR pp, x; - int i, j; - float t; - - /* - * Find the four points along the curve which are around the position. - */ - i = 0; - t = position; - while (t > 1.0) { - i++; - if (i == SPLINE_POINTS) - i = 0; - t -= (float)1.0; - } - for (j = 0; j < 4; j++) { - lpSplinePoint[j] = &tube.lpPoints[i]; - i++; - if (i == SPLINE_POINTS) - i = 0; - } - /* - * Get the point at the given position and one just before it. - */ - spline(lpP, t, lpSplinePoint[0], lpSplinePoint[1], lpSplinePoint[2], - lpSplinePoint[3]); - spline(&pp, t - (float)0.01, lpSplinePoint[0], lpSplinePoint[1], - lpSplinePoint[2], lpSplinePoint[3]); - /* - * Calculate the direction. - */ - lpD->x = lpP->x - pp.x; - lpD->y = lpP->y - pp.y; - lpD->z = lpP->z - pp.z; - D3DVECTORNormalise(lpD); - /* - * Find the new normal. This method will work provided the change in - * the normal is not very large. - */ - D3DVECTORNormalise(lpN); - D3DVECTORCrossProduct(&x, lpN, lpD); - D3DVECTORCrossProduct(lpN, &x, lpD); - lpN->x = -lpN->x; - lpN->y = -lpN->y; - lpN->z = -lpN->z; - D3DVECTORNormalise(lpN); -} - - -/* - * Generates a ring of vertices in a plane defined by n and the cross - * product of n and p. On exit, joint contains the vertices. Join must - * be pre-allocated. Normals are generated pointing in. Texture - * coordinates are generated along tu axis and are given along tv. - */ -static void -MakeRing(LPD3DVECTOR p, LPD3DVECTOR d, LPD3DVECTOR n, float tv, - LPD3DVERTEX joint) -{ - int spoke; - float theta, u, v, x, y, z; - D3DVECTOR nxd; - - D3DVECTORCrossProduct(&nxd, n, d); - for (spoke = 0; spoke < SIDES; spoke++) { - theta = (float)(2.0 * PI) * spoke / SIDES; - /* - * v, u defines a unit vector in the plane define by vectors nxd - * and n. - */ - v = (float)sin(theta); - u = (float)cos(theta); - /* - * x, y, z define a unit vector in standard coordiante space - */ - x = u * nxd.x + v * n->x; - y = u * nxd.y + v * n->y; - z = u * nxd.z + v * n->z; - /* - * Position, normals and texture coordiantes. - */ - joint[spoke].x = (float)TUBE_R * x + p->x; - joint[spoke].y = (float)TUBE_R * y + p->y; - joint[spoke].z = (float)TUBE_R * z + p->z; - joint[spoke].nx = -x; - joint[spoke].ny = -y; - joint[spoke].nz = -z; - joint[spoke].tu = (float)1.0 - theta / (float)(2.0 * PI); - joint[spoke].tv = tv; - - } -} - - -/* - * Defines the triangles which form a segment between ring1 and ring2 and - * stores them at lpTri. lpTri must be pre-allocated. - */ -void -MakeSegment(int ring1, int ring2, LPD3DTRIANGLE lpTri) -{ - int side, triangle = 0; - - for (side = 0; side < SIDES; side++) { - /* - * Each side consists of two triangles. - */ - lpTri[triangle].v1 = ring1 * SIDES + side; - lpTri[triangle].v2 = ring2 * SIDES + side; - lpTri[triangle].v3 = ring2 * SIDES + ((side + 1) % SIDES); - - /* - * for wireframe only need first two edges. - * Start a two triangle flat fan for each tunnel face. - */ - - lpTri[triangle].wFlags = D3DTRIFLAG_STARTFLAT(1); - lpTri[triangle].wFlags |= D3DTRIFLAG_EDGEENABLE1 | - D3DTRIFLAG_EDGEENABLE2; - - triangle++; - lpTri[triangle].v2 = ring2 * SIDES + ((side + 1) % SIDES); - lpTri[triangle].v3 = ring1 * SIDES + ((side + 1) % SIDES); - lpTri[triangle].v1 = ring1 * SIDES + side; - - /* - * Dont need any edges for wireframe. - */ - lpTri[triangle].wFlags = D3DTRIFLAG_EVEN; - - triangle++; - } -} - - -/* - * Creates a new segment of the tunnel at the current end position. - * Creates a new ring and segment. - */ -void -UpdateTubeInMemory(void) -{ - static int texRing = 0; /* Static counter defining the position of - * this ring on the texture. - */ - int endRing; /* The ring at the end of the tube in memory. */ - int RingOffset, SegmentOffset; /* Offsets into the vertex and triangle - * lists for the new data. - */ - /* - * Replace the back ring with a new ring at the front of the tube - * in memory. - */ - memcpy(&tube.lpV[SIDES], &tube.lpV[0], sizeof(tube.lpV[0]) * (NUM_V - SIDES)); - MakeRing(&tube.endP, &tube.endD, &tube.endN, texRing/(float)TEX_RINGS, - &tube.lpV[0]); - /* - * Replace the back segment with a new segment at the front of the - * tube in memory. Update the current end position of the tube in - * memory. - */ - endRing = (tube.currentRing + SEGMENTS) % (SEGMENTS + 1); - MoveToPosition(tube.endPos, &tube.endP, &tube.endD, &tube.endN); - /* - * Update the execute buffer with the new vertices and triangles. - */ - RingOffset = sizeof(D3DVERTEX) * tube.currentRing * SIDES; - SegmentOffset = sizeof(D3DTRIANGLE) * tube.currentSegment * SIDES * 2; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) - return; - memcpy((char *) debDesc.lpData, - &tube.lpV[0], sizeof(D3DVERTEX) * NUM_V); - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - /* - * Update the position of the back of the tube in memory and texture - * counter. - */ - tube.currentRing = (tube.currentRing + 1) % (SEGMENTS + 1); - tube.currentSegment = (tube.currentSegment + 1) % SEGMENTS; - texRing = (texRing + 1) % TEX_RINGS; -} - - -/* - * Move the camera through the tunnel. Create new segments of the tunnel - * when the camera gets close to the end of the section in memory. - */ -void -MoveCamera(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView) -{ - /* - * Update the position on curve and camera vectors. - */ - tube.cameraPos += (float)SPEED; - if (tube.cameraPos > PATH_LENGTH) - tube.cameraPos -= PATH_LENGTH; - MoveToPosition(tube.cameraPos, &tube.cameraP, &tube.cameraD, - &tube.cameraN); - /* - * If the camera is close to the end, add a new segment. - */ - if (tube.endPos - tube.cameraPos < DEPTH) { - tube.endPos = tube.endPos + (float)SEGMENT_LENGTH; - if (tube.endPos > PATH_LENGTH) - tube.endPos -= PATH_LENGTH; - UpdateTubeInMemory(); - } -} - - -/* - * Modify the buffer between rendering frames - */ -static void -TickScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView) -{ - MoveCamera(lpDev, lpView); -} - - -/* - * Each frame, renders the scene and calls TickScene to modify the object - * for the next frame. - */ -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - HRESULT ddrval; - - /* - * Move the camera by updating the view matrix and move the light. - */ - PositionCamera(&tube.cameraP, &tube.cameraD, &tube.cameraN, &view); - ddrval = lpDev->lpVtbl->SetMatrix(lpDev, hView, &view); - if (ddrval != D3D_OK) - return FALSE; - - tube.light.dvPosition.x = tube.cameraP.x; - tube.light.dvPosition.y = tube.cameraP.y; - tube.light.dvPosition.z = tube.cameraP.z; - ddrval = tube.lpD3DLight->lpVtbl->SetLight(tube.lpD3DLight, &tube.light); - if (ddrval != D3D_OK) - return FALSE; - /* - * Execute the instruction buffer and update the view - */ - ddrval = lpDev->lpVtbl->BeginScene(lpDev); - if (ddrval != D3D_OK) - return FALSE; - ddrval = lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, lpView, D3DEXECUTE_CLIPPED); - if (ddrval != D3D_OK) - return FALSE; - ddrval = lpDev->lpVtbl->EndScene(lpDev); - if (ddrval != D3D_OK) - return FALSE; - ddrval = lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData); - if (ddrval != D3D_OK) - return FALSE; - *lpExtent = d3dExData.dsStatus.drExtent; - /* - * Modify for the next time around - */ - TickScene(lpDev, lpView); - return TRUE; -} - -void -OverrideDefaults(Defaults* defaults) -{ - defaults->rs.bZBufferOn = FALSE; - defaults->rs.bPerspCorrect = TRUE; - defaults->bClearsOn = FALSE; - lstrcpy(defaults->Name, "Tunnel D3D Example"); -} - -BOOL -InitScene(void) -{ - float position; /* Curve position counter. */ - int i; /* counter */ - - /* - * Reserved memory for vertices, triangles and spline points. - */ - tube.lpV = (LPD3DVERTEX) malloc(sizeof(D3DVERTEX) * NUM_V); - tube.lpTri = (LPD3DTRIANGLE) malloc(sizeof(D3DTRIANGLE) * NUM_TRI); - tube.lpPoints = (LPD3DVECTOR) malloc(sizeof(D3DVECTOR)*SPLINE_POINTS); - /* - * Generate spline points - */ - for (i = 0; i < SPLINE_POINTS; i++) { -#if 1 - tube.lpPoints[i].x = (float)(cos(i * 4.0) * 20.0); - tube.lpPoints[i].y = (float)(sin(i * 4.0) * 20.0); - tube.lpPoints[i].z = i * (float)20.0; -#else - tube.lpPoints[i].x = (float)0.0; - tube.lpPoints[i].y = (float)0.0; - tube.lpPoints[i].z = i * (float)20.0; -#endif - } - /* - * Create the initial tube section in memory. - */ - tube.endN.x = (float)0.0; - tube.endN.y = (float)1.0; - tube.endN.z = (float)0.0; - position = (float)0.0; - for (i = 0; i < SEGMENTS + 1; i++) { - MoveToPosition(position, &tube.endP, &tube.endD, &tube.endN); - position += (float)SEGMENT_LENGTH; - MakeRing(&tube.endP, &tube.endD, &tube.endN, - (float)(i % TEX_RINGS) / TEX_RINGS, - &tube.lpV[(SEGMENTS - i) * SIDES]); - } - for (i = 0; i < SEGMENTS; i++) - MakeSegment(i + 1, i, &tube.lpTri[i * SIDES * 2]); - /* - * Move the camera to the begining and set some globals - */ - tube.cameraN.x = (float)0.0; - tube.cameraN.y = (float)1.0; - tube.cameraN.z = (float)0.0; - MoveToPosition((float)0.0, &tube.cameraP, &tube.cameraD, &tube.cameraN); - tube.currentRing = 0; - tube.currentSegment = 0; - tube.cameraPos = (float)0.0; - tube.endPos = position; - return TRUE; -} - -void -ReleaseScene(void) -{ - if (tube.lpPoints) - free(tube.lpPoints); - if (tube.lpTri) - free(tube.lpTri); - if (tube.lpV) - free(tube.lpV); -} - -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - if (lpView) - lpView->lpVtbl->DeleteLight(lpView, tube.lpD3DLight); - RELEASE(lpD3DExBuf); - RELEASE(tube.lpD3DLight); - RELEASE(lpmat); - RELEASE(lpbmat); -} - - -/* - * Builds the scene and initializes the execute buffer for rendering. - * Returns 0 on failure. - */ -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - /* Variables for exectue buffer generation */ - LPVOID lpBufStart, lpInsStart, lpPointer; - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf; - DWORD size; - - /* Background material variables */ - D3DMATERIAL bmat; - D3DMATERIALHANDLE hbmat; - D3DMATERIAL mat; - - /* - * Set background to black material - */ - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpbmat, NULL) != D3D_OK) - return FALSE; - memset(&bmat, 0, sizeof(D3DMATERIAL)); - bmat.dwSize = sizeof(D3DMATERIAL); - bmat.dwRampSize = 1; - lpbmat->lpVtbl->SetMaterial(lpbmat, &bmat); - lpbmat->lpVtbl->GetHandle(lpbmat, lpDev, &hbmat); - lpView->lpVtbl->SetBackground(lpView, hbmat); - /* - * Set the view, projection and world matricies in an execute buffer - */ - MAKE_MATRIX(lpDev, hView, view); - MAKE_MATRIX(lpDev, hProj, proj); - MAKE_MATRIX(lpDev, hWorld, world); - /* - * Create an execute buffer - */ - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 4; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExCmdBuf, - NULL) != D3D_OK) - return FALSE; - if (lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - /* - * Fill the execute buffer with instructions - */ - lpInsStart = lpPointer; - OP_STATE_TRANSFORM(3, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_VIEW, hView, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_PROJECTION, hProj, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_AMBIENT, RGBA_MAKE(40, 40, 40, 40), lpPointer); - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char*)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - lpDev->lpVtbl->BeginScene(lpDev); - lpDev->lpVtbl->Execute(lpDev, lpD3DExCmdBuf, lpView, D3DEXECUTE_UNCLIPPED); - lpDev->lpVtbl->EndScene(lpDev); - /* - * We are done with the command buffer. - */ - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - /* - * Setup materials and lights - */ - tube.hTex = TextureHandle[1]; - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpmat, NULL) != D3D_OK) - return FALSE; - memset(&mat, 0, sizeof(D3DMATERIAL)); - mat.dwSize = sizeof(D3DMATERIAL); - mat.diffuse.r = (D3DVALUE)1.0; - mat.diffuse.g = (D3DVALUE)1.0; - mat.diffuse.b = (D3DVALUE)1.0; - mat.diffuse.a = (D3DVALUE)1.0; - mat.ambient.r = (D3DVALUE)1.0; - mat.ambient.g = (D3DVALUE)1.0; - mat.ambient.b = (D3DVALUE)1.0; - mat.specular.r = (D3DVALUE)1.0; - mat.specular.g = (D3DVALUE)1.0; - mat.specular.b = (D3DVALUE)1.0; - mat.power = (float)20.0; - mat.dwRampSize = 16; - mat.hTexture = tube.hTex; - lpmat->lpVtbl->SetMaterial(lpmat, &mat); - lpmat->lpVtbl->GetHandle(lpmat, lpDev, &tube.hMat); - memset(&tube.light, 0, sizeof(D3DLIGHT)); - tube.light.dwSize = sizeof(D3DLIGHT); - tube.light.dltType = D3DLIGHT_POINT; - tube.light.dvPosition.x = tube.cameraP.x; - tube.light.dvPosition.y = tube.cameraP.y; - tube.light.dvPosition.z = tube.cameraP.z; - tube.light.dcvColor.r = D3DVAL(0.9); - tube.light.dcvColor.g = D3DVAL(0.9); - tube.light.dcvColor.b = D3DVAL(0.9); - tube.light.dvAttenuation0 = (float)0.0; - tube.light.dvAttenuation1 = (float)0.0; - tube.light.dvAttenuation2 = (float)0.05; - if (lpD3D->lpVtbl->CreateLight(lpD3D, &tube.lpD3DLight, NULL)!=D3D_OK) - return FALSE; - if (tube.lpD3DLight->lpVtbl->SetLight(tube.lpD3DLight, &tube.light) - !=D3D_OK) - return FALSE; - if (lpView->lpVtbl->AddLight(lpView, tube.lpD3DLight) != D3D_OK) - return FALSE; - - /* - * Create an execute buffer - */ - size = sizeof(D3DVERTEX) * NUM_V; - size += sizeof(D3DPROCESSVERTICES); - size += sizeof(D3DINSTRUCTION) * 6; - size += sizeof(D3DSTATE) * 4; - size += sizeof(D3DTRIANGLE) * NUM_TRI; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, - NULL) != D3D_OK) - return FALSE; - /* - * lock it so it can be filled - */ - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - VERTEX_DATA(tube.lpV, NUM_V, lpPointer); - /* - * Save the location of the first instruction and add instructions to - * execute buffer. - */ - lpInsStart = lpPointer; - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, tube.hMat, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 0, NUM_V, lpPointer); - OP_STATE_RENDER(3, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, tube.hTex, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPU, TRUE, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPV, TRUE, lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(NUM_TRI, lpPointer); - tube.TriOffset = (char *)lpPointer - (char *)lpBufStart; - TRIANGLE_LIST_DATA(tube.lpTri, NUM_TRI, lpPointer); - OP_EXIT(lpPointer); - /* - * Setup the execute data describing the buffer - */ - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = NUM_V; - d3dExData.dwInstructionOffset = (ULONG) ((char *)lpInsStart - (char *)lpBufStart); - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char *)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - - return TRUE; -} diff --git a/sdk/samples/tunnel/tunnel.def b/sdk/samples/tunnel/tunnel.def deleted file mode 100644 index f5b1670..0000000 --- a/sdk/samples/tunnel/tunnel.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME tunnel.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/twist/makefile b/sdk/samples/twist/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/twist/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/twist/msvc.mk b/sdk/samples/twist/msvc.mk deleted file mode 100644 index 9a285ef..0000000 --- a/sdk/samples/twist/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = twist -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = twist.obj d3dapp.obj ddcalls.obj d3dcalls.obj texture.obj misc.obj d3dmain.obj stats.obj d3dmath.obj d3dsphr.obj lclib.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -DD3DDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DDEMO -!else -COPT =-Otyb1 -DD3DDEMO -LOPT =-debug:none -ROPT =-DD3DDEMO -!endif -DEF = $(NAME).def -RES = d3dmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/twist/readme.txt b/sdk/samples/twist/readme.txt deleted file mode 100644 index 4323ea5..0000000 --- a/sdk/samples/twist/readme.txt +++ /dev/null @@ -1,7 +0,0 @@ -Twist -Direct3D Immediate Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -Two ends of a flattened sphere are twisted in opposite directions. -All motion and twisting in done in the execute buffer by a series of -matrix multiplies. diff --git a/sdk/samples/twist/twist.c b/sdk/samples/twist/twist.c deleted file mode 100644 index df66d6c..0000000 --- a/sdk/samples/twist/twist.c +++ /dev/null @@ -1,477 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: twist.c - * - ***************************************************************************/ - -#include -#include -#include -#include "d3dmacs.h" -#include "d3ddemo.h" - -/* - * Globals to keep track of execute buffer - */ -static D3DEXECUTEDATA d3dExData; -static LPDIRECT3DEXECUTEBUFFER lpD3DExBuf; -static D3DEXECUTEBUFFERDESC debDesc; -LPDIRECT3DMATERIAL lpbmat; /* Object for background material */ -LPDIRECT3DLIGHT lpD3DLight; /* object for light */ -LPDIRECT3DMATERIAL lpred_mat, lpblue_mat; /* Objects for materials */ - -/* - * Global projection, view, world and identity matricies - */ -D3DMATRIXHANDLE hProj; -D3DMATRIXHANDLE hView; -D3DMATRIXHANDLE hSpin; -D3DMATRIXHANDLE hDSpin; -D3DMATRIXHANDLE hWorld; -D3DMATRIXHANDLE hWorld1; -D3DMATRIXHANDLE hWorld2; -D3DMATRIXHANDLE hDWorld1; -D3DMATRIXHANDLE hDWorld2; - -D3DMATRIX proj = { - D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(2.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(1.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0) -}; -D3DMATRIX view = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0), D3DVAL(1.0) -}; -D3DMATRIX spin; -D3DMATRIX dspin; -D3DMATRIX world; -D3DMATRIX world1; -D3DMATRIX dworld1; -D3DMATRIX world2; -D3DMATRIX dworld2; -D3DMATRIX identity = { - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), - D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0) -}; - -/* - * A structure which holds the object's data - */ -struct { - D3DMATERIALHANDLE hred_mat, hblue_mat; /* two material handles */ - D3DTEXTUREHANDLE hTex; /* texture map handles */ - LPD3DVERTEX lpV; /* object's vertices */ - LPD3DTRIANGLE lpTri; /* object's triangles */ - int num_vertices, num_faces; -} objData; - -#define PI 3.14159265359 - -void -OverrideDefaults(Defaults* defaults) -{ - lstrcpy(defaults->Name, "Twist D3D Example"); -} - -/* - * A function to rotate a number of D3DVERTEX points around the X axis. - */ -void -XRotateD3DVERTEX(float theta, int count, LPD3DVERTEX lpV) -{ - float st, ct; - int i; - - st = (float)sin(theta); ct = (float)cos(theta); - for (i = 0; i < count; i++) { - float y, z; - y = lpV[i].y; z = lpV[i].z; - lpV[i].y = ct * y + st * z; - lpV[i].z = -st * y + ct * z; - y = lpV[i].ny; z = lpV[i].nz; - lpV[i].ny = ct * y + st * z; - lpV[i].nz = -st * y + ct * z; - } -} - - -/* - * Renders the scene - */ -BOOL -RenderScene(LPDIRECT3DDEVICE lpDev, LPDIRECT3DVIEWPORT lpView, - LPD3DRECT lpExtent) -{ - HRESULT ddrval; - - /* - * Execute the instruction buffer and blt - */ - ddrval = lpDev->lpVtbl->BeginScene(lpDev); - if (ddrval != D3D_OK) - return FALSE; - ddrval = lpDev->lpVtbl->Execute(lpDev, lpD3DExBuf, lpView, D3DEXECUTE_CLIPPED); - if (ddrval != D3D_OK) - return FALSE; - ddrval = lpDev->lpVtbl->EndScene(lpDev); - if (ddrval != D3D_OK) - return FALSE; - ddrval = lpD3DExBuf->lpVtbl->GetExecuteData(lpD3DExBuf, &d3dExData); - if (ddrval != D3D_OK) - return FALSE; - /* - * Return the extent - */ - *lpExtent = d3dExData.dsStatus.drExtent; - return TRUE; -} - - -void -ReleaseScene(void) -{ - if (objData.lpTri) - free(objData.lpTri); - if (objData.lpV) - free(objData.lpV); -} - -void -ReleaseView(LPDIRECT3DVIEWPORT lpView) -{ - if (lpView) - lpView->lpVtbl->DeleteLight(lpView, lpD3DLight); - RELEASE(lpbmat); - RELEASE(lpred_mat); - RELEASE(lpblue_mat); - RELEASE(lpD3DExBuf); - RELEASE(lpD3DLight); -} - -/* - * Builds the scene - */ -BOOL -InitScene(void) -{ - int i; - /* - * Generate the sphere which will be used as the twisted object. Scale - * one axis long. Rotate the sphere around the x axis so the end caps - * are around the z axis (for effect). Stretch one end of the sphere - * out to allow an easier view of the twisting. - */ - if (!(GenerateSphere((float)1.7, 9, 15, (float)1.0, (float)2.0, - (float)1.0, &objData.lpV, &objData.lpTri, - &objData.num_vertices, &objData.num_faces))) - return FALSE; - - /* - * As we are going to twist the sphere the quads in the sphere will - * no longer stay flat. We need to change all start flat setting to just - * start. - */ - for (i = 0; i < objData.num_faces; i++) { - if (((objData.lpTri[i].wFlags & 0x1f) < 30) && - ((objData.lpTri[i].wFlags & 0x1f) > 0)) { - objData.lpTri[i].wFlags &= ~0x1f; - } - } - - XRotateD3DVERTEX((float)(PI / 2.0), objData.num_vertices, objData.lpV); - for (i = 0; i < objData.num_vertices; i++) - if (objData.lpV[i].z > 0) objData.lpV[i].z += (float)2.0; - return TRUE; -} - -/* - * Initializes the execute buffer for rendering. - */ -#define DT 0.05 /* amount to twist, different from spin for effect */ -#define DS 0.08 /* amount to spin world each time */ -BOOL -InitView(LPDIRECTDRAW lpDD, LPDIRECT3D lpD3D, LPDIRECT3DDEVICE lpDev, - LPDIRECT3DVIEWPORT lpView, int NumTextures, - LPD3DTEXTUREHANDLE TextureHandle) -{ - /* Variables for execute buffer generation */ - LPDIRECT3DEXECUTEBUFFER lpD3DExCmdBuf; - LPD3DTRIANGLE lpTri; - LPVOID lpBufStart, lpInsStart, lpPointer; - size_t size; - - /* Materials and lights */ - D3DLIGHT light; - D3DMATERIAL bmat; - D3DMATERIALHANDLE hbmat; - D3DMATERIAL red_mat, blue_mat; - - int i; - float ct, st; - - HRESULT ddrval; - - /* - * Set background to black material - */ - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpbmat, NULL) != D3D_OK) - return FALSE; - memset(&bmat, 0, sizeof(D3DMATERIAL)); - bmat.dwSize = sizeof(D3DMATERIAL); - bmat.dwRampSize = 1; - ddrval = lpbmat->lpVtbl->SetMaterial(lpbmat, &bmat); - ddrval = lpbmat->lpVtbl->GetHandle(lpbmat, lpDev, &hbmat); - ddrval = lpView->lpVtbl->SetBackground(lpView, hbmat); - - /* - * Set the view, world and projection matrices - */ - MAKE_MATRIX(lpDev, hView, view); - MAKE_MATRIX(lpDev, hProj, proj); - MAKE_MATRIX(lpDev, hWorld, identity); - MAKE_MATRIX(lpDev, hSpin, identity); - MAKE_MATRIX(lpDev, hWorld1, identity); - MAKE_MATRIX(lpDev, hWorld2, identity); - - /* - * Setup the matrices which spin the buffer - */ - ct = D3DVAL(cos(DS)); - st = D3DVAL(sin(DS)); - dspin = identity; - dspin._11 = ct; - dspin._13 = -st; - dspin._31 = st; - dspin._33 = ct; - MAKE_MATRIX(lpDev, hDSpin, dspin); - - ct = D3DVAL(cos(DT)); - st = D3DVAL(sin(DT)); - dworld1 = identity; - dworld1._11 = ct; - dworld1._21 = -st; - dworld1._12 = st; - dworld1._22 = ct; - MAKE_MATRIX(lpDev, hDWorld1, dworld1); - - ct = D3DVAL(cos(-DT)); - st = D3DVAL(sin(-DT)); - dworld2 = identity; - dworld2._11 = ct; - dworld2._21 = -st; - dworld2._12 = st; - dworld2._22 = ct; - MAKE_MATRIX(lpDev, hDWorld2, dworld2); - - /* - * Use an execute buffer to set some transform state - */ - size = 0; - size += sizeof(D3DINSTRUCTION) * 3; - size += sizeof(D3DSTATE) * 3; - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExCmdBuf, - NULL) != D3D_OK) - return FALSE; - if (lpD3DExCmdBuf->lpVtbl->Lock(lpD3DExCmdBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - - lpInsStart = lpPointer; - OP_STATE_TRANSFORM(2, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_PROJECTION, hProj, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_VIEW, hView, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_AMBIENT, RGBA_MAKE(20, 20, 20, 20), lpPointer); - OP_EXIT(lpPointer); - - lpD3DExCmdBuf->lpVtbl->Unlock(lpD3DExCmdBuf); - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwInstructionOffset = (ULONG) 0; - d3dExData.dwInstructionLength = (ULONG) ((char *)lpPointer - (char *)lpInsStart); - lpD3DExCmdBuf->lpVtbl->SetExecuteData(lpD3DExCmdBuf, &d3dExData); - ddrval = lpDev->lpVtbl->BeginScene(lpDev); - if (ddrval != D3D_OK) - return FALSE; - lpDev->lpVtbl->Execute(lpDev, lpD3DExCmdBuf, lpView, D3DEXECUTE_UNCLIPPED); - ddrval = lpDev->lpVtbl->EndScene(lpDev); - if (ddrval != D3D_OK) - return FALSE; - lpD3DExCmdBuf->lpVtbl->Release(lpD3DExCmdBuf); - - /* - * Create each material, set its description and obtain a handle to it. - */ - objData.hTex = TextureHandle[1]; - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpred_mat, NULL) != D3D_OK) - return FALSE; - memset(&red_mat, 0, sizeof(D3DMATERIAL)); - red_mat.dwSize = sizeof(D3DMATERIAL); - red_mat.diffuse.r = (D3DVALUE)1.0; - red_mat.diffuse.g = (D3DVALUE)0.8; - red_mat.diffuse.b = (D3DVALUE)0.8; - red_mat.diffuse.a = (D3DVALUE)1.0; - red_mat.ambient.r = (D3DVALUE)1.0; - red_mat.ambient.g = (D3DVALUE)0.0; - red_mat.ambient.b = (D3DVALUE)0.0; - red_mat.specular.r = (D3DVALUE)1.0; - red_mat.specular.g = (D3DVALUE)1.0; - red_mat.specular.b = (D3DVALUE)1.0; - red_mat.power = (float)20.0; - red_mat.dwRampSize = 16; - red_mat.hTexture = objData.hTex; - lpred_mat->lpVtbl->SetMaterial(lpred_mat, &red_mat); - lpred_mat->lpVtbl->GetHandle(lpred_mat, lpDev, &objData.hred_mat); - if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpblue_mat, NULL) != D3D_OK) - return FALSE; - memset(&blue_mat, 0, sizeof(D3DMATERIAL)); - blue_mat.dwSize = sizeof(D3DMATERIAL); - blue_mat.diffuse.r = (D3DVALUE)0.5; - blue_mat.diffuse.g = (D3DVALUE)0.5; - blue_mat.diffuse.b = (D3DVALUE)1.0; - blue_mat.diffuse.a = (D3DVALUE)1.0; - blue_mat.ambient.r = (D3DVALUE)0.0; - blue_mat.ambient.g = (D3DVALUE)0.0; - blue_mat.ambient.b = (D3DVALUE)1.0; - blue_mat.specular.r = (D3DVALUE)1.0; - blue_mat.specular.g = (D3DVALUE)1.0; - blue_mat.specular.b = (D3DVALUE)1.0; - blue_mat.power = (float)20.0; - blue_mat.dwRampSize = 16; - blue_mat.hTexture = objData.hTex; - lpblue_mat->lpVtbl->SetMaterial(lpblue_mat, &blue_mat); - lpblue_mat->lpVtbl->GetHandle(lpblue_mat, lpDev, &objData.hblue_mat); - - /* - * Create the main execute buffer - */ - size = sizeof(D3DVERTEX) * objData.num_vertices * 2; /* two copies */ - size += sizeof(D3DPROCESSVERTICES) * 2; - size += sizeof(D3DSTATUS) * 1; - size += sizeof(D3DINSTRUCTION) * 16; - size += sizeof(D3DSTATE) * 6; - size += sizeof(D3DMATRIXMULTIPLY) * 5; - size += sizeof(D3DTRIANGLE) * objData.num_faces; - - memset(&debDesc, 0, sizeof(D3DEXECUTEBUFFERDESC)); - debDesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC); - debDesc.dwFlags = D3DDEB_BUFSIZE; - debDesc.dwBufferSize = size; - if (lpDev->lpVtbl->CreateExecuteBuffer(lpDev, &debDesc, &lpD3DExBuf, - NULL) != D3D_OK) - return FALSE; - if (lpD3DExBuf->lpVtbl->Lock(lpD3DExBuf, &debDesc) != D3D_OK) - return FALSE; - lpBufStart = debDesc.lpData; - memset(lpBufStart, 0, size); - lpPointer = lpBufStart; - /* - * Copy two sets of the vertices into the buffer for the first render. - */ - VERTEX_DATA(objData.lpV, objData.num_vertices, lpPointer); - VERTEX_DATA(objData.lpV, objData.num_vertices, lpPointer); - - lpInsStart = lpPointer; - OP_SET_STATUS(D3DSETSTATUS_ALL, D3DSTATUS_DEFAULT, 2048, 2048, 0, 0, lpPointer); - OP_MATRIX_MULTIPLY(1, lpPointer); - MATRIX_MULTIPLY_DATA(hDSpin, hSpin, hSpin, lpPointer); - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, objData.hblue_mat, lpPointer); - OP_MATRIX_MULTIPLY(1, lpPointer); - MATRIX_MULTIPLY_DATA(hWorld1, hDWorld1, hWorld1, lpPointer); - OP_MATRIX_MULTIPLY(1, lpPointer); - MATRIX_MULTIPLY_DATA(hWorld1, hSpin, hWorld, lpPointer); - OP_STATE_TRANSFORM(1, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, 0, objData.num_vertices, lpPointer); - - OP_STATE_LIGHT(1, lpPointer); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, objData.hred_mat, lpPointer); - OP_MATRIX_MULTIPLY(1, lpPointer); - MATRIX_MULTIPLY_DATA(hWorld2, hDWorld2, hWorld2, lpPointer); - OP_MATRIX_MULTIPLY(1, lpPointer); - MATRIX_MULTIPLY_DATA(hWorld2, hSpin, hWorld, lpPointer); - OP_STATE_TRANSFORM(1, lpPointer); - STATE_DATA(D3DTRANSFORMSTATE_WORLD, hWorld, lpPointer); - OP_PROCESS_VERTICES(1, lpPointer); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, objData.num_vertices, objData.num_vertices, lpPointer); - OP_STATE_RENDER(2, lpPointer); - STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE, objData.hTex, lpPointer); - STATE_DATA(D3DRENDERSTATE_WRAPU, TRUE, lpPointer); - /* - * Make sure that the triangle data (not OP) will be QWORD aligned - */ - if (QWORD_ALIGNED(lpPointer)) { - OP_NOP(lpPointer); - } - OP_TRIANGLE_LIST(objData.num_faces, lpPointer); - lpTri = lpPointer; - TRIANGLE_LIST_DATA(objData.lpTri, objData.num_faces, lpPointer); - /* - * If the z coordinate of a vertex referenced by a triangle is > 0, - * make the triangle reference the same vertex in the second copy of - * the vetices. - */ - for (i = 0; i < objData.num_faces; i++) { - if (objData.lpV[lpTri->v1].z > 0) - lpTri->v1 += objData.num_vertices; - if (objData.lpV[lpTri->v2].z > 0) - lpTri->v2 += objData.num_vertices; - if (objData.lpV[lpTri->v3].z > 0) - lpTri->v3 += objData.num_vertices; - lpTri++; - } - OP_EXIT(lpPointer); - - lpD3DExBuf->lpVtbl->Unlock(lpD3DExBuf); - /* - * Setup the execute data describing the buffer - */ - memset(&d3dExData, 0, sizeof(D3DEXECUTEDATA)); - d3dExData.dwSize = sizeof(D3DEXECUTEDATA); - d3dExData.dwVertexCount = objData.num_vertices * 2; - d3dExData.dwInstructionOffset = (ULONG)((char *)lpInsStart - (char *)lpBufStart); - d3dExData.dwInstructionLength = (ULONG)((char*)lpPointer - (char *)lpInsStart); - lpD3DExBuf->lpVtbl->SetExecuteData(lpD3DExBuf, &d3dExData); - - /* - * Add one light. - */ - memset(&light, 0, sizeof(D3DLIGHT)); - light.dwSize = sizeof(D3DLIGHT); - light.dltType = D3DLIGHT_DIRECTIONAL; - light.dcvColor.r = D3DVAL(0.9); - light.dcvColor.g = D3DVAL(0.9); - light.dcvColor.b = D3DVAL(0.9); - light.dcvColor.a = D3DVAL(1.0); - light.dvDirection.x = D3DVALP(0.0, 12); - light.dvDirection.y = D3DVALP(0.0, 12); - light.dvDirection.z = D3DVALP(1.0, 12); - light.dvAttenuation0 = (float)1.0; - light.dvAttenuation1 = (float)0.0; - light.dvAttenuation2 = (float)0.0; - if (lpD3D->lpVtbl->CreateLight(lpD3D, &lpD3DLight, NULL) != D3D_OK) - return FALSE; - if (lpD3DLight->lpVtbl->SetLight(lpD3DLight, &light) != D3D_OK) - return FALSE; - if (lpView->lpVtbl->AddLight(lpView, lpD3DLight) != D3D_OK) - return FALSE; - - return TRUE; -} - - diff --git a/sdk/samples/twist/twist.def b/sdk/samples/twist/twist.def deleted file mode 100644 index 4016568..0000000 --- a/sdk/samples/twist/twist.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME twist.exe - -DESCRIPTION 'Direct3D Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/uvis/makefile b/sdk/samples/uvis/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/uvis/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/uvis/msvc.mk b/sdk/samples/uvis/msvc.mk deleted file mode 100644 index 179ee54..0000000 --- a/sdk/samples/uvis/msvc.mk +++ /dev/null @@ -1,42 +0,0 @@ -NAME = uvis -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = uvis.obj rmmain.obj rmerror.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -DD3DRMDEMO -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -DD3DRMDEMO -!else -COPT =-YX -Otyb1 -DD3DRMDEMO -LOPT =-debug:none -ROPT =-DD3DRMDEMO -!endif -DEF = $(NAME).def -RES = rmmain.res - -CFLAGS =$(COPT) -D_X86_ $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/uvis/readme.txt b/sdk/samples/uvis/readme.txt deleted file mode 100644 index f10b5ed..0000000 --- a/sdk/samples/uvis/readme.txt +++ /dev/null @@ -1,7 +0,0 @@ -Uvis -Direct3D Retained Mode Sample -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -This is an important example demonstrating how D3D can be used with -D3DRM. It demonstrates how a D3D immediate mode execute buffer can be -used as a visual in a D3D retained mode scene. diff --git a/sdk/samples/uvis/uvis.cpp b/sdk/samples/uvis/uvis.cpp deleted file mode 100644 index 95ab752..0000000 --- a/sdk/samples/uvis/uvis.cpp +++ /dev/null @@ -1,533 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: uvis.cpp - * - ***************************************************************************/ - -#include -#include -#include -#include "d3dmacs.h" -#include "rmdemo.h" - -typedef struct _Flame { - int valid; - D3DVECTOR velocity; /* direction the flame is going */ - D3DVECTOR orientation; /* random vector normal to velocity */ - D3DVECTOR position; /* current position */ - int time; /* current time */ - int lifetime; /* time to die */ -} Flame; - -/* - * A flame is a diamond shape oriented along its direction vector. - * This updates the four vertices of the flame, given its current time. - */ -void UpdateFlame(Flame* flame, D3DVERTEX v[]) -{ - D3DVECTOR dir = flame->velocity; - D3DVECTOR off = flame->orientation; - D3DVECTOR norm; - D3DVECTOR start, end, left, right; - double size; - int i; - - D3DRMVectorNormalise(&dir); - - /* - * Calculate a normal vector to the flame - */ - D3DRMVectorCrossProduct(&norm, &dir, &off); - D3DRMVectorNormalise(&norm); - - /* - * The size starts off small, gets bigger towards the middle - * and smaller towards the end. - */ - if (flame->time < flame->lifetime / 2) - size = (double) flame->time / (double)(flame->lifetime / 2); - else - size = ((double) (flame->lifetime - flame->time) - / (double)(flame->lifetime / 2)); - - /* - * Calculate the four corners of the diamond. - */ - D3DRMVectorScale(&dir, &dir, D3DVAL(size)); - D3DRMVectorScale(&off, &off, D3DVAL(size / 4)); - start = flame->position; - D3DRMVectorAdd(&end, &start, &dir); - D3DRMVectorScale(&dir, &dir, D3DVAL(0.5)); - D3DRMVectorAdd(&left, &start, &dir); - right = left; - D3DRMVectorAdd(&left, &left, &off); - D3DRMVectorSubtract(&right, &right, &off); - - - /* - * Update the flame's position. - */ - D3DRMVectorAdd(&flame->position, &flame->position, &flame->velocity); - flame->time++; - if (flame->time == flame->lifetime) - flame->valid = 0; - - /* - * And fill in the vertices. There are eight, four for each side of - * the flame. - */ - i = 0; - v[i].x = start.x; v[i].y = start.y; v[i].z = start.z; - v[i].nx = -norm.x; v[i].ny = -norm.y; v[i].nz = -norm.z; - v[i].tu = D3DVAL(0); v[i].tv = D3DVAL(0); - i++; - - v[i].x = left.x; v[i].y = left.y; v[i].z = left.z; - v[i].nx = -norm.x; v[i].ny = -norm.y; v[i].nz = -norm.z; - v[i].tu = D3DVAL(1); v[i].tv = D3DVAL(0); - i++; - - v[i].x = end.x; v[i].y = end.y; v[i].z = end.z; - v[i].nx = -norm.x; v[i].ny = -norm.y; v[i].nz = -norm.z; - v[i].tu = D3DVAL(1); v[i].tv = D3DVAL(1); - i++; - - v[i].x = right.x; v[i].y = right.y; v[i].z = right.z; - v[i].nx = -norm.x; v[i].ny = -norm.y; v[i].nz = -norm.z; - v[i].tu = D3DVAL(0); v[i].tv = D3DVAL(1); - i++; - - v[i].x = start.x; v[i].y = start.y; v[i].z = start.z; - v[i].nx = norm.x; v[i].ny = norm.y; v[i].nz = norm.z; - v[i].tu = D3DVAL(0); v[i].tv = D3DVAL(0); - i++; - - v[i].x = right.x; v[i].y = right.y; v[i].z = right.z; - v[i].nx = norm.x; v[i].ny = norm.y; v[i].nz = norm.z; - v[i].tu = D3DVAL(0); v[i].tv = D3DVAL(1); - i++; - - v[i].x = end.x; v[i].y = end.y; v[i].z = end.z; - v[i].nx = norm.x; v[i].ny = norm.y; v[i].nz = norm.z; - v[i].tu = D3DVAL(1); v[i].tv = D3DVAL(1); - i++; - - v[i].x = left.x; v[i].y = left.y; v[i].z = left.z; - v[i].nx = norm.x; v[i].ny = norm.y; v[i].nz = norm.z; - v[i].tu = D3DVAL(1); v[i].tv = D3DVAL(0); - i++; - -} - -void InitFlame(Flame* flame) -{ - D3DVECTOR d, u; - - flame->valid = TRUE; - - do { - D3DRMVectorRandom(&d); - d.y = d.y * d.y; - d.y = d.y * d.y; - } while (d.y < D3DVAL(0.3)); - - /* - * Pick a vector normal to d - */ - if (d.y != D3DVAL(0.0) || d.z != D3DVAL(0.0)) - { - u.x = D3DVAL(0.0); - if (d.y == D3DVAL(0.0)) - { - u.y = D3DVAL(1.0); - u.z = D3DVAL(0.0); - } else { - D3DVALUE n_fix = - D3DVAL(1.0) - + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y)); - u.z = D3DVAL(sqrt(D3DDivide(D3DVAL(1.0), D3DVAL(n_fix)))); - u.y = -D3DMultiply(u.z, D3DDivide(d.z, d.y)); - } - } else { - u.x = D3DVAL(0.0); - u.y = D3DVAL(0.0); - u.z = D3DVAL(1.0); - } - - /* - * Randomize it. - */ - D3DRMVectorRotate(&u, &u, &d, D3DDivide(D3DVAL(6.28 * (rand() % 100)), - D3DVAL(100.0))); - - D3DRMVectorScale(&d, &d, D3DVAL(0.1)); - flame->velocity = d; - flame->orientation = u; - flame->position.x = D3DVAL(0); - flame->position.y = D3DVAL(0); - flame->position.z = D3DVAL(0); - flame->time = 0; - do { - flame->lifetime = rand() % 30; - } while (flame->lifetime < 5); -} - -#define MAX_FLAMES 100 - -typedef struct _Fire { - Flame flames[MAX_FLAMES]; - LPDIRECT3DRMDEVICE dev; - LPDIRECT3DEXECUTEBUFFER eb; - LPDIRECT3DMATERIAL mat; -} Fire; - -void CDECL CleanupFireObjects(LPDIRECT3DRMOBJECT dev, void* arg) -{ - Fire* fire = (Fire*) arg; - - if (fire->eb) { - fire->eb->Release(); - fire->mat->Release(); - fire->eb = NULL; - fire->dev = NULL; - } -} - -typedef struct _FireExecuteBuffer { - D3DVERTEX v[8 * MAX_FLAMES]; - D3DINSTRUCTION op_state_light1; - D3DSTATE state1; - D3DINSTRUCTION op_set_status; - D3DSTATUS setstatus1; - D3DINSTRUCTION op_process_vertices1; - D3DPROCESSVERTICES processvertices1; - D3DINSTRUCTION op_state_render; - D3DSTATE state2; - D3DINSTRUCTION op_triangle_list; - D3DTRIANGLE tri[4 * MAX_FLAMES]; - D3DINSTRUCTION exit1; -} FireExecuteBuffer; - -BOOL CreateFireObjects(Fire* fire, LPDIRECT3DRMDEVICE dev) -{ - D3DEXECUTEBUFFERDESC desc; - D3DEXECUTEDATA data; - LPDIRECT3D lpD3D = NULL; - LPDIRECT3DDEVICE lpD3DDev = NULL; - LPDIRECT3DMATERIAL mat = NULL; - LPDIRECT3DEXECUTEBUFFER eb = NULL; - D3DMATERIALHANDLE hMat; - D3DMATERIAL orange; - void* p; - int i; - - RELEASE(fire->eb); - - dev->GetDirect3DDevice(&lpD3DDev); - if (!lpD3DDev) - goto generic_error; - if (FAILED(lpD3DDev->GetDirect3D(&lpD3D))) - goto generic_error; - - desc.dwSize = sizeof(desc); - desc.dwFlags = D3DDEB_BUFSIZE; - desc.dwBufferSize = sizeof(FireExecuteBuffer); - - if (FAILED(lpD3DDev->CreateExecuteBuffer(&desc, &eb, NULL))) - goto generic_error; - - if (FAILED(lpD3D->CreateMaterial(&mat, NULL))) - goto generic_error; - if (FAILED(mat->GetHandle(lpD3DDev, &hMat))) - goto generic_error; - - memset(&orange, 0, sizeof(orange)); - orange.dwSize = sizeof(orange); - orange.diffuse.r = D3DVAL(1.0); - orange.diffuse.g = D3DVAL(0.5); - orange.diffuse.b = D3DVAL(0.0); - orange.ambient.r = D3DVAL(1.0); - orange.ambient.g = D3DVAL(0.5); - orange.ambient.b = D3DVAL(0.0); - orange.dwRampSize = 32; - if (FAILED(mat->SetMaterial(&orange))) - goto generic_error; - - if (FAILED(eb->Lock(&desc))) - goto generic_error; - p = (void*) ((char*) desc.lpData + 8 * MAX_FLAMES * sizeof(D3DVERTEX)); - - OP_STATE_LIGHT(1, p); - STATE_DATA(D3DLIGHTSTATE_MATERIAL, hMat, p); - - OP_SET_STATUS(D3DSETSTATUS_ALL, D3DSTATUS_DEFAULT, 2048, 2048, 0, 0, p); - - OP_PROCESS_VERTICES(1, p); - PROCESSVERTICES_DATA(D3DPROCESSVERTICES_TRANSFORMLIGHT, - 0, 8 * MAX_FLAMES, p); - OP_STATE_RENDER(1, p); - STATE_DATA(D3DRENDERSTATE_SHADEMODE, D3DSHADE_FLAT, p); - OP_TRIANGLE_LIST(4 * MAX_FLAMES, p); - for (i = 0; i < MAX_FLAMES; i++) { - D3DTRIANGLE* t; - int base; - - t = (D3DTRIANGLE*) p; - base = 4 * i; - - t->v1 = base + 0; - t->v2 = base + 1; - t->v3 = base + 3; - t->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - t++; - - t->v1 = base + 1; - t->v2 = base + 2; - t->v3 = base + 3; - t->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - t++; - - t->v1 = base + 0; - t->v2 = base + 1; - t->v3 = base + 3; - t->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - t++; - - t->v1 = base + 1; - t->v2 = base + 2; - t->v3 = base + 3; - t->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE; - t++; - - p = (char*) t; - } - OP_EXIT(p); - - if (FAILED(eb->Unlock())) - goto generic_error; - - data.dwSize = sizeof(data); - data.dwVertexOffset = 0; - data.dwVertexCount = 8 * MAX_FLAMES; - data.dwInstructionOffset = 8 * MAX_FLAMES * sizeof(D3DVERTEX); - data.dwInstructionLength = sizeof(FireExecuteBuffer) - data.dwInstructionOffset; - data.dwHVertexOffset = 0; - if (FAILED(eb->SetExecuteData(&data))) - goto generic_error; - - fire->eb = eb; - fire->mat = mat; - fire->dev = dev; - if (FAILED(dev->AddDestroyCallback(CleanupFireObjects, fire))) - goto generic_error; - - RELEASE(lpD3DDev); - RELEASE(lpD3D); - return TRUE; -generic_error: - RELEASE(lpD3D); - RELEASE(lpD3DDev); - RELEASE(mat); - RELEASE(eb); - return FALSE; -} - -BOOL RenderFire(Fire* fire, LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view) -{ - D3DVERTEX* v; - D3DEXECUTEBUFFERDESC desc; - D3DEXECUTEDATA data; - LPDIRECT3DDEVICE lpD3DDev = NULL; - LPDIRECT3DVIEWPORT lpD3DView = NULL; - int i; - - if (fire->dev != dev) { - if (!CreateFireObjects(fire, dev)) - return FALSE; - } - - dev->GetDirect3DDevice(&lpD3DDev); - view->GetDirect3DViewport(&lpD3DView); - if (!lpD3DDev || !lpD3DView) - goto ret_with_error; - - for (i = 0; i < MAX_FLAMES; i++) - if (!fire->flames[i].valid) - InitFlame(&fire->flames[i]); - - desc.dwSize = sizeof(desc); - desc.dwFlags = 0; - - if (FAILED(fire->eb->Lock(&desc))) - goto ret_with_error; - v = (D3DVERTEX*) desc.lpData; - - for (i = 0; i < MAX_FLAMES; i++) - UpdateFlame(&fire->flames[i], &v[8 * i]); - - if (FAILED(fire->eb->Unlock())) - goto ret_with_error; - - if (FAILED(lpD3DDev->Execute(fire->eb, lpD3DView, D3DEXECUTE_CLIPPED))) - goto ret_with_error; - - data.dwSize = sizeof data; - if (FAILED(fire->eb->GetExecuteData(&data))) - goto ret_with_error; - if (FAILED(view->ForceUpdate(data.dsStatus.drExtent.x1, - data.dsStatus.drExtent.y1, - data.dsStatus.drExtent.x2, - data.dsStatus.drExtent.y2))) - goto ret_with_error; - - RELEASE(lpD3DDev); - RELEASE(lpD3DView); - return TRUE; -ret_with_error: - RELEASE(lpD3DDev); - RELEASE(lpD3DView); - return FALSE; -} - -int CDECL FireCallback(LPDIRECT3DRMUSERVISUAL uvis, - void* arg, - D3DRMUSERVISUALREASON reason, - LPDIRECT3DRMDEVICE dev, - LPDIRECT3DRMVIEWPORT view) -{ - Fire* fire = (Fire*) arg; - - if (reason == D3DRMUSERVISUAL_CANSEE) - return TRUE; - - if (reason == D3DRMUSERVISUAL_RENDER) { - if (!RenderFire(fire, dev, view)) - return DDERR_GENERIC; - else - return D3D_OK; - } - - return 0; -} - -void CDECL DestroyFire(LPDIRECT3DRMOBJECT obj, void* arg) -{ - Fire* fire = (Fire*) arg; - - if (fire->dev) - fire->dev->DeleteDestroyCallback(CleanupFireObjects, arg); - CleanupFireObjects((LPDIRECT3DRMOBJECT)fire->dev, (void*) fire); - free(fire); -} - -LPDIRECT3DRMUSERVISUAL CreateFire() -{ - Fire* fire; - LPDIRECT3DRMUSERVISUAL uvis = NULL; - - fire = (Fire*)malloc(sizeof(Fire)); - if (!fire) - goto ret_with_error; - memset(fire, 0, sizeof(Fire)); - - if (FAILED(lpD3DRM->CreateUserVisual(FireCallback, (void*) fire, &uvis))) - goto ret_with_error; - if (FAILED(uvis->AddDestroyCallback(DestroyFire, (void*) fire))) - goto ret_with_error; - return uvis; -ret_with_error: - if (fire) - free(fire); - RELEASE(uvis); - return NULL; -} - -BOOL -BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view, - LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera) -{ - D3DRMRENDERQUALITY quality = D3DRMRENDER_GOURAUD; - LPDIRECT3DRMFRAME lights = NULL; - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMLIGHT light1 = NULL; - LPDIRECT3DRMLIGHT light2 = NULL; - LPDIRECT3DRMUSERVISUAL uvis = NULL; - - view = view; /* not used */ - - if (FAILED(dev->SetQuality(quality))) - goto generic_error; - - /* - * initialize the lights in the scene - */ - if (FAILED(lpD3DRM->CreateFrame(scene, &lights))) - goto generic_error; - if (FAILED(lights->SetPosition(scene, D3DVAL(5), D3DVAL(5), -D3DVAL(1)))) - goto generic_error; - if(FAILED(lights->SetOrientation(scene, D3DVAL(0), D3DVAL(0), D3DVAL(1), - D3DVAL(0), D3DVAL(1), D3DVAL(1)))) - goto generic_error; - if(FAILED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVAL(0.9), - D3DVAL(0.8), D3DVAL(0.7), &light1))) - goto generic_error; - if (FAILED(lights->AddLight(light1))) - goto generic_error; - if(FAILED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT, D3DVAL(0.1), - D3DVAL(0.1), D3DVAL(0.1), &light2))) - goto generic_error; - if (FAILED(scene->AddLight(light2))) - goto generic_error; - - /* - * create a frame within the scene - */ - if (FAILED(lpD3DRM->CreateFrame(scene, &frame))) - goto generic_error; - - /* - * add the fire into the frame - */ - uvis = CreateFire(); - if (!uvis) - goto generic_error; - if (FAILED(frame->AddVisual(uvis))) - goto generic_error; - - /* - * set up the frames position, orientation and rotation - */ - if (FAILED(camera->SetPosition(scene, D3DVAL(0), D3DVAL(0.5), -D3DVAL(10)))) - goto generic_error; - if(FAILED(camera->SetOrientation(scene, D3DVAL(0), D3DVAL(0), D3DVAL(1), D3DVAL(0), - D3DVAL(1), D3DVAL(0)))) - goto generic_error; - if(FAILED(frame->SetRotation(scene, D3DVAL(0), D3DVAL(1), D3DVAL(0), - D3DVAL(0.02)))) - goto generic_error; - - RELEASE(uvis); - RELEASE(frame); - RELEASE(lights); - RELEASE(light1); - RELEASE(light2); - return TRUE; -generic_error: - Msg("A failure occurred while building the scene.\n"); - RELEASE(lights); - RELEASE(frame); - RELEASE(light1); - RELEASE(light2); - RELEASE(uvis); - return FALSE; -} - -void -OverrideDefaults(Defaults *defaults) -{ - defaults->bConstRenderQuality = TRUE; - defaults->bNoTextures = TRUE; - lstrcpy(defaults->Name, "User Visual Direct3DRM Example"); -} diff --git a/sdk/samples/uvis/uvis.def b/sdk/samples/uvis/uvis.def deleted file mode 100644 index a32736b..0000000 --- a/sdk/samples/uvis/uvis.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME uvis.exe - -DESCRIPTION 'Direct3DRM Example Program (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/viewer/color.cpp b/sdk/samples/viewer/color.cpp deleted file mode 100644 index 55b3ee3..0000000 --- a/sdk/samples/viewer/color.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: color.cpp - * - ***************************************************************************/ - -#include -#include "viewer.h" -#include -#include -#include - -int ChooseNewColor(HWND win, D3DCOLOR* current) -{ - CHOOSECOLOR cc; - COLORREF clr; - COLORREF aclrCust[16]; - int i; - - for (i = 0; i < 16; i++) - aclrCust[i] = RGB(255, 255, 255); - - clr = - RGB - ( (int) (255 * D3DRMColorGetRed(*current)), - (int) (255 * D3DRMColorGetGreen(*current)), - (int) (255 * D3DRMColorGetBlue(*current)) - ); - - memset(&cc, 0, sizeof(CHOOSECOLOR)); - cc.lStructSize = sizeof(CHOOSECOLOR); - cc.hwndOwner = win; - cc.rgbResult = clr; - cc.lpCustColors = aclrCust; - cc.Flags = CC_RGBINIT|CC_FULLOPEN; - - if (ChooseColor(&cc)) - { *current = - D3DRMCreateColorRGB - ( D3DVAL(GetRValue(cc.rgbResult) / D3DVAL(255.0)), - D3DVAL(GetGValue(cc.rgbResult) / D3DVAL(255.0)), - D3DVAL(GetBValue(cc.rgbResult) / D3DVAL(255.0)) - ); - return TRUE; - } - else return FALSE; -} diff --git a/sdk/samples/viewer/file.cpp b/sdk/samples/viewer/file.cpp deleted file mode 100644 index 3b9089d..0000000 --- a/sdk/samples/viewer/file.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: file.cpp - * - ***************************************************************************/ - -#include -#include "viewer.h" -#include -#include -#include - -char* OpenNewFile( HWND hwnd, const char *wndTitle ) -{ - static char file[256]; - static char fileTitle[256]; - static char filter[] = "X files (*.x)\0*.x\0" - "All Files (*.*)\0*.*\0"; - OPENFILENAME ofn; - - lstrcpy( file, ""); - lstrcpy( fileTitle, ""); - - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hwnd; -#ifdef WIN32 - ofn.hInstance = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE); -#else - ofn.hInstance = (HINSTANCE) GetWindowWord(hwnd, GWW_HINSTANCE); -#endif - ofn.lpstrFilter = filter; - ofn.lpstrCustomFilter = (LPSTR) NULL; - ofn.nMaxCustFilter = 0L; - ofn.nFilterIndex = 1L; - ofn.lpstrFile = file; - ofn.nMaxFile = sizeof(file); - ofn.lpstrFileTitle = fileTitle; - ofn.nMaxFileTitle = sizeof(fileTitle); - ofn.lpstrInitialDir = NULL; - ofn.lpstrTitle = wndTitle; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = "*.x"; - ofn.lCustData = 0; - - ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - - if (GetOpenFileName(&ofn)) - return (char*)ofn.lpstrFile; - else - return NULL; -} diff --git a/sdk/samples/viewer/makefile b/sdk/samples/viewer/makefile deleted file mode 100644 index 8d3d892..0000000 --- a/sdk/samples/viewer/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\d3dbld.mk diff --git a/sdk/samples/viewer/msvc.mk b/sdk/samples/viewer/msvc.mk deleted file mode 100644 index 190aa08..0000000 --- a/sdk/samples/viewer/msvc.mk +++ /dev/null @@ -1,48 +0,0 @@ -NAME = viewer -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib d3drm.lib ddraw.lib\ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = viewer.obj sel.obj file.obj color.obj rodcone.obj - -!if "$(DEBUG)" == "debug" -COPT =-DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-Otyb1 -LOPT =-debug:none -ROPT = -!endif -DEF = $(NAME).def -RES = viewer.res - -CFLAGS =$(COPT) -D_X86_ -DSTRICT $(CDEBUG) -DUSE_FLOAT -Fo$@ -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\d3dsdk.mk - -xaf.obj: ..\xaf.cpp - @$(CC) @<< -$(CFLAGS) -W1 -c -Foxaf.obj ..\xaf.cpp -<< - - -$(NAME).$(EXT): \ - $(OBJS) ..\$(NAME).def $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 --def:..\$(NAME).def -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/viewer/readme.txt b/sdk/samples/viewer/readme.txt deleted file mode 100644 index bbfa5b7..0000000 --- a/sdk/samples/viewer/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -Direct3DRM Object Viewer -Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - -This is a stand alone D3DRM app that allows you to load and view 3d -objects. - -The initial scene has a light source in the top right. To see this the -view can be moved backwards and forwards using the T and R -keys. Additional objects can be loaded from the file menu, and new -light sources can be added from the lights menu. Objects can be -rotated with the left mouse button and dragged with the right. - -The last object that was rotated or dragged remains the current -selection. - -The device quality can be altered using the Renderer menu. Using this -menu the type of device used can also be switched from ramp to -RGB. When using the RGB device the color of lights in the scene can be -changed in the same way as you change the color of objects. In 256 -color mode it is advisable to dither an RGB device for best results. - -Additional keyboard controls - -T Forwards -R Back -Z Move current selection forwards -X Move current selection back. -Ctrl+G Gouraud shade -Ctrl+F Flat Shade -Ctrl+D Dither toggle. -Arrow Keys Move left/right/up/down -Delete Delete the current selection. diff --git a/sdk/samples/viewer/rodcone.cpp b/sdk/samples/viewer/rodcone.cpp deleted file mode 100644 index 3332cac..0000000 --- a/sdk/samples/viewer/rodcone.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rodcone.cpp - * - ***************************************************************************/ - -/* - * Sample code for building objects out of rods and cones. - */ - -#include -#include "viewer.h" -#include "rodcone.h" -#include - -static unsigned long rod_faces[] = -{ 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, /* end 1 */ - 4, 0, 0, 1, 1, 9, 1, 8, 0, /* side 0 */ - 4, 1, 1, 2, 2, 10, 2, 9, 1, /* side 1 */ - 4, 2, 2, 3, 3, 11, 3, 10, 2, /* side 2 */ - 4, 3, 3, 4, 4, 12, 4, 11, 3, /* side 3 */ - 4, 4, 4, 5, 5, 13, 5, 12, 4, /* side 4 */ - 4, 5, 5, 6, 6, 14, 6, 13, 5, /* side 5 */ - 4, 6, 6, 7, 7, 15, 7, 14, 6, /* side 6 */ - 4, 7, 7, 0, 0, 8, 0, 15, 7, /* side 7 */ - 8, 8, 0, 9, 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, /* end 2 */ - 0, -}; - -void AddRod(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b) -{ - D3DVECTOR d, u, r; - D3DVECTOR v[16]; - D3DVECTOR n[8]; - D3DVALUE f; - int i; - - /* - * Find the unit vector along the rod. - */ - d.x = b.x - a.x; - d.y = b.y - a.y; - d.z = b.z - a.z; - D3DRMVectorNormalise(&d); - - /* - * Pick a vector normal to d - */ - if (d.y != D3DVAL(0.0) || d.z != D3DVAL(0.0)) - { u.x = D3DVAL(0.0); - if (d.y == D3DVAL(0.0)) - { u.y = D3DVAL(1.0); - u.z = D3DVAL(0.0); - } else - { D3DVALUE n_fix = - D3DVAL(1.0) - + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y)); -#ifdef FIXED_POINT_API - double un_val = (double)n_fix / (double)(1<<16); - u.z = D3DVAL(sqrt(1/un_val)); -#else - u.z = D3DVAL(sqrt(D3DDivide(D3DVAL(1.0), D3DVAL(n_fix)))); -#endif - u.y = -D3DMultiply(u.z, D3DDivide(d.z, d.y)); - } - } else - { u.x = D3DVAL(0.0); - u.y = D3DVAL(0.0); - u.z = D3DVAL(1.0); - } - - /* - * Now find a vector normal to them both, to give us a coordinate - * system in the plane normal to the rod. - */ - D3DRMVectorCrossProduct(&r, &d, &u); - - /* - * Scale down the coordinates to the radius of the rod. - */ - u.x = D3DMultiply(u.x, radius); - u.y = D3DMultiply(u.y, radius); - u.z = D3DMultiply(u.z, radius); - r.x = D3DMultiply(r.x, radius); - r.y = D3DMultiply(r.y, radius); - r.z = D3DMultiply(r.z, radius); - - /* - * Calculate the corners of an octagon. - */ - f = D3DVAL((float)sqrt(2.0) / (2 * (1 + (float)sqrt(2.0) / 2))); - v[0].x = u.x + D3DMultiply(r.x, f); - v[0].y = u.y + D3DMultiply(r.y, f); - v[0].z = u.z + D3DMultiply(r.z, f); - - v[1].x = D3DMultiply(u.x, f) + r.x; - v[1].y = D3DMultiply(u.y, f) + r.y; - v[1].z = D3DMultiply(u.z, f) + r.z; - - v[2].x = D3DMultiply(-u.x, f) + r.x; - v[2].y = D3DMultiply(-u.y, f) + r.y; - v[2].z = D3DMultiply(-u.z, f) + r.z; - - v[3].x = -u.x + D3DMultiply(r.x, f); - v[3].y = -u.y + D3DMultiply(r.y, f); - v[3].z = -u.z + D3DMultiply(r.z, f); - - v[4].x = -u.x - D3DMultiply(r.x, f); - v[4].y = -u.y - D3DMultiply(r.y, f); - v[4].z = -u.z - D3DMultiply(r.z, f); - - v[5].x = D3DMultiply(-u.x, f) - r.x; - v[5].y = D3DMultiply(-u.y, f) - r.y; - v[5].z = D3DMultiply(-u.z, f) - r.z; - - v[6].x = D3DMultiply(u.x, f) - r.x; - v[6].y = D3DMultiply(u.y, f) - r.y; - v[6].z = D3DMultiply(u.z, f) - r.z; - - v[7].x = u.x - D3DMultiply(r.x, f); - v[7].y = u.y - D3DMultiply(r.y, f); - v[7].z = u.z - D3DMultiply(r.z, f); - - /* - * Add the rod endpoints and calculate the vertex normals. - */ - for (i = 0; i < 8; i++) - { n[i] = v[i]; - D3DRMVectorNormalise(&n[i]); - v[i + 8].x = v[i].x + b.x; - v[i + 8].y = v[i].y + b.y; - v[i + 8].z = v[i].z + b.z; - v[i].x += a.x; - v[i].y += a.y; - v[i].z += a.z; - } - - /* - * Now add the faces. - */ - mesh->AddFaces(16, v, 8, n, rod_faces, NULL); -} - -static unsigned long cone_faces[] = -{ 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, /* end 1 */ - 3, 0, 0, 1, 1, 8, 1, /* side 0 */ - 3, 1, 1, 2, 2, 8, 1, /* side 1 */ - 3, 2, 2, 3, 3, 8, 1, /* side 2 */ - 3, 3, 3, 4, 4, 8, 1, /* side 3 */ - 3, 4, 4, 5, 5, 8, 1, /* side 4 */ - 3, 5, 5, 6, 6, 8, 1, /* side 5 */ - 3, 6, 6, 7, 7, 8, 1, /* side 6 */ - 3, 7, 7, 0, 0, 8, 1, /* side 7 */ - 0, -}; - -void AddCone(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b) -{ - D3DVECTOR d, u, r; - D3DVECTOR v[16]; - D3DVECTOR n[8]; - D3DVALUE f; - int i; - - /* - * Find the unit vector along the rod. - */ - d.x = b.x - a.x; - d.y = b.y - a.y; - d.z = b.z - a.z; - D3DRMVectorNormalise(&d); - - /* - * Pick a vector normal to d - */ - if (d.y != D3DVAL(0.0) || d.z != D3DVAL(0.0)) - { u.x = D3DVAL(0.0); - if (d.y == D3DVAL(0.0)) - { u.y = D3DVAL(1.0); - u.z = D3DVAL(0.0); - } else - { D3DVALUE n_fix = - D3DVAL(1.0) - + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y)); -#ifdef FIXED_POINT_API - double un_val = (double)n_fix / (double)(1<<16); - u.z = D3DVAL(sqrt(1 / un_val)); -#else - u.z = D3DVAL(sqrt(D3DVAL(1.0) / D3DVAL(n_fix))); -#endif - u.y = - D3DDivide(D3DMultiply(u.z, d.z), d.y); - } - } else - { u.x = D3DVAL(0.0); - u.y = D3DVAL(0.0); - u.z = D3DVAL(1.0); - } - - /* - * Now find a vector normal to them both, to give us a coordinate - * system in the plane normal to the rod. - */ - D3DRMVectorCrossProduct(&r, &d, &u); - - /* - * Scale down the coordinates to the radius of the rod. - */ - u.x = D3DMultiply(u.x, radius); - u.y = D3DMultiply(u.y, radius); - u.z = D3DMultiply(u.z, radius); - r.x = D3DMultiply(r.x, radius); - r.y = D3DMultiply(r.y, radius); - r.z = D3DMultiply(r.z, radius); - - /* - * Calculate the corners of an octagon. - */ - f = D3DVAL((float)sqrt(2.0) / (2 * (1 + (float)sqrt(2.0) / 2))); - v[0].x = u.x + D3DMultiply(r.x, f); - v[0].y = u.y + D3DMultiply(r.y, f); - v[0].z = u.z + D3DMultiply(r.z, f); - - v[1].x = D3DMultiply(u.x, f) + r.x; - v[1].y = D3DMultiply(u.y, f) + r.y; - v[1].z = D3DMultiply(u.z, f) + r.z; - - v[2].x = D3DMultiply(-u.x, f) + r.x; - v[2].y = D3DMultiply(-u.y, f) + r.y; - v[2].z = D3DMultiply(-u.z, f) + r.z; - - v[3].x = -u.x + D3DMultiply(r.x, f); - v[3].y = -u.y + D3DMultiply(r.y, f); - v[3].z = -u.z + D3DMultiply(r.z, f); - - v[4].x = -u.x - D3DMultiply(r.x, f); - v[4].y = -u.y - D3DMultiply(r.y, f); - v[4].z = -u.z - D3DMultiply(r.z, f); - - v[5].x = D3DMultiply(-u.x, f) - r.x; - v[5].y = D3DMultiply(-u.y, f) - r.y; - v[5].z = D3DMultiply(-u.z, f) - r.z; - - v[6].x = D3DMultiply(u.x, f) - r.x; - v[6].y = D3DMultiply(u.y, f) - r.y; - v[6].z = D3DMultiply(u.z, f) - r.z; - - v[7].x = u.x - D3DMultiply(r.x, f); - v[7].y = u.y - D3DMultiply(r.y, f); - v[7].z = u.z - D3DMultiply(r.z, f); - - v[8] = b; - - /* - * Calculate the vertex normals. - */ - for (i = 0; i < 8; i++) - { n[i] = v[i]; - D3DRMVectorNormalise(&n[0]); - v[i].x += a.x; - v[i].y += a.y; - v[i].z += a.z; - } - - /* - * Now add the faces. - */ - mesh->AddFaces(9, v, 8, n, cone_faces, NULL); -} diff --git a/sdk/samples/viewer/rodcone.h b/sdk/samples/viewer/rodcone.h deleted file mode 100644 index 528792a..0000000 --- a/sdk/samples/viewer/rodcone.h +++ /dev/null @@ -1,10 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: rodcone.h - * - ***************************************************************************/ - -void AddRod(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b); -void AddCone(LPDIRECT3DRMMESHBUILDER mesh, D3DVALUE radius, D3DVECTOR a, D3DVECTOR b); diff --git a/sdk/samples/viewer/sel.cpp b/sdk/samples/viewer/sel.cpp deleted file mode 100644 index af1da11..0000000 --- a/sdk/samples/viewer/sel.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: sel.cpp - * - ***************************************************************************/ - -#include -#include -#include "sel.h" -#include "rodcone.h" -#include "viewer.h" - -static int showBoxes = FALSE; -static LPDIRECT3DRMFRAME sFrame = NULL; -static LPDIRECT3DRMMESHBUILDER sVisual = NULL; -static LPDIRECT3DRMLIGHT sLight = NULL; -static LPDIRECT3DRMMESH selectionBox = NULL; -static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX*); - -LPDIRECT3DRMFRAME clipboardFrame = NULL; -LPDIRECT3DRMVISUAL clipboardVisual = NULL; - -void ShowBoxes(int show) -{ - showBoxes = show; - SelectVisual(sVisual, sFrame); -} - -int ToggleBoxes() -{ - ShowBoxes(!showBoxes); - return showBoxes; -} - -LPDIRECT3DRMFRAME SelectedFrame() -{ - return sFrame; -} - -LPDIRECT3DRMMESHBUILDER SelectedVisual() -{ - return sVisual; -} - -LPDIRECT3DRMLIGHT SelectedLight() -{ - return sLight; -} - -void DeselectVisual() -{ - if (sFrame && selectionBox) - sFrame->DeleteVisual(selectionBox); - sFrame = NULL; - sVisual = NULL; - selectionBox = NULL; -} - -void SelectVisual(LPDIRECT3DRMMESHBUILDER visual, LPDIRECT3DRMFRAME frame) -{ - DeselectVisual(); - sVisual = visual; - sFrame = frame; - - if (sVisual) - { LPDIRECT3DRMLIGHTARRAY lights; - - sLight = 0; - sFrame->GetLights(&lights); - if (lights) - { if (lights->GetSize()) - { lights->GetElement(0, &sLight); - sLight->Release(); /* reinstate reference count */ - } - lights->Release(); - } - - if (showBoxes && visual) - { D3DRMBOX box; - LPDIRECT3DRMMESHBUILDER builder; - - sVisual->GetBox(&box); - builder = makeBox(&box); - builder->CreateMesh(&selectionBox); - sFrame->AddVisual(selectionBox); - selectionBox->Release(); - } - } -} - -void FindAndSelectVisual(LPDIRECT3DRMVIEWPORT view, int x, int y) -{ - LPDIRECT3DRMVISUAL visual; - LPDIRECT3DRMFRAME frame; - LPDIRECT3DRMPICKEDARRAY picked; - LPDIRECT3DRMFRAMEARRAY frames; - LPDIRECT3DRMMESHBUILDER mesh; - - /* - * Make sure we don't try to select the selection box of the current - * selection. - */ - DeselectVisual(); - - view->Pick(x, y, &picked); - if (picked) - { if (picked->GetSize()) - { - picked->GetPick(0, &visual, &frames, 0); - frames->GetElement(frames->GetSize() - 1, &frame); - - if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMMeshBuilder, (void **) &mesh))) - { SelectVisual(mesh, frame); - mesh->Release(); - } - - frame->Release(); - frames->Release(); - visual->Release(); - } - picked->Release(); - } -} - -void CutVisual() -{ - LPDIRECT3DRMFRAME frame; - - if (clipboardFrame) - clipboardFrame->Release(); - - if (sFrame) { - clipboardFrame = sFrame; - clipboardVisual = sVisual; - - DeselectVisual(); - - clipboardFrame->AddRef(); - clipboardFrame->GetParent(&frame); - if (frame) { - frame->DeleteChild(clipboardFrame); - frame->Release(); - } - } -} - -void CopyVisual() -{ - LPDIRECT3DRMFRAME frame; - - if (clipboardFrame) - clipboardFrame->Release(); - - if (sFrame) { - sFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &clipboardFrame); - sVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &clipboardVisual); - - clipboardFrame->AddVisual(clipboardVisual); - clipboardVisual->Release(); - - clipboardFrame->GetParent(&frame); - if (frame) { - frame->DeleteChild(clipboardFrame); - frame->Release(); - } - } -} - -void PasteVisual(LPDIRECT3DRMFRAME scene) -{ - if (clipboardFrame) - { - LPDIRECT3DRMFRAME frame; - LPDIRECT3DRMVISUAL visual; - - clipboardFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &frame); - clipboardVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &visual); - - frame->AddVisual(visual); - scene->AddChild(frame); - visual->Release(); - frame->Release(); - } -} - -void DeleteVisual() -{ - if (sFrame) - { - LPDIRECT3DRMFRAME parent, frame = sFrame; - - DeselectVisual(); - frame->GetParent(&parent); - parent->DeleteChild(frame); - parent->Release(); - } -} - -void ClearClipboard() -{ - if (clipboardFrame) - clipboardFrame->Release(); -} - -static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX* box) -{ - LPDIRECT3DRMMESHBUILDER mesh; - static D3DVECTOR zero = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)}; - static D3DVECTOR dir = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)}; - D3DVECTOR a, b; - - lpD3DRM->CreateMeshBuilder(&mesh); - - dir.z = box->max.z + D3DVAL(1.0); - AddRod(mesh, D3DVAL(0.05), zero, dir); - a = dir; - a.z += D3DVAL(0.6); - AddCone(mesh, D3DVAL(0.2), dir, a); - a = box->min; - b = a; - b.y = box->max.y; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->max.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.y = box->min.y; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->min.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.z = box->max.z; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->max.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.y = box->max.y; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.x = box->min.x; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b; b.y = box->min.y; - AddRod(mesh, D3DVAL(0.05), a, b); - b.y = box->max.y; a = b; b.z = box->min.z; - AddRod(mesh, D3DVAL(0.05), a, b); - a = b = box->max; b.z = box->min.z; - AddRod(mesh, D3DVAL(0.05), a, b); - a.y = box->min.y; b = a; b.z = box->min.z; - AddRod(mesh, D3DVAL(0.05), a, b); - - mesh->SetColor(D3DRMCreateColorRGB(D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0))); - return mesh; -} diff --git a/sdk/samples/viewer/sel.h b/sdk/samples/viewer/sel.h deleted file mode 100644 index be90cd7..0000000 --- a/sdk/samples/viewer/sel.h +++ /dev/null @@ -1,21 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: sel.h - * - ***************************************************************************/ - -void ShowBoxes(int); -int ToggleBoxes(void); -LPDIRECT3DRMFRAME SelectedFrame(void); -LPDIRECT3DRMMESHBUILDER SelectedVisual(void); -LPDIRECT3DRMLIGHT SelectedLight(void); -void DeselectVisual(void); -void SelectVisual(LPDIRECT3DRMMESHBUILDER visual, LPDIRECT3DRMFRAME frame); -void FindAndSelectVisual(LPDIRECT3DRMVIEWPORT view, int x, int y); -void CutVisual(void); -void CopyVisual(void); -void PasteVisual(LPDIRECT3DRMFRAME scene); -void DeleteVisual(void); -void ClearClipboard(void); diff --git a/sdk/samples/viewer/viewer.cpp b/sdk/samples/viewer/viewer.cpp deleted file mode 100644 index 26a5228..0000000 --- a/sdk/samples/viewer/viewer.cpp +++ /dev/null @@ -1,1703 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: viewer.cpp - * - ***************************************************************************/ - -#define INITGUID -#include -#include "viewer.h" - -#include -#include -#include -#include -#include -#include -#include "sel.h" - -static char ViewerClass[32] = "ViewerClass"; -static BOOL Render(void); -HRESULT loadTextures(char *name, void *arg, LPDIRECT3DRMTEXTURE *tex); - -typedef struct _AppInfo -{ - LPDIRECT3DRMFRAME scene, camera; - LPDIRECT3DRMDEVICE dev; - LPDIRECT3DRMVIEWPORT view; - D3DRMCOLORMODEL model; - BOOL bMinimized; -} AppInfo; - -AppInfo *active_window = NULL; - -LPDIRECT3DRM lpD3DRM = 0; -LPDIRECTDRAWCLIPPER lpDDClipper = 0; -BOOL bQuit = FALSE; - -static BOOL FirstInstance(HINSTANCE); -static HWND AnyInstance(HINSTANCE this_inst, int cmdshow); -long FAR PASCAL WindowProc(HWND, UINT, WPARAM, LPARAM); -static BOOL CreateDevice(HWND, AppInfo*); -static void Idle(); -char* MyErrorToString(HRESULT error); - -/* Msg - * Message output for error notification. - */ -void __cdecl -Msg( LPSTR fmt, ... ) -{ - char buff[256]; - - wvsprintf(buff, fmt, (char *)(&fmt+1)); - lstrcat(buff, "\r\n"); - MessageBox( NULL, buff, "Viewer Message", MB_OK ); -} - - -char* LSTRRCHR( const char* lpString, int bChar ) -{ - if( lpString != NULL ) - { - const char* lpBegin; - - lpBegin = lpString; - - while( *lpString != 0 ) - { - lpString++; - } - - while( 1 ) - { - if( *lpString == bChar ) - { - return (char*)lpString; - } - - if( lpString == lpBegin ) - { - break; - } - - lpString--; - } - } - - return NULL; -} /* LSTRRCHR */ - -/* - * Initialization, message loop - */ -int PASCAL WinMain - (HINSTANCE this_inst, HINSTANCE prev_inst, LPSTR cmdline, int cmdshow) -{ - MSG msg; - int idle; - int done = FALSE; - HACCEL accel; - HRESULT rval; - HWND hwnd; - - prev_inst = prev_inst; - cmdline = cmdline; - - rval = Direct3DRMCreate(&lpD3DRM); - if (rval != D3DRM_OK) { - Msg("Failed to create Direct3DRM.\n%s", MyErrorToString(rval)); - return 1; - } - if (!prev_inst) - if (!FirstInstance(this_inst)) - return 1; - - if (!(hwnd = AnyInstance(this_inst, cmdshow))) - return 1; - accel = LoadAccelerators(this_inst, "ViewerAccel"); - - while (!done) { - idle = TRUE; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - idle = FALSE; - if (msg.message == WM_QUIT || bQuit) { - done = TRUE; - break; - } - if (!TranslateAccelerator(msg.hwnd, accel, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - if (done) { - break; - } else if (!active_window->bMinimized && !bQuit) { - if (idle) Idle(); - if (!Render()) { - Msg("Rendering failed.\n"); - done = TRUE; - break; - } - } else { - WaitMessage(); - } - } - RELEASE(active_window->scene); - RELEASE(active_window->camera); - RELEASE(active_window->view); - RELEASE(active_window->dev); - ClearClipboard(); - RELEASE(lpD3DRM); - RELEASE(lpDDClipper); - DestroyWindow(hwnd); - return msg.wParam; -} - -/* - * Register window class for the application, and do any other - * application initialization - */ -static BOOL FirstInstance(HINSTANCE this_inst) -{ - WNDCLASS wc; - BOOL rc; - - /* - * set up and register window class - */ - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof(DWORD); - wc.hInstance = this_inst; - wc.hIcon = LoadIcon(this_inst, "ViewerIcon"); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = "ViewerMenu"; - wc.lpszClassName = ViewerClass; - rc = RegisterClass(&wc); - - return rc; -} - -/* - * Do work required for every instance of the application: - * create the window, initialize data - */ -static HWND AnyInstance(HINSTANCE this_inst, int cmdshow) -{ - HWND win; - AppInfo *info; - - /* - * create main window - */ - win = - CreateWindow - ( ViewerClass, /* class */ - "Direct3D Object Viewer",/* caption */ - WS_OVERLAPPEDWINDOW, /* style */ - CW_USEDEFAULT, /* init. x pos */ - CW_USEDEFAULT, /* init. y pos */ - 400, /* init. x size */ - 400, /* init. y size */ - NULL, /* parent window */ - NULL, /* menu handle */ - this_inst, /* program handle */ - NULL /* create parms */ - ); - - - if (!win) return FALSE; - - /* - * Create a clipper for this window - */ - if (FAILED(DirectDrawCreateClipper(0, &lpDDClipper, NULL))) { - return FALSE; - } - if (FAILED(lpDDClipper->SetHWnd(0, win))) { - RELEASE(lpDDClipper); - return FALSE; - } - /* - * set up data associated with this window - */ - info = (AppInfo*) malloc(sizeof(AppInfo)); - SetWindowLong(win, 0, (long) info); - info->model = D3DCOLOR_MONO; - if (!CreateDevice(win, info)) { - return FALSE; - } - - /* - * display window - */ - ShowWindow(win, cmdshow); - UpdateWindow(win); - - return win; -} - -/* - * Processes messages for the about dialog. - */ -BOOL FAR PASCAL AboutDlgProc - (HWND win, unsigned msg, WORD wparam, LONG lparam) -{ - lparam = lparam; - - switch (msg) - { - case WM_INITDIALOG: - return TRUE; - - case WM_COMMAND: - if (wparam == IDOK) - { EndDialog(win, TRUE); - return TRUE; - } - break; - } - return FALSE; -} - -/* - * Create a simple scene. - */ -static BOOL CreateScene(AppInfo* info) -{ - LPDIRECT3DRMFRAME frame = NULL; - LPDIRECT3DRMFRAME light = NULL; - LPDIRECT3DRMMESHBUILDER builder = NULL; - LPDIRECT3DRMLIGHT light1 = NULL; - LPDIRECT3DRMLIGHT light2 = NULL; - LPDIRECT3DRMMATERIAL mat = NULL; - HRESULT rval; - - if (FAILED(lpD3DRM->CreateFrame(NULL, &info->scene))) - goto generic_error; - if (FAILED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light1))) - goto generic_error; - if (FAILED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT, D3DVAL(0.1), D3DVAL(0.1), D3DVAL(0.1), &light2))) - goto generic_error; - - if (FAILED(lpD3DRM->CreateFrame(info->scene, &light))) - goto generic_error; - if (FAILED(light->SetPosition(info->scene, D3DVAL(2.0), D3DVAL(2.0), D3DVAL(5.0)))) - goto generic_error; - if (FAILED(light->SetOrientation(info->scene, D3DVAL(-1.0), D3DVAL(-1.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0)))) - goto generic_error; - if (FAILED(light->AddLight(light1))) - goto generic_error; - RELEASE(light1); - if (FAILED(info->scene->AddLight(light2))) - goto generic_error; - RELEASE(light2); - if (FAILED(lpD3DRM->CreateMeshBuilder(&builder))) - goto generic_error; - rval = builder->Load("camera.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load camera.x.\n%s", MyErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->SetQuality(D3DRMRENDER_UNLITFLAT))) - goto generic_error; - if (FAILED(light->AddVisual(builder))) - goto generic_error; - RELEASE(builder); - RELEASE(light); - - if (FAILED(lpD3DRM->CreateFrame(info->scene, &frame))) - goto generic_error; - if (FAILED(frame->SetRotation(info->scene, D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(-0.02)))) - goto generic_error; - if (FAILED(frame->SetPosition(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0)))) - goto generic_error; - if (FAILED(lpD3DRM->CreateMeshBuilder(&builder))) - goto generic_error; - rval = builder->Load("mslogo.x", NULL, D3DRMLOAD_FROMFILE, - loadTextures, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load mslogo.x.\n%s", MyErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->SetColorRGB(D3DVAL(0.8), D3DVAL(0.8), D3DVAL(0.8)))) - goto generic_error; - if (FAILED(lpD3DRM->CreateMaterial(D3DVAL(10.0), &mat))) - goto generic_error; - if (FAILED(builder->SetMaterial(mat))) - goto generic_error; - - RELEASE(mat); - if (FAILED(frame->AddVisual(builder))) - goto generic_error; - RELEASE(builder); - RELEASE(frame); - - if (FAILED(lpD3DRM->CreateFrame(info->scene, &info->camera))) - goto generic_error; - if (FAILED(info->camera->SetPosition(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)))) - goto generic_error; - return TRUE; -generic_error: - Msg("A failure occurred while creating the scene.\n"); -ret_with_error: - RELEASE(frame); - RELEASE(light); - RELEASE(builder); - RELEASE(light1); - RELEASE(light2); - RELEASE(mat); - return FALSE; -} - -static DWORD bppToddbd(int bpp) -{ - switch(bpp) { - case 1: - return DDBD_1; - case 2: - return DDBD_2; - case 4: - return DDBD_4; - case 8: - return DDBD_8; - case 16: - return DDBD_16; - case 24: - return DDBD_24; - case 32: - return DDBD_32; - } - return 0; -} - - -/* - * Find a device, preferably hardware, for a particular color model. - */ -LPGUID -FindDevice(D3DCOLORMODEL cm) -{ - LPDIRECTDRAW lpDD; - LPDIRECT3D lpD3D; - D3DFINDDEVICESEARCH search; - static D3DFINDDEVICERESULT result; - HRESULT error; - HDC hdc; - int bpp; - - hdc = GetDC(NULL); - bpp = GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(NULL, hdc); - - if (DirectDrawCreate(NULL, &lpDD, NULL)) - return NULL; - - if (lpDD->QueryInterface(IID_IDirect3D, (void**) &lpD3D)) { - lpDD->Release(); - return NULL; - } - - memset(&search, 0, sizeof search); - search.dwSize = sizeof search; - search.dwFlags = D3DFDS_COLORMODEL; - search.dcmColorModel = (cm == D3DCOLOR_MONO) ? D3DCOLOR_MONO : D3DCOLOR_RGB; - - memset(&result, 0, sizeof result); - result.dwSize = sizeof result; - - error = lpD3D->FindDevice(&search, &result); - - if (error == DD_OK) { - /* - * If the device found is hardware but cannot support the current - * bit depth, then fall back to software rendering. - */ - if (result.ddHwDesc.dwFlags - && !(result.ddHwDesc.dwDeviceRenderBitDepth & bppToddbd(bpp))) { - - search.dwFlags |= D3DFDS_HARDWARE; - search.bHardware = FALSE; - memset(&result, 0, sizeof result); - result.dwSize = sizeof result; - error = lpD3D->FindDevice(&search, &result); - } - } - - lpD3D->Release(); - lpDD->Release(); - - if (error) - return NULL; - else - return &result.guid; -} - -/* - * Create the device and viewport. - */ -static BOOL CreateDevice(HWND win, AppInfo* info) -{ - RECT r; - int bpp; - HDC hdc; - - GetClientRect(win, &r); - if (FAILED(lpD3DRM->CreateDeviceFromClipper(lpDDClipper, FindDevice(info->model), - r.right, r.bottom, &info->dev))) - goto generic_error; - hdc = GetDC(win); - bpp = GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(win, hdc); - switch (bpp) - { - case 1: - if (FAILED(info->dev->SetShades(4))) - goto generic_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(4))) - goto generic_error; - break; - case 16: - if (FAILED(info->dev->SetShades(32))) - goto generic_error; - if (FAILED(lpD3DRM->SetDefaultTextureColors(64))) - goto generic_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(32))) - goto generic_error; - if (FAILED(info->dev->SetDither(FALSE))) - goto generic_error; - break; - case 24: - case 32: - if (FAILED(info->dev->SetShades(256))) - goto generic_error; - if (FAILED(lpD3DRM->SetDefaultTextureColors(64))) - goto generic_error; - if (FAILED(lpD3DRM->SetDefaultTextureShades(256))) - goto generic_error; - if (FAILED(info->dev->SetDither(FALSE))) - goto generic_error; - break; - default: - if (FAILED(info->dev->SetDither(FALSE))) - goto generic_error; - } - if (!CreateScene(info)) - goto ret_with_error; - if (FAILED(lpD3DRM->CreateViewport(info->dev, info->camera, 0, 0, - info->dev->GetWidth(), - info->dev->GetHeight(), &info->view))) - goto generic_error; - if (FAILED(info->view->SetBack(D3DVAL(5000.0)))) - goto generic_error; - - return TRUE; -generic_error: - Msg("An error occurred while creating the device.\n"); -ret_with_error: - return FALSE; -} - -/* - * Regenerate the device if the color model changes or the window size - * changes. - */ -static BOOL RebuildDevice(HWND win, AppInfo* info, int width, int height) -{ - HRESULT rval; - int old_dither = info->dev->GetDither(); - D3DRMRENDERQUALITY old_quality = info->dev->GetQuality(); - int old_shades = info->dev->GetShades(); - - RELEASE(info->view); - RELEASE(info->dev); - rval = lpD3DRM->CreateDeviceFromClipper(lpDDClipper, FindDevice(info->model), - width, height, &info->dev); - if (rval != D3DRM_OK) { - Msg("Creating a device from HWND failed while rebuilding device.\n%s", MyErrorToString(rval)); - return FALSE; - } - - if (FAILED(info->dev->SetDither(old_dither))) - goto generic_error; - if (FAILED(info->dev->SetQuality(old_quality))) - goto generic_error; - if (FAILED(info->dev->SetShades(old_shades))) - goto generic_error; - width = info->dev->GetWidth(); - height = info->dev->GetHeight(); - if (FAILED(lpD3DRM->CreateViewport(info->dev, info->camera, - 0, 0, width, height, &info->view))) - goto generic_error; - if (FAILED(info->view->SetBack(D3DVAL(400.0)))) - goto generic_error; - return TRUE; -generic_error: - Msg("A failure occurred while rebuilding the device.\n"); - return FALSE; -} - -/* - * Resize the viewport and device when the window size changes. - */ -static BOOL ResizeViewport(HWND win, AppInfo* info, int width, int height) -{ - int view_width = info->view->GetWidth(); - int view_height = info->view->GetHeight(); - int dev_width = info->dev->GetWidth(); - int dev_height = info->dev->GetHeight(); - - if (view_width == width && view_height == height) - return TRUE; - - if (width <= dev_width && height <= dev_height) { - RELEASE(info->view); - if (FAILED(lpD3DRM->CreateViewport(info->dev, info->camera, 0, 0, width, height, &info->view))) - goto generic_error; - if (FAILED(info->view->SetBack(D3DVAL(400.0)))) - goto generic_error; - } - - if (!RebuildDevice(win, info, width, height)) - return FALSE; - return TRUE; -generic_error: - Msg("A failure occurred while resizing the viewport.\n"); - return FALSE; -} - -/* - * Place an object in front of the camera. - */ -static BOOL PlaceMesh(LPDIRECT3DRMMESHBUILDER mesh, AppInfo *info) -{ - LPDIRECT3DRMFRAME frame; - - if (FAILED(lpD3DRM->CreateFrame(info->scene, &frame))) - return FALSE; - if (FAILED(frame->AddVisual(mesh))) - return FALSE; - if (FAILED(frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(15.0)))) - return FALSE; - frame->Release(); - return TRUE; -} - -static BOOL ScaleScene(LPDIRECT3DRMFRAME frame, AppInfo *info) -{ - /* Some trickery form the RL2 viewer to scale a scene down to - managable proportions */ - LPDIRECT3DRMMESHBUILDER mbuilder; - D3DRMBOX box; - D3DVALUE maxDim; - - lpD3DRM->CreateMeshBuilder(&mbuilder); - mbuilder->AddFrame(frame); - mbuilder->GetBox(&box); - mbuilder->Release(); - - maxDim = box.max.x - box.min.x; - if (box.max.y - box.min.y > maxDim) - maxDim = box.max.y - box.min.y; - if (box.max.z - box.min.z > maxDim) - maxDim = box.max.z - box.min.z; - - frame->AddScale(D3DRMCOMBINE_BEFORE, D3DDivide(D3DVAL(8.0), maxDim), - D3DDivide(D3DVAL(8.0), maxDim), - D3DDivide(D3DVAL(8.0), maxDim)); - - frame->SetPosition(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(15.0)); - - return TRUE; -} - - -typedef struct { - LPDIRECT3DRMANIMATIONSET animset; - D3DVALUE time; -} animationCallbackArgs; - -static void CDECL animationCallback(LPDIRECT3DRMFRAME obj, void* arg, D3DVALUE delta) -{ - animationCallbackArgs* cb = (animationCallbackArgs *) arg; - - obj = obj; - cb->animset->SetTime(cb->time); - cb->time += delta; -} - -static BOOL setAnimationCallback(LPDIRECT3DRMFRAME frame, - LPDIRECT3DRMANIMATIONSET animset) -{ - animationCallbackArgs *cb; - - cb = (animationCallbackArgs*)malloc(sizeof(animationCallbackArgs)); - if (!cb) - return FALSE; - - cb->animset = animset; - cb->time = D3DVAL(0); - if (FAILED(frame->AddMoveCallback(animationCallback, (void *) cb))) - return FALSE; - return TRUE; -} - -static BOOL LoadAnimationSet(const char *filename, AppInfo *info) -{ - LPDIRECT3DRMANIMATIONSET lpAnimSet; - LPDIRECT3DRMFRAME lpFrame; - - /* Create a new parent frame for the animation, load it, and set up the - callback */ - - if (FAILED(lpD3DRM->CreateFrame(info->scene, &lpFrame))) - return FALSE; - - if (FAILED(lpD3DRM->CreateAnimationSet(&lpAnimSet))) - return FALSE; - - if (FAILED(lpAnimSet->Load((LPVOID)filename, NULL, - D3DRMLOAD_FROMFILE, loadTextures, - NULL, lpFrame))) - return FALSE; - - ScaleScene(lpFrame, info); - - setAnimationCallback(lpFrame, lpAnimSet); - - return TRUE; -} - -static BOOL LoadFrameHierarchy(const char *filename, AppInfo *info) -{ - LPDIRECT3DRMFRAME lpFrame; - - if (FAILED(lpD3DRM->CreateFrame(info->scene, &lpFrame))) - return FALSE; - - if (FAILED(lpFrame->Load((LPVOID)filename, NULL, D3DRMLOAD_FROMFILE, - loadTextures, NULL))) - return FALSE; - - ScaleScene(lpFrame, info); - - return TRUE; -} - - -static int - left_drag = FALSE, right_drag = FALSE, - last_x, last_y; - -/* - * Render the scene into the viewport. - */ -static BOOL Render() { - if (FAILED(active_window->scene->Move(D3DVAL(1.0)))) - return FALSE; - if (FAILED(active_window->view->Clear())) - return FALSE; - if (FAILED(active_window->view->Render(active_window->scene))) - return FALSE; - if (FAILED(active_window->dev->Update())) - return FALSE; - return TRUE; -} - -static void Idle() -{ - LPDIRECT3DRMFRAME selected = SelectedFrame(); - - if (active_window == NULL) return; - if (left_drag && selected) - selected->SetRotation(active_window->scene, D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)); - if (right_drag && selected) - selected->SetVelocity(active_window->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), FALSE); -} - -static int FillModeToMenuItem(D3DRMFILLMODE fm) -{ - switch (fm) { - case D3DRMFILL_POINTS: - return 2; - - case D3DRMFILL_WIREFRAME: - return 3; - - case D3DRMFILL_SOLID: - return 4; - } - return -1; -} - -static int ShadeModeToMenuItem(D3DRMSHADEMODE sm) -{ - switch (sm) { - case D3DRMSHADE_FLAT: - return 6; - - case D3DRMSHADE_GOURAUD: - return 7; - - case D3DRMSHADE_PHONG: - return 8; - } - return -1; -} - -static BOOL ToggleLighting(HWND win, AppInfo* info) -{ - HMENU menu; - D3DRMRENDERQUALITY quality = info->dev->GetQuality(); - D3DRMLIGHTMODE mode = (D3DRMLIGHTMODE)(quality & D3DRMLIGHT_MASK); - HRESULT rval; - - if (mode == D3DRMLIGHT_ON) - mode = D3DRMLIGHT_OFF; - else - mode = D3DRMLIGHT_ON; - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, 0, (MF_BYPOSITION - | (mode == D3DRMLIGHT_ON - ? MF_CHECKED - : MF_UNCHECKED))); - - quality = (quality & ~D3DRMLIGHT_MASK) | mode; - rval = info->dev->SetQuality(quality); - if (rval != D3DRM_OK) { - Msg("Setting the render quality while toggling lighting failed.\n%s", MyErrorToString(rval)); - return FALSE; - } - return TRUE; -} - -static BOOL SetFillMode(HWND win, AppInfo* info, D3DRMFILLMODE fm) -{ - HMENU menu; - D3DRMRENDERQUALITY quality = info->dev->GetQuality(); - D3DRMFILLMODE oldfm = (D3DRMFILLMODE)(quality & D3DRMFILL_MASK); - HRESULT rval; - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, FillModeToMenuItem(oldfm), - MF_BYPOSITION|MF_UNCHECKED); - CheckMenuItem(menu, FillModeToMenuItem(fm), - MF_BYPOSITION|MF_CHECKED); - - quality = (quality & ~D3DRMFILL_MASK) | fm; - rval = info->dev->SetQuality(quality); - if (rval != D3DRM_OK) { - Msg("Setting the render quality while changing the fill mode failed.\n%s", MyErrorToString(rval)); - return FALSE; - } - return TRUE; -} - -static BOOL SetShadeMode(HWND win, AppInfo* info, D3DRMSHADEMODE sm) -{ - HMENU menu; - D3DRMRENDERQUALITY quality = info->dev->GetQuality(); - D3DRMSHADEMODE oldsm = (D3DRMSHADEMODE)(quality & D3DRMSHADE_MASK); - HRESULT rval; - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, ShadeModeToMenuItem(oldsm), - MF_BYPOSITION|MF_UNCHECKED); - CheckMenuItem(menu, ShadeModeToMenuItem(sm), - MF_BYPOSITION|MF_CHECKED); - - quality = (quality & ~D3DRMSHADE_MASK) | sm; - rval = info->dev->SetQuality(quality); - if (rval != D3DRM_OK) { - Msg("Setting the render quality while changing the shade mode failed.\n%s", MyErrorToString(rval)); - return FALSE; - } - return TRUE; -} - -static BOOL SetModel(HWND win, AppInfo* info, D3DRMCOLORMODEL model) -{ - HMENU menu; - D3DRMCOLORMODEL oldModel = info->model; - - if (oldModel == model) return TRUE; - - info->model = model; - if (!RebuildDevice(win, info, info->dev->GetWidth(), info->dev->GetHeight())) - return FALSE; - - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - CheckMenuItem(menu, 9 + (int) oldModel, MF_BYPOSITION|MF_UNCHECKED); - CheckMenuItem(menu, 9 + (int) model, MF_BYPOSITION|MF_CHECKED); - return TRUE; -} - -static BOOL ToggleDither(HWND win, AppInfo *info) -{ - HMENU menu; - int dither = info->dev->GetDither(); - int checked; - dither = !dither; - if (FAILED(info->dev->SetDither(dither))) { - Msg("Toggling dithering failed.\n"); - return FALSE; - } - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - - if (dither) checked = MF_CHECKED; - else checked = MF_UNCHECKED; - - //CheckMenuItem(menu, MENU_DITHER, MF_BYCOMMAND|checked); - CheckMenuItem(menu, 13, MF_BYPOSITION|checked); - return TRUE; -} - -static BOOL ToggleTextureFiltering(HWND win, AppInfo *info) -{ - HMENU menu; - D3DRMTEXTUREQUALITY tq = info->dev->GetTextureQuality(); - int checked; - if (tq == D3DRMTEXTURE_NEAREST) - tq = D3DRMTEXTURE_LINEAR; - else - tq = D3DRMTEXTURE_NEAREST; - - if (FAILED(info->dev->SetTextureQuality(tq))) { - Msg("Setting texture quality failed.\n"); - return FALSE; - } - menu = GetMenu(win); - menu = GetSubMenu(menu, 2); - - if (tq == D3DRMTEXTURE_LINEAR) checked = MF_CHECKED; - else checked = MF_UNCHECKED; - - CheckMenuItem(menu, 14, MF_BYPOSITION|checked); - return TRUE; -} - -static BOOL -CreateLight(WPARAM wparam, AppInfo* info) -{ - LPDIRECT3DRMMESHBUILDER builder = NULL; - LPDIRECT3DRMLIGHT light = NULL; - LPDIRECT3DRMFRAME frame = NULL; - HRESULT rval; - - if (FAILED(lpD3DRM->CreateMeshBuilder(&builder))) - goto generic_error; - - if (wparam == MENU_LIGHT_DIRECTIONAL) { - rval = builder->Load("camera.x", NULL, D3DRMLOAD_FROMFILE, - NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load camera.x.\n%s", MyErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->SetQuality(D3DRMRENDER_UNLITFLAT))) - goto generic_error; - if (FAILED(lpD3DRM->CreateLightRGB - (D3DRMLIGHT_DIRECTIONAL, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) - goto generic_error; - } else if (wparam == MENU_LIGHT_PARALLEL_POINT) { - rval = builder->Load("sphere2.x", NULL, D3DRMLOAD_FROMFILE, - NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere2.x.\n%s", MyErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->SetQuality(D3DRMRENDER_UNLITFLAT))) - goto generic_error; - if (FAILED(builder->Scale(D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)))) - goto generic_error; - if (FAILED(lpD3DRM->CreateLightRGB - (D3DRMLIGHT_PARALLELPOINT, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) - goto generic_error; - } else if (wparam == MENU_LIGHT_POINT) { - rval = builder->Load("sphere2.x", NULL, D3DRMLOAD_FROMFILE, - NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load sphere2.x.\n%s", MyErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->SetQuality(D3DRMRENDER_UNLITFLAT))) - goto generic_error; - if (FAILED(builder->Scale(D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)))) - goto generic_error; - if (FAILED(lpD3DRM->CreateLightRGB - (D3DRMLIGHT_POINT, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) - goto generic_error; - } else if (wparam == MENU_LIGHT_SPOT) { - rval = builder->Load("camera.x", NULL, D3DRMLOAD_FROMFILE, - NULL, NULL); - if (rval != D3DRM_OK) { - Msg("Failed to load camera.x.\n%s", MyErrorToString(rval)); - goto ret_with_error; - } - if (FAILED(builder->SetQuality(D3DRMRENDER_UNLITFLAT))) - goto generic_error; - if (FAILED(lpD3DRM->CreateLightRGB(D3DRMLIGHT_SPOT, D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0), &light))) - goto generic_error; - } - if (FAILED(lpD3DRM->CreateFrame(info->scene, &frame))) - goto generic_error; - if (FAILED(frame->SetPosition(info->camera, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(10.0)))) - goto generic_error; - if (FAILED(frame->AddVisual(builder))) - goto generic_error; - if (FAILED(frame->AddLight(light))) - goto generic_error; - - builder->Release(), frame->Release(), light->Release(); - return TRUE; -generic_error: - Msg("A failure occurred while creating a new light.\n"); -ret_with_error: - RELEASE(builder); - RELEASE(light); - RELEASE(frame); - return FALSE; -} - -HRESULT loadTextures(char *name, void *arg, LPDIRECT3DRMTEXTURE *tex) -{ - /* IDirect3DRM::LoadTexture checks whether the texture is a PPM or - BMP which it knows how to load. If you want to load other formats - you could add code to the callback to load the code into an D3DRMIMAGE - structure and call IDirect3DRM::CreateTexture */ - - return lpD3DRM->LoadTexture(name, tex); -} - -#define SIGN_EXTEND(w) ((((int)(w)) << 16) >> 16) - -/* - * Handle messages for the main application window - */ -LONG FAR PASCAL WindowProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) -{ - static HCURSOR oldCursor = NULL; - AppInfo *info; - LPDIRECT3DRMFRAME sFrame = SelectedFrame(); - LPDIRECT3DRMMESHBUILDER sVisual = SelectedVisual(); - - info = (AppInfo *) GetWindowLong(win, 0); - active_window = info; - - switch (msg) - { - case WM_KEYDOWN: - { D3DVECTOR dir, up, right; - - info->camera->GetOrientation(info->scene, &dir, &up); - D3DRMVectorCrossProduct(&right, &up, &dir); - up.x /= D3DVAL(4.0); - up.y /= D3DVAL(4.0); - up.z /= D3DVAL(4.0); - right.x /= D3DVAL(4.0); - right.y /= D3DVAL(4.0); - right.z /= D3DVAL(4.0); - - switch (wparam) - { - case 'T': - info->camera->SetVelocity(info->scene, dir.x, dir.y, dir.z, FALSE); - break; - - case 'Y': - info->camera->SetVelocity(info->scene, D3DVAL(-100.0) * dir.x, - D3DVAL(-100.0) * dir.y, - D3DVAL(-100.0) * dir.z, FALSE); - - case 'R': - info->camera->SetVelocity(info->scene, -dir.x, -dir.y, -dir.z, FALSE); - break; - - case 'E': - info->camera->SetVelocity(info->scene, D3DVAL(100.0) * dir.x, - D3DVAL(100.0) * dir.y, - D3DVAL(100.0) * dir.z, FALSE); - case VK_UP: - info->camera->SetVelocity(info->scene, up.x, up.y, up.z, FALSE); - break; - - case VK_DOWN: - info->camera->SetVelocity(info->scene, -up.x, -up.y, -up.z, FALSE); - break; - - case VK_RIGHT: - info->camera->SetVelocity(info->scene, right.x, right.y, right.z, FALSE); - break; - - case VK_LEFT: - info->camera->SetVelocity(info->scene, -right.x, -right.y, -right.z, FALSE); - break; - - case 'X': - if (sFrame) - sFrame->SetVelocity(info->scene, dir.x, dir.y, dir.z, FALSE); - break; - - case 'Z': - if (sFrame) - sFrame->SetVelocity(info->scene, -dir.x, -dir.y, -dir.z, FALSE); - break; - - case VK_SUBTRACT: - if (sFrame) - { sVisual->Scale(D3DVAL(0.9), D3DVAL(0.9), D3DVAL(0.9)); - SelectVisual(sVisual, sFrame); - } - break; - - case VK_ADD: - if (sFrame) - { sVisual->Scale(D3DVAL(1.1), D3DVAL(1.1), D3DVAL(1.1)); - SelectVisual(sVisual, sFrame); - } - break; - } - } - break; - - case WM_KEYUP: - switch (wparam) - { - case 'T': - case 'R': - case VK_UP: - case VK_DOWN: - case VK_LEFT: - case VK_RIGHT: - info->camera->SetVelocity(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), FALSE); - break; - - case 'Z': - case 'X': - if (sFrame) - sFrame->SetVelocity(info->scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0), FALSE); - break; - } - break; - - case WM_LBUTTONDOWN: - { HCURSOR hCur; - int x = LOWORD(lparam); - int y = HIWORD(lparam); - last_x = x; - last_y = y; - FindAndSelectVisual(info->view, x, y); - left_drag = TRUE; - SetCapture(win); - /* change to a groovy cursor */ - hCur = LoadCursor(NULL, IDC_ARROW); - if (hCur) oldCursor = SetCursor(hCur); - else oldCursor = NULL; - } - break; - - case WM_LBUTTONUP: - ReleaseCapture(); - left_drag = FALSE; - if (oldCursor) SetCursor(oldCursor); - break; - - case WM_RBUTTONDOWN: - { - HCURSOR hCur; - int x = LOWORD(lparam); - int y = HIWORD(lparam); - last_x = x; - last_y = y; - FindAndSelectVisual(info->view, x, y); - right_drag = TRUE; - SetCapture(win); - /* change to a groovy cursor */ - hCur = LoadCursor(NULL, IDC_ARROW); - if (hCur) oldCursor = SetCursor(hCur); - else oldCursor = NULL; - } - break; - - case WM_RBUTTONUP: - right_drag = FALSE; - ReleaseCapture(); - if (oldCursor) SetCursor(oldCursor); - break; - - case WM_MOUSEMOVE: - if ((wparam & MK_LBUTTON) && sFrame && left_drag) - { double delta_x, delta_y; - delta_x = SIGN_EXTEND(LOWORD(lparam)) - last_x; - delta_y = -SIGN_EXTEND((HIWORD(lparam)) - last_y); - last_x = SIGN_EXTEND(LOWORD(lparam)); - last_y = SIGN_EXTEND(HIWORD(lparam)); - { - double delta_r = sqrt(delta_x * delta_x + delta_y * delta_y); - double radius = 50; - double denom; - - denom = sqrt(radius * radius + delta_r * delta_r); - - if (delta_r == 0 || denom == 0) break; - sFrame->SetRotation - ( info->camera, - D3DDivide(D3DVAL((float) delta_y), D3DVAL((float) delta_r)), - D3DDivide(D3DVAL((float) -delta_x), D3DVAL((float) delta_r)), - D3DVAL(0.0), - D3DDivide(D3DVAL((float) delta_r), D3DVAL((float) denom)) - ); - } - } - else if ((wparam & MK_RBUTTON) && sFrame && right_drag) - { double delta_x, delta_y; - D3DVECTOR p1; - D3DRMVECTOR4D p2; - - delta_x = SIGN_EXTEND(LOWORD(lparam)) - last_x; - delta_y = SIGN_EXTEND(HIWORD(lparam)) - last_y; - last_x = SIGN_EXTEND(LOWORD(lparam)); - last_y = SIGN_EXTEND(HIWORD(lparam)); - sFrame->GetPosition(info->scene, &p1); - info->view->Transform(&p2, &p1); - p2.x += D3DMultiply(D3DVAL((float)delta_x), p2.w); - p2.y += D3DMultiply(D3DVAL((float)delta_y), p2.w); - info->view->InverseTransform(&p1, &p2); - sFrame->SetPosition(info->scene, p1.x, p1.y, p1.z); - } - break; - - case WM_COMMAND: - switch( wparam & 0xffff ) - { - case MENU_FILE_ABOUT: - DialogBox((HINSTANCE) GetWindowLong(win, GWL_HINSTANCE),"AboutBox", win, (DLGPROC)AboutDlgProc); - break; - - case MENU_FILE_OPEN: - { LPDIRECT3DRMMESHBUILDER builder; - HRESULT rval; - char *file = OpenNewFile(win, "Open a Mesh file"); - if (file) - { - if (FAILED(lpD3DRM->CreateMeshBuilder(&builder))) { - Msg("Failed the create a builder for the new mesh.\n"); - break; - } - rval = builder->Load(file, NULL, D3DRMLOAD_FROMFILE, - loadTextures, NULL); - if (rval != D3DRM_OK) { - Msg("Loading %s failed.\n%s", file, MyErrorToString(rval)); - builder->Release(); - break; - } - if (!PlaceMesh(builder, info)) { - Msg("Placing the mesh in the scene failed.\n"); - builder->Release(); - break; - } - builder->Release(); - } - - /*LoadAnimationSet(file, info);*/ - break; - } - - case MENU_FILE_OPEN_ANIMSET: - { - char *file = OpenNewFile(win, "Open Animation ..."); - if (file) { - if (LoadAnimationSet(file, info) == FALSE) { - Msg("Loading and placing of %s failed.\n", file); - } - } - break; - } - - case MENU_FILE_OPEN_FRAME: - { - char *file = OpenNewFile(win, "Open Frame ..."); - if (file) { - if (LoadFrameHierarchy(file, info) == FALSE) { - Msg("Loading and placing of %s failed.\n", file); - } - } - break; - } - - case MENU_FILE_EXIT: - PostQuitMessage(0); - break; - - case MENU_EDIT_CUT: - CutVisual(); - break; - - case MENU_EDIT_COPY: - CopyVisual(); - break; - - case MENU_EDIT_PASTE: - PasteVisual(info->scene); - break; - - case MENU_EDIT_DELETE: - DeleteVisual(); - break; - - case MENU_EDIT_COLOR: - if (sFrame) - { - LPDIRECT3DRMMESHBUILDER mesh; - HRESULT rval; - - if (FAILED(sVisual->QueryInterface(IID_IDirect3DRMMeshBuilder, - (void**) &mesh))) - break; - - if (SelectedLight()) - { - D3DCOLOR c = SelectedLight()->GetColor(); - - if (ChooseNewColor(win, &c)) { - mesh->SetColor(c); - SelectedLight()->SetColor(c); - } - } else { - D3DCOLOR c; - - if (mesh->GetFaceCount()) { - LPDIRECT3DRMFACEARRAY faces; - LPDIRECT3DRMFACE face; - mesh->GetFaces(&faces); - faces->GetElement(0, &face); - c = face->GetColor(); - RELEASE(face); - RELEASE(faces); - } else - c = D3DRMCreateColorRGB(D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)); - - if (ChooseNewColor(win, &c)) { - rval = mesh->SetColor(c); - if (rval != D3DRM_OK) - Msg("Failed to set the mesh's color.\n%s", MyErrorToString(rval)); - } - } - - RELEASE(mesh); - } - break; - - case MENU_EDIT_BOXES: - { - HMENU menu; - int checked = ToggleBoxes() ? MF_CHECKED : MF_UNCHECKED; - menu = GetMenu(win); - menu = GetSubMenu(menu, 1); - CheckMenuItem(menu, MENU_EDIT_BOXES, MF_BYCOMMAND|checked); - } - break; - - case MENU_QUALITY_LIGHTING: - ToggleLighting(win, info); - break; - - case MENU_QUALITY_POINTS: - SetFillMode(win, info, D3DRMFILL_POINTS); - break; - - case MENU_QUALITY_WIREFRAME: - SetFillMode(win, info, D3DRMFILL_WIREFRAME); - break; - - case MENU_QUALITY_SOLID: - SetFillMode(win, info, D3DRMFILL_SOLID); - break; - - case MENU_QUALITY_FLAT: - SetShadeMode(win, info, D3DRMSHADE_FLAT); - break; - - case MENU_QUALITY_GOURAUD: - SetShadeMode(win, info, D3DRMSHADE_GOURAUD); - break; - - case MENU_QUALITY_PHONG: - SetShadeMode(win, info, D3DRMSHADE_PHONG); - break; - - case MENU_MODEL_MONO: - if (!SetModel(win, info, D3DCOLOR_MONO)) - bQuit = TRUE; - break; - - case MENU_MODEL_RGB: - if (!SetModel(win, info, D3DCOLOR_RGB)) - bQuit = TRUE; - break; - - case MENU_DITHER: - ToggleDither(win, info); - break; - - case MENU_TEXTURE_FILTERING: - ToggleTextureFiltering(win, info); - break; - - case MENU_LIGHT_DIRECTIONAL: - case MENU_LIGHT_PARALLEL_POINT: - case MENU_LIGHT_POINT: - case MENU_LIGHT_SPOT: - { - CreateLight(wparam, info); - } - break; - } - break; - - case WM_DESTROY: - PostQuitMessage( 0 ); - bQuit = TRUE; - break; - - case WM_SIZE: - { - int width = LOWORD(lparam); - int height = HIWORD(lparam); - if (width && height) { - if (!ResizeViewport(win, info, width, height)) { - bQuit = TRUE; - break; - } - active_window->bMinimized = FALSE; - } else { - active_window->bMinimized = TRUE; - } - } - break; - - case WM_ACTIVATE: - { LPDIRECT3DRMWINDEVICE windev; - if (!info || !info->dev) break; - if (SUCCEEDED(info->dev->QueryInterface(IID_IDirect3DRMWinDevice, (void **) &windev))) - { if (FAILED(windev->HandleActivate(wparam))) - Msg("Failed to handle WM_ACTIVATE.\n"); - windev->Release(); - } else { - Msg("Failed to create Windows device to handle WM_ACTIVATE.\n"); - } - } - break; - - case WM_PAINT: - if (info) - { RECT r; - PAINTSTRUCT ps; - LPDIRECT3DRMWINDEVICE windev; - - if (!info || !info->dev) break; - if (GetUpdateRect(win, &r, FALSE)) - { BeginPaint(win, &ps); - if (SUCCEEDED(info->dev->QueryInterface(IID_IDirect3DRMWinDevice, (void **) &windev))) - { if (FAILED(windev->HandlePaint(ps.hdc))) - Msg("Failed to handle WM_PAINT.\n"); - windev->Release(); - } else { - Msg("Failed to create Windows device to handle WM_PAINT.\n"); - } - EndPaint(win, &ps); - } - } - - else return DefWindowProc(win, msg, wparam, lparam); - - default: - return DefWindowProc(win, msg, wparam, lparam); - } - return 0L; -} - -/* - * MyErrorToString - * Returns a pointer to a string describing the given error code. - */ -char* -MyErrorToString(HRESULT error) -{ - switch(error) { - case DD_OK: - /* Also includes D3D_OK and D3DRM_OK */ - return "No error.\0"; - case DDERR_ALREADYINITIALIZED: - return "This object is already initialized.\0"; - case DDERR_BLTFASTCANTCLIP: - return "Return if a clipper object is attached to the source surface passed into a BltFast call.\0"; - case DDERR_CANNOTATTACHSURFACE: - return "This surface can not be attached to the requested surface.\0"; - case DDERR_CANNOTDETACHSURFACE: - return "This surface can not be detached from the requested surface.\0"; - case DDERR_CANTCREATEDC: - return "Windows can not create any more DCs.\0"; - case DDERR_CANTDUPLICATE: - return "Can't duplicate primary & 3D surfaces, or surfaces that are implicitly created.\0"; - case DDERR_CLIPPERISUSINGHWND: - return "An attempt was made to set a cliplist for a clipper object that is already monitoring an hwnd.\0"; - case DDERR_COLORKEYNOTSET: - return "No src color key specified for this operation.\0"; - case DDERR_CURRENTLYNOTAVAIL: - return "Support is currently not available.\0"; - case DDERR_DIRECTDRAWALREADYCREATED: - return "A DirectDraw object representing this driver has already been created for this process.\0"; - case DDERR_EXCEPTION: - return "An exception was encountered while performing the requested operation.\0"; - case DDERR_EXCLUSIVEMODEALREADYSET: - return "An attempt was made to set the cooperative level when it was already set to exclusive.\0"; - case DDERR_GENERIC: - return "Generic failure.\0"; - case DDERR_HEIGHTALIGN: - return "Height of rectangle provided is not a multiple of reqd alignment.\0"; - case DDERR_HWNDALREADYSET: - return "The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.\0"; - case DDERR_HWNDSUBCLASSED: - return "HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.\0"; - case DDERR_IMPLICITLYCREATED: - return "This surface can not be restored because it is an implicitly created surface.\0"; - case DDERR_INCOMPATIBLEPRIMARY: - return "Unable to match primary surface creation request with existing primary surface.\0"; - case DDERR_INVALIDCAPS: - return "One or more of the caps bits passed to the callback are incorrect.\0"; - case DDERR_INVALIDCLIPLIST: - return "DirectDraw does not support the provided cliplist.\0"; - case DDERR_INVALIDDIRECTDRAWGUID: - return "The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.\0"; - case DDERR_INVALIDMODE: - return "DirectDraw does not support the requested mode.\0"; - case DDERR_INVALIDOBJECT: - return "DirectDraw received a pointer that was an invalid DIRECTDRAW object.\0"; - case DDERR_INVALIDPARAMS: - return "One or more of the parameters passed to the function are incorrect.\0"; - case DDERR_INVALIDPIXELFORMAT: - return "The pixel format was invalid as specified.\0"; - case DDERR_INVALIDPOSITION: - return "Returned when the position of the overlay on the destination is no longer legal for that destination.\0"; - case DDERR_INVALIDRECT: - return "Rectangle provided was invalid.\0"; - case DDERR_LOCKEDSURFACES: - return "Operation could not be carried out because one or more surfaces are locked.\0"; - case DDERR_NO3D: - return "There is no 3D present.\0"; - case DDERR_NOALPHAHW: - return "Operation could not be carried out because there is no alpha accleration hardware present or available.\0"; - case DDERR_NOBLTHW: - return "No blitter hardware present.\0"; - case DDERR_NOCLIPLIST: - return "No cliplist available.\0"; - case DDERR_NOCLIPPERATTACHED: - return "No clipper object attached to surface object.\0"; - case DDERR_NOCOLORCONVHW: - return "Operation could not be carried out because there is no color conversion hardware present or available.\0"; - case DDERR_NOCOLORKEY: - return "Surface doesn't currently have a color key\0"; - case DDERR_NOCOLORKEYHW: - return "Operation could not be carried out because there is no hardware support of the destination color key.\0"; - case DDERR_NOCOOPERATIVELEVELSET: - return "Create function called without DirectDraw object method SetCooperativeLevel being called.\0"; - case DDERR_NODC: - return "No DC was ever created for this surface.\0"; - case DDERR_NODDROPSHW: - return "No DirectDraw ROP hardware.\0"; - case DDERR_NODIRECTDRAWHW: - return "A hardware-only DirectDraw object creation was attempted but the driver did not support any hardware.\0"; - case DDERR_NOEMULATION: - return "Software emulation not available.\0"; - case DDERR_NOEXCLUSIVEMODE: - return "Operation requires the application to have exclusive mode but the application does not have exclusive mode.\0"; - case DDERR_NOFLIPHW: - return "Flipping visible surfaces is not supported.\0"; - case DDERR_NOGDI: - return "There is no GDI present.\0"; - case DDERR_NOHWND: - return "Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.\0"; - case DDERR_NOMIRRORHW: - return "Operation could not be carried out because there is no hardware present or available.\0"; - case DDERR_NOOVERLAYDEST: - return "Returned when GetOverlayPosition is called on an overlay that UpdateOverlay has never been called on to establish a destination.\0"; - case DDERR_NOOVERLAYHW: - return "Operation could not be carried out because there is no overlay hardware present or available.\0"; - case DDERR_NOPALETTEATTACHED: - return "No palette object attached to this surface.\0"; - case DDERR_NOPALETTEHW: - return "No hardware support for 16 or 256 color palettes.\0"; - case DDERR_NORASTEROPHW: - return "Operation could not be carried out because there is no appropriate raster op hardware present or available.\0"; - case DDERR_NOROTATIONHW: - return "Operation could not be carried out because there is no rotation hardware present or available.\0"; - case DDERR_NOSTRETCHHW: - return "Operation could not be carried out because there is no hardware support for stretching.\0"; - case DDERR_NOT4BITCOLOR: - return "DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.\0"; - case DDERR_NOT4BITCOLORINDEX: - return "DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.\0"; - case DDERR_NOT8BITCOLOR: - return "DirectDrawSurface is not in 8 bit color mode and the requested operation requires 8 bit color.\0"; - case DDERR_NOTAOVERLAYSURFACE: - return "Returned when an overlay member is called for a non-overlay surface.\0"; - case DDERR_NOTEXTUREHW: - return "Operation could not be carried out because there is no texture mapping hardware present or available.\0"; - case DDERR_NOTFLIPPABLE: - return "An attempt has been made to flip a surface that is not flippable.\0"; - case DDERR_NOTFOUND: - return "Requested item was not found.\0"; - case DDERR_NOTLOCKED: - return "Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.\0"; - case DDERR_NOTPALETTIZED: - return "The surface being used is not a palette-based surface.\0"; - case DDERR_NOVSYNCHW: - return "Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.\0"; - case DDERR_NOZBUFFERHW: - return "Operation could not be carried out because there is no hardware support for zbuffer blitting.\0"; - case DDERR_NOZOVERLAYHW: - return "Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.\0"; - case DDERR_OUTOFCAPS: - return "The hardware needed for the requested operation has already been allocated.\0"; - case DDERR_OUTOFMEMORY: - return "DirectDraw does not have enough memory to perform the operation.\0"; - case DDERR_OUTOFVIDEOMEMORY: - return "DirectDraw does not have enough memory to perform the operation.\0"; - case DDERR_OVERLAYCANTCLIP: - return "The hardware does not support clipped overlays.\0"; - case DDERR_OVERLAYCOLORKEYONLYONEACTIVE: - return "Can only have ony color key active at one time for overlays.\0"; - case DDERR_OVERLAYNOTVISIBLE: - return "Returned when GetOverlayPosition is called on a hidden overlay.\0"; - case DDERR_PALETTEBUSY: - return "Access to this palette is being refused because the palette is already locked by another thread.\0"; - case DDERR_PRIMARYSURFACEALREADYEXISTS: - return "This process already has created a primary surface.\0"; - case DDERR_REGIONTOOSMALL: - return "Region passed to Clipper::GetClipList is too small.\0"; - case DDERR_SURFACEALREADYATTACHED: - return "This surface is already attached to the surface it is being attached to.\0"; - case DDERR_SURFACEALREADYDEPENDENT: - return "This surface is already a dependency of the surface it is being made a dependency of.\0"; - case DDERR_SURFACEBUSY: - return "Access to this surface is being refused because the surface is already locked by another thread.\0"; - case DDERR_SURFACEISOBSCURED: - return "Access to surface refused because the surface is obscured.\0"; - case DDERR_SURFACELOST: - return "Access to this surface is being refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have Restore called on it.\0"; - case DDERR_SURFACENOTATTACHED: - return "The requested surface is not attached.\0"; - case DDERR_TOOBIGHEIGHT: - return "Height requested by DirectDraw is too large.\0"; - case DDERR_TOOBIGSIZE: - return "Size requested by DirectDraw is too large, but the individual height and width are OK.\0"; - case DDERR_TOOBIGWIDTH: - return "Width requested by DirectDraw is too large.\0"; - case DDERR_UNSUPPORTED: - return "Action not supported.\0"; - case DDERR_UNSUPPORTEDFORMAT: - return "FOURCC format requested is unsupported by DirectDraw.\0"; - case DDERR_UNSUPPORTEDMASK: - return "Bitmask in the pixel format requested is unsupported by DirectDraw.\0"; - case DDERR_VERTICALBLANKINPROGRESS: - return "Vertical blank is in progress.\0"; - case DDERR_WASSTILLDRAWING: - return "Informs DirectDraw that the previous Blt which is transfering information to or from this Surface is incomplete.\0"; - case DDERR_WRONGMODE: - return "This surface can not be restored because it was created in a different mode.\0"; - case DDERR_XALIGN: - return "Rectangle provided was not horizontally aligned on required boundary.\0"; - case D3DERR_BADMAJORVERSION: - return "D3DERR_BADMAJORVERSION\0"; - case D3DERR_BADMINORVERSION: - return "D3DERR_BADMINORVERSION\0"; - case D3DERR_EXECUTE_LOCKED: - return "D3DERR_EXECUTE_LOCKED\0"; - case D3DERR_EXECUTE_NOT_LOCKED: - return "D3DERR_EXECUTE_NOT_LOCKED\0"; - case D3DERR_EXECUTE_CREATE_FAILED: - return "D3DERR_EXECUTE_CREATE_FAILED\0"; - case D3DERR_EXECUTE_DESTROY_FAILED: - return "D3DERR_EXECUTE_DESTROY_FAILED\0"; - case D3DERR_EXECUTE_LOCK_FAILED: - return "D3DERR_EXECUTE_LOCK_FAILED\0"; - case D3DERR_EXECUTE_UNLOCK_FAILED: - return "D3DERR_EXECUTE_UNLOCK_FAILED\0"; - case D3DERR_EXECUTE_FAILED: - return "D3DERR_EXECUTE_FAILED\0"; - case D3DERR_EXECUTE_CLIPPED_FAILED: - return "D3DERR_EXECUTE_CLIPPED_FAILED\0"; - case D3DERR_TEXTURE_NO_SUPPORT: - return "D3DERR_TEXTURE_NO_SUPPORT\0"; - case D3DERR_TEXTURE_NOT_LOCKED: - return "D3DERR_TEXTURE_NOT_LOCKED\0"; - case D3DERR_TEXTURE_LOCKED: - return "D3DERR_TEXTURELOCKED\0"; - case D3DERR_TEXTURE_CREATE_FAILED: - return "D3DERR_TEXTURE_CREATE_FAILED\0"; - case D3DERR_TEXTURE_DESTROY_FAILED: - return "D3DERR_TEXTURE_DESTROY_FAILED\0"; - case D3DERR_TEXTURE_LOCK_FAILED: - return "D3DERR_TEXTURE_LOCK_FAILED\0"; - case D3DERR_TEXTURE_UNLOCK_FAILED: - return "D3DERR_TEXTURE_UNLOCK_FAILED\0"; - case D3DERR_TEXTURE_LOAD_FAILED: - return "D3DERR_TEXTURE_LOAD_FAILED\0"; - case D3DERR_MATRIX_CREATE_FAILED: - return "D3DERR_MATRIX_CREATE_FAILED\0"; - case D3DERR_MATRIX_DESTROY_FAILED: - return "D3DERR_MATRIX_DESTROY_FAILED\0"; - case D3DERR_MATRIX_SETDATA_FAILED: - return "D3DERR_MATRIX_SETDATA_FAILED\0"; - case D3DERR_SETVIEWPORTDATA_FAILED: - return "D3DERR_SETVIEWPORTDATA_FAILED\0"; - case D3DERR_MATERIAL_CREATE_FAILED: - return "D3DERR_MATERIAL_CREATE_FAILED\0"; - case D3DERR_MATERIAL_DESTROY_FAILED: - return "D3DERR_MATERIAL_DESTROY_FAILED\0"; - case D3DERR_MATERIAL_SETDATA_FAILED: - return "D3DERR_MATERIAL_SETDATA_FAILED\0"; - case D3DERR_LIGHT_SET_FAILED: - return "D3DERR_LIGHT_SET_FAILED\0"; - case D3DRMERR_BADOBJECT: - return "D3DRMERR_BADOBJECT\0"; - case D3DRMERR_BADTYPE: - return "D3DRMERR_BADTYPE\0"; - case D3DRMERR_BADALLOC: - return "D3DRMERR_BADALLOC\0"; - case D3DRMERR_FACEUSED: - return "D3DRMERR_FACEUSED\0"; - case D3DRMERR_NOTFOUND: - return "D3DRMERR_NOTFOUND\0"; - case D3DRMERR_NOTDONEYET: - return "D3DRMERR_NOTDONEYET\0"; - case D3DRMERR_FILENOTFOUND: - return "The file was not found.\0"; - case D3DRMERR_BADFILE: - return "D3DRMERR_BADFILE\0"; - case D3DRMERR_BADDEVICE: - return "D3DRMERR_BADDEVICE\0"; - case D3DRMERR_BADVALUE: - return "D3DRMERR_BADVALUE\0"; - case D3DRMERR_BADMAJORVERSION: - return "D3DRMERR_BADMAJORVERSION\0"; - case D3DRMERR_BADMINORVERSION: - return "D3DRMERR_BADMINORVERSION\0"; - case D3DRMERR_UNABLETOEXECUTE: - return "D3DRMERR_UNABLETOEXECUTE\0"; - default: - return "Unrecognized error value.\0"; - } -} diff --git a/sdk/samples/viewer/viewer.def b/sdk/samples/viewer/viewer.def deleted file mode 100644 index d86f2b6..0000000 --- a/sdk/samples/viewer/viewer.def +++ /dev/null @@ -1,10 +0,0 @@ -NAME viewer.exe - -DESCRIPTION 'Direct3DRM Object Viewer (C) Microsoft 1995, 1996' - -SECTIONS - .bss READ WRITE - .data READ WRITE - .idata READ WRITE - .rdata READ WRITE - .rsrc READ WRITE diff --git a/sdk/samples/viewer/viewer.h b/sdk/samples/viewer/viewer.h deleted file mode 100644 index 54baf52..0000000 --- a/sdk/samples/viewer/viewer.h +++ /dev/null @@ -1,63 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: viewer.h - * - ***************************************************************************/ - -#define MENU_FILE_ABOUT 1 -#define MENU_FILE_OPEN 2 -#define MENU_FILE_OPEN_ANIMSET 3 -#define MENU_FILE_OPEN_FRAME 4 -#define MENU_FILE_EXIT 5 -#define MENU_FILE_NEW_WINDOW 6 - -#define MENU_EDIT_CUT 100 -#define MENU_EDIT_COPY 101 -#define MENU_EDIT_PASTE 102 -#define MENU_EDIT_DELETE 103 -#define MENU_EDIT_COLOR 104 -#define MENU_EDIT_BOXES 105 - -#define MENU_QUALITY_LIGHTING 200 -#define MENU_QUALITY_POINTS 201 -#define MENU_QUALITY_WIREFRAME 202 -#define MENU_QUALITY_SOLID 203 -#define MENU_QUALITY_FLAT 204 -#define MENU_QUALITY_GOURAUD 205 -#define MENU_QUALITY_PHONG 206 - -#define MENU_MODEL_MONO 207 -#define MENU_MODEL_RGB 208 - -#define MENU_DITHER 209 - -#define MENU_TEXTURE_FILTERING 210 - -#define MENU_LIGHT_DIRECTIONAL 301 -#define MENU_LIGHT_PARALLEL_POINT 302 -#define MENU_LIGHT_POINT 303 -#define MENU_LIGHT_SPOT 304 - -#undef RELEASE -#ifdef __cplusplus -#define RELEASE(x) if (x != NULL) {x->Release(); x = NULL;} -#else -#define RELEASE(x) if (x != NULL) {x->lpVtbl->Release(x); x = NULL;} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -extern LPDIRECT3DRM lpD3DRM; - -char* OpenNewFile(HWND, const char *); -int ChooseNewColor(HWND, D3DCOLOR*); -LPDIRECT3DRMFRAME D3DRMLoadXAFAsFrame(const char* s); -HRESULT D3DRMLoadXAFAsList(const char* s, size_t*, LPDIRECT3DRMOBJECT**); - -#ifdef __cplusplus -} -#endif diff --git a/sdk/samples/viewer/viewer.ico b/sdk/samples/viewer/viewer.ico deleted file mode 100644 index bb39b7d..0000000 Binary files a/sdk/samples/viewer/viewer.ico and /dev/null differ diff --git a/sdk/samples/viewer/viewer.rc b/sdk/samples/viewer/viewer.rc deleted file mode 100644 index a012398..0000000 --- a/sdk/samples/viewer/viewer.rc +++ /dev/null @@ -1,85 +0,0 @@ -/*========================================================================== - * - * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved. - * - * File: viewer.rc - * - ***************************************************************************/ - -#include "windows.h" -#include "viewer.h" - -ViewerIcon ICON viewer.ico -ViewerMenu MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&About...", MENU_FILE_ABOUT - MENUITEM "&Open Mesh...", MENU_FILE_OPEN - MENUITEM "Open Ani&mation...", MENU_FILE_OPEN_ANIMSET - MENUITEM "Open &Frame...", MENU_FILE_OPEN_FRAME - MENUITEM SEPARATOR - MENUITEM "E&xit", MENU_FILE_EXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "Cu&t", MENU_EDIT_CUT - MENUITEM "&Copy", MENU_EDIT_COPY - MENUITEM "&Paste", MENU_EDIT_PASTE - MENUITEM "&Delete", MENU_EDIT_DELETE - MENUITEM SEPARATOR - MENUITEM "C&hange Color...", MENU_EDIT_COLOR - MENUITEM SEPARATOR - MENUITEM "&Bounding Boxes", MENU_EDIT_BOXES - END - POPUP "&Renderer" - BEGIN - MENUITEM "&Lighting\tCtrl+L", MENU_QUALITY_LIGHTING, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Points\tCtrl+P", MENU_QUALITY_POINTS - MENUITEM "&Wireframe\tCtrl+W", MENU_QUALITY_WIREFRAME - MENUITEM "&Solid\tCtrl+S", MENU_QUALITY_SOLID, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Flat\tCtrl+F", MENU_QUALITY_FLAT, CHECKED - MENUITEM "&Gouraud\tCtrl+G", MENU_QUALITY_GOURAUD - MENUITEM "Ph&ong\tCtrl+O", MENU_QUALITY_PHONG - MENUITEM SEPARATOR - MENUITEM "&Mono Model", MENU_MODEL_MONO, CHECKED - MENUITEM "&RGB Model", MENU_MODEL_RGB - MENUITEM SEPARATOR - MENUITEM "&Dithered\tCtrl+D", MENU_DITHER - MENUITEM "&Texture Filtering", MENU_TEXTURE_FILTERING - END - POPUP "&Lights" - BEGIN - MENUITEM "&Directional", MENU_LIGHT_DIRECTIONAL - MENUITEM "&Parallel Point", MENU_LIGHT_PARALLEL_POINT - MENUITEM "P&oint", MENU_LIGHT_POINT - MENUITEM "&Spot", MENU_LIGHT_SPOT - END -END - -ViewerAccel ACCELERATORS -BEGIN - VK_DELETE, MENU_EDIT_CUT, VIRTKEY, SHIFT - VK_INSERT, MENU_EDIT_COPY, VIRTKEY, CONTROL - VK_INSERT, MENU_EDIT_PASTE, VIRTKEY, SHIFT - VK_DELETE, MENU_EDIT_DELETE, VIRTKEY - "L", MENU_QUALITY_LIGHTING, VIRTKEY, CONTROL - "P", MENU_QUALITY_POINTS, VIRTKEY, CONTROL - "W", MENU_QUALITY_WIREFRAME, VIRTKEY, CONTROL - "S", MENU_QUALITY_SOLID, VIRTKEY, CONTROL - "F", MENU_QUALITY_FLAT, VIRTKEY, CONTROL - "G", MENU_QUALITY_GOURAUD, VIRTKEY, CONTROL - "O", MENU_QUALITY_PHONG, VIRTKEY, CONTROL - "D", MENU_DITHER, VIRTKEY, CONTROL -END - -AboutBox DIALOG 22, 17, 144, 75 - STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU - CAPTION "About Direct3D Object Viewer" - BEGIN - CTEXT "Copyright \251 1995,1996 Microsoft Corporation", -1, 0, 40, 144, 8 - DEFPUSHBUTTON "OK", IDOK, 53, 59, 32, 14, WS_GROUP - ICON "ViewerIcon", -1, 59,15,40,40 - END diff --git a/sdk/samples/watbld.mk b/sdk/samples/watbld.mk deleted file mode 100644 index ca1a4dc..0000000 --- a/sdk/samples/watbld.mk +++ /dev/null @@ -1,53 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: watbld.mk -# Content: Master makefile for WATCOM C 10.0 -# For controlling what gets built (debug, retail, clean) -# -############################################################################ - -.before - @set include=..\..\..\inc;..\..\watinc;$(%include) - -goal: debug.mak - -all : debug.mak retail.mak - -debug : debug.mak .SYMBOLIC - @%null - -retail : retail.mak .SYMBOLIC - @%null - -!ifndef MAKENAME -MAKENAME = default.mk -!endif - -debug.mak: .SYMBOLIC - @if not exist debug\nul md debug - @cd debug - @wmake -f ..\$(MAKENAME) DEBUG=1 MAKENAME=$(MAKENAME) - @cd .. - @echo *** Done making debug *** - -retail.mak: .SYMBOLIC - @if not exist retail\nul md retail - @cd retail - @wmake -f ..\$(MAKENAME) MAKENAME=$(MAKENAME) - @cd .. - @echo *** Done making retail *** - -clean: debug.cln retail.cln .SYMBOLIC - @%NULL - -debug.cln: .SYMBOLIC - @if exist debug\nul del debug < ..\yes >nul - @if exist debug\nul rd debug >nul - @echo *** debug is clean *** - -retail.cln: .SYMBOLIC - @if exist retail\nul del retail < ..\yes >nul - @if exist retail\nul rd retail >nul - @echo *** retail is clean *** diff --git a/sdk/samples/watsdk.mk b/sdk/samples/watsdk.mk deleted file mode 100644 index 42712c3..0000000 --- a/sdk/samples/watsdk.mk +++ /dev/null @@ -1,137 +0,0 @@ -############################################################################ -# -# Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. -# -# File: watsdk.mk -# Content: Rules for building the components of the SDK. -# For use with WATCOM C/C++ -# -############################################################################ - -!ifndef MSTOOLS -MSTOOLS=\mstools -!endif - -!ifndef GSDKROOT -GSDKROOT=..\..\.. -!endif - -############################################################################# -# -# Set up include & lib path -# -############################################################################# -INCLUDE=$(GSDKROOT)\inc;$(GSDKROOT)\SAMPLES\WATINC;$(%WATCOM)\h\nt;$(MSTOOLS)\include;..\..\misc;$(%WATCOM)\h;$(%WATCOM)\h\win -LIB=$(GSDKROOT)\lib;$(MSTOOLS)\LIB;$(WATCOM)\LIB386\NT;$(LIB) - -############################################################################# -# -# new suffixes -# -############################################################################# -.EXTENSIONS: -.EXTENSIONS:.exe .dll -.EXTENSIONS:.obj .res -.EXTENSIONS:.c .cpp .asm .h .rc - -############################################################################# -# -# C compiler definitions -# -############################################################################# -#CC =wcl386 -CC =wcc386 -CPPC =wpp386 -CFLAGS += -W3 #-c -!ifndef LOGO -CFLAGS += -zq -i$(INCLUDE) -!endif - -############################################################################# -# -# Linker definitions -# -############################################################################# -LINK =wlink -!ifndef LOGO -LFLAGS += option quiet -!endif - -############################################################################# -# -# resource compiler definitions -# -############################################################################# -RCFLAGS += -I..;$(%WATCOM)\h\nt;$(%WATCOM)\h -RCFLAGS += -DWIN32 -DIS_32 -D__WATCOMC__=1050 -RC = wrc - -############################################################################# -# -# assembler definitions -# -############################################################################# -ASM = ml -AFLAGS +=-DIS_32 -DWIN32 -AFLAGS +=-W3 -WX -Zd -c -Cx -DMASM6 - -############################################################################# -# -# librarian definitions -# -############################################################################# -LIBEXE = wlib - -############################################################################# -# -# targets -# -############################################################################# - -goal: $(GOALS) .SYMBOLIC - @%null - -.c: ..;..\..\misc - -.c.obj: - @%write $(NAME).cpt -D_WIN32 $(CFLAGS) -bt=NT $[* -fh -!ifdef MONKEY -# $(CC) @$(NAME).cpt $[* -fh -i..\..\misc -c -zz -DDEBUG - $(CC) @$(NAME).cpt -zz -DDEBUG -!else -# $(CC) @$(NAME).cpt $[* -fh -i..\..\misc -c -DDEBUG $[* -fh -c - $(CC) @$(NAME).cpt -!endif -# $(CC) -D_WIN32 -D_WINDOWS -DNDEBUG $(CFLAGS) -bt=NT $[* -fh - -.cpp : ..;..\..\misc - -.cpp.obj: - @%write $(NAME).cpt -D_WIN32 $(CFLAGS) -bt=NT $[* -fh -!ifdef MONKEY -# $(CPPC) @$(NAME).cpt $[* -fh -i..\..\misc -c -zz -DDEBUG - $(CPPC) @$(NAME).cpt -zz -DDEBUG -!else -# $(CPPC) @$(NAME).cpt $[* -fh -i..\..\misc -c - $(CPPC) @$(NAME).cpt -!endif -# $(CC) -D_WIN32 $(CFLAGS) -bt=NT $[* -fh - -.asm : .. - -.asm.obj: - $(ASM) $(AFLAGS) $[*.asm - -.rc : .. - -.rc.res: - $(RC) $(RCFLAGS) -bt=NT -r -fo=$^. $[*.rc - -$(NAME).lnk : ..\$(MAKENAME) ..\..\watsdk.mk ..\..\watbld.mk - @%write $(NAME).lnk debug all - @%append $(NAME).lnk system $(SYS) - @%append $(NAME).lnk op map - @%append $(NAME).lnk op st=64k - @%append $(NAME).lnk name $(NAME).exe - @for %i in ($(OBJS)) do @%append $(NAME).lnk file %i - @for %i in ($(LIBS)) do @%append $(NAME).lnk lib %i diff --git a/sdk/samples/wormhole/makefile b/sdk/samples/wormhole/makefile deleted file mode 100644 index ade5839..0000000 --- a/sdk/samples/wormhole/makefile +++ /dev/null @@ -1,2 +0,0 @@ -MAKENAME=msvc.mk -!include ..\msbld.mk diff --git a/sdk/samples/wormhole/msvc.mk b/sdk/samples/wormhole/msvc.mk deleted file mode 100644 index 6a47d48..0000000 --- a/sdk/samples/wormhole/msvc.mk +++ /dev/null @@ -1,40 +0,0 @@ -NAME = wormhole -EXT = exe - -GOALS = $(NAME).$(EXT) - -LIBS =kernel32.lib user32.lib advapi32.lib ddraw.lib \ - comdlg32.lib gdi32.lib winmm.lib libc.lib - -OBJS = wormhole.obj - -!if "$(DEBUG)" == "debug" -COPT =-YX -DDEBUG -Zi -Fd$(NAME).PDB -LOPT =-debug:full -debugtype:cv -pdb:$(NAME).pdb -ROPT =-DDEBUG -!else -COPT =-YX -LOPT =-debug:none -ROPT = -!endif -RES = $(NAME).res - -CFLAGS =$(COPT) -Oxa -D_X86_ $(CDEBUG) -Fo$@ -I..\..\misc -LFLAGS =$(LOPT) -RCFLAGS =$(ROPT) - -NOLOGO = 1 - -!include ..\..\mssdk.mk - -$(NAME).$(EXT): \ - $(OBJS) $(RES) - @$(LINK) $(LFLAGS) @<< --out:$(NAME).$(EXT) --map:$(NAME).map --machine:i386 --subsystem:windows,4.0 -$(LIBS) -$(RES) -$(OBJS) -<< diff --git a/sdk/samples/wormhole/readme.txt b/sdk/samples/wormhole/readme.txt deleted file mode 100644 index 30b6f73..0000000 --- a/sdk/samples/wormhole/readme.txt +++ /dev/null @@ -1,116 +0,0 @@ -(NOTE: this file contains extended ASCII and may not appear - correctly if your font does not support extended ASCII - characters. This file will appear correctly in the - MS-DOS Editor.) - -This effect uses palette animation. - -Here is how it works: - -Imagine a 4x4 display using 4 colors. We could set the colors -up to look something like this: - - 1 2 3 4 - 1 2 3 4 - 1 2 3 4 - 1 2 3 4 - -Now we can cycle all of the colors in each row to the right. (The -one on the right will wrap-around to the left.) - - 4 1 2 3 - 4 1 2 3 - 4 1 2 3 - 4 1 2 3 - -If we continue this cycling we would get animated lines moving -to the right. The same can be done to animate the lines going -down. i.e. - - 1 1 1 1 4 4 4 4 - 2 2 2 2 -> 1 1 1 1 - 3 3 3 3 -> 2 2 2 2 - 4 4 4 4 3 3 3 3 - -Now if we expand our palette to 16 color we can combine moving -down and right at the same time. - - Move right: - - 1 2 3 4 4 1 2 3 - 5 6 7 8 -> 8 5 6 7 - 9 10 11 12 -> 12 9 10 11 - 13 14 15 16 16 13 14 15 - - Move down: - - 1 2 3 4 13 14 15 16 - 5 6 7 8 -> 1 2 3 4 - 9 10 11 12 -> 5 6 7 8 - 13 14 15 16 9 10 11 12 - - Move right and down: - - 1 2 3 4 4 1 2 3 16 13 14 15 - 5 6 7 8 -> 8 5 6 7 -> 4 1 2 3 - 9 10 11 12 -> 12 9 10 11 -> 8 5 6 7 - 13 14 15 16 16 13 14 15 12 9 10 11 - -Now if you tile these 4x4 blocks end to end and cycle the colors -as above, you get a moving checkerboard. - - - ²±° ²±° ²±° ²±° ° ²±° ²±° ²±° ²± ²±° ²±° ²±° ²±° - ±° ²±° ²±° ²±° ² ²±° ²±° ²±° ²±° ±° ²±° ²±° ²±° ² - ° ²±° ²±° ²±° ²± ²±° ²±° ²±° ²±° ° ²±° ²±° ²±° ²± - ²±° ²±° ²±° ²±° -> ±° ²±° ²±° ²±° ² -> ²±° ²±° ²±° ²±° - ²±° ²±° ²±° ²±° -> ° ²±° ²±° ²±° ²± -> ²±° ²±° ²±° ²±° - ±° ²±° ²±° ²±° ² ²±° ²±° ²±° ²±° ±° ²±° ²±° ²±° ² - ° ²±° ²±° ²±° ²± ²±° ²±° ²±° ²±° ° ²±° ²±° ²±° ²± - ²±° ²±° ²±° ²±° ±° ²±° ²±° ²±° ² ²±° ²±° ²±° ²±° - - -Wormhole does the same thing, except it uses 15x15 blocks (225 -colors) and instead of tiling the blocks end to end on a flat -plane, it tiles them in 3D converging at the center of the -wormhole. - -The following code will generate the 3D wormhole using the -aforementioned 15x15 grids. - -//Do all the work! -//convert r,theta,z to x,y,x to screen x,y -//plot the point -//z=-1.0+(log(2.0*j/DIVS) is the line that sets the math eqn for plot -//Feel free to try other functions! -//Cylindrical coordinates, i.e. z=f(r,theta) - -#define STRETCH 25 -#define PI 3.14159265358979323846 -#define XCENTER 160 -#define YCENTER 50 -#define DIVS 1200 -#define SPOKES 2400 - -void transarray(void) - { - float x,y,z; - int i,j,color; - for(j=1;j=0)&&(x<=320)&&(y>=0)&&(y<=200)) - plot((int) x,(int) y,color); - } - } - -After loading the bitmap to a direct draw surface, all that is -left to do is rotate the colors and you have a wormhole! - diff --git a/sdk/samples/wormhole/wormhole.bmp b/sdk/samples/wormhole/wormhole.bmp deleted file mode 100644 index b0781c0..0000000 Binary files a/sdk/samples/wormhole/wormhole.bmp and /dev/null differ diff --git a/sdk/samples/wormhole/wormhole.cpp b/sdk/samples/wormhole/wormhole.cpp deleted file mode 100644 index 420b8e7..0000000 --- a/sdk/samples/wormhole/wormhole.cpp +++ /dev/null @@ -1,436 +0,0 @@ -/*************************************************************************** - * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. - ***************************************************************************/ -#include -#include - -HWND hWnd; -PALETTEENTRY pe[256]; -BOOL bActive; -BOOL bIsInitialized=FALSE; - -LPDIRECTDRAW lpDD; -LPDIRECTDRAWSURFACE lpDDSPrimary; -LPDIRECTDRAWSURFACE lpDDSOne; -LPDIRECTDRAWCLIPPER lpClipper; -LPDIRECTDRAWPALETTE lpDDPal; - -BOOL restoreAll(); -void updateFrame(); -static void finiObjects(); -long FAR PASCAL WindowProc(HWND,UINT,WPARAM,LPARAM); -BOOL initFail(HWND); -static BOOL doInit(HINSTANCE, int); -void CyclePalette(); -BOOL readBMPIntoSurfaces(); -int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int); - -BOOL restoreAll() -{ - BOOL bResult; - - bResult=lpDDSPrimary->Restore() == DD_OK && - lpDDSOne->Restore() == DD_OK; - - readBMPIntoSurfaces(); - - return(bResult); -} - -void updateFrame() -{ - RECT rcRect; - RECT destRect; - HRESULT ddrval; - POINT pt; - - rcRect.left=0; - rcRect.top=0; - rcRect.right=640; - rcRect.bottom=480; - - GetClientRect(hWnd,&destRect); - - pt.x=pt.y=0; - ClientToScreen(hWnd,&pt); - OffsetRect(&destRect,pt.x,pt.y); - - while(1) - { - ddrval=lpDDSPrimary->Blt(&destRect,lpDDSOne,&rcRect,0,NULL); - - if(ddrval==DD_OK) - { - break; - } - if(ddrval==DDERR_SURFACELOST) - { - if(!restoreAll()) - { - return; - } - continue; - } - if(ddrval!=DDERR_WASSTILLDRAWING) - { - return; - } - } -} - -static void finiObjects() -{ - if(lpDD!=NULL) - { - if(lpDDSPrimary!=NULL) - { - lpDDSPrimary->Release(); - lpDDSPrimary=NULL; - } - if(lpDDSOne!=NULL) - { - lpDDSOne->Release(); - lpDDSOne=NULL; - } - if(lpDDPal!=NULL) - { - lpDDPal->Release(); - lpDDPal=NULL; - } - lpDD->Release(); - lpDD=NULL; - } -} - -long FAR PASCAL WindowProc(HWND hWnd,UINT message, - WPARAM wParam,LPARAM lParam ) -{ - switch(message) - { - case WM_ACTIVATE: - bActive = wParam; - break; - - case WM_CREATE: - - break; - - case WM_SETCURSOR: - - SetCursor(NULL); - if( bIsInitialized ) - { - updateFrame(); - lpDDPal->GetEntries(0,0,256,pe); - } - break; - - case WM_KEYDOWN: - - switch(wParam) - { - case VK_ESCAPE: - - case VK_F12: - - PostMessage(hWnd,WM_CLOSE,0,0); - break; - } - break; - - case WM_DESTROY: - - finiObjects(); - PostQuitMessage(0); - break; - } - return DefWindowProc(hWnd,message,wParam,lParam); -} - -BOOL initFail(HWND hWnd) -{ - finiObjects(); - MessageBox(hWnd,"DirectDraw Init FAILED","WormHole",MB_OK); - DestroyWindow(hWnd); - return FALSE; -} - -static BOOL doInit(HINSTANCE hInstance,int nCmdShow) -{ - WNDCLASS wc; - DDSURFACEDESC ddsd; - HRESULT ddrval; - - wc.style= CS_HREDRAW|CS_VREDRAW; - wc.lpfnWndProc= WindowProc; - wc.cbClsExtra= 0; - wc.cbWndExtra= 0; - wc.hInstance= hInstance; - wc.hIcon= LoadIcon(hInstance,IDI_APPLICATION); - wc.hCursor= LoadCursor(NULL,IDC_ARROW); - wc.hbrBackground= NULL; - wc.lpszMenuName= NULL; - wc.lpszClassName= "WormHole"; - RegisterClass(&wc); - - hWnd=CreateWindowEx( - 0, - "WormHole", - "WormHole", - WS_POPUP, - 0, - 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, - NULL, - hInstance, - NULL ); - - if(!hWnd) - { - return FALSE; - } - - ShowWindow(hWnd,nCmdShow); - UpdateWindow(hWnd); - - ddrval=DirectDrawCreate(NULL,&lpDD,NULL); - - if(ddrval!=DD_OK) - { - return initFail(hWnd); - } - - ddrval=lpDD->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN); - ddrval=lpDD->SetDisplayMode(640,480,8); - - if(ddrval!=DD_OK) - { - return initFail(hWnd); - } - - ddsd.dwSize=sizeof(ddsd); - ddsd.dwFlags=DDSD_CAPS; - ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE; - - ddrval=lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL); - - if(ddrval!=DD_OK) - { - return initFail(hWnd); - } - - ddsd.dwSize=sizeof(ddsd); - ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; - ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; - ddsd.dwWidth=640; - ddsd.dwHeight=480; - - lpDD->CreateSurface(&ddsd,&lpDDSOne,NULL); - if(lpDDSOne==NULL) - { - return initFail(hWnd); - } - - bIsInitialized = TRUE; - return TRUE; -} - -void CyclePalette() -{ - int reg[15]; - int k; - - for(k=0;k<15;k++) - { - reg[k]=pe[k+30].peRed; - } - for(k=45;k<255;k++) - { - pe[k-15].peRed=pe[k].peRed; - } - for(k=0;k<15;k++) - { - pe[k+240].peRed=reg[k]; - } - for(k=0;k<15;k++) - { - reg[k]=pe[k+30].peGreen; - } - for(k=45;k<255;k++) - { - pe[k-15].peGreen=pe[k].peGreen; - } - for(k=0;k<15;k++) - { - pe[k+240].peGreen=reg[k]; - } - for(k=0;k<15;k++) - { - reg[k]=pe[k+30].peBlue; - } - for(k=45;k<255;k++) - { - pe[k-15].peBlue=pe[k].peBlue; - } - for(k=0;k<15;k++) - { - pe[k+240].peBlue=reg[k]; - } - - for(k=2;k<17;k++) - { - reg[k-2]=pe[15*k+14].peRed; - pe[15*k+14].peRed=pe[15*k+13].peRed; - pe[15*k+13].peRed=pe[15*k+12].peRed; - pe[15*k+12].peRed=pe[15*k+11].peRed; - pe[15*k+11].peRed=pe[15*k+10].peRed; - pe[15*k+10].peRed=pe[15*k+9].peRed; - pe[15*k+9].peRed=pe[15*k+8].peRed; - pe[15*k+8].peRed=pe[15*k+7].peRed; - pe[15*k+7].peRed=pe[15*k+6].peRed; - pe[15*k+6].peRed=pe[15*k+5].peRed; - pe[15*k+5].peRed=pe[15*k+4].peRed; - pe[15*k+4].peRed=pe[15*k+3].peRed; - pe[15*k+3].peRed=pe[15*k+2].peRed; - pe[15*k+2].peRed=pe[15*k+1].peRed; - pe[15*k+1].peRed=pe[15*k].peRed; - pe[15*k].peRed=reg[k-2]; - reg[k-2]=pe[15*k+14].peGreen; - pe[15*k+14].peGreen=pe[15*k+13].peGreen; - pe[15*k+13].peGreen=pe[15*k+12].peGreen; - pe[15*k+12].peGreen=pe[15*k+11].peGreen; - pe[15*k+11].peGreen=pe[15*k+10].peGreen; - pe[15*k+10].peGreen=pe[15*k+9].peGreen; - pe[15*k+9].peGreen=pe[15*k+8].peGreen; - pe[15*k+8].peGreen=pe[15*k+7].peGreen; - pe[15*k+7].peGreen=pe[15*k+6].peGreen; - pe[15*k+6].peGreen=pe[15*k+5].peGreen; - pe[15*k+5].peGreen=pe[15*k+4].peGreen; - pe[15*k+4].peGreen=pe[15*k+3].peGreen; - pe[15*k+3].peGreen=pe[15*k+2].peGreen; - pe[15*k+2].peGreen=pe[15*k+1].peGreen; - pe[15*k+1].peGreen=pe[15*k].peGreen; - pe[15*k].peGreen=reg[k-2]; - reg[k-2]=pe[15*k+14].peBlue; - pe[15*k+14].peBlue=pe[15*k+13].peBlue; - pe[15*k+13].peBlue=pe[15*k+12].peBlue; - pe[15*k+12].peBlue=pe[15*k+11].peBlue; - pe[15*k+11].peBlue=pe[15*k+10].peBlue; - pe[15*k+10].peBlue=pe[15*k+9].peBlue; - pe[15*k+9].peBlue=pe[15*k+8].peBlue; - pe[15*k+8].peBlue=pe[15*k+7].peBlue; - pe[15*k+7].peBlue=pe[15*k+6].peBlue; - pe[15*k+6].peBlue=pe[15*k+5].peBlue; - pe[15*k+5].peBlue=pe[15*k+4].peBlue; - pe[15*k+4].peBlue=pe[15*k+3].peBlue; - pe[15*k+3].peBlue=pe[15*k+2].peBlue; - pe[15*k+2].peBlue=pe[15*k+1].peBlue; - pe[15*k+1].peBlue=pe[15*k].peBlue; - pe[15*k].peBlue=reg[k-2]; - } - - lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN,NULL); - - if(lpDDPal->SetEntries(0,0,256,pe)!=DD_OK) - { - return; - } -} - -BOOL readBMPIntoSurfaces() -{ - HRESULT ddrval; - HRSRC hBMP; - RGBQUAD Palette[256]; - PALETTEENTRY pe[256]; - DDSURFACEDESC DDSDesc; - LPSTR lpBits; - LPSTR lpSrc; - BYTE *lpBMP; - int i; - - hBMP=FindResource(NULL,"wormhole.bmp",RT_BITMAP); - if( hBMP == NULL ) - { - return FALSE; - } - - lpBMP=(BYTE *)LockResource(LoadResource(NULL, hBMP)); - - memcpy(Palette,&lpBMP[sizeof(BITMAPINFOHEADER)],sizeof(Palette)); - - FreeResource(hBMP); - - for(i=0;i<256;i++) - { - pe[i].peRed=Palette[i].rgbRed; - pe[i].peGreen=Palette[i].rgbGreen; - pe[i].peBlue=Palette[i].rgbBlue; - } - - ddrval=lpDD->CreatePalette(DDPCAPS_8BIT,pe,&lpDDPal,NULL); - - if(ddrval!=DD_OK) - { - return FALSE; - } - - lpDDSPrimary->SetPalette(lpDDPal); - - DDSDesc.dwSize=sizeof(DDSDesc); - ddrval=lpDDSOne->Lock(NULL,&DDSDesc,0,NULL); - if(ddrval!=DD_OK) - { - return FALSE; - } - - lpBits=(LPSTR)DDSDesc.lpSurface; - lpSrc=(LPSTR) - (&lpBMP[sizeof(BITMAPINFOHEADER)+sizeof(Palette)+(640*480)]); - for(i=0;i<480;i++) - { - memcpy(lpBits,lpSrc,640); - lpBits+=DDSDesc.lPitch; - lpSrc-=640; - } - lpDDSOne->Unlock(NULL); - - return TRUE; -} - -int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, - LPSTR lpCmdLine,int nCmdShow) -{ - MSG msg; - - if(!doInit(hInstance,nCmdShow)) - { - return FALSE; - } - - readBMPIntoSurfaces(); - updateFrame(); - - while(1) - { - if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) - { - if(!GetMessage(&msg,NULL,0,0)) - { - return msg.wParam; - } - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else if(bActive) - { - CyclePalette(); - } - else - { - WaitMessage(); - } - } -} diff --git a/sdk/samples/wormhole/wormhole.rc b/sdk/samples/wormhole/wormhole.rc deleted file mode 100644 index 5581cff..0000000 --- a/sdk/samples/wormhole/wormhole.rc +++ /dev/null @@ -1 +0,0 @@ -wormhole.bmp BITMAP MOVEABLE PURE "wormhole.bmp" diff --git a/sdk/samples/yes b/sdk/samples/yes deleted file mode 100644 index 975fbec..0000000 --- a/sdk/samples/yes +++ /dev/null @@ -1 +0,0 @@ -y