Добавлен , опубликован
При выводе модели в экранные координаты, её 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",
        }
    }
}

`
ОЖИДАНИЕ РЕКЛАМЫ...