HUDSpriteCreateEx возможно ли?

Вы просматриваете архив старого форума. Новый форум по ссылке


Автор Сообщение

бывалый
Группа: Участники
Сообщений: 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 это части изображения.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 25-09-2016 12:26
Не совсем понял про left, top, right, bottom. Это что-то типа составного спрайта (т.е., 4 материала)? Если да, то зачем параметр material? И как эти части нужно располагать относительно друг друга?

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 25-09-2016 12:33
А, кажись, дошло. Речь идет о поддержке текстурных атласов, верно? То есть, для отрисовки спрайта используем не целую текстуру, а ее часть. Это нетрудно добавить.

бывалый
Группа: Участники
Сообщений: 39
Добавлено: 26-09-2016 09:07
Да именно это я имел в виду. Хотя подобное можно сделать изменив параметры материала (это до меня позже дошло). Буду признателен если добавите подобную функцию. На мой взгляд удобнее будет с ней работать если параметры будут как текстурные координаты от 0 до 1, а не в пикселях по размерам изображения. Было бы неплохо ввести возможность изменить параметр рисования спрайта не из центра как сейчас, а из указанной пользователем точки.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 26-09-2016 13:07
Да, через настройки спрайта это будет гораздо удобнее, чем через параметры материала, не придется создавать по отдельному материалу на каждый спрайт.

бывалый
Группа: Участники
Сообщений: 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" за данный эффект.
Пожалуйста напишите как это реализуется сейчас или это считать багом.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 26-09-2016 22:47
Сейчас надо выставлять режим смешивания bmTransparency:

MaterialSetBlendingMode('material', bmTransparency);

Странно, что раньше этого не требовалось. Хотя не помню, может, и требовалось.
Про третий аргумент в MaterialCreate я, честно сказать, вообще забыл) А ведь действительно, был такой. Может, в него и нужно было передавать режим смешивания? По умолчанию стоит bmOpaque (0), а bmTransparency как раз равен 1.

бывалый
Группа: Участники
Сообщений: 39
Добавлено: 27-09-2016 08:54
Данная функция работает для текстур где черный цвет нужно считать прозрачным. В MaterialCreate() третий аргумент отвечал за использование собственного альфа канала текстуры или если его у текстуры не было черный цвет считал прозрачным. Как мне имея текстуру с собственным альфа каналом правильно его использовать? (В таких текстурах альфа канал после загрузки приобретает черный цвет.)

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 альфа-канал не поддерживается. Сейчас буду исправлять.

бывалый
Группа: Участники
Сообщений: 39
Добавлено: 27-09-2016 12:56
Согласен, я все проверял тоже на PNG поэтому и не мог понять почему logo.tga получается, а с моим файлом нет. Спасибо!

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)

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 27-09-2016 14:21
Кстати, хотел спросить: нужны ли в Xtreme3D функции рисования 2D-фигур, типа прямоугольника, отрезка, окружности и т.д.? Прямоугольник можно и спрайтом сделать, но, например, качественную масштабируемую окружность так не нарисуешь, нужна честная векторная фигура. В принципе, все это легко добавить.

бывалый
Группа: Участники
Сообщений: 39
Добавлено: 27-09-2016 15:18
Да, нужно думаю подобные элементы могут пригодится для создания GUI. В любом случае не помешают.

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 тоже исправил.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 29-09-2016 15:09
Только сейчас вспомнил, что в GM при использовании строковых аргументов общее кол-во аргументов DLL-функции не должно превышать 4. Поэтому HUDSpriteCreateEx и SpriteCreateEx будут доступны только для привязок к другим языкам. Но вместо них можно пользоваться SpriteSetBoundsUV, так что ничего страшного.

Есть мысль вообще убрать аргумент материала из функций создания спрайтов. Тогда Ex-версии могут быть и в GM. А материал задавать обычным путем, через ObjectSetMaterial (там механизм такой же). Но это, конечно, в очередной раз сломает обратную совместимость. Или третий вариант - убрать аргумент материала только из Ex-функций. Мне кажется, третий вариант самый подходящий.

бывалый
Группа: Участники
Сообщений: 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. Но идею тоже можно использовать.