This commit is contained in:
AJ Kelly
2011-05-02 20:11:26 -05:00
41 changed files with 40422 additions and 866 deletions
File diff suppressed because it is too large Load Diff
+155
View File
@@ -0,0 +1,155 @@
/* RageDisplay_Legacy: OpenGL renderer. */
#ifndef RAGE_DISPLAY_OGL_H
#define RAGE_DISPLAY_OGL_H
#include "RageDisplay.h"
/* Making an OpenGL call doesn't also flush the error state; if we happen
* to have an error from a previous call, then the assert below will fail.
* Flush it. */
#define FlushGLErrors() do { } while( glGetError() != GL_NO_ERROR )
#define AssertNoGLError() \
{ \
GLenum error = glGetError(); \
ASSERT_M( error == GL_NO_ERROR, RageDisplay_Legacy_Helpers::GLToString(error) ); \
}
#if defined(DEBUG) || !defined(GL_GET_ERROR_IS_SLOW)
#define DebugFlushGLErrors() FlushGLErrors()
#define DebugAssertNoGLError() AssertNoGLError()
#else
#define DebugFlushGLErrors()
#define DebugAssertNoGLError()
#endif
class RageDisplay_Legacy: public RageDisplay
{
public:
RageDisplay_Legacy();
virtual ~RageDisplay_Legacy();
virtual RString Init( const VideoModeParams &p, bool bAllowUnacceleratedRenderer );
virtual RString GetApiDescription() const { return "OpenGL"; }
virtual void GetDisplayResolutions( DisplayResolutions &out ) const;
void ResolutionChanged();
const PixelFormatDesc *GetPixelFormatDesc(PixelFormat pf) const;
bool SupportsThreadedRendering();
void BeginConcurrentRenderingMainThread();
void EndConcurrentRenderingMainThread();
void BeginConcurrentRendering();
void EndConcurrentRendering();
bool BeginFrame();
void EndFrame();
VideoModeParams GetActualVideoModeParams() const;
void SetBlendMode( BlendMode mode );
bool SupportsTextureFormat( PixelFormat pixfmt, bool realtime=false );
bool SupportsPerVertexMatrixScale();
unsigned CreateTexture(
PixelFormat pixfmt,
RageSurface* img,
bool bGenerateMipMaps );
void UpdateTexture(
unsigned iTexHandle,
RageSurface* img,
int xoffset, int yoffset, int width, int height
);
void DeleteTexture( unsigned iTexHandle );
RageSurface *GetTexture( unsigned iTexture );
RageTextureLock *CreateTextureLock();
void ClearAllTextures();
int GetNumTextureUnits();
void SetTexture( TextureUnit tu, unsigned iTexture );
void SetTextureMode( TextureUnit tu, TextureMode tm );
void SetTextureWrapping( TextureUnit tu, bool b );
int GetMaxTextureSize() const;
void SetTextureFiltering( TextureUnit tu, bool b );
void SetEffectMode( EffectMode effect );
bool IsEffectModeSupported( EffectMode effect );
bool SupportsRenderToTexture() const;
unsigned CreateRenderTarget( const RenderTargetParam &param, int &iTextureWidthOut, int &iTextureHeightOut );
void SetRenderTarget( unsigned iHandle, bool bPreserveTexture );
bool IsZWriteEnabled() const;
bool IsZTestEnabled() const;
void SetZWrite( bool b );
void SetZBias( float f );
void SetZTestMode( ZTestMode mode );
void ClearZBuffer();
void SetCullMode( CullMode mode );
void SetAlphaTest( bool b );
void SetMaterial(
const RageColor &emissive,
const RageColor &ambient,
const RageColor &diffuse,
const RageColor &specular,
float shininess
);
void SetLighting( bool b );
void SetLightOff( int index );
void SetLightDirectional(
int index,
const RageColor &ambient,
const RageColor &diffuse,
const RageColor &specular,
const RageVector3 &dir );
void SetSphereEnvironmentMapping( TextureUnit tu, bool b );
void SetCelShaded( int stage );
RageCompiledGeometry* CreateCompiledGeometry();
void DeleteCompiledGeometry( RageCompiledGeometry* p );
// hacks for cell-shaded models
virtual void SetPolygonMode( PolygonMode pm );
virtual void SetLineWidth( float fWidth );
RString GetTextureDiagnostics( unsigned id ) const;
protected:
void DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawFanInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawStripInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawCompiledGeometryInternal( const RageCompiledGeometry *p, int iMeshIndex );
void DrawLineStripInternal( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
void DrawSymmetricQuadStripInternal( const RageSpriteVertex v[], int iNumVerts );
RString TryVideoMode( const VideoModeParams &p, bool &bNewDeviceOut );
RageSurface* CreateScreenshot();
PixelFormat GetImgPixelFormat( RageSurface* &img, bool &FreeImg, int width, int height, bool bPalettedTexture );
bool SupportsSurfaceFormat( PixelFormat pixfmt );
void SendCurrentMatrices();
};
#endif
/*
* Copyright (c) 2001-2011 Chris Danford, Glenn Maynard, Colby Klein
* 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.
*/
+82
View File
@@ -0,0 +1,82 @@
#include "global.h"
#include "RageDisplay_Legacy_Helpers.h"
#include "RageUtil.h"
#include "RageLog.h"
#include "RageUtil.h"
#include "arch/LowLevelWindow/LowLevelWindow.h"
#include <map>
#include <set>
namespace
{
map<GLenum, RString> g_Strings;
void InitStringMap()
{
static bool bInitialized = false;
if( bInitialized )
return;
bInitialized = true;
#define X(a) g_Strings[a] = #a;
X(GL_RGBA8); X(GL_RGBA4); X(GL_RGB5_A1); X(GL_RGB5); X(GL_RGBA); X(GL_RGB);
X(GL_BGR); X(GL_BGRA);
X(GL_COLOR_INDEX8_EXT); X(GL_COLOR_INDEX4_EXT); X(GL_COLOR_INDEX);
X(GL_UNSIGNED_BYTE); X(GL_UNSIGNED_SHORT_4_4_4_4); X(GL_UNSIGNED_SHORT_5_5_5_1);
X(GL_UNSIGNED_SHORT_1_5_5_5_REV);
X(GL_INVALID_ENUM); X(GL_INVALID_VALUE); X(GL_INVALID_OPERATION);
X(GL_STACK_OVERFLOW); X(GL_STACK_UNDERFLOW); X(GL_OUT_OF_MEMORY);
#undef X
}
};
void RageDisplay_Legacy_Helpers::Init()
{
InitStringMap();
}
RString RageDisplay_Legacy_Helpers::GLToString( GLenum e )
{
if( g_Strings.find(e) != g_Strings.end() )
return g_Strings[e];
return ssprintf( "%i", int(e) );
}
/*
static void GetGLExtensions( set<string> &ext )
{
const char *szBuf = (const char *) glGetString( GL_EXTENSIONS );
vector<RString> asList;
split( szBuf, " ", asList );
for( unsigned i = 0; i < asList.size(); ++i )
ext.insert( asList[i] );
}
*/
/*
* Copyright (c) 2001-2011 Chris Danford, Glenn Maynard, Colby Klein
* 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.
*/
+73
View File
@@ -0,0 +1,73 @@
#ifndef RAGE_DISPLAY_OGL_HELPERS_H
#define RAGE_DISPLAY_OGL_HELPERS_H
#if defined(WIN32)
#include <windows.h>
#endif
#include <GL/glew.h>
/* Import RageDisplay, for types. Do not include RageDisplay_Legacy.h. */
#include "RageDisplay.h"
/* Windows defines GL_EXT_paletted_texture incompletely: */
#ifndef GL_TEXTURE_INDEX_SIZE_EXT
#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
#endif
/** @brief Utilities for working with the RageDisplay. */
namespace RageDisplay_Legacy_Helpers
{
void Init();
RString GLToString( GLenum e );
};
class RenderTarget
{
public:
virtual ~RenderTarget() { }
virtual void Create( const RenderTargetParam &param, int &iTextureWidthOut, int &iTextureHeightOut ) = 0;
virtual unsigned GetTexture() const = 0;
/* Render to this RenderTarget. */
virtual void StartRenderingTo() = 0;
/* Stop rendering to this RenderTarget. Update the texture, if necessary, and
* make it available. */
virtual void FinishRenderingTo() = 0;
virtual bool InvertY() const { return false; }
const RenderTargetParam &GetParam() const { return m_Param; }
protected:
RenderTargetParam m_Param;
};
#endif
/*
* Copyright (c) 2001-2011 Chris Danford, Glenn Maynard, Colby Klein
* 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.
*/
+373 -374
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -1,4 +1,4 @@
/* RageDisplay_OGL: OpenGL renderer. */
/* RageDisplay_Legacy: OpenGL renderer. */
#ifndef RAGE_DISPLAY_OGL_H
#define RAGE_DISPLAY_OGL_H
@@ -12,7 +12,7 @@
#define AssertNoGLError() \
{ \
GLenum error = glGetError(); \
ASSERT_M( error == GL_NO_ERROR, RageDisplay_OGL_Helpers::GLToString(error) ); \
ASSERT_M( error == GL_NO_ERROR, RageDisplay_Legacy_Helpers::GLToString(error) ); \
}
#if defined(DEBUG) || !defined(GL_GET_ERROR_IS_SLOW)
@@ -23,11 +23,11 @@
#define DebugAssertNoGLError()
#endif
class RageDisplay_OGL: public RageDisplay
class RageDisplay_Legacy: public RageDisplay
{
public:
RageDisplay_OGL();
virtual ~RageDisplay_OGL();
RageDisplay_Legacy();
virtual ~RageDisplay_Legacy();
virtual RString Init( const VideoModeParams &p, bool bAllowUnacceleratedRenderer );
virtual RString GetApiDescription() const { return "OpenGL"; }
@@ -129,7 +129,7 @@ protected:
#endif
/*
* Copyright (c) 2001-2004 Chris Danford, Glenn Maynard
* Copyright (c) 2001-2011 Chris Danford, Glenn Maynard, Colby Klein
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
+5 -227
View File
@@ -31,61 +31,19 @@ namespace
}
};
void RageDisplay_OGL_Helpers::Init()
void RageDisplay_Legacy_Helpers::Init()
{
InitStringMap();
}
RString RageDisplay_OGL_Helpers::GLToString( GLenum e )
RString RageDisplay_Legacy_Helpers::GLToString( GLenum e )
{
if( g_Strings.find(e) != g_Strings.end() )
return g_Strings[e];
return ssprintf( "%i", int(e) );
}
GLExt_t GLExt;
/* Available extensions: */
static set<string> g_glExts;
bool GLExt_t::HasExtension( const RString &sExt ) const
{
return g_glExts.find(sExt) != g_glExts.end();
}
#define F(n) { (void **)(&GLExt.n), #n }
struct func_t
{
void **p;
const char *name;
};
static bool LoadAllOrNothing( struct func_t *funcs, LowLevelWindow *pWind )
{
bool bGotAll = true;
for( unsigned i = 0; funcs[i].p != NULL; ++i )
{
*funcs[i].p = pWind->GetProcAddress( funcs[i].name );
if( *funcs[i].p == NULL )
{
bGotAll = false;
break;
}
}
if( bGotAll )
return true;
/* If any function in the array wasn't found, clear them all. */
for( unsigned i = 0; funcs[i].p != NULL; ++i )
*funcs[i].p = NULL;
return false;
}
/*
static void GetGLExtensions( set<string> &ext )
{
const char *szBuf = (const char *) glGetString( GL_EXTENSIONS );
@@ -96,190 +54,10 @@ static void GetGLExtensions( set<string> &ext )
for( unsigned i = 0; i < asList.size(); ++i )
ext.insert( asList[i] );
}
void GLExt_t::Load( LowLevelWindow *pWind )
{
memset( this, 0, sizeof(*this) );
GetGLExtensions( g_glExts );
m_bARB_texture_env_combine = HasExtension("GL_ARB_texture_env_combine");
m_bEXT_texture_env_combine = HasExtension("GL_EXT_texture_env_combine");
m_bGL_EXT_bgra = HasExtension("GL_EXT_bgra");
m_bGL_ARB_texture_float = HasExtension("GL_ARB_texture_float");
#if defined(WIN32)
if( HasExtension("WGL_EXT_swap_control") )
wglSwapIntervalEXT = (PWSWAPINTERVALEXTPROC) pWind->GetProcAddress("wglSwapIntervalEXT");
#endif
if( HasExtension("GL_EXT_paletted_texture") )
{
glColorTableEXT = (PFNGLCOLORTABLEPROC) pWind->GetProcAddress("glColorTableEXT");
glGetColorTableParameterivEXT = (PFNGLCOLORTABLEPARAMETERIVPROC) pWind->GetProcAddress("glGetColorTableParameterivEXT");
}
if( HasExtension("GL_ARB_multitexture") )
{
func_t funcs[] = {
F( glActiveTextureARB ),
F( glClientActiveTextureARB ),
{ NULL, NULL },
};
LoadAllOrNothing( funcs, pWind);
}
if( HasExtension("GL_EXT_blend_func_separate") )
glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) pWind->GetProcAddress("glBlendFuncSeparateEXT");
if( HasExtension("GL_EXT_blend_subtract") )
glBlendEquation = (PFNGLBLENDEQUATIONPROC) pWind->GetProcAddress("glBlendEquation");
/*
* Find extension functions.
*
* X11R6.7.0 (or possibly ATI's drivers) seem to be returning bogus values for glBindBufferARB
* if we don't actually check for GL_ARB_vertex_buffer_object.
* https://sf.net/tracker/download.php?group_id=37892&atid=421366&file_id=88086&aid=958820
* https://sf.net/tracker/download.php?group_id=37892&atid=421366&file_id=85542&aid=944836
*
* Let's check them all, to be safe.
*/
if( HasExtension("GL_ARB_vertex_buffer_object") )
{
func_t funcs[] = {
F( glGenBuffersARB ),
F( glBindBufferARB ),
F( glBufferDataARB ),
F( glBufferSubDataARB ),
F( glDeleteBuffersARB ),
F( glMapBufferARB ),
F( glUnmapBufferARB ),
{ NULL, NULL },
};
LoadAllOrNothing( funcs, pWind );
}
if( HasExtension("GL_EXT_draw_range_elements") )
GLExt.glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) pWind->GetProcAddress("glDrawRangeElements");
m_bGL_ARB_shader_objects = HasExtension("GL_ARB_shader_objects");
if( m_bGL_ARB_shader_objects )
{
func_t funcs[] = {
F( glCreateShaderObjectARB ),
F( glCreateShaderObjectARB ),
F( glCreateProgramObjectARB ),
F( glShaderSourceARB ),
F( glCompileShaderARB ),
F( glGetObjectParameterfvARB ),
F( glGetObjectParameterivARB ),
F( glGetInfoLogARB ),
F( glAttachObjectARB ),
F( glDeleteObjectARB ),
F( glLinkProgramARB ),
F( glUseProgramObjectARB ),
F( glVertexAttrib2fARB ),
F( glVertexAttrib3fARB ),
F( glVertexAttrib4fARB ),
F( glEnableVertexAttribArrayARB ),
F( glDisableVertexAttribArrayARB ),
F( glVertexAttribPointerARB ),
F( glGetUniformLocationARB ),
F( glUniform1fARB ),
F( glUniform2fARB ),
F( glUniform3fARB ),
F( glUniform4fARB ),
F( glUniform1iARB ),
F( glUniform2iARB ),
F( glUniform3iARB ),
F( glUniform4iARB ),
F( glUniform1fvARB ),
F( glUniform2fvARB ),
F( glUniform3fvARB ),
F( glUniform4fvARB ),
F( glUniform1ivARB ),
F( glUniform2ivARB ),
F( glUniform3ivARB ),
F( glUniform4ivARB ),
F( glUniformMatrix2fvARB ),
F( glUniformMatrix2fvARB ),
F( glUniformMatrix2fvARB ),
{ NULL, NULL }
};
if( !LoadAllOrNothing(funcs, pWind) )
m_bGL_ARB_shader_objects = false;
}
m_bGL_ARB_vertex_shader = m_bGL_ARB_shader_objects && HasExtension("GL_ARB_vertex_shader");
m_bGL_ARB_fragment_shader = m_bGL_ARB_shader_objects && HasExtension("GL_ARB_fragment_shader");
if( m_bGL_ARB_vertex_shader )
{
func_t funcs[] =
{
F( glBindAttribLocationARB ),
F( glGetAttribLocationARB ),
{ NULL, NULL }
};
if( !LoadAllOrNothing(funcs, pWind) )
m_bGL_ARB_vertex_shader = false;
}
m_bGL_ARB_shading_language_100 = HasExtension("GL_ARB_shading_language_100");
if( m_bGL_ARB_shading_language_100 )
{
while( glGetError() != GL_NO_ERROR )
;
const char *pzVersion = (const char *) glGetString( GL_SHADING_LANGUAGE_VERSION );
GLenum glError = glGetError();
if( glError == GL_INVALID_ENUM )
{
LOG->Info( "No GL_SHADING_LANGUAGE_VERSION; assuming 1.0" );
m_iShadingLanguageVersion = 100;
}
else
{
const float fVersion = StringToFloat( pzVersion );
m_iShadingLanguageVersion = lrintf( fVersion * 100 );
/* The version string may contain extra information beyond the version number. */
LOG->Info( "OpenGL shading language: %s", pzVersion );
}
}
m_bGL_EXT_framebuffer_object = HasExtension("GL_EXT_framebuffer_object");
if( m_bGL_EXT_framebuffer_object )
{
func_t funcs[] = {
F( glIsRenderbufferEXT ),
F( glBindRenderbufferEXT ),
F( glDeleteRenderbuffersEXT ),
F( glGenRenderbuffersEXT ),
F( glRenderbufferStorageEXT ),
F( glGetRenderbufferParameterivEXT ),
F( glIsFramebufferEXT ),
F( glBindFramebufferEXT ),
F( glDeleteFramebuffersEXT ),
F( glGenFramebuffersEXT ),
F( glCheckFramebufferStatusEXT ),
F( glFramebufferTexture1DEXT ),
F( glFramebufferTexture2DEXT ),
F( glFramebufferTexture3DEXT ),
F( glFramebufferRenderbufferEXT ),
F( glGetFramebufferAttachmentParameterivEXT ),
F( glGenerateMipmapEXT ),
{ NULL, NULL }
};
if( !LoadAllOrNothing(funcs, pWind) )
m_bGL_EXT_framebuffer_object = false;
}
}
*/
/*
* Copyright (c) 2001-2005 Chris Danford, Glenn Maynard
* Copyright (c) 2001-2011 Chris Danford, Glenn Maynard, Colby Klein
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
+4 -121
View File
@@ -1,25 +1,13 @@
#ifndef RAGE_DISPLAY_OGL_HELPERS_H
#define RAGE_DISPLAY_OGL_HELPERS_H
/* ours may be more up-to-date */
#define __glext_h_
#if defined(WIN32)
#include <windows.h>
#endif
#if !defined(MACOSX)
# include <GL/gl.h>
# include <GL/glu.h>
#else
# include <OpenGL/gl.h>
# include <OpenGL/glu.h>
#endif
#include <GL/glew.h>
#undef __glext_h_
#include "glext.h"
/* Import RageDisplay, for types. Do not include RageDisplay_OGL.h. */
/* Import RageDisplay, for types. Do not include RageDisplay_Legacy.h. */
#include "RageDisplay.h"
/* Windows defines GL_EXT_paletted_texture incompletely: */
@@ -27,11 +15,8 @@
#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
#endif
/* Not in glext.h: */
typedef bool (APIENTRY * PWSWAPINTERVALEXTPROC) (int interval);
/** @brief Utilities for working with the RageDisplay. */
namespace RageDisplay_OGL_Helpers
namespace RageDisplay_Legacy_Helpers
{
void Init();
RString GLToString( GLenum e );
@@ -60,112 +45,10 @@ protected:
RenderTargetParam m_Param;
};
class LowLevelWindow;
struct GLExt_t
{
bool m_bARB_texture_env_combine;
bool m_bEXT_texture_env_combine;
bool m_bGL_EXT_bgra;
bool m_bGL_ARB_texture_float;
PWSWAPINTERVALEXTPROC wglSwapIntervalEXT;
PFNGLCOLORTABLEPROC glColorTableEXT;
PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
PFNGLBLENDEQUATIONPROC glBlendEquation;
PFNGLCOLORTABLEPARAMETERIVPROC glGetColorTableParameterivEXT;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
// ARB_vertex_buffer_object:
PFNGLGENBUFFERSARBPROC glGenBuffersARB;
PFNGLBINDBUFFERARBPROC glBindBufferARB;
PFNGLBUFFERDATAARBPROC glBufferDataARB;
PFNGLBUFFERSUBDATAARBPROC glBufferSubDataARB;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
PFNGLMAPBUFFERARBPROC glMapBufferARB;
PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
// GL_ARB_shader_objects:
bool m_bGL_ARB_shader_objects;
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
PFNGLVERTEXATTRIB2FARBPROC glVertexAttrib2fARB;
PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB;
PFNGLVERTEXATTRIB4FARBPROC glVertexAttrib4fARB;
PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLUNIFORM2FARBPROC glUniform2fARB;
PFNGLUNIFORM3FARBPROC glUniform3fARB;
PFNGLUNIFORM4FARBPROC glUniform4fARB;
PFNGLUNIFORM1IARBPROC glUniform1iARB;
PFNGLUNIFORM2IARBPROC glUniform2iARB;
PFNGLUNIFORM3IARBPROC glUniform3iARB;
PFNGLUNIFORM4IARBPROC glUniform4iARB;
PFNGLUNIFORM1FVARBPROC glUniform1fvARB;
PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
PFNGLUNIFORM3FVARBPROC glUniform3fvARB;
PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
PFNGLUNIFORM1IVARBPROC glUniform1ivARB;
PFNGLUNIFORM2IVARBPROC glUniform2ivARB;
PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
// GL_ARB_vertex_shader and GL_ARB_fragment_shader:
bool m_bGL_ARB_vertex_shader;
bool m_bGL_ARB_fragment_shader;
PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;
PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB;
bool m_bGL_ARB_shading_language_100;
int m_iShadingLanguageVersion; /* * 100 */
// GL_EXT_framebuffer_object:
bool m_bGL_EXT_framebuffer_object;
PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;
PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT;
PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT;
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT;
PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
void Load( LowLevelWindow *pWind );
bool HasExtension( const RString &sExt ) const;
};
extern GLExt_t GLExt;
#endif
/*
* Copyright (c) 2001-2005 Chris Danford, Glenn Maynard
* Copyright (c) 2001-2011 Chris Danford, Glenn Maynard, Colby Klein
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
+89 -86
View File
@@ -80,7 +80,6 @@ AutoScreenMessage( SM_BackFromTimeSignatureNumeratorChange );
AutoScreenMessage( SM_BackFromTimeSignatureDenominatorChange );
AutoScreenMessage( SM_BackFromTickcountChange );
AutoScreenMessage( SM_BackFromComboChange );
AutoScreenMessage( SM_BackFromWarpChange );
AutoScreenMessage( SM_DoSaveAndExit );
AutoScreenMessage( SM_DoExit );
AutoScreenMessage( SM_SaveSuccessful );
@@ -95,6 +94,35 @@ static const char *EditStateNames[] = {
XToString( EditState );
LuaXType( EditState );
#if defined(XBOX)
void ScreenEdit::InitEditMappings()
{
/* XXX: fill this in */
m_EditMappingsDeviceInput.Clear();
switch( EDIT_MODE.GetValue() )
{
case EditMode_Practice:
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_PREV_MEASURE][0] = DeviceInput(DEVICE_JOY1, JOY_HAT_UP);
m_EditMappingsMenuButton.button[EDIT_BUTTON_SCROLL_PREV_MEASURE][0] = GAME_BUTTON_UP;
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_NEXT_MEASURE][0] = DeviceInput(DEVICE_JOY1, JOY_HAT_DOWN);
m_EditMappingsMenuButton.button[EDIT_BUTTON_SCROLL_NEXT_MEASURE][0] = GAME_BUTTON_DOWN;
break;
default:
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_UP_LINE][0] = DeviceInput(DEVICE_JOY1, JOY_HAT_UP);
m_EditMappingsMenuButton.button[EDIT_BUTTON_SCROLL_UP_LINE][0] = GAME_BUTTON_UP;
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_DOWN_LINE][0] = DeviceInput(DEVICE_JOY1, JOY_HAT_DOWN);
m_EditMappingsMenuButton.button[EDIT_BUTTON_SCROLL_DOWN_LINE][0] = GAME_BUTTON_DOWN;
break;
}
// Map these to the triggers: L goes up, R goes down.
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_UP_PAGE][0] = DeviceInput(DEVICE_JOY1, JOY_BUTTON_7);
//m_EditMappingsMenuButton.button[EDIT_BUTTON_SCROLL_UP_PAGE][0] = GAME_BUTTON_UPLEFT;
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_DOWN_PAGE][0] = DeviceInput(DEVICE_JOY1, JOY_BUTTON_8);
//m_EditMappingsMenuButton.button[EDIT_BUTTON_SCROLL_DOWN_PAGE][0] = GAME_BUTTON_UPRIGHT;
}
#else
void ScreenEdit::InitEditMappings()
{
m_EditMappingsDeviceInput.Clear();
@@ -207,7 +235,7 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SAMPLE_LENGTH_DOWN][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SAMPLE_LENGTH_DOWN][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_PLAY_SAMPLE_MUSIC][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cl);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_PLAY_SAMPLE_MUSIC][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cm);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_BGCHANGE_LAYER1_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cb);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_BGCHANGE_LAYER2_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cb);
@@ -240,7 +268,7 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.button[EDIT_BUTTON_RIGHT_SIDE][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RALT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_LAY_ROLL][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT);
// m_EditMappingsDeviceInput.button[EDIT_BUTTON_LAY_TAP_ATTACK][0] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_CYCLE_TAP_LEFT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cn);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_CYCLE_TAP_RIGHT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cm);
@@ -263,7 +291,7 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsMenuButton.button[EDIT_BUTTON_OPEN_EDIT_MENU][1] = GAME_BUTTON_BACK;
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_AREA_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_ENTER);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_INPUT_HELP][0] = DeviceInput(DEVICE_KEYBOARD, KEY_F1);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_BAKE_RANDOM_FROM_SONG_GROUP][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cb);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_BAKE_RANDOM_FROM_SONG_GROUP][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LALT);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_BAKE_RANDOM_FROM_SONG_GROUP][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RALT);
@@ -281,7 +309,7 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.button[EDIT_BUTTON_ADJUST_FINE][0] = DeviceInput(DEVICE_KEYBOARD, KEY_RALT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_ADJUST_FINE][1] = DeviceInput(DEVICE_KEYBOARD, KEY_LALT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SAVE][1] = DeviceInput(DEVICE_KEYBOARD, KEY_Cs);
#if defined(MACOSX)
/* use cmd */
@@ -294,10 +322,10 @@ void ScreenEdit::InitEditMappings()
#endif
m_EditMappingsDeviceInput.button[EDIT_BUTTON_UNDO][1] = DeviceInput(DEVICE_KEYBOARD, KEY_Cu);
// Switch players, if it makes sense to do so.
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SWITCH_PLAYERS][0] = DeviceInput(DEVICE_KEYBOARD, KEY_SLASH);
m_PlayMappingsDeviceInput.button[EDIT_BUTTON_RETURN_TO_EDIT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_ESC);
m_PlayMappingsMenuButton.button[EDIT_BUTTON_RETURN_TO_EDIT][1] = GAME_BUTTON_BACK;
@@ -318,6 +346,8 @@ void ScreenEdit::InitEditMappings()
m_RecordPausedMappingsDeviceInput.button[EDIT_BUTTON_UNDO][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cu);
}
#endif
/* Given a DeviceInput that was just depressed, return an active edit function. */
EditButton ScreenEdit::DeviceToEdit( const DeviceInput &DeviceI ) const
{
@@ -510,7 +540,8 @@ static MenuDef g_AreaMenu(
static MenuDef g_StepsInformation(
"ScreenMiniMenuStepsInformation",
MenuRowDef( ScreenEdit::difficulty, "Difficulty", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::meter, "Meter", true, EditMode_Practice, true, false, 0, MIN_METER, MAX_METER ),
// xxx: this giant list of numbers SUUUUUUUUUUCKS -aj
MenuRowDef( ScreenEdit::meter, "Meter", true, EditMode_Practice, true, false, 0, "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25" ),
MenuRowDef( ScreenEdit::description, "Description", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::chartstyle, "Chart Style", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::step_credit, "Step Author", true, EditMode_Practice, true, true, 0, NULL ),
@@ -538,10 +569,7 @@ static MenuDef g_SongInformation(
MenuRowDef( ScreenEdit::main_title_transliteration, "Main title transliteration", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::sub_title_transliteration, "Sub title transliteration", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::artist_transliteration, "Artist transliteration", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::last_beat_hint, "Last beat hint", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::display_bpm, "Display BPM", true, EditMode_Full, true, true, 0, "Actual", "Specified", "Random" ),
MenuRowDef( ScreenEdit::min_bpm, "Min BPM", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::max_bpm, "Max BPM", true, EditMode_Full, true, true, 0, NULL )
MenuRowDef( ScreenEdit::last_beat_hint, "Last beat hint", true, EditMode_Full, true, true, 0, NULL )
);
static MenuDef g_TimingDataInformation(
@@ -552,8 +580,7 @@ static MenuDef g_TimingDataInformation(
MenuRowDef( ScreenEdit::time_signature_numerator, "Edit time signature (top)", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::time_signature_denominator, "Edit time signature (bottom)", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::tickcount, "Edit tickcount", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::combo, "Edit combo", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::warp, "Edit warp", true, EditMode_Full, true, true, 0, NULL )
MenuRowDef( ScreenEdit::combo, "Edit combo", true, EditMode_Full, true, true, 0, NULL )
);
enum { song_bganimation, song_movie, song_bitmap, global_bganimation, global_movie, global_movie_song_group, global_movie_song_group_and_genre, dynamic_random, baked_random, none };
@@ -738,11 +765,8 @@ void ScreenEdit::Init()
}
}
m_PlayerStateEdit.m_PlayerNumber = PLAYER_1;
// If we always go with the GAMESTATE NoteSkin, we will have fun effects
// like Vivid or Flat in the editor notefield. This is not conducive to
// productive editing.
// todo: We should allow certain noteskins (note-colored/rhythm) to be
// displayed. (Perhaps this should be a noteskin metric.) -aj
// If we always go with the GAMESTATE NoteSkin, we will have fun effects like Vivid or Flat in the editor notefield.
// This is not conducive to productive editing.
if( NOTESKIN->DoesNoteSkinExist( EDITOR_NOTE_SKINS[PLAYER_1].Get() ) )
{
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, EDITOR_NOTE_SKINS[PLAYER_1].Get() );
@@ -1219,8 +1243,6 @@ static int FindAttackAtTime( const AttackArray& attacks, float fStartTime )
static LocalizedString SWITCHED_TO ( "ScreenEdit", "Switched to" );
static LocalizedString NO_BACKGROUNDS_AVAILABLE ( "ScreenEdit", "No backgrounds available" );
static ThemeMetric<bool> INVERT_SCROLL_BUTTONS ( "ScreenEdit", "InvertScrollSpeedButtons" );
void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
{
if( input.type == IET_RELEASE )
@@ -1342,10 +1364,10 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
{
DEFAULT_FAIL(EditB);
case EDIT_BUTTON_SCROLL_SPEED_DOWN:
INVERT_SCROLL_BUTTONS ? ++iSpeed : --iSpeed;
--iSpeed;
break;
case EDIT_BUTTON_SCROLL_SPEED_UP:
INVERT_SCROLL_BUTTONS ? --iSpeed : ++iSpeed;
++iSpeed;
break;
}
iSpeed = clamp( iSpeed, 0, (int) ARRAYLEN(fSpeeds)-1 );
@@ -2646,12 +2668,6 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
}
SetDirty( true );
}
else if ( SM == SM_BackFromWarpChange )
{
float fWarp = StringToFloat( ScreenTextEntry::s_sLastAnswer );
m_pSong->m_Timing.SetWarpAtBeat( GAMESTATE->m_fSongBeat, fWarp );
SetDirty( true );
}
else if( SM == SM_BackFromBGChange )
{
HandleBGChangeChoice( (BGChangeChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
@@ -2851,8 +2867,8 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
if( (*s)->IsAutogen() )
continue;
// If the notedata has content, let it go.
if( !(*s)->GetNoteData().IsEmpty() )
continue;
// if( !(*s)->m_NoteData->IsEmpty() )
// continue;
// It's hard to say if these steps were saved to disk or not.
/*
if( !(*s)->GetSavedToDisk() )
@@ -2982,16 +2998,6 @@ static void ChangeLastBeatHint( const RString &sNew )
GAMESTATE->m_pCurSong->m_fSpecifiedLastBeat = StringToFloat( sNew );
}
static void ChangeMinBPM( const RString &sNew )
{
GAMESTATE->m_pCurSong->m_fSpecifiedBPMMin = StringToFloat( sNew );
}
static void ChangeMaxBPM( const RString &sNew )
{
GAMESTATE->m_pCurSong->m_fSpecifiedBPMMax = StringToFloat( sNew );
}
// End helper functions
static LocalizedString REVERT_LAST_SAVE ( "ScreenEdit", "Do you want to revert to your last save?" );
@@ -3183,9 +3189,6 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
g_SongInformation.rows[sub_title_transliteration].SetOneUnthemedChoice( pSong->m_sSubTitleTranslit );
g_SongInformation.rows[artist_transliteration].SetOneUnthemedChoice( pSong->m_sArtistTranslit );
g_SongInformation.rows[last_beat_hint].SetOneUnthemedChoice( ssprintf("%.5f", pSong->m_fSpecifiedLastBeat) );
g_SongInformation.rows[display_bpm].iDefaultChoice = pSong->m_DisplayBPMType;
g_SongInformation.rows[min_bpm].SetOneUnthemedChoice( ssprintf("%.5f", pSong->m_fSpecifiedBPMMin) );
g_SongInformation.rows[max_bpm].SetOneUnthemedChoice( ssprintf("%.5f", pSong->m_fSpecifiedBPMMax) );
EditMiniMenu( &g_SongInformation, SM_BackFromSongInformation );
}
@@ -3202,7 +3205,6 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
g_TimingDataInformation.rows[time_signature_denominator].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTimeSignatureDenominatorAtBeat( fBeat ) ) );
g_TimingDataInformation.rows[tickcount].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTickcountAtBeat( fBeat ) ) );
g_TimingDataInformation.rows[combo].SetOneUnthemedChoice( ssprintf("%d", pTime.GetComboAtBeat( fBeat ) ) );
g_TimingDataInformation.rows[warp].SetOneUnthemedChoice( ssprintf("%.5f", pTime.GetWarpAtBeat( fBeat ) ) );
EditMiniMenu( &g_TimingDataInformation, SM_BackFromTimingDataInformation );
}
@@ -3415,9 +3417,11 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector<int> &iAns
case tempo:
{
// This affects all steps.
const NoteData OldClipboard( m_Clipboard );
HandleAreaMenuChoice( cut );
AlterType at = (AlterType)iAnswers[c];
float fScale = -1;
switch( at )
{
DEFAULT_FAIL( at );
@@ -3428,18 +3432,31 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector<int> &iAns
case expand_3_2: fScale = 1.5f; break;
case expand_2x: fScale = 2; break;
}
int iStartIndex = m_NoteFieldEdit.m_iBeginMarker;
int iEndIndex = m_NoteFieldEdit.m_iEndMarker;
int iNewEndIndex = iEndIndex + lrintf( (iEndIndex - iStartIndex) * (fScale - 1) );
// scale currently editing notes
NoteDataUtil::ScaleRegion( m_NoteDataEdit, fScale, iStartIndex, iEndIndex );
// scale timing data
m_pSong->m_Timing.ScaleRegion( fScale, m_NoteFieldEdit.m_iBeginMarker, m_NoteFieldEdit.m_iEndMarker, true );
// scale all other steps.
switch( at )
{
DEFAULT_FAIL( at );
case compress_2x: NoteDataUtil::Scale( m_Clipboard, fScale ); break;
case compress_3_2: NoteDataUtil::Scale( m_Clipboard, fScale ); break;
case compress_4_3: NoteDataUtil::Scale( m_Clipboard, fScale ); break;
case expand_4_3: NoteDataUtil::Scale( m_Clipboard, fScale ); break;
case expand_3_2: NoteDataUtil::Scale( m_Clipboard, fScale ); break;
case expand_2x: NoteDataUtil::Scale( m_Clipboard, fScale ); break;
}
int iOldClipboardRow = m_NoteFieldEdit.m_iEndMarker - m_NoteFieldEdit.m_iBeginMarker;
int iNewClipboardRow = lrintf( iOldClipboardRow * fScale );
int iDeltaRows = iNewClipboardRow - iOldClipboardRow;
int iNewClipboardEndRow = m_NoteFieldEdit.m_iBeginMarker + iNewClipboardRow;
if( iDeltaRows > 0 )
NoteDataUtil::InsertRows( m_NoteDataEdit, m_NoteFieldEdit.m_iBeginMarker, iDeltaRows );
else
NoteDataUtil::DeleteRows( m_NoteDataEdit, m_NoteFieldEdit.m_iBeginMarker, -iDeltaRows );
m_pSong->m_Timing.ScaleRegion( fScale, m_NoteFieldEdit.m_iBeginMarker, m_NoteFieldEdit.m_iEndMarker );
HandleAreaMenuChoice( paste_at_begin_marker );
const vector<Steps*> sIter = m_pSong->GetAllSteps();
RString sTempStyle, sTempDiff;
for( unsigned i = 0; i < sIter.size(); i++ )
@@ -3459,8 +3476,12 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector<int> &iAns
sIter[i]->SetNoteData( ndTemp );
}
m_NoteFieldEdit.m_iEndMarker = iNewEndIndex;
m_NoteFieldEdit.m_iEndMarker = iNewClipboardEndRow;
float fOldBPM = m_pSong->GetBPMAtBeat( NoteRowToBeat(m_NoteFieldEdit.m_iBeginMarker) );
float fNewBPM = fOldBPM * fScale;
m_pSong->m_Timing.SetBPMAtRow( m_NoteFieldEdit.m_iBeginMarker, fNewBPM );
m_pSong->m_Timing.SetBPMAtRow( iNewClipboardEndRow, fOldBPM );
}
break;
case play:
@@ -3520,7 +3541,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector<int> &iAns
// don't move the step from where it is, just move everything later
NoteDataUtil::InsertRows( m_NoteDataEdit, BeatToNoteRow(GAMESTATE->m_fSongBeat) + 1, BeatToNoteRow(fStopBeats) );
m_pSong->m_Timing.InsertRows( BeatToNoteRow(GAMESTATE->m_fSongBeat) + 1, BeatToNoteRow(fStopBeats) );
m_pSong->m_Timing.InsertRows( BeatToNoteRow(GAMESTATE->m_fSongBeat) + 1, BeatToNoteRow(fStopSeconds) );
}
break;
case undo:
@@ -3546,6 +3567,7 @@ void ScreenEdit::HandleStepsInformationChoice( StepsInformationChoice c, const v
switch( c )
{
case description:
// todo: Call a screen with class ScreenTextEntry instead. -aj
ScreenTextEntry::TextEntry(
SM_None,
ENTER_NEW_DESCRIPTION,
@@ -3590,15 +3612,15 @@ static LocalizedString ENTER_MAIN_TITLE_TRANSLIT ("ScreenEdit","Enter a new main
static LocalizedString ENTER_SUB_TITLE_TRANSLIT ("ScreenEdit","Enter a new sub title transliteration.");
static LocalizedString ENTER_ARTIST_TRANSLIT ("ScreenEdit","Enter a new artist transliteration.");
static LocalizedString ENTER_LAST_BEAT_HINT ("ScreenEdit","Enter a new last beat hint.");
static LocalizedString ENTER_MIN_BPM ("ScreenEdit","Enter a new min BPM.");
static LocalizedString ENTER_MAX_BPM ("ScreenEdit","Enter a new max BPM.");
void ScreenEdit::HandleSongInformationChoice( SongInformationChoice c, const vector<int> &iAnswers )
{
Song* pSong = GAMESTATE->m_pCurSong;
pSong->m_DisplayBPMType = static_cast<DisplayBPM>(iAnswers[display_bpm]);
// todo: Call a screen with class ScreenTextEntry instead.
// multiple times in this section, so I'm only saying it here. -aj
switch( c )
{
DEFAULT_FAIL(c);
case main_title:
ScreenTextEntry::TextEntry( SM_None, ENTER_MAIN_TITLE, pSong->m_sMainTitle, 100, NULL, ChangeMainTitle, NULL );
break;
@@ -3624,20 +3646,7 @@ void ScreenEdit::HandleSongInformationChoice( SongInformationChoice c, const vec
ScreenTextEntry::TextEntry( SM_None, ENTER_ARTIST_TRANSLIT, pSong->m_sArtistTranslit, 100, NULL, ChangeArtistTranslit, NULL );
break;
case last_beat_hint:
ScreenTextEntry::TextEntry( SM_None, ENTER_LAST_BEAT_HINT,
ssprintf("%.5f", pSong->m_fSpecifiedLastBeat), 20,
ScreenTextEntry::FloatValidate, ChangeLastBeatHint, NULL );
break;
case min_bpm:
ScreenTextEntry::TextEntry( SM_None, ENTER_MIN_BPM,
ssprintf("%.5f", pSong->m_fSpecifiedBPMMin), 20,
ScreenTextEntry::FloatValidate, ChangeMinBPM, NULL );
break;
case max_bpm:
ScreenTextEntry::TextEntry( SM_None, ENTER_MAX_BPM,
ssprintf("%.5f", pSong->m_fSpecifiedBPMMax), 20,
ScreenTextEntry::FloatValidate, ChangeMaxBPM, NULL );
break;
ScreenTextEntry::TextEntry( SM_None, ENTER_LAST_BEAT_HINT, ssprintf("%.5f", pSong->m_fSpecifiedLastBeat), 20, ScreenTextEntry::FloatValidate, ChangeLastBeatHint, NULL );
};
}
@@ -3648,13 +3657,13 @@ static LocalizedString ENTER_TIME_SIGNATURE_NUMERATOR_VALUE ( "ScreenEdit", "Ent
static LocalizedString ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature denominator value." );
static LocalizedString ENTER_TICKCOUNT_VALUE ( "ScreenEdit", "Enter a new Tickcount value." );
static LocalizedString ENTER_COMBO_VALUE ( "ScreenEdit", "Enter a new Combo value." );
static LocalizedString ENTER_WARP_VALUE ( "ScreenEdit", "Enter a new Warp value." );
void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice c, const vector<int> &iAnswers )
{
switch( c )
{
DEFAULT_FAIL( c );
case bpm:
// todo: Call a screen with class ScreenTextEntry instead. -aj
ScreenTextEntry::TextEntry(
SM_BackFromBPMChange,
ENTER_BPM_VALUE,
@@ -3663,6 +3672,7 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice
);
break;
case stop:
// todo: Call a screen with class ScreenTextEntry instead. -aj
ScreenTextEntry::TextEntry(
SM_BackFromStopChange,
ENTER_STOP_VALUE,
@@ -3671,6 +3681,7 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice
);
break;
case delay:
// todo: Call a screen with class ScreenTextEntry instead. -aj
ScreenTextEntry::TextEntry(
SM_BackFromDelayChange,
ENTER_DELAY_VALUE,
@@ -3710,14 +3721,6 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice
4
);
break;
case warp:
ScreenTextEntry::TextEntry(
SM_BackFromWarpChange,
ENTER_WARP_VALUE,
ssprintf( "%.4f", m_pSong->m_Timing.GetWarpAtRow( BeatToNoteRow(GAMESTATE->m_fSongBeat) ) ),
10
);
break;
}
}
+39 -7
View File
@@ -68,12 +68,27 @@
#include "SpecialFiles.h"
#include "Profile.h"
#if defined(WIN32)
#if defined(XBOX)
#include "Archutils/Xbox/VirtualMemory.h"
#endif
#if defined(WIN32) && !defined(XBOX)
#include <windows.h>
#endif
// since the XBOX SDK only works with VS.Net 2003, this doesn't exist yet.
// see http://old.nabble.com/Linking-Error-with-MSVC%2B%2B-6.0-td21608559.html
// for more information. -aj
#if defined(XBOX)
extern "C"
{
int _get_output_format( void ){ return 0; }
}
#endif
static Preference<bool> g_bAllowMultipleInstances( "AllowMultipleInstances", false );
void StepMania::GetPreferredVideoModeParams( VideoModeParams &paramsOut )
{
/* We can't rely on there being full-screen video modes that give us square
@@ -406,7 +421,7 @@ static void AdjustForChangedSystemCapabilities()
}
#if defined(WIN32)
#include "RageDisplay_D3D.h"
//#include "RageDisplay_D3D.h"
#include "archutils/Win32/VideoDriverInfo.h"
#endif
@@ -454,6 +469,14 @@ struct VideoCardDefaults
}
} const g_VideoCardDefaults[] =
{
VideoCardDefaults(
"Xbox",
"d3d",
600,400,
32,32,32,
2048,
true
),
VideoCardDefaults(
"Voodoo *5",
"d3d,opengl", // received 3 reports of opengl crashing. -Chris
@@ -613,6 +636,8 @@ static RString GetVideoDriverName()
{
#if defined(_WINDOWS)
return GetPrimaryVideoDriverName();
#elif defined(_XBOX)
return "Xbox";
#else
return "OpenGL";
#endif
@@ -737,14 +762,15 @@ RageDisplay *CreateDisplay()
if( sRenderer.CompareNoCase("opengl")==0 )
{
#if defined(SUPPORT_OPENGL)
pRet = new RageDisplay_OGL;
pRet = new RageDisplay_Legacy;
#endif
}
else if( sRenderer.CompareNoCase("d3d")==0 )
{
#if defined(SUPPORT_D3D)
pRet = new RageDisplay_D3D;
#endif
// TODO: ANGLE/RageDisplay_Modern
//#if defined(SUPPORT_D3D)
// pRet = new RageDisplay_D3D;
//#endif
}
else if( sRenderer.CompareNoCase("null")==0 )
{
@@ -854,8 +880,11 @@ static void MountTreeOfZips( const RString &dir )
RString path = dirs.back();
dirs.pop_back();
#if !defined(XBOX)
// Xbox doesn't detect directories properly, so we'll ignore this
if( !IsADirectory(path) )
continue;
#endif
vector<RString> zips;
GetDirListing( path + "/*.zip", zips, false, true );
@@ -969,6 +998,10 @@ int main(int argc, char* argv[])
ApplyLogPreferences();
#if defined(XBOX)
vmem_Manager.Init();
#endif
WriteLogHeader();
// Set up alternative filesystem trees.
@@ -1534,4 +1567,3 @@ void HandleInputEvents(float fDeltaTime)
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
@@ -3,7 +3,7 @@
#import "DisplayResolutions.h"
#import "RageUtil.h"
#import "RageThreads.h"
#import "RageDisplay_OGL_Helpers.h"
#import "RageDisplay_Legacy_Helpers.h"
#import "arch/ArchHooks/ArchHooks.h"
#import <Cocoa/Cocoa.h>
@@ -257,7 +257,7 @@ void RenderTarget_MacOSX::Create( const RenderTargetParam &param, int &iTextureW
iTextureWidth, iTextureHeight, 0, param.bWithAlpha? GL_RGBA:GL_RGB,
GL_UNSIGNED_BYTE, NULL );
GLenum error = glGetError();
ASSERT_M( error == GL_NO_ERROR, RageDisplay_OGL_Helpers::GLToString(error) );
ASSERT_M( error == GL_NO_ERROR, RageDisplay_Legacy_Helpers::GLToString(error) );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
@@ -284,7 +284,7 @@ void RenderTarget_MacOSX::FinishRenderingTo()
glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_iWidth, m_iHeight );
GLenum error = glGetError();
ASSERT_M( error == GL_NO_ERROR, RageDisplay_OGL_Helpers::GLToString(error) );
ASSERT_M( error == GL_NO_ERROR, RageDisplay_Legacy_Helpers::GLToString(error) );
glBindTexture( GL_TEXTURE_2D, 0 );
@@ -632,4 +632,3 @@ void LowLevelWindow_MacOSX::BeginConcurrentRendering()
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
@@ -9,7 +9,7 @@
#include "LocalizedString.h"
#include "RageDisplay_OGL_Helpers.h"
using namespace RageDisplay_OGL_Helpers;
using namespace RageDisplay_Legacy_Helpers;
using namespace X11Helper;
#include <stack>