/*****************************************************************************\ FILE: painting.cpp DESCRIPTION: BryanSt 12/24/2000 Copyright (C) Microsoft Corp 2000-2001. All rights reserved. \*****************************************************************************/ #include "stdafx.h" #include "util.h" #include "painting.h" //----------------------------------------------------------------------------- // Name: C3DObject() // Desc: Constructor //----------------------------------------------------------------------------- CPainting::CPainting(CMSLogoDXScreenSaver * pMain) { // Initialize member variables m_pMain = pMain; m_pFrameTexture = NULL; m_pPaintingTexture = NULL; m_pObjPainting = NULL; m_pObjFrame = NULL; } CPainting::~CPainting() { SAFE_RELEASE(m_pFrameTexture); SAFE_RELEASE(m_pPaintingTexture); SAFE_DELETE(m_pObjPainting); SAFE_DELETE(m_pObjFrame); } //----------------------------------------------------------------------------- // Name: FinalCleanup() // Desc: Called before the app exits, this function gives the app the chance // to cleanup after itself. //----------------------------------------------------------------------------- HRESULT CPainting::FinalCleanup(void) { return S_OK; } //----------------------------------------------------------------------------- // Name: DeleteDeviceObjects() // Desc: Called when the app is exitting, or the device is being changed, // this function deletes any device dependant objects. //----------------------------------------------------------------------------- HRESULT CPainting::DeleteDeviceObjects(void) { return S_OK; } //----------------------------------------------------------------------------- // Name: OneTimeSceneInit() // Desc: Called during initial app startup, this function performs all the // permanent initialization. //----------------------------------------------------------------------------- HRESULT CPainting::OneTimeSceneInit(void) { HRESULT hr = E_OUTOFMEMORY; m_pObjPainting = new C3DObject(m_pMain); m_pObjFrame = new C3DObject(m_pMain); if (m_pObjFrame && m_pObjFrame) { hr = S_OK; } return hr; } HRESULT CPainting::SetPainting(CTexture * pFrameTexture, CTexture * pPaintingTexture, D3DXVECTOR3 vLocationCenter, float fMaxHeight, float fFrameWidth, float fFrameHeight, D3DXVECTOR3 vNormal, DWORD dwMaxPixelSize) { HRESULT hr = E_OUTOFMEMORY; if (m_pObjPainting && m_pObjFrame && m_pMain && pFrameTexture && pPaintingTexture) { D3DXVECTOR3 vWidth; D3DXVECTOR3 vHeight; if (vNormal.x) { vWidth = D3DXVECTOR3(0, 0, 1); vHeight = D3DXVECTOR3(0, 1, 0); } else if (vNormal.y) { vWidth = D3DXVECTOR3(0, 0, 1); vHeight = D3DXVECTOR3(1, 0, 0); } else { vWidth = D3DXVECTOR3(1, 0, 0); vHeight = D3DXVECTOR3(0, 1, 0); } IUnknown_Set((IUnknown **) &m_pFrameTexture, (IUnknown *) pFrameTexture); IUnknown_Set((IUnknown **) &m_pPaintingTexture, (IUnknown *) pPaintingTexture); DWORD dwPaintingWidth = pPaintingTexture->GetTextureWidth(); DWORD dwPaintingHeight = pPaintingTexture->GetTextureHeight(); float fPaintingRatio = (((float) dwPaintingWidth) / ((float) dwPaintingHeight)); int nWidth = 1; int nHeight = 1; m_pMain->GetCurrentScreenSize(&nWidth, &nHeight); float fMonitorRatio = (((float) nWidth) / ((float) nHeight)); float fPaintingHeight = fMaxHeight; float fPaintingWidth = (fPaintingHeight * fPaintingRatio); if (fPaintingRatio > fMonitorRatio) { // Oh no, the picture ratio is wider than the screen radio. This will cause // warpping so it will extend off the right and left. We need to scale it down. float fScaleDownRatio = (fMonitorRatio / fPaintingRatio); fPaintingHeight *= fScaleDownRatio; fPaintingWidth *= fScaleDownRatio; } D3DXVECTOR3 vTranslateToCorner = ((-fPaintingWidth/2)*vWidth + (-fPaintingHeight/2)*vHeight); D3DXVECTOR3 vObjLocation(vLocationCenter + vTranslateToCorner); D3DXVECTOR3 vObjSize(fPaintingWidth*vWidth + fPaintingHeight*vHeight); hr = m_pObjPainting->InitPlaneStretch(pPaintingTexture, m_pMain->GetD3DDevice(), vObjLocation, vObjSize, vNormal, 3, 3, dwMaxPixelSize); D3DXVECTOR3 vFrameSize(D3DXVec3Multiply(vObjSize, (D3DXVECTOR3((fFrameWidth * vWidth) + D3DXVECTOR3(fFrameHeight * vHeight))))); vObjLocation = (vObjLocation - vFrameSize + ((g_fFudge / -2.0f)* vNormal)); vObjSize = (vObjSize + (2 * vFrameSize)); hr = m_pObjFrame->InitPlaneStretch(pFrameTexture, m_pMain->GetD3DDevice(), vObjLocation, vObjSize, vNormal, 3, 3, dwMaxPixelSize); } return hr; } //----------------------------------------------------------------------------- // Name: Render() // Desc: Called once per frame, the call is the entry point for 3d // rendering. This function sets up render states, clears the // viewport, and renders the scene. //----------------------------------------------------------------------------- HRESULT CPainting::Render(IDirect3DDevice8 * pD3DDevice, int nPhase) { HRESULT hr = E_OUTOFMEMORY; if (m_pObjFrame && m_pObjPainting) { switch (nPhase) { case 0: hr = m_pObjFrame->Render(pD3DDevice); break; case 1: hr = m_pObjPainting->Render(pD3DDevice); break; } } return hr; }