Aniso filter setting working in GL, some code moving around, spelling fixes
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1341 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
9ed23af1c2
commit
c541f3c335
|
@ -739,11 +739,23 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\VertexLoader.cpp"
|
RelativePath=".\Src\VertexLoader.cpp"
|
||||||
>
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AssemblerOutput="4"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\VertexLoader.h"
|
RelativePath=".\Src\VertexLoader.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\VertexLoader_Color.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\VertexLoader_Color.h"
|
RelativePath=".\Src\VertexLoader_Color.h"
|
||||||
>
|
>
|
||||||
|
@ -756,10 +768,18 @@
|
||||||
RelativePath=".\Src\VertexLoader_Normal.h"
|
RelativePath=".\Src\VertexLoader_Normal.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\VertexLoader_Position.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\VertexLoader_Position.h"
|
RelativePath=".\Src\VertexLoader_Position.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\VertexLoader_TextCoord.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\VertexLoader_TextCoord.h"
|
RelativePath=".\Src\VertexLoader_TextCoord.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -268,7 +268,7 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changes & 0x18)
|
if (changes & 0x18)
|
||||||
SetColorMask();
|
Renderer::SetColorMask();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
if (changes) {
|
if (changes) {
|
||||||
VertexManager::Flush();
|
VertexManager::Flush();
|
||||||
((u32*)&bpmem)[addr] = newval;
|
((u32*)&bpmem)[addr] = newval;
|
||||||
SetScissorRect();
|
Renderer::SetScissorRect();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -352,7 +352,7 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
if (changes) {
|
if (changes) {
|
||||||
VertexManager::Flush();
|
VertexManager::Flush();
|
||||||
((u32*)&bpmem)[addr] = newval;
|
((u32*)&bpmem)[addr] = newval;
|
||||||
if (!SetScissorRect()) {
|
if (!Renderer::SetScissorRect()) {
|
||||||
if (addr == BPMEM_SCISSORBR )
|
if (addr == BPMEM_SCISSORBR )
|
||||||
ERROR_LOG("bad scissor!\n");
|
ERROR_LOG("bad scissor!\n");
|
||||||
}
|
}
|
||||||
|
@ -447,7 +447,7 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
PE_copy.Hex = bpmem.triggerEFBCopy;
|
PE_copy.Hex = bpmem.triggerEFBCopy;
|
||||||
|
|
||||||
if (PE_copy.copy_to_xfb == 0) {
|
if (PE_copy.copy_to_xfb == 0) {
|
||||||
if(g_Config.bEBFToTextureDisable) {
|
if(g_Config.bEFBToTextureDisable) {
|
||||||
glViewport(rc.left,rc.bottom,rc.right,rc.top);
|
glViewport(rc.left,rc.bottom,rc.right,rc.top);
|
||||||
glScissor(rc.left,rc.bottom,rc.right,rc.top);
|
glScissor(rc.left,rc.bottom,rc.right,rc.top);
|
||||||
}
|
}
|
||||||
|
@ -521,7 +521,7 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
((bpmem.clearZValue>>8)&0xff)*(1/255.0f),
|
((bpmem.clearZValue>>8)&0xff)*(1/255.0f),
|
||||||
((bpmem.clearZValue>>16)&0xff)*(1/255.0f), 0);
|
((bpmem.clearZValue>>16)&0xff)*(1/255.0f), 0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
SetColorMask();
|
Renderer::SetColorMask();
|
||||||
GL_REPORT_ERRORD();
|
GL_REPORT_ERRORD();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,7 +531,7 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
glDrawBuffers(2, s_drawbuffers);
|
glDrawBuffers(2, s_drawbuffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetScissorRect(); // reset the scissor rect
|
Renderer::SetScissorRect(); // reset the scissor rect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -732,70 +732,6 @@ void BPWritten(int addr, int changes, int newval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SetColorMask()
|
|
||||||
{
|
|
||||||
if (bpmem.blendmode.alphaupdate && bpmem.blendmode.colorupdate)
|
|
||||||
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
|
|
||||||
else if (bpmem.blendmode.alphaupdate)
|
|
||||||
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
|
|
||||||
else if (bpmem.blendmode.colorupdate)
|
|
||||||
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// =======================================================================================
|
|
||||||
// Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg()
|
|
||||||
// case 0x52 > SetScissorRect()
|
|
||||||
// ---------------
|
|
||||||
// This function handles the OpenGL glScissor() function
|
|
||||||
// ---------------
|
|
||||||
// bpmem.scissorTL.x, y = 342x342
|
|
||||||
// bpmem.scissorBR.x, y = 981x821
|
|
||||||
// Renderer::GetTargetHeight() = the fixed ini file setting
|
|
||||||
// ---------------
|
|
||||||
bool SetScissorRect()
|
|
||||||
{
|
|
||||||
int xoff = bpmem.scissorOffset.x * 2 - 342;
|
|
||||||
int yoff = bpmem.scissorOffset.y * 2 - 342;
|
|
||||||
|
|
||||||
float rc_left = bpmem.scissorTL.x - xoff - 342; // left = 0
|
|
||||||
rc_left *= MValueX;
|
|
||||||
if (rc_left < 0) rc_left = 0;
|
|
||||||
|
|
||||||
float rc_top = bpmem.scissorTL.y - yoff - 342; // right = 0
|
|
||||||
rc_top *= MValueY;
|
|
||||||
if (rc_top < 0) rc_top = 0;
|
|
||||||
|
|
||||||
float rc_right = bpmem.scissorBR.x - xoff - 342; // right = 640
|
|
||||||
rc_right *= MValueX;
|
|
||||||
if (rc_right > 640 * MValueX) rc_right = 640 * MValueX;
|
|
||||||
|
|
||||||
float rc_bottom = bpmem.scissorBR.y - yoff - 342; // bottom = 480
|
|
||||||
rc_bottom *= MValueY;
|
|
||||||
if (rc_bottom > 480 * MValueY) rc_bottom = 480 * MValueY;
|
|
||||||
|
|
||||||
/*__Log("Scissor: lt=(%d,%d), rb=(%d,%d,%i), off=(%d,%d)\n",
|
|
||||||
rc_left, rc_top,
|
|
||||||
rc_right, rc_bottom, Renderer::GetTargetHeight(),
|
|
||||||
xoff, yoff
|
|
||||||
);*/
|
|
||||||
|
|
||||||
if (rc_right >= rc_left && rc_bottom >= rc_top )
|
|
||||||
{
|
|
||||||
glScissor(
|
|
||||||
(int)rc_left, // x = 0
|
|
||||||
Renderer::GetTargetHeight()-(int)(rc_bottom), // y = 0
|
|
||||||
(int)(rc_right-rc_left), // y = 0
|
|
||||||
(int)(rc_bottom-rc_top) // y = 0
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg()
|
// Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg()
|
||||||
void LoadBPReg(u32 value0)
|
void LoadBPReg(u32 value0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,4 @@ void BPInit();
|
||||||
void LoadBPReg(u32 value0);
|
void LoadBPReg(u32 value0);
|
||||||
void BPReload();
|
void BPReload();
|
||||||
|
|
||||||
void SetColorMask();
|
|
||||||
bool SetScissorRect();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -75,11 +75,10 @@ void Config::Load()
|
||||||
iniFile.Get("Settings", "DisableTexturing", &bDisableTexturing, 0);
|
iniFile.Get("Settings", "DisableTexturing", &bDisableTexturing, 0);
|
||||||
|
|
||||||
iniFile.Get("Enhancements", "ForceFiltering", &bForceFiltering, 0);
|
iniFile.Get("Enhancements", "ForceFiltering", &bForceFiltering, 0);
|
||||||
iniFile.Get("Enhancements", "ForceMaxAniso", &bForceMaxAniso, 0);
|
iniFile.Get("Enhancements", "MaxAnisotropy", &iMaxAnisotropy, 3); // NOTE - this is x in (1 << x)
|
||||||
|
|
||||||
|
iniFile.Get("Hacks", "EFBToTextureDisable", &bEFBToTextureDisable, 0);
|
||||||
iniFile.Get("Hacks", "EFBToTextureDisable", &bEBFToTextureDisable, 0);
|
iniFile.Get("Hacks", "EFBToTextureDisableHotKey", &bEFBToTextureDisableHotKey, 0);
|
||||||
iniFile.Get("Hacks", "EBFToTextureDisableHotKey", &bEBFToTextureDisableHotKey, 0);
|
|
||||||
iniFile.Get("Hacks", "ProjectionHax1", &bProjectionHax1, 0);
|
iniFile.Get("Hacks", "ProjectionHax1", &bProjectionHax1, 0);
|
||||||
iniFile.Get("Hacks", "ProjectionHax2", &bProjectionHax2, 0);
|
iniFile.Get("Hacks", "ProjectionHax2", &bProjectionHax2, 0);
|
||||||
}
|
}
|
||||||
|
@ -112,10 +111,10 @@ void Config::Save()
|
||||||
iniFile.Set("Settings", "DisableTexturing", bDisableTexturing);
|
iniFile.Set("Settings", "DisableTexturing", bDisableTexturing);
|
||||||
|
|
||||||
iniFile.Set("Enhancements", "ForceFiltering", bForceFiltering);
|
iniFile.Set("Enhancements", "ForceFiltering", bForceFiltering);
|
||||||
iniFile.Set("Enhancements", "ForceMaxAniso", bForceMaxAniso);
|
iniFile.Set("Enhancements", "MaxAnisotropy", iMaxAnisotropy);
|
||||||
|
|
||||||
iniFile.Set("Hacks", "EFBToTextureDisable", bEBFToTextureDisable);
|
iniFile.Set("Hacks", "EFBToTextureDisable", bEFBToTextureDisable);
|
||||||
iniFile.Set("Hacks", "EBFToTextureDisableHotKey", bEBFToTextureDisableHotKey);
|
iniFile.Set("Hacks", "EFBToTextureDisableHotKey", bEFBToTextureDisableHotKey);
|
||||||
iniFile.Set("Hacks", "ProjectionHax1", bProjectionHax1);
|
iniFile.Set("Hacks", "ProjectionHax1", bProjectionHax1);
|
||||||
iniFile.Set("Hacks", "ProjectionHax2", bProjectionHax2);
|
iniFile.Set("Hacks", "ProjectionHax2", bProjectionHax2);
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ struct Config
|
||||||
// Enhancements
|
// Enhancements
|
||||||
int iMultisampleMode;
|
int iMultisampleMode;
|
||||||
bool bForceFiltering;
|
bool bForceFiltering;
|
||||||
bool bForceMaxAniso;
|
int iMaxAnisotropy;
|
||||||
|
|
||||||
// Information
|
// Information
|
||||||
bool bShowFPS;
|
bool bShowFPS;
|
||||||
|
@ -63,7 +63,8 @@ struct Config
|
||||||
bool bDumpTextures;
|
bool bDumpTextures;
|
||||||
|
|
||||||
// Hacks
|
// Hacks
|
||||||
bool bEBFToTextureDisable; bool bEBFToTextureDisableHotKey;
|
bool bEFBToTextureDisable;
|
||||||
|
bool bEFBToTextureDisableHotKey;
|
||||||
bool bProjectionHax1;
|
bool bProjectionHax1;
|
||||||
bool bProjectionHax2;
|
bool bProjectionHax2;
|
||||||
|
|
||||||
|
|
|
@ -31,8 +31,8 @@ BEGIN_EVENT_TABLE(ConfigDialog,wxDialog)
|
||||||
EVT_COMBOBOX(ID_FULLSCREENCB, ConfigDialog::GeneralSettingsChanged)
|
EVT_COMBOBOX(ID_FULLSCREENCB, ConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_COMBOBOX(ID_WINDOWRESOLUTIONCB, ConfigDialog::GeneralSettingsChanged)
|
EVT_COMBOBOX(ID_WINDOWRESOLUTIONCB, ConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_COMBOBOX(ID_ALIASMODECB, ConfigDialog::GeneralSettingsChanged)
|
EVT_COMBOBOX(ID_ALIASMODECB, ConfigDialog::GeneralSettingsChanged)
|
||||||
|
EVT_CHOICE(ID_MAXANISOTROPY, ConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_FORCEFILTERING, ConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_FORCEFILTERING, ConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_FORCEANISOTROPY, ConfigDialog::GeneralSettingsChanged)
|
|
||||||
EVT_CHECKBOX(ID_STRETCHTOFIT, ConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_STRETCHTOFIT, ConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_KEEPAR, ConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_KEEPAR, ConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_HIDECURSOR, ConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_HIDECURSOR, ConfigDialog::GeneralSettingsChanged)
|
||||||
|
@ -121,14 +121,20 @@ void ConfigDialog::CreateGUIControls()
|
||||||
sbEnhancements = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Enhancements"));
|
sbEnhancements = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Enhancements"));
|
||||||
m_ForceFiltering = new wxCheckBox(m_PageGeneral, ID_FORCEFILTERING, wxT("Force bi/trilinear filtering (May cause small glitches)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_ForceFiltering = new wxCheckBox(m_PageGeneral, ID_FORCEFILTERING, wxT("Force bi/trilinear filtering (May cause small glitches)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_ForceFiltering->SetValue(g_Config.bForceFiltering);
|
m_ForceFiltering->SetValue(g_Config.bForceFiltering);
|
||||||
m_ForceAnisotropy = new wxCheckBox(m_PageGeneral, ID_FORCEANISOTROPY, wxT("Force maximum anisotropy filtering"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
wxStaticText *AnisoText = new wxStaticText(m_PageGeneral, ID_WMTEXT, wxT("Anisotropic filter:"), wxDefaultPosition, wxDefaultSize, 0);
|
||||||
//m_ForceAnisotropy->SetValue(g_Config.bForceMaxAniso);
|
m_MaxAnisotropyCB = new wxChoice(m_PageGeneral, ID_MAXANISOTROPY, wxDefaultPosition, wxDefaultSize, arrayStringFor_MaxAnisotropyCB, 0, wxDefaultValidator);
|
||||||
m_ForceAnisotropy->Enable(false);
|
m_MaxAnisotropyCB->Append("1x");
|
||||||
|
m_MaxAnisotropyCB->Append("2x");
|
||||||
|
m_MaxAnisotropyCB->Append("4x");
|
||||||
|
m_MaxAnisotropyCB->Append("8x");
|
||||||
|
m_MaxAnisotropyCB->Append("16x");
|
||||||
|
m_MaxAnisotropyCB->SetSelection(g_Config.iMaxAnisotropy - 1);
|
||||||
|
|
||||||
wxStaticText *AAText = new wxStaticText(m_PageGeneral, ID_AATEXT, wxT("Anti-alias mode:"), wxDefaultPosition, wxDefaultSize, 0);
|
wxStaticText *AAText = new wxStaticText(m_PageGeneral, ID_AATEXT, wxT("Anti-alias mode:"), wxDefaultPosition, wxDefaultSize, 0);
|
||||||
wxArrayString arrayStringFor_AliasModeCB;
|
wxArrayString arrayStringFor_AliasModeCB;
|
||||||
m_AliasModeCB = new wxComboBox(m_PageGeneral, ID_ALIASMODECB, wxEmptyString, wxDefaultPosition, wxDefaultSize, arrayStringFor_AliasModeCB, 0, wxDefaultValidator);
|
m_AliasModeCB = new wxComboBox(m_PageGeneral, ID_ALIASMODECB, wxEmptyString, wxDefaultPosition, wxDefaultSize, arrayStringFor_AliasModeCB, 0, wxDefaultValidator);
|
||||||
wxString tmp;
|
wxString tmp;
|
||||||
tmp<<g_Config.iMultisampleMode;
|
tmp << g_Config.iMultisampleMode;
|
||||||
m_AliasModeCB->SetValue(tmp);
|
m_AliasModeCB->SetValue(tmp);
|
||||||
|
|
||||||
// Usage: The wxGBPosition() must have a column and row
|
// Usage: The wxGBPosition() must have a column and row
|
||||||
|
@ -148,7 +154,8 @@ void ConfigDialog::CreateGUIControls()
|
||||||
|
|
||||||
sEnhancements = new wxGridBagSizer(0, 0);
|
sEnhancements = new wxGridBagSizer(0, 0);
|
||||||
sEnhancements->Add(m_ForceFiltering, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALL, 5);
|
sEnhancements->Add(m_ForceFiltering, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALL, 5);
|
||||||
sEnhancements->Add(m_ForceAnisotropy, wxGBPosition(1, 0), wxGBSpan(1, 2), wxALL, 5);
|
sEnhancements->Add(AnisoText, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
||||||
|
sEnhancements->Add(m_MaxAnisotropyCB, wxGBPosition(1, 1), wxGBSpan(1, 2), wxALL, 5);
|
||||||
sEnhancements->Add(AAText, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
sEnhancements->Add(AAText, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
||||||
sEnhancements->Add(m_AliasModeCB, wxGBPosition(2, 1), wxGBSpan(1, 2), wxALL, 5);
|
sEnhancements->Add(m_AliasModeCB, wxGBPosition(2, 1), wxGBSpan(1, 2), wxALL, 5);
|
||||||
sbEnhancements->Add(sEnhancements);
|
sbEnhancements->Add(sEnhancements);
|
||||||
|
@ -200,7 +207,7 @@ void ConfigDialog::CreateGUIControls()
|
||||||
m_EFBToTextureDisable->SetToolTip(wxT("Do not copy the Embedded Framebuffer (EFB)"
|
m_EFBToTextureDisable->SetToolTip(wxT("Do not copy the Embedded Framebuffer (EFB)"
|
||||||
" to the\nTexture. This may result in a speed increase."));
|
" to the\nTexture. This may result in a speed increase."));
|
||||||
m_EFBToTextureDisable->Enable(true);
|
m_EFBToTextureDisable->Enable(true);
|
||||||
m_EFBToTextureDisable->SetValue(g_Config.bEBFToTextureDisable);
|
m_EFBToTextureDisable->SetValue(g_Config.bEFBToTextureDisable);
|
||||||
m_EFBToTextureDisableHotKey = new wxCheckBox(m_PageAdvanced,
|
m_EFBToTextureDisableHotKey = new wxCheckBox(m_PageAdvanced,
|
||||||
ID_EFBTOTEXTUREDISABLEHOTKEY, wxT("with hotkey E"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
ID_EFBTOTEXTUREDISABLEHOTKEY, wxT("with hotkey E"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_EFBToTextureDisableHotKey->SetToolTip(wxT("Use the E key to turn this option on and off"));
|
m_EFBToTextureDisableHotKey->SetToolTip(wxT("Use the E key to turn this option on and off"));
|
||||||
|
@ -208,7 +215,7 @@ void ConfigDialog::CreateGUIControls()
|
||||||
// JPeterson set the hot key to be Win32-specific
|
// JPeterson set the hot key to be Win32-specific
|
||||||
m_EFBToTextureDisableHotKey->Enable(false);
|
m_EFBToTextureDisableHotKey->Enable(false);
|
||||||
#endif
|
#endif
|
||||||
m_EFBToTextureDisableHotKey->SetValue(g_Config.bEBFToTextureDisableHotKey);
|
m_EFBToTextureDisableHotKey->SetValue(g_Config.bEFBToTextureDisableHotKey);
|
||||||
|
|
||||||
m_SafeTextureCache = new wxCheckBox(m_PageAdvanced, ID_SAFETEXTURECACHE, wxT("Safe texture cache"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_SafeTextureCache = new wxCheckBox(m_PageAdvanced, ID_SAFETEXTURECACHE, wxT("Safe texture cache"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_SafeTextureCache->SetToolTip(wxT("This is useful to prevent Metroid Prime from crashing, but can cause problems in other games."));
|
m_SafeTextureCache->SetToolTip(wxT("This is useful to prevent Metroid Prime from crashing, but can cause problems in other games."));
|
||||||
|
@ -330,8 +337,8 @@ void ConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
|
||||||
case ID_FORCEFILTERING:
|
case ID_FORCEFILTERING:
|
||||||
g_Config.bForceFiltering = m_ForceFiltering->IsChecked();
|
g_Config.bForceFiltering = m_ForceFiltering->IsChecked();
|
||||||
break;
|
break;
|
||||||
case ID_FORCEANISOTROPY:
|
case ID_MAXANISOTROPY:
|
||||||
g_Config.bForceMaxAniso = m_ForceAnisotropy->IsChecked();
|
g_Config.iMaxAnisotropy = m_MaxAnisotropyCB->GetSelection() + 1;
|
||||||
break;
|
break;
|
||||||
case ID_ALIASMODECB:
|
case ID_ALIASMODECB:
|
||||||
g_Config.iMultisampleMode = atoi(m_AliasModeCB->GetValue().mb_str());
|
g_Config.iMultisampleMode = atoi(m_AliasModeCB->GetValue().mb_str());
|
||||||
|
@ -380,10 +387,10 @@ void ConfigDialog::AdvancedSettingsChanged(wxCommandEvent& event)
|
||||||
case ID_TEXTUREPATH:
|
case ID_TEXTUREPATH:
|
||||||
break;
|
break;
|
||||||
case ID_EFBTOTEXTUREDISABLE:
|
case ID_EFBTOTEXTUREDISABLE:
|
||||||
g_Config.bEBFToTextureDisable = m_EFBToTextureDisable->IsChecked();
|
g_Config.bEFBToTextureDisable = m_EFBToTextureDisable->IsChecked();
|
||||||
break;
|
break;
|
||||||
case ID_EFBTOTEXTUREDISABLEHOTKEY:
|
case ID_EFBTOTEXTUREDISABLEHOTKEY:
|
||||||
g_Config.bEBFToTextureDisableHotKey = m_EFBToTextureDisableHotKey->IsChecked();
|
g_Config.bEFBToTextureDisableHotKey = m_EFBToTextureDisableHotKey->IsChecked();
|
||||||
break;
|
break;
|
||||||
case ID_PROJECTIONHACK1:
|
case ID_PROJECTIONHACK1:
|
||||||
g_Config.bProjectionHax1 = m_ProjectionHax1->IsChecked();
|
g_Config.bProjectionHax1 = m_ProjectionHax1->IsChecked();
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <wx/textctrl.h>
|
#include <wx/textctrl.h>
|
||||||
#include <wx/button.h>
|
#include <wx/button.h>
|
||||||
#include <wx/stattext.h>
|
#include <wx/stattext.h>
|
||||||
|
#include <wx/choice.h>
|
||||||
#include <wx/combobox.h>
|
#include <wx/combobox.h>
|
||||||
#include <wx/checkbox.h>
|
#include <wx/checkbox.h>
|
||||||
#include <wx/notebook.h>
|
#include <wx/notebook.h>
|
||||||
|
@ -80,7 +81,8 @@ class ConfigDialog : public wxDialog
|
||||||
wxComboBox *m_WindowResolutionCB;
|
wxComboBox *m_WindowResolutionCB;
|
||||||
|
|
||||||
wxCheckBox *m_ForceFiltering; // advanced
|
wxCheckBox *m_ForceFiltering; // advanced
|
||||||
wxCheckBox *m_ForceAnisotropy;
|
wxChoice *m_MaxAnisotropyCB;
|
||||||
|
wxArrayString arrayStringFor_MaxAnisotropyCB;
|
||||||
wxComboBox *m_AliasModeCB;
|
wxComboBox *m_AliasModeCB;
|
||||||
wxCheckBox *m_ShowFPS;
|
wxCheckBox *m_ShowFPS;
|
||||||
wxCheckBox *m_ShaderErrors;
|
wxCheckBox *m_ShaderErrors;
|
||||||
|
@ -118,7 +120,7 @@ class ConfigDialog : public wxDialog
|
||||||
ID_WINDOWRESOLUTIONCB,
|
ID_WINDOWRESOLUTIONCB,
|
||||||
|
|
||||||
ID_FORCEFILTERING,
|
ID_FORCEFILTERING,
|
||||||
ID_FORCEANISOTROPY,
|
ID_MAXANISOTROPY,
|
||||||
ID_AATEXT,
|
ID_AATEXT,
|
||||||
ID_ALIASMODECB,
|
ID_ALIASMODECB,
|
||||||
|
|
||||||
|
|
|
@ -138,11 +138,11 @@ namespace EmuWindow
|
||||||
hypotheticalScene->sendMessage(KEYDOWN...);
|
hypotheticalScene->sendMessage(KEYDOWN...);
|
||||||
*/
|
*/
|
||||||
case 'E': // EFB hotkey
|
case 'E': // EFB hotkey
|
||||||
if(g_Config.bEBFToTextureDisableHotKey)
|
if(g_Config.bEFBToTextureDisableHotKey)
|
||||||
{
|
{
|
||||||
g_Config.bEBFToTextureDisable = !g_Config.bEBFToTextureDisable;
|
g_Config.bEFBToTextureDisable = !g_Config.bEFBToTextureDisable;
|
||||||
Renderer::AddMessage(StringFromFormat("Copy EFB was turned %s",
|
Renderer::AddMessage(StringFromFormat("Copy EFB was turned %s",
|
||||||
g_Config.bEBFToTextureDisable ? "off" : "on").c_str(), 5000);
|
g_Config.bEFBToTextureDisable ? "off" : "on").c_str(), 5000);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -561,6 +561,69 @@ void Renderer::RestoreGLState()
|
||||||
SetColorMask();
|
SetColorMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::SetColorMask()
|
||||||
|
{
|
||||||
|
if (bpmem.blendmode.alphaupdate && bpmem.blendmode.colorupdate)
|
||||||
|
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
|
||||||
|
else if (bpmem.blendmode.alphaupdate)
|
||||||
|
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
|
||||||
|
else if (bpmem.blendmode.colorupdate)
|
||||||
|
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg()
|
||||||
|
// case 0x52 > SetScissorRect()
|
||||||
|
// ---------------
|
||||||
|
// This function handles the OpenGL glScissor() function
|
||||||
|
// ---------------
|
||||||
|
// bpmem.scissorTL.x, y = 342x342
|
||||||
|
// bpmem.scissorBR.x, y = 981x821
|
||||||
|
// Renderer::GetTargetHeight() = the fixed ini file setting
|
||||||
|
// ---------------
|
||||||
|
bool Renderer::SetScissorRect()
|
||||||
|
{
|
||||||
|
int xoff = bpmem.scissorOffset.x * 2 - 342;
|
||||||
|
int yoff = bpmem.scissorOffset.y * 2 - 342;
|
||||||
|
|
||||||
|
float rc_left = bpmem.scissorTL.x - xoff - 342; // left = 0
|
||||||
|
rc_left *= MValueX;
|
||||||
|
if (rc_left < 0) rc_left = 0;
|
||||||
|
|
||||||
|
float rc_top = bpmem.scissorTL.y - yoff - 342; // right = 0
|
||||||
|
rc_top *= MValueY;
|
||||||
|
if (rc_top < 0) rc_top = 0;
|
||||||
|
|
||||||
|
float rc_right = bpmem.scissorBR.x - xoff - 342; // right = 640
|
||||||
|
rc_right *= MValueX;
|
||||||
|
if (rc_right > 640 * MValueX) rc_right = 640 * MValueX;
|
||||||
|
|
||||||
|
float rc_bottom = bpmem.scissorBR.y - yoff - 342; // bottom = 480
|
||||||
|
rc_bottom *= MValueY;
|
||||||
|
if (rc_bottom > 480 * MValueY) rc_bottom = 480 * MValueY;
|
||||||
|
|
||||||
|
/*__Log("Scissor: lt=(%d,%d), rb=(%d,%d,%i), off=(%d,%d)\n",
|
||||||
|
rc_left, rc_top,
|
||||||
|
rc_right, rc_bottom, Renderer::GetTargetHeight(),
|
||||||
|
xoff, yoff
|
||||||
|
);*/
|
||||||
|
|
||||||
|
if (rc_right >= rc_left && rc_bottom >= rc_top )
|
||||||
|
{
|
||||||
|
glScissor(
|
||||||
|
(int)rc_left, // x = 0
|
||||||
|
Renderer::GetTargetHeight()-(int)(rc_bottom), // y = 0
|
||||||
|
(int)(rc_right-rc_left), // y = 0
|
||||||
|
(int)(rc_bottom-rc_top) // y = 0
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Renderer::IsUsingATIDrawBuffers()
|
bool Renderer::IsUsingATIDrawBuffers()
|
||||||
{
|
{
|
||||||
return s_bATIDrawBuffers;
|
return s_bATIDrawBuffers;
|
||||||
|
|
|
@ -68,6 +68,9 @@ public:
|
||||||
static void SetZBufferRender(); // sets rendering of the zbuffer using MRTs
|
static void SetZBufferRender(); // sets rendering of the zbuffer using MRTs
|
||||||
static u32 GetZBufferTarget();
|
static u32 GetZBufferTarget();
|
||||||
|
|
||||||
|
static void SetColorMask();
|
||||||
|
static bool SetScissorRect();
|
||||||
|
|
||||||
static void SetRenderMode(RenderMode mode);
|
static void SetRenderMode(RenderMode mode);
|
||||||
static RenderMode GetRenderMode();
|
static RenderMode GetRenderMode();
|
||||||
|
|
||||||
|
|
|
@ -148,10 +148,10 @@ void EncodeToRam(GLuint srcTexture, const TRectangle& sourceRc,
|
||||||
glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, s_rgbToYuyvProgram.glprogid);
|
glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, s_rgbToYuyvProgram.glprogid);
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glTexCoord2f(sourceRc.left, sourceRc.top); glVertex2f(-1,-1);
|
glTexCoord2f((float)sourceRc.left, (float)sourceRc.top); glVertex2f(-1,-1);
|
||||||
glTexCoord2f(sourceRc.left, sourceRc.bottom); glVertex2f(-1,1);
|
glTexCoord2f((float)sourceRc.left, (float)sourceRc.bottom); glVertex2f(-1,1);
|
||||||
glTexCoord2f(sourceRc.right, sourceRc.bottom); glVertex2f(1,1);
|
glTexCoord2f((float)sourceRc.right, (float)sourceRc.bottom); glVertex2f(1,1);
|
||||||
glTexCoord2f(sourceRc.right, sourceRc.top); glVertex2f(1,-1);
|
glTexCoord2f((float)sourceRc.right, (float)sourceRc.top); glVertex2f(1,-1);
|
||||||
glEnd();
|
glEnd();
|
||||||
GL_REPORT_ERRORD();
|
GL_REPORT_ERRORD();
|
||||||
|
|
||||||
|
|
|
@ -100,9 +100,9 @@ void TextureMngr::TCacheEntry::SetTextureParameters(TexMode0 &newmode)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, c_WrapSettings[newmode.wrap_t]);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, c_WrapSettings[newmode.wrap_t]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_Config.bForceMaxAniso)
|
if (g_Config.iMaxAnisotropy >= 1)
|
||||||
{
|
{
|
||||||
// not used for now, check out GL_EXT_texture_filter_anisotropic
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1 << g_Config.iMaxAnisotropy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,25 +27,28 @@
|
||||||
#include "x64Emitter.h"
|
#include "x64Emitter.h"
|
||||||
#include "ABI.h"
|
#include "ABI.h"
|
||||||
|
|
||||||
|
#include "LookUpTables.h"
|
||||||
#include "Statistics.h"
|
#include "Statistics.h"
|
||||||
#include "VertexManager.h"
|
#include "VertexManager.h"
|
||||||
#include "VertexLoaderManager.h"
|
#include "VertexLoaderManager.h"
|
||||||
|
#include "VertexShaderManager.h"
|
||||||
|
#include "VertexManager.h"
|
||||||
#include "VertexLoader.h"
|
#include "VertexLoader.h"
|
||||||
#include "BPStructs.h"
|
#include "BPStructs.h"
|
||||||
#include "DataReader.h"
|
#include "DataReader.h"
|
||||||
|
|
||||||
|
#include "VertexLoader_Position.h"
|
||||||
|
#include "VertexLoader_Normal.h"
|
||||||
|
#include "VertexLoader_Color.h"
|
||||||
|
#include "VertexLoader_TextCoord.h"
|
||||||
|
|
||||||
#define USE_JIT
|
#define USE_JIT
|
||||||
|
|
||||||
|
#define COMPILED_CODE_SIZE 4096*4
|
||||||
|
|
||||||
NativeVertexFormat *g_nativeVertexFmt;
|
NativeVertexFormat *g_nativeVertexFmt;
|
||||||
|
|
||||||
|
|
||||||
//these don't need to be saved
|
//these don't need to be saved
|
||||||
static float posScale;
|
|
||||||
static int colElements[2];
|
|
||||||
static float tcScaleU[8];
|
|
||||||
static float tcScaleV[8];
|
|
||||||
static int tcIndex;
|
|
||||||
static int colIndex;
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#undef inline
|
#undef inline
|
||||||
#define inline
|
#define inline
|
||||||
|
@ -57,9 +60,16 @@ static u8 s_curposmtx;
|
||||||
static u8 s_curtexmtx[8];
|
static u8 s_curtexmtx[8];
|
||||||
static int s_texmtxwrite = 0;
|
static int s_texmtxwrite = 0;
|
||||||
static int s_texmtxread = 0;
|
static int s_texmtxread = 0;
|
||||||
static TVtxAttr* pVtxAttr;
|
|
||||||
static int loop_counter;
|
static int loop_counter;
|
||||||
|
|
||||||
|
// Vertex loaders read these. Although the scale ones should be baked into the shader.
|
||||||
|
int tcIndex;
|
||||||
|
int colIndex;
|
||||||
|
TVtxAttr* pVtxAttr;
|
||||||
|
int colElements[2];
|
||||||
|
float posScale;
|
||||||
|
float tcScale[8];
|
||||||
|
|
||||||
using namespace Gen;
|
using namespace Gen;
|
||||||
|
|
||||||
void LOADERDECL PosMtx_ReadDirect_UByte()
|
void LOADERDECL PosMtx_ReadDirect_UByte()
|
||||||
|
@ -104,13 +114,6 @@ void LOADERDECL TexMtx_Write_Short3()
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "VertexLoader_Position.h"
|
|
||||||
#include "VertexLoader_Normal.h"
|
|
||||||
#include "VertexLoader_Color.h"
|
|
||||||
#include "VertexLoader_TextCoord.h"
|
|
||||||
|
|
||||||
#define COMPILED_CODE_SIZE 4096*4
|
|
||||||
|
|
||||||
VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr)
|
VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr)
|
||||||
{
|
{
|
||||||
m_numLoadedVertices = 0;
|
m_numLoadedVertices = 0;
|
||||||
|
@ -628,10 +631,8 @@ void VertexLoader::RunVertices(int vtx_attr_group, int primitive, int count)
|
||||||
pVtxAttr = &m_VtxAttr;
|
pVtxAttr = &m_VtxAttr;
|
||||||
posScale = shiftLookup[m_VtxAttr.PosFrac];
|
posScale = shiftLookup[m_VtxAttr.PosFrac];
|
||||||
if (m_NativeFmt->m_components & VB_HAS_UVALL) {
|
if (m_NativeFmt->m_components & VB_HAS_UVALL) {
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++)
|
||||||
tcScaleU[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac];
|
tcScale[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac];
|
||||||
tcScaleV[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
colElements[i] = m_VtxAttr.color[i].Elements;
|
colElements[i] = m_VtxAttr.color[i].Elements;
|
||||||
|
|
|
@ -0,0 +1,231 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
#ifndef _VERTEXLOADERCOLOR_H
|
||||||
|
#define _VERTEXLOADERCOLOR_H
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "LookUpTables.h"
|
||||||
|
#include "VertexLoader.h"
|
||||||
|
#include "VertexManager.h"
|
||||||
|
#include "VertexLoader_Color.h"
|
||||||
|
|
||||||
|
#define RSHIFT 0
|
||||||
|
#define GSHIFT 8
|
||||||
|
#define BSHIFT 16
|
||||||
|
#define ASHIFT 24
|
||||||
|
|
||||||
|
extern int colIndex;
|
||||||
|
extern int colElements[2];
|
||||||
|
|
||||||
|
inline void _SetCol(u32 val)
|
||||||
|
{
|
||||||
|
*(u32*)VertexManager::s_pCurBufferPointer = val;
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
colIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _SetCol4444(u16 val)
|
||||||
|
{
|
||||||
|
u32 col = lut4to8[(val>>0)&0xF]<<ASHIFT;
|
||||||
|
col |= lut4to8[(val>>12)&0xF] <<RSHIFT;
|
||||||
|
col |= lut4to8[(val>>8)&0xF] <<GSHIFT;
|
||||||
|
col |= lut4to8[(val>>4)&0xF] <<BSHIFT;
|
||||||
|
_SetCol(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _SetCol6666(u32 val)
|
||||||
|
{
|
||||||
|
u32 col = lut6to8[(val>>18)&0x3F] << RSHIFT;
|
||||||
|
col |= lut6to8[(val>>12)&0x3F] << GSHIFT;
|
||||||
|
col |= lut6to8[(val>>6)&0x3F] << BSHIFT;
|
||||||
|
col |= lut6to8[(val>>0)&0x3F] << ASHIFT;
|
||||||
|
_SetCol(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _SetCol565(u16 val)
|
||||||
|
{
|
||||||
|
u32 col = lut5to8[(val>>11)&0x1f] << RSHIFT;
|
||||||
|
col |= lut6to8[(val>>5 )&0x3f] << GSHIFT;
|
||||||
|
col |= lut5to8[(val )&0x1f] << BSHIFT;
|
||||||
|
_SetCol(col | (0xFF<<ASHIFT));
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
inline u32 _Read24(u32 iAddress)
|
||||||
|
{
|
||||||
|
u32 col = Memory_Read_U8(iAddress) << RSHIFT; //should just get a pointer to main memory instead of going thru slow memhandler
|
||||||
|
col |= Memory_Read_U8(iAddress+1) << GSHIFT; //we can guarantee that it is reading from main memory
|
||||||
|
col |= Memory_Read_U8(iAddress+2) << BSHIFT;
|
||||||
|
return col | (0xFF<<ASHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline u32 _Read32(u32 iAddress)
|
||||||
|
{
|
||||||
|
u32 col = Memory_Read_U8(iAddress) << RSHIFT; //should just get a pointer to main memory instead of going thru slow memhandler
|
||||||
|
col |= Memory_Read_U8(iAddress+1) << GSHIFT; //we can guarantee that it is reading from main memory
|
||||||
|
col |= Memory_Read_U8(iAddress+2) << BSHIFT;
|
||||||
|
col |= Memory_Read_U8(iAddress+3) << ASHIFT;
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void LOADERDECL Color_ReadDirect_24b_888()
|
||||||
|
{
|
||||||
|
u32 col = DataReadU8()<<RSHIFT;
|
||||||
|
col |= DataReadU8()<<GSHIFT;
|
||||||
|
col |= DataReadU8()<<BSHIFT;
|
||||||
|
_SetCol(col | (0xFF<<ASHIFT));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Color_ReadDirect_32b_888x(){
|
||||||
|
u32 col = DataReadU8()<<RSHIFT;
|
||||||
|
col |= DataReadU8()<<GSHIFT;
|
||||||
|
col |= DataReadU8()<<BSHIFT;
|
||||||
|
_SetCol(col | (0xFF<<ASHIFT));
|
||||||
|
DataReadU8();
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadDirect_16b_565()
|
||||||
|
{
|
||||||
|
_SetCol565(DataReadU16());
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadDirect_16b_4444()
|
||||||
|
{
|
||||||
|
_SetCol4444(DataReadU16());
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadDirect_24b_6666()
|
||||||
|
{
|
||||||
|
u32 val = DataReadU8()<<16;
|
||||||
|
val|=DataReadU8()<<8;
|
||||||
|
val|=DataReadU8();
|
||||||
|
_SetCol6666(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// F|RES: i am not 100 percent show, but the colElements seems to be important for rendering only
|
||||||
|
// at least it fixes mario party 4
|
||||||
|
//
|
||||||
|
// if (colElements[colIndex])
|
||||||
|
// else
|
||||||
|
// col |= 0xFF<<ASHIFT;
|
||||||
|
//
|
||||||
|
void LOADERDECL Color_ReadDirect_32b_8888()
|
||||||
|
{
|
||||||
|
// TODO (mb2): check this
|
||||||
|
u32 col = DataReadU8()<<RSHIFT;
|
||||||
|
col |= DataReadU8()<<GSHIFT;
|
||||||
|
col |= DataReadU8()<<BSHIFT;
|
||||||
|
col |= DataReadU8()<<ASHIFT;
|
||||||
|
|
||||||
|
// "kill" the alpha
|
||||||
|
if (!colElements[colIndex])
|
||||||
|
col |= 0xFF<<ASHIFT;
|
||||||
|
|
||||||
|
_SetCol(col);
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void LOADERDECL Color_ReadIndex8_16b_565()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
u16 val = Memory_Read_U16(iAddress);
|
||||||
|
_SetCol565(val);
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex8_24b_888()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
_SetCol(_Read24(iAddress));
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex8_32b_888x()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR]+colIndex);
|
||||||
|
_SetCol(_Read24(iAddress));
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex8_16b_4444()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
u16 val = Memory_Read_U16(iAddress);
|
||||||
|
_SetCol4444(val);
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex8_24b_6666()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
u32 val = Memory_Read_U8(iAddress+2) |
|
||||||
|
(Memory_Read_U8(iAddress+1)<<8) |
|
||||||
|
(Memory_Read_U8(iAddress)<<16);
|
||||||
|
|
||||||
|
_SetCol6666(val);
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex8_32b_8888()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
_SetCol(_Read32(iAddress));
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void LOADERDECL Color_ReadIndex16_16b_565()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
u16 val = Memory_Read_U16(iAddress);
|
||||||
|
_SetCol565(val);
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex16_24b_888()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
_SetCol(_Read24(iAddress));
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex16_32b_888x()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
_SetCol(_Read24(iAddress));
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex16_16b_4444()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
u16 val = Memory_Read_U16(iAddress);
|
||||||
|
_SetCol4444(val);
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex16_24b_6666()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
u32 val = Memory_Read_U8(iAddress+2) |
|
||||||
|
(Memory_Read_U8(iAddress+1)<<8) |
|
||||||
|
(Memory_Read_U8(iAddress)<<16);
|
||||||
|
_SetCol6666(val);
|
||||||
|
}
|
||||||
|
void LOADERDECL Color_ReadIndex16_32b_8888()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
||||||
|
_SetCol(_Read32(iAddress));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,209 +18,25 @@
|
||||||
#ifndef _VERTEXLOADERCOLOR_H
|
#ifndef _VERTEXLOADERCOLOR_H
|
||||||
#define _VERTEXLOADERCOLOR_H
|
#define _VERTEXLOADERCOLOR_H
|
||||||
|
|
||||||
#include "LookUpTables.h"
|
void LOADERDECL Color_ReadDirect_24b_888();
|
||||||
|
void LOADERDECL Color_ReadDirect_32b_888x();
|
||||||
|
void LOADERDECL Color_ReadDirect_16b_565();
|
||||||
|
void LOADERDECL Color_ReadDirect_16b_4444();
|
||||||
|
void LOADERDECL Color_ReadDirect_24b_6666();
|
||||||
|
void LOADERDECL Color_ReadDirect_32b_8888();
|
||||||
|
|
||||||
#define RSHIFT 0
|
void LOADERDECL Color_ReadIndex8_16b_565();
|
||||||
#define GSHIFT 8
|
void LOADERDECL Color_ReadIndex8_24b_888();
|
||||||
#define BSHIFT 16
|
void LOADERDECL Color_ReadIndex8_32b_888x();
|
||||||
#define ASHIFT 24
|
void LOADERDECL Color_ReadIndex8_16b_4444();
|
||||||
|
void LOADERDECL Color_ReadIndex8_24b_6666();
|
||||||
|
void LOADERDECL Color_ReadIndex8_32b_8888();
|
||||||
|
|
||||||
extern int colIndex;
|
void LOADERDECL Color_ReadIndex16_16b_565();
|
||||||
|
void LOADERDECL Color_ReadIndex16_24b_888();
|
||||||
inline void _SetCol(u32 val)
|
void LOADERDECL Color_ReadIndex16_32b_888x();
|
||||||
{
|
void LOADERDECL Color_ReadIndex16_16b_4444();
|
||||||
*(u32*)VertexManager::s_pCurBufferPointer = val;
|
void LOADERDECL Color_ReadIndex16_24b_6666();
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
void LOADERDECL Color_ReadIndex16_32b_8888();
|
||||||
colIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _SetCol4444(u16 val)
|
|
||||||
{
|
|
||||||
u32 col = lut4to8[(val>>0)&0xF]<<ASHIFT;
|
|
||||||
col |= lut4to8[(val>>12)&0xF] <<RSHIFT;
|
|
||||||
col |= lut4to8[(val>>8)&0xF] <<GSHIFT;
|
|
||||||
col |= lut4to8[(val>>4)&0xF] <<BSHIFT;
|
|
||||||
_SetCol(col);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _SetCol6666(u32 val)
|
|
||||||
{
|
|
||||||
u32 col = lut6to8[(val>>18)&0x3F] << RSHIFT;
|
|
||||||
col |= lut6to8[(val>>12)&0x3F] << GSHIFT;
|
|
||||||
col |= lut6to8[(val>>6)&0x3F] << BSHIFT;
|
|
||||||
col |= lut6to8[(val>>0)&0x3F] << ASHIFT;
|
|
||||||
_SetCol(col);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _SetCol565(u16 val)
|
|
||||||
{
|
|
||||||
u32 col = lut5to8[(val>>11)&0x1f] << RSHIFT;
|
|
||||||
col |= lut6to8[(val>>5 )&0x3f] << GSHIFT;
|
|
||||||
col |= lut5to8[(val )&0x1f] << BSHIFT;
|
|
||||||
_SetCol(col | (0xFF<<ASHIFT));
|
|
||||||
}
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
inline u32 _Read24(u32 iAddress)
|
|
||||||
{
|
|
||||||
u32 col = Memory_Read_U8(iAddress) << RSHIFT; //should just get a pointer to main memory instead of going thru slow memhandler
|
|
||||||
col |= Memory_Read_U8(iAddress+1) << GSHIFT; //we can guarantee that it is reading from main memory
|
|
||||||
col |= Memory_Read_U8(iAddress+2) << BSHIFT;
|
|
||||||
return col | (0xFF<<ASHIFT);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline u32 _Read32(u32 iAddress)
|
|
||||||
{
|
|
||||||
u32 col = Memory_Read_U8(iAddress) << RSHIFT; //should just get a pointer to main memory instead of going thru slow memhandler
|
|
||||||
col |= Memory_Read_U8(iAddress+1) << GSHIFT; //we can guarantee that it is reading from main memory
|
|
||||||
col |= Memory_Read_U8(iAddress+2) << BSHIFT;
|
|
||||||
col |= Memory_Read_U8(iAddress+3) << ASHIFT;
|
|
||||||
return col;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void LOADERDECL Color_ReadDirect_24b_888()
|
|
||||||
{
|
|
||||||
u32 col = DataReadU8()<<RSHIFT;
|
|
||||||
col |= DataReadU8()<<GSHIFT;
|
|
||||||
col |= DataReadU8()<<BSHIFT;
|
|
||||||
_SetCol(col | (0xFF<<ASHIFT));
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Color_ReadDirect_32b_888x(){
|
|
||||||
u32 col = DataReadU8()<<RSHIFT;
|
|
||||||
col |= DataReadU8()<<GSHIFT;
|
|
||||||
col |= DataReadU8()<<BSHIFT;
|
|
||||||
_SetCol(col | (0xFF<<ASHIFT));
|
|
||||||
DataReadU8();
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadDirect_16b_565()
|
|
||||||
{
|
|
||||||
_SetCol565(DataReadU16());
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadDirect_16b_4444()
|
|
||||||
{
|
|
||||||
_SetCol4444(DataReadU16());
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadDirect_24b_6666()
|
|
||||||
{
|
|
||||||
u32 val = DataReadU8()<<16;
|
|
||||||
val|=DataReadU8()<<8;
|
|
||||||
val|=DataReadU8();
|
|
||||||
_SetCol6666(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
// F|RES: i am not 100 percent show, but the colElements seems to be important for rendering only
|
|
||||||
// at least it fixes mario party 4
|
|
||||||
//
|
|
||||||
// if (colElements[colIndex])
|
|
||||||
// else
|
|
||||||
// col |= 0xFF<<ASHIFT;
|
|
||||||
//
|
|
||||||
void LOADERDECL Color_ReadDirect_32b_8888()
|
|
||||||
{
|
|
||||||
// TODO (mb2): check this
|
|
||||||
u32 col = DataReadU8()<<RSHIFT;
|
|
||||||
col |= DataReadU8()<<GSHIFT;
|
|
||||||
col |= DataReadU8()<<BSHIFT;
|
|
||||||
col |= DataReadU8()<<ASHIFT;
|
|
||||||
|
|
||||||
// "kill" the alpha
|
|
||||||
if (!colElements[colIndex])
|
|
||||||
col |= 0xFF<<ASHIFT;
|
|
||||||
|
|
||||||
_SetCol(col);
|
|
||||||
}
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
void LOADERDECL Color_ReadIndex8_16b_565()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
u16 val = Memory_Read_U16(iAddress);
|
|
||||||
_SetCol565(val);
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex8_24b_888()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
_SetCol(_Read24(iAddress));
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex8_32b_888x()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR]+colIndex);
|
|
||||||
_SetCol(_Read24(iAddress));
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex8_16b_4444()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
u16 val = Memory_Read_U16(iAddress);
|
|
||||||
_SetCol4444(val);
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex8_24b_6666()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
u32 val = Memory_Read_U8(iAddress+2) |
|
|
||||||
(Memory_Read_U8(iAddress+1)<<8) |
|
|
||||||
(Memory_Read_U8(iAddress)<<16);
|
|
||||||
|
|
||||||
_SetCol6666(val);
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex8_32b_8888()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
_SetCol(_Read32(iAddress));
|
|
||||||
}
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
void LOADERDECL Color_ReadIndex16_16b_565()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
u16 val = Memory_Read_U16(iAddress);
|
|
||||||
_SetCol565(val);
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex16_24b_888()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
_SetCol(_Read24(iAddress));
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex16_32b_888x()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
_SetCol(_Read24(iAddress));
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex16_16b_4444()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
u16 val = Memory_Read_U16(iAddress);
|
|
||||||
_SetCol4444(val);
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex16_24b_6666()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
u32 val = Memory_Read_U8(iAddress+2) |
|
|
||||||
(Memory_Read_U8(iAddress+1)<<8) |
|
|
||||||
(Memory_Read_U8(iAddress)<<16);
|
|
||||||
_SetCol6666(val);
|
|
||||||
}
|
|
||||||
void LOADERDECL Color_ReadIndex16_32b_8888()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_COLOR+colIndex] + (Index * arraystrides[ARRAY_COLOR+colIndex]);
|
|
||||||
_SetCol(_Read32(iAddress));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,241 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
#ifndef VERTEXLOADER_POSITION_H
|
||||||
|
#define VERTEXLOADER_POSITION_H
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "VertexLoader.h"
|
||||||
|
#include "VertexManager.h"
|
||||||
|
#include "VertexLoader_Position.h"
|
||||||
|
|
||||||
|
extern float posScale;
|
||||||
|
extern TVtxAttr *pVtxAttr;
|
||||||
|
|
||||||
|
#define LOG_VTX() PRIM_LOG("vtx: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1], ((float*)VertexManager::s_pCurBufferPointer)[2]);
|
||||||
|
|
||||||
|
// Thoughts on the implementation of a vertex loader compiler.
|
||||||
|
// s_pCurBufferPointer should definitely be in a register.
|
||||||
|
// Could load the position scale factor in XMM7, for example.
|
||||||
|
|
||||||
|
// The pointer inside DataReadU8 in another.
|
||||||
|
// Let's check out Pos_ReadDirect_UByte(). For Byte, replace MOVZX with MOVSX.
|
||||||
|
|
||||||
|
/*
|
||||||
|
MOVZX(32, R(EAX), MOffset(ESI, 0));
|
||||||
|
MOVZX(32, R(EBX), MOffset(ESI, 1));
|
||||||
|
MOVZX(32, R(ECX), MOffset(ESI, 2));
|
||||||
|
MOVD(XMM0, R(EAX));
|
||||||
|
MOVD(XMM1, R(EBX));
|
||||||
|
MOVD(XMM2, R(ECX));
|
||||||
|
CVTDQ2PS(XMM0, XMM0);
|
||||||
|
CVTDQ2PS(XMM1, XMM1);
|
||||||
|
CVTDQ2PS(XMM2, XMM2);
|
||||||
|
MULSS(XMM0, XMM7);
|
||||||
|
MULSS(XMM1, XMM7);
|
||||||
|
MULSS(XMM2, XMM7);
|
||||||
|
MOVSS(MOffset(EDI, 0), XMM0);
|
||||||
|
MOVSS(MOffset(EDI, 4), XMM1);
|
||||||
|
MOVSS(MOffset(EDI, 8), XMM2);
|
||||||
|
|
||||||
|
Alternatively, lookup table:
|
||||||
|
MOVZX(32, R(EAX), MOffset(ESI, 0));
|
||||||
|
MOVZX(32, R(EBX), MOffset(ESI, 1));
|
||||||
|
MOVZX(32, R(ECX), MOffset(ESI, 2));
|
||||||
|
MOV(32, R(EAX), MComplex(LUTREG, EAX, 4));
|
||||||
|
MOV(32, R(EBX), MComplex(LUTREG, EBX, 4));
|
||||||
|
MOV(32, R(ECX), MComplex(LUTREG, ECX, 4));
|
||||||
|
MOV(MOffset(EDI, 0), XMM0);
|
||||||
|
MOV(MOffset(EDI, 4), XMM1);
|
||||||
|
MOV(MOffset(EDI, 8), XMM2);
|
||||||
|
|
||||||
|
SSE4:
|
||||||
|
PINSRB(XMM0, MOffset(ESI, 0), 0);
|
||||||
|
PINSRB(XMM0, MOffset(ESI, 1), 4);
|
||||||
|
PINSRB(XMM0, MOffset(ESI, 2), 8);
|
||||||
|
CVTDQ2PS(XMM0, XMM0);
|
||||||
|
<two unpacks here to sign extend>
|
||||||
|
MULPS(XMM0, XMM7);
|
||||||
|
MOVUPS(MOffset(EDI, 0), XMM0);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ==============================================================================
|
||||||
|
// Direct
|
||||||
|
// ==============================================================================
|
||||||
|
void LOADERDECL Pos_ReadDirect_UByte()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * posScale;
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * posScale;
|
||||||
|
if (pVtxAttr->PosElements)
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU8() * posScale;
|
||||||
|
else
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
||||||
|
LOG_VTX();
|
||||||
|
VertexManager::s_pCurBufferPointer += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadDirect_Byte()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * posScale;
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * posScale;
|
||||||
|
if (pVtxAttr->PosElements)
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s8)DataReadU8() * posScale;
|
||||||
|
else
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0;
|
||||||
|
LOG_VTX();
|
||||||
|
VertexManager::s_pCurBufferPointer += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadDirect_UShort()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * posScale;
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * posScale;
|
||||||
|
if (pVtxAttr->PosElements)
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU16() * posScale;
|
||||||
|
else
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
||||||
|
LOG_VTX();
|
||||||
|
VertexManager::s_pCurBufferPointer += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadDirect_Short()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * posScale;
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * posScale;
|
||||||
|
if (pVtxAttr->PosElements)
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s16)DataReadU16() * posScale;
|
||||||
|
else
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
||||||
|
LOG_VTX();
|
||||||
|
VertexManager::s_pCurBufferPointer += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadDirect_Float()
|
||||||
|
{
|
||||||
|
// No need to use floating point here.
|
||||||
|
((u32 *)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
|
||||||
|
((u32 *)VertexManager::s_pCurBufferPointer)[1] = DataReadU32();
|
||||||
|
if (pVtxAttr->PosElements)
|
||||||
|
((u32 *)VertexManager::s_pCurBufferPointer)[2] = DataReadU32();
|
||||||
|
else
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
||||||
|
LOG_VTX();
|
||||||
|
VertexManager::s_pCurBufferPointer += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define Pos_ReadIndex_Byte(T) { \
|
||||||
|
u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U8(iAddress)) * posScale; \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U8(iAddress+1)) * posScale; \
|
||||||
|
if (pVtxAttr->PosElements) \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U8(iAddress+2)) * posScale; \
|
||||||
|
else \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \
|
||||||
|
LOG_VTX(); \
|
||||||
|
VertexManager::s_pCurBufferPointer += 12; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define Pos_ReadIndex_Short(T) { \
|
||||||
|
u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U16(iAddress)) * posScale; \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U16(iAddress+2)) * posScale; \
|
||||||
|
if (pVtxAttr->PosElements) \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U16(iAddress+4)) * posScale; \
|
||||||
|
else \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \
|
||||||
|
LOG_VTX(); \
|
||||||
|
VertexManager::s_pCurBufferPointer += 12; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define Pos_ReadIndex_Float() { \
|
||||||
|
u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); \
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); \
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); \
|
||||||
|
if (pVtxAttr->PosElements) \
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[2] = Memory_Read_U32(iAddress+8); \
|
||||||
|
else \
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \
|
||||||
|
LOG_VTX(); \
|
||||||
|
VertexManager::s_pCurBufferPointer += 12; \
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==============================================================================
|
||||||
|
// Index 8
|
||||||
|
// ==============================================================================
|
||||||
|
void LOADERDECL Pos_ReadIndex8_UByte()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
Pos_ReadIndex_Byte(u8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex8_Byte()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
Pos_ReadIndex_Byte(s8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex8_UShort()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
Pos_ReadIndex_Short(u16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex8_Short()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
Pos_ReadIndex_Short(s16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex8_Float()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
Pos_ReadIndex_Float();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==============================================================================
|
||||||
|
// Index 16
|
||||||
|
// ==============================================================================
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex16_UByte(){
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
Pos_ReadIndex_Byte(u8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex16_Byte(){
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
Pos_ReadIndex_Byte(s8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex16_UShort(){
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
Pos_ReadIndex_Short(u16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex16_Short()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
Pos_ReadIndex_Short(s16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL Pos_ReadIndex16_Float()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
Pos_ReadIndex_Float();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,216 +18,22 @@
|
||||||
#ifndef VERTEXLOADER_POSITION_H
|
#ifndef VERTEXLOADER_POSITION_H
|
||||||
#define VERTEXLOADER_POSITION_H
|
#define VERTEXLOADER_POSITION_H
|
||||||
|
|
||||||
#define LOG_VTX() PRIM_LOG("vtx: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1], ((float*)VertexManager::s_pCurBufferPointer)[2]);
|
void LOADERDECL Pos_ReadDirect_UByte();
|
||||||
|
void LOADERDECL Pos_ReadDirect_Byte();
|
||||||
|
void LOADERDECL Pos_ReadDirect_UShort();
|
||||||
|
void LOADERDECL Pos_ReadDirect_Short();
|
||||||
|
void LOADERDECL Pos_ReadDirect_Float();
|
||||||
|
|
||||||
// Thoughts on the implementation of a vertex loader compiler.
|
void LOADERDECL Pos_ReadIndex8_UByte();
|
||||||
// s_pCurBufferPointer should definitely be in a register.
|
void LOADERDECL Pos_ReadIndex8_Byte();
|
||||||
// Could load the position scale factor in XMM7, for example.
|
void LOADERDECL Pos_ReadIndex8_UShort();
|
||||||
|
void LOADERDECL Pos_ReadIndex8_Short();
|
||||||
|
void LOADERDECL Pos_ReadIndex8_Float();
|
||||||
|
|
||||||
// The pointer inside DataReadU8 in another.
|
void LOADERDECL Pos_ReadIndex16_UByte();
|
||||||
// Let's check out Pos_ReadDirect_UByte(). For Byte, replace MOVZX with MOVSX.
|
void LOADERDECL Pos_ReadIndex16_Byte();
|
||||||
|
void LOADERDECL Pos_ReadIndex16_UShort();
|
||||||
/*
|
void LOADERDECL Pos_ReadIndex16_Short();
|
||||||
MOVZX(32, R(EAX), MOffset(ESI, 0));
|
void LOADERDECL Pos_ReadIndex16_Float();
|
||||||
MOVZX(32, R(EBX), MOffset(ESI, 1));
|
|
||||||
MOVZX(32, R(ECX), MOffset(ESI, 2));
|
|
||||||
MOVD(XMM0, R(EAX));
|
|
||||||
MOVD(XMM1, R(EBX));
|
|
||||||
MOVD(XMM2, R(ECX));
|
|
||||||
CVTDQ2PS(XMM0, XMM0);
|
|
||||||
CVTDQ2PS(XMM1, XMM1);
|
|
||||||
CVTDQ2PS(XMM2, XMM2);
|
|
||||||
MULSS(XMM0, XMM7);
|
|
||||||
MULSS(XMM1, XMM7);
|
|
||||||
MULSS(XMM2, XMM7);
|
|
||||||
MOVSS(MOffset(EDI, 0), XMM0);
|
|
||||||
MOVSS(MOffset(EDI, 4), XMM1);
|
|
||||||
MOVSS(MOffset(EDI, 8), XMM2);
|
|
||||||
|
|
||||||
Alternatively, lookup table:
|
|
||||||
MOVZX(32, R(EAX), MOffset(ESI, 0));
|
|
||||||
MOVZX(32, R(EBX), MOffset(ESI, 1));
|
|
||||||
MOVZX(32, R(ECX), MOffset(ESI, 2));
|
|
||||||
MOV(32, R(EAX), MComplex(LUTREG, EAX, 4));
|
|
||||||
MOV(32, R(EBX), MComplex(LUTREG, EBX, 4));
|
|
||||||
MOV(32, R(ECX), MComplex(LUTREG, ECX, 4));
|
|
||||||
MOV(MOffset(EDI, 0), XMM0);
|
|
||||||
MOV(MOffset(EDI, 4), XMM1);
|
|
||||||
MOV(MOffset(EDI, 8), XMM2);
|
|
||||||
|
|
||||||
SSE4:
|
|
||||||
PINSRB(XMM0, MOffset(ESI, 0), 0);
|
|
||||||
PINSRB(XMM0, MOffset(ESI, 1), 4);
|
|
||||||
PINSRB(XMM0, MOffset(ESI, 2), 8);
|
|
||||||
CVTDQ2PS(XMM0, XMM0);
|
|
||||||
<two unpacks here to sign extend>
|
|
||||||
MULPS(XMM0, XMM7);
|
|
||||||
MOVUPS(MOffset(EDI, 0), XMM0);
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
// ==============================================================================
|
|
||||||
// Direct
|
|
||||||
// ==============================================================================
|
|
||||||
void LOADERDECL Pos_ReadDirect_UByte()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * posScale;
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * posScale;
|
|
||||||
if (pVtxAttr->PosElements)
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU8() * posScale;
|
|
||||||
else
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
|
||||||
LOG_VTX();
|
|
||||||
VertexManager::s_pCurBufferPointer += 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadDirect_Byte()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * posScale;
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * posScale;
|
|
||||||
if (pVtxAttr->PosElements)
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s8)DataReadU8() * posScale;
|
|
||||||
else
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0;
|
|
||||||
LOG_VTX();
|
|
||||||
VertexManager::s_pCurBufferPointer += 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadDirect_UShort()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * posScale;
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * posScale;
|
|
||||||
if (pVtxAttr->PosElements)
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU16() * posScale;
|
|
||||||
else
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
|
||||||
LOG_VTX();
|
|
||||||
VertexManager::s_pCurBufferPointer += 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadDirect_Short()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * posScale;
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * posScale;
|
|
||||||
if (pVtxAttr->PosElements)
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s16)DataReadU16() * posScale;
|
|
||||||
else
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
|
||||||
LOG_VTX();
|
|
||||||
VertexManager::s_pCurBufferPointer += 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadDirect_Float()
|
|
||||||
{
|
|
||||||
// No need to use floating point here.
|
|
||||||
((u32 *)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
|
|
||||||
((u32 *)VertexManager::s_pCurBufferPointer)[1] = DataReadU32();
|
|
||||||
if (pVtxAttr->PosElements)
|
|
||||||
((u32 *)VertexManager::s_pCurBufferPointer)[2] = DataReadU32();
|
|
||||||
else
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f;
|
|
||||||
LOG_VTX();
|
|
||||||
VertexManager::s_pCurBufferPointer += 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define Pos_ReadIndex_Byte(T) { \
|
|
||||||
u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U8(iAddress)) * posScale; \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U8(iAddress+1)) * posScale; \
|
|
||||||
if (pVtxAttr->PosElements) \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U8(iAddress+2)) * posScale; \
|
|
||||||
else \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \
|
|
||||||
LOG_VTX(); \
|
|
||||||
VertexManager::s_pCurBufferPointer += 12; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define Pos_ReadIndex_Short(T) { \
|
|
||||||
u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U16(iAddress)) * posScale; \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U16(iAddress+2)) * posScale; \
|
|
||||||
if (pVtxAttr->PosElements) \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U16(iAddress+4)) * posScale; \
|
|
||||||
else \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \
|
|
||||||
LOG_VTX(); \
|
|
||||||
VertexManager::s_pCurBufferPointer += 12; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define Pos_ReadIndex_Float() { \
|
|
||||||
u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); \
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); \
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); \
|
|
||||||
if (pVtxAttr->PosElements) \
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[2] = Memory_Read_U32(iAddress+8); \
|
|
||||||
else \
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \
|
|
||||||
LOG_VTX(); \
|
|
||||||
VertexManager::s_pCurBufferPointer += 12; \
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============================================================================
|
|
||||||
// Index 8
|
|
||||||
// ==============================================================================
|
|
||||||
void LOADERDECL Pos_ReadIndex8_UByte()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
Pos_ReadIndex_Byte(u8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex8_Byte()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
Pos_ReadIndex_Byte(s8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex8_UShort()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
Pos_ReadIndex_Short(u16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex8_Short()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
Pos_ReadIndex_Short(s16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex8_Float()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
Pos_ReadIndex_Float();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============================================================================
|
|
||||||
// Index 16
|
|
||||||
// ==============================================================================
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex16_UByte(){
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
Pos_ReadIndex_Byte(u8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex16_Byte(){
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
Pos_ReadIndex_Byte(s8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex16_UShort(){
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
Pos_ReadIndex_Short(u16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex16_Short()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
Pos_ReadIndex_Short(s16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL Pos_ReadIndex16_Float()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
Pos_ReadIndex_Float();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,337 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
#ifndef VERTEXLOADER_TEXCOORD_H
|
||||||
|
#define VERTEXLOADER_TEXCOORD_H
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "VertexLoader.h"
|
||||||
|
#include "VertexManager.h"
|
||||||
|
#include "VertexLoader_Position.h"
|
||||||
|
|
||||||
|
#define LOG_TEX1() PRIM_LOG("tex: %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0]);
|
||||||
|
#define LOG_TEX2() PRIM_LOG("tex: %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1]);
|
||||||
|
|
||||||
|
extern int tcIndex;
|
||||||
|
extern float tcScale[8];
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_Read_Dummy()
|
||||||
|
{
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_UByte1()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_UByte2()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Byte1()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Byte2()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_UShort1()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_UShort2()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Short1()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Short2()
|
||||||
|
{
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Float1()
|
||||||
|
{
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Float2()
|
||||||
|
{
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[1] = DataReadU32();
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================================================================================
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_UByte1()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_UByte2()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_Byte1()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_Byte2()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_UShort1()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_UShort2()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_Short1()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_Short2()
|
||||||
|
{
|
||||||
|
u8 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_Float1()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex8_Float2()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU8();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4);
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================================================================================
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_UByte1()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_UByte2()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_Byte1()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_Byte2()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_UShort1()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_UShort2()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_Short1()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_Short2()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex];
|
||||||
|
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex];
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_Float1()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
||||||
|
LOG_TEX1();
|
||||||
|
VertexManager::s_pCurBufferPointer += 4;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_Float2()
|
||||||
|
{
|
||||||
|
u16 Index = DataReadU16();
|
||||||
|
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
||||||
|
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
||||||
|
((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress + 4);
|
||||||
|
LOG_TEX2();
|
||||||
|
VertexManager::s_pCurBufferPointer += 8;
|
||||||
|
tcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,314 +18,36 @@
|
||||||
#ifndef VERTEXLOADER_TEXCOORD_H
|
#ifndef VERTEXLOADER_TEXCOORD_H
|
||||||
#define VERTEXLOADER_TEXCOORD_H
|
#define VERTEXLOADER_TEXCOORD_H
|
||||||
|
|
||||||
#define LOG_TEX1() PRIM_LOG("tex: %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0]);
|
void LOADERDECL TexCoord_Read_Dummy();
|
||||||
#define LOG_TEX2() PRIM_LOG("tex: %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1]);
|
void LOADERDECL TexCoord_ReadDirect_UByte1();
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_UByte2();
|
||||||
extern int tcIndex;
|
void LOADERDECL TexCoord_ReadDirect_Byte1();
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Byte2();
|
||||||
void LOADERDECL TexCoord_Read_Dummy()
|
void LOADERDECL TexCoord_ReadDirect_UShort1();
|
||||||
{
|
void LOADERDECL TexCoord_ReadDirect_UShort2();
|
||||||
tcIndex++;
|
void LOADERDECL TexCoord_ReadDirect_Short1();
|
||||||
}
|
void LOADERDECL TexCoord_ReadDirect_Short2();
|
||||||
|
void LOADERDECL TexCoord_ReadDirect_Float1();
|
||||||
void LOADERDECL TexCoord_ReadDirect_UByte1()
|
void LOADERDECL TexCoord_ReadDirect_Float2();
|
||||||
{
|
void LOADERDECL TexCoord_ReadIndex8_UByte1();
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScaleU[tcIndex];
|
void LOADERDECL TexCoord_ReadIndex8_UByte2();
|
||||||
LOG_TEX1();
|
void LOADERDECL TexCoord_ReadIndex8_Byte1();
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
void LOADERDECL TexCoord_ReadIndex8_Byte2();
|
||||||
tcIndex++;
|
void LOADERDECL TexCoord_ReadIndex8_UShort1();
|
||||||
}
|
void LOADERDECL TexCoord_ReadIndex8_UShort2();
|
||||||
void LOADERDECL TexCoord_ReadDirect_UByte2()
|
void LOADERDECL TexCoord_ReadIndex8_Short1();
|
||||||
{
|
void LOADERDECL TexCoord_ReadIndex8_Short2();
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScaleU[tcIndex];
|
void LOADERDECL TexCoord_ReadIndex8_Float1();
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * tcScaleV[tcIndex];
|
void LOADERDECL TexCoord_ReadIndex8_Float2();
|
||||||
LOG_TEX2();
|
void LOADERDECL TexCoord_ReadIndex16_UByte1();
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
void LOADERDECL TexCoord_ReadIndex16_UByte2();
|
||||||
tcIndex++;
|
void LOADERDECL TexCoord_ReadIndex16_Byte1();
|
||||||
}
|
void LOADERDECL TexCoord_ReadIndex16_Byte2();
|
||||||
|
void LOADERDECL TexCoord_ReadIndex16_UShort1();
|
||||||
void LOADERDECL TexCoord_ReadDirect_Byte1()
|
void LOADERDECL TexCoord_ReadIndex16_UShort2();
|
||||||
{
|
void LOADERDECL TexCoord_ReadIndex16_Short1();
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScaleU[tcIndex];
|
void LOADERDECL TexCoord_ReadIndex16_Short2();
|
||||||
LOG_TEX1();
|
void LOADERDECL TexCoord_ReadIndex16_Float1();
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
void LOADERDECL TexCoord_ReadIndex16_Float2();
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_Byte2()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_UShort1()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_UShort2()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_Short1()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_Short2()
|
|
||||||
{
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_Float1()
|
|
||||||
{
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadDirect_Float2()
|
|
||||||
{
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[1] = DataReadU32();
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================================
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_UByte1()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_UByte2()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_Byte1()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_Byte2()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_UShort1()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_UShort2()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_Short1()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_Short2()
|
|
||||||
{
|
|
||||||
u8 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_Float1()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex8_Float2()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU8();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4);
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================================
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_UByte1()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_UByte2()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_Byte1()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_Byte2()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_UShort1()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_UShort2()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_Short1()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_Short2()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex];
|
|
||||||
((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex];
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_Float1()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
|
||||||
LOG_TEX1();
|
|
||||||
VertexManager::s_pCurBufferPointer += 4;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
void LOADERDECL TexCoord_ReadIndex16_Float2()
|
|
||||||
{
|
|
||||||
u16 Index = DataReadU16();
|
|
||||||
u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]);
|
|
||||||
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress);
|
|
||||||
((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress + 4);
|
|
||||||
LOG_TEX2();
|
|
||||||
VertexManager::s_pCurBufferPointer += 8;
|
|
||||||
tcIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -227,8 +227,6 @@ void Flush()
|
||||||
|
|
||||||
FRAGMENTSHADER* ps = PixelShaderMngr::GetShader();
|
FRAGMENTSHADER* ps = PixelShaderMngr::GetShader();
|
||||||
VERTEXSHADER* vs = VertexShaderMngr::GetShader(s_prevcomponents);
|
VERTEXSHADER* vs = VertexShaderMngr::GetShader(s_prevcomponents);
|
||||||
//if (!ps) PanicAlert("Pixel shader = 0. Argh.");
|
|
||||||
//if (!vs) PanicAlert("Vertex shader = 0. Argh.");
|
|
||||||
|
|
||||||
bool bRestoreBuffers = false;
|
bool bRestoreBuffers = false;
|
||||||
if (Renderer::GetZBufferTarget()) {
|
if (Renderer::GetZBufferTarget()) {
|
||||||
|
@ -295,7 +293,7 @@ void Flush()
|
||||||
if (bRestoreBuffers) {
|
if (bRestoreBuffers) {
|
||||||
GLenum s_drawbuffers[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
|
GLenum s_drawbuffers[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
|
||||||
glDrawBuffers(2, s_drawbuffers);
|
glDrawBuffers(2, s_drawbuffers);
|
||||||
SetColorMask();
|
Renderer::SetColorMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetBuffer();
|
ResetBuffer();
|
||||||
|
|
|
@ -82,11 +82,15 @@ void XFB_Draw(u8 *xfb_in_ram, u32 width, u32 height, s32 yOffset)
|
||||||
glViewport(nXoff, nYoff, nBackbufferWidth, nBackbufferHeight);
|
glViewport(nXoff, nYoff, nBackbufferWidth, nBackbufferHeight);
|
||||||
GL_REPORT_ERRORD();
|
GL_REPORT_ERRORD();
|
||||||
|
|
||||||
|
float w = (float)width;
|
||||||
|
float h = (float)height;
|
||||||
|
float yOff = (float)yOffset;
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glTexCoord2f(width, 0 - yOffset); glVertex2f(1,-1);
|
glTexCoord2f(w, 0 - yOff); glVertex2f(1, -1);
|
||||||
glTexCoord2f(width, height - yOffset); glVertex2f(1,1);
|
glTexCoord2f(w, h - yOff); glVertex2f(1, 1);
|
||||||
glTexCoord2f(0, height - yOffset); glVertex2f(-1,1);
|
glTexCoord2f(0, h - yOff); glVertex2f(-1, 1);
|
||||||
glTexCoord2f(0, 0 - yOffset); glVertex2f(-1,-1);
|
glTexCoord2f(0, 0 - yOff); glVertex2f(-1,-1);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
TextureMngr::DisableStage(0);
|
TextureMngr::DisableStage(0);
|
||||||
|
|
Loading…
Reference in New Issue