// Copyright Epic Games, Inc. All Rights Reserved. #include "MuR/Operations.h" #include "MuR/ModelPrivate.h" namespace mu { MUTABLE_IMPLEMENT_POD_SERIALISABLE(OP); MUTABLE_IMPLEMENT_POD_VECTOR_SERIALISABLE(OP); //--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- // clang-format off static const FOpDesc s_opDescs[] = { // type cached supported base image formats { DT_NONE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // NONE { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_CONSTANT { DT_INT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // NU_CONSTANT { DT_SCALAR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_CONSTANT { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_CONSTANT { DT_IMAGE, true, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_CONSTANT { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_CONSTANT { DT_LAYOUT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_CONSTANT { DT_PROJECTOR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // PR_CONSTANT { DT_STRING, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ST_CONSTANT { DT_EXTENSION_DATA,true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ED_CONSTANT { DT_MATRIX, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // MA_CONSTANT { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_PARAMETER { DT_INT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // NU_PARAMETER { DT_SCALAR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_PARAMETER { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_PARAMETER { DT_PROJECTOR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // PR_PARAMETER { DT_IMAGE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_PARAMETER { DT_STRING, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ST_PARAMETER { DT_MATRIX, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // MA_PARAMETER { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_REFERENCE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_REFERENCE { DT_INT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // NU_CONDITIONAL { DT_SCALAR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_CONDITIONAL { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_CONDITIONAL { DT_IMAGE, true, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 } }, // IM_CONDITIONAL { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_CONDITIONAL { DT_LAYOUT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_CONDITIONAL { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_CONDITIONAL { DT_EXTENSION_DATA,false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ED_CONDITIONAL { DT_INT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // NU_SWITCH { DT_SCALAR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_SWITCH { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_SWITCH { DT_IMAGE, true, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 } }, // IM_SWITCH { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_SWITCH { DT_LAYOUT, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_SWITCH { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_SWITCH { DT_EXTENSION_DATA,false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ED_SWITCH { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_LESS { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_EQUAL_SC_CONST { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_AND { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_OR { DT_BOOL, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // BO_NOT { DT_SCALAR, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_MULTIPLYADD { DT_SCALAR, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_ARITHMETIC { DT_SCALAR, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // SC_CURVE { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_SAMPLEIMAGE { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_SWIZZLE { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_FROMSCALARS { DT_COLOUR, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // CO_ARITHMETIC { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_LAYER { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_LAYERCOLOUR { DT_IMAGE, true, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_PIXELFORMAT { DT_IMAGE, true, { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_MIPMAP { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_RESIZE { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_RESIZELIKE { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_RESIZEREL { DT_IMAGE, true, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_BLANKLAYOUT { DT_IMAGE, true, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 } }, // IM_COMPOSE { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_INTERPOLATE { DT_IMAGE, true, { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_SATURATE { DT_IMAGE, true, { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_LUMINANCE { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_SWIZZLE { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_COLOURMAP { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_GRADIENT { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_BINARISE { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_PLAINCOLOUR { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_CROP { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_PATCH { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_RASTERMESH { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_MAKEGROWMAP { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_DISPLACE { DT_IMAGE, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_MULTILAYER { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_INVERT { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_NORMALCOMPOSITE { DT_IMAGE, true, { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IM_TRANSFORM { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_APPLYLAYOUT { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_DIFFERENCE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_MORPH { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_MERGE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_INTERPOLATE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_MASKCLIPMESH { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_MASKCLIPUVMASK { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_MASKDIFF { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_REMOVEMASK { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_FORMAT { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_EXTRACTLAYOUTBLOCK { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_TRANSFORM { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_CLIPMORPHPLANE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_CLIPWITHMESH { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_SETSKELETON { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_PROJECT { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_APPLYPOSE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_GEOMETRYOPERATION { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_BINDSHAPE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_APPLYSHAPE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_CLIPDEFORM { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_MORPHRESHAPE { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_OPTIMIZESKINNING { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_ADDTAGS { DT_MESH, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // ME_TRANSFORMWITHMESH { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDMESH { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDIMAGE { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDVECTOR { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDSCALAR { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDSTRING { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDSURFACE { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDCOMPONENT { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDLOD { DT_INSTANCE, false, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // IN_ADDEXTENSIONDATA { DT_LAYOUT, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_PACK { DT_LAYOUT, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_MERGE { DT_LAYOUT, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_REMOVEBLOCKS { DT_LAYOUT, true, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // LA_FROMMESH }; // clang-format on static_assert( sizeof(s_opDescs)/sizeof(FOpDesc) == (int32)OP_TYPE::COUNT, "OperationDescMismatch"); //--------------------------------------------------------------------------------------------- const FOpDesc& GetOpDesc( OP_TYPE type ) { return s_opDescs[ (int32)type ]; } //--------------------------------------------------------------------------------------------- void ForEachReference( OP& op, const TFunctionRef f ) { // Only operations that still use ASTOpFixed should be handled here. switch ( op.type ) { case OP_TYPE::NONE: case OP_TYPE::BO_CONSTANT: case OP_TYPE::NU_CONSTANT: case OP_TYPE::SC_CONSTANT: case OP_TYPE::CO_CONSTANT: case OP_TYPE::IM_CONSTANT: case OP_TYPE::ME_CONSTANT: case OP_TYPE::LA_CONSTANT: case OP_TYPE::PR_CONSTANT: case OP_TYPE::BO_PARAMETER: case OP_TYPE::NU_PARAMETER: case OP_TYPE::SC_PARAMETER: case OP_TYPE::CO_PARAMETER: case OP_TYPE::PR_PARAMETER: case OP_TYPE::IM_PARAMETER: break; //------------------------------------------------------------------------------------- case OP_TYPE::BO_LESS: f(&op.args.BoolLess.a ); f(&op.args.BoolLess.b ); break; //------------------------------------------------------------------------------------- case OP_TYPE::BO_EQUAL_INT_CONST: f(&op.args.BoolEqualScalarConst.value ); break; //------------------------------------------------------------------------------------- case OP_TYPE::BO_AND: case OP_TYPE::BO_OR: f(&op.args.BoolBinary.a ); f(&op.args.BoolBinary.b ); break; //------------------------------------------------------------------------------------- case OP_TYPE::BO_NOT: f(&op.args.BoolNot.source ); break; //------------------------------------------------------------------------------------- case OP_TYPE::SC_MULTIPLYADD: f(&op.args.ScalarMultiplyAdd.factor0 ); f(&op.args.ScalarMultiplyAdd.factor1 ); f(&op.args.ScalarMultiplyAdd.add ); break; //------------------------------------------------------------------------------------- case OP_TYPE::SC_ARITHMETIC: f(&op.args.ScalarArithmetic.a ); f(&op.args.ScalarArithmetic.b ); break; //------------------------------------------------------------------------------------- case OP_TYPE::CO_SAMPLEIMAGE: f(&op.args.ColourSampleImage.image ); f(&op.args.ColourSampleImage.x ); f(&op.args.ColourSampleImage.y ); break; case OP_TYPE::CO_SWIZZLE: for (int32 t=0;t f ) { OP_TYPE type = program.GetOpType(at); switch ( type ) { case OP_TYPE::NONE: case OP_TYPE::BO_CONSTANT: case OP_TYPE::NU_CONSTANT: case OP_TYPE::SC_CONSTANT: case OP_TYPE::ST_CONSTANT: case OP_TYPE::CO_CONSTANT: case OP_TYPE::IM_CONSTANT: case OP_TYPE::ME_CONSTANT: case OP_TYPE::LA_CONSTANT: case OP_TYPE::PR_CONSTANT: case OP_TYPE::ED_CONSTANT: case OP_TYPE::MA_CONSTANT: case OP_TYPE::BO_PARAMETER: case OP_TYPE::NU_PARAMETER: case OP_TYPE::SC_PARAMETER: case OP_TYPE::CO_PARAMETER: case OP_TYPE::PR_PARAMETER: case OP_TYPE::IM_PARAMETER: case OP_TYPE::MA_PARAMETER: case OP_TYPE::IM_REFERENCE: case OP_TYPE::ME_REFERENCE: break; case OP_TYPE::SC_CURVE: { OP::ScalarCurveArgs args = program.GetOpArgs(at); f(args.time ); break; } case OP_TYPE::NU_CONDITIONAL: case OP_TYPE::SC_CONDITIONAL: case OP_TYPE::CO_CONDITIONAL: case OP_TYPE::IM_CONDITIONAL: case OP_TYPE::ME_CONDITIONAL: case OP_TYPE::LA_CONDITIONAL: case OP_TYPE::IN_CONDITIONAL: case OP_TYPE::ED_CONDITIONAL: { OP::ConditionalArgs args = program.GetOpArgs(at); f(args.condition ); f(args.yes ); f(args.no ); break; } case OP_TYPE::NU_SWITCH: case OP_TYPE::SC_SWITCH: case OP_TYPE::CO_SWITCH: case OP_TYPE::IM_SWITCH: case OP_TYPE::ME_SWITCH: case OP_TYPE::LA_SWITCH: case OP_TYPE::IN_SWITCH: case OP_TYPE::ED_SWITCH: { const uint8_t* data = program.GetOpArgsPointer(at); OP::ADDRESS VarAddress; FMemory::Memcpy( &VarAddress, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); OP::ADDRESS DefAddress; FMemory::Memcpy( &DefAddress, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); uint32 CaseCount; FMemory::Memcpy( &CaseCount, data, sizeof(uint32)); data += sizeof(uint32); f(VarAddress); f(DefAddress); for ( uint32 C = 0; C < CaseCount; ++C ) { //int32 Condition; //FMemory::Memcpy( &Condition, data, sizeof(int32_t)); data += sizeof(int32); OP::ADDRESS At; FMemory::Memcpy( &At, data, sizeof(OP::ADDRESS) ); data += sizeof(OP::ADDRESS); if (At) { f(At); } } break; } //------------------------------------------------------------------------------------- case OP_TYPE::BO_LESS: { OP::BoolLessArgs args = program.GetOpArgs(at); f(args.a ); f(args.b ); break; } //------------------------------------------------------------------------------------- case OP_TYPE::BO_EQUAL_INT_CONST: { OP::BoolEqualScalarConstArgs args = program.GetOpArgs(at); f(args.value ); break; } //------------------------------------------------------------------------------------- case OP_TYPE::BO_AND: case OP_TYPE::BO_OR: { OP::BoolBinaryArgs args = program.GetOpArgs(at); f(args.a ); f(args.b ); break; } //------------------------------------------------------------------------------------- case OP_TYPE::BO_NOT: { OP::BoolNotArgs args = program.GetOpArgs(at); f(args.source ); break; } //------------------------------------------------------------------------------------- case OP_TYPE::SC_MULTIPLYADD: { OP::ScalarMultiplyAddArgs args = program.GetOpArgs(at); f(args.factor0 ); f(args.factor1 ); f(args.add ); break; } //------------------------------------------------------------------------------------- case OP_TYPE::SC_ARITHMETIC: { OP::ArithmeticArgs args = program.GetOpArgs(at); f(args.a ); f(args.b ); break; } //------------------------------------------------------------------------------------- case OP_TYPE::CO_SAMPLEIMAGE: { OP::ColourSampleImageArgs args = program.GetOpArgs(at); f(args.image ); f(args.x ); f(args.y ); break; } case OP_TYPE::CO_SWIZZLE: { OP::ColourSwizzleArgs args = program.GetOpArgs(at); for (int t=0;t(at); for (int32 t = 0; t < MUTABLE_OP_MAX_SWIZZLE_CHANNELS; ++t) { f(args.v[t]); } break; } case OP_TYPE::CO_ARITHMETIC: { OP::ArithmeticArgs args = program.GetOpArgs(at); f(args.a); f(args.b); break; } //------------------------------------------------------------------------------------- case OP_TYPE::IM_LAYER: { OP::ImageLayerArgs args = program.GetOpArgs(at); f(args.base ); if ( args.mask ) { f(args.mask ); } f(args.blended ); break; } case OP_TYPE::IM_LAYERCOLOUR: { OP::ImageLayerColourArgs args = program.GetOpArgs(at); f(args.base ); if ( args.mask ) { f(args.mask ); } f(args.colour ); break; } case OP_TYPE::IM_MULTILAYER: { OP::ImageMultiLayerArgs args = program.GetOpArgs(at); f(args.rangeSize ); f(args.base ); if ( args.mask ) { f(args.mask ); } f(args.blended ); break; } case OP_TYPE::IM_NORMALCOMPOSITE: { OP::ImageNormalCompositeArgs args = program.GetOpArgs(at); f(args.base); f(args.normal); break; } case OP_TYPE::IM_PIXELFORMAT: { OP::ImagePixelFormatArgs args = program.GetOpArgs(at); f(args.source ); break; } case OP_TYPE::IM_MIPMAP: { OP::ImageMipmapArgs args = program.GetOpArgs(at); f(args.source ); break; } case OP_TYPE::IM_RESIZE: { OP::ImageResizeArgs args = program.GetOpArgs(at); f(args.source ); break; } case OP_TYPE::IM_RESIZELIKE: { OP::ImageResizeLikeArgs args = program.GetOpArgs(at); f(args.source ); f(args.sizeSource ); break; } case OP_TYPE::IM_RESIZEREL: { OP::ImageResizeRelArgs args = program.GetOpArgs(at); f(args.source ); break; } case OP_TYPE::IM_BLANKLAYOUT: { OP::ImageBlankLayoutArgs args = program.GetOpArgs(at); f(args.layout ); break; } case OP_TYPE::IM_COMPOSE: { OP::ImageComposeArgs args = program.GetOpArgs(at); f(args.layout ); f(args.base ); f(args.blockImage ); f(args.mask ); break; } case OP_TYPE::IM_INTERPOLATE: { OP::ImageInterpolateArgs args = program.GetOpArgs(at); f(args.factor ); for (int t=0;t(at); for (int t=0;t(at); f(args.base ); f(args.factor ); break; } case OP_TYPE::IM_LUMINANCE: { OP::ImageLuminanceArgs args = program.GetOpArgs(at); f(args.base ); break; } case OP_TYPE::IM_COLOURMAP: { OP::ImageColourMapArgs args = program.GetOpArgs(at); f(args.base ); f(args.mask ); f(args.map ); break; } case OP_TYPE::IM_GRADIENT: { OP::ImageGradientArgs args = program.GetOpArgs(at); f(args.colour0 ); f(args.colour1 ); break; } case OP_TYPE::IM_BINARISE: { OP::ImageBinariseArgs args = program.GetOpArgs(at); f(args.base ); f(args.threshold ); break; } case OP_TYPE::IM_PLAINCOLOUR: { OP::ImagePlainColourArgs args = program.GetOpArgs(at); f(args.colour ); break; } case OP_TYPE::IM_CROP: { OP::ImageCropArgs args = program.GetOpArgs(at); f(args.source ); break; } case OP_TYPE::IM_PATCH: { OP::ImagePatchArgs args = program.GetOpArgs(at); f(args.base ); f(args.patch ); break; } case OP_TYPE::IM_RASTERMESH: { OP::ImageRasterMeshArgs args = program.GetOpArgs(at); f(args.mesh ); f(args.image ); f(args.mask ); f(args.angleFadeProperties ); f(args.projector ); break; } case OP_TYPE::IM_MAKEGROWMAP: { OP::ImageMakeGrowMapArgs args = program.GetOpArgs(at); f(args.mask ); break; } case OP_TYPE::IM_DISPLACE: { OP::ImageDisplaceArgs args = program.GetOpArgs(at); f(args.source ); f(args.displacementMap ); break; } case OP_TYPE::IM_INVERT: { OP::ImageInvertArgs args = program.GetOpArgs(at); f(args.base); break; } case OP_TYPE::IM_TRANSFORM: { OP::ImageTransformArgs Args = program.GetOpArgs(at); f(Args.Base); f(Args.OffsetX); f(Args.OffsetY); f(Args.ScaleX); f(Args.ScaleY); f(Args.Rotation); break; } //------------------------------------------------------------------------------------- case OP_TYPE::ME_APPLYLAYOUT: { OP::MeshApplyLayoutArgs args = program.GetOpArgs(at); f(args.layout ); f(args.mesh ); break; } case OP_TYPE::ME_DIFFERENCE: { const uint8_t* data = program.GetOpArgsPointer(at); OP::ADDRESS BaseAt = 0; FMemory::Memcpy(&BaseAt, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); f(BaseAt); OP::ADDRESS TargetAt = 0; FMemory::Memcpy(&TargetAt, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); f(TargetAt); break; } case OP_TYPE::ME_MORPH: { const uint8_t* data = program.GetOpArgsPointer(at); OP::ADDRESS FactorAt = 0; FMemory::Memcpy(&FactorAt, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); f(FactorAt); OP::ADDRESS BaseAt = 0; FMemory::Memcpy(&BaseAt, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); f(BaseAt); OP::ADDRESS TargetAt = 0; FMemory::Memcpy(&TargetAt, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS); f(TargetAt); break; } case OP_TYPE::ME_MERGE: { OP::MeshMergeArgs args = program.GetOpArgs(at); f(args.base ); f(args.added ); break; } case OP_TYPE::ME_INTERPOLATE: { OP::MeshInterpolateArgs args = program.GetOpArgs(at); f(args.factor ); f(args.base ); for (int t=0;t(at); f(args.source); f(args.clip); break; } case OP_TYPE::ME_MASKCLIPUVMASK: { OP::MeshMaskClipUVMaskArgs args = program.GetOpArgs(at); f(args.Source); f(args.MaskImage); f(args.MaskLayout); break; } case OP_TYPE::ME_MASKDIFF: { OP::MeshMaskDiffArgs args = program.GetOpArgs(at); f(args.source ); f(args.fragment ); break; } case OP_TYPE::ME_REMOVEMASK: { const uint8* data = program.GetOpArgsPointer(at); mu::OP::ADDRESS source; FMemory::Memcpy( &source, data, sizeof(OP::ADDRESS) ); data+=sizeof(OP::ADDRESS); f(source); EFaceCullStrategy FaceCullStrategy; FMemory::Memcpy(&FaceCullStrategy, data, sizeof(EFaceCullStrategy)); data += sizeof(EFaceCullStrategy); uint16 removes = 0; FMemory::Memcpy( &removes, data, sizeof(uint16) ); data+=sizeof(uint16); for (uint16 r=0; r(at); f(args.source ); f(args.format ); break; } case OP_TYPE::ME_TRANSFORM: { OP::MeshTransformArgs args = program.GetOpArgs(at); f(args.source ); break; } case OP_TYPE::ME_EXTRACTLAYOUTBLOCK: { const uint8_t* data = program.GetOpArgsPointer(at); mu::OP::ADDRESS source; FMemory::Memcpy( &source, data, sizeof(OP::ADDRESS) ); f(source); break; } case OP_TYPE::ME_CLIPMORPHPLANE: { OP::MeshClipMorphPlaneArgs args = program.GetOpArgs(at); f(args.source); break; } case OP_TYPE::ME_CLIPWITHMESH : { OP::MeshClipWithMeshArgs args = program.GetOpArgs(at); f(args.source); f(args.clipMesh); break; } case OP_TYPE::ME_CLIPDEFORM: { OP::MeshClipDeformArgs args = program.GetOpArgs(at); f(args.mesh); f(args.clipShape); break; } case OP_TYPE::ME_MORPHRESHAPE: { OP::MeshMorphReshapeArgs Args = program.GetOpArgs(at); f(Args.Morph); f(Args.Reshape); break; } case OP_TYPE::ME_SETSKELETON : { OP::MeshSetSkeletonArgs args = program.GetOpArgs(at); f(args.source); f(args.skeleton); break; } case OP_TYPE::ME_PROJECT : { OP::MeshProjectArgs args = program.GetOpArgs(at); f(args.mesh); f(args.projector); break; } case OP_TYPE::ME_APPLYPOSE: { OP::MeshApplyPoseArgs args = program.GetOpArgs(at); f(args.base); f(args.pose); break; } case OP_TYPE::ME_GEOMETRYOPERATION: { OP::MeshGeometryOperationArgs args = program.GetOpArgs(at); f(args.meshA); f(args.meshB); f(args.scalarA); f(args.scalarB); break; } case OP_TYPE::ME_BINDSHAPE: { OP::MeshBindShapeArgs args = program.GetOpArgs(at); f(args.mesh); f(args.shape); break; } case OP_TYPE::ME_APPLYSHAPE: { OP::MeshApplyShapeArgs args = program.GetOpArgs(at); f(args.mesh); f(args.shape); break; } case OP_TYPE::ME_OPTIMIZESKINNING: { OP::MeshOptimizeSkinningArgs args = program.GetOpArgs(at); f(args.source); break; } case OP_TYPE::ME_TRANSFORMWITHMESH : { OP::MeshTransformWithinMeshArgs args = program.GetOpArgs(at); f(args.sourceMesh); f(args.boundingMesh); f(args.matrix); break; } //------------------------------------------------------------------------------------- case OP_TYPE::IN_ADDMESH: case OP_TYPE::IN_ADDIMAGE: case OP_TYPE::IN_ADDVECTOR: case OP_TYPE::IN_ADDSCALAR: case OP_TYPE::IN_ADDSTRING: case OP_TYPE::IN_ADDCOMPONENT: case OP_TYPE::IN_ADDSURFACE: { OP::InstanceAddArgs args = program.GetOpArgs(at); f(args.instance ); f(args.value ); break; } case OP_TYPE::IN_ADDLOD: { const uint8* Data = program.GetOpArgsPointer(at); uint8 LODCount; FMemory::Memcpy(&LODCount, Data, sizeof(uint8)); Data += sizeof(uint8); for (int8 LODIndex = 0; LODIndex < LODCount; ++LODIndex) { OP::ADDRESS LODAddress; FMemory::Memcpy(&LODAddress, Data, sizeof(OP::ADDRESS)); Data += sizeof(OP::ADDRESS); f(LODAddress); } break; } case OP_TYPE::IN_ADDEXTENSIONDATA: { const OP::InstanceAddExtensionDataArgs Args = program.GetOpArgs(at); f(Args.Instance); f(Args.ExtensionData); break; } //------------------------------------------------------------------------------------- case OP_TYPE::LA_PACK: { OP::LayoutPackArgs args = program.GetOpArgs(at); f(args.Source ); break; } case OP_TYPE::LA_MERGE: { OP::LayoutMergeArgs args = program.GetOpArgs(at); f(args.Base ); f(args.Added ); break; } case OP_TYPE::LA_REMOVEBLOCKS: { OP::LayoutRemoveBlocksArgs args = program.GetOpArgs(at); f(args.Source); f(args.ReferenceLayout); break; } case OP_TYPE::LA_FROMMESH: { OP::LayoutFromMeshArgs args = program.GetOpArgs(at); f(args.Mesh); break; } default: check( false ); break; } } }