mirror of
				https://github.com/isledecomp/isle.git
				synced 2025-10-28 19:04:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			243 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // LegoView1.cpp : implementation file
 | |
| //
 | |
| 
 | |
| #include "legoview1.h"
 | |
| 
 | |
| #include "decomp.h"
 | |
| #include "mxgeometry/mxgeometry3d.h"
 | |
| #include "mxgeometry/mxmatrix.h"
 | |
| #include "realtime/realtime.h"
 | |
| 
 | |
| #include <vec.h>
 | |
| 
 | |
| DECOMP_SIZE_ASSERT(LegoView, 0x78);
 | |
| DECOMP_SIZE_ASSERT(LegoView1, 0x88);
 | |
| 
 | |
| // GLOBAL: LEGO1 0x101013e4
 | |
| float g_sunLightRGB = 1.0;
 | |
| 
 | |
| // GLOBAL: LEGO1 0x101013e8
 | |
| float g_directionalLightRGB = 1.0;
 | |
| 
 | |
| // GLOBAL: LEGO1 0x101013ec
 | |
| float g_ambientLightRGB = 0.3;
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // LegoView
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab510
 | |
| // FUNCTION: BETA10 0x1017bb90
 | |
| LegoView::LegoView()
 | |
| {
 | |
| 	m_pScene = 0;
 | |
| 	m_pCamera = 0;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab5a0
 | |
| // FUNCTION: BETA10 0x1017bc19
 | |
| LegoView::~LegoView()
 | |
| {
 | |
| 	Destroy();
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab600
 | |
| // FUNCTION: BETA10 0x1017bc89
 | |
| BOOL LegoView::Create(const TglSurface::CreateStruct& rCreateStruct, Tgl::Renderer* pRenderer)
 | |
| {
 | |
| 	float viewAngle = 45;
 | |
| 
 | |
| 	float frontClippingDistance = 0.1;
 | |
| 	float backClippingDistance = 500;
 | |
| 
 | |
| 	assert(!m_pScene);
 | |
| 	assert(!m_pCamera);
 | |
| 	assert(pRenderer);
 | |
| 
 | |
| 	if (rCreateStruct.m_isWideViewAngle) {
 | |
| 		viewAngle = 90;
 | |
| 	}
 | |
| 
 | |
| 	m_pScene = pRenderer->CreateGroup();
 | |
| 	assert(m_pScene);
 | |
| 	// TglSurface::Create() calls CreateView(), and we need the camera in
 | |
| 	// CreateView(), so create camera before calling TglSurface::Create()
 | |
| 	m_pCamera = pRenderer->CreateCamera();
 | |
| 	assert(m_pCamera);
 | |
| 
 | |
| 	if (!TglSurface::Create(rCreateStruct, pRenderer, m_pScene)) {
 | |
| 		delete m_pScene;
 | |
| 		m_pScene = 0;
 | |
| 
 | |
| 		delete m_pCamera;
 | |
| 		m_pCamera = 0;
 | |
| 
 | |
| 		return FALSE;
 | |
| 	}
 | |
| 
 | |
| 	assert(GetView());
 | |
| 	GetView()->SetFrustrum(frontClippingDistance, backClippingDistance, viewAngle);
 | |
| 	GetView()->SetBackgroundColor(.223, .639, .851);
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab6c0
 | |
| // FUNCTION: BETA10 0x1017befd
 | |
| Tgl::View* LegoView::CreateView(Tgl::Renderer* pRenderer, Tgl::Device* pDevice)
 | |
| {
 | |
| 	assert(pRenderer);
 | |
| 	assert(pDevice);
 | |
| 
 | |
| 	return pRenderer->CreateView(pDevice, m_pCamera, 0, 0, GetWidth(), GetHeight());
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab6f0
 | |
| // FUNCTION: BETA10 0x1017bf96
 | |
| void LegoView::Destroy()
 | |
| {
 | |
| 	delete m_pScene;
 | |
| 	m_pScene = 0;
 | |
| 
 | |
| 	delete m_pCamera;
 | |
| 	m_pCamera = 0;
 | |
| 
 | |
| 	TglSurface::Destroy();
 | |
| }
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // LegoView1
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab730
 | |
| // FUNCTION: BETA10 0x1017c028
 | |
| LegoView1::LegoView1()
 | |
| {
 | |
| 	m_pSunLight = 0;
 | |
| 	m_pDirectionalLight = 0;
 | |
| 	m_pAmbientLight = 0;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab7c0
 | |
| // FUNCTION: BETA10 0x1017c0be
 | |
| LegoView1::~LegoView1()
 | |
| {
 | |
| 	Destroy();
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab820
 | |
| // FUNCTION: BETA10 0x1017c12e
 | |
| BOOL LegoView1::AddLightsToViewport()
 | |
| {
 | |
| 	assert(GetView());
 | |
| 	GetView()->Add(m_pSunLight);
 | |
| 	GetView()->Add(m_pDirectionalLight);
 | |
| 	GetView()->Add(m_pAmbientLight);
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100ab860
 | |
| // FUNCTION: BETA10 0x1017c1ea
 | |
| BOOL LegoView1::Create(const TglSurface::CreateStruct& rCreateStruct, Tgl::Renderer* pRenderer)
 | |
| {
 | |
| 	if (!LegoView::Create(rCreateStruct, pRenderer)) {
 | |
| 		return FALSE;
 | |
| 	}
 | |
| 
 | |
| 	// lights
 | |
| 	m_pSunLight = pRenderer->CreateLight(Tgl::Point, g_sunLightRGB, g_sunLightRGB, g_sunLightRGB);
 | |
| 	m_pDirectionalLight =
 | |
| 		pRenderer->CreateLight(Tgl::Directional, g_directionalLightRGB, g_directionalLightRGB, g_directionalLightRGB);
 | |
| 	m_pAmbientLight = pRenderer->CreateLight(Tgl::Ambient, g_ambientLightRGB, g_ambientLightRGB, g_ambientLightRGB);
 | |
| 
 | |
| 	Mx3DPointFloat position(0.0, 0.0, 0.0);
 | |
| 	Mx3DPointFloat direction(0.0, -1.0, 0.0);
 | |
| 	Mx3DPointFloat up(1.0, 0.0, 0.0);
 | |
| 
 | |
| 	Tgl::FloatMatrix4 matrix;
 | |
| 	Matrix4 in(matrix);
 | |
| 	MxMatrix transform;
 | |
| 
 | |
| 	CalcLocalTransform(position, direction, up, transform);
 | |
| 	SETMAT4(in, transform);
 | |
| 	m_pDirectionalLight->SetTransformation(matrix);
 | |
| 
 | |
| 	position[0] = 0, position[1] = 150, position[2] = -150;
 | |
| 	CalcLocalTransform(position, direction, up, transform);
 | |
| 	SETMAT4(in, transform);
 | |
| 	m_pSunLight->SetTransformation(matrix);
 | |
| 
 | |
| 	// assert(GetView());
 | |
| 
 | |
| 	return AddLightsToViewport();
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100abad0
 | |
| // FUNCTION: BETA10 0x1017c912
 | |
| void LegoView1::Destroy()
 | |
| {
 | |
| 	if (m_pSunLight) {
 | |
| 		GetView()->Remove(m_pSunLight);
 | |
| 		delete m_pSunLight;
 | |
| 		m_pSunLight = 0;
 | |
| 	}
 | |
| 
 | |
| 	if (m_pDirectionalLight) {
 | |
| 		GetView()->Remove(m_pDirectionalLight);
 | |
| 		delete m_pDirectionalLight;
 | |
| 		m_pDirectionalLight = 0;
 | |
| 	}
 | |
| 
 | |
| 	if (m_pAmbientLight) {
 | |
| 		GetView()->Remove(m_pAmbientLight);
 | |
| 		delete m_pAmbientLight;
 | |
| 		m_pAmbientLight = 0;
 | |
| 	}
 | |
| 
 | |
| 	LegoView::Destroy();
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100abb60
 | |
| // FUNCTION: BETA10 0x1017ca80
 | |
| void LegoView1::SetLightTransform(BOOL bDirectionalLight, Tgl::FloatMatrix4& rMatrix)
 | |
| {
 | |
| 	Tgl::Light* pLight;
 | |
| 
 | |
| 	if (bDirectionalLight == FALSE) {
 | |
| 		pLight = m_pSunLight;
 | |
| 	}
 | |
| 	else {
 | |
| 		pLight = m_pDirectionalLight;
 | |
| 	}
 | |
| 
 | |
| 	SetLightTransform(pLight, rMatrix);
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100abb80
 | |
| // FUNCTION: BETA10 0x1017cacf
 | |
| void LegoView1::SetLightTransform(Tgl::Light* pLight, Tgl::FloatMatrix4& rMatrix)
 | |
| {
 | |
| 	pLight->SetTransformation(rMatrix);
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100abba0
 | |
| // FUNCTION: BETA10 0x1017caf6
 | |
| void LegoView1::SetLightColor(BOOL bDirectionalLight, float red, float green, float blue)
 | |
| {
 | |
| 	Tgl::Light* pLight;
 | |
| 
 | |
| 	if (bDirectionalLight == FALSE) {
 | |
| 		pLight = m_pSunLight;
 | |
| 	}
 | |
| 	else {
 | |
| 		pLight = m_pDirectionalLight;
 | |
| 	}
 | |
| 
 | |
| 	SetLightColor(pLight, red, green, blue);
 | |
| }
 | |
| 
 | |
| // FUNCTION: LEGO1 0x100abbd0
 | |
| // FUNCTION: BETA10 0x1017cb4d
 | |
| void LegoView1::SetLightColor(Tgl::Light* pLight, float red, float green, float blue)
 | |
| {
 | |
| 	pLight->SetColor(red, green, blue);
 | |
| }
 | 
