В который раз, класс анализатора .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 файла || Оглавление || Работа с обнаружением столкновений и реакцией на них⇒