⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meshfromobj.cpp

📁 DX例子中等难度的。全是新例子。VC2003
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	mView = *g_Camera.GetViewMatrix();
	pd3dDevice->SetTransform( D3DTS_VIEW, &mView );

	//设置投影矩阵
	D3DXMATRIXA16 mProj; 
	mProj = *g_Camera.GetProjMatrix();
	pd3dDevice->SetTransform( D3DTS_PROJECTION, &mProj );
}


//-----------------------------------------------------------------------------
// Desc: 渲染场景
//-----------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, 
							 float fElapsedTime, void* pUserContext )
{
    //如果正在利用Direct3D设备设置对话框进行设置, 则不渲染场景
    if( g_SettingsDlg.IsActive() )
    {
        g_SettingsDlg.OnRender( fElapsedTime );
        return;
    }

    HRESULT hr;
    
    //清除后台颜色缓冲区和深度缓冲区
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 
		D3DCOLOR_ARGB(0, 141, 153, 191), 1.0f, 0) );

    //渲染场景
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        //渲染网格模型
        UINT iCurSubset = (UINT)(INT_PTR) g_SampleUI.GetComboBox( IDC_SUBSET )->GetSelectedData();
        
		if( iCurSubset == -1 )  //-1表示渲染全部子模型
        {
            for( UINT iSubset = 0; iSubset < g_MeshLoader.GetNumMaterials(); iSubset++ )
            {
                RenderSubset( iSubset, pd3dDevice);
            }
        }
        else
        {
            RenderSubset( iCurSubset, pd3dDevice);
        }

		//渲染文本和控件
        RenderText();
        V( g_HUD.OnRender( fElapsedTime ) );
        V( g_SampleUI.OnRender( fElapsedTime ) );

        V( pd3dDevice->EndScene() );
    }
}


//-----------------------------------------------------------------------------
// Desc: 辅助函数, 渲染指定的子网格模型
//-----------------------------------------------------------------------------
void RenderSubset( UINT iSubset, IDirect3DDevice9* pd3dDevice)
{
   
    //获取当前子网格模型的材质和纹理
    ID3DXMesh* pMesh = g_MeshLoader.GetMesh();
    Material* pMaterial = g_MeshLoader.GetMaterial( iSubset );

	//为当前子网格模型设置材质
	static D3DMATERIAL9 mtrl;
    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
	mtrl.Ambient.r = pMaterial->vAmbient.x;
    mtrl.Ambient.g = pMaterial->vAmbient.x;
    mtrl.Ambient.b = pMaterial->vAmbient.x;
    mtrl.Ambient.a = pMaterial->fAlpha;
	mtrl.Diffuse.r = pMaterial->vDiffuse.x;
    mtrl.Diffuse.g = pMaterial->vDiffuse.y;
    mtrl.Diffuse.b = pMaterial->vDiffuse.z;
    mtrl.Diffuse.a = pMaterial->fAlpha;
	mtrl.Specular.r = pMaterial->vSpecular.x;
    mtrl.Specular.g = pMaterial->vSpecular.y;
    mtrl.Specular.b = pMaterial->vSpecular.z;
    mtrl.Specular.a = pMaterial->fAlpha;
    pd3dDevice->SetMaterial( &mtrl );

	//为当前子网格模型设置纹理
	pd3dDevice->SetTexture( 0, pMaterial->pTexture );

	//渲染当前子网格模型
    pMesh->DrawSubset( iSubset );
}


//-----------------------------------------------------------------------------
// Desc: 渲染文本
//-----------------------------------------------------------------------------
void RenderText()
{
    CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );

    //显示当前Direct3D设备状态和渲染帧速率
    txtHelper.Begin();
    txtHelper.SetInsertionPos( 5, 5 );
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
    txtHelper.DrawTextLine( DXUTGetFrameStats(true) );
    txtHelper.DrawTextLine( DXUTGetDeviceStats() );

	//显示其他简要信息
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
	txtHelper.DrawTextLine( L"从.OBJ格式文件加载网格模型" );
    txtHelper.DrawTextLine( g_strFileSaveMessage );
    
    //显示简单帮助文本
    if( g_bShowHelp )
    {
        const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc();
        txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*5 );
        txtHelper.SetForegroundColor( D3DCOLOR_ARGB( 200, 50, 50, 50 ) );
        txtHelper.DrawTextLine( L"Controls (F1 to hide):" );

        txtHelper.SetInsertionPos( 20, pd3dsdBackBuffer->Height-15*4 );
        txtHelper.DrawTextLine( L"Rotate model: Left mouse button\n"
                                L"Rotate camera: Right mouse button\n"
                                L"Zoom camera: Mouse wheel scroll\n" );

        txtHelper.SetInsertionPos( 250, pd3dsdBackBuffer->Height-15*4 );
        txtHelper.DrawTextLine( L"Hide help: F1\n"); 
        txtHelper.DrawTextLine( L"Quit: ESC\n" );
    }
    else
    {
        txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
        txtHelper.DrawTextLine( L"Press F1 for help" );
    }

    txtHelper.End();
}


//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )
{
    *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
    if( *pbNoFurtherProcessing )
        return 0;

    if( g_SettingsDlg.IsActive() )
    {
        g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
        return 0;
    }

    *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
    if( *pbNoFurtherProcessing )
        return 0;
    *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
    if( *pbNoFurtherProcessing )
        return 0;

    g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );

    return 0;
}


//-----------------------------------------------------------------------------
// Desc: 键盘消息处理
//-----------------------------------------------------------------------------
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
    if( bKeyDown )
    {
        switch( nChar )
        {
            case VK_F1: g_bShowHelp = !g_bShowHelp; break;
        }
    }
}


//-----------------------------------------------------------------------------
// Desc: 处理各种控件消息
//-----------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, 
						  void* pUserContext )
{
    switch( nControlID )
    {
        case IDC_TOGGLEFULLSCREEN:
			DXUTToggleFullScreen();
			break;

        case IDC_TOGGLEREF:
			DXUTToggleREF(); 
			break;

        case IDC_CHANGEDEVICE:
			g_SettingsDlg.SetActive( !g_SettingsDlg.IsActive() ); 
			break;

        case IDC_SAVETOX:
			SaveMeshToXFile();  //将网格模型保存到.X文件
			break;      
    }
}


//-----------------------------------------------------------------------------
// Desc: 释放在OnResetDevice()中创建的资源
//-----------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{
    g_DialogResourceManager.OnLostDevice();
    g_SettingsDlg.OnLostDevice();
    if( g_pFont )
        g_pFont->OnLostDevice();
    SAFE_RELEASE(g_pTextSprite);
}


//------------------------------------------------------------------------------
// Desc: 释放在OnCreateDevice()中创建的资源
//------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{
    g_DialogResourceManager.OnDestroyDevice();
    g_SettingsDlg.OnDestroyDevice();
    
    SAFE_RELEASE( g_pFont );
    
    g_MeshLoader.Destroy();
}

//------------------------------------------------------------------------------
// Desc: 辅助函数, 将网格模型保存到.X文件
//------------------------------------------------------------------------------
void SaveMeshToXFile()
{
    HRESULT hr;

	//填充材质结构
    UINT numMaterials = g_MeshLoader.GetNumMaterials();
    D3DXMATERIAL *pMaterials = new D3DXMATERIAL[numMaterials];
    char *pStrTexture = new char[MAX_PATH * numMaterials];
    if ((pMaterials != NULL) && (pStrTexture != NULL))
    {
        for( UINT i=0; i < g_MeshLoader.GetNumMaterials(); i++ )
        {
            Material* pMat = g_MeshLoader.GetMaterial( i );
            if (pMat != NULL)
            {
                pMaterials[i].MatD3D.Ambient.r = pMat->vAmbient.x;
                pMaterials[i].MatD3D.Ambient.g = pMat->vAmbient.y;
                pMaterials[i].MatD3D.Ambient.b = pMat->vAmbient.z;
                pMaterials[i].MatD3D.Ambient.a = pMat->fAlpha;

                pMaterials[i].MatD3D.Diffuse.r = pMat->vDiffuse.x;
                pMaterials[i].MatD3D.Diffuse.g = pMat->vDiffuse.y;
                pMaterials[i].MatD3D.Diffuse.b = pMat->vDiffuse.z;
                pMaterials[i].MatD3D.Diffuse.a = pMat->fAlpha;

                pMaterials[i].MatD3D.Specular.r = pMat->vSpecular.x;
                pMaterials[i].MatD3D.Specular.g = pMat->vSpecular.y;
                pMaterials[i].MatD3D.Specular.b = pMat->vSpecular.z;
                pMaterials[i].MatD3D.Specular.a = pMat->fAlpha;

                pMaterials[i].MatD3D.Emissive.r = 0;
                pMaterials[i].MatD3D.Emissive.g = 0;
                pMaterials[i].MatD3D.Emissive.b = 0;
                pMaterials[i].MatD3D.Emissive.a = 0;

                pMaterials[i].MatD3D.Power = (float)pMat->nShininess;

                WideCharToMultiByte( CP_ACP, 0, pMat->strTexture, -1, (pStrTexture + i*MAX_PATH), MAX_PATH, NULL, NULL );
                pMaterials[i].pTextureFilename = (pStrTexture + i*MAX_PATH);
            }
        
        }
        
        // Write to file in same directory where the .obj file was found
        WCHAR strBuf[ MAX_PATH ];
        StringCchPrintf( strBuf, MAX_PATH-1, L"%s\\%s", g_MeshLoader.GetMediaDirectory(), L"MeshFromOBJ.x" );
        hr = D3DXSaveMeshToX( strBuf, g_MeshLoader.GetMesh(), NULL, 
                              pMaterials, NULL, numMaterials, 
                              D3DXF_FILEFORMAT_TEXT );

        if( SUCCEEDED(hr) )
        {
            StringCchPrintf( g_strFileSaveMessage, MAX_PATH-1, L"Created %s", strBuf );
        }
        else
        {
            DXTRACE_ERR( L"SaveMeshToXFile()::D3DXSaveMeshToX", hr );
            StringCchPrintf( g_strFileSaveMessage, MAX_PATH-1, L"Error creating %s, check debug output", strBuf );      
        }
    }
    
    SAFE_DELETE_ARRAY( pMaterials );
    SAFE_DELETE_ARRAY( pStrTexture );
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -