Автор | Сообщение |
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 24-09-2016 16:57 |
Здравствуйте! Мне очень интересно следить за развитием данного движка, тем более когда автор прислушивается к пожеланиям его пользователей. Хочу спросить планируется ли введение расширенной функции HUDSpriteCreate для продвинутой отрисовки экранных спрайтов. Сразу уточню что понимаю данный движок создаётся для 3D игр. Но реализация хорошего интерфейса в игре тоже важна. Можно ли добавить HUDSpriteCreateEx(material as string, width, height, left, top, right, bottom, parent as real) нечто подобное? Где left, top, right, bottom это части изображения. |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 25-09-2016 12:26 |
Не совсем понял про left, top, right, bottom. Это что-то типа составного спрайта (т.е., 4 материала)? Если да, то зачем параметр material? И как эти части нужно располагать относительно друг друга? | |
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 25-09-2016 12:33 |
А, кажись, дошло. Речь идет о поддержке текстурных атласов, верно? То есть, для отрисовки спрайта используем не целую текстуру, а ее часть. Это нетрудно добавить. | |
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 26-09-2016 09:07 |
Да именно это я имел в виду. Хотя подобное можно сделать изменив параметры материала (это до меня позже дошло). Буду признателен если добавите подобную функцию. На мой взгляд удобнее будет с ней работать если параметры будут как текстурные координаты от 0 до 1, а не в пикселях по размерам изображения. Было бы неплохо ввести возможность изменить параметр рисования спрайта не из центра как сейчас, а из указанной пользователем точки. | |
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 26-09-2016 13:07 |
Да, через настройки спрайта это будет гораздо удобнее, чем через параметры материала, не придется создавать по отдельному материалу на каждый спрайт. | |
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 26-09-2016 17:47 |
Не стал создавать новую тему, поскольку вопрос также по функции HUDSpriteCreate. Полагаю это ошибка или я где-то не понимаю. При прорисовке текстуры с собственной прозрачностью на месте где должна быть прозрачность и виден фон за текстурой прорисовывается черный цвет. В движке v 2.0 это реализовывалось: MaterialCreate('logo','logo.tga',1); MaterialSetOptions('logo',true,true); MaterialSetTextureImageAlpha('logo',tiaDefault); logo=HUDSpriteCreate('logo',192,96,global.front); ObjectSetPosition(logo,800-192/2,600-96/2,0); В версии движка 3 известная текстура "logo.tga" прорисовывается с черными краями. Хотя и в последней версии справки к движку по функции "MaterialCreate( material,filename as string )" о 3 аргументе ничего не сказано. Именно он отвечал в значении "true" за данный эффект. Пожалуйста напишите как это реализуется сейчас или это считать багом. |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 26-09-2016 22:47 |
Сейчас надо выставлять режим смешивания bmTransparency: MaterialSetBlendingMode('material', bmTransparency); Странно, что раньше этого не требовалось. Хотя не помню, может, и требовалось. Про третий аргумент в MaterialCreate я, честно сказать, вообще забыл) А ведь действительно, был такой. Может, в него и нужно было передавать режим смешивания? По умолчанию стоит bmOpaque (0), а bmTransparency как раз равен 1. |
|
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 27-09-2016 08:54 |
Данная функция работает для текстур где черный цвет нужно считать прозрачным. В MaterialCreate() третий аргумент отвечал за использование собственного альфа канала текстуры или если его у текстуры не было черный цвет считал прозрачным. Как мне имея текстуру с собственным альфа каналом правильно его использовать? (В таких текстурах альфа канал после загрузки приобретает черный цвет.) | |
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 27-09-2016 11:40 |
По-моему, ты путаешь с MaterialSetTextureImageAlpha('material', tiaSuperBlackTransparent). Но bmTransparency в этом случае все равно нужен, именно он отвечает за смешивание с учетом прозрачности. Сейчас вот специально проверил с logo.tga, все работает. Делаю так: MaterialCreate('mLogo', 'data/logo.tga'); MaterialSetOptions('mLogo', true, true); MaterialSetBlendingMode('mLogo', bmTransparency); spr = HUDSpriteCreate('mLogo', 256, 128, global.front); Проверь еще демку с тенями в SDK, там на дереве листья с альфа-каналом. Кстати, только сейчас заметил: для PNG альфа-канал не поддерживается. Сейчас буду исправлять. |
|
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 27-09-2016 12:56 |
Согласен, я все проверял тоже на PNG поэтому и не мог понять почему logo.tga получается, а с моим файлом нет. Спасибо! | |
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 27-09-2016 13:31 |
Все, вроде готово. Добавил следующие функции: HUDSpriteCreateEx(material, width, height, left, top, right, bottom, parent) - принимает границы текстуры в UV-координатах SpriteCreateEx(material, width, height, left, top, right, bottom, parent) - то же самое для 3D-спрайта SpriteSetBounds(sprite, left, top, right, bottom) - задает границы текстуры в UV-координатах SpriteSetBoundsUV(sprite, left, top, right, bottom) - задает границы текстуры в пикселях (вдруг все-таки понадобится) SpriteSetOrigin(sprite, x, y) - задает исходную точку спрайта Плюс добавил функции для опрашивания размеров текстуры - могут пригодиться для вычисления UV, если размеры неизвестны заранее: MaterialGetTextureWidth(material) MaterialGetTextureHeight(material) |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 27-09-2016 14:21 |
Кстати, хотел спросить: нужны ли в Xtreme3D функции рисования 2D-фигур, типа прямоугольника, отрезка, окружности и т.д.? Прямоугольник можно и спрайтом сделать, но, например, качественную масштабируемую окружность так не нарисуешь, нужна честная векторная фигура. В принципе, все это легко добавить. | |
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 27-09-2016 15:18 |
Да, нужно думаю подобные элементы могут пригодится для создания GUI. В любом случае не помешают. | |
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 29-09-2016 14:21 |
Добавил такие функции: HUDShapeRectangleCreate(width, height, parent) HUDShapeCircleCreate(radius, slices, startAngle, endAngle, parent) HUDShapeLineCreate(x1, y1, x2, y2) HUDShapeMeshCreate(parent) - позволяет отрисовать произвольную фигуру, составленную из треугольников HUDShapeSetRotation(shape, angle) HUDShapeRotate(shape, angle) HUDShapeSetColor(shape, col, alpha) - цвет можно задавать индивидуально, независимо от материала HUDShapeSetOrigin(shape, x, y) HUDShapeSetSize(shape, width, height) HUDShapeScale(shape, h, v) HUDShapeCircleSetRadius(shape, radius) HUDShapeCircleSetSlices(shape, slices) HUDShapeCircleSetAngles(shape, startAng, endAng) - можно задавать начальный и конечный угол окружности, получается сектор HUDShapeLineSetPoints(shape, x1, y1, x2, y2) HUDShapeLineSetWidth(shape, width) HUDShapeMeshAddVertex(shape, x, y, u, v) HUDShapeMeshAddTriangle(shape, v1, v2, v3) HUDShapeMeshSetVertex(shape, index, x, y) - можно менять координаты вершин и анимировать фигуры HUDShapeMeshSetTexCoord(shape, index, u, v) Кстати, баг с PNG тоже исправил. |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 29-09-2016 15:09 |
Только сейчас вспомнил, что в GM при использовании строковых аргументов общее кол-во аргументов DLL-функции не должно превышать 4. Поэтому HUDSpriteCreateEx и SpriteCreateEx будут доступны только для привязок к другим языкам. Но вместо них можно пользоваться SpriteSetBoundsUV, так что ничего страшного. Есть мысль вообще убрать аргумент материала из функций создания спрайтов. Тогда Ex-версии могут быть и в GM. А материал задавать обычным путем, через ObjectSetMaterial (там механизм такой же). Но это, конечно, в очередной раз сломает обратную совместимость. Или третий вариант - убрать аргумент материала только из Ex-функций. Мне кажется, третий вариант самый подходящий. |
|
gadmaker бывалый Группа: Участники Сообщений: 39 |
Добавлено: 29-09-2016 15:34 |
Привет! Очень нужные нововведения, думаю 3 вариант вполне подойдет. Данные функции определенно должны быть доступны в ГМ. Помню ограничения со строковыми переменными в GM разработчик Ultimate3D решал следующим образом: external_call(global.u3d_transmit_doubles,argument10,argument11,argument12,argument13,0,0,0,0,0,0,0); return external_call(global.u3d_draw_texture_ex,argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument14); т.е. сначала передавал часть аргументов (приемущественно строковых) в одну функцию, а потом называл основную. Это моё предложение как 4 вариант. Р.S. Не совсем так, эта запись решает проблему для старых версий GM где было доступно 11 аргументов для Dll. Но идею тоже можно использовать. |