www.pudn.com > Imagire-AsciiArt-src.zip > main.cpp, change:2004-08-01,size:41366b


//------------------------------------------------------------- 
// File: main.cpp 
// 
// Desc: ascii art 
//------------------------------------------------------------- 
#define STRICT 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include "DXUtil.h" 
#include "D3DEnumeration.h" 
#include "D3DSettings.h" 
#include "D3DApp.h" 
#include "D3DFont.h" 
#include "D3DFile.h" 
#include "D3DUtil.h" 
#include "resource.h" 
#include "main.h" 
 
#define MAP_WIDTH	512 
#define MAP_HEIGHT	512 
const int COLOR_MAP[] = {MAP_WIDTH/8, MAP_WIDTH/32}; 
 
 
// 長いから短縮形を作ってみた 
#define RS   m_pd3dDevice->SetRenderState 
#define TSS  m_pd3dDevice->SetTextureStageState 
#define SAMP m_pd3dDevice->SetSamplerState 
 
 
//------------------------------------------------------------- 
// 頂点の構造体 
//------------------------------------------------------------- 
typedef struct { 
    FLOAT       p[4]; 
    FLOAT       tu, tv; 
} TVERTEX; 
 
//------------------------------------------------------------- 
// グローバル変数 
//------------------------------------------------------------- 
CMyD3DApplication* g_pApp  = NULL; 
HINSTANCE          g_hInst = NULL; 
 
 
//------------------------------------------------------------- 
// Name: WinMain() 
// Desc: メイン関数 
//------------------------------------------------------------- 
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) 
{ 
    CMyD3DApplication d3dApp; 
 
    g_pApp  = &d3dApp; 
    g_hInst = hInst; 
 
    InitCommonControls(); 
    if( FAILED( d3dApp.Create( hInst ) ) ) 
        return 0; 
 
    return d3dApp.Run(); 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: CMyD3DApplication() 
// Desc: アプリケーションのコンストラクタ 
//------------------------------------------------------------- 
CMyD3DApplication::CMyD3DApplication() 
{ 
	DWORD i, j; 
 
	m_pMesh						= new CD3DMesh(); 
	m_pMeshBg					= new CD3DMesh(); 
 
	m_pMapZ						= NULL; 
	m_pOriginalMap				= NULL; 
	m_pOriginalMapSurf			= NULL; 
	m_pFinalMap					= NULL; 
	m_pFinalMapSurf				= NULL; 
	m_pPostMap					= NULL; 
	m_pPostMapSurf				= NULL; 
	m_pAsciiMap					= NULL; 
	m_pAsciiCoeffMap			= NULL; 
 
	for( i=0;i<2;i++ ) 
	{ 
		m_pColorMap[i]			= NULL; 
		m_pColorMapSurf[i]		= NULL; 
	} 
	for( i=0;i<2;i++ ) 
	for( j=0;j<4;j++ ) 
	{ 
		m_pCoeffMap[i][j]		= NULL; 
		m_pCoeffMapSurf[i][j]		= NULL; 
	} 
	for( j=0;j<4;j++ ) 
	{ 
		m_pWaveletMap[j]		= NULL; 
	} 
	for( i=0;i<13;i++ ) 
	{ 
		m_pDiffMap[i]			= NULL; 
		m_pDiffMapSurf[i]		= NULL; 
	} 
	m_pIndex0Map			= NULL; 
	m_pValue0Map			= NULL; 
	m_pIndex0MapSurf		= NULL; 
	m_pValue0MapSurf		= NULL; 
	m_pIndex1Map			= NULL; 
	m_pIndex1MapSurf		= NULL; 
 
 
	m_pEffect					= NULL; 
	m_hTechnique  				= NULL; 
	m_htSrcMap					= NULL; 
 
	m_fWorldRotX                = -0.195; 
    m_fWorldRotY                = 3.14159265f; 
	m_fViewZoom				    = 7.0f; 
 
	m_dwCreationWidth           = 512; 
    m_dwCreationHeight          = 512; 
    m_strWindowTitle            = TEXT( "main" ); 
    m_d3dEnumeration.AppUsesDepthBuffer   = TRUE; 
	m_bStartFullscreen			= false; 
	m_bShowCursorWhenFullscreen	= false; 
 
    m_pFont                     = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD ); 
    m_bLoadingApp               = TRUE; 
 
    ZeroMemory( &m_UserInput, sizeof(m_UserInput) ); 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: ~CMyD3DApplication() 
// Desc: デストラクタ 
//------------------------------------------------------------- 
CMyD3DApplication::~CMyD3DApplication() 
{ 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: OneTimeSceneInit() 
// Desc: 一度だけ行う初期化 
//		ウィンドウの初期化やIDirect3D9の初期化は終わってます。 
//		ただ、LPDIRECT3DDEVICE9 の初期化は終わっていません。 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::OneTimeSceneInit() 
{ 
    // ローディングメッセージを表示する 
    SendMessage( m_hWnd, WM_PAINT, 0, 0 ); 
 
    m_bLoadingApp = FALSE; 
 
    return S_OK; 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: ConfirmDevice() 
// Desc: 初期化の時に呼ばれます。必要な能力をチェックします。 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, 
                     DWORD dwBehavior,    D3DFORMAT Format ) 
{ 
    UNREFERENCED_PARAMETER( Format ); 
    UNREFERENCED_PARAMETER( dwBehavior ); 
    UNREFERENCED_PARAMETER( pCaps ); 
     
 
	// ピクセルシェーダバージョンチェック 
    if( pCaps->PixelShaderVersion < D3DPS_VERSION(2,0) ) 
		return E_FAIL; 
 
    // 頂点シェーダバージョンが上位かソフトウェア頂点処理 
    if( pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) 
    &&  0==(dwBehavior & D3DCREATE_SOFTWARE_VERTEXPROCESSING) ) 
			return E_FAIL; 
 
    return S_OK; 
} 
 
// ---------------------------------------------------------------------------- 
// テクスチャーを作成 
// ---------------------------------------------------------------------------- 
float GetHaarWavelet( int n, int m, float x, float y ) 
{ 
	switch(n) 
	{ 
	case 0: 
		return 1; 
		break; 
	case 1: 
		switch(m) 
		{ 
		case 0: return (y<0.5) ? -1 : 1; 
		case 1: return (x<0.5) ? -1 : 1; 
		case 2: return ((x<0.5)^(y<0.5)) ? -1 : 1; 
		} 
		break; 
	case 2: 
		if(1==((m/3)&1)) x -= 0.5f; 
		if(1==((m/3)/2)) y -= 0.5f; 
 
		if( 0.0<=x && x<0.5 && 0.0<=y && y<0.5 ) 
		{ 
			switch(m%3) 
			{ 
			case 0: return (x<0.25) ? -1 : 1; 
			case 1: return (y<0.25) ? -1 : 1; 
			case 2: return ((x<0.25)^(y<0.25)) ? -1 : 1; 
			} 
			break; 
		} 
	} 
 
	return 0; 
} 
 
 
// ---------------------------------------------------------------------------- 
// テクスチャーを作成 
// ---------------------------------------------------------------------------- 
VOID WINAPI FillTextureHaarWavelet(D3DXVECTOR4* pOut, CONST D3DXVECTOR2 *pTexCoord, CONST D3DXVECTOR2 *pTexelSize, LPVOID pData) 
{ 
	float o[4] = {0.0, 0.0, 0.0, 0.0}; 
	int idx = (int)pData; 
 
	switch(idx) 
	{ 
	case 0: 
		o[0] = GetHaarWavelet( 1, 0, pTexCoord->x, pTexCoord->y ); 
		o[1] = GetHaarWavelet( 1, 1, pTexCoord->x, pTexCoord->y ); 
		o[2] = GetHaarWavelet( 1, 2, pTexCoord->x, pTexCoord->y ); 
		o[3] = GetHaarWavelet( 0, 0, pTexCoord->x, pTexCoord->y ); 
		break; 
	case 1: 
		o[0] = GetHaarWavelet( 2, 0, pTexCoord->x, pTexCoord->y ); 
		o[1] = GetHaarWavelet( 2, 1, pTexCoord->x, pTexCoord->y ); 
		o[2] = GetHaarWavelet( 2, 2, pTexCoord->x, pTexCoord->y ); 
		o[3] = GetHaarWavelet( 2, 9, pTexCoord->x, pTexCoord->y ); 
		break; 
	case 2: 
		o[0] = GetHaarWavelet( 2, 3, pTexCoord->x, pTexCoord->y ); 
		o[1] = GetHaarWavelet( 2, 4, pTexCoord->x, pTexCoord->y ); 
		o[2] = GetHaarWavelet( 2, 5, pTexCoord->x, pTexCoord->y ); 
		o[3] = GetHaarWavelet( 2,10, pTexCoord->x, pTexCoord->y ); 
		break; 
	case 3: 
		o[0] = GetHaarWavelet( 2, 6, pTexCoord->x, pTexCoord->y ); 
		o[1] = GetHaarWavelet( 2, 7, pTexCoord->x, pTexCoord->y ); 
		o[2] = GetHaarWavelet( 2, 8, pTexCoord->x, pTexCoord->y ); 
		o[3] = GetHaarWavelet( 2,11, pTexCoord->x, pTexCoord->y ); 
		break; 
	} 
	pOut->x = 0.5f * o[0] + 0.5f; 
	pOut->y = 0.5f * o[1] + 0.5f; 
	pOut->z = 0.5f * o[2] + 0.5f; 
	pOut->w = 0.5f * o[3] + 0.5f; 
} 
 
// ---------------------------------------------------------------------------- 
// テクスチャーを作成 
// ---------------------------------------------------------------------------- 
VOID WINAPI FillTextureAsciiCoeff(D3DXVECTOR4* pOut, CONST D3DXVECTOR2 *pTexCoord, CONST D3DXVECTOR2 *pTexelSize, LPVOID pData) 
{ 
	CMyD3DApplication *pApp = (CMyD3DApplication*)pData; 
	DWORD i, j; 
	int ascii = 52.0 * pTexCoord->x; 
	int idx   =  4.0 * pTexCoord->y; 
	int n[4]; 
	int m[4]; 
	float o[4] = {0,0,0,0}; 
 
	switch(idx) 
	{ 
	case 0: 
		n[0] = 1; m[0] = 0; 
		n[1] = 1; m[1] = 1; 
		n[2] = 1; m[2] = 2; 
		n[3] = 0; m[3] = 0; 
		break; 
	case 1: 
		n[0] = 2; m[0] = 0; 
		n[1] = 2; m[1] = 1; 
		n[2] = 2; m[2] = 2; 
		n[3] = 2; m[3] = 9; 
		break; 
	case 2: 
		n[0] = 2; m[0] = 3; 
		n[1] = 2; m[1] = 4; 
		n[2] = 2; m[2] = 5; 
		n[3] = 2; m[3] =10; 
		break; 
	case 3: 
		n[0] = 2; m[0] = 6; 
		n[1] = 2; m[1] = 7; 
		n[2] = 2; m[2] = 8; 
		n[3] = 2; m[3] =11; 
		break; 
	} 
	for( i=0;i<24;i++ ) 
	for( j=0;j<24;j++ ) 
	{ 
		float x = (1.0f/24.0f) * (float)i; 
		float y = (1.0f/24.0f) * (float)j; 
		float tex = (2.0f/255.0f) * (float) pApp->m_iTex[ascii][j][i] - 1.0f; 
 
		o[0] += GetHaarWavelet( n[0], m[0], x, y ) * tex; 
		o[1] += GetHaarWavelet( n[1], m[1], x, y ) * tex; 
		o[2] += GetHaarWavelet( n[2], m[2], x, y ) * tex; 
		o[3] += GetHaarWavelet( n[3], m[3], x, y ) * tex; 
	} 
	o[0] /= (24.0*24.0); 
	o[1] /= (24.0*24.0); 
	o[2] /= (24.0*24.0); 
	o[3] /= (24.0*24.0); 
 
	pOut->x = 0.5f * o[0] + 0.5f; 
	pOut->y = 0.5f * o[1] + 0.5f; 
	pOut->z = 0.5f * o[2] + 0.5f; 
	pOut->w = 0.5f * o[3] + 0.5f; 
} 
 
 
 
 
void CMyD3DApplication::CreateTextureArray( LPDIRECT3DTEXTURE9 pTex ) 
{ 
	D3DLOCKED_RECT d3dlr; 
 
	pTex->LockRect(0,&d3dlr,NULL,D3DLOCK_READONLY); //サーフェイス上の矩形をロック 
	 
    unsigned char *p = (unsigned char *)d3dlr.pBits; 
    for( int y = 0; y < ASCII_HEIGHT; y++ ) 
	{ 
		for( int x = 0; x < ASCII_MAX * ASCII_WIDTH; x++ ) 
		{ 
			int idx = x/ASCII_WIDTH; 
			m_iTex[idx][y][x%ASCII_WIDTH] = p[ 32 * d3dlr.Pitch * y / ASCII_HEIGHT 
											+ d3dlr.Pitch * x / (ASCII_MAX * ASCII_WIDTH) ]; 
		} 
    } 
 
	pTex->UnlockRect(0); 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: InitDeviceObjects() 
// Desc: デバイスが生成された後の初期化をします。 
//		フレームバッファフォーマットやデバイスの種類が変わった 
//		後に通過します。 
//		ここで確保したメモリはDeleteDeviceObjects()で開放します 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::InitDeviceObjects() 
{ 
    HRESULT hr; 
 
#ifdef DX9C 
	// UFOの読み込み 
	if(FAILED(hr=m_pMesh  ->Create( m_pd3dDevice, (LPCWSTR)("t-pot.x")))) 
        return DXTRACE_ERR( "LoadCar", hr ); 
	// 地面の読み込み 
	if(FAILED(hr=m_pMeshBg->Create( m_pd3dDevice, (LPCWSTR)("map.x")))) 
        return DXTRACE_ERR( "Load BG", hr ); 
#else // DX9C 
	// UFOの読み込み 
	if(FAILED(hr=m_pMesh  ->Create( m_pd3dDevice, _T("t-pot.x")))) 
        return DXTRACE_ERR( "LoadCar", hr ); 
	// 地面の読み込み 
	if(FAILED(hr=m_pMeshBg->Create( m_pd3dDevice, _T("map.x")))) 
        return DXTRACE_ERR( "Load BG", hr ); 
#endif // DX9C 
	m_pMesh->UseMeshMaterials(false); 
	m_pMeshBg->UseMeshMaterials(false); 
         
	// シェーダの読み込み 
	LPD3DXBUFFER pErr; 
    if( FAILED( hr = D3DXCreateEffectFromFile( 
				m_pd3dDevice, "hlsl.fx", NULL, NULL,  
				D3DXSHADER_DEBUG , NULL, &m_pEffect, &pErr ))){ 
		MessageBox( NULL, (LPCTSTR)pErr->GetBufferPointer() 
					, "ERROR", MB_OK); 
		return DXTRACE_ERR( "CreateEffectFromFile", hr ); 
	} 
	m_hTechnique = m_pEffect->GetTechniqueByName( "TShader" ); 
	m_htSrcMap  = m_pEffect->GetParameterByName( NULL, "SrcMap" ); 
 
	// フォント 
    m_pFont->InitDeviceObjects( m_pd3dDevice ); 
    return S_OK; 
} 
 
//------------------------------------------------------------- 
// Name: RestoreDeviceObjects() 
// Desc: 画面のサイズが変更された時等に呼ばれます。 
//		確保したメモリはInvalidateDeviceObjects()で開放します。 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::RestoreDeviceObjects() 
{ 
	DWORD i, j; 
 
	// メッシュ 
	m_pMesh  ->RestoreDeviceObjects( m_pd3dDevice ); 
	m_pMeshBg->RestoreDeviceObjects( m_pd3dDevice ); 
 
    // 質感の設定 
    D3DMATERIAL9 mtrl; 
    D3DUtil_InitMaterial( mtrl, 1.0f, 0.0f, 0.0f ); 
    m_pd3dDevice->SetMaterial( &mtrl ); 
 
 
    // レンダリング状態の設定 
    RS( D3DRS_DITHERENABLE,   FALSE ); 
    RS( D3DRS_SPECULARENABLE, FALSE ); 
    RS( D3DRS_ALPHATESTENABLE, FALSE ); 
    RS( D3DRS_ZENABLE,        TRUE ); 
    RS( D3DRS_AMBIENT,        0x000F0F0F ); 
     
    TSS( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE ); 
    TSS( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); 
    TSS( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); 
    TSS( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 ); 
    TSS( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); 
    SAMP( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); 
    SAMP( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); 
    SAMP( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); 
    SAMP( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); 
 
    // ワールド行列 
    D3DXMATRIX matIdentity; 
    D3DXMatrixIdentity( &m_mWorld ); 
 
	// ビュー行列 
    D3DXVECTOR3 vFromPt   = D3DXVECTOR3( 0.0f, 0.0f, -5.0f ); 
    D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); 
    D3DXVECTOR3 vUpVec    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); 
    D3DXMatrixLookAtLH( &m_mView, &vFromPt, &vLookatPt, &vUpVec ); 
 
    // 射影行列 
    FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height; 
    D3DXMatrixPerspectiveFovLH( &m_mProj, D3DX_PI/4, fAspect, 1.0f, 100.0f ); 
 
    // フォント 
    m_pFont->RestoreDeviceObjects(); 
 
	// テクスチャ 
	D3DXCreateTextureFromFileEx(m_pd3dDevice, "abc.bmp", 0,0,1, 
		0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_POINT, D3DX_DEFAULT,0, NULL,NULL, 
		&m_pAsciiMap); 
	CreateTextureArray( m_pAsciiMap ); 
 
	for( i=0;i<4;i++ ) 
	{ 
		if (FAILED(m_pd3dDevice->CreateTexture( 4, 4, 1,  
			0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, m_pWaveletMap+i, NULL))) 
			return E_FAIL; 
	} 
 
	D3DXCreateTexture( m_pd3dDevice, 52, 4, 1,  
			0, D3DFMT_A32B32G32R32F, D3DPOOL_MANAGED, &m_pAsciiCoeffMap); 
 
	// シャドウマップの生成 
	if (FAILED(m_pd3dDevice->CreateDepthStencilSurface(MAP_WIDTH, MAP_HEIGHT,  
		D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, TRUE, &m_pMapZ, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pd3dDevice->CreateTexture(MAP_WIDTH, MAP_HEIGHT, 1,  
		D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pOriginalMap, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pOriginalMap->GetSurfaceLevel(0, &m_pOriginalMapSurf))) 
		return E_FAIL; 
	// モノトーン 
	if (FAILED(m_pd3dDevice->CreateTexture( 
						COLOR_MAP[0], COLOR_MAP[0], 1, 
						D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, 
						D3DPOOL_DEFAULT, &m_pPostMap, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pPostMap->GetSurfaceLevel(0, &m_pPostMapSurf))) 
		return E_FAIL; 
	// 最終画像 
	if (FAILED(m_pd3dDevice->CreateTexture(MAP_WIDTH, MAP_HEIGHT, 1,  
		D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pFinalMap, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pFinalMap->GetSurfaceLevel(0, &m_pFinalMapSurf))) 
		return E_FAIL; 
 
	// テクスチャ 
	for( i=0;i<2;i++ ) 
	{ 
		if (FAILED(m_pd3dDevice->CreateTexture( COLOR_MAP[i], COLOR_MAP[i], 1,  
			D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pColorMap[i], NULL))) 
			return E_FAIL; 
		if (FAILED(m_pColorMap[i]->GetSurfaceLevel(0, &m_pColorMapSurf[i]))) 
			return E_FAIL; 
	} 
 
	for( i=0;i<2;i++ ) 
	for( j=0;j<4;j++ ) 
	{ 
		if (FAILED(m_pd3dDevice->CreateTexture( COLOR_MAP[i], COLOR_MAP[i], 1,  
			D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pCoeffMap[i][j], NULL))) 
			return E_FAIL; 
		if (FAILED(m_pCoeffMap[i][j]->GetSurfaceLevel(0, &m_pCoeffMapSurf[i][j]))) 
			return E_FAIL; 
	} 
 
	for( i=0;i<13;i++ ) 
	{ 
		if (FAILED(m_pd3dDevice->CreateTexture( COLOR_MAP[1], COLOR_MAP[1], 1,  
			D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pDiffMap[i], NULL))) 
			return E_FAIL; 
		if (FAILED(m_pDiffMap[i]->GetSurfaceLevel(0, &m_pDiffMapSurf[i]))) 
			return E_FAIL; 
	} 
 
	if (FAILED(m_pd3dDevice->CreateTexture( COLOR_MAP[1], COLOR_MAP[1], 1,  
		D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pValue0Map, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pValue0Map->GetSurfaceLevel(0, &m_pValue0MapSurf))) 
		return E_FAIL; 
	if (FAILED(m_pd3dDevice->CreateTexture( COLOR_MAP[1], COLOR_MAP[1], 1,  
		D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pIndex0Map, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pIndex0Map->GetSurfaceLevel(0, &m_pIndex0MapSurf))) 
		return E_FAIL; 
 
	if (FAILED(m_pd3dDevice->CreateTexture( COLOR_MAP[1], COLOR_MAP[1], 1,  
		D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pIndex1Map, NULL))) 
		return E_FAIL; 
	if (FAILED(m_pIndex1Map->GetSurfaceLevel(0, &m_pIndex1MapSurf))) 
		return E_FAIL; 
 
	// Fill textures 
	D3DXFillTexture( m_pAsciiCoeffMap, (LPD3DXFILL2D)FillTextureAsciiCoeff, (LPVOID)this ); 
	for( i=0;i<4;i++ ) 
	{ 
		D3DXFillTexture( m_pWaveletMap[i], (LPD3DXFILL2D)FillTextureHaarWavelet, (LPVOID)i ); 
	} 
 
	m_pEffect->OnResetDevice(); 
 
	return S_OK; 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: FrameMove() 
// Desc: 毎フレーム呼ばれます。アニメの処理などを行います。 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::FrameMove() 
{ 
    // 入力データの更新 
    UpdateInput( &m_UserInput ); 
 
	//--------------------------------------------------------- 
	// 入力に応じて座標系を更新する 
	//--------------------------------------------------------- 
	// 回転 
    D3DXMATRIX matRotY; 
    D3DXMATRIX matRotX; 
 
    if( m_UserInput.bRotateLeft && !m_UserInput.bRotateRight ) 
        m_fWorldRotY += m_fElapsedTime; 
    else 
    if( m_UserInput.bRotateRight && !m_UserInput.bRotateLeft ) 
        m_fWorldRotY -= m_fElapsedTime; 
 
    if( m_UserInput.bRotateUp && !m_UserInput.bRotateDown ) 
        m_fWorldRotX += m_fElapsedTime; 
    else 
    if( m_UserInput.bRotateDown && !m_UserInput.bRotateUp ) 
        m_fWorldRotX -= m_fElapsedTime; 
 
    D3DXMatrixRotationX( &matRotX, m_fWorldRotX ); 
    D3DXMatrixRotationY( &matRotY, m_fWorldRotY ); 
 
    D3DXMatrixMultiply( &m_mWorld, &matRotY, &matRotX ); 
	 
	//--------------------------------------------------------- 
	// ビュー行列の設定 
	//--------------------------------------------------------- 
	// ズーム 
    if( m_UserInput.bZoomIn && !m_UserInput.bZoomOut ) 
        m_fViewZoom += m_fElapsedTime; 
    else if( m_UserInput.bZoomOut && !m_UserInput.bZoomIn ) 
        m_fViewZoom -= m_fElapsedTime; 
 
    D3DXVECTOR3 vFromPt   = D3DXVECTOR3( 0.0f, 0.0f, -m_fViewZoom ); 
    D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); 
    D3DXVECTOR3 vUpVec    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); 
    D3DXMatrixLookAtLH( &m_mView, &vFromPt, &vLookatPt, &vUpVec ); 
 
	return S_OK; 
} 
//------------------------------------------------------------- 
// Name: UpdateInput() 
// Desc: 入力データを更新する 
//------------------------------------------------------------- 
void CMyD3DApplication::UpdateInput( UserInput* pUserInput ) 
{ 
    pUserInput->bRotateUp    = ( m_bActive && (GetAsyncKeyState( VK_UP )    & 0x8000) == 0x8000 ); 
    pUserInput->bRotateDown  = ( m_bActive && (GetAsyncKeyState( VK_DOWN )  & 0x8000) == 0x8000 ); 
    pUserInput->bRotateLeft  = ( m_bActive && (GetAsyncKeyState( VK_LEFT )  & 0x8000) == 0x8000 ); 
    pUserInput->bRotateRight = ( m_bActive && (GetAsyncKeyState( VK_RIGHT ) & 0x8000) == 0x8000 ); 
     
	pUserInput->bZoomIn      = ( m_bActive && (GetAsyncKeyState( 'Z'     )  & 0x8000) == 0x8000 ); 
    pUserInput->bZoomOut     = ( m_bActive && (GetAsyncKeyState( 'X'      ) & 0x8000) == 0x8000 ); 
} 
 
 
//------------------------------------------------------------- 
// Name: Render() 
// Desc: 画面を描画する. 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::Render() 
{ 
    D3DXMATRIX m, mT, mR, mW, mView, mProj; 
	D3DXVECTOR4 v; 
	LPDIRECT3DSURFACE9 pOldBackBuffer, pOldZBuffer; 
	D3DVIEWPORT9 oldViewport; 
	DWORD i, j; 
 
	//--------------------------------------------------------- 
	// 描画 
	//--------------------------------------------------------- 
    if( SUCCEEDED( m_pd3dDevice->BeginScene() ) ) 
    { 
		//------------------------------------------------- 
		// レンダリングターゲットの保存 
		//------------------------------------------------- 
		m_pd3dDevice->GetRenderTarget(0, &pOldBackBuffer); 
		m_pd3dDevice->GetDepthStencilSurface(&pOldZBuffer); 
		m_pd3dDevice->GetViewport(&oldViewport); 
 
		if( m_pEffect != NULL )  
		{ 
			//------------------------------------------------- 
			// レンダリングターゲットの変更 
			//------------------------------------------------- 
			m_pd3dDevice->SetRenderTarget(0, m_pOriginalMapSurf); 
			m_pd3dDevice->SetDepthStencilSurface(m_pMapZ); 
 
			// ビューポートの変更 
			D3DVIEWPORT9 viewport = {0,0      // 左上の座標 
							, MAP_WIDTH  // 幅 
							, MAP_HEIGHT // 高さ 
							, 0.0f,1.0f};     // 前面、後面 
			m_pd3dDevice->SetViewport(&viewport); 
 
			// マップのクリア 
			m_pd3dDevice->Clear(0L, NULL 
							, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER 
							, 0x003040, 1.0f, 0L); 
 
			//------------------------------------------------- 
			// 1パス:テクスチャにレンダリングの作成 
			//------------------------------------------------- 
			m_pEffect->SetTechnique( "SimpleTech" ); 
			m_pEffect->Begin( NULL, 0 ); 
 
			mW = m_mWorld; 
			m_pEffect->SetMatrix( "mWorldIT", &mW ); 
			m = mW * m_mView * m_mProj; 
			m_pEffect->SetMatrix( "mWorldViewProjection", &m); 
			v = D3DXVECTOR4(1,1,1,0); 
			m_pEffect->SetVector( "MaterialAmbientColor", &v); 
			v = D3DXVECTOR4(0,0,0,0); 
			m_pEffect->SetVector( "MaterialDiffuseColor", &v); 
 
			m_pEffect->SetTexture( "SrcMap", m_pMeshBg->m_pTextures[0] ); 
 
			BEGIN_PASS(0); 
			m_pMeshBg->Render( m_pd3dDevice ); 
			END_PASS(); 
 
			// 飛行モデルの描画 
			D3DXMatrixTranslation( &m, 1.0f, 0.0f ,0.0f ); 
			D3DXMatrixRotationY( &mR,  fmod( 2.0f * m_fTime, 2.0f*3.14159265f) ); 
			D3DXMatrixTranslation( &mT, 0.0f, 1.0f ,1.0f ); 
			mW = m * mR * mT * m_mWorld; 
			m_pEffect->SetMatrix( "mWorldIT", &mW); 
			m = mW * m_mView * m_mProj; 
			m_pEffect->SetMatrix( "mWorldViewProjection", &m); 
			v = D3DXVECTOR4(0.3,0.3,0.3,0); 
			m_pEffect->SetVector( "MaterialAmbientColor", &v); 
			v = D3DXVECTOR4(0.7,0.7,0.7,0); 
			m_pEffect->SetVector( "MaterialDiffuseColor", &v); 
			m_pEffect->SetTexture( "SrcMap", m_pMesh->m_pTextures[0] ); 
 
			BEGIN_PASS(0); 
			m_pMesh  ->Render( m_pd3dDevice ); 
			END_PASS(); 
 
			m_pEffect->End(); 
 
 
			//------------------------------------------------- 
			// 縮小バッファにコピー 
			//------------------------------------------------- 
			RS( D3DRS_ZENABLE, FALSE ); 
			m_pEffect->SetTechnique( "SmallTech" ); 
			m_pEffect->Begin( NULL, 0 ); 
			 
			for( i=0;i<2;i++ ) 
			{ 
				m_pd3dDevice->SetRenderTarget(0, m_pColorMapSurf[i]); 
 
				static const float Vertex1[4][5] = { 
					// x      y     z      tu    tv 
					{-1.0f, -1.0f, 0.5f,   0, 0,}, 
					{+1.0f, -1.0f, 0.5f,   1, 0,}, 
					{+1.0f, +1.0f, 0.5f,   1, 1,}, 
					{-1.0f, +1.0f, 0.5f,   0, 1,}, 
				}; 
				m_pd3dDevice->SetFVF( D3DFVF_XYZ | D3DFVF_TEX1 ); 
				if(0==i) 
				{ 
					m_pEffect->SetTexture( "SrcMap", m_pOriginalMap ); 
					m_pEffect->SetFloat( "INV_TEXSIZE", 1.0 / 512.0 ); 
				}else{ 
					m_pEffect->SetTexture( "SrcMap", m_pColorMap[i-1]); 
					m_pEffect->SetFloat( "INV_TEXSIZE", 1.0f/(FLOAT)COLOR_MAP[i-1]); 
				} 
				 
				BEGIN_PASS(0); 
				m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
								, 2, Vertex1, 5*sizeof( float ) ); 
				END_PASS(); 
			} 
			m_pEffect->End(); 
 
			//------------------------------------------------- 
			// モノトーン化 
			//------------------------------------------------- 
			m_pEffect->SetTechnique( "TShader" ); 
			m_pEffect->Begin( NULL, 0 ); 
 
			//------------------------------------------------- 
			// フィルタリング 
			//------------------------------------------------- 
			m_pd3dDevice->SetRenderTarget(0, m_pPostMapSurf); 
 
			TVERTEX Vertex1[4] = { 
				//   x         y         z     w       tu    tv 
				{        0.0f-0.5,         0.0f-0.5, 0.1f, 1.0f,   0, 0,}, 
				{COLOR_MAP[0]-0.5,         0.0f-0.5, 0.1f, 1.0f,   1, 0,}, 
				{COLOR_MAP[0]-0.5, COLOR_MAP[0]-0.5, 0.1f, 1.0f,   1, 1,}, 
				{        0.0f-0.5, COLOR_MAP[0]-0.5, 0.1f, 1.0f,   0, 1,}, 
			}; 
			m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
			m_pEffect->SetTexture( m_htSrcMap, m_pColorMap[0] ); 
 
			BEGIN_PASS(0); 
			m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
							, 2, Vertex1, sizeof( TVERTEX ) ); 
			END_PASS(); 
 
			m_pEffect->End(); 
 
			//------------------------------------------------- 
			// Wavelet係数の計算 
			//------------------------------------------------- 
			m_pEffect->SetTechnique( "WaveletTech" ); 
			m_pEffect->Begin( NULL, 0 ); 
 
			m_pEffect->SetFloat( "INV_TEXSIZE", 1.0f/(FLOAT)COLOR_MAP[0]); 
			m_pEffect->SetTexture( "PointMap", m_pPostMap ); 
			m_pd3dDevice->SetFVF( D3DFVF_XYZ | D3DFVF_TEX1 ); 
 
			for( i=0;i<4;i++ ) 
			{ 
				m_pd3dDevice->SetRenderTarget(0, m_pCoeffMapSurf[0][i]); 
 
				static float Vertex[4][5] = { 
					// x      y     z     tu tv 
					{-1.0f, -1.0f, 0.5f,   0, 0,}, 
					{+1.0f, -1.0f, 0.5f,   1, 0,}, 
					{+1.0f, +1.0f, 0.5f,   1, 1,}, 
					{-1.0f, +1.0f, 0.5f,   0, 1,}, 
				}; 
				m_pEffect->SetTexture( "WaveletTexture", m_pWaveletMap[i] ); 
				BEGIN_PASS(0); 
				m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
								, 2, Vertex, 5*sizeof( float ) ); 
				END_PASS(); 
			} 
 
			m_pEffect->End(); 
 
 
 
			//------------------------------------------------- 
			// Wavelet係数の縮小化 
			//------------------------------------------------- 
			m_pEffect->SetTechnique( "SmallTech4" ); 
			m_pEffect->Begin( NULL, 0 ); 
			 
			for( i=0;i<4;i++ ) 
			{ 
				m_pd3dDevice->SetRenderTarget(0, m_pCoeffMapSurf[1][i]); 
 
				float Vertex1[4][5] = { 
					// x      y     z      tu    tv 
					{-1.0f, -1.0f, 0.5f,   0, 0,}, 
					{+1.0f, -1.0f, 0.5f,   1, 0,}, 
					{+1.0f, +1.0f, 0.5f,   1, 1,}, 
					{-1.0f, +1.0f, 0.5f,   0, 1,}, 
				}; 
				m_pd3dDevice->SetFVF( D3DFVF_XYZ | D3DFVF_TEX1 ); 
				m_pEffect->SetTexture( "SrcMap", m_pCoeffMap[0][i]); 
				m_pEffect->SetFloat( "INV_TEXSIZE", 1.0f/(FLOAT)COLOR_MAP[0]); 
				BEGIN_PASS(0); 
				m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
								, 2, Vertex1, 5*sizeof( float ) ); 
				END_PASS(); 
 
			} 
			m_pEffect->End(); 
 
			//------------------------------------------------- 
			// 各文字との係数の比較をする 
			//------------------------------------------------- 
			{ 
			m_pEffect->SetTechnique( "DiffTech" ); 
			m_pEffect->Begin( NULL, 0 ); 
			 
			m_pEffect->SetTexture( "PointMap", m_pAsciiCoeffMap ); 
			m_pEffect->SetTexture( "SrcMap0", m_pCoeffMap[1][0]); 
			m_pEffect->SetTexture( "SrcMap1", m_pCoeffMap[1][1]); 
			m_pEffect->SetTexture( "SrcMap2", m_pCoeffMap[1][2]); 
			m_pEffect->SetTexture( "SrcMap3", m_pCoeffMap[1][3]); 
 
			static const TVERTEX Vertex[4] = { 
				//        x                 y         z     w     tu tv 
				{        0.0f-0.5,         0.0f-0.5, 0.1f, 1.0f,   0, 0,}, 
				{COLOR_MAP[1]-0.5,         0.0f-0.5, 0.1f, 1.0f,   1, 0,}, 
				{COLOR_MAP[1]-0.5, COLOR_MAP[1]-0.5, 0.1f, 1.0f,   1, 1,}, 
				{        0.0f-0.5, COLOR_MAP[1]-0.5, 0.1f, 1.0f,   0, 1,}, 
			}; 
 
			m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
 
			for( i=0;i<13;i++ ) 
			{ 
				m_pd3dDevice->SetRenderTarget( 0, m_pDiffMapSurf[i] ); 
 
				for(j=0;j<4;j++) 
				{ 
					m_pEffect->SetFloat( "INV_TEXSIZE", (1.0/13.0)*(float)i + (1.0/52.0)*(float)j ); 
					if(0==j) m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED ); else 
					if(1==j) m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_GREEN ); else 
					if(2==j) m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE,  D3DCOLORWRITEENABLE_BLUE); else 
					if(3==j) m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA ); 
 
					BEGIN_PASS(0); 
					m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
										, 2, Vertex, sizeof( TVERTEX ) ); 
					END_PASS(); 
				} 
			} 
			m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0xf ); 
			m_pEffect->End(); 
			} 
 
			//------------------------------------------------- 
			// 係数を比較(52→13) 
			//------------------------------------------------- 
			{ 
			m_pEffect->SetTechnique( "CompareTech" ); 
			m_pEffect->Begin( NULL, 0 ); 
			 
			static const TVERTEX Vertex[4] = { 
				//   x         y         z     w       tu    tv 
				{        0.0f-0.5,         0.0f-0.5, 0.1f, 1.0f,   0, 0,}, 
				{COLOR_MAP[1]-0.5,         0.0f-0.5, 0.1f, 1.0f,   1, 0,}, 
				{COLOR_MAP[1]-0.5, COLOR_MAP[1]-0.5, 0.1f, 1.0f,   1, 1,}, 
				{        0.0f-0.5, COLOR_MAP[1]-0.5, 0.1f, 1.0f,   0, 1,}, 
			}; 
 
			m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
			m_pd3dDevice->SetRenderTarget( 0, m_pValue0MapSurf ); 
			m_pd3dDevice->SetRenderTarget( 1, m_pIndex0MapSurf ); 
 
			for( i=0;i<4;i++ ) 
			{ 
				switch(i) 
				{ 
				case 0: 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_RED ); 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE1,D3DCOLORWRITEENABLE_RED ); 
					break; 
				case 1: 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_GREEN); 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE1,D3DCOLORWRITEENABLE_GREEN); 
					break; 
				case 2: 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_BLUE); 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE1,D3DCOLORWRITEENABLE_BLUE); 
					break; 
				case 3: 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_ALPHA); 
					m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE1,D3DCOLORWRITEENABLE_ALPHA); 
					break; 
				} 
 
				if( 3!=i ) 
				{ 
					m_pEffect->SetTexture( "SrcMap0", m_pDiffMap[i*4+0]); 
					m_pEffect->SetTexture( "SrcMap1", m_pDiffMap[i*4+1]); 
					m_pEffect->SetTexture( "SrcMap2", m_pDiffMap[i*4+2]); 
					m_pEffect->SetTexture( "SrcMap3", m_pDiffMap[i*4+3]); 
				}else{ 
					m_pEffect->SetTexture( "SrcMap0", m_pDiffMap[i*4+0]); 
					m_pEffect->SetTexture( "SrcMap1", m_pDiffMap[i*4+0]); 
					m_pEffect->SetTexture( "SrcMap2", m_pDiffMap[i*4+0]); 
					m_pEffect->SetTexture( "SrcMap3", m_pDiffMap[i*4+0]); 
				} 
 
				m_pEffect->SetFloat( "INV_TEXSIZE", (16.0/52.0)*(float)i ); 
 
				BEGIN_PASS(0); 
				m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
								, 2, Vertex, sizeof( TVERTEX ) ); 
				END_PASS(); 
			} 
			m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, 0xf ); 
			m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE1, 0xf ); 
			m_pd3dDevice->SetRenderTarget( 1, NULL ); 
			m_pEffect->End(); 
			} 
			//------------------------------------------------- 
			// 係数を比較(13→1) 
			//------------------------------------------------- 
			{ 
			m_pEffect->SetTechnique( "Compare2Tech" ); 
			m_pEffect->Begin( NULL, 0 ); 
			 
			static const TVERTEX Vertex[4] = { 
				//        x                 y         z     w     tu tv 
				{        0.0f-0.5,         0.0f-0.5, 0.1f, 1.0f,   0, 0,}, 
				{COLOR_MAP[1]-0.5,         0.0f-0.5, 0.1f, 1.0f,   1, 0,}, 
				{COLOR_MAP[1]-0.5, COLOR_MAP[1]-0.5, 0.1f, 1.0f,   1, 1,}, 
				{        0.0f-0.5, COLOR_MAP[1]-0.5, 0.1f, 1.0f,   0, 1,}, 
			}; 
 
			m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
 
			m_pd3dDevice->SetRenderTarget( 0, m_pIndex1MapSurf ); 
			 
			m_pEffect->SetTexture( "SrcMap0",  m_pValue0Map ); 
			m_pEffect->SetTexture( "IndexMap", m_pIndex0Map); 
 
			BEGIN_PASS(0); 
			m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
								, 2, Vertex, sizeof( TVERTEX ) ); 
			END_PASS(); 
 
			m_pEffect->End(); 
			} 
 
			//------------------------------------------------- 
			// 最終合成 
			//------------------------------------------------- 
			{ 
			m_pEffect->SetTechnique( "FinalTech" ); 
			m_pEffect->Begin( NULL, 0 ); 
 
			//------------------------------------------------- 
			// フィルタリング 
			//------------------------------------------------- 
			m_pd3dDevice->SetRenderTarget(0, m_pFinalMapSurf); 
 
			static const TVERTEX Vertex[4] = { 
				//      x               y         z     w     tu tv 
				{      0.0f-0.5,       0.0f-0.5, 0.1f, 1.0f,   0, 0,}, 
				{ MAP_WIDTH-0.5,       0.0f-0.5, 0.1f, 1.0f,   1, 0,}, 
				{ MAP_WIDTH-0.5, MAP_HEIGHT-0.5, 0.1f, 1.0f,   1, 1,}, 
				{      0.0f-0.5, MAP_HEIGHT-0.5, 0.1f, 1.0f,   0, 1,}, 
			}; 
			m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
			m_pEffect->SetTexture( m_htSrcMap, m_pAsciiMap ); 
			m_pEffect->SetTexture( "PointMap", m_pColorMap[1] ); 
			m_pEffect->SetTexture( "SrcMap0",  m_pIndex1Map ); 
			 
			BEGIN_PASS(0); 
			m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
							, 2, Vertex, sizeof( TVERTEX ) ); 
			END_PASS(); 
 
			m_pEffect->End(); 
			} 
 
 
		} 
 
		//----------------------------------------------------- 
		// レンダリングターゲットを元に戻す 
		//----------------------------------------------------- 
		m_pd3dDevice->SetRenderTarget(0, pOldBackBuffer); 
		m_pd3dDevice->SetDepthStencilSurface(pOldZBuffer); 
		m_pd3dDevice->SetViewport(&oldViewport); 
		pOldBackBuffer->Release(); 
		pOldZBuffer->Release(); 
 
		//----------------------------------------------------- 
		// そのまま張る 
		//----------------------------------------------------- 
		FLOAT w = (FLOAT)oldViewport.Width; 
		FLOAT h = (FLOAT)oldViewport.Height; 
		TSS(0,D3DTSS_COLOROP,	D3DTOP_SELECTARG1); 
		TSS(0,D3DTSS_COLORARG1,	D3DTA_TEXTURE); 
		TSS(1,D3DTSS_COLOROP,   D3DTOP_DISABLE); 
			 
		m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
#if 0 
		TVERTEX Vertex1[4] = { 
			//x  y   z    rhw  tu tv 
			{ 0 - 0.5f, 0 - 0.5f, 0.1f, 1.0f, 0, 0,}, 
			{ w - 0.5f, 0 - 0.5f, 0.1f, 1.0f, 1, 0,}, 
			{ w - 0.5f, h - 0.5f, 0.1f, 1.0f, 1, 1,}, 
			{ 0 - 0.5f, h - 0.5f, 0.1f, 1.0f, 0, 1,}, 
		}; 
		m_pd3dDevice->SetTexture(0, m_pOriginalMap); 
		m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
							, 2, Vertex1, sizeof( TVERTEX ) ); 
#endif 
		//----------------------------------------------------- 
		// 変換したものを張る 
		//----------------------------------------------------- 
 
		TVERTEX Vertex2[4] = { 
			//   x    y   z    rhw    tu    tv 
#if 0 
			{ 0.0f - 0.5f,   0 - 0.5f, 0.1f, 1.0f, 0.0f, 0.0f,}, 
			{ 0.5f*w - 0.5f, 0 - 0.5f, 0.1f, 1.0f, 0.5f, 0.0f,}, 
			{ 0.5f*w - 0.5f, h - 0.5f, 0.1f, 1.0f, 0.5f, 1.0f,}, 
			{ 0.0f - 0.5f,   h - 0.5f, 0.1f, 1.0f, 0.0f, 1.0f,}, 
#else 
			{ 0.0f - 0.5f, 0 - 0.5f, 0.1f, 1.0f, 0.0f, 0.0f,}, 
			{    w - 0.5f, 0 - 0.5f, 0.1f, 1.0f, 1.0f, 0.0f,}, 
			{    w - 0.5f, h - 0.5f, 0.1f, 1.0f, 1.0f, 1.0f,}, 
			{ 0.0f - 0.5f, h - 0.5f, 0.1f, 1.0f, 0.0f, 1.0f,}, 
#endif 
		}; 
		m_pd3dDevice->SetTexture(0, m_pFinalMap ); 
//		m_pd3dDevice->SetTexture(0, m_pColorMap[1] ); 
//		m_pd3dDevice->SetTexture(0, m_pPostMap); 
		m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN 
							, 2, Vertex2, sizeof( TVERTEX ) ); 
 
		{ 
		m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,	D3DTOP_SELECTARG1); 
		m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,	D3DTA_TEXTURE); 
		m_pd3dDevice->SetTextureStageState(1,D3DTSS_COLOROP,    D3DTOP_DISABLE); 
		m_pd3dDevice->SetVertexShader(NULL); 
		m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); 
		m_pd3dDevice->SetPixelShader(0); 
		float scale = 64.0f; 
#ifdef _DEBUG// デバッグ用にテクスチャを表示する 
		for(DWORD i=0; i<8; i++){ 
#else 
		for(DWORD i=0; i<1; i++){ 
#endif 
			TVERTEX Vertex[4] = { 
				// x  y  z rhw tu tv 
				{    0,(i+0)*scale,0, 1, 0, 0,}, 
				{scale,(i+0)*scale,0, 1, 1, 0,}, 
				{scale,(i+1)*scale,0, 1, 1, 1,}, 
				{    0,(i+1)*scale,0, 1, 0, 1,}, 
			}; 
			if(0==i) m_pd3dDevice->SetTexture( 0, m_pOriginalMap ); 
			if(1==i) m_pd3dDevice->SetTexture( 0, m_pPostMap ); 
			if(2==i) m_pd3dDevice->SetTexture( 0, m_pAsciiCoeffMap ); 
			if(3==i) m_pd3dDevice->SetTexture( 0, m_pColorMap[1] ); 
 
			if(4==i) m_pd3dDevice->SetTexture( 0, m_pValue0Map ); 
			if(5==i) m_pd3dDevice->SetTexture( 0, m_pIndex0Map ); 
			if(6==i) m_pd3dDevice->SetTexture( 0, m_pIndex1Map ); 
			if(4==i) m_pd3dDevice->SetTexture( 0, m_pDiffMap[0] ); 
			if(5==i) m_pd3dDevice->SetTexture( 0, m_pDiffMap[1] ); 
			if(6==i) m_pd3dDevice->SetTexture( 0, m_pDiffMap[2] ); 
			if(7==i) m_pd3dDevice->SetTexture( 0, m_pDiffMap[3] ); 
//			if(4==i) m_pd3dDevice->SetTexture( 0, m_pCoeffMap[1][0] ); 
//			if(5==i) m_pd3dDevice->SetTexture( 0, m_pCoeffMap[1][1] ); 
//			if(6==i) m_pd3dDevice->SetTexture( 0, m_pCoeffMap[1][2] ); 
//			if(7==i) m_pd3dDevice->SetTexture( 0, m_pCoeffMap[1][3] ); 
//			if(4==i) m_pd3dDevice->SetTexture( 0, m_pWaveletMap[0] ); 
//			if(5==i) m_pd3dDevice->SetTexture( 0, m_pWaveletMap[1] ); 
//			if(6==i) m_pd3dDevice->SetTexture( 0, m_pWaveletMap[2] ); 
//			if(7==i) m_pd3dDevice->SetTexture( 0, m_pWaveletMap[3] ); 
			m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TVERTEX ) ); 
		} 
		} 
 
        // ヘルプの表示 
        RenderText(); 
 
		RS( D3DRS_ZENABLE, TRUE ); 
 
		// 描画の終了 
        m_pd3dDevice->EndScene(); 
    } 
 
    return S_OK; 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: RenderText() 
// Desc: 状態やヘルプを画面に表示する 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::RenderText() 
{ 
    D3DCOLOR fontColor        = D3DCOLOR_ARGB(255,255,255,0); 
    TCHAR szMsg[MAX_PATH] = TEXT(""); 
 
    FLOAT fNextLine = 40.0f; // 表示する高さ 
 
    // 操作法やパラメータを表示する 
    fNextLine = (FLOAT) m_d3dsdBackBuffer.Height;  
//    lstrcpy( szMsg, TEXT("Press 'F2' to configure display") ); 
//    fNextLine -= 20.0f; 
//    m_pFont->DrawText( 2, fNextLine, fontColor, szMsg ); 
 
    lstrcpy( szMsg, m_strDeviceStats ); 
    fNextLine -= 20.0f; 
    m_pFont->DrawText( 2, fNextLine, fontColor, szMsg ); 
    lstrcpy( szMsg, m_strFrameStats ); 
    fNextLine -= 20.0f; 
    m_pFont->DrawText( 2, fNextLine, fontColor, szMsg ); 
	 
#ifndef _DEBUG 
	fNextLine = (FLOAT) 2;  
    m_pFont->DrawText( m_d3dsdBackBuffer.Width-80+2, fNextLine+2, 0xff000000, TEXT("t-pot.com") ); 
    m_pFont->DrawText( m_d3dsdBackBuffer.Width-80+0, fNextLine,   0xffff8040, TEXT("t-pot.com") ); 
#endif //! _DEBUG 
 
	return S_OK; 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: MsgProc() 
// Desc: WndProc をオーバーライドしたもの 
//------------------------------------------------------------- 
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT msg, 
                                 WPARAM wParam, LPARAM lParam ) 
{ 
    switch( msg ) 
    { 
        case WM_PAINT: 
        { 
            if( m_bLoadingApp ) 
            { 
                // ロード中 
                HDC hDC = GetDC( hWnd ); 
                TCHAR strMsg[MAX_PATH]; 
                wsprintf(strMsg, TEXT("Loading... Please wait")); 
                RECT rct; 
                GetClientRect( hWnd, &rct ); 
                DrawText( hDC, strMsg, -1, &rct 
                		, DT_CENTER|DT_VCENTER|DT_SINGLELINE ); 
                ReleaseDC( hWnd, hDC ); 
            } 
            break; 
        } 
 
    } 
 
    return CD3DApplication::MsgProc( hWnd, msg, wParam, lParam ); 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: InvalidateDeviceObjects() 
// Desc: RestoreDeviceObjects() で作成したオブジェクトの開放 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::InvalidateDeviceObjects() 
{ 
	DWORD i, j; 
 
	// テクスチャ 
	SAFE_RELEASE(m_pFinalMapSurf); 
	SAFE_RELEASE(m_pFinalMap); 
	SAFE_RELEASE(m_pPostMapSurf); 
	SAFE_RELEASE(m_pPostMap); 
	SAFE_RELEASE(m_pOriginalMapSurf); 
	SAFE_RELEASE(m_pOriginalMap); 
	SAFE_RELEASE(m_pMapZ); 
 
	SAFE_RELEASE(m_pIndex1MapSurf); 
	SAFE_RELEASE(m_pIndex1Map); 
	SAFE_RELEASE(m_pValue0MapSurf); 
	SAFE_RELEASE(m_pValue0Map); 
	SAFE_RELEASE(m_pIndex0MapSurf); 
	SAFE_RELEASE(m_pIndex0Map); 
 
	for( i=0;i<13;i++ ) 
	{ 
		SAFE_RELEASE(m_pDiffMapSurf[i]); 
		SAFE_RELEASE(m_pDiffMap[i]); 
	} 
 
	for( i=0;i<2;i++ ) 
	{ 
		SAFE_RELEASE(m_pColorMapSurf[i]); 
		SAFE_RELEASE(m_pColorMap[i]); 
	} 
 
	// テクスチャ 
	for( i=0;i<2;i++ ) 
	for( j=0;j<4;j++ ) 
	{ 
		SAFE_RELEASE(m_pCoeffMapSurf[i][j]); 
		SAFE_RELEASE(m_pCoeffMap[i][j]); 
	} 
 
	// テクスチャ 
	SAFE_RELEASE(m_pAsciiCoeffMap); 
	SAFE_RELEASE(m_pAsciiMap); 
	for( i=0;i<4;i++ ) 
	{ 
		SAFE_RELEASE(m_pWaveletMap[i]); 
	} 
 
	m_pMesh  ->InvalidateDeviceObjects(); // メッシュ 
	m_pMeshBg->InvalidateDeviceObjects(); 
 
    m_pFont->InvalidateDeviceObjects();	// フォント 
 
	// シェーダ 
    if( m_pEffect != NULL ) m_pEffect->OnLostDevice(); 
 
    return S_OK; 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: DeleteDeviceObjects() 
// Desc: InitDeviceObjects() で作成したオブジェクトを開放する 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::DeleteDeviceObjects() 
{ 
	// シェーダ 
	SAFE_RELEASE( m_pEffect ); 
 
	// メッシュ 
	m_pMesh  ->Destroy(); 
	m_pMeshBg->Destroy(); 
 
    // フォント 
    m_pFont->DeleteDeviceObjects(); 
 
    return S_OK; 
} 
 
 
 
 
//------------------------------------------------------------- 
// Name: FinalCleanup() 
// Desc: 終了する直線に呼ばれる 
//------------------------------------------------------------- 
HRESULT CMyD3DApplication::FinalCleanup() 
{ 
    SAFE_DELETE( m_pMeshBg ); // メッシュ 
	SAFE_DELETE( m_pMesh ); 
 
    SAFE_DELETE( m_pFont );	// フォント 
 
    return S_OK; 
}