在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例图形和图像处理 → 3d显示图像(c++源码)

3d显示图像(c++源码)

图形和图像处理

下载此实例
  • 开发语言:C/C++
  • 实例大小:3.37M
  • 下载次数:35
  • 浏览次数:427
  • 发布时间:2019-11-06
  • 实例类别:图形和图像处理
  • 发 布 人:12lkf123
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 显示 3d 图像

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

#include "DxutStereoFrame.h"
#include <iostream>
#include "cvxImage.h"
#include <conio.h>
#include "nvmath.h"
#include "deviceParameters.h"
#include <fstream>
#include <Commdlg.h>

using namespace std;
using nv::vec3f;

// initialize the static parameters
CDXUTDialogResourceManager  DxutStereoFrame::s_dialogResourceManager;
CDXUTDialog                 DxutStereoFrame::s_controlPanel;                  
CDXUTDialog                 DxutStereoFrame::s_sampleUI;

ID3DXFont*                  DxutStereoFrame::s_pFont9 = NULL;
CDXUTTextHelper*            DxutStereoFrame::s_pTxtHelper = NULL;
ID3DXSprite*                DxutStereoFrame::s_pSprite9 = NULL;
CvxStereoSurface *          DxutStereoFrame::s_pStereoSurface = NULL;
D3dStereoCamera*		    DxutStereoFrame::s_pCamera = NULL;
StdGauge       *            DxutStereoFrame::s_pstdGauge = NULL;
StdGauge       *            DxutStereoFrame::s_groundTruthGauge = NULL;
UsertInputUI   *            DxutStereoFrame::s_userInput = NULL;
bool                        DxutStereoFrame::s_isFullScreen = false;
ImageModel  *               DxutStereoFrame::s_imageModel = NULL;
SampleItem  *               DxutStereoFrame::s_pSampleItem = NULL;
FileIO *                    DxutStereoFrame::s_fileIO = NULL;
bool						DxutStereoFrame::s_isFinishTesting = false;
int							DxutStereoFrame::s_lastMousePosX = 0;
int							DxutStereoFrame::s_lastMousePosY = 0;
CvxReferenceFrame *         DxutStereoFrame::s_pEstimatedItem = NULL;
bool                        DxutStereoFrame::s_isShowGroudTruth = false;

#define IDC_TOGGLEFULLSCREEN    1
#define IDC_PEAK                2
#define IDC_VALLEY              3
#define IDC_DEBUGUI_DEPTH       4
#define IDC_DEBUGUI_NX          5
#define IDC_DEBUGUI_NY          6
#define IDC_DEBUGUI_NZ          7
#define IDC_SLANT_ANGLE         8
#define IDC_ROTATE_ANGLE        9
#define IDC_MODEL_SELECTION     10
#define IDC_SHOW_REFERENCE      11
#define IDC_OPEN_NEW_FILE       12
#define IDC_SAVE_RESULT_FILE    13
#define IDC_OPEN_MULTIPLE_NEW_FILE 14

//--------------------------------------------------------------------------------------
// Initialize the app 
//--------------------------------------------------------------------------------------

void DxutStereoFrame::InitApp()
{

	s_userInput = new UsertInputUI;
	assert(s_userInput);

	s_controlPanel.Init( &DxutStereoFrame::s_dialogResourceManager );
	s_sampleUI.Init( &DxutStereoFrame::s_dialogResourceManager );

	s_controlPanel.SetCallback( OnGUIEvent ); int iY = 10;
	s_controlPanel.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen (F8)", 35, iY, 125, 22,  VK_F8);
	s_controlPanel.AddButton( IDC_OPEN_NEW_FILE, L"Open ...", 35, iY  = 30, 125, 22, L'O', false, &s_userInput->_openNewFile );
	s_controlPanel.AddButton( IDC_OPEN_MULTIPLE_NEW_FILE, L"Open Mult...", 35, iY  = 30, 125, 22, L'M', false, &s_userInput->_openMultipleNewFile );
	s_controlPanel.AddComboBox(IDC_MODEL_SELECTION, 35, iY  = 30, 125, 22, L'O', false, &s_userInput->_modelCB);
	s_controlPanel.AddCheckBox(IDC_SHOW_REFERENCE, L"Reference (R).", 35, iY  = 30, 125, 22, false, L'R', false,  &s_userInput->_showReference);
	

	if(s_userInput->_modelCB)
	{
		s_userInput->_modelCB->SetDropHeight( 50 );
		s_userInput->_modelCB->AddItem( L"Ground Truth",  &(s_userInput->models[0]));
		s_userInput->_modelCB->AddItem( L"Only Slant", &(s_userInput->models[2]));
		s_userInput->_modelCB->AddItem( L"Only Rotation", &(s_userInput->models[3]));
		s_userInput->_modelCB->AddItem( L"3D Rotation", &(s_userInput->models[4]));
	
	}
	s_sampleUI.SetCallback( OnGUIEvent ); iY = 10;

	//load a default configure file
//	string configFile("E:\\code\\d3d_stereo_image\\StereoCameraD3d\\StereoCameraD3d\\image_circle\\sphere_config.txt");
//	string configFile("E:\\code\\d3d_stereo_image\\StereoCameraD3d\\StereoCameraD3d\\monkey\\monkey_config.txt");
//	string configFile("E:\\code\\d3d_stereo_image\\StereoCameraD3d\\StereoCameraD3d\\monkey_transparent\\monkey_transparent_config.txt");
//	string configFile("E:\\code\\d3d_stereo_image\\StereoCameraD3d\\StereoCameraD3d\\random_obj_1\\random_obj_1_config.txt");
//	string configFile("E:\\code\\d3d_stereo_image\\StereoCameraD3d\\StereoCameraD3d\\random_object_2\\random_object_2_config.txt");
//	string configFile("E:\\code\\d3d_stereo_image\\StereoCameraD3d\\StereoCameraD3d\\random_object_2_mask\\random_object_mask_2_config.txt");
//	string configFile("F:\\drop_box\\Dropbox\\file_exchange\\gauge_experiment\\z_images\\practice_sphere\\config_bino.txt");
//	string configFile("F:\\drop_box\\Dropbox\\file_exchange\\gauge_experiment_blender\\images\\practice_sphere\\config_bino.txt");
	string configFile("F:\\drop_box\\Dropbox\\file_exchange\\gauge_experiment_hat\\images\\practice_sphere\\config_bino.txt");	

	// load default configure file
	bool isOk =  LoadConfigFile(configFile);

	if(!isOk)
	{
		_cprintf("can't open file %s, please open a new file.\n", configFile.c_str());
		isOk = OpenNewFile();
		return;
	}	
}

bool DxutStereoFrame::OpenNewFile()
{
	char szFile[1024] = {0};       // buffer for file name

	OPENFILENAMEA ofn;
	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = NULL;
	ofn.lpstrFile = szFile;
	//
	// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
	// use the contents of szFile to initialize itself.
	//
	ofn.lpstrFile[0] = '\0';
	ofn.nMaxFile = sizeof(szFile);
	ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

	if(GetOpenFileNameA(&ofn))
	{
		string configFile(szFile);
		return LoadConfigFile(configFile);		
	}
	else
	{
		_cprintf("GetOpenFileName not return new file\n");
		return false;
	}
}

bool DxutStereoFrame::LoadConfigFile(const string &fileName)
{
	SceneConfig config;
	ifstream ifile(fileName.c_str(), ios_base::in);
	if(!ifile)
	{
		_cprintf("can't open file %s\n", fileName.c_str());
		return false;
	}
	ifile>>config;

	SAFE_DELETE(s_pStereoSurface);
	s_pStereoSurface = new CvxStereoSurface(config.m_leftName, config.m_rightName);

	//add stereo camera
	SAFE_DELETE(s_pCamera);
	s_pCamera = new D3dStereoCamera;
	assert(s_pCamera);
	
	//s_pGauge = new D3DGauge;
	SAFE_DELETE(s_pstdGauge);
	s_pstdGauge = new StdGauge;
	assert(s_pstdGauge);
	s_pstdGauge->setColorIdx(0);
	s_pstdGauge->setGauge(g_cur_gauge_size);

	SAFE_DELETE(s_groundTruthGauge);
	s_groundTruthGauge = new StdGauge;
	s_groundTruthGauge->setColorIdx(1);
	s_groundTruthGauge->setGauge(g_ground_truth_gauge_size);

	// image model
	SAFE_DELETE(s_imageModel);
	s_imageModel = new ImageModel;
	s_imageModel->loadConfig(fileName);

	SAFE_DELETE(s_pSampleItem);
	s_pSampleItem = new SampleItem;
	s_imageModel->getNextSampleItem(*s_pSampleItem);

	//clear stored estimated items
	SAFE_DELETE(s_pEstimatedItem);
	s_pEstimatedItem = new CvxReferenceFrame;
	assert(s_pEstimatedItem);
		
	_cprintf("load configure file %s\n", fileName.c_str());	
	s_isFinishTesting = false;
	return true;
}

bool DxutStereoFrame::OpenNewFileWithMultipleTestCases()
{
	char szFile[1024] = {0};       // buffer for file name

	OPENFILENAMEA ofn;
	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = NULL;
	ofn.lpstrFile = szFile;
	//
	// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
	// use the contents of szFile to initialize itself.
	//
	ofn.lpstrFile[0] = '\0';
	ofn.nMaxFile = sizeof(szFile);
	ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

	if(GetOpenFileNameA(&ofn))
	{
		string fileName(szFile);
		if(s_fileIO)
		{
			s_fileIO->closeOutFileStream();
			SAFE_DELETE(s_fileIO);
		}
		s_fileIO = new FileIO;
		assert(s_fileIO);
		bool isOk = s_fileIO->loadConfigFile(fileName);
		assert(isOk);
		string configFile = s_fileIO->currentFileName();
		assert(configFile != string(""));

		s_isFinishTesting = false;
		return LoadConfigFile(configFile);
	}
	else
	{
		_cprintf("OpenNewFileWithMultipleTestCases not return new file\n");
		return false;
	}
}

bool DxutStereoFrame::OpenSaveFile()
{
	char szFile[1024] = {0};       // buffer for file name

	OPENFILENAMEA ofn;
	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = NULL;
	ofn.lpstrFile = szFile;
	//
	// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
	// use the contents of szFile to initialize itself.
	//
	ofn.lpstrFile[0] = '\0';
	ofn.nMaxFile = sizeof(szFile);
	ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

	if(GetSaveFileNameA(&ofn))
	{
		string oFileName(szFile);
		if(s_imageModel)
		{
			s_imageModel->saveResult(oFileName);
			_cprintf("save to file %s\n", szFile);
			return true;
		}	
	}
	_cprintf("unfinish save file.\n");
	return false;
}



void DxutStereoFrame::RenderImageCount(int num, int totalNum)
{
	WCHAR buf[256];
	swprintf_s(buf, 256, L"%d / %d", num, totalNum);
	s_pTxtHelper->Begin();
	s_pTxtHelper->SetInsertionPos( 5, 10 );
	s_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
	s_pTxtHelper->DrawTextLine(buf);	
	s_pTxtHelper->End();
}


void DxutStereoFrame::RenderThanks()
{
	s_pTxtHelper->Begin();
	s_pTxtHelper->SetInsertionPos( 5, 5 );
	s_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
	s_pTxtHelper->DrawTextLine(L"Thanks for participating the experiment!");
	s_pTxtHelper->End();
}

void DxutStereoFrame::RenderAngleDifferenceReminder()
{
	s_pTxtHelper->Begin();
	s_pTxtHelper->SetInsertionPos( 5, 5 );
	s_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
	s_pTxtHelper->DrawTextLine(L"Error is large than 15 degree. Please re-adjust the disk again to the groud truth!");
	s_pTxtHelper->End();
}

void DxutStereoFrame::RenderSeparation()
{
	s_pTxtHelper->Begin();
	s_pTxtHelper->SetInsertionPos( 5, 5 );
	s_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
	s_pTxtHelper->DrawTextLine(L"Ctrl F3 or Ctrl F4 to adjust seperations. After that, use page down to next scene!");
	s_pTxtHelper->End();
}

int DxutStereoFrame::halfWidth()
{
	return FULLSCREEN_WIDTH/2;
}

int DxutStereoFrame::halfHeight()
{
	return FULLSCREEN_HEIGHT/2;
}

//--------------------------------------------------------------------------------------
// Handle messages to the application
//--------------------------------------------------------------------------------------
LRESULT CALLBACK DxutStereoFrame::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
									    void* pUserContext )
{
	// Pass messages to dialog resource manager calls so GUI state is updated correctly
	*pbNoFurtherProcessing = s_dialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
	if( *pbNoFurtherProcessing )
		return 0;	


 	switch(uMsg)
 	{
	case WM_MOUSEMOVE :		
		 if(s_imageModel && s_userInput && s_userInput->isExperiment() && s_userInput->isMouseMoving())
		 {
			 int iMouseX = ( short )LOWORD( lParam );
			 int iMouseY = ( short )HIWORD( lParam );

			 if(s_userInput->is3DRotation())
			 {
				 int deltaX = iMouseX - s_lastMousePosX;
				 int deltaY = iMouseY - s_lastMousePosY;

				 s_pSampleItem->setNormalByMouseMove(deltaX, deltaY);
				 s_lastMousePosX = iMouseX;
				 s_lastMousePosY = iMouseY;
			 }
			 else if(s_userInput->isRotationChange())
			 {
				 s_pSampleItem->setRotationAngle(iMouseX, iMouseY, s_isFullScreen);
			 }
			 else if(s_userInput->isSlantChange())
			 {
				 int deltaX = iMouseX - s_lastMousePosX;
				 int deltaY = iMouseY - s_lastMousePosY;

				 s_pSampleItem->adjustSlantByMouseMove(deltaX, deltaY);
				 s_lastMousePosX = iMouseX;
				 s_lastMousePosY = iMouseY;
			 }
			 
			 s_pSampleItem->printAngles(s_userInput->isSlantChange(), s_userInput->isRotationChange());
		 }		 		 
		break;

	case WM_LBUTTONDOWN:
		if(s_imageModel && s_userInput && s_userInput->isExperiment())
		{
			int iMouseX = ( short )LOWORD( lParam );
			int iMouseY = ( short )HIWORD( lParam );	

			if(s_userInput->is3DRotation())
			{
				s_lastMousePosX = iMouseX;
				s_lastMousePosY = iMouseY;
				s_userInput->setMouseMoving();
			}
			else if(s_userInput->isRotationChange())
			{
				s_pSampleItem->flipSlant();			
				s_pSampleItem->setRotationAngle(iMouseX, iMouseY, s_isFullScreen);
				s_userInput->setMouseMoving();
			}
			else if(s_userInput->isSlantChange())
			{
				s_lastMousePosX = iMouseX;
				s_lastMousePosY = iMouseY;
				s_userInput->setMouseMoving();
			}
			
			s_pSampleItem->printAngles(s_userInput->isSlantChange(), s_userInput->isRotationChange());
		}
		break;

	case WM_LBUTTONUP:
		if(s_imageModel && s_userInput && s_userInput->isExperiment())
		{
			s_userInput->resetMouseMoving();
			
		}
		break;
 	}
	// Give the dialogs a chance to handle the message first
	*pbNoFurtherProcessing = s_controlPanel.MsgProc( hWnd, uMsg, wParam, lParam );
	if( *pbNoFurtherProcessing )
		return 0;
	*pbNoFurtherProcessing = s_sampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
	if( *pbNoFurtherProcessing )
		return 0;

	return 0;
}

void CALLBACK DxutStereoFrame::OnKeyboard( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
	if (bKeyDown)
	{
		switch(nChar)
		{
				
			case VK_SPACE:
				{
					//user can't input data when adjust seperation
					if(s_userInput->isAdjustSeperation())
					{
						break;  
					}
					if(s_imageModel && s_userInput->isExperiment() && !s_userInput->_showReference->GetChecked())
					{
						s_imageModel->saveItem(*s_pSampleItem);
						s_imageModel->printCurrentResult(s_userInput->isSlantOnly(), s_userInput->isRotationOnly());

						// set n p to reference
						vec3f n = s_pSampleItem->normal();
						if(s_userInput->isSlantOnly())
						{
							n = s_pSampleItem->normalWithRotate();
						}
						else if(s_userInput->isRotationOnly())
						{
							n = s_pSampleItem->normalWithSlant();
						}	
						vec3f pos = s_pSampleItem->getGroundtruthPosition();
					
						if(s_pEstimatedItem)
						{
							s_pEstimatedItem->pushBackNormalPosition(n, pos);
							n = s_pSampleItem->getGroundtruthNormal();      //store groudtruth normal
							s_pEstimatedItem->pushBackGroundTruthNormal(n);
						}
						bool next = s_imageModel->getNextSampleItem(*s_pSampleItem);
						if(!next)
						{
							if(s_fileIO && s_imageModel && s_userInput->isTesting())
							{
								_cprintf("page down is pressed, save result and load new configure.\n");
								// save current result
								ofstream *os = s_fileIO->getOfStream();
								s_imageModel->saveResult(*os);

								// get next configure file
								bool hasNext = s_fileIO->hasNextFile();
								if(hasNext)
								{
									string fileName = s_fileIO->currentFileName();
									LoadConfigFile(fileName);
									s_userInput->nextSeperationState();
								}
								else
								{
									s_fileIO->closeOutFileStream();
									s_isFinishTesting = true;
								}						
							}
							else
							{
								s_isFinishTesting = true;
								s_imageModel->saveResult("most_current_result.txt");
							}
						}						
					}
					else if (s_imageModel && s_userInput->isExperiment() && s_userInput->_showReference->GetChecked()) // practice model
					{
					//	s_userInput->nextReferenceModel();
						if(s_userInput->is3DRotation())
						{
							float angle = s_pSampleItem->getAngularDifferenceIn3D();
							if(angle > 15.0)
							{
								_cprintf("angle difference is %f degree.\n", angle);
								s_userInput->setReference2ShowGroundtruthAndReminder();							
								break;	
							}
							else
							{
								s_userInput->setReference2ShowGroundTruth();
							}
						}
						bool isShowGroundTruth = s_userInput->isReferenceGroundTruth();
						
						//set reference as false
						if(isShowGroundTruth)
						{
							s_imageModel->saveItem(*s_pSampleItem);
							s_imageModel->printCurrentResult(s_userInput->isSlantOnly(), s_userInput->isRotationOnly());
							// set n p to reference	
							vec3f n = s_pSampleItem->normal();
							if(s_userInput->isSlantOnly())
							{
								n = s_pSampleItem->normalWithRotate();
							}
							else if(s_userInput->isRotationOnly())
							{
								n = s_pSampleItem->normalWithSlant();
							}	
							vec3f pos = s_pSampleItem->getGroundtruthPosition();
						
							if(s_pEstimatedItem)
							{
								s_pEstimatedItem->pushBackNormalPosition(n, pos);
								n = s_pSampleItem->getGroundtruthNormal();      //store groudtruth normal
								s_pEstimatedItem->pushBackGroundTruthNormal(n);
							}

							bool next = s_imageModel->getNextSampleItem(*s_pSampleItem);
							s_userInput->setReference2Practice();
							if(!next)
							{
								s_imageModel->saveResult("result.txt");
							}							
						}
					}
				}
				break;
			case VK_NEXT:
				{
					// get next configure from the s_fileIO					
					if(s_fileIO && s_imageModel && s_userInput->isAdjustSeperation())
					{
						s_userInput->nextSeperationState();
					}
				}
				break;
			case 0x41:  //A key
				{			
					if(s_pEstimatedItem)
					{
						s_pEstimatedItem->clear();
					}
				}
				break;
			default:
				break;
		}
	}
}

void CALLBACK DxutStereoFrame::OnMouse( bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, 
					  bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext )
{
	if(bLeftButtonDown)
	{
		if(s_imageModel && s_userInput && s_userInput->isShowGroundTruth())
		{
			vec3f normal, position;
			
			normal = s_imageModel->calcNormalFromImage(xPos, yPos, s_isFullScreen);			
			position = s_imageModel->calcPositionFromImage(xPos, yPos, s_isFullScreen);

			s_pSampleItem->setSampleCenter(xPos, yPos, s_isFullScreen);
			s_pSampleItem->setGroundtruthNormal(normal);
			s_pSampleItem->setGroundtruthPosition(position);

			_cprintf("normal is %f %f %f\n", normal.x, normal.y, normal.z);
			_cprintf("ground truth position is %f %f %f\n\n", position.x, position.y, position.z);
		}		
	}	
}

//--------------------------------------------------------------------------------------
// Handle updates to the scene.  This is called regardless of which D3D API is used
//--------------------------------------------------------------------------------------
void CALLBACK DxutStereoFrame::OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{
}

//--------------------------------------------------------------------------------------
// Rejects any D3D9 devices that aren't acceptable to the app by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK DxutStereoFrame::IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
									 D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
{
	// Skip backbuffer formats that don't support alpha blending
	IDirect3D9* pD3D = DXUTGetD3D9Object();
	if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
		AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
		D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
		return false;

	// No fallback defined by this app, so reject any device that 
	// doesn't support at least ps2.0
	if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) )
		return false;

	return true;
}

//--------------------------------------------------------------------------------------
// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)
// and aren't tied to the back buffer size
//--------------------------------------------------------------------------------------
HRESULT CALLBACK DxutStereoFrame::OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
									void* pUserContext )
{
	HRESULT hr;

	V_RETURN( s_dialogResourceManager.OnD3D9CreateDevice( pd3dDevice ) );
	//  V_RETURN( g_SettingsDlg.OnD3D9CreateDevice( pd3dDevice ) );

	V_RETURN( D3DXCreateFont( pd3dDevice, 30, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
		OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
		L"Arial", &s_pFont9 ) );

	float fObjectRadius = 1.0;
	V_RETURN( CDXUTDirectionWidget::StaticOnD3D9CreateDevice( pd3dDevice ) );

	return S_OK;
}

//--------------------------------------------------------------------------------------
// Create any D3D9 resources that won't live through a device reset (D3DPOOL_DEFAULT) 
// or that are tied to the back buffer size 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK DxutStereoFrame::OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice,
								   const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
	HRESULT hr;

	V_RETURN( s_dialogResourceManager.OnD3D9ResetDevice() );

	if( s_pFont9 ) V_RETURN( s_pFont9->OnResetDevice() );

	V_RETURN( D3DXCreateSprite( pd3dDevice, &s_pSprite9 ) );
	s_pTxtHelper = new CDXUTTextHelper( s_pFont9, s_pSprite9, NULL, NULL, 30 );


	s_controlPanel.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 );
	s_controlPanel.SetSize( 170, 170 );
	s_sampleUI.SetLocation( pBackBufferSurfaceDesc->Width - 170, pBackBufferSurfaceDesc->Height - 350 );
	s_sampleUI.SetSize( 170, 300 );


	_cprintf("this program don't support arbitrary resize window. Only support half screen and full screen with F8\n");
	
	return S_OK;
}

//--------------------------------------------------------------------------------------
// Render the scene using the D3D9 device
//--------------------------------------------------------------------------------------
void CALLBACK DxutStereoFrame::OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
	HRESULT hr;

	// Clear the render target and the zbuffer 
	V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 170 ), 1.0f, 0 ) );

	// Render the scene
	if( SUCCEEDED( pd3dDevice->BeginScene() ) )
	{
		
		// show pre-rendered images
		s_pStereoSurface->loadSurface(pd3dDevice, s_isFullScreen);				
		IDirect3DSurface9 *backBuf = NULL;
		pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuf);  //add reference number
		pd3dDevice->StretchRect(s_pStereoSurface->m_surface, NULL, backBuf, &s_pStereoSurface->m_rect, D3DTEXF_NONE);
		s_pStereoSurface->releaseSurface();
		backBuf->Release();	
		
		//show the gauges
		//show ground truth gauge
		if((s_pSampleItem && s_userInput && s_userInput->isShowGroundTruth()) || s_userInput->isAdjustSeperation())
		{
			nv::vec3f normal = s_pSampleItem->getGroundtruthNormal();
			nv::vec3f position = s_pSampleItem->getGroundtruthPosition();
			
			s_pCamera->setRotationTranslationMatrix(pd3dDevice, normal, position);
			s_pstdGauge->setColorIdx(0);
			s_pstdGauge->initMaterial(pd3dDevice);
			s_pstdGauge->DrawGauge(pd3dDevice, true);
		}
		//show user input gauge direction
		else if(s_pSampleItem && s_userInput && s_userInput->isExperiment())
		{
			vec3f n = s_pSampleItem->normal();

			if(s_userInput->isSlantOnly())
			{
				n = s_pSampleItem->normalWithRotate();
			}
			else if(s_userInput->isRotationOnly())
			{
				n = s_pSampleItem->normalWithSlant();
			}	

			vec3f pos = s_pSampleItem->getGroundtruthPosition();

			s_pCamera->setRotationTranslationMatrix(pd3dDevice, n, pos);
			s_pstdGauge->setColorIdx(0);
			s_pstdGauge->initMaterial(pd3dDevice);
			s_pstdGauge->DrawGauge(pd3dDevice, true);

			//draw ground truth
			if(s_userInput->_showReference->GetChecked() && s_userInput->isShowReference())
			{
				vec3f n = s_pSampleItem->getGroundtruthNormal();
				
				s_pCamera->setRotationTranslationMatrix(pd3dDevice, n, pos);
				s_groundTruthGauge->setColorIdx(1);
				s_groundTruthGauge->initMaterial(pd3dDevice);
				s_groundTruthGauge->DrawGauge(pd3dDevice, true);
			}	
		}

		// render text in the left corner of the window
		if(s_userInput->isAdjustSeperation())
		{
			RenderSeparation();
		}
		else if(s_isFinishTesting)
		{
			RenderThanks();
		}
		else if(s_userInput->isReferenceRemindder() && s_userInput->_showReference->GetChecked())
		{
			RenderAngleDifferenceReminder();
		}
		else
		{
			int restNum = 0;
			int totalNum = 0;
			s_imageModel->getNumbers(restNum, totalNum);
			RenderImageCount(restNum, totalNum);
		}

		//render control pannel		
		DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); // These events are to help PIX identify what the code is doing		
		V( s_controlPanel.OnRender( fElapsedTime ) );
		V( s_sampleUI.OnRender( fElapsedTime ) );
		DXUT_EndPerfEvent();		

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

//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9ResetDevice callback 
//--------------------------------------------------------------------------------------

void CALLBACK DxutStereoFrame::OnD3D9LostDevice( void* pUserContext )
{
	s_dialogResourceManager.OnD3D9LostDevice();
	if( s_pFont9 ) s_pFont9->OnLostDevice();
	SAFE_RELEASE( s_pSprite9 );
	SAFE_DELETE( s_pTxtHelper );

	//add
	CDXUTDirectionWidget::StaticOnD3D9LostDevice();
	
}

//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9CreateDevice callback 
//--------------------------------------------------------------------------------------
void CALLBACK DxutStereoFrame::OnD3D9DestroyDevice( void* pUserContext )
{
	s_dialogResourceManager.OnD3D9DestroyDevice();
	SAFE_RELEASE(s_pFont9 );

	//add
	SAFE_RELEASE(s_pSprite9);
	SAFE_DELETE( s_pTxtHelper);
	CDXUTDirectionWidget::StaticOnD3D9DestroyDevice();
}

//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK DxutStereoFrame::OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
	switch( nControlID )
	{
	case IDC_TOGGLEFULLSCREEN:
		DXUTToggleFullScreen();
		s_isFullScreen = !s_isFullScreen;

		if(s_userInput)
		{
			if(s_userInput->_openNewFile) s_userInput->_openNewFile->SetVisible(!s_isFullScreen);
			if(s_userInput->_openMultipleNewFile) s_userInput->_openMultipleNewFile->SetVisible(!s_isFullScreen);
			if(s_userInput->_modelCB) s_userInput->_modelCB->SetVisible(!s_isFullScreen);
			if(s_userInput->_showReference) s_userInput->_showReference->SetVisible(!s_isFullScreen);			
		}		
		break;	

	case IDC_MODEL_SELECTION:  //select one new model
		if (s_userInput)
		{
			s_userInput->getModelValue();
			if(s_userInput->isExperiment() && s_imageModel)
			{				
				s_imageModel->resample();
				s_imageModel->getNextSampleItem( *s_pSampleItem);
				if(s_pEstimatedItem) s_pEstimatedItem->clear();
			}
		}
		break;

	case IDC_OPEN_NEW_FILE:
		OpenNewFile();
		break;

	case IDC_SAVE_RESULT_FILE:
		//not used
		break;

	case IDC_OPEN_MULTIPLE_NEW_FILE:
		OpenNewFileWithMultipleTestCases();
		break;

	}
}

标签: 显示 3d 图像

实例下载地址

3d显示图像(c++源码)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警