From ea9a7edd20e6bf9198759f8728a0faa4e76a6122 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Wed, 26 Jul 2006 03:53:51 +0000 Subject: [PATCH] add render RageTexture class --- stepmania/src/RageTextureRenderTarget.cpp | 93 +++++++++++++++++++++++ stepmania/src/RageTextureRenderTarget.h | 53 +++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 stepmania/src/RageTextureRenderTarget.cpp create mode 100644 stepmania/src/RageTextureRenderTarget.h diff --git a/stepmania/src/RageTextureRenderTarget.cpp b/stepmania/src/RageTextureRenderTarget.cpp new file mode 100644 index 0000000000..bbb5ca0d2e --- /dev/null +++ b/stepmania/src/RageTextureRenderTarget.cpp @@ -0,0 +1,93 @@ +#include "global.h" +#include "RageTextureRenderTarget.h" +#include "RageDisplay.h" + +RageTextureRenderTarget::RageTextureRenderTarget( RageTextureID name, const RenderTargetParam ¶m ): + RageTexture( name ), + m_Param( param ) +{ + Create(); +} + +RageTextureRenderTarget::~RageTextureRenderTarget() +{ + Destroy(); +} + +void RageTextureRenderTarget::Reload() +{ + Destroy(); + Create(); +} + +/* RageTextureID identifies a file and a mechanism for loading it. We don't use any + * of that, except as a unique identifier for this texture, so it can be loaded + * elsewhere. Render targets can't be loaded blindly like a regular texture, anyway, + * since something has to render into it. */ +void RageTextureRenderTarget::Create() +{ + /* All render targets support non-power-of-two targets, but some require that the + * resulting texture dimensions be powers of two. CreateRenderTarget returns + * the actual resolution. */ + m_iTexHandle = DISPLAY->CreateRenderTarget( m_Param, m_iTextureWidth, m_iTextureHeight ); + + m_iSourceWidth = m_Param.iWidth; + m_iSourceHeight = m_Param.iHeight; + m_iImageWidth = m_Param.iWidth; + m_iImageHeight = m_Param.iHeight; + m_iFramesWide = m_iFramesHigh = 1; + + CreateFrameRects(); +} + +void RageTextureRenderTarget::Destroy() +{ + DISPLAY->DeleteTexture( m_iTexHandle ); +} + +void RageTextureRenderTarget::BeginRenderingTo( bool bPreserveTexture ) +{ + DISPLAY->SetRenderTarget( m_iTexHandle, bPreserveTexture ); + + /* We're rendering to a texture, not the framebuffer. Stash away the + * centering matrix, and set it to identity. */ + DISPLAY->CenteringPushMatrix(); + DISPLAY->ChangeCentering( 0, 0, 0, 0 ); + + // Reset the perspective to fit the new target. + int iWidth = m_Param.iWidth, iHeight = m_Param.iHeight; + DISPLAY->LoadMenuPerspective( 0, m_iImageWidth, m_iImageHeight, m_iImageWidth/2, m_iImageHeight/2 ); // 0 FOV = ortho +} + +void RageTextureRenderTarget::FinishRenderingTo() +{ + // Restore the centering matrix. + DISPLAY->CenteringPopMatrix(); + + DISPLAY->SetRenderTarget( 0 ); +} + +/* + * Copyright (c) 2001-2006 Glenn Maynard, Chris Danford + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/RageTextureRenderTarget.h b/stepmania/src/RageTextureRenderTarget.h new file mode 100644 index 0000000000..66d0445b20 --- /dev/null +++ b/stepmania/src/RageTextureRenderTarget.h @@ -0,0 +1,53 @@ +#ifndef RAGE_TEXTURE_RENDER_TARGET_H +#define RAGE_TEXTURE_RENDER_TARGET_H + +#include "RageTexture.h" +#include "RageTextureID.h" +#include "RageDisplay.h" // for RenderTargetParam + +class RageTextureRenderTarget: public RageTexture +{ +public: + RageTextureRenderTarget( RageTextureID name, const RenderTargetParam ¶m ); + virtual ~RageTextureRenderTarget(); + virtual void Invalidate() { m_iTexHandle = 0; /* don't Destroy() */ } + virtual void Reload(); + virtual unsigned GetTexHandle() const { return m_iTexHandle; } + + void BeginRenderingTo( bool bPreserveTexture = true ); + void FinishRenderingTo(); + +private: + const RenderTargetParam m_Param; + + void Create(); + void Destroy(); + unsigned m_iTexHandle; +}; + +#endif + +/* + * Copyright (c) 2001-2006 Glenn Maynard, Chris Danford + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */