Создание реалистичной травы

Viewport display и Surface scattering

Viewport display содержит в себе настройки отображения распределяемых объектов в рабочей области. Previz type позволяет выбрать, как отображать все созданные объекты. Displayed показывает, сколько новых объектов будет отображаться в рабочей области. Но бывает так, что это значение работает не совсем корректно. Например, оно может показать чуть больше или чуть меньше объектов, чем должно. Icon size изменяет размер плоскости Corona Scatter. Это нужно исключительно для удобства взаимодействия. Параметр Points работает так же, как Displayed , но для типа отображения Point cloud. Так же можно выбрать автоматическое обновление (Update automatically) или ручное (снять галочку и нажимать Update now).

Surface scattering управляет объемом и типом располагаемых объектов. Параметр Count отвечает за реальное количество создаваемых объектов. Так же можно выбрать распределение по UV координатам, выбирать канал и настраивать. Но с такой необходимостью редко можно встретиться.

Punch Home Design — программа для дизайна дома и участка

Один из лучших наборов программ для планирования интерьера дома и проэктирования ландшафтного дизайна садового участка с удобными графическими инструментами.

Достоинствами данного программного комплекса являются:

  • высокая производительность и высокое качество рендеринга для 2D-геометрии;
  • сохранять и открывать файлы формата AutoCAD (DWG / DXF);
  • огромный выбор цветов, кустарников и деревьев, которые вы можете добавить в свой дизайн, такжеесть возможность добавить свои любимые растения в базу данных;
  • особенностью приложения является возможность увидеть, как спланированный вами участок будет смотреться со временем (через 1 год, 5, 10 лет);
  • предлагает предварительно рассмотреть, как будет создаваться тень в вашем саду от разных объектов и растений;
  • Возможность не только вставлять готовые объекты но и самим их создавать;
  • Совместим с новыми форматами Sketchup и позволяет редактировать объекты в программе;
  • Возможность вести смету обустройства участка.

Хотя данный софт платный, но  разработчики предоставляют 14-дневный пробный период. Ознакомительную версию планировщика ландшафта сада можно бесплатно скачать можно на официальном сайте.

Включение деталей

Кнопка details на панели инструментов включает заливку травой/деталями.

Изначально, у terrain нет доступной травы или деталей, но если вы нажмете на кнопку Edit Details в инспекторе, откроется меню с пунктами Add Grass Texture и Add Detail Mesh. Эти окна позволяют выбрать ассеты, которые вы хотите добавить к terrain’у для заливки.

For grass, the window looks like this:

Окно Add Grass Texture

The Detail Texture is the texture that represents the grass. A few suitable textures are included in the Unity Standard Assets downloadable from the Asset Store. You can also create your own. The texture is simply a small image with alpha set to zero for the empty areas. (“Grass” is a generic term, of course — you can use the images to represent flowers, brush and perhaps even artificial objects like barbed wire coils.)

Значения полей Min Width, Min Height, Max Width и Max Height задают верхние и нижние пределы размеров пучков генерируемой травы. Для создания более естественного вида, трава генерируется со случайными “шумными” шаблонами, которые имеют “проплешины”, засаженные травой.

Значение поля Noise Spread задает приблизительный размер чередующихся участков, большее значение определяет большее распределение в заданной области. Техническое замечание: шум на самом деле генерируется с использованием Perlin noise (шума Перлина); распределение шума ссылается на применённое масштабирование между x,y координатами на terrain’е и картинкой шума. Чередующиеся скопления травы считаются более свежими ближе к центру, чем на краях, и настройки Healthy/Dry Color задают цвета степени свежести травы.

Если опция Billboard включена, изображение травы будет всегда поворачиваться лицевой стороной к камере. Эта опция может быть полезна при создании густой травы, так как у неё нет “боковой” стороны. Но как бы там ни было, в случае редкой травы, вращение отдельных кустов будет заметно, и это создаст неприятный эффект.

Для мешей деталей, таких как камни, окно выбора выглядит так:-

Окно Add Detail Mesh

Значение поля Detail используется, чтобы выбрать префаб из проекта, который будет масштабирован в пределах Random Width и Random Height для каждого экземпляра. Параметры Noise Spread и Healthy/Dry Color делают тоже, что и в случае с травой (хотя концепт “свежести” несколько натянут, когда речь идёт о применении к таким объектам, как камни!). Выпадающий список Render Mode может быть установлен в состояние Grass или Vertex Lit. В режиме Grass Mode, экземпляры объектов детализации на сцене будут преобразованы в плоские двумерные изображения, которые ведут себя как трава. В режиме Vertex Lit, элементы детализации будут отрисованы как объемные объекты с вершинным освещением.

SpeedTree/LOD Trees

Зоны ветра

Раз уж речь зашла о террейнах…

Прежде, чем идти дальше, давайте разберемся в том, какая разбивка уровня у нас вообще существует.

Итак, типичная игровая карта в War Robots состоит из:

Террейна. Обычно так называют основную поверхность игровой локации, по которой перемещаются динамические игровые объекты, — она же и является базой для расстановки игровой статики. Но в нашем случае это не всегда так. Под террейном мы подразумеваем объекты, использующие материал с особым типом смешивания текстур, предназначенный для реалистичной имитации естественных поверхностей: скал, песчаных дюн, галечника, почвы, — но и не только. Также он может успешно использоваться и для имитации техногенных поверхностей: разбитого асфальта, брусчатки, заросших травой бетонных плит.

Пример террейна естественного типа — поверхность локации Valley

Игровой статики. Это участвующие в игровом процессе объекты, с которыми возможно «физическое» взаимодействие. Как правило, сюда относятся различные виды строений.

Пример игровой статики — здание с локации Valley

Крупной неигровой статики. Сюда относятся объекты, влияющие на визуальное восприятие локации, но не участвующие в игровом процессе и не допускающие физического взаимодействия: скалы в окружении локации, осветительные фермы за границей геймплейной зоны и т. д. Эти объекты нельзя отключить для увеличения производительности на слабых устройствах, а значит, они нуждаются в лодировании — процессе подмены объектов разного уровня детализации (LOD) в зависимости удаленности их от игровой камеры.

Пример крупной неигровой статики — скальные образования

Средней неигровой статики. Это статические обьекты без физического взаимодействия, размер которых сопоставим со средним размером робота — нашего основного динамического объекта. Их можно отключить для улучшения производительности, но из-за их размеров мы все же стараемся сохранить их в как можно больших пресетах качеств. Соответственно, на них тоже можно применить лодирование.

Пример средней неигровой статики — железобетонные конструкции на границе карты

Мелкая неигровая статика. Сюда относятся объекты без физики, размер которых значительно меньше робота. Эти объекты нужны для создания ощущения масштаба и доступны только в пресетах HD или Ultra-HD. Но и их мы стараемся не отключать на слабых устройствах, если позволяют тесты производительности.

Пример мелкой неигровой статики — различного рода транспорт, контейнеры, столбы, балки и прочее

Основы работы

Для того, чтобы расположить один объект на другом, нужно перейти во вкладку Modify и выбрать плоскость Corona Scatter. Затем нажать на «+» рядом с окном Distribute on objects. После этого кликнуть на желаемые объекты, на которых будут размещаться остальные. Затем нажать на «+» рядом с окном Instanced objects. Теперь нужно выбрать мышью объекты, которые будут располагаться на указанном ранее. Как только выключится выбор объектов, предметы из второго окна окажутся на предметах из первого окна. С помощью кнопок «» можно выбирать из полного списка объектов в сцене. С помощью кнопки «-» выделенные в окне объекты удаляются.

Параметр Density позволяет менять соотношение располагаемых объектов между основными. Frequency меняет соотношение располагаемых объектов между собой.

В разделе Scattering можно выбрать способ расположения объектов. Наиболее популярные — это 2D и 3D. 2D помещает объекты по их точке опоры (Pivot) на поверхность предмета. 3D размещает случайно по всему объему предмета. Max. limit ограничивает максимальное количество размещаемых объектов. Rnd seed позволяет выбрать один из множества вариантов случайного расположения. Avoid collisions позволяет отдалить размещаемые объекты друг от друга, чтобы они не пересекались.

Случайная трансформация

Очень важным и полезным является окно Transformations. В нем имеется 3 схожих подраздела: Translation, Rotation, Scale. Каждый из них отвечает за соответствующие действия: передвижение, вращение, масштабирование. Настройки у параметров очень похожи. Изменять значения нужно рядом с буквой, обозначающей ось, по которой произойдут изменения. Затем указывается диапазон значений From – To (от — до). В нижней части раздела находится значения шага изменения и оси, по которым шаг будет производится.

Можно выбирать одновременно несколько осей и в разных разделах. Но для того, чтобы масштабировать все оси отдельно, нужно снять галочку Uniform scale.

От доработки до релиза — финальные этапы работы

Как только основные меши выгружены и настроены, начинается этап оформления. Сцена наполняется объектами детализации (пропсами), подкрашивается террейн с прилегающей геометрией, настраивается и запекается тестовое освещение и так далее. Кроме того, на этом этапе мы рисуем RGBA-маски для зданий, имитирующие легкие износы природного характера: потеки, грязь, пыль, сажа, ржавчина и прочее. Они нужны для того, чтобы разбивать монотонные тайлы на больших поверхностях, подчеркивать объем и в целом привносить в картинку определенную художественность и живость. 

Вот так выглядит карта до запекания света и заполнения объектами детализации:

А так — после финальной полировки:

И снова здесь главное не перенасытить сцену мелкими объектами, которые впоследствии придется убирать при генерации разных качеств (HD, LD, ULD). Следим также за композицией объектов в кадре, чтобы она смотрелась красиво и гармонично с любого ракурса игровой камеры. Если нужно, сводим текстуры по тону и цвету, чтобы они не выбивались из общей картины.

Далее происходит оптимизация — один из первых технических этапов, после которых карта попадает в билд. Здесь идет настройка лодов, материалов, дистанции отрисовки, в случае обнаружения критических багов правится геометрия. После добавления всех объектов на source-сцену она передается левел-дизайнеру на ревью геометрии и читаемости окружения с точки зрения геймплея. После этого считается, что уровень целиком готов, и наступает следующий этап генерации разных качеств (HD, LD, ULD) от исходной source-сцены. В арсенале технических художников есть отличные инструменты для автоматизации этого процесса, но ручной доработки все же не избежать.

Так выглядят HD, LD и ULD пресеты карты:

После генерации карты в разных пресетах качества она отдается обратно левел-дизайнерам. Они снова тестируют теперь уже обновленную геометрию, читаемость уровня и выдают общий фидбек. Кроме того, на финальном этапе создания карты левел-дизайнеры несколько раз отправляют ее на внешнее тестирование. Это отдельный тестовый сервер, куда мы приглашаем игроков оценить новый контент, готовящийся к релизу. Этот метод позволяет нам собрать отзывы по геймплейным аспектам, графике, а также оценить производительность карты, так сказать, в «боевых» условиях. Подробнее об этом мы расскажем в следующем материале. 

После всех правок и доработок за карту принимается QA-отдел. Тестировщики тщательно проверяют уровень на различные баги, связанные с графикой и геймплеем. Тестирование выполняется на всевозможных смартфонах и планшетах, чтобы убедиться, что карта будет хорошо выглядеть на устройстве вне зависимости от его технической начинки. Здесь же происходит финальная проверка производительности сцены и сравнение ее показателей с другими картами.

До/после: карта из «ванильной» War Robots и War Robots Remastered:

Подводя итоги: какие приемы и почему показались нам наиболее эффективными

  • Переход на новый графический пайплайн (SRP) позволил нам использовать PBR текстуры вместо классической модели diffuse/normal/specular. Это упрощает создание текстур, поскольку современные пакеты вроде Substance Painter/Designer, а также Quixel заточены именно под PBR.

  • Использование текстурных массивов (Texture Array) и тримов/тайлов предоставляет нам возможность более эффективно расходовать память на девайсе при текстурировании большого количества крупных однотипных моделей. Это также сокращает время создания более детализированных объектов.

  • «Умная» система лодирования позволяет увеличить полигонаж и детализацию на HD-картах не в ущерб общей производительности на низких качествах и слабых девайсах.

  • Самописные инструментарии вроде Splat Painter упрощают рисование Splat-масок для террейна и не только.

  • Кастомные шейдеры и материалы под SRP дают возможность воплотить весь творческий потенциал, заложенный на этапе препродакшена карты.

  • Появление шейдера, поддерживающего прозрачность, дает возможность нам использовать декали на вертикальных и горизонтальных поверхностях. Эти декали могут быть как в виде разметки на дороге, так и надписей и логотипов на зданиях.

  • Отказ от старых технологий в пользу более гибкого и удобного инструментария дал нам возможность повысить общее визуальное качество уровней и приблизить их к современным стандартам мобильной игровой графики.

Автор материала — старший 3D-художник Pixonic Александр Коляда, также помогал Алексей Пастушков

Концепт-арт: формируем стиль обновленной игры

Одна из основных задач на этапе концептирования — сохранив стилистику игровой локации и узнаваемые силуэты объектов, создать нечто новое и при этом заложить возможность большей детализации в рамках неизменных физических коллайдеров. И поскольку стиль War Robots — фотореализм без какой-либо иной стилизации, основной упор мы сделали на приближении масштаба и пропорций объектов максимально близко к реалистичным, чтобы у игрока создавалось ощущение, что он действительно управляет огромным боевым роботом высотой с четырехэтажный дом.

Для примера возьмем центральное здание карты Valley. Ниже показан оригинальный концепт и его реализация в «ванильной» версии War Robots:

А теперь посмотрим на концепт и 3D-модель той же самой постройки в War Robots Remastered:

В новой реализации появилось множество мелких деталей — это сделано для того, чтобы подчеркнуть масштаб модели. Раньше некоторые игроки упоминали, что из-за недостатка детализации не ощущали себя за штурвалом гигантского робота, поэтому в War Robots Remastered мы задались целью улучшить этот аспект. 

Однако не стоит забывать, что любое даже самое современное устройство, на котором можно запустить обновленную War Robots, имеет свои ограничения, и их необходимо учитывать. Так, вместо индивидуальных текстур нам приходилось использовать ограниченные текстурные массивы, что могло привести к нехватке или несбалансированности используемых материалов. Из этого вытекало то, что уже на этапе концептинга нам нужно было создать черновой перечень текстур для геометрии уровня, определиться с их количеством, типом, основным цветом и многими другими аспектами. Поэтому концепт-художники и моделлеры формировали перечень этих текстур совместно, а затем первые использовали его для разработки внешнего вида объектов: сочетания и повторяемости материалов, деталировки, распределения цветов. 

Пример доски планирования текстурных массивов. Здесь мы видим сопоставление материалов на зданиях к слоям (0-15) в массиве текстур по цвету вершины.

X-Designer планировщик садового участка 3D: условно-бесплатная программа

Приложение разработано отечественной компанией ИДДК. Отличный вариант для тех, кто не хочет тратить время на изучение самого программного обеспечения. Особенностью софта является достаточно простой интерфейс, но в тоже время неплохие возможности по созданию ландшафтного дизайна участка. Начав работу любой пользователь уже через полчаса сможет уже создавать план своего сада или заднего двора.

Из преимуществ приложения стоит отметить возможность просмотра в 3D режиме. Также при первоначальном вводе размера своего участка, даты, списка и места расположения  садовых растений, пользователь сможет увидеть, как визуально участок будет выглядеть в любое время суток, в различные сезоны года. Планировщик X-Designer также позволяет изменять рельеф участка.

Из недостатков стоит отметить упрощенный функционал и довольно слабая визуализация. Но для быстрого создания плана участка без лишних требований к графике это приложение подойдет для начинающих дизайнеров ландшафтного искусства и простых пользователей. Программа создавалась давно и не обновлялась в последнее время.

По истечению пробного периода приобрести лицензию можно на официальном сайте. Заказать приложение можно на сайте http://iddk.ru/

SmartDraw: условно бесплатная программа

Независимо от того, являетесь ли вы новичком в планировании ландшафтного дизайна или опытным специалистом, SmartDraw помогает каждому с легкостью создавать собственные проекты задних дворов и приусадебных участков, добавляя на рисунок желаемые элементы садового декора. SmartDraw позволяет добавлять в визуальный зданий двор зоны барбекю или гриля, дорожки, зонтики, столы для пикника, фонтаны и светильники по вашему усмотрению. Программа по ландшафтному дизайну SmartDraw функционирует как в онлайн приложение так и есть возможность скачать на компьютер. Пользователю предоставляется 7 дневный пробный период.

Кроме создания стилевого наполнения, SmartDraw предоставляет возможность пользователям анимировать графику, создавать презентации с помощью PowerPoint. Благодаря встроенной функции фото-программного обеспечения, вы сможете импортировать изображения с цифровых камер или смартфонов, масштабировать их, настраивать яркость и цвет, а также обрезать рисунки. Язык интерфейса – английский.

Сайт программы вы можете найти по этой ссылке.

Часть 3: Создание Объекта

Хорошо, теперь давайте на самом деле сделаем несколько травинок! Во-первых, перейдите на слой, в который вы знаете, что не будете нуждаться. Я обычно просто использовать последний. Затем добавьте плоскость (Plane) и поверните (Rotate) ее на 90 градусов по оси X в режиме объекта (Object Mode). Мы
делаем это в Режиме Объекта для изменения локальных координат так, чтобы
когда мы создадим систему частиц (Particle System), трава была направлена ??вверх.Затем перейдите в режим редактирования (Edit Mode) выделите верхний край, выдавливайте (Extrude) и уменьшайте его. Сделайте это примерно 3 раза и использовав Alt + M соедините верхний край в одну точку. Убедитесь, что начало координат находится у основания травинки. Масштабируйте основание вдоль оси X, чтобы сделать его тоньше. Затем переместите грани по осям X и Y, пока вы не получите примерно такой же результат, как на рисунке 3-1:
(Рис. 3-1, Вид спереди и сбоку)

Прежде,
чем мы продублируем больше травы, мы должны сделать пару
вещей, чтобы потом проще было в долгосрочной перспективе. Во-первых, установить для травы сглаживающие тени. Переименуйте их в «травинка» (grass blade), и если вы хотите сохраните Ваши объекты. Присвойте траве материал, а также создать группу для него (как показано на рисунке 3-2). Мы займемся материалами позже, но это в последствии сэкономит время и избавит Вас от необходимости добавлять материал на все травинки по одному. Если
вы хотите, вы можете добавить Subsurf модификатор, для улучшений, но это
не является необходимым, если вы не делаете крупный план.

(Рис. 3-2)

Теперь мы готовы дать траве некоторое разнообразие. Дублируйте травинки и измените некоторые края, но придерживаясь примерно нашей формы. Создайте 3 разных копии оригинальных травинок, чтобы у Вас получилось что-то похожее на это:

(Рис. 3-3)

Так как мы уже добавили оригинальный материал и группу, нам не нужно возвращаться в материалы и добавлять каждому из них в отдельности.Прежде чем мы перейдем к использованию частиц, давайте создадим еще два вида травы. Чтобы сделать это, продублируйте одну группу травинок, переименуйте ее и добавьте в новую группу. Сделайте
один тип травы немного более тонким и изогнутым (назовем ее «длинная
трава
«), а другой худым и высоким (этот тип будет «высокая
трава
«). Мы должны закончить с тремя различными типами травы, в четырех различных вариациях. Каждый тип должен иметь свою собственную группу и название. Они должны выглядеть примерно так:

(Рис. 3-4, вид сбоку и спереди)

Создание травы

Используя все перечисленные выше инструменты, вы сможете размножать объекты по поверхности. Самый простой пример – трава.

  1. Добавьте модели травы и плоскость в Corona Scatter, как показано в разделе 2 этой статьи.
  2. Настройте поворот и размеры травы, как в разделе 3.
  3. Установите нужное значение Count, чтобы заполнить плоскость земли.

В итоге у вас получится поверхность, покрытая травой. В зависимости от количества повторяющихся моделей, трава будет гуще или реже.

Пускай у этого инструмента не слишком много функций, но их достаточно для выполнения большинства задач. При желании на одном объекте можно объединять несколько Corona Scatter. Это придает еще большую гибкость

Но важно понимать, что чем больше объектов будет в сцене, тем сложнее будет визуализация. Да, для рабочей области инструмент хорошо оптимизирован

Только для рендера вычисления могут оказаться слишком обширными.

Быстрее, больше, мощнее: изменения в техническом пайплайне

Для ремастера мало создать красивую картинку — не менее важно не просесть по производительности по сравнению с Legacy-картами. Это стало возможным благодаря работе наших графических программистов и технических художников, обеспечивших нас современными, соответствующими всем стандартам инструментами для создания окружения

По части кода мы переписали практически весь пайплайн рендеринга (Scriptable Render Pipeline, SRP), и теперь вместо классического рендера материалов (diffuse/normal/specular) у нас используется современный физически корректный рендеринг — PBR (albedo/metallic/normal/smoothness) для более точной передачи физических свойств материалов. Но об этом мы еще расскажем подробнее в будущих статьях.

Кроме того, мы стали применять современный подход тайлов и тримов вместо большого атласа текстур на всю локацию, что позволило нам упростить текстурирование большого массива однотипных объектов, а также сэкономить память на мобильных девайсах. 

Что такое тайлы и тримы?

  • Тайловая текстура (Tile sheet) — однородная текстура, которая может повторяться n-ое количество раз как по горизонтали, так и по вертикали без каких-либо видимых швов;

  • Трим-текстура (Trim sheet) — тот же тайл, но повторяющийся в одном направлении: либо горизонтально, либо вертикально.

Основные ограничения по текстурам, накладываемые памятью лоу-энд девайсов, — это один, максимум два массива из 16 текстур с одинаковым разрешением 512×512px на основную геометрию уровня, которую можно и нужно текстурировать тайлами и тримами. Для HD-пресета мы можем использовать разрешение и 1024×1024px с более прогрессивными алгоритмами компрессии — и это почти не увеличивает потребление памяти, но по факту визуально разница на экранах мобильных устройств невелика. Обычно мы используем по одному массиву текстур на геометрию уровня и для террейна, использующему каждый свои шейдеры для специфических задач. Например, на индустриальных объектах не нужен такой плавный переход между текстурами, как на террейне. Вообще любые плавные бленды сложнее по просчету для GPU, поэтому шейдер террейна мы используем только на природных объектах.

Атлас для карты Canyon Legacy (2048×2048px) Набор из 16 текстур для карты Canyon Remastered (512×512px)

Что касается полигонажа, здесь мы тоже шагнули далеко вперед: теперь для HD-пресета качества в нашем распоряжении до 500 тысяч треугольников, тогда как раньше было максимум 200-300 тысяч.

Модели деревьев для Unity3D

Unity3D позволяет вам добавить в ваш ландшафт тысячи деревьев, поэтому можете засадить хоть целый лес, если это нужно сделать по дизайну игровой карты.

Чтобы начать добавлять деревья в ваш игровой ландшафт, нужно:

  • выбрать ландшафт, куда вы хотите добавить деревья;

  • открыв ландшафт, нужно выбрать вкладку «Inspector»;

  • в этой вкладке вам откроется окно с множеством вкладок и несколькими кнопками-иконками;

  • найдите 5-ю кнопку-иконку, где изображено дерево, и кликайте по ней;

  • далее нажмите на кнопку «Edit Trees» и пройдите по пути «Add Tree».

После этих манипуляций Unity3D откроет окно и предложит вам применить уже готовый префаб дерева. Если вы нажмете на «шестеренку» в этом окне, то вам откроется еще одно окно, где будет доступно большее число моделей деревьев. Выбирайте нужную модель и закрывайте окно. Выбранная модель автоматически добавится в проект.

Если вас не устраивают доступные модели деревьев для своей игры на Unity3D, то можете в сети поискать другие модели деревьев для Unity3D и добавить их к себе в проект.

Добавление нужной модели деревьев в свой проект еще не означает, что они будут автоматически добавлены к вам в ландшафт. Во-первых, модели деревьев можно настроить, нажав на раздел «Settings», например, там вы найдете следующие настройки:

  • «brush size» — это область, где будут нарисованы деревья;

  • «tree density» — это объем деревьев, который нужно нарисовать на обозначенной площади;

  • «tree height» — определяет высоту деревьев;

  • «lighting» — это генерация световых карт для ваших деревьев.

Для того чтобы нарисовать дерево на игровой сцене, нужно:

  • выбрать тип дерева;

  • навести указатель мыши на ландшафт;

  • левой кнопкой мыши начать создавать деревья на ландшафте.

В «Edit Trees» всегда есть возможность изменить, удалить или добавить тип тех деревьев, которые вы хотите рисовать на игровой сцене.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
3D-тест
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: