| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > Движок на пальцах "От" и "До" |
| Автор: Rickert 19.10.2008, 15:06 | ||||||||||||
Сегодня мы поработаем над парой базовых классов для нашего проекта. А именно:
Я советую вам создать пустой “win32 console” проект и в нём время от времени дебажить некие маленькие алгоритмы. В частности, сейчас будем писать класc строки. Называйте, как хотите, а у меня это класс “aString”. Что должен будет уметь наш класс?
Вообщем – то здесь всё прозрачно и ясно. Конкретная реализация идёт дальше: тут вам придётся поработать самим в некоторых местах. astring.cpp
Получается, что в первой нашей части теории практической никакой нет: просто отрабатываем общие принципы создания классов и включаем воображалку. Идём дальше. Двусвязанный список Он состоит из одного файла описания, потому что будет основан на шаблонах. aList.h
Помните: чем больше исключений вы обработаете и отбросите – тем стабильнее будет ваш код. В идеале, программист должен уметь предусмотреть абсолютно все варианты, которые могут привести к крушению приложения. Дальше, по программе – чай с сахаром, а затем маленький класс вектора, который будет использован для больших деяний ;-) avector.h
Ну и файл реализации (avector.cpp):
Слов и аналитики мало, потому что тут голые и незамороченные факты. Спрашивайте, пишите, подскажу, если что ;-) Да прибудет с вами великая сила! Добавлено @ 15:11 Поиграйтесь с классами, поищите баги у меня в коде, предложите свои улучшения, научитесь всем пользоваться: вы большие мальчики/девочки - сможете. |
| Автор: AntonN 19.10.2008, 21:41 |
| хотяб привели примеры, для чего это нужно... вообще, если это цикл статей стоило бы начать с общего обзора функций движка (и вообще что это такое общими словами), постепенно переходя к более низкоуровневым операциям (как например предложенный код). |
| Автор: Lazin 19.10.2008, 22:29 |
| для чего нужны строки, или списки? ну и тем более совсем непонятно для чего в графическом движке может пригодится класс вектор для танкистов: это была ирония |
| Автор: AntonN 19.10.2008, 22:56 |
| Lazin, хоть и ирония - выскажусь Не списки - а двусвязные списки. И почему списки (и разница в односвязном и двусвязном), а не массивы, чем отличаются, что где лучше применять. Зачем нужен вектор, что это вообще такое. Почему нет примера его использования (это ведь "на пальцах" "От и До") Да и про "графический" ничего не сказано. PS Автор сам сказал "спрашивайте, пишите" |
| Автор: Lazin 19.10.2008, 23:33 |
это точка, в 3-х мерном пространстве(разве названия переменных - x, y, z не вызвали поозрений?), правда у Rickert-а он реализован неканоничъно |
| Автор: AntonN 19.10.2008, 23:40 |
| Lazin, не обязательно в трехмерном. Я знаю что такое вектор (в контексте геймдевелопмента), я про то, что в статье "движок на пальцах От и До" ожидалось объяснения, что такое вектор и чем он лучше хотя бы "обычных" переменных углов и значения скорости, и хотя бы внятный пример использования. |
| Автор: Lazin 20.10.2008, 08:07 |
Обычно, для преобразования координат используют матрицы, для двухмерного случая, сам вектор должен быть 3х мерным |x, y, 1|' а матрица описывающая преобразования ад ним должна быть размерности 3х3, в этом случае любое преобразование над координатами можно получить умножением вектора на соответствующую матрицу, помимо этого такие матрицы можно перемножать, это очень удобно, так как не нужно писать ф-ю поворачивающую вектор на нужный угол, ф-ю смещающую по х и по у и тд.. к тому-же если действий много, достаточно просто перемножить матрицы которыми эти действия описываются, а потом с помощью полученой матрицы преобразовать координаты вершин http://www.compgraphics.info/3D/3d_definitions.php |
| Автор: Rickert 20.10.2008, 08:26 |
| Lazin, и как это связано с нашим классом вектора? В чём неканоничность - я слова этого понять не могу? Да, для преобразований большенство использует умножение на матрицу (кстати не понимая что происходит с геометрической точки зрения), но что нам мешает применить матрицу к нашему вектору? Я это проделываю, и мы будем это проделывать без каких - либо проблем. |
| Автор: Lazin 20.10.2008, 08:44 |
мне это слово нравится просто в этом классе нет метода для умножения на матрицу, что не очень удобно, вот поэтому я так и сказал... |
| Автор: Rickert 20.10.2008, 09:08 |
| Вопрос того надо ли подобные методы прописывать в класс, или держите в спец. синглтоне обсуждался ни один раз. Тогда все вместе пришли к выводы, что вместо того чтобы забивать память под одну и туже процедуру тысячи раз, лучше написать единожды. |
| Автор: noKEmoH 30.10.2008, 23:14 |
| Если движок уже существует и находится в режиме отладки или оптимизации то, ничего... а если он на стадии разработки то я бы предложил в векторе место x y z использовать массив на 3 элемента, тогда не возникнет проблем прохождения массива векторов указателями. ps некоторые бояться напортачить указателями, если это так тогда тоже ничего. |
| Автор: Rickert 31.10.2008, 13:00 | ||
А зачем и чем это лучше? |
| Автор: noKEmoH 1.11.2008, 12:09 | ||||
у меня массив структур
неполучилось связать с функциями glVertexPointer ... glDrawElements, а
заработало без проблем |
| Автор: Rickert 1.11.2008, 12:12 |
| noKEmoH, а зачем его связывать? Модель (то что ты отображаешь), по определению состоит из вершин, а не векторов. Мухи - отдельно, котлеты - отдельно. |
| Автор: noKEmoH 1.11.2008, 15:32 |
| ну у меня векторы и вершины используют одну структуру основной элемент которой m[3]; Хотя можно и написать для вершин и векторов отдельные классы. |
| Автор: Rickert 1.11.2008, 20:58 |
| noKEmoH, это значит ты неправильно архитектуру строишь. Всё должно быть логично, ибо программирование - это логика в чистом виде. Не надо никаких классов вершин. Просто когда ты будешь делать класс модели, заводи указатель на тип float и пиши в память вершины. |
| Автор: mr.DUDA 5.11.2008, 10:06 |
| Хорошее начинание, годится для написания небольшого трактата на тему "сферический конь в вакууме". Можно присоединиться? Движок "сферический конь в вакууме (СКВВ) для DirectX": 1. СКВВ состоит из основных подсистем: графика, физика, игровая логика (AI если угодно), звук, работа с данными (загрузка-выгрузка ресурсов). Рассматриваем только графику, остальное пока отбросим. 2. Графическая подсистема функционально представляет собой бесконечный цикл, в котором отрисовывается кадр. Структурно это набор классов, где присутствуют следующие основные понятия:
Для каждого 3D объекта в сцене рендерер выполняет:
7. Что ещё нужно для отрисовки геометрии. Вершина состоит из произвольного (определяемого программистом) набора данных (position, normal и т.п.), можно представлять её себе как массив из разного типа элементов. Например: Vector3 (XYZ вектор из 3х float-ов), Single (один флоат), Vector4, ushort и другие. Для указания формата вершины, вводится понятие vertex declaration - массив описателей формата и семантики каждого элемента вершины. Без установки Vertex declaration на девайс отрисовать вершинный буфер нельзя 8. Как считать мировую матрицу и что это вообще такое. Для преобразования координат вершины в экранные координаты, выполняется трансформация "local->world->view->projection", где "local" - это координаты вершины взятые из вершинного буфера, "world" - координаты после мировой трансформации или мировые координаты. Мировые координаты - это позиция вершины в общем 3D пространстве сцены. Все 3D объекты содержат текущую позицию в мировом пространстве. Матрица трансформации для перевода в мировые координаты расчитывается как произведение трёх матриц: масштабирование, поворот, сдвиг. Первое действие соответствует размеру 3D объекта, второе - ориентации в пространстве, третье - позиции в мировых координатах. Оставшиеся две трансформации "view" и "projection" соответствуют камере и размерам окна на экране. 9. Что делает вершинный шейдер для вычисления экранных координат. В вершинный шейдер попадают данные одной вершины, разбитые на элементы (position, normal и т.п.), взятые из вершинного буфера в соответствии с форматом указанным в vertex declaration. Шейдер получает position (это вектор из 3 или 4 флоатов) и трансформирует с пом. матрицы "local->world->view->projection" (обычно local пропускают и называют эту матрицу worldViewProjection). Матрица worldViewProjection считается способом описанным выше и представляет собой матрицу 4x4 флоатов. Результат трансформации - вектор XYZW, где первые три координаты делённые на четвёртую дают позицию на экране и значение Z для теста глубины. Этот вектор ещё называют однородными координатами или position in clip space или position in homogenous clip space. Матрица worldViewProjection (как и другие данные, на усмотрение программиста) передаётся в шейдер через набор глобальных переменных - из называют константами шейдера. 10. Что делает пиксельный шейдер для вычисления цвета пиксела. Пиксельшейдер принимает доп. данные от вершинного шейдера и имеет в своём распоряжении доступ к текстурам а также константам пиксельшейдера. На основании этого можно к примеру взять пиксел из текстуры по текстурным координатам принятым из вертексшейдера, "осветить" умножением на интенсивность и цвет источника света и вывести в результат. 11. Ну и так далее, рандомные мысли приходящие в голову. |
| Автор: Rickert 5.11.2008, 11:20 |
| mr.DUDA, никакого рандома в этом нет. Если ты считаешь что сначала надо рассказывать людям об инициализации окна, не имея базовых классов, вставлять фразы типа "а вот это мы напишем потом" - то пожалуйста напиши свою статью, но ведь ты этого не сделал |
| Автор: mr.DUDA 5.11.2008, 15:18 | ||
Rickert, если со строк начинать, то большой шанс завязнуть в деталях и так никогда и не добраться до верхнего уровня. Цель моего поста - показать что можно просто объяснить народу основные принципы программирования 3D-графики, хотя бы охватить главные понятия, без которых любая попытка программирования превратится в копипаст. Скомпилировать чужой код и увидеть как он работает это хорошо, но написать свой - ещё лучше.
Про инициализацию не говорилось ни слова, было упоминание что девайс связан с окном, в порядке объяснения что за девайс такой. В таком же духе всё можно разложить по полочкам, потом набросать простой пример игрового цикла ну и так далее. Ни в коем случае не буду мешать, на собственную статью у меня усидчивости не хватит P.S. если не в тему влез, могу удалить свой пост |
| Автор: AntonN 5.11.2008, 18:03 | ||
mr.DUDA,
уже на это намекалось, как я понял, статья пишется для себя, а не как учебник. |
| Автор: Rickert 6.11.2008, 06:13 | ||||||
Значит ты предолгаешь строить дом с крыши?
Невнимательно читал: 1/5 кода я оставляю за читателем, и если он его не напишет сам - то не сможет ничего делать дальше. Копи/паст тут не прокатит. К тому же объяснений принципов и теории люди в яндексе и гугле найти могут. Я конечно велосипедист, но не до такой степени.
С этим согласен, к этому и идём. В споре рождается истина, мой друг |
| Автор: AntonN 6.11.2008, 11:54 | ||
Rickert,
нет, он предлагает начать с понятия "дом", "несущщие стены", "фундамент", а не с понятий "кирпич", "дверная ручка" и "решетка для вентиляции" |
| Автор: Rickert 6.11.2008, 12:19 | ||
не считаешь что начать с кирпича и бетона логичнее? |
| Автор: AntonN 6.11.2008, 12:59 |
| Нет, конечно, я считаю для начала "От и ДО" должны ввести понятия "дом", "фундамент". А потом уже переходить к кирпичам и дверным ручкам. PS Конечно это только мое имхо. |
| Автор: Rickert 6.11.2008, 17:39 |
| AntonN, дом и фундамент из чего строят? Из кирпичей или из домов и фундаментов? |
| Автор: AntonN 6.11.2008, 20:02 |
| дом стоят по плану. не нужно так однобоко смотреть. ADD В общем, если нет желания понять и пересмотреть свою точку зрения, предлагаю оффтоп прекратить |
| Автор: mr.DUDA 7.11.2008, 02:19 |
Смотря для чего, опять же. И для кого объяснять.. Если для строителя-ремесленника, то можно показать что такое кирпич и из чего делается раствор, и как они совмещаются. Ну и дальше как кирпичи укладывать между собой и как стену ложить. Отсюда наверное можно объяснить, как дом строится, но на примере конкретного дома (в котором мы стенку вначале строили из кирпичей), и более-менее понять как там остальные части сделаны и склеены. Но на такой дом уйдёт много времени, т.к. строителю придётся показывать не только как кирпич кладут, а ещё и как провода устроены (электричество провести, розетки поставить), из чего трубы делают (канализацию и водопровод провести), как обои клеить наиболее оптимальным способом, где какую краску и шпаклёвку использовать, какие уголки для плинтусов юзать, как правильно двери навешивать... ну и так далее, улавливаешь идею? Это на годы растянется, и толку - чуть! С другой стороны, давай-ка мы объясним что такое архитектурный проект, как вообще проектируются здания, из чего состоят, какие этапы при строительстве проходят и какие материалы в общем требуются на постройку. На примере отдельного сарая покажем как сооружение возводят и какую технику используют. На общем примере здания растусуем, какие подходы используют для строительства произвольного здания. Разницу видишь? От общего к частностям а не наоборот - вот правильный подход. Если ты не в состоянии охватить общую картину, донести её в сжатом виде к аудитории, значит тебе придётся рано или поздно столкнуться с тем что ты упрёшься в вопрос "а что дальше?". От строк, списков и более сложных вопросов выйти на охват всего игрового движка - очень маловероятно; двигаясь в обратном направлении - запросто. |
| Автор: Rickert 7.11.2008, 04:07 |
| Вообще пусть каждый пишет так, как считает нужным Я выбрал такой путь - как мне кажется так дома не строили ещё. А что получится на выходе - увидим. |
| Автор: noKEmoH 7.11.2008, 13:10 |
| Rickert короче чтобы не цеплялись, на главной странице напиши примерную структуру классов с описанием, что и зачем нужно, и все будет |
| Автор: Rickert 9.11.2008, 14:17 | ||
Нет, не буду, пусть цепляются, а то людям заняться нечем будет |
| Автор: mr.DUDA 9.11.2008, 19:48 |
| Rickert, давай просим !!!!!!!!!!!!!!!!!!! |
| Автор: arilou 11.11.2008, 14:00 |
| Rickert, ты не прав в том, что чтобы написать свой класс rickert::string не нужно ставить перед собой цель сделать движок. А mr.DUDA прав в том, что разрабатывать систему нужно от общего к частному. И описание, которое он привел - это реальный результат работы над 3D движком. Обратный пример (от частного к общему) у нас с ним перед глазами, можешь поверить на слово |
| Автор: Rickert 11.11.2008, 16:18 |
| arilou, путь к взлёту лежит через школу, тренажёры, наземную практику и тысячи - тысячи других процедур |
| Автор: arilou 11.11.2008, 20:39 | ||
которые никакого отношения не имеют к геймдеву |
| Автор: AntonN 11.11.2008, 22:00 |
| оставьте человека в покое, он уже сказал, что ничего менять не будет |
| Автор: Ryoga 12.11.2008, 01:54 |
| Скорее соглашусь с последним оратором. Каждый имеет право на свой путь в геймдеве. |
| Автор: nerezus 16.11.2008, 11:34 |
| Эм, а можно вопрос: зачем оно надо, если оно дублирует СТАНДАРТНЫЕ классы языка C++? Нет, я конечно понимаю, что НЕКОТОРЫМ нубам влом учить стандартные классы, но таких далеко не большинство. Да и собственный костыль НЕ упростит им задачу, но создаст сложности тем, кто уже знает C++(как минимум время на изучение класса) |
| Автор: noKEmoH 16.11.2008, 14:21 |
| ...а когда я писал двигло, мне говорили зачем пишеш есть ирлич готовый, есть нубала готовый, бери и юзай... |
| Автор: nerezus 16.11.2008, 20:33 |
| noKEmoH, разные ситуации. В одной ситуации старая штука не удовлетворяет требованиям и надо писать новую с абсолютно другой структурой, в другой же достаточно добавить пару необходимых методов в стандартный класс. |
| Автор: noKEmoH 17.11.2008, 14:21 |
| понимаю, свой класс никогда не будет быстрее стандартных, но всетаки он будет свой |
| Автор: nerezus 17.11.2008, 14:26 | ||
1) неотлажен 2) недокументирован 3) нераспространен |
| Автор: Ryoga 17.11.2008, 15:59 |
| Собственно почему не будет быстрее? Стандартные то классы должны быть написаны для общих случаев и не факт, что на каком-то примере, который имеет место быть в пишущейся программе, этот класс будет быстрее, чем тот, который будет написан самостоятельно под конкретную задачу. Так что, иногда можно и свой класс написать, если уж задача реально требует экономии в каких-либо местах, иначе безбожно тормозит. А так, лучше использовать проверенное старое, по тем причинам, что обозначены выше. Короче, начинать лучше со стандартных средств. Думаю это всего касается. |
| Автор: noKEmoH 17.11.2008, 23:50 |
| ну вобщем да, итераторы тормознее указателей. А насчет минусов несогласен, я думаю что куча народу на форуме тут же обругает и ткнет носом в не отлаженые баги. Какая - никакая, а документация ведется да и распространение будет по крайней мере частью читателями темы. А зачем нужны аналоги стандартных классов, и насколько они полезны можно будет узнать после последней компиляции всего движка. ...надо погодить со спорами... |
| Автор: Rickert 18.11.2008, 05:07 | ||
1) Никто не сказал что вам подадут блюдечко с голубой коёмочкой, а на нём движок. 2) Смеётесь? Что тут документировать? Спорные моменты, где так сразу не въедешь что и как происходит - рассказал. 3) Тут дело за вами P.S. Со след. статьёй сильно задерживаюсь, простите: личные заморочки. |
| Автор: Rickert 18.11.2008, 06:09 | ||
Ну вот и единомышленник. Кому приятно играть в игры, типа Crysis, bioshok - которые написаны для продажи? Вам нужно апгрейдить комп, вам нужно переплачивать деньги. А за что? За то что кто-то писал движок для продажи? Лично я убеждён, что для каждой игры должен быть свой "заточеный" движок, что игры делаются в первую очередь для игроков, а не для рынка. Ну а сейчас совсем другая мода. Ладно, носите туфли, а я буду ходить в практичных кедах Вообще есть идея основать фирму, которая бы занималась бесплатными играми серьёзного уровня. В процессе разработки и после выпуска игры, разместить кнопку аля "Donate" - и пусть уж сами игроки оцениваю то на сколько хороша игра. На эти средства поддерживать сервер, и после, возможно, выдавать зп "работникам". Понимаю, мало кто сейчас может разделить энтузиазм, но я не вижу другого варианта изменения современных событий в РИ. Да - да, много кто тут сейчас напишет "да писать движки под каждую игру - это монструозный труд, тем более в свободное время, нам работать надо". Ну вот и работайте, а я пока сколько играми занимаюсь: не видел задач настолько монструозных, чтобы не решить их. Просто человек - скотинка ленивая и ему проще пойти поваляться на диване, нежели напрячь свой мозг лишний раз. К тому: ну раз, другой поработаете с bsp-деревьями, и комбинированной скелетной анимацией - разберётесь и на всю жизнь запомните, а то как будето каждйы раз надо будет новые технологии сложнейшего уровня осваивать. "Планета вертится, потому что я в неё упираюсь!" |
| Автор: Lazin 18.11.2008, 06:20 |
детский сад |
| Автор: Ryoga 18.11.2008, 13:10 |
| Ооооооооой, Бог мой. -_- Да нет, детский сад, это пост перед этим. Где-то, по-моему, я это всё уже читал в соседних темах. Короче, Rickert, прежде чем гнуть пальцы сделайте хоть одну бесплатную игру "серьёзного уровня" по такой системе. Желательно удачную. Желательно не одну. И будет Вам почёт и уважение. Вот тогда и будете рассказывать, какие все кругом жадные, и какой Вы альтруист - иначе цена всем этим словам ноль. |
| Автор: Rickert 19.11.2008, 04:36 |
| Ryoga, считаете мои статьи не достаточно квалифицированными - не читайте. Любите использовать готовое - не читайте. Не нравится мой подход - не читайте. Считаете статьи детскими - напишите хоть что-нибудь сами. |
| Автор: arilou 19.11.2008, 11:20 | ||
|
| Автор: Ryoga 19.11.2008, 12:13 | ||
Rickert, мой комментарий касался не статьи, а вот этого замечательного сообщения, о чём я и написал.
Ждём Ваших игр. |
| Автор: Lazin 19.11.2008, 12:22 |
| мое утверждение касалось только того, что итераторы, якобы тормознее указателей... это только детям дошкольного возраста можно рассказывать |
| Автор: arilou 19.11.2008, 13:20 | ||
|
| Автор: Rpahut 21.11.2008, 22:10 |
| Флеймеры Rickert , жду третью часть |
| Автор: BalmaR 22.11.2008, 01:26 |
| Классные занятие, сам тока вливаюсь |
| Автор: Dobermann 22.11.2008, 01:53 |
| 3 часть |
| Автор: php 29.11.2008, 13:24 | ||
Вот это крруто, вот это аж меня воодушевило вернуться в игрострой даже - честно..!! Каков этузиазм просто поражает.. Rickert уважаю.. Я тут честно говоря забросил на пол года заниматься игростроем, перепрофилировался на написание клиент серверных программ и программ удалённого администрирования и всё это на Delphi, но теперь пожалуй продолжу заниматься и игростроем, также я как то обещал начать писать цикл статей и выкладывать свои наработки (движок) для всеобщего обсуждения, но у меня в один момент просто не хватило времени суета всякая, и произошло зацикливание разработки вообще на смешном - на банальной отрисовке пулевых отверстий на стенах.. Теперь по циклу статей, что начал писать Rickert, должен сказать что это пригодится как для базового понимания самого языка, стиля и метода программирования на С++, так и очень сильно пригодится впоследствии уже при написании самого движка особенно при написании GUI (так называемого графического пользовательского интерфейса) вывод и ввод текста при выводе игровой консольки к примеру, а написание GUI поверьте по собственному опыту говорю - это на самом деле очень сложная задача.. Статьи получились необычные конечно, но кое что я оттуда я подчерпнул интересное, да как сказать подчерпнул - узнал многое!, так что ждём продолжения. Rickert молодца так держать !!!! |
| Автор: nerezus 29.11.2008, 13:53 | ||||
Мне приятно. Прошел половину биошока на одном дыхании.
|
| Автор: php 29.11.2008, 14:37 |
| Кстати вот скриншоты моего движка того, что удалось добиться за это время.. конечно не супер пупер, но то что есть на данный момент.. Это скриншот из GR Engine 2.0 (2006 год) поддержка относительно небольшого кол-ва полигонов .. ![]() Это скриншоты уже из GR Engine 3.0 доработанная версия, поддержка большого кол-ва полигонов.. ![]() Pic. 1 ![]() Pic. 2 |
| Автор: Rickert 29.11.2008, 18:12 |
| "Земля крутится - потому что я в неё упираюсь" |
| Автор: Ryoga 29.11.2008, 19:51 |
| php, создайте себе тему отдельную - будете сообщать там о своих успехах по доработке движка. Было бы интересно. |
| Автор: php 30.11.2008, 07:01 |
| Обязательно создам только вот название какое бы придумать? "Программирование игрового движка" к примеру подойдет или нет как считаете ?? Почему именно программирование т.к описание будет вестись только по программному коду, создание и разработка 3D-моделей пока затрагиваться не будет (да и в данном разделе форума это и не обсуждается вроде!), т.к созданием моделей занимается другой человек, поэтому по всем аспектам создания и реализации той или иной 3D-модели, если что будет адресоваться к нему.. Вот его недавние наработки (боевой корабль Chu Untor, по мотивам вселенной StarWars!) Кол-во полигонов пока неизвестно, нужно будет уточнить у разработчика (по рисунку видно, что очень много), соответственно эта модель тоже будет впоследствии как тестовый вариант интегрироваться в GRE (GreenRay Engine) (С)Master Lucky ![]() |
| Автор: AntonN 30.11.2008, 12:25 | ||
а по моему так мало... |
| Автор: php 30.11.2008, 14:12 |
| Уверяю! Очень много, на рисунке палубы видите квадратиками идут это не текстура это всё модель, задние круглые двигатели тоже не картинка скриншот сделан из окна 3DS Max, впрочем гадать не будем узнаю точнее у самого разработчика.. |
| Автор: Ryoga 30.11.2008, 23:03 |
| php, в названии как-то укажите, что это Вы свой движок разрабатываете. |
| Автор: Rickert 1.12.2008, 04:31 |
| |
| Автор: php 1.12.2008, 05:01 | ||
Ну это уже всё имеется, собственно.. Rickert приносшу свои извинения, что развёл тут всю эту "бадягу" в вашем топике, удаляюсь.. |
| Автор: Master Lucky 22.4.2009, 05:51 | ||||||
Извиняюсь за офф топик, просто хочу встать на защиту своей модели. В модели 78 725 поликов и это она ещё выполнена на 30% AntonN это тебе мало?
|
| Автор: Rickert 22.4.2009, 07:14 |
| Master Lucky, для этого существуют личные сообщения. |