При выводе модели в экранные координаты, её X координата используется для ширины экрана, а Y для высоты, Z используется в буфере глубины (благодаря этому можно регулировать наложение спрайтов друг на друга сменой высоты модели). Поэтому модель при выводе на экран выглядит так, будто её сначала повернули на -90 вокруг Z, а потом на -90 вокруг Y.
local fr = BlzCreateFrameByType("SPRITE", "", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), "", 0)
BlzFrameSetAbsPoint(fr, FRAMEPOINT_CENTER, 0.4, 0.3)
BlzFrameSetSize(fr, .001, .001)
BlzFrameSetModel(fr, "Units\\Human\\BloodElfDragonHawk\\BloodElfDragonHawk", 0)
BlzFrameSetScale(fr, .0025)
С другой стороны, в нативке BlzFrameSetModel можно указать индекс камеры из модели, чтобы изменить вид. Но тогда спрайт будет выведен на весь экран.
BlzFrameSetModel(fr, "Units\\Human\\BloodElfDragonHawk\\BloodElfDragonHawk_portrait", 0)
Как оказалось, на уровне FDF есть вариант вывода в ограниченном прямоугольнике (аналогично портретному фрейму).
Frame "FRAME" "TestPortrait1" {
LayerStyle "SETSVIEWPORT",
SetPoint CENTER , "ConsoleUI", CENTER, 0, 0,
Width 0.15,
Height 0.20,
Frame "SPRITE" "TestSprite" {
SetAllPoints,
BackgroundArt "Units\Human\BloodElfDragonHawk\BloodElfDragonHawk_portrait.mdx",
SpriteCamera 0,
Camera {
}
}
}
Видимо, ключевым свойством тут является LayerStyle. Для него есть несколько валидных значений. Можно указывать больше одного в одной строке, разделив их символом |.
Значение | Описание |
---|---|
"SETSVIEWPORT" | См. пример выше |
"3DWINDOW" | Похоже, что работает аналогично SETSVIEWPORT |
"IGNORETRACKEVENTS" | Ивенты (следы крови, звуки и пр.) у спрайтов забагованы, и из экранного пространства отправляются прямиком в (0, 0) карты. Это значение, указанное для спрайта, прикрывает эту дырку. От аналогичной проблемы с PkFX эффектами не спасает. |
"SCROLL" | Хз |
"SCROLLCHILD" | Хз |
"SHADING" | Хз. В близзовских файлах почему-то используется NOSHADING |
"NODEPTHSET" | Хз, но наверное что-то аналогичное своему тёзке из свойств рендеринга MDX |
"NODEPTHTEST" | Хз, но наверное что-то аналогичное своему тёзке из свойств рендеринга MDX |
FDF камера
Спрайту можно задать свойства камеры прямо в FDF тексте. Порядок свойств произвольный, не все из них обязательны. Формат и токены:
Camera {
CameraTarget float float float,
CameraFieldOfView float,
CameraFarZ float,
CameraPosition float float float,
CameraRotation float,
CameraAoA float,
}
Пример:
Frame "FRAME" "TestSprite" {
SetPoint CENTER , "ConsoleUI", CENTER, -0.15, 0,
Width 0.25,
Height 0.25,
Frame "SPRITE" "Test" {
SetAllPoints,
BackgroundArt "Units\Human\BloodElfDragonHawk\BloodElfDragonHawk",
Camera {
CameraTarget 4377.235 -31145.605 -10199.983,
CameraFieldOfView 0.4,
CameraFarZ 80000.0,
CameraPosition 4377.367 -31146.547 -10200.292,
// CameraRotation 0.0,
// CameraAoA 0.0
}
}
}
LayerStyle не нужен. Значения у камеры здесь супер наркоманские, и не понятно как правильно её наводить, простое указание значений камеры из MDX особо не работает: модель получается огромной, и не влазит в окошко камеры. Есть сильное желание поставить модели маленький масштаб, но тогда отскейлится и положение самой камеры. Вообще BlzFrameSetScale плохо работает со спрайтами с камерой, даже с портретом.
Спрайт с такими параметрами камеры гарантировано провалится под террейн. Вроде как единственный адекватный workaround в этом случае — это использовать ORIGIN_PORTRAIT_FRAME в качестве родителя.
BlzCreateFrame("TestSprite", BlzGetOriginFrame(ORIGIN_FRAME_PORTRAIT, 0), 10000, 0)
Кажется, будто функционал камеры забагован, или вообще не допилен. И почему-то добавление пустого блока камеры к спрайту фиксит непонятно откуда берущуюся деформацию модели. Или не фиксит, а, наоборот, добавляет?
Frame "FRAME" "TestPortrait3" {
LayerStyle "3DWINDOW",
SetPoint CENTER , "ConsoleUI", CENTER, -0.15, 0,
Width 0.12,
Height 0.15,
Frame "SPRITE" "TestSprite" {
SetAllPoints,
BackgroundArt "units/undead/frostwyrm/frostwyrm_portrait.mdx",
SpriteCamera 0,
}
}
Frame "FRAME" "TestPortrait4" {
LayerStyle "3DWINDOW",
SetPoint CENTER , "ConsoleUI", CENTER, 0.15, 0,
Width 0.12,
Height 0.15,
Frame "SPRITE" "TestSprite" {
SetAllPoints,
BackgroundArt "units/undead/frostwyrm/frostwyrm_portrait.mdx",
SpriteCamera 0,
Camera {
}
}
}
Источники света через FDF
Внезапно работает, в SD-шейдере довольно таки адекватно и предсказуемо. Порядок свойств произвольный, не все из них обязательны. Можно несколько штук на спрайт. Формат и токены:
LightList {
Light {
LightAmbientIntensity float,
LightAmbientColor float float float,
LightDirectionalIntensity float,
LightDirectionalColor float float float,
LightPosition float float float,
LightDirection float float float,
LightFlag integer,
}
}
Пример:
IncludeFile "UI\FrameDef\Glue\StandardTemplates.fdf",
Frame "FRAME" "TestPortrait2" {
SetPoint CENTER, "ConsoleUI", CENTER, 0, 0,
Width 0.12,
Height 0.15,
Frame "SPRITE" "RedSprite" {
LayerStyle "3DWINDOW",
SetPoint CENTER, "TestPortrait2", CENTER, -0.15, 0,
Width 0.12,
Height 0.15,
BackgroundArt "units/undead/frostwyrm/frostwyrm_portrait.mdx",
SpriteCamera 0,
LightList {
Light {
LightAmbientIntensity 0.5,
LightAmbientColor 1.000 0.0 0.0,
LightDirectionalIntensity 0.8,
LightDirectionalColor 1.000 0.0 0.0,
LightPosition 0.000 0.000 0.000,
LightDirection 0.000 0.000 -1,
LightFlag 1,
}
}
Frame "TEXT" "RText" INHERITS "StandardLabelTextTemplate" {
SetPoint TOPLEFT, "RedSprite", CENTER, 0.0, -0.05,
FontColor 1.0 0.1 0.1 1.0,
Text "RED",
}
}
Frame "SPRITE" "GreenSprite" {
LayerStyle "3DWINDOW",
SetPoint CENTER, "TestPortrait2", CENTER, 0, 0,
Width 0.12,
Height 0.15,
BackgroundArt "units/undead/frostwyrm/frostwyrm_portrait.mdx",
SpriteCamera 0,
LightList {
Light {
LightAmbientIntensity 0.5,
LightAmbientColor 0.0 1.0 0.0,
LightDirectionalIntensity 0.8,
LightDirectionalColor 0.0 1.0 0.0,
LightPosition 0.000 0.000 0.000,
LightDirection 0.000 0.000 -1,
LightFlag 1,
}
}
Frame "TEXT" "GText" INHERITS "StandardLabelTextTemplate" {
SetPoint TOPLEFT, "GreenSprite", CENTER, 0.0, -0.05,
FontColor 0.1 1.0 0.1 1.0,
Text "GREEN",
}
}
Frame "SPRITE" "BlueSprite" {
LayerStyle "3DWINDOW",
SetPoint CENTER, "TestPortrait2", CENTER, 0.15, 0,
Width 0.12,
Height 0.15,
BackgroundArt "units/undead/frostwyrm/frostwyrm_portrait.mdx",
SpriteCamera 0,
LightList {
Light {
LightAmbientIntensity 0.5,
LightAmbientColor 0.0 0.0 1.0,
LightDirectionalIntensity 0.8,
LightDirectionalColor 0.0 0.0 1.0,
LightPosition 0.000 0.000 0.000,
LightDirection 0.000 0.000 -1,
LightFlag 1,
}
}
Frame "TEXT" "BText" INHERITS "StandardLabelTextTemplate" {
SetPoint TOPLEFT, "BlueSprite", CENTER, 0.0, -0.05,
FontColor 0.1 0.1 1.0 1.0,
Text "BLUE",
}
}
}