diff --git a/stepmania/README-FIRST.html b/stepmania/README-FIRST.html
index e68253a2d4..08f2729691 100644
--- a/stepmania/README-FIRST.html
+++ b/stepmania/README-FIRST.html
@@ -256,6 +256,9 @@ If you experience any visual errors, please visit your video card manufacturer's
web site and download the latest Direct3D 8.1 drivers. Below is a list of known
issues that are thought to be video card driver bugs:
+* Voodoo 3
+Blah
+
* S3 Savage family cards (e.g. Diamond Stealth)
Symptom: The right edge of some graphics appears "cut off".
Explanation: Drivers do not properly handle textures >= 512x512, resulting in
diff --git a/stepmania/src/Actor.cpp b/stepmania/src/Actor.cpp
index c3660d8a7e..06c430cf93 100644
--- a/stepmania/src/Actor.cpp
+++ b/stepmania/src/Actor.cpp
@@ -143,9 +143,13 @@ void Actor::BeginDraw() // set the world matrix and calculate actor properties
DISPLAY->Translate( m_temp.pos.x, m_temp.pos.y, m_temp.pos.z );
DISPLAY->Scale( m_temp.scale.x, m_temp.scale.y, m_temp.scale.z );
- if( m_temp.rotation.x != 0 ) DISPLAY->RotateX( m_temp.rotation.x );
- if( m_temp.rotation.y != 0 ) DISPLAY->RotateY( m_temp.rotation.y );
- if( m_temp.rotation.z != 0 ) DISPLAY->RotateZ( m_temp.rotation.z );
+
+ if( m_temp.rotation.x != 0 )
+ DISPLAY->RotateX( m_temp.rotation.x );
+ if( m_temp.rotation.y != 0 )
+ DISPLAY->RotateY( m_temp.rotation.y );
+ if( m_temp.rotation.z != 0 )
+ DISPLAY->RotateZ( m_temp.rotation.z );
}
void Actor::EndDraw()
diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp
index 5949ddce71..d553a5135a 100644
--- a/stepmania/src/Player.cpp
+++ b/stepmania/src/Player.cpp
@@ -284,6 +284,8 @@ void Player::DrawPrimitives()
DISPLAY->LookAt(Eye, At, Up);
}
+ else
+ DISPLAY->PushMatrix();
m_GrayArrowRow.Draw();
m_NoteField.Draw();
@@ -294,6 +296,8 @@ void Player::DrawPrimitives()
DISPLAY->ExitPerspective();
DISPLAY->PopMatrix();
}
+ else
+ DISPLAY->PopMatrix();
m_Judgment.Draw();
diff --git a/stepmania/src/RageDisplay.cpp b/stepmania/src/RageDisplay.cpp
index f0b88042ee..f9b20023cd 100644
--- a/stepmania/src/RageDisplay.cpp
+++ b/stepmania/src/RageDisplay.cpp
@@ -780,7 +780,10 @@ void RageDisplay::RotateY( float r )
void RageDisplay::RotateZ( float r )
{
- glRotatef(r* 180/PI, 0, 0, 1);
+ // HACK: Rotation about (0,0,1) seems to be broken in many Voodoo3 drivers,
+ // but only while using orthographic projections. Strange...
+ // Adding a tiny X component fixes the problem. -Chris
+ glRotatef(r* 180/PI, 0.00001f, 0, 1);
}
void RageDisplay::smPostMultMatrixf( const RageMatrix &f )
diff --git a/stepmania/src/arch/Sound/DSoundHelpers.cpp b/stepmania/src/arch/Sound/DSoundHelpers.cpp
index 6eed4e36f5..ac1cbedbc2 100644
--- a/stepmania/src/arch/Sound/DSoundHelpers.cpp
+++ b/stepmania/src/arch/Sound/DSoundHelpers.cpp
@@ -27,7 +27,7 @@ DSound::DSound()
HRESULT hr;
// Initialize COM
- if( hr = CoInitialize( NULL ) )
+ if( FAILED( hr = CoInitialize( NULL ) ) )
RageException::ThrowNonfatal(hr_ssprintf(hr, "CoInitialize"));
// Create IDirectSound using the primary sound device
diff --git a/stepmania/src/archutils/Win32/DebugInfoHunt.cpp b/stepmania/src/archutils/Win32/DebugInfoHunt.cpp
index 22da6cb004..e4e9fedfd9 100644
--- a/stepmania/src/archutils/Win32/DebugInfoHunt.cpp
+++ b/stepmania/src/archutils/Win32/DebugInfoHunt.cpp
@@ -2,56 +2,134 @@
#include "DebugInfoHunt.h"
#include "RageLog.h"
#include "RageUtil.h"
+#include "../../archutils/Win32/GotoURL.h"
-void PrintDebugInfoWin9x()
+struct VideoDriverInfo
+{
+ CString sProvider;
+ CString sDescription;
+ CString sVersion;
+ CString sDate;
+ CString sDeviceID;
+};
+
+CString GetRegValue( HKEY hKey, CString sName )
+{
+ char szBuffer[MAX_PATH];
+ DWORD nSize = sizeof(szBuffer)-1;
+ if( RegQueryValueEx(hKey, sName, NULL, NULL, (LPBYTE)szBuffer, &nSize) == ERROR_SUCCESS )
+ return szBuffer;
+ else
+ return "";
+}
+
+bool GetDebugInfoWin9x( VideoDriverInfo& infoOut )
{
HKEY hkey;
if (RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Class\\Display\\0000", &hkey) != ERROR_SUCCESS)
- return;
+ return false;
- char szBuffer[MAX_PATH];
- DWORD nSize;
-
-#define GETSZ2(a) nSize = sizeof(szBuffer)-1; if( RegQueryValueEx(hkey, a, NULL, NULL, (LPBYTE)szBuffer, &nSize) == ERROR_SUCCESS ) LOG->Info("%-15s:\t%s", a, szBuffer);
-
- LOG->Info("Video Driver Information (win9x):");
- GETSZ2("DriverDate");
- GETSZ2("DriverDesc");
- GETSZ2("MatchingDeviceId");
- GETSZ2("ProviderName");
- GETSZ2("Ver");
+ infoOut.sDate = GetRegValue( hkey, "DriverDate");
+ infoOut.sDescription = GetRegValue( hkey, "DriverDesc");
+ infoOut.sDeviceID = GetRegValue( hkey, "MatchingDeviceId");
+ infoOut.sProvider = GetRegValue( hkey, "ProviderName");
+ infoOut.sVersion = GetRegValue( hkey, "Ver");
RegCloseKey(hkey);
+ return true;
}
-void PrintDebugInfoWinNT()
+bool GetDebugInfoWinNT( VideoDriverInfo& infoOut )
{
HKEY hkey;
if (RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\0000", &hkey) != ERROR_SUCCESS)
- return;
+ return false;
- char szBuffer[MAX_PATH];
- DWORD nSize;
-
-#define GETSZ2(a) nSize = sizeof(szBuffer)-1; if( RegQueryValueEx(hkey, a, NULL, NULL, (LPBYTE)szBuffer, &nSize) == ERROR_SUCCESS ) LOG->Info("%-15s:\t%s", a, szBuffer);
-
- LOG->Info("Video Driver Information (winnt):");
- GETSZ2("DriverDate");
- GETSZ2("DriverDesc");
- GETSZ2("DriverVersion");
- GETSZ2("InfSection");
- GETSZ2("ProviderName");
- GETSZ2("MatchingDeviceId");
+ infoOut.sDate = GetRegValue( hkey, "DriverDate");
+ infoOut.sDescription = GetRegValue( hkey, "DriverDesc");
+ infoOut.sDeviceID = GetRegValue( hkey, "MatchingDeviceId");
+ infoOut.sProvider = GetRegValue( hkey, "ProviderName");
+ infoOut.sVersion = GetRegValue( hkey, "DriverVersion");
RegCloseKey(hkey);
+ return true;
}
+void HandleKnownTerribleDriver( VideoDriverInfo info )
+{
+ struct ProblemAndBookmark
+ {
+ char szProblemProvider[1024];
+ char szProblemDescription[1024];
+ char szReadMeBookmark[64];
+ };
+ ProblemAndBookmark ENTRIES[] =
+ {
+ // Hacked around the bug in the V3 driver. -Chris
+// {"3dfx Interactive, Inc. (Optimized by Amigamerlin)", "Voodoo3 PCI", "Voodoo3"},
+ {"blah", "blah", "Voodoo3"},
+ };
+ const int NUM_ENTRIES = sizeof(ENTRIES) / sizeof(ENTRIES[0]);
+
+ for( int i=0; iWarn( "Failed to get video card driver info." );
+ return;
+
+got_debug_info:
+
+ LOG->Info("Video Driver Information:");
+ LOG->Info("%-15s:\t%s", "Provider", info.sProvider.GetString());
+ LOG->Info("%-15s:\t%s", "Description", info.sDescription.GetString());
+ LOG->Info("%-15s:\t%s", "Version", info.sVersion.GetString());
+ LOG->Info("%-15s:\t%s", "Date", info.sDate.GetString());
+ LOG->Info("%-15s:\t%s", "DeviceID", info.sDeviceID.GetString());
+
+ HandleKnownTerribleDriver( info );
}
static CString wo_ssprintf( MMRESULT err, const char *fmt, ...)