Сообщения на форуме пользователя Andrey (229 стр.)
Пять вопросов по исключениям в C, C++ и Windows | 2 фев. 2005 | 12:16 | #6 |
---|
Demiurg-HG
>Вопрос №3:
>Чем отличаются try...except от try...catch?
>Вопрос №4:
>В чем заключается реализация обработки исключений в
>try...except и try...catch. Т.е. какие команды стоят
>за этими ключевыми словами.
try...catch - стандартные исключения языка C++
__try ... __except - это для обработки системных исключений, расширения языка С++ для Windows
пример по исключениям
#include <excpt.h> //для работы блока __try ... __except #include <exception>//для std исключений #include <string> using namespace std; void func1() { try { //набор дествий //тут могут возникнуть различный исключительные ситуации } //ниже перхват различных исключений catch(const exception& e) { MessageBox(NULL, e.what(), "Поймано исключение", MB_OK); //дальнейшие действия } catch(int number) { MessageBox(NULL, Исключение типа int, "Поймано исключение", MB_OK); //дальнейшие действия } catch(const char* Message) { MessageBox(NULL, Message, "Поймано исключение", MB_OK); //дальнейшие действия } } //строка для сообщений string str; void func2() { __try { //вызов функции с обработкой исключений С++ func1(); } __except (EXCEPTION_EXECUTE_HANDLER) { //буфер char buf[10] = {'\0'}; str = "Серьезная исключительная ситуация, код исключения: "; itoa(GetExceptionCode(). buf, 10);//Возврат кода исключения в строку //в десятичном виде,лучше возвращать в шестнадцатиричном, //потом по спецфикации посмотреть что за исключение произошло str += buf; MessageBox(NULL, buf, "Ошибка", MB_OK); //дальнейшие действия } }
Моя первая консоль... | 2 фев. 2005 | 11:13 | #41 |
---|
Magvaj
>P.S. Andrey Я тебе сырец скинул, проверь почту...
а я уже посмотрел
>Вывод: организую с помощью DirectX.
Дело не в том на каком API писать...
>P.S. Andrey Я тебе сырец скинул, проверь почту...
а я уже посмотрел
>Вывод: организую с помощью DirectX.
Дело не в том на каком API писать...
Небольшой вопрос по Octree | 1 фев. 2005 | 14:58 | #24 |
---|
alex_r
//отображение дерева void Octree::Draw(vector<Vector3D>& verticles, OctreeNode *&node, const Frustum& frustum) { if (node == NULL) return; if (!frustum.BoundingBoxInFrustum(node -> GetBoundingBox())) return; node -> DrawBoundingBox(); for (register int i = 0; i < 8; i++) { //получить дочерний узел OctreeNode *childNode = node -> GetChildNode(i); if (childNode != NULL) //проверка нахождения в пирамиде видимости if (frustum.BoundingBoxInFrustum(childNode -> GetBoundingBox())) { node -> Draw(verticles, frustum); //рекурсивное отображение остальных узлов Draw(verticles, childNode, frustum); } } } |
Небольшой вопрос по Octree | 1 фев. 2005 | 14:54 | #23 |
---|
alex_r
>А ты как отрисовываешь? Код в студию (с)
вот как :
>А ты как отрисовываешь? Код в студию (с)
вот как :
//отображение узла void OctreeNode::Draw(vector<Vector3D>& verticles , const Frustum& frustum) { glEnable(GL_TEXTURE_2D); glColor3f(1.0f,1.0f,0.0f); int j = 0; for(int i = 0; i < int(verticles.size()); i += 3) { //Проверка на попадание в frustum if (!frustum.TriangleInFrustum(verticles[i], verticles[i + 1], verticles[i + 2])) continue; glBegin(GL_TRIANGLES); glTexCoord2f(0.0f, 1.0f); glNormal3fv(&scene.GetNormals()[j][0]); glVertex3fv(&verticles[i][0]); glTexCoord2f(1.0f, 1.0f); glNormal3fv(&scene.GetNormals()[j][0]); glVertex3fv(&verticles[i + 1][0]); glTexCoord2f(1.0f, 0.0f); glNormal3fv(&scene.GetNormals()[j][0]); glVertex3fv(&verticles[i + 2][0]); glEnd(); j ++; } glDisable(GL_TEXTURE_2D); } |
А построение правильное?
Небольшой вопрос по Octree | 1 фев. 2005 | 14:33 | #21 |
---|
Keysall
>2 не передавай frustum тем более по ссылке а имей глобальный
блин у меня ООП подход.так уже не получиться...у меня все в классы инкапсулировано...
почему по ссылке плохо, тем более по константной?
>3 избавься в реалтайми от подобных вещей :node -> GetChildNode(i)
> получай доступ parent->childNode[i],childNode -> GetBoundingBox() на childNode->bbox
> ну для первого раза ... ;)
Ну спасибо вот над этим подумаю
насчет 19 поста у меня еще нету такого...я пока пробую по списку голых полигонов и 1 текстуре...
>2 не передавай frustum тем более по ссылке а имей глобальный
блин у меня ООП подход.так уже не получиться...у меня все в классы инкапсулировано...
почему по ссылке плохо, тем более по константной?
>3 избавься в реалтайми от подобных вещей :node -> GetChildNode(i)
> получай доступ parent->childNode[i],childNode -> GetBoundingBox() на childNode->bbox
> ну для первого раза ... ;)
Ну спасибо вот над этим подумаю
насчет 19 поста у меня еще нету такого...я пока пробую по списку голых полигонов и 1 текстуре...
Небольшой вопрос по Octree | 1 фев. 2005 | 14:27 | #20 |
---|
Keysall
Выводиться теперь геометрия и боксы тоже FPS был около 70-80 стал 30 и меньше...
чем больше глубина тем меньше Fps
Выводиться теперь геометрия и боксы тоже FPS был около 70-80 стал 30 и меньше...
чем больше глубина тем меньше Fps
Небольшой вопрос по Octree | 1 фев. 2005 | 13:41 | #15 |
---|
Keysall
так только что исправил ошибку стало выводиться только появилась другая проблема.FPS дико упал...
так только что исправил ошибку стало выводиться только появилась другая проблема.FPS дико упал...
Небольшой вопрос по Octree | 1 фев. 2005 | 13:37 | #14 |
---|
загвоздка в том что ничего невыводиться.Ты можешь на код глянуть?
комментариев много я подскажу что нипонятно...
комментариев много я подскажу что нипонятно...
Небольшой вопрос по Octree | 1 фев. 2005 | 13:27 | #11 |
---|
Keysall
спасибо конечно но ничео мне не помогло...ладно буду сам думать...
спасибо конечно но ничео мне не помогло...ладно буду сам думать...
Небольшой вопрос по Octree | 1 фев. 2005 | 13:16 | #8 |
---|
Еще я забыл сказать что Bounding Box'ы отображаются но дочерние отображаются только в одном месте.Счем это связано с отсутсвием полигонов или неправильным построением?
Небольшой вопрос по Octree | 1 фев. 2005 | 12:29 | #7 |
---|
построение дерева:
Вот так обрабатываю узел
вот так отображаю дерево:
Вопрос у меня не отображается сцена.Скажите что я делаю неправильно?Если надо еще запостить какой-то колд скажите я запостю.
Спасибо всем заранее.
Прошу не пинать если что ни так,я реализацию Octree делаю в первый раз.Просьба не предлагать ссылки, я много почитал.
Я хочу знать что у меня не так в моем коде.
С уважением Андрей.
//построение octree void Octree::BuildOctTree(const vector<Vector3D>& verticles) { if (root == NULL) { root = new OctreeNode; //Создать Bounding Box для коневого узла из набора вершин root -> GetBoundingBox().CreatFromVertices(verticles); } //начинаем с корневого узла ProcessingNode(verticles, root); } |
//Обработка узла void Octree::ProcessingNode(const vector<Vector3D>& verticles, OctreeNode *&node) { //дерево построено if (build) return; //проверка числа узлов if (NumberNode > 4096) { //дерево построено build = true; MessageBox(NULL,"Зазбиение закончено", "Информация", MB_OK); return; } //обработка //разбить на 8 боксов бокс узла SplitterOn8BoundingBox(node); //увеличить число дочерних узлов NumberNode += 8; //цикл по 8 дочерним узлам for (int i = 0; i < 8; i++) { //получить указатель на i-го потомка узла OctreeNode *childNode = node -> GetChildNode(i); //получить указатель на ограничивающее тело AABB *BoundingBox = &childNode -> GetBoundingBox(); //цикл по полигонам for (int j = 0; j < int(verticles.size()); j+=3) { //Вершина 1 Vector3D vert0 = verticles[i]; //Вершина 2 Vector3D vert1 = verticles[i + 1]; //Вершина 3 Vector3D vert2 = verticles[i + 2]; //проверить нахождение 3 точек полигона в ограничивающем теле if (BoundingBox -> contains(vert0, vert1, vert2)) //добавить индекс в узел childNode -> AddIndexPoligon(j); } //Обработка дочернего узла узла ProcessingNode(verticles, childNode);//рекурсия } } |
//отображение дерева void Octree::Draw(const vector<Vector3D>& verticles, OctreeNode *&node, const Frustum& frustum) { if (node == NULL) return; //проверка нахождения в ирамиде видимости if (!frustum.BoundingBoxInFrustum(node -> GetBoundingBox())) return; //отображение Bounding Box'а для отладки node -> DrawBoundingBox(); //Цикл по дочерним узлам for (register int i = 0; i < 8; i++) { //получить дочерний узел OctreeNode *childNode = node -> GetChildNode(i); if (childNode != NULL) //проверка нахождения в пирамиде видимости if (frustum.BoundingBoxInFrustum(childNode -> GetBoundingBox())) { node -> Draw(verticles, frustum); //рекурсивное отображение остальных узлов Draw(verticles, childNode, frustum); } } } |
Спасибо всем заранее.
Прошу не пинать если что ни так,я реализацию Octree делаю в первый раз.Просьба не предлагать ссылки, я много почитал.
Я хочу знать что у меня не так в моем коде.
С уважением Андрей.
Небольшой вопрос по Octree | 1 фев. 2005 | 12:29 | #6 |
---|
Привет всем!!
вот еще вопрос по построению дерева.Пока эксперементирую по готовому списку верши вот такого вида:
само Octree дерево описываю вот так:
вот еще вопрос по построению дерева.Пока эксперементирую по готовому списку верши вот такого вида:
49.500000 0.000000 50.000000
49.500000 0.000000 -50.000000
50.500000 0.000000 -50.000000
3 вершины это полигон.надеюсь это понятно...
Узел Octree дерева выглядет вот так:
//класс узла octree class OctreeNode { private: //ограничивающее тело AABB Box; //индексы vector<int> indexs; //дети узла OctreeNode *child[8]; public: //отрисовка BoundingBox'а void DrawBoundingBox(); //отображение узла void Draw(const vector<Vector3D>& verticles , const Frustum& frustum); //добавить индекс void AddIndexPoligon(const int index) { indexs.push_back(index); } //возвратить указатель на i-сына OctreeNode* GetChildNode(const int i) { return child[i]; } //присвоить новый узел void SetChild(OctreeNode* node, int index) { child[index] = node; } //возвратить ограничивающее тело AABB& GetBoundingBox() { return Box; } OctreeNode() { //обнуление указателей ZeroMemory(child, sizeof(child)); }; ~OctreeNode() { //рекурсивное уаление for (int i = 0; i < 8; i++) { if (child[i]) delete child[i]; child[i] = NULL; } }; };
class Octree { private: //массив вершин vector<Vector3D> verticles; //флаг окончания построения дерева bool build; //число созданных узлов int NumberNode; //узел дерева OctreeNode *root; //Разбиение родительского узла на Bounding Box'ы //по параметрам родительского узлана void SplitterOn8BoundingBox(OctreeNode *node); //Обработка узла void ProcessingNode(const vector<Vector3D>& verticles, OctreeNode *&node); //отображение дерева void Draw(const vector<Vector3D>& verticles, OctreeNode *&node, const Frustum& frustum); public: //установка ссылки на вершины void SetVerticles(vector<Vector3D>& Verticles) { verticles = Verticles; } //отображения void Draw(Camera& camera) { Draw(verticles, root, camera.GetFrustum()); } //построение octree void BuildOctTree(const vector<Vector3D>& verticles); Octree() : root(NULL), NumberNode(0), build(false) {}; ~Octree() { delete root; root = NULL; }; }; |
Обработка ошибок. | 1 фев. 2005 | 9:13 | #1 |
---|
GrafLestat
я делаю в плагине экспорта ловлю исключения языка С++ и системные:
//Обработка узла void ModelSaver::ProcessingNode(INode* node) { try { //... } catch(const exception& e) { //Выход c сообщение об ошибке Exit(e.what(), 11); } } //функция экспорта int ModelSaver::callback(INode *node) { __try { ProcessingNode(node); } //перехват системных исключительных ситуаций __except (EXCEPTION_EXECUTE_HANDLER) { MessageBox(NULL, "Произошла серьезная исключительная ситуация", "Ошибка при экспорте", MB_OK); //Вывод в лог сообщения outLog << "Произошла серьезная исключительная ситуация код:" << GetExceptionCode() << endl; //Закрыть файлы Close(); //выход PostQuitMessage(GetExceptionCode()); //выход с неудачей return TREE_ABORT; } return TREE_CONTINUE; } |
При таком подходе(практически при любой ошибке) плагин корректно завершает свою работу не сваливая 3D Studio Max.
Моя первая консоль... | 1 фев. 2005 | 9:03 | #38 |
---|
dub
>Аккуратнее с матом (см. свой пост #31).
А какой мат? :))))
>Аккуратнее с матом (см. свой пост #31).
А какой мат? :))))
Архитектура движка | 1 фев. 2005 | 9:01 | #7 |
---|
aruslan
>впрочем, рекомендую перечитать Песнь Песней, монологи Гамлета, четвертый сон Веры Павловны и Экклезиаста.
Ты как всегда :)))))
JlaMeP
Что могу посоветовать:
1.Для начала определись что ты хочешь от движка, поставь задачу.
2.Определи основные классы нужные для его реализации.
3.Распредели между ними обязанности и взаимодействие.Для этого можно нарисовать на бумаге их взаимодействие,либо изучить UML и с помощью диаграмм все изобразить это помогает
4.Для начала не пробуй писать супер-пупер навороченный движок.
>впрочем, рекомендую перечитать Песнь Песней, монологи Гамлета, четвертый сон Веры Павловны и Экклезиаста.
Ты как всегда :)))))
JlaMeP
Что могу посоветовать:
1.Для начала определись что ты хочешь от движка, поставь задачу.
2.Определи основные классы нужные для его реализации.
3.Распредели между ними обязанности и взаимодействие.Для этого можно нарисовать на бумаге их взаимодействие,либо изучить UML и с помощью диаграмм все изобразить это помогает
4.Для начала не пробуй писать супер-пупер навороченный движок.
Удачи.