예제 #1
0
        // загрузка модели
        public int LoadModel(string FileName)
        {
            // модель может содержать до 256 под-объектов
            limbs = new LIMB[256];
            // счетчик скинут
            int limb_ = -1;

            // имся файла
            FName = FileName;

            // начинаем чтение файла
            StreamReader sw = File.OpenText(FileName);

            // временные буферы
            string a_buff = "";
            string b_buff = "";
            string c_buff = "";

            // счетчики вершин и полигонов
            int ver = 0, fac = 0;

            // если строка успешно прочитана
            while ((a_buff = sw.ReadLine()) != null)
            {
                // получаем первое слово
                b_buff = GetFirstWord(a_buff, 0);
                if (b_buff[0] == '*')       // определеям, является ли первый символ звездочкой
                {
                    switch (b_buff)         // если да, то проверяем какое управляющее слово содержится в первом прочитаном слове
                    {
                    case "*MATERIAL_COUNT": // счетчик материалов
                    {
                        // получаем первое слово от символа указанного в GlobalStringFrom
                        c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                        int mat = System.Convert.ToInt32(c_buff);

                        // создаем объект для текстуры в памяти
                        text_objects = new TexturesForObjects[mat];
                        continue;
                    }

                    case "*MATERIAL_REF":     // номер текстуры
                    {
                        // записываем для текущего под-объекта номер текстуры
                        c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                        int mat_ref = System.Convert.ToInt32(c_buff);

                        // устанавливаем номер материала, соответствующий данной модели.
                        limbs[limb_].SetMaterialNom(mat_ref);
                        continue;
                    }

                    case "*MATERIAL":     // указание на материал
                    {
                        c_buff  = GetFirstWord(a_buff, GlobalStringFrom);
                        mat_nom = System.Convert.ToInt32(c_buff);
                        continue;
                    }

                    case "*GEOMOBJECT":  // начинается описание геметрии под-объекта
                    {
                        limb_++;         // записываем в счетчик под-объектов
                        continue;
                    }

                    case "*MESH_NUMVERTEX":     // количесвто вершин в под-объекте
                    {
                        c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                        ver    = System.Convert.ToInt32(c_buff);
                        continue;
                    }

                    case "*BITMAP":     // имя текстуры
                    {
                        c_buff = "";    // обнуляем временный буффер

                        for (int ax = GlobalStringFrom + 2; ax < a_buff.Length - 1; ax++)
                        {
                            c_buff += a_buff[ax];                          // считываем имя текстуры
                        }
                        text_objects[mat_nom] = new TexturesForObjects();  // новый объект для текстуры

                        text_objects[mat_nom].LoadTextureForModel(c_buff); // загружаем текстуру

                        continue;
                    }

                    case "*MESH_NUMTVERTEX":     // количество текстурных координат, данное слово говорит о наличии текстурных координат - следовательно мы должны выделить память для них
                    {
                        c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                        if (limbs[limb_] != null)
                        {
                            limbs[limb_].createTextureVertexMem(System.Convert.ToInt32(c_buff));
                        }
                        continue;
                    }

                    case "*MESH_NUMTVFACES":      // память для текстурных координат (faces)
                    {
                        c_buff = GetFirstWord(a_buff, GlobalStringFrom);

                        if (limbs[limb_] != null)
                        {
                            // выделяем память для текстурныйх координат
                            limbs[limb_].createTextureFaceMem(System.Convert.ToInt32(c_buff));
                        }
                        continue;
                    }

                    case "*MESH_NUMFACES":     // количество полиговов в под-объекте
                    {
                        c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                        fac    = System.Convert.ToInt32(c_buff);

                        // если было объвляющее слово *GEOMOBJECT (гарантия выполнения условия limb_ > -1) и были указаны количство вершин
                        if (limb_ > -1 && ver > -1 && fac > -1)
                        {
                            // создаем новый под-объект в памяти
                            limbs[limb_] = new LIMB(ver, fac);
                        }
                        else
                        {
                            // иначе завершаем неудачей
                            return(-1);
                        }
                        continue;
                    }

                    case "*MESH_VERTEX":     // информация о вершине
                    {
                        // под-объект создан в памяти
                        if (limb_ == -1)
                        {
                            return(-2);
                        }
                        if (limbs[limb_] == null)
                        {
                            return(-3);
                        }

                        string a1 = "", a2 = "", a3 = "", a4 = "";

                        // полчучаем информацию о кооринатах и номере вершины
                        // (получаем все слова в строке)
                        a1 = GetFirstWord(a_buff, GlobalStringFrom);
                        a2 = GetFirstWord(a_buff, GlobalStringFrom);
                        a3 = GetFirstWord(a_buff, GlobalStringFrom);
                        a4 = GetFirstWord(a_buff, GlobalStringFrom);

                        // преобразовываем в целое цисло
                        int NomVertex = Convert.ToInt32(a1);

                        // заменяем точки в представлении числа с плавающей точкой, на запятые, чтобы правильно выполнилась функция
                        // преобразования строки в дробное число
                        a2 = a2.Replace('.', ',');
                        a3 = a3.Replace('.', ',');
                        a4 = a4.Replace('.', ',');

                        // записываем информацию о вершине
                        limbs[limb_].vert[0, NomVertex] = (float)Convert.ToDouble(a2, CultureInfo.InvariantCulture);         // x
                        limbs[limb_].vert[1, NomVertex] = (float)Convert.ToDouble(a3, CultureInfo.InvariantCulture);         // y
                        limbs[limb_].vert[2, NomVertex] = (float)Convert.ToDouble(a4, CultureInfo.InvariantCulture);         // z

                        continue;
                    }

                    case "*MESH_FACE":     // информация о полигоне
                    {
                        // под-объект создан в памяти
                        if (limb_ == -1)
                        {
                            return(-2);
                        }
                        if (limbs[limb_] == null)
                        {
                            return(-3);
                        }

                        // временные перменные
                        string a1 = "", a2 = "", a3 = "", a4 = "", a5 = "", a6 = "", a7 = "";

                        // получаем все слова в строке
                        a1 = GetFirstWord(a_buff, GlobalStringFrom);
                        a2 = GetFirstWord(a_buff, GlobalStringFrom);
                        a3 = GetFirstWord(a_buff, GlobalStringFrom);
                        a4 = GetFirstWord(a_buff, GlobalStringFrom);
                        a5 = GetFirstWord(a_buff, GlobalStringFrom);
                        a6 = GetFirstWord(a_buff, GlobalStringFrom);
                        a7 = GetFirstWord(a_buff, GlobalStringFrom);

                        // получаем нмоер полигона из первого слова в строке, заменив последний символ ":" после номера на флаг окончания строки.
                        int NomFace = System.Convert.ToInt32(a1.Replace(':', '\0'));

                        // записываем номера вершин, которые нас интересуют
                        limbs[limb_].face[0, NomFace] = System.Convert.ToInt32(a3);
                        limbs[limb_].face[1, NomFace] = System.Convert.ToInt32(a5);
                        limbs[limb_].face[2, NomFace] = System.Convert.ToInt32(a7);

                        continue;
                    }

                    // текстурые координаты
                    case "*MESH_TVERT":
                    {
                        // под-объект создан в памяти
                        if (limb_ == -1)
                        {
                            return(-2);
                        }
                        if (limbs[limb_] == null)
                        {
                            return(-3);
                        }

                        // временные перменные
                        string a1 = "", a2 = "", a3 = "", a4 = "";

                        // получаем все слова в строке
                        a1 = GetFirstWord(a_buff, GlobalStringFrom);
                        a2 = GetFirstWord(a_buff, GlobalStringFrom);
                        a3 = GetFirstWord(a_buff, GlobalStringFrom);
                        a4 = GetFirstWord(a_buff, GlobalStringFrom);

                        // преобразуем первое слово в номер вершины
                        int NomVertex = System.Convert.ToInt32(a1);

                        // заменяем точки в представлении числа с плавающей точкой, на запятые, чтобы правильно выполнилась функция
                        // преобразования строки в дробное число
                        a2 = a2.Replace('.', ',');
                        a3 = a3.Replace('.', ',');
                        a4 = a4.Replace('.', ',');

                        // записываем значение вершины
                        limbs[limb_].t_vert[0, NomVertex] = (float)System.Convert.ToDouble(a2, CultureInfo.InvariantCulture);         // x
                        limbs[limb_].t_vert[1, NomVertex] = (float)System.Convert.ToDouble(a3, CultureInfo.InvariantCulture);         // y
                        limbs[limb_].t_vert[2, NomVertex] = (float)System.Convert.ToDouble(a4, CultureInfo.InvariantCulture);         // z

                        continue;
                    }

                    // привязка текстурных координат к полигонам
                    case "*MESH_TFACE":
                    {
                        // под-объект создан в памяти
                        if (limb_ == -1)
                        {
                            return(-2);
                        }
                        if (limbs[limb_] == null)
                        {
                            return(-3);
                        }

                        // временные перменные
                        string a1 = "", a2 = "", a3 = "", a4 = "";

                        // получаем все слова в строке
                        a1 = GetFirstWord(a_buff, GlobalStringFrom);
                        a2 = GetFirstWord(a_buff, GlobalStringFrom);
                        a3 = GetFirstWord(a_buff, GlobalStringFrom);
                        a4 = GetFirstWord(a_buff, GlobalStringFrom);

                        // преобразуем первое слово в номер полигона
                        int NomFace = System.Convert.ToInt32(a1);

                        // записываем номера вершин, которые опиывают полигон
                        limbs[limb_].t_face[0, NomFace] = System.Convert.ToInt32(a2);
                        limbs[limb_].t_face[1, NomFace] = System.Convert.ToInt32(a3);
                        limbs[limb_].t_face[2, NomFace] = System.Convert.ToInt32(a4);

                        continue;
                    }
                    }
                }
            }
            // пересохраняем количесвто полигонов
            count_limbs = limb_;

            // получаем ID для создаваемого дисплейного списка
            int nom_l = Gl.glGenLists(1);

            thisList = nom_l;
            // генерируем новый дисплейный список
            Gl.glNewList(nom_l, Gl.GL_COMPILE);
            // отрисовываем геометрию
            CreateList();
            // завершаем дисплейный список
            Gl.glEndList();

            // загрузка завершена
            isLoad = true;
            return(0);
        }
예제 #2
0
        // загрузка модели
        public int LoadModel(string FileName)
        {
            // модель может содержать до 256 под-объектов
            limbs = new LIMB[256];
            // счетчик скинут
            int limb_ = -1;

            // имся файла
            FName = FileName;

            // начинаем чтение файла
            StreamReader sw = File.OpenText(FileName);

            // временные буферы
            string a_buff = "";
            string b_buff = "";
            string c_buff = "";

            // счетчики вершин и полигонов
            int ver = 0, fac = 0;

            // если строка успешно прочитана
            while ((a_buff = sw.ReadLine()) != null)
            {
                // получаем первое слово
                b_buff = GetFirstWord(a_buff, 0);
                if (b_buff[0] == '*') // определеям, является ли первый символ звездочкой
                {
                    switch (b_buff) // если да, то проверяем какое управляющее слово содержится в первом прочитаном слове
                    {
                        case "*MATERIAL_COUNT": // счетчик материалов
                            {
                                // получаем первое слово от символа указанного в GlobalStringFrom
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                                int mat = System.Convert.ToInt32(c_buff);

                                // создаем объект для текстуры в памяти
                                text_objects = new TexturesForObjects[mat];
                                continue;
                            }

                        case "*MATERIAL_REF": // номер текстуры
                            {
                                // записываем для текущего под-объекта номер текстуры
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                                int mat_ref = System.Convert.ToInt32(c_buff);

                                // устанавливаем номер материала, соответствующий данной модели.
                                limbs[limb_].SetMaterialNom(mat_ref);
                                continue;
                            }

                        case "*MATERIAL": // указание на материал
                            {
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                                mat_nom = System.Convert.ToInt32(c_buff);
                                continue;
                            }

                        case "*GEOMOBJECT": // начинается описание геметрии под-объекта
                            {
                                limb_++; // записываем в счетчик под-объектов
                                continue;
                            }

                        case "*MESH_NUMVERTEX": // количесвто вершин в под-объекте
                            {
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                                ver = System.Convert.ToInt32(c_buff);
                                continue;
                            }

                        case "*BITMAP": // имя текстуры
                            {
                                c_buff = ""; // обнуляем временный буффер

                                for (int ax = GlobalStringFrom + 2; ax < a_buff.Length - 1; ax++)
                                    c_buff += a_buff[ax]; // считываем имя текстуры

                                text_objects[mat_nom] = new TexturesForObjects(); // новый объект для текстуры

                                text_objects[mat_nom].LoadTextureForModel(c_buff); // загружаем текстуру

                                continue;
                            }

                        case "*MESH_NUMTVERTEX": // количество текстурных координат, данное слово говорит о наличии текстурных координат - следовательно мы должны выделить память для них
                            {
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                                if (limbs[limb_] != null)
                                {
                                    limbs[limb_].createTextureVertexMem(System.Convert.ToInt32(c_buff));
                                }
                                continue;
                            }

                        case "*MESH_NUMTVFACES":  // память для текстурных координат (faces)
                            {
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);

                                if (limbs[limb_] != null)
                                {
                                    // выделяем память для текстурныйх координат
                                    limbs[limb_].createTextureFaceMem(System.Convert.ToInt32(c_buff));
                                }
                                continue;
                            }

                        case "*MESH_NUMFACES": // количество полиговов в под-объекте
                            {
                                c_buff = GetFirstWord(a_buff, GlobalStringFrom);
                                fac = System.Convert.ToInt32(c_buff);

                                // если было объвляющее слово *GEOMOBJECT (гарантия выполнения условия limb_ > -1) и были указаны количство вершин
                                if (limb_ > -1 && ver > -1 && fac > -1)
                                {
                                    // создаем новый под-объект в памяти
                                    limbs[limb_] = new LIMB(ver, fac);
                                }
                                else
                                {
                                    // иначе завершаем неудачей
                                    return -1;
                                }
                                continue;
                            }

                        case "*MESH_VERTEX": // информация о вершине
                            {
                                // под-объект создан в памяти
                                if (limb_ == -1)
                                    return -2;
                                if (limbs[limb_] == null)
                                    return -3;

                                string a1 = "", a2 = "", a3 = "", a4 = "";

                                // полчучаем информацию о кооринатах и номере вершины
                                // (получаем все слова в строке)
                                a1 = GetFirstWord(a_buff, GlobalStringFrom);
                                a2 = GetFirstWord(a_buff, GlobalStringFrom);
                                a3 = GetFirstWord(a_buff, GlobalStringFrom);
                                a4 = GetFirstWord(a_buff, GlobalStringFrom);

                                // преобразовываем в целое цисло
                                int NomVertex = System.Convert.ToInt32(a1);

                                // заменяем точки в представлении числа с плавающей точкой, на запятые, чтобы правильно выполнилась функция
                                // преобразования строки в дробное число
                                a2 = a2.Replace('.', ',');
                                a3 = a3.Replace('.', ',');
                                a4 = a4.Replace('.', ',');

                                // записываем информацию о вершине
                                limbs[limb_].vert[0, NomVertex] = (float)System.Convert.ToDouble(a2); // x
                                limbs[limb_].vert[1, NomVertex] = (float)System.Convert.ToDouble(a3); // y
                                limbs[limb_].vert[2, NomVertex] = (float)System.Convert.ToDouble(a4); // z

                                continue;

                            }

                        case "*MESH_FACE": // информация о полигоне
                            {
                                // под-объект создан в памяти
                                if (limb_ == -1)
                                    return -2;
                                if (limbs[limb_] == null)
                                    return -3;

                                // временные перменные
                                string a1 = "", a2 = "", a3 = "", a4 = "", a5 = "", a6 = "", a7 = "";

                                // получаем все слова в строке
                                a1 = GetFirstWord(a_buff, GlobalStringFrom);
                                a2 = GetFirstWord(a_buff, GlobalStringFrom);
                                a3 = GetFirstWord(a_buff, GlobalStringFrom);
                                a4 = GetFirstWord(a_buff, GlobalStringFrom);
                                a5 = GetFirstWord(a_buff, GlobalStringFrom);
                                a6 = GetFirstWord(a_buff, GlobalStringFrom);
                                a7 = GetFirstWord(a_buff, GlobalStringFrom);

                                // получаем нмоер полигона из первого слова в строке, заменив последний символ ":" после номера на флаг окончания строки.
                                int NomFace = System.Convert.ToInt32(a1.Replace(':', '\0'));

                                // записываем номера вершин, которые нас интересуют
                                limbs[limb_].face[0, NomFace] = System.Convert.ToInt32(a3);
                                limbs[limb_].face[1, NomFace] = System.Convert.ToInt32(a5);
                                limbs[limb_].face[2, NomFace] = System.Convert.ToInt32(a7);

                                continue;

                            }

                        // текстурые координаты
                        case "*MESH_TVERT":
                            {
                                // под-объект создан в памяти
                                if (limb_ == -1)
                                    return -2;
                                if (limbs[limb_] == null)
                                    return -3;

                                // временные перменные
                                string a1 = "", a2 = "", a3 = "", a4 = "";

                                // получаем все слова в строке
                                a1 = GetFirstWord(a_buff, GlobalStringFrom);
                                a2 = GetFirstWord(a_buff, GlobalStringFrom);
                                a3 = GetFirstWord(a_buff, GlobalStringFrom);
                                a4 = GetFirstWord(a_buff, GlobalStringFrom);

                                // преобразуем первое слово в номер вершины
                                int NomVertex = System.Convert.ToInt32(a1);

                                // заменяем точки в представлении числа с плавающей точкой, на запятые, чтобы правильно выполнилась функция
                                // преобразования строки в дробное число
                                a2 = a2.Replace('.', ',');
                                a3 = a3.Replace('.', ',');
                                a4 = a4.Replace('.', ',');

                                // записываем значение вершины
                                limbs[limb_].t_vert[0, NomVertex] = (float)System.Convert.ToDouble(a2); // x
                                limbs[limb_].t_vert[1, NomVertex] = (float)System.Convert.ToDouble(a3); // y
                                limbs[limb_].t_vert[2, NomVertex] = (float)System.Convert.ToDouble(a4); // z

                                continue;

                            }

                        // привязка текстурных координат к полигонам
                        case "*MESH_TFACE":
                            {
                                // под-объект создан в памяти
                                if (limb_ == -1)
                                    return -2;
                                if (limbs[limb_] == null)
                                    return -3;

                                // временные перменные
                                string a1 = "", a2 = "", a3 = "", a4 = "";

                                // получаем все слова в строке
                                a1 = GetFirstWord(a_buff, GlobalStringFrom);
                                a2 = GetFirstWord(a_buff, GlobalStringFrom);
                                a3 = GetFirstWord(a_buff, GlobalStringFrom);
                                a4 = GetFirstWord(a_buff, GlobalStringFrom);

                                // преобразуем первое слово в номер полигона
                                int NomFace = System.Convert.ToInt32(a1);

                                // записываем номера вершин, которые опиывают полигон
                                limbs[limb_].t_face[0, NomFace] = System.Convert.ToInt32(a2);
                                limbs[limb_].t_face[1, NomFace] = System.Convert.ToInt32(a3);
                                limbs[limb_].t_face[2, NomFace] = System.Convert.ToInt32(a4);

                                continue;

                            }

                    }

                }

            }
            // пересохраняем количесвто полигонов
            count_limbs = limb_;

            // получаем ID для создаваемого дисплейного списка
            int nom_l = Gl.glGenLists(1);
            thisList = nom_l;
            // генерируем новый дисплейный список
            Gl.glNewList(nom_l, Gl.GL_COMPILE);
            // отрисовываем геометрию
            CreateList();
            // завершаем дисплейный список
            Gl.glEndList();

            // загрузка завершена
            isLoad = true;

            return 0;
        }