Скрипт генерации 3d модели
Скрипт состоит из последовательности команд, исполняемых виртуальной машиной. Использование скрипта позволяет генерировать произвольные изображения и гибко изменять логику построения изображения не изменяя при этом МП.
Входными данными являются:
Список статусов, полученных из API МП
Целевой цвет объекта
Список ресурсов, содержащийся в объекте files дескриптора.
Выходными данными является изображение объекта в актуальном состоянии и указанном цвете.
В каждой строке скрипта символ # указывает начало комментария. Допустимы пустые строки. Регистр символов не учитывется. Крманда состоит из текстового идентификатора и параметров.
Виртуальная машина имеет рабочий стек с которым работают команды скрипта. Элементы, сохраняемые в стеке, типизированы, команды ожидают наличие объектов в стеке нужного им типа. При несоответствии ожидаемого и реального типа поведение не определено. Подобная ситуация свидетельствует об ошибке в реализации виртуальной машины.
В дополнение к стеку виртуальная машина имеет также два регистра pc и bp для организации вызова подпрограмм.
Регистр pc указывает номер следующей выполняемой команды (но не строку в файле).
Регистр bp используется для получения аргументов подпрограмм.
Регистры pc, bp, рабочий стек, и рабочий список объектов bitmap образуют собой контекст состояния виртуальной машины.
class Context(
processor: BitmapProcessor,
var pc: Int = 0,
var bp: Int = 0,
val stack: MutableList<Any> = mutableListOf(),
val bitmaps: MutableMap<String, BitmapRef> = mutableMapOf(),
)
#!carbuild
DEFINE_BITMAP background 1920 1440
DEFINE_BITMAP foreground 1920 1440
DEFINE_BITMAP temp 1920 1440
STATUS transparent
JMP_FALSE NO_TRANSPARENT
# Прозрачный вид
STATUS light
SELECT "background+backlight" "background"
FETCH_BITMAP_INTO background
STORE "transparent"
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO background
# Свет
STATUS light
SKIP_TRUE
RETURN_BITMAP background
STORE "light-on"
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO background
RETURN_BITMAP background
LABEL NO_TRANSPARENT
# Задняя правая
STATUS right_back_door
SELECT "right-back-open" "right-back-closed"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO foreground
# Передняя правая
STATUS right_front_door
SELECT "right-front-open" "right-front-closed"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
# Основная модель
STATUS light
SELECT "background+backlight" "background"
FETCH_BITMAP_INTO background
STORE "base-naked"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
# Багажник
STATUS trunk
SELECT "trunk-open" "trunk-closed"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
# Свет
STATUS light
JMP_FALSE NO_LIGHT
STATUS trunk
SELECT "light-on+trunk" "light-on"
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
LABEL NO_LIGHT
# Левая задняя
STATUS left_back_door
SELECT "left-back-open" "left-back-closed"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
# Левая передняя
STATUS left_front_door
SELECT "left-front-open" "left-front-closed"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
# Капот
STATUS hood
SELECT "hood-open" "hood-closed"
CALL ADJUST_DEFINED 1
FETCH_BITMAP_INTO temp
BLEND_BITMAP temp INTO foreground
# Раскрашивание совмещенных фрагментов (без фона)
STATUS target_saturation
STORE 0
EQUAL
STORE 0
STATUS target_lightness
EQUAL
AND
SKIP_TRUE
COLORIZE_BITMAP foreground 220 40 68 20
# Наложение раскрашенной модели на фон
BLEND_BITMAP foreground INTO background
RETURN_BITMAP background
LABEL ADJUST_DEFINED
ARGUMENT 0
STATUS target_saturation
STORE 0
EQUAL
STORE 0
STATUS target_lightness
EQUAL
AND
SKIP_FALSE
FORMAT 1 "%s-black"
RETURN
Last modified: 30 декабря 2023