mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
fixed an off by one error I created in the texture copy function in bpstructs.cpp. SSBM no longer has black on ground. sorry about that ;p
noticed the real HW doesn't clip some things it should. modified the projection matrix to account for this. changed normal loader to better handle 1 or 3 index NBT data which fixed an underrun. added missing z component in biasing section of indirect texturing. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1048 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@@ -499,7 +499,7 @@ static void WriteStage(char *&p, int n, u32 texture_mask)
|
||||
|
||||
// bias
|
||||
WRITE(p, "float3 indtevcrd%d = indtex%d;\n", n, bpmem.tevind[n].bt);
|
||||
WRITE(p, "indtevcrd%d.xy *= %s;\n", n, tevIndFmtScale[bpmem.tevind[n].fmt]);
|
||||
WRITE(p, "indtevcrd%d.xyz *= %s;\n", n, tevIndFmtScale[bpmem.tevind[n].fmt]);
|
||||
if (bpmem.tevind[n].bias != ITB_NONE )
|
||||
WRITE(p, "indtevcrd%d.%s += %s;\n", n, tevIndBiasField[bpmem.tevind[n].bias], tevIndBiasAdd[bpmem.tevind[n].fmt]);
|
||||
|
||||
|
||||
@@ -426,13 +426,15 @@ void BPWritten(int addr, int changes, int newval)
|
||||
VertexManager::Flush();
|
||||
|
||||
((u32*)&bpmem)[addr] = newval;
|
||||
//The bottom right is within the rectangle.
|
||||
TRectangle rc = {
|
||||
(int)(bpmem.copyTexSrcXY.x),
|
||||
(int)(bpmem.copyTexSrcXY.y),
|
||||
(int)((bpmem.copyTexSrcXY.x + bpmem.copyTexSrcWH.x + 1)),
|
||||
(int)((bpmem.copyTexSrcXY.y + bpmem.copyTexSrcWH.y + 1))
|
||||
(int)((bpmem.copyTexSrcXY.x + bpmem.copyTexSrcWH.x)),
|
||||
(int)((bpmem.copyTexSrcXY.y + bpmem.copyTexSrcWH.y))
|
||||
};
|
||||
//Need another rc here to get it to scale.
|
||||
//Here the bottom right is the out of the rectangle.
|
||||
TRectangle multirc = {
|
||||
(int)(bpmem.copyTexSrcXY.x * MValueX),
|
||||
(int)(bpmem.copyTexSrcXY.y * MValueY),
|
||||
|
||||
@@ -155,9 +155,8 @@ int VertexLoader::ComputeVertexSize()
|
||||
break;
|
||||
}
|
||||
|
||||
VertexLoader_Normal::index3 = m_VtxAttr.NormalIndex3 ? true : false;
|
||||
if (m_VtxDesc.Normal != NOT_PRESENT)
|
||||
m_VertexSize += VertexLoader_Normal::GetSize(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements);
|
||||
m_VertexSize += VertexLoader_Normal::GetSize(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3);
|
||||
|
||||
// Colors
|
||||
int col[2] = {m_VtxDesc.Color0, m_VtxDesc.Color1};
|
||||
@@ -304,12 +303,11 @@ void VertexLoader::CompileVertexTranslator()
|
||||
|
||||
// Normals
|
||||
if (m_VtxDesc.Normal != NOT_PRESENT) {
|
||||
VertexLoader_Normal::index3 = m_VtxAttr.NormalIndex3 ? true : false;
|
||||
TPipelineFunction pFunc = VertexLoader_Normal::GetFunction(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements);
|
||||
TPipelineFunction pFunc = VertexLoader_Normal::GetFunction(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3);
|
||||
if (pFunc == 0)
|
||||
{
|
||||
char temp[256];
|
||||
sprintf(temp,"%i %i %i", m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements);
|
||||
sprintf(temp,"%i %i %i %i", m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3);
|
||||
g_VideoInitialize.pSysMessage("VertexLoader_Normal::GetFunction returned zero!");
|
||||
}
|
||||
WriteCall(pFunc);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -24,15 +24,14 @@ class VertexLoader_Normal
|
||||
{
|
||||
public:
|
||||
|
||||
static bool index3;
|
||||
// Init
|
||||
static void Init(void);
|
||||
|
||||
// GetSize
|
||||
static unsigned int GetSize(unsigned int _type, unsigned int _format, unsigned int _elements);
|
||||
static unsigned int GetSize(unsigned int _type, unsigned int _format, unsigned int _elements, unsigned int _index3);
|
||||
|
||||
// GetFunction
|
||||
static TPipelineFunction GetFunction(unsigned int _type, unsigned int _format, unsigned int _elements);
|
||||
static TPipelineFunction GetFunction(unsigned int _type, unsigned int _format, unsigned int _elements, unsigned int _index3);
|
||||
|
||||
private:
|
||||
enum ENormalType
|
||||
@@ -61,9 +60,17 @@ private:
|
||||
NUM_NRM_ELEMENTS
|
||||
};
|
||||
|
||||
enum ENormalIndices
|
||||
{
|
||||
NRM_INDICES1 = 0,
|
||||
NRM_INDICES3 = 1,
|
||||
NUM_NRM_INDICES
|
||||
};
|
||||
|
||||
|
||||
// tables
|
||||
static u8 m_sizeTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS];
|
||||
static TPipelineFunction m_funcTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS];
|
||||
static u8 m_sizeTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS][NUM_NRM_INDICES];
|
||||
static TPipelineFunction m_funcTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS][NUM_NRM_INDICES];
|
||||
|
||||
// direct
|
||||
static void LOADERDECL Normal_DirectByte(const void *_p);
|
||||
@@ -77,17 +84,23 @@ private:
|
||||
static void LOADERDECL Normal_Index8_Byte(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Short(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Float(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Byte3(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Short3(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Float3(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Byte3_Indices1(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Short3_Indices1(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Float3_Indices1(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Byte3_Indices3(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Short3_Indices3(const void *_p);
|
||||
static void LOADERDECL Normal_Index8_Float3_Indices3(const void *_p);
|
||||
|
||||
// index16
|
||||
static void LOADERDECL Normal_Index16_Byte(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Short(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Float(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Byte3(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Short3(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Float3(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Byte3_Indices1(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Short3_Indices1(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Float3_Indices1(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Byte3_Indices3(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Short3_Indices3(const void *_p);
|
||||
static void LOADERDECL Normal_Index16_Float3_Indices3(const void *_p);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -466,7 +466,9 @@ void VertexShaderMngr::SetConstants()
|
||||
|
||||
g_fProjectionMatrix[12] = 0.0f;
|
||||
g_fProjectionMatrix[13] = 0.0f;
|
||||
g_fProjectionMatrix[14] = -1.0f;
|
||||
// donkopunchstania: GC GPU rounds differently?
|
||||
// -(1 + epsilon) so objects are clipped as they are on the real HW
|
||||
g_fProjectionMatrix[14] = -1.00000011921f;
|
||||
g_fProjectionMatrix[15] = 0.0f;
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user