forked from dolphin-emu/dolphin
		
	
		
			
				
	
	
		
			177 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright 2013 Dolphin Emulator Project
 | 
						|
// Licensed under GPLv2
 | 
						|
// Refer to the license.txt file included.
 | 
						|
 | 
						|
#include "SetupUnit.h"
 | 
						|
 | 
						|
#include "CPMemLoader.h"
 | 
						|
#include "OpcodeDecoder.h"
 | 
						|
#include "SWStatistics.h"
 | 
						|
#include "Clipper.h"
 | 
						|
 | 
						|
 | 
						|
void SetupUnit::Init(u8 primitiveType)
 | 
						|
{
 | 
						|
	m_PrimType = primitiveType;
 | 
						|
 | 
						|
	m_VertexCounter = 0;
 | 
						|
	m_VertPointer[0] = &m_Vertices[0];
 | 
						|
	m_VertPointer[1] = &m_Vertices[1];
 | 
						|
	m_VertPointer[2] = &m_Vertices[2];
 | 
						|
	m_VertWritePointer = m_VertPointer[0];
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupVertex()
 | 
						|
{
 | 
						|
	switch(m_PrimType)
 | 
						|
	{
 | 
						|
	case GX_DRAW_QUADS:
 | 
						|
		SetupQuad();
 | 
						|
		break;
 | 
						|
	case GX_DRAW_TRIANGLES:
 | 
						|
		SetupTriangle();
 | 
						|
		break;
 | 
						|
	case GX_DRAW_TRIANGLE_STRIP:
 | 
						|
		SetupTriStrip();
 | 
						|
		break;
 | 
						|
	case GX_DRAW_TRIANGLE_FAN:
 | 
						|
		SetupTriFan();
 | 
						|
		break;
 | 
						|
	case GX_DRAW_LINES:
 | 
						|
		SetupLine();
 | 
						|
		break;
 | 
						|
	case GX_DRAW_LINE_STRIP:
 | 
						|
		SetupLineStrip();
 | 
						|
		break;
 | 
						|
	case GX_DRAW_POINTS:
 | 
						|
		SetupPoint();
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
	void SetupUnit::SetupQuad()
 | 
						|
	{
 | 
						|
	if (m_VertexCounter < 2)
 | 
						|
	{
 | 
						|
		m_VertexCounter++;
 | 
						|
		m_VertWritePointer = m_VertPointer[m_VertexCounter];
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
 | 
						|
 | 
						|
	m_VertexCounter++;
 | 
						|
	m_VertexCounter &= 3;
 | 
						|
	m_VertWritePointer = &m_Vertices[m_VertexCounter & 1];
 | 
						|
	OutputVertexData* temp = m_VertPointer[1];
 | 
						|
	m_VertPointer[1] = m_VertPointer[2];
 | 
						|
	m_VertPointer[2] = temp;
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupTriangle()
 | 
						|
{
 | 
						|
	if (m_VertexCounter < 2)
 | 
						|
	{
 | 
						|
		m_VertexCounter++;
 | 
						|
		m_VertWritePointer = m_VertPointer[m_VertexCounter];
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
 | 
						|
 | 
						|
	m_VertexCounter = 0;
 | 
						|
	m_VertWritePointer = m_VertPointer[0];
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupTriStrip()
 | 
						|
{
 | 
						|
	if (m_VertexCounter < 2)
 | 
						|
	{
 | 
						|
		m_VertexCounter++;
 | 
						|
		m_VertWritePointer = m_VertPointer[m_VertexCounter];
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
 | 
						|
 | 
						|
	m_VertexCounter++;
 | 
						|
	m_VertPointer[2 - (m_VertexCounter & 1)] = m_VertPointer[0];
 | 
						|
	m_VertWritePointer = m_VertPointer[0];
 | 
						|
 | 
						|
	m_VertPointer[0] = &m_Vertices[(m_VertexCounter + 1) % 3];
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupTriFan()
 | 
						|
{
 | 
						|
	if (m_VertexCounter < 2)
 | 
						|
	{
 | 
						|
		m_VertexCounter++;
 | 
						|
		m_VertWritePointer = m_VertPointer[m_VertexCounter];
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
 | 
						|
 | 
						|
	m_VertexCounter++;
 | 
						|
	m_VertPointer[1] = m_VertPointer[2];
 | 
						|
	m_VertPointer[2] = &m_Vertices[2 - (m_VertexCounter & 1)];
 | 
						|
 | 
						|
	m_VertWritePointer = m_VertPointer[2];
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupLine()
 | 
						|
{
 | 
						|
	if (m_VertexCounter < 1)
 | 
						|
	{
 | 
						|
		m_VertexCounter++;
 | 
						|
		m_VertWritePointer = m_VertPointer[m_VertexCounter];
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]);
 | 
						|
 | 
						|
	m_VertexCounter = 0;
 | 
						|
	m_VertWritePointer = m_VertPointer[0];
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupLineStrip()
 | 
						|
{
 | 
						|
	if (m_VertexCounter < 1)
 | 
						|
	{
 | 
						|
		m_VertexCounter++;
 | 
						|
		m_VertWritePointer = m_VertPointer[m_VertexCounter];
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	m_VertexCounter++;
 | 
						|
 | 
						|
	Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]);
 | 
						|
 | 
						|
	m_VertWritePointer = m_VertPointer[0];
 | 
						|
 | 
						|
	m_VertPointer[0] = m_VertPointer[1];
 | 
						|
	m_VertPointer[1] = &m_Vertices[m_VertexCounter & 1];
 | 
						|
}
 | 
						|
 | 
						|
void SetupUnit::SetupPoint()
 | 
						|
{}
 | 
						|
 | 
						|
void SetupUnit::DoState(PointerWrap &p)
 | 
						|
{
 | 
						|
	// TODO: some or all of this is making the save states stop working once dolphin is closed...sometimes (usually)
 | 
						|
	// I have no idea what specifically is wrong, or if this is even important. Disabling it doesn't seem to make any noticible difference...
 | 
						|
/*	p.Do(m_PrimType);
 | 
						|
	p.Do(m_VertexCounter);
 | 
						|
	for (int i = 0; i < 3; ++i)
 | 
						|
		m_Vertices[i].DoState(p);
 | 
						|
 | 
						|
	if (p.GetMode() == PointerWrap::MODE_READ)
 | 
						|
	{
 | 
						|
		m_VertPointer[0] = &m_Vertices[0];
 | 
						|
		m_VertPointer[1] = &m_Vertices[1];
 | 
						|
		m_VertPointer[2] = &m_Vertices[2];
 | 
						|
		m_VertWritePointer = m_VertPointer[0];
 | 
						|
	}*/
 | 
						|
}
 |