mirror of
				https://github.com/isledecomp/isle.git
				synced 2025-10-28 19:04:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			157 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Lego3DView.cpp : implementation file
 | |
| //
 | |
| 
 | |
| #include "lego3dview.h"
 | |
| 
 | |
| #include "viewmanager/viewmanager.h"
 | |
| 
 | |
| DECOMP_SIZE_ASSERT(Lego3DView, 0xa8)
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Lego3DView
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100aae90
 | |
| Lego3DView::Lego3DView()
 | |
| {
 | |
| 	m_pViewManager = 0;
 | |
| 	m_previousRenderTime = 0;
 | |
| 	m_unk0x98 = 0;
 | |
| 	m_pPointOfView = 0;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100aaf30
 | |
| Lego3DView::~Lego3DView()
 | |
| {
 | |
| 	Destroy();
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100aaf90
 | |
| BOOL Lego3DView::Create(const TglSurface::CreateStruct& rCreateStruct, Tgl::Renderer* pRenderer)
 | |
| {
 | |
| 	double viewAngle = 45;
 | |
| 	if (rCreateStruct.m_isWideViewAngle) {
 | |
| 		viewAngle = 90;
 | |
| 	}
 | |
| 
 | |
| 	float frontClippingDistance = 0.1;
 | |
| 	float backClippingDistance = 500;
 | |
| 
 | |
| 	if (!LegoView1::Create(rCreateStruct, pRenderer)) {
 | |
| 		return FALSE;
 | |
| 	}
 | |
| 
 | |
| 	assert(GetView());
 | |
| 	GetView()->SetFrustrum(frontClippingDistance, backClippingDistance, viewAngle);
 | |
| 
 | |
| 	assert(GetScene());
 | |
| 	assert(!m_pViewManager);
 | |
| 
 | |
| 	m_pViewManager = new ViewManager(pRenderer, GetScene(), 0);
 | |
| 	m_pViewManager->SetResolution(GetWidth(), GetHeight());
 | |
| 	m_pViewManager->SetFrustrum(viewAngle, frontClippingDistance, backClippingDistance);
 | |
| 	m_previousRenderTime = 0;
 | |
| 	m_unk0x98 = 0;
 | |
| 
 | |
| 	// // NOTE: a derived class must inform view manager when it configures
 | |
| 	// //       its (Tgl) view: calling Tgl::View::SetFrustrum() should be
 | |
| 	// //       accompanied by calling ViewManager::SetFrustrum()
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab0b0
 | |
| void Lego3DView::Destroy()
 | |
| {
 | |
| 	if (m_pPointOfView) {
 | |
| 		m_pPointOfView = 0;
 | |
| 		m_pViewManager->SetPOVSource(0);
 | |
| 	}
 | |
| 
 | |
| 	delete m_pViewManager;
 | |
| 	m_pViewManager = 0;
 | |
| 
 | |
| 	LegoView1::Destroy();
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab100
 | |
| BOOL Lego3DView::Add(ViewROI& rROI)
 | |
| {
 | |
| 	assert(m_pViewManager);
 | |
| 
 | |
| 	m_pViewManager->Add(&rROI);
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab170
 | |
| BOOL Lego3DView::Remove(ViewROI& rROI)
 | |
| {
 | |
| 	assert(m_pViewManager);
 | |
| 
 | |
| 	m_pViewManager->Remove(&rROI);
 | |
| 
 | |
| 	if (m_pPointOfView == &rROI) {
 | |
| 		m_pPointOfView = 0;
 | |
| 		m_pViewManager->SetPOVSource(0);
 | |
| 	}
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab1b0
 | |
| BOOL Lego3DView::SetPointOfView(ViewROI& rROI)
 | |
| {
 | |
| 	Tgl::FloatMatrix4 transformation;
 | |
| 	Matrix4 mat(transformation);
 | |
| 	Tgl::Result result;
 | |
| 
 | |
| 	m_pPointOfView = &rROI;
 | |
| 
 | |
| 	assert(m_pViewManager);
 | |
| 	m_pViewManager->SetPOVSource(m_pPointOfView);
 | |
| 
 | |
| 	assert(GetCamera());
 | |
| 	rROI.GetLocalTransform(mat);
 | |
| 	result = GetCamera()->SetTransformation(transformation);
 | |
| 	assert(Tgl::Succeeded(result));
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab210
 | |
| BOOL Lego3DView::Moved(ViewROI& rROI)
 | |
| {
 | |
| 	assert(m_pViewManager);
 | |
| 
 | |
| 	if (m_pPointOfView == &rROI) {
 | |
| 		// move the camera
 | |
| 		Tgl::FloatMatrix4 transformation;
 | |
| 		Matrix4 mat(transformation);
 | |
| 		Tgl::Result result;
 | |
| 
 | |
| 		assert(GetCamera());
 | |
| 
 | |
| 		rROI.GetLocalTransform(mat);
 | |
| 		result = GetCamera()->SetTransformation(transformation);
 | |
| 		assert(Tgl::Succeeded(result));
 | |
| 		m_pViewManager->SetPOVSource(&rROI);
 | |
| 	}
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab270
 | |
| double Lego3DView::Render(double p_und)
 | |
| {
 | |
| 	assert(m_pViewManager);
 | |
| 	m_pViewManager->Update(m_previousRenderTime, p_und);
 | |
| 	m_previousRenderTime = TglSurface::Render();
 | |
| 	return m_previousRenderTime;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab2b0
 | |
| ViewROI* Lego3DView::Pick(unsigned long x, unsigned long y)
 | |
| {
 | |
| 	return m_pViewManager->Pick(GetView(), x, y);
 | |
| }
 | 
