lets do this properly.
git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1144 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
18
BluntDx/AssemblyInfo.cpp
Normal file
18
BluntDx/AssemblyInfo.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
using namespace System;
|
||||
using namespace System::Reflection;
|
||||
using namespace System::Runtime::CompilerServices;
|
||||
using namespace System::Runtime::InteropServices;
|
||||
using namespace System::Security::Permissions;
|
||||
|
||||
[assembly:AssemblyTitleAttribute("BluntDx")];
|
||||
[assembly:AssemblyDescriptionAttribute("BluntDirectX Lightweight MDX Replacement")];
|
||||
[assembly:AssemblyConfigurationAttribute("")];
|
||||
[assembly:AssemblyCompanyAttribute("C Forbes & Associates")];
|
||||
[assembly:AssemblyProductAttribute("BluntDx")];
|
||||
[assembly:AssemblyCopyrightAttribute("Copyright (c) C Forbes & Associates 2006")];
|
||||
[assembly:AssemblyTrademarkAttribute("")];
|
||||
[assembly:AssemblyCultureAttribute("")];
|
||||
[assembly:AssemblyVersionAttribute("1.0.*")];
|
||||
[assembly:ComVisible(false)];
|
||||
[assembly:CLSCompliantAttribute(true)];
|
||||
[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
|
||||
270
BluntDx/BluntDx.vcproj
Normal file
270
BluntDx/BluntDx.vcproj
Normal file
@@ -0,0 +1,270 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="BluntDx"
|
||||
ProjectGUID="{4EA97564-C929-4ABE-AC5D-A9D11EDE08E1}"
|
||||
RootNamespace="BluntDx"
|
||||
Keyword="ManagedCProj"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
ManagedExtensions="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(NoInherit)"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
AssemblyDebug="1"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
CommandLine=""
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
ManagedExtensions="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="$(NoInherit)"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
CommandLine="copy "$(TargetPath)" "$(SolutionDir)bin\""
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<AssemblyReference
|
||||
RelativePath="System.dll"
|
||||
AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
|
||||
/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\AssemblyInfo.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Direct3D.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\DirectInput.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Utilities.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Direct3D"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Effect.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Enumerations.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\FontHelper.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\GraphicsDevice.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ImageInformation.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Mesh.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SpriteHelper.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Texture.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\VertexBuffer.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="DirectInput"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\InputDevice.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InputManager.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\JoystickState.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\KeyboardState.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\MouseState.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
39
BluntDx/Direct3D.cpp
Normal file
39
BluntDx/Direct3D.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
#pragma comment(lib, "d3d9.lib")
|
||||
#pragma comment(lib, "d3dx9.lib")
|
||||
#pragma comment(lib, "user32.lib")
|
||||
#pragma comment(lib, "gdi32.lib")
|
||||
|
||||
#pragma unmanaged
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _WIN32_WINNT 0x0500
|
||||
|
||||
#include <windows.h>
|
||||
#include <d3d9.h>
|
||||
#include <d3dx9.h>
|
||||
|
||||
#pragma managed
|
||||
|
||||
#include <vcclr.h>
|
||||
|
||||
#pragma once
|
||||
|
||||
#using "System.Drawing.dll"
|
||||
#using "System.Windows.Forms.dll"
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Windows::Forms;
|
||||
using namespace System::IO;
|
||||
using namespace System::Drawing;
|
||||
|
||||
#include "Utilities.h"
|
||||
|
||||
#include "Enumerations.h"
|
||||
#include "GraphicsDevice.h"
|
||||
#include "ImageInformation.h"
|
||||
#include "Texture.h"
|
||||
#include "SpriteHelper.h"
|
||||
#include "FontHelper.h"
|
||||
#include "Mesh.h"
|
||||
#include "Effect.h"
|
||||
#include "VertexBuffer.h"
|
||||
37
BluntDx/DirectInput.cpp
Normal file
37
BluntDx/DirectInput.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#pragma comment(lib, "dxguid.lib")
|
||||
#pragma comment(lib, "dinput8.lib")
|
||||
#pragma comment(lib, "user32.lib")
|
||||
#pragma comment(lib, "gdi32.lib")
|
||||
|
||||
#pragma unmanaged
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _WIN32_WINNT 0x0500
|
||||
|
||||
#define INITGUID
|
||||
#define DIRECTINPUT_VERSION 0x0800
|
||||
|
||||
#include <windows.h>
|
||||
#include <dinput.h>
|
||||
|
||||
#pragma managed
|
||||
|
||||
#include <vcclr.h>
|
||||
|
||||
#pragma once
|
||||
|
||||
#using "System.Drawing.dll"
|
||||
#using "System.Windows.Forms.dll"
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Windows::Forms;
|
||||
using namespace System::IO;
|
||||
using namespace System::Drawing;
|
||||
|
||||
#include "Utilities.h"
|
||||
|
||||
#include "InputManager.h"
|
||||
#include "KeyboardState.h"
|
||||
#include "MouseState.h"
|
||||
#include "JoystickState.h"
|
||||
#include "InputDevice.h"
|
||||
165
BluntDx/Effect.h
Normal file
165
BluntDx/Effect.h
Normal file
@@ -0,0 +1,165 @@
|
||||
#pragma once
|
||||
|
||||
using namespace System::Collections::Generic;
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public enum class ShaderQuality
|
||||
{
|
||||
Low,
|
||||
Medium,
|
||||
High,
|
||||
};
|
||||
|
||||
public ref class Effect
|
||||
{
|
||||
private:
|
||||
static ID3DXEffectPool* effectPool;
|
||||
|
||||
static Effect()
|
||||
{
|
||||
ID3DXEffectPool* e;
|
||||
D3DXCreateEffectPool( &e );
|
||||
effectPool = e;
|
||||
}
|
||||
|
||||
ShaderQuality shaderQuality;
|
||||
|
||||
internal:
|
||||
ID3DXEffect* effect;
|
||||
|
||||
public:
|
||||
Effect(GraphicsDevice^ device, Stream^ data)
|
||||
{
|
||||
ID3DXEffect* e;
|
||||
ID3DXBuffer* compilationErrors;
|
||||
HRESULT hr;
|
||||
|
||||
data->Position = 0;
|
||||
array<unsigned char>^ bytes = gcnew array<unsigned char>((int)data->Length);
|
||||
data->Read( bytes, 0, (int)data->Length );
|
||||
|
||||
pin_ptr<unsigned char> pdata = &bytes[0];
|
||||
|
||||
if (FAILED( hr = D3DXCreateEffect( device->device, pdata, (UINT)data->Length, NULL, NULL,
|
||||
D3DXSHADER_PACKMATRIX_COLUMNMAJOR | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, effectPool, &e, &compilationErrors ) ))
|
||||
{
|
||||
String^ errors = gcnew String((char*)compilationErrors->GetBufferPointer());
|
||||
compilationErrors->Release();
|
||||
|
||||
throw gcnew InvalidOperationException( String::Format(
|
||||
"Failed compiling shader; HRESULT={0}, Errors:\n{1}",
|
||||
hr, errors ));
|
||||
}
|
||||
|
||||
effect = e;
|
||||
Quality = ShaderQuality::High;
|
||||
}
|
||||
|
||||
IntPtr GetHandle( String^ symbol )
|
||||
{
|
||||
array<unsigned char>^ chars = System::Text::Encoding::ASCII->GetBytes(symbol);
|
||||
pin_ptr<const unsigned char> p = &chars[0];
|
||||
IntPtr result = IntPtr((void*)effect->GetParameterByName(NULL, (char*)p));
|
||||
return result;
|
||||
}
|
||||
|
||||
~Effect()
|
||||
{
|
||||
safe_release( effect );
|
||||
}
|
||||
|
||||
property ShaderQuality Quality
|
||||
{
|
||||
ShaderQuality get() { return shaderQuality; }
|
||||
void set( ShaderQuality s )
|
||||
{
|
||||
if (shaderQuality == s)
|
||||
return;
|
||||
|
||||
shaderQuality = s;
|
||||
switch(s)
|
||||
{
|
||||
case ShaderQuality::High:
|
||||
if (SUCCEEDED(effect->SetTechnique( "high_quality" )))
|
||||
break;
|
||||
case ShaderQuality::Medium:
|
||||
if (SUCCEEDED(effect->SetTechnique( "med_quality" )))
|
||||
break;
|
||||
case ShaderQuality::Low:
|
||||
if (SUCCEEDED(effect->SetTechnique( "low_quality" )))
|
||||
break;
|
||||
default:
|
||||
throw gcnew Exception( "Invalid shader quality" );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void Commit()
|
||||
{
|
||||
effect->CommitChanges();
|
||||
}
|
||||
|
||||
int Begin()
|
||||
{
|
||||
unsigned int passes;
|
||||
effect->Begin( &passes, D3DXFX_DONOTSAVESTATE | D3DXFX_DONOTSAVESHADERSTATE );
|
||||
return passes;
|
||||
}
|
||||
|
||||
void End()
|
||||
{
|
||||
effect->End();
|
||||
}
|
||||
|
||||
void BeginPass(int pass)
|
||||
{
|
||||
effect->BeginPass( pass );
|
||||
}
|
||||
|
||||
void EndPass()
|
||||
{
|
||||
effect->EndPass();
|
||||
}
|
||||
|
||||
generic< typename T> where T : value class
|
||||
void SetValue( IntPtr handle, T value )
|
||||
{
|
||||
pin_ptr<T> pvalue = &value;
|
||||
effect->SetValue( (D3DXHANDLE)handle.ToPointer(), pvalue, sizeof(T) );
|
||||
}
|
||||
|
||||
void SetTexture( IntPtr handle, Texture^ texture )
|
||||
{
|
||||
effect->SetTexture( (D3DXHANDLE)handle.ToPointer(), texture->texture );
|
||||
}
|
||||
|
||||
property array<KeyValuePair<IntPtr, String^>>^ ShaderResources
|
||||
{
|
||||
array<KeyValuePair<IntPtr, String^>>^ get()
|
||||
{
|
||||
List<KeyValuePair<IntPtr, String^>>^ resources = gcnew List<KeyValuePair<IntPtr, String^>>();
|
||||
int id = 0;
|
||||
D3DXHANDLE parameter;
|
||||
|
||||
while( parameter = effect->GetParameter( NULL, id++ ) )
|
||||
{
|
||||
D3DXHANDLE annotation;
|
||||
|
||||
if (!(annotation = effect->GetAnnotationByName( parameter, "src" )))
|
||||
continue;
|
||||
|
||||
char* value;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = effect->GetString( annotation, (LPCSTR*)&value )))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
resources->Add( KeyValuePair<IntPtr, String^>( IntPtr( (void*)parameter ), gcnew String(value) ) );
|
||||
}
|
||||
|
||||
return resources->ToArray();
|
||||
}
|
||||
}
|
||||
};
|
||||
}}
|
||||
27
BluntDx/Enumerations.h
Normal file
27
BluntDx/Enumerations.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
[Flags]
|
||||
public enum class Surfaces
|
||||
{
|
||||
None = 0,
|
||||
Color = D3DCLEAR_TARGET,
|
||||
Depth = D3DCLEAR_ZBUFFER,
|
||||
};
|
||||
|
||||
[Flags]
|
||||
public enum class VertexFormat
|
||||
{
|
||||
None = 0,
|
||||
Position = D3DFVF_XYZ,
|
||||
Normal = D3DFVF_NORMAL,
|
||||
Texture = D3DFVF_TEX1,
|
||||
};
|
||||
|
||||
public enum class PrimitiveType
|
||||
{
|
||||
PointList = D3DPT_POINTLIST,
|
||||
TriangleList = D3DPT_TRIANGLELIST,
|
||||
};
|
||||
}}
|
||||
56
BluntDx/FontHelper.h
Normal file
56
BluntDx/FontHelper.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public ref class FontHelper
|
||||
{
|
||||
private:
|
||||
static int MakeLogicalFontHeight( int emSize )
|
||||
{
|
||||
int result;
|
||||
HDC hdc = GetDC(NULL);
|
||||
result = -MulDiv( emSize, GetDeviceCaps( hdc, LOGPIXELSY ), 72 );
|
||||
ReleaseDC( NULL, hdc );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal:
|
||||
ID3DXFont* font;
|
||||
|
||||
public:
|
||||
FontHelper( GraphicsDevice^ device, String^ face, int emSize, bool bold )
|
||||
{
|
||||
HRESULT hr;
|
||||
ID3DXFont* f;
|
||||
|
||||
pin_ptr<const wchar_t> uface = PtrToStringChars(face);
|
||||
|
||||
int height = MakeLogicalFontHeight( emSize );
|
||||
|
||||
if (FAILED(
|
||||
hr = D3DXCreateFont( device->device, height, 0, bold ? FW_BOLD : FW_NORMAL, 1, false,
|
||||
DEFAULT_CHARSET, OUT_STRING_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
|
||||
uface, &f)))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
font = f;
|
||||
}
|
||||
|
||||
void Draw( SpriteHelper^ sprite, String^ text, int x, int y, int color )
|
||||
{
|
||||
pin_ptr<const wchar_t> utext = PtrToStringChars(text);
|
||||
RECT r = {x, y, x+1, y+1};
|
||||
font->DrawText( sprite->sprite, utext, -1, &r, DT_LEFT | DT_NOCLIP, color );
|
||||
}
|
||||
|
||||
Size MeasureText( SpriteHelper^ sprite, String^ text )
|
||||
{
|
||||
pin_ptr<const wchar_t> utext = PtrToStringChars(text);
|
||||
RECT r = {0,0,1,1};
|
||||
int height = font->DrawText( sprite->sprite, utext, -1, &r, DT_LEFT | DT_CALCRECT, 0 );
|
||||
|
||||
return Size( r.right - r.left, height );
|
||||
}
|
||||
};
|
||||
}}
|
||||
168
BluntDx/GraphicsDevice.h
Normal file
168
BluntDx/GraphicsDevice.h
Normal file
@@ -0,0 +1,168 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public ref class GraphicsDevice
|
||||
{
|
||||
private:
|
||||
GraphicsDevice( IDirect3DDevice9* device, bool hasHardwareVp ) : device( device ), hardwareVp( hasHardwareVp )
|
||||
{
|
||||
IDirect3DSurface9* s;
|
||||
device->GetRenderTarget(0, &s);
|
||||
defaultSurface = s;
|
||||
}
|
||||
|
||||
bool hardwareVp;
|
||||
|
||||
internal:
|
||||
IDirect3DDevice9* device;
|
||||
IDirect3DSurface9* defaultSurface;
|
||||
|
||||
void SetRenderTarget( IDirect3DSurface9* surface )
|
||||
{
|
||||
if (surface == nullptr)
|
||||
surface = defaultSurface;
|
||||
|
||||
device->SetRenderTarget( 0, surface );
|
||||
}
|
||||
|
||||
public:
|
||||
void BindDefaultRenderTarget()
|
||||
{
|
||||
SetRenderTarget( nullptr );
|
||||
}
|
||||
|
||||
void BindSurface( IntPtr p )
|
||||
{
|
||||
SetRenderTarget( (IDirect3DSurface9*) p.ToPointer() );
|
||||
}
|
||||
|
||||
IntPtr GetDefaultSurface()
|
||||
{
|
||||
return IntPtr(defaultSurface);
|
||||
}
|
||||
|
||||
void Begin()
|
||||
{
|
||||
device->BeginScene();
|
||||
}
|
||||
|
||||
void End()
|
||||
{
|
||||
device->EndScene();
|
||||
}
|
||||
|
||||
~GraphicsDevice()
|
||||
{
|
||||
safe_release( device );
|
||||
}
|
||||
|
||||
void Clear( int color )
|
||||
{
|
||||
device->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, (D3DCOLOR)color, 1.0f, 0 );
|
||||
}
|
||||
|
||||
void Clear( int color, Surfaces surfaces )
|
||||
{
|
||||
device->Clear( 0, NULL, (DWORD)surfaces, (D3DCOLOR)color, 1.0f, 0 );
|
||||
}
|
||||
|
||||
void Present()
|
||||
{
|
||||
device->Present(NULL,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
property bool HasHardwareVP
|
||||
{
|
||||
bool get() { return hardwareVp; }
|
||||
}
|
||||
|
||||
static GraphicsDevice^ CreateRenderless()
|
||||
{
|
||||
IDirect3D9* d3d = Direct3DCreate9( D3D_SDK_VERSION );
|
||||
D3DPRESENT_PARAMETERS pp;
|
||||
memset( &pp, 0, sizeof(pp) );
|
||||
|
||||
pp.BackBufferCount = 1;
|
||||
pp.BackBufferFormat = D3DFMT_UNKNOWN;
|
||||
pp.BackBufferWidth = pp.BackBufferHeight = 1;
|
||||
pp.SwapEffect = D3DSWAPEFFECT_COPY;
|
||||
pp.Windowed = true;
|
||||
|
||||
IDirect3DDevice9* dev;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF, GetConsoleWindow(),
|
||||
D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &dev)))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
return gcnew GraphicsDevice( dev, true );
|
||||
}
|
||||
|
||||
static GraphicsDevice^ Create(Control^ host, int width, int height, bool windowed, bool vsync)
|
||||
{
|
||||
IDirect3D9* d3d = Direct3DCreate9( D3D_SDK_VERSION );
|
||||
D3DPRESENT_PARAMETERS pp;
|
||||
memset( &pp, 0, sizeof(pp) );
|
||||
|
||||
pp.BackBufferCount = vsync ? 1 : 2;
|
||||
pp.BackBufferWidth = width;
|
||||
pp.BackBufferHeight = height;
|
||||
pp.BackBufferFormat = D3DFMT_X8R8G8B8;
|
||||
|
||||
pp.AutoDepthStencilFormat = D3DFMT_D24X8;
|
||||
pp.EnableAutoDepthStencil = true;
|
||||
pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
|
||||
pp.Windowed = windowed;
|
||||
pp.PresentationInterval = (vsync && !windowed) ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
|
||||
|
||||
DWORD flags[] = {
|
||||
D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING,
|
||||
D3DCREATE_HARDWARE_VERTEXPROCESSING,
|
||||
D3DCREATE_MIXED_VERTEXPROCESSING,
|
||||
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||||
0
|
||||
};
|
||||
|
||||
DWORD* pf = &flags[0];
|
||||
while(*pf)
|
||||
{
|
||||
IDirect3DDevice9* pd;
|
||||
HRESULT hr;
|
||||
|
||||
bool configHasHardwareVp = 0 != (*pf & D3DCREATE_HARDWARE_VERTEXPROCESSING);
|
||||
|
||||
if (SUCCEEDED( hr = d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, (HWND)host->Handle.ToInt32(),
|
||||
*pf, &pp, &pd)))
|
||||
return gcnew GraphicsDevice( pd, configHasHardwareVp );
|
||||
|
||||
++pf;
|
||||
}
|
||||
|
||||
throw gcnew ApplicationException("D3D not available.");
|
||||
}
|
||||
|
||||
void EnableScissor( int left, int top, int width, int height )
|
||||
{
|
||||
RECT r = { left, top, width, height };
|
||||
device->SetScissorRect( &r );
|
||||
device->SetRenderState( D3DRS_SCISSORTESTENABLE, true );
|
||||
}
|
||||
|
||||
void DisableScissor()
|
||||
{
|
||||
device->SetRenderState( D3DRS_SCISSORTESTENABLE, false );
|
||||
}
|
||||
|
||||
void DrawPrimitives(PrimitiveType primtype, int count)
|
||||
{
|
||||
device->DrawPrimitive( (D3DPRIMITIVETYPE)primtype, 0, count );
|
||||
}
|
||||
|
||||
void DrawIndexedPrimitives(PrimitiveType primtype, int vertexPoolSize, int numPrimitives)
|
||||
{
|
||||
device->DrawIndexedPrimitive( (D3DPRIMITIVETYPE)primtype, 0, 0, vertexPoolSize, 0, numPrimitives );
|
||||
}
|
||||
};
|
||||
}}
|
||||
36
BluntDx/ImageInformation.h
Normal file
36
BluntDx/ImageInformation.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public value class ImageInformation
|
||||
{
|
||||
private:
|
||||
ImageInformation( int width, int height, int depth, bool isCube )
|
||||
: Width( width ), Height( height ), Depth( depth ), IsCube( isCube ) {}
|
||||
|
||||
public:
|
||||
int Width;
|
||||
int Height;
|
||||
int Depth;
|
||||
bool IsCube;
|
||||
|
||||
static ImageInformation Create( Stream^ stream )
|
||||
{
|
||||
D3DXIMAGE_INFO info;
|
||||
|
||||
stream->Position = 0;
|
||||
array<unsigned char>^ data = gcnew array<unsigned char>( (int)stream->Length );
|
||||
stream->Read( data, 0, data->Length );
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
pin_ptr<unsigned char> p = &data[0];
|
||||
|
||||
if (FAILED( hr = D3DXGetImageInfoFromFileInMemory( p, data->Length, &info )))
|
||||
throw gcnew InvalidOperationException( "image information load failed" );
|
||||
|
||||
return ImageInformation( info.Width, info.Height, info.Depth,
|
||||
info.ResourceType == D3DRTYPE_CUBETEXTURE );
|
||||
}
|
||||
};
|
||||
}}
|
||||
153
BluntDx/InputDevice.h
Normal file
153
BluntDx/InputDevice.h
Normal file
@@ -0,0 +1,153 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace DirectInput
|
||||
{
|
||||
[Flags]
|
||||
public enum class CooperativeLevel
|
||||
{
|
||||
OnlyWhenFocused = 0x1,
|
||||
Exclusive = 0x2,
|
||||
DisableWindowsKey = 0x4,
|
||||
};
|
||||
|
||||
public enum class DeviceType
|
||||
{
|
||||
Keyboard,
|
||||
Mouse,
|
||||
Joystick,
|
||||
};
|
||||
|
||||
public ref class DiInputDevice
|
||||
{
|
||||
private:
|
||||
DiInputDevice( IDirectInputDevice8* device )
|
||||
: device(device), devtype( DeviceType::Joystick ) {}
|
||||
|
||||
internal:
|
||||
IDirectInputDevice8* device;
|
||||
DeviceType devtype;
|
||||
|
||||
public:
|
||||
static property Guid SystemKeyboard
|
||||
{
|
||||
Guid get()
|
||||
{
|
||||
return *(Guid*)&GUID_SysKeyboard;
|
||||
}
|
||||
}
|
||||
|
||||
static property Guid SystemMouse
|
||||
{
|
||||
Guid get()
|
||||
{
|
||||
return *(Guid*)&GUID_SysMouse;
|
||||
}
|
||||
}
|
||||
|
||||
DiInputDevice( InputManager^ manager, Guid guid, DeviceType devtype ) : devtype( devtype )
|
||||
{
|
||||
HRESULT hr;
|
||||
IDirectInputDevice8* _device;
|
||||
|
||||
GUID* p = (GUID*)&guid;
|
||||
|
||||
if (FAILED( hr = manager->di->CreateDevice( *p, &_device, NULL )))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
device = _device;
|
||||
}
|
||||
|
||||
void SetCooperativeLevel( Control^ host, CooperativeLevel level)
|
||||
{
|
||||
int _level = (int)level;
|
||||
DWORD flags = 0;
|
||||
HRESULT hr;
|
||||
|
||||
flags |= ((_level & (int)CooperativeLevel::OnlyWhenFocused) ? DISCL_FOREGROUND : DISCL_BACKGROUND);
|
||||
flags |= ((_level & (int)CooperativeLevel::Exclusive) ? DISCL_EXCLUSIVE : DISCL_NONEXCLUSIVE);
|
||||
if (_level & (int)CooperativeLevel::DisableWindowsKey)
|
||||
flags |= DISCL_NOWINKEY;
|
||||
|
||||
if (FAILED( hr = device->SetCooperativeLevel( (HWND)host->Handle.ToInt32(), flags ) ))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
if (devtype == DeviceType::Keyboard)
|
||||
device->SetDataFormat( &c_dfDIKeyboard );
|
||||
else if (devtype == DeviceType::Mouse)
|
||||
device->SetDataFormat( &c_dfDIMouse );
|
||||
}
|
||||
|
||||
void Acquire()
|
||||
{
|
||||
HRESULT hr;
|
||||
if (FAILED(hr = device->Acquire()))
|
||||
ThrowHelper::Hr(hr);
|
||||
}
|
||||
|
||||
void Unacquire()
|
||||
{
|
||||
HRESULT hr;
|
||||
if (FAILED(hr = device->Unacquire()))
|
||||
ThrowHelper::Hr(hr);
|
||||
}
|
||||
|
||||
void Poll()
|
||||
{
|
||||
HRESULT hr;
|
||||
if (FAILED(hr = device->Poll()))
|
||||
ThrowHelper::Hr(hr);
|
||||
}
|
||||
|
||||
KeyboardState^ GetKeyboardState()
|
||||
{
|
||||
char buffer[256];
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = device->GetDeviceState(sizeof(buffer), (void*)buffer)))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
array<bool>^ result = gcnew array<bool>(256);
|
||||
|
||||
for( int i=0; i<256; i++ )
|
||||
result[i] = (buffer[i] & 0x80) != 0;
|
||||
|
||||
return gcnew KeyboardState(result);
|
||||
}
|
||||
|
||||
MouseState^ GetMouseState()
|
||||
{
|
||||
MouseData mouse;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = device->GetDeviceState(sizeof(mouse), (void*)&mouse)))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
return gcnew MouseState(mouse);
|
||||
}
|
||||
|
||||
JoystickState^ GetJoystickState()
|
||||
{
|
||||
DIJOYSTATE state;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = device->GetDeviceState(sizeof(state), (void*)&state)))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
return gcnew JoystickState( &state );
|
||||
}
|
||||
|
||||
~DiInputDevice()
|
||||
{
|
||||
safe_release( device );
|
||||
}
|
||||
|
||||
static DiInputDevice^ GetJoystick( InputManager^ manager )
|
||||
{
|
||||
IDirectInputDevice8* dev = CreateAndConfigureJoystick( manager->di );
|
||||
if (dev == nullptr)
|
||||
return nullptr;
|
||||
|
||||
return gcnew DiInputDevice( dev );
|
||||
}
|
||||
};
|
||||
}}
|
||||
30
BluntDx/InputManager.h
Normal file
30
BluntDx/InputManager.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace DirectInput
|
||||
{
|
||||
public ref class InputManager
|
||||
{
|
||||
private:
|
||||
|
||||
internal:
|
||||
IDirectInput8* di;
|
||||
|
||||
public:
|
||||
InputManager()
|
||||
{
|
||||
HINSTANCE hinst = GetModuleHandle(0);
|
||||
HRESULT hr;
|
||||
IDirectInput8* _di;
|
||||
|
||||
if (FAILED( hr = DirectInput8Create( hinst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&_di, NULL )))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
di = _di;
|
||||
}
|
||||
|
||||
~InputManager()
|
||||
{
|
||||
safe_release(di);
|
||||
}
|
||||
};
|
||||
}}
|
||||
159
BluntDx/JoystickState.h
Normal file
159
BluntDx/JoystickState.h
Normal file
@@ -0,0 +1,159 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace DirectInput {
|
||||
|
||||
#define joy_axis_limit 1000
|
||||
|
||||
#pragma unmanaged
|
||||
|
||||
int CALLBACK EnumDevicesCb( const DIDEVICEINSTANCE* inst, void* data )
|
||||
{
|
||||
DIDEVICEINSTANCE* pdata = (DIDEVICEINSTANCE*)data;
|
||||
memcpy( pdata, inst, sizeof( DIDEVICEINSTANCE ) );
|
||||
return DIENUM_STOP;
|
||||
}
|
||||
|
||||
int CALLBACK EnumDeviceObjectsCb( const DIDEVICEOBJECTINSTANCE* inst, void* data )
|
||||
{
|
||||
IDirectInputDevice8* dev = (IDirectInputDevice8*) data;
|
||||
|
||||
DIPROPRANGE p;
|
||||
p.diph.dwSize = sizeof(DIPROPRANGE);
|
||||
p.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||
p.diph.dwHow = DIPH_BYID;
|
||||
p.diph.dwObj = inst->dwType;
|
||||
p.lMin = -joy_axis_limit;
|
||||
p.lMax = joy_axis_limit;
|
||||
|
||||
HRESULT hr;
|
||||
if (FAILED(hr = dev->SetProperty( DIPROP_RANGE, &p.diph )))
|
||||
return DIENUM_STOP;
|
||||
|
||||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
IDirectInputDevice8* CreateAndConfigureJoystick( IDirectInput8* di )
|
||||
{
|
||||
DIDEVICEINSTANCE inst;
|
||||
memset( &inst, 0, sizeof(inst) );
|
||||
di->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumDevicesCb, (void*)&inst, DIEDFL_ATTACHEDONLY );
|
||||
if (inst.dwSize == 0)
|
||||
return nullptr;
|
||||
|
||||
IDirectInputDevice8* dev;
|
||||
HRESULT hr = di->CreateDevice( inst.guidInstance, &dev, NULL );
|
||||
|
||||
if (FAILED(hr))
|
||||
return nullptr;
|
||||
|
||||
hr = dev->EnumObjects( EnumDeviceObjectsCb, (void*)dev, DIDFT_AXIS );
|
||||
|
||||
if (FAILED(hr)) {
|
||||
dev->Release();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
dev->SetDataFormat( &c_dfDIJoystick );
|
||||
return dev;
|
||||
}
|
||||
|
||||
#pragma managed
|
||||
|
||||
public ref class JoystickState
|
||||
{
|
||||
private:
|
||||
DIJOYSTATE* pstate;
|
||||
|
||||
internal:
|
||||
JoystickState(DIJOYSTATE* state)
|
||||
{
|
||||
DIJOYSTATE* p = new DIJOYSTATE;
|
||||
pstate = p;
|
||||
memcpy( pstate, state, sizeof( DIJOYSTATE ) );
|
||||
}
|
||||
|
||||
public:
|
||||
~JoystickState()
|
||||
{
|
||||
delete pstate;
|
||||
}
|
||||
|
||||
property float x
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->lX / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float y
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->lY / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float z
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->lZ / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float rx
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->lRx / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float ry
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->lRy / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float rz
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->lRz / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float u
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->rglSlider[0] / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property float v
|
||||
{
|
||||
float get()
|
||||
{
|
||||
return (float)pstate->rglSlider[1] / joy_axis_limit;
|
||||
}
|
||||
}
|
||||
|
||||
property int pov
|
||||
{
|
||||
int get()
|
||||
{
|
||||
return pstate->rgdwPOV[0];
|
||||
}
|
||||
}
|
||||
|
||||
bool button( int button )
|
||||
{
|
||||
return (pstate->rgbButtons[button] & 0x80) != 0;
|
||||
}
|
||||
};
|
||||
|
||||
}}
|
||||
77
BluntDx/KeyboardState.h
Normal file
77
BluntDx/KeyboardState.h
Normal file
@@ -0,0 +1,77 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace DirectInput
|
||||
{
|
||||
public enum class Key : unsigned char
|
||||
{
|
||||
A = DIK_A, B = DIK_B, C = DIK_C,
|
||||
D = DIK_D, E = DIK_E, F = DIK_F,
|
||||
G = DIK_G, H = DIK_H, I = DIK_I,
|
||||
J = DIK_J, K = DIK_K, L = DIK_L,
|
||||
M = DIK_M, N = DIK_N, O = DIK_O,
|
||||
P = DIK_P, Q = DIK_Q, R = DIK_R,
|
||||
S = DIK_S, T = DIK_T, U = DIK_U,
|
||||
V = DIK_V, W = DIK_W, X = DIK_X,
|
||||
Y = DIK_Y, Z = DIK_Z,
|
||||
|
||||
D0 = DIK_0, D1 = DIK_1, D2 = DIK_2, D3 = DIK_3, D4 = DIK_4,
|
||||
D5 = DIK_5, D6 = DIK_6, D7 = DIK_7, D8 = DIK_8, D9 = DIK_9,
|
||||
|
||||
ArrowUp = DIK_UPARROW,
|
||||
ArrowLeft = DIK_LEFTARROW,
|
||||
ArrowRight = DIK_RIGHTARROW,
|
||||
ArrowDown = DIK_DOWNARROW,
|
||||
|
||||
Space = DIK_SPACE,
|
||||
|
||||
Escape = DIK_ESCAPE,
|
||||
Tab = DIK_TAB,
|
||||
Enter = DIK_RETURN,
|
||||
|
||||
Tilde = DIK_GRAVE,
|
||||
|
||||
F1 = DIK_F1,
|
||||
F2 = DIK_F2,
|
||||
F3 = DIK_F3,
|
||||
F4 = DIK_F4,
|
||||
F5 = DIK_F5,
|
||||
F6 = DIK_F6,
|
||||
F7 = DIK_F7,
|
||||
F8 = DIK_F8,
|
||||
F9 = DIK_F9,
|
||||
F10 = DIK_F10,
|
||||
F11 = DIK_F11,
|
||||
F12 = DIK_F12,
|
||||
|
||||
LeftControl = DIK_LCONTROL,
|
||||
LeftShift = DIK_LSHIFT,
|
||||
LeftAlt = DIK_LALT,
|
||||
|
||||
Home = DIK_HOME,
|
||||
End = DIK_END,
|
||||
PageUp = DIK_PGUP,
|
||||
PageDown = DIK_PGDN,
|
||||
|
||||
RightControl = DIK_RCONTROL,
|
||||
RightShift = DIK_RSHIFT,
|
||||
RightAlt = DIK_RALT,
|
||||
};
|
||||
|
||||
public ref class KeyboardState
|
||||
{
|
||||
private:
|
||||
array<bool>^ data;
|
||||
|
||||
internal:
|
||||
KeyboardState( array<bool>^ data ) : data(data) {}
|
||||
|
||||
public:
|
||||
property bool default[ Key ]
|
||||
{
|
||||
bool get( Key key )
|
||||
{
|
||||
return data[ (int) key ];
|
||||
}
|
||||
}
|
||||
};
|
||||
}}
|
||||
66
BluntDx/Mesh.h
Normal file
66
BluntDx/Mesh.h
Normal file
@@ -0,0 +1,66 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
|
||||
generic< typename T > where T : value class
|
||||
public ref class Mesh
|
||||
{
|
||||
internal:
|
||||
ID3DXMesh* mesh;
|
||||
|
||||
public:
|
||||
Mesh( GraphicsDevice^ device, VertexFormat vertexFormat, array<T>^ vertices, array<short>^ indices,
|
||||
array<int>^ attributes )
|
||||
{
|
||||
ID3DXMesh* m;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED( hr =
|
||||
D3DXCreateMeshFVF( indices->Length / 3, vertices->Length, D3DXMESH_MANAGED, (DWORD)vertexFormat,
|
||||
device->device, &m)))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
mesh = m;
|
||||
|
||||
{
|
||||
void* vb;
|
||||
mesh->LockVertexBuffer(0, &vb);
|
||||
pin_ptr<T> t = &vertices[0];
|
||||
memcpy( vb, t, vertices->Length * sizeof(T) );
|
||||
mesh->UnlockVertexBuffer();
|
||||
}
|
||||
|
||||
{
|
||||
void* ib;
|
||||
mesh->LockIndexBuffer(0, &ib);
|
||||
pin_ptr<short> t = &indices[0];
|
||||
memcpy( ib, t, indices->Length * sizeof(short) );
|
||||
mesh->UnlockIndexBuffer();
|
||||
}
|
||||
|
||||
{
|
||||
DWORD* ab;
|
||||
mesh->LockAttributeBuffer(0, &ab);
|
||||
pin_ptr<int> t = &attributes[0];
|
||||
memcpy( ab, t, attributes->Length * sizeof(int) );
|
||||
mesh->UnlockAttributeBuffer();
|
||||
}
|
||||
|
||||
DWORD* adjacency = new DWORD[ indices->Length ];
|
||||
mesh->GenerateAdjacency(1e-3f, adjacency);
|
||||
mesh->OptimizeInplace(D3DXMESHOPT_ATTRSORT, adjacency, NULL, NULL, NULL);
|
||||
delete[] adjacency;
|
||||
}
|
||||
|
||||
void DrawSubset( int attributeId )
|
||||
{
|
||||
mesh->DrawSubset( attributeId );
|
||||
}
|
||||
|
||||
~Mesh()
|
||||
{
|
||||
safe_release( mesh );
|
||||
}
|
||||
};
|
||||
}}
|
||||
67
BluntDx/MouseState.h
Normal file
67
BluntDx/MouseState.h
Normal file
@@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace DirectInput {
|
||||
|
||||
value class MouseData
|
||||
{
|
||||
public:
|
||||
long x;
|
||||
long y;
|
||||
long z;
|
||||
unsigned char left, right, middle, aux;
|
||||
};
|
||||
|
||||
public ref class MouseState
|
||||
{
|
||||
private:
|
||||
MouseData d;
|
||||
|
||||
internal:
|
||||
MouseState( MouseData d ) : d(d) {}
|
||||
|
||||
public:
|
||||
property bool default[ int ]
|
||||
{
|
||||
bool get( int button )
|
||||
{
|
||||
unsigned char value = 0;
|
||||
switch( button )
|
||||
{
|
||||
case 0: value = d.left; break;
|
||||
case 1: value = d.right; break;
|
||||
case 2: value = d.middle; break;
|
||||
case 3: value = d.aux; break;
|
||||
default:
|
||||
throw gcnew System::Exception("you idiot");
|
||||
}
|
||||
|
||||
return (value & 0x80) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
property int X
|
||||
{
|
||||
int get()
|
||||
{
|
||||
return (int)d.x;
|
||||
}
|
||||
}
|
||||
|
||||
property int Y
|
||||
{
|
||||
int get()
|
||||
{
|
||||
return (int)d.y;
|
||||
}
|
||||
}
|
||||
|
||||
property int Z
|
||||
{
|
||||
int get()
|
||||
{
|
||||
return (int)d.z;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}}
|
||||
64
BluntDx/SpriteHelper.h
Normal file
64
BluntDx/SpriteHelper.h
Normal file
@@ -0,0 +1,64 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public ref class SpriteHelper
|
||||
{
|
||||
internal:
|
||||
ID3DXSprite* sprite;
|
||||
|
||||
public:
|
||||
SpriteHelper( GraphicsDevice^ device )
|
||||
{
|
||||
HRESULT hr;
|
||||
ID3DXSprite* s;
|
||||
|
||||
if (FAILED(
|
||||
hr = D3DXCreateSprite( device->device, &s )))
|
||||
ThrowHelper::Hr( hr );
|
||||
|
||||
sprite = s;
|
||||
}
|
||||
|
||||
void SetTransform( float sx, float sy, float tx, float ty )
|
||||
{
|
||||
D3DXMATRIX m;
|
||||
memset( &m, 0, sizeof(m));
|
||||
m._11 = sx; m._22 = sy; m._33 = 1; m._44 = 1;
|
||||
m._41 = tx; m._42 = ty;
|
||||
|
||||
sprite->SetTransform(&m);
|
||||
}
|
||||
|
||||
void Begin()
|
||||
{
|
||||
sprite->Begin( D3DXSPRITE_ALPHABLEND );
|
||||
}
|
||||
|
||||
void End()
|
||||
{
|
||||
sprite->End();
|
||||
}
|
||||
|
||||
void Flush()
|
||||
{
|
||||
sprite->Flush();
|
||||
}
|
||||
|
||||
void Draw( Texture^ texture, int left, int top, int width, int height, int color )
|
||||
{
|
||||
RECT r = { left, top, width + left, height + top };
|
||||
sprite->Draw( (IDirect3DTexture9*)texture->texture, &r, NULL, NULL, color );
|
||||
}
|
||||
|
||||
void Draw( Texture^ texture, int color )
|
||||
{
|
||||
sprite->Draw( (IDirect3DTexture9*)texture->texture, NULL, NULL, NULL, color );
|
||||
}
|
||||
|
||||
~SpriteHelper()
|
||||
{
|
||||
safe_release( sprite );
|
||||
}
|
||||
};
|
||||
}}
|
||||
49
BluntDx/Texture.h
Normal file
49
BluntDx/Texture.h
Normal file
@@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public ref class Texture
|
||||
{
|
||||
private:
|
||||
Texture( IDirect3DBaseTexture9* texture ) : texture(texture) {}
|
||||
|
||||
internal:
|
||||
IDirect3DBaseTexture9* texture;
|
||||
|
||||
public:
|
||||
static Texture^ Create( Stream^ stream, GraphicsDevice^ device )
|
||||
{
|
||||
stream->Position = 0;
|
||||
array<unsigned char>^ data = gcnew array<unsigned char>( (int)stream->Length );
|
||||
stream->Read( data, 0, data->Length );
|
||||
|
||||
HRESULT hr;
|
||||
IDirect3DBaseTexture9* tex;
|
||||
|
||||
pin_ptr<unsigned char> p = &data[0];
|
||||
|
||||
if (FAILED( hr = D3DXCreateTextureFromFileInMemory( device->device, p, data->Length, (IDirect3DTexture9**)&tex ) ))
|
||||
throw gcnew InvalidOperationException("Texture load failed");
|
||||
|
||||
return gcnew Texture( tex );
|
||||
}
|
||||
|
||||
static Texture^ CreateCube( Stream^ stream, GraphicsDevice^ device )
|
||||
{
|
||||
stream->Position = 0;
|
||||
array<unsigned char>^ data = gcnew array<unsigned char>((int)stream->Length);
|
||||
stream->Read( data, 0, data->Length );
|
||||
|
||||
HRESULT hr;
|
||||
IDirect3DBaseTexture9* tex;
|
||||
|
||||
pin_ptr<unsigned char> p = &data[0];
|
||||
|
||||
if (FAILED( hr = D3DXCreateCubeTextureFromFileInMemory( device->device, p, data->Length, (IDirect3DCubeTexture9**)&tex ) ))
|
||||
throw gcnew InvalidOperationException("Texture load failed");
|
||||
|
||||
return gcnew Texture( tex );
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
15
BluntDx/Utilities.h
Normal file
15
BluntDx/Utilities.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#define safe_release(x) if(x) { (x)->Release(); x = NULL; }
|
||||
|
||||
namespace BluntDirectX
|
||||
{
|
||||
ref class ThrowHelper
|
||||
{
|
||||
public:
|
||||
static void Hr( HRESULT hr )
|
||||
{
|
||||
throw gcnew InvalidOperationException( String::Format("COM error in DirectX, hr={0}", hr) );
|
||||
}
|
||||
};
|
||||
}
|
||||
161
BluntDx/VertexBuffer.h
Normal file
161
BluntDx/VertexBuffer.h
Normal file
@@ -0,0 +1,161 @@
|
||||
#pragma once
|
||||
|
||||
namespace BluntDirectX { namespace Direct3D
|
||||
{
|
||||
public ref class IndexBuffer
|
||||
{
|
||||
internal:
|
||||
IDirect3DIndexBuffer9* buffer;
|
||||
IDirect3DDevice9* device;
|
||||
int size;
|
||||
|
||||
public:
|
||||
IndexBuffer( GraphicsDevice^ device, int size )
|
||||
: size( size ), device( device->device )
|
||||
{
|
||||
HRESULT hr;
|
||||
IDirect3DIndexBuffer9* b;
|
||||
|
||||
if (FAILED( hr = this->device->CreateIndexBuffer( sizeof( unsigned short ) * size,
|
||||
device->HasHardwareVP ? 0 : D3DUSAGE_SOFTWAREPROCESSING, D3DFMT_INDEX16, D3DPOOL_SYSTEMMEM, &b, NULL )))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
buffer = b;
|
||||
}
|
||||
|
||||
void SetData( array<unsigned short>^ data )
|
||||
{
|
||||
pin_ptr<unsigned short> pdata = &data[0];
|
||||
void * ib;
|
||||
|
||||
buffer->Lock( 0, sizeof(unsigned short) * size, &ib, D3DLOCK_DISCARD );
|
||||
memcpy( ib, pdata, sizeof(unsigned short) * size );
|
||||
buffer->Unlock();
|
||||
}
|
||||
|
||||
void Bind()
|
||||
{
|
||||
device->SetIndices( buffer );
|
||||
}
|
||||
|
||||
~IndexBuffer()
|
||||
{
|
||||
safe_release( buffer );
|
||||
}
|
||||
|
||||
property int Size { int get() { return size; } }
|
||||
};
|
||||
|
||||
generic<typename T> where T : value class
|
||||
public ref class FvfVertexBuffer
|
||||
{
|
||||
internal:
|
||||
IDirect3DVertexBuffer9* buffer;
|
||||
IDirect3DDevice9* device;
|
||||
int numVertices;
|
||||
unsigned int fvf;
|
||||
|
||||
public:
|
||||
FvfVertexBuffer( GraphicsDevice^ device, int numVertices, VertexFormat fvf )
|
||||
: numVertices( numVertices ), device(device->device), fvf((unsigned int)fvf)
|
||||
{
|
||||
HRESULT hr;
|
||||
IDirect3DVertexBuffer9* b;
|
||||
|
||||
if (FAILED( hr = device->device->CreateVertexBuffer( sizeof(T) * numVertices,
|
||||
device->HasHardwareVP ? 0 : D3DUSAGE_SOFTWAREPROCESSING, this->fvf, D3DPOOL_SYSTEMMEM, &b, NULL )))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
buffer = b;
|
||||
}
|
||||
|
||||
void SetData( array<T>^ data )
|
||||
{
|
||||
pin_ptr<T> pdata = &data[0];
|
||||
void* vb;
|
||||
|
||||
buffer->Lock( 0, sizeof(T) * numVertices, &vb, D3DLOCK_DISCARD );
|
||||
memcpy( vb, pdata, sizeof(T) * data->Length );
|
||||
buffer->Unlock();
|
||||
}
|
||||
|
||||
void Bind( int stream )
|
||||
{
|
||||
device->SetStreamSource( stream, buffer, 0, sizeof(T) );
|
||||
device->SetFVF( fvf );
|
||||
}
|
||||
|
||||
~FvfVertexBuffer()
|
||||
{
|
||||
safe_release( buffer );
|
||||
}
|
||||
|
||||
property int Size { int get() { return numVertices; } }
|
||||
property VertexFormat FVF { VertexFormat get() { return (VertexFormat)fvf; }}
|
||||
};
|
||||
|
||||
generic<typename T> where T : value class
|
||||
public ref class VertexBuffer
|
||||
{
|
||||
internal:
|
||||
IDirect3DVertexBuffer9* buffer;
|
||||
IDirect3DVertexDeclaration9* decl;
|
||||
IDirect3DDevice9* device;
|
||||
int numVertices;
|
||||
|
||||
public:
|
||||
VertexBuffer( GraphicsDevice^ device, int numVertices )
|
||||
: numVertices( numVertices ), device(device->device)
|
||||
{
|
||||
HRESULT hr;
|
||||
IDirect3DVertexBuffer9* b;
|
||||
IDirect3DVertexDeclaration9* d;
|
||||
|
||||
D3DVERTEXELEMENT9 elements[] =
|
||||
{
|
||||
{0,0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
|
||||
{0,12,D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,0},
|
||||
{0,28,D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,1},
|
||||
{0,44,D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_PSIZE,0},
|
||||
|
||||
D3DDECL_END()
|
||||
};
|
||||
|
||||
if (FAILED( hr = device->device->CreateVertexDeclaration( elements, &d ) ))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
decl = d;
|
||||
|
||||
if (FAILED( hr = device->device->CreateVertexBuffer( sizeof(T) * numVertices,
|
||||
D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS |
|
||||
(device->HasHardwareVP ? 0 : D3DUSAGE_SOFTWAREPROCESSING), 0, D3DPOOL_DEFAULT, &b, NULL )))
|
||||
ThrowHelper::Hr(hr);
|
||||
|
||||
buffer = b;
|
||||
}
|
||||
|
||||
void SetData( array<T>^ data )
|
||||
{
|
||||
pin_ptr<T> pdata = &data[0];
|
||||
void* vb;
|
||||
|
||||
buffer->Lock( 0, sizeof(T) * numVertices, &vb, D3DLOCK_DISCARD );
|
||||
memcpy( vb, pdata, sizeof(T) * data->Length );
|
||||
buffer->Unlock();
|
||||
}
|
||||
|
||||
void Bind( int stream )
|
||||
{
|
||||
device->SetStreamSource( stream, buffer, 0, sizeof(T) );
|
||||
device->SetVertexDeclaration( decl );
|
||||
}
|
||||
|
||||
~VertexBuffer()
|
||||
{
|
||||
safe_release( decl );
|
||||
safe_release( buffer );
|
||||
}
|
||||
|
||||
property int Size { int get() { return numVertices; } }
|
||||
};
|
||||
}}
|
||||
Reference in New Issue
Block a user