#include <Windows.h>
using namespace System;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace SlimDX;
using namespace SlimDX::Direct3D9;
struct TextureVertex
{
Vector3 positon;
int color;
float tu, tv;
};
public ref class WndForm : public Form
{
Direct3D^ direct3D;
PresentParameters^ presentParams;
Device^ device;
Mesh^ mesh;
array<Material ^> ^meshMaterials;
array<Texture ^> ^meshTextures;
String^ lastError;
public:
WndForm(void)
{
this->ClientSize = System::Drawing::Size(400, 300);
this->StartPosition = FormStartPosition::CenterScreen;
this->Text = "D3D Tutorial 6";
}
bool InitD3D()
{
try
{
// 환경변수 세팅
direct3D = gcnew Direct3D();
presentParams = gcnew PresentParameters();
presentParams->Windowed = true;
presentParams->SwapEffect = SwapEffect::Discard;
presentParams->BackBufferFormat = Format::Unknown;
presentParams->EnableAutoDepthStencil = true;
presentParams->AutoDepthStencilFormat = Format::D16;
// 디바이스 생성
device = gcnew Device(direct3D, 0, DeviceType::Hardware, this->Handle, CreateFlags::SoftwareVertexProcessing, presentParams);
// 디바이스 세팅
device->SetRenderState(RenderState::CullMode, Cull::None);
device->SetRenderState(RenderState::ZEnable, true);
device->SetRenderState(RenderState::Ambient, 0xffffff);
// 모델 로딩
mesh = Mesh::FromFile(device, "tiger.x", MeshFlags::SystemMemory);
array<ExtendedMaterial> ^materials = mesh->GetMaterials();
meshMaterials = gcnew array<Material ^>(materials->Length);
meshTextures = gcnew array<Texture ^>(materials->Length);
for (int i = 0; i < materials->Length; i++)
{
meshMaterials[i] = materials[i].MaterialD3D;
meshMaterials[i]->Ambient = meshMaterials[i]->Diffuse;
meshTextures[i] = Texture::FromFile(device, materials[i].TextureFileName);
}
return true;
}
catch (Direct3D9Exception^ ex)
{
lastError = ex->ToString();
return false;
}
}
void SetupMatrix()
{
device->SetTransform(TransformState::World, Matrix::RotationY(Environment::TickCount / 1000.0f));
device->SetTransform(TransformState::View, Matrix::LookAtLH(Vector3(0.0f, 3.0f, -5.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 1.0f, 0.0f)));
device->SetTransform(TransformState::Projection, Matrix::PerspectiveFovLH((float)Math::PI / 4, 1.0f, 1.0f, 100.0f));
}
void Render()
{
if (!device)
return;
// 렌더링 시작
device->Clear(ClearFlags::Target | ClearFlags::ZBuffer, System::Drawing::Color::Black, 1.0f, 0);
device->BeginScene();
SetupMatrix();
// 렌더링
for (int i = 0; i < meshMaterials->Length; i++)
{
device->Material = *meshMaterials[i];
device->SetTexture(0, meshTextures[i]);
mesh->DrawSubset(i);
}
// 렌더링 끝
device->EndScene();
device->Present();
}
protected:
~WndForm()
{
}
};
INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
{
WndForm^ frm = gcnew WndForm();
if (!frm->InitD3D())
{
MessageBox::Show("Initializing D3D Device Failed");
return 0;
}
frm->Show();
while (frm->Created)
{
frm->Render();
Application::DoEvents();
}
return 0;
}
0 개의 댓글:
댓글 쓰기