В который раз, класс анализатора .X cXParser из главы 3 приходит нам на помощь. Здесь вы унаследуете класс от класса cXParser, который будет искать два различных шаблона - один, содержащий значения массы одежды (ClothMasses), и другой, который будет хранить информацию о пружинах (ClothSprings).

Для хранения данных обоих объектов замечательно подходят классы точки и пружины, определенные ранее в этой главе, - все, что необходимо, это класс анализатора для перечисления объектов и получения их данных. Вот пример класса анализатора .X, который сделает все для вас:

class cClothMesh : cXParser {

protected: DWORD m_NumPoints; // # точек в одежде cClothPoint *m_ClothPoints; // данные точек DWORD m_NumSprings; // # пружин в одежде cClothSpring *m_ClothSprings; // данные пружин

protected:

// Анализирует файлы .X и получает данные масс и пружин BOOL ParseObject(IDirectXFileData *pDataObj,

IDirectXFileData *pParentDataObj,

DWORD Depth,

void **Data, BOOL Reference)

{

const GUID *Type = GetObjectGUID(pDataObj);

DWORD *DataPtr = (DWORD*)GetObjectData(pDataObj, NULL);

// Считать массы точек одежды

if(*Type == ClothMasses) {

// Получить количество присваиваний масс

DWORD NumPoints = *DataPtr++;

// Скопировать значения масс

float MassPtr = (float*)DataPtr; for(DWORD i=0;iXNumPoints;i++) {

m_ClothPoints[i].m_Mass = *MassPtr++; // Вычислить 1/масса

m_ClothPoints[i].m_OneOverMass = \

(m_ClothPoints[i].m_Mass==0.0f) ? \ 0.0f:(1.0f/m_ClothPoints[i].m_Mass);

}

}

// Считать данные пружин if(*Type == ClothSprings) {

/ / Освободить предыдущие данные пружин

delete [] m_ClothSprings; m_ClothSprings = NULL;

// Получить новое количество пружин и вершин DWORD NumSprings = *DataPtr++; DWORD NumVertices = *DataPtr++;

// Выделить память под пружины

m_ClothSprings = new cClothSpring[NumSprings];

// Загрузить данные каждой пружины for(DWORD i=0;i<NumSprings;i++) {

m_ClothSprings[i].m_Point1 = *DataPtr++;

m_ClothSprings[i].m_Point2 = *DataPtr++;

}

}

return ParseChildObjects(pDataObj, Depth, \ Data, Reference);

}

}

Только что показанный код класса cXParser является очень простым, так что я не буду подробно его объяснять. Все, что делает функция ParseObject, - это загрузка любых данных пружины или масс точек в массив классов, используемых в программе. Чтобы существенно повысить функциональность класса анализатора, вы можете объединить его с классом, создающим и управляющим мешем одежды.

Чтобы задействовать объект анализатора .X, просто вызовете cClothMesh::Parse, задав в качестве параметра имя используемого файла. Вы заметите, что массивы точек одежды и данных пружин встроены в класс анализатора, поэтому убедитесь, что вы выделили под них память, прежде чем анализировать файл .X. Позже в этой главе вы увидите, как создать завершенный класс меша одежды, наследуемый от класса анализатора .X для загрузки данных масс и пружин.

А пока, пришло время оживить имитацию, добавив обнаружение столкновений и реакцию на них.

Загрузка данных масс и пружин из .X файла || Оглавление || Работа с обнаружением столкновений и реакцией на них