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; }