/////////////////////////////////////////////////////////////////////////////////////////// /// /// Классы для работы с моделями /// /////////////////////////////////////////////////////////////////////////////////////////// class CVertex3 // - координаты вершины и нормалей { public: float x,y,z; }; class CVertex2 // - координаты текстур { public: float u, v; }; class CFace // индексы вершин полигона ( из трёх вершин ) { public: int v1,v2,v3; }; /////////////////////////////////////////////////////////////////////////////////////////// // Класс одного объекта /////////////////////////////////////////////////////////////////////////////////////////// class CModel { public: int iVert; // количество вершин CVertex3 * Vert; // - указатель на массив вершин ( Vert * 3 ) int iNorm; // количество нормалей CVertex3 * Norm; // - указатель на массив нормалей ( Norm * 3 ) int iText; // количество координаты текстур CVertex2 * Text; // - указатель на массив координаты текстур ( Text * 2 ) int iFace; // количество полигонов CFace * face; // - указатель на массив индексов вершин ( Face * 3 ) }; /////////////////////////////////////////////////////////////////////////////////////////// /// /// Объявление глобальных переменных /// /////////////////////////////////////////////////////////////////////////////////////////// char NameFile[255]; // - имя файла модели и текстуры vector < CModel > ObjectsModel; // - массив объектов, используется vector, для хранения множества объектов /////////////////////////////////////////////////////////////////////////////////////////// /// /// Функция для создания путей к файлам и запуск загрузки /// /////////////////////////////////////////////////////////////////////////////////////////// void linkFile() { // - 0 .......................... strcat(NameFile, ".3dk" ); // - LoadModel3dk(); ............................ } // - 0 /////////////////////////////////////////////////////////////////////////////////////////// /// /// Загрузка модели /// /////////////////////////////////////////////////////////////////////////////////////////// void LoadModel3dk() { // - 0 int iVertex = 0; int iNormals = 0; int iTextures = 0; int iFace = 0; CModel * Model = new CModel; // - временный массив ОДНОГО объекта FILE* MyFileHandler = fopen(NameFile, "rb"); // - Вершины - fread(&iVertex, 4, 1, MyFileHandler); CVertex3 * VerBuffer = new CVertex3[iVertex+1]; fread(&(*VerBuffer), (sizeof(CVertex3) * iVertex), 1, MyFileHandler); // - нормали - fread(&iNormals, 4, 1, MyFileHandler); CVertex3 * NormBuffer = new CVertex3[iNormals+1]; fread(&(*NormBuffer), (sizeof(CVertex3) * iNormals), 1, MyFileHandler); // - текстурные координаты - fread(&iTextures, 4, 1, MyFileHandler); CVertex2 * TextBuffer = new CVertex2[iTextures+1]; fread(&(*TextBuffer), (sizeof(CVertex2) * iTextures), 1, MyFileHandler); // - индексы - fread(&iFace, 4, 1, MyFileHandler); CFace * FaceBuffer = new CFace[iFace+1]; fread(&(*FaceBuffer), (sizeof(CFace) * iFace), 1, MyFileHandler); fclose(MyFileHandler); //---------------------------------------------------------------------------- (*Model).Vert = VerBuffer; (*Model).iVert = iVertex; (*Model).Norm = NormBuffer; (*Model).iNorm = iNormals; (*Model).Text = TextBuffer; (*Model).iText = iTextures; (*Model).face = FaceBuffer; (*Model).iFace = iFace; //---------------------------------------------------------------------------- .............................................. ObjectsModel.push_back(*Model); } /////////////////////////////////////////////////////////////////////////////////////////// /// /// Отрисовка с использованием ДИНАМИЧЕСКОГО буфера (НЕстатический) /// /////////////////////////////////////////////////////////////////////////////////////////// void DrawObjects(int countModel) { // - 0 .............................. glBindTexture(GL_TEXTURE_2D, ObjectsTexture[countModel]); // - выбор требуемой текстура glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(CVertex3), ObjectsModel[countModel].Vert); // Указываем массив вершин. VectModels glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, sizeof(CVertex3), ObjectsModel[countModel].Norm); // Указываем массив нормалей. VectModels glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(CVertex2),ObjectsModel[countModel].Text); // Указываем массив текстурных координат. VectModels glDrawElements(GL_TRIANGLES, 3 * ObjectsModel[countModel].iFace, GL_UNSIGNED_INT, ObjectsModel[countModel].face); // Указываем массив индексов и рендерим. VectModels ...................................... } // - 0