Ejemplo n.º 1
0
bool CFXRings::LoadData(CResourceList* pResourceList)
{
	int i;

	if(!(m_pResHorTexture = this->FindResource(pResourceList, "Horizontal Texture", CResourceTexture2D::CLASSNAME)))
	{
		FXLoadError("Can't find horizontal texture resource");
		return false;
	}

	m_pResHorTexture->NotifyDependency(this);

	if(!(m_pResVertTexture = this->FindResource(pResourceList, "Vertical Texture", CResourceTexture2D::CLASSNAME)))
	{
		FXLoadError("Can't find vertical texture resource");
		return false;
	}

	m_pResVertTexture->NotifyDependency(this);

	// Build mesh and ring properties

	CVarInt::CValueInt     valueHorRingCount;
	CVarFloat::CValueFloat valueHorVariation;
	CVarInt::CValueInt     valueVertRingCount;
	CVarFloat::CValueFloat valueVertVariation;
	CVarInt::CValueInt     valueRingSubdivisions;
	CVarInt::CValueInt     valueSeed;

	EvaluateVar("Horizontal Ring Count",  0.0f, &valueHorRingCount);
	EvaluateVar("Horizontal Variation",   0.0f, &valueHorVariation);
	EvaluateVar("Vertical Ring Count",    0.0f, &valueVertRingCount);
	EvaluateVar("Vertical Variation",     0.0f, &valueVertVariation);
	EvaluateVar("Ring Subdivisions",      0.0f, &valueRingSubdivisions);
	EvaluateVar("Seed",                   0.0f, &valueSeed);

	srand(valueSeed.GetValue());

	m_nSubdivisions = valueRingSubdivisions.GetValue();
	if(m_nSubdivisions < 2) m_nSubdivisions = 2;

	m_pv3Circle       = new CVector3[m_nSubdivisions + 1];

	m_pv3MeshVertices = new CVector3[(m_nSubdivisions + 1) * 2];
	m_pv2MeshMapping  = new CVector2[(m_nSubdivisions + 1) * 2];
	m_pnMeshFaceList  = new int     [m_nSubdivisions * 4];

	for(i = 0; i < m_nSubdivisions + 1; i++)
	{
		// Precomputed normalized circle

		CMatrix rotMatrix;
		rotMatrix.BuildRotationY(((float)i / (float)m_nSubdivisions) * 360.0f);
		m_pv3Circle[i].Set(1.0f, 0.0f, 0.0f);
		rotMatrix.Transform(&m_pv3Circle[i]);

		// Precomputed mapping

		m_pv2MeshMapping[i                      ].Set((float)i / (float)m_nSubdivisions, 0.0f);
		m_pv2MeshMapping[i + m_nSubdivisions + 1].Set((float)i / (float)m_nSubdivisions, 1.0f);

		// Precomputed face list 

		if(i < m_nSubdivisions)
		{
			m_pnMeshFaceList[i * 4 + 0] = i;
			m_pnMeshFaceList[i * 4 + 1] = i + m_nSubdivisions + 1;
			m_pnMeshFaceList[i * 4 + 2] = i + m_nSubdivisions + 2;
			m_pnMeshFaceList[i * 4 + 3] = i + 1;
		}
	}

	for(i = 0; i < valueHorRingCount.GetValue(); i++)
	{
		SRing ring;

		ring.eType                 = SRing::HORIZONTAL;
		ring.fRadius               = ComputeRandWithVariation(1.0f, valueHorVariation.GetValue());
		ring.fWidth                = ComputeRandWithVariation(1.0f, valueHorVariation.GetValue());
		ring.fAlpha                = ComputeRandWithVariation(1.0f, valueHorVariation.GetValue());
		ring.fDistToCenter         = ComputeLERP(-0.5f, 0.5f, (float)i / (float)valueHorRingCount.GetValue()) + ComputeRandWithVariation((float)i / (float)valueHorRingCount.GetValue(), valueHorVariation.GetValue());
		ring.fRotSpeed             = ComputeRandWithVariation(1.0f, valueHorVariation.GetValue());
		ring.fRotAngleStart        = ComputeRand(0.0f, 360.0f);
		ring.fOscillationAmplitude = ComputeRandWithVariation(1.0f, valueHorVariation.GetValue());
		ring.fOscillationFrequency = ComputeRandWithVariation(1.0f, valueHorVariation.GetValue());;
		ring.fOscillationOffset    = ComputeRand(0.0f, 1.0f);

		if(rand() % 2)
		{
			ring.fRotSpeed = -ring.fRotSpeed;
		}

		m_vecRings.push_back(ring);
	}

	for(i = 0; i < valueVertRingCount.GetValue(); i++)
	{
		SRing ring;

		ring.eType                 = SRing::VERTICAL;
		ring.fRadius               = ComputeRandWithVariation(1.0f, valueVertVariation.GetValue());
		ring.fWidth                = ComputeRandWithVariation(1.0f, valueVertVariation.GetValue());
		ring.fAlpha                = ComputeRandWithVariation(1.0f, valueVertVariation.GetValue());
		ring.fDistToCenter         = ComputeLERP(-0.5f, 0.5f, (float)i / (float)valueVertRingCount.GetValue()) + ComputeRandWithVariation((float)i / (float)valueVertRingCount.GetValue(), valueVertVariation.GetValue());
		ring.fRotSpeed             = ComputeRandWithVariation(1.0f, valueVertVariation.GetValue());
		ring.fRotAngleStart        = ComputeRand(0.0f, 360.0f);
		ring.fOscillationAmplitude = ComputeRandWithVariation(1.0f, valueVertVariation.GetValue());
		ring.fOscillationFrequency = ComputeRandWithVariation(1.0f, valueVertVariation.GetValue());;
		ring.fOscillationOffset    = ComputeRand(0.0f, 1.0f);

		if(rand() % 2)
		{
			ring.fRotSpeed = -ring.fRotSpeed;
		}

		m_vecRings.push_back(ring);
	}

	return true;
}