You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#jira UE-225386, UE-225387 #rb alexei.lebedev, gerard.martin, jordi.rovira [CL 36755590 by halfdan ingvarsson in 5.5 branch]
1112 lines
42 KiB
C++
1112 lines
42 KiB
C++
// 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<void(OP::ADDRESS*)> 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<MUTABLE_OP_MAX_SWIZZLE_CHANNELS;++t)
|
|
{
|
|
f(&op.args.ColourSwizzle.sources[t] );
|
|
}
|
|
break;
|
|
|
|
case OP_TYPE::CO_FROMSCALARS:
|
|
for (int32 t = 0; t < MUTABLE_OP_MAX_SWIZZLE_CHANNELS; ++t)
|
|
{
|
|
f(&op.args.ColourFromScalars.v[t]);
|
|
}
|
|
break;
|
|
|
|
case OP_TYPE::CO_ARITHMETIC:
|
|
f(&op.args.ColourArithmetic.a);
|
|
f(&op.args.ColourArithmetic.b);
|
|
break;
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::IM_RESIZE:
|
|
f(&op.args.ImageResize.source );
|
|
break;
|
|
|
|
case OP_TYPE::IM_RESIZELIKE:
|
|
f(&op.args.ImageResizeLike.source );
|
|
f(&op.args.ImageResizeLike.sizeSource );
|
|
break;
|
|
|
|
case OP_TYPE::IM_RESIZEREL:
|
|
f(&op.args.ImageResizeRel.source );
|
|
break;
|
|
|
|
case OP_TYPE::IM_BLANKLAYOUT:
|
|
f(&op.args.ImageBlankLayout.layout );
|
|
break;
|
|
|
|
case OP_TYPE::IM_INTERPOLATE:
|
|
f(&op.args.ImageInterpolate.factor );
|
|
|
|
for (int t=0;t<MUTABLE_OP_MAX_INTERPOLATE_COUNT;++t)
|
|
{
|
|
f(&op.args.ImageInterpolate.targets[t] );
|
|
}
|
|
break;
|
|
|
|
case OP_TYPE::IM_SATURATE:
|
|
f(&op.args.ImageSaturate.base );
|
|
f(&op.args.ImageSaturate.factor );
|
|
break;
|
|
|
|
case OP_TYPE::IM_LUMINANCE:
|
|
f(&op.args.ImageLuminance.base );
|
|
break;
|
|
|
|
case OP_TYPE::IM_COLOURMAP:
|
|
f(&op.args.ImageColourMap.base );
|
|
f(&op.args.ImageColourMap.mask );
|
|
f(&op.args.ImageColourMap.map );
|
|
break;
|
|
|
|
case OP_TYPE::IM_GRADIENT:
|
|
f(&op.args.ImageGradient.colour0 );
|
|
f(&op.args.ImageGradient.colour1 );
|
|
break;
|
|
|
|
case OP_TYPE::IM_BINARISE:
|
|
f(&op.args.ImageBinarise.base );
|
|
f(&op.args.ImageBinarise.threshold );
|
|
break;
|
|
|
|
case OP_TYPE::IM_PLAINCOLOUR:
|
|
f(&op.args.ImagePlainColour.colour );
|
|
break;
|
|
|
|
case OP_TYPE::IM_DISPLACE:
|
|
f(&op.args.ImageDisplace.source );
|
|
f(&op.args.ImageDisplace.displacementMap );
|
|
break;
|
|
|
|
case OP_TYPE::IM_INVERT:
|
|
f(&op.args.ImageInvert.base);
|
|
break;
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::ME_APPLYLAYOUT:
|
|
f(&op.args.MeshApplyLayout.layout );
|
|
f(&op.args.MeshApplyLayout.mesh );
|
|
break;
|
|
|
|
case OP_TYPE::ME_MERGE:
|
|
f(&op.args.MeshMerge.base );
|
|
f(&op.args.MeshMerge.added );
|
|
break;
|
|
|
|
case OP_TYPE::ME_INTERPOLATE:
|
|
f(&op.args.MeshInterpolate.factor );
|
|
f(&op.args.MeshInterpolate.base );
|
|
|
|
for (int t=0;t<MUTABLE_OP_MAX_INTERPOLATE_COUNT-1;++t)
|
|
{
|
|
f(&op.args.MeshInterpolate.targets[t] );
|
|
}
|
|
break;
|
|
|
|
case OP_TYPE::ME_MASKDIFF:
|
|
f(&op.args.MeshMaskDiff.source );
|
|
f(&op.args.MeshMaskDiff.fragment );
|
|
break;
|
|
|
|
case OP_TYPE::ME_CLIPMORPHPLANE:
|
|
f(&op.args.MeshClipMorphPlane.source);
|
|
break;
|
|
|
|
case OP_TYPE::ME_CLIPWITHMESH :
|
|
f(&op.args.MeshClipWithMesh.source);
|
|
f(&op.args.MeshClipWithMesh.clipMesh);
|
|
break;
|
|
|
|
case OP_TYPE::ME_SETSKELETON :
|
|
f(&op.args.MeshSetSkeleton.source);
|
|
f(&op.args.MeshSetSkeleton.skeleton);
|
|
break;
|
|
|
|
case OP_TYPE::ME_PROJECT:
|
|
f(&op.args.MeshProject.mesh);
|
|
f(&op.args.MeshProject.projector);
|
|
break;
|
|
|
|
default:
|
|
check( false );
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
void ForEachReference( const FProgram& program, OP::ADDRESS at, const TFunctionRef<void(OP::ADDRESS)> 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<OP::ScalarCurveArgs>(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<OP::ConditionalArgs>(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<OP::BoolLessArgs>(at);
|
|
f(args.a );
|
|
f(args.b );
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::BO_EQUAL_INT_CONST:
|
|
{
|
|
OP::BoolEqualScalarConstArgs args = program.GetOpArgs<OP::BoolEqualScalarConstArgs>(at);
|
|
f(args.value );
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::BO_AND:
|
|
case OP_TYPE::BO_OR:
|
|
{
|
|
OP::BoolBinaryArgs args = program.GetOpArgs<OP::BoolBinaryArgs>(at);
|
|
f(args.a );
|
|
f(args.b );
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::BO_NOT:
|
|
{
|
|
OP::BoolNotArgs args = program.GetOpArgs<OP::BoolNotArgs>(at);
|
|
f(args.source );
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::SC_MULTIPLYADD:
|
|
{
|
|
OP::ScalarMultiplyAddArgs args = program.GetOpArgs<OP::ScalarMultiplyAddArgs>(at);
|
|
f(args.factor0 );
|
|
f(args.factor1 );
|
|
f(args.add );
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::SC_ARITHMETIC:
|
|
{
|
|
OP::ArithmeticArgs args = program.GetOpArgs<OP::ArithmeticArgs>(at);
|
|
f(args.a );
|
|
f(args.b );
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::CO_SAMPLEIMAGE:
|
|
{
|
|
OP::ColourSampleImageArgs args = program.GetOpArgs<OP::ColourSampleImageArgs>(at);
|
|
f(args.image );
|
|
f(args.x );
|
|
f(args.y );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::CO_SWIZZLE:
|
|
{
|
|
OP::ColourSwizzleArgs args = program.GetOpArgs<OP::ColourSwizzleArgs>(at);
|
|
for (int t=0;t<MUTABLE_OP_MAX_SWIZZLE_CHANNELS;++t)
|
|
{
|
|
f(args.sources[t] );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::CO_FROMSCALARS:
|
|
{
|
|
OP::ColourFromScalarsArgs args = program.GetOpArgs<OP::ColourFromScalarsArgs>(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<OP::ArithmeticArgs>(at);
|
|
f(args.a);
|
|
f(args.b);
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::IM_LAYER:
|
|
{
|
|
OP::ImageLayerArgs args = program.GetOpArgs<OP::ImageLayerArgs>(at);
|
|
f(args.base );
|
|
if ( args.mask )
|
|
{
|
|
f(args.mask );
|
|
}
|
|
f(args.blended );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_LAYERCOLOUR:
|
|
{
|
|
OP::ImageLayerColourArgs args = program.GetOpArgs<OP::ImageLayerColourArgs>(at);
|
|
f(args.base );
|
|
if ( args.mask )
|
|
{
|
|
f(args.mask );
|
|
}
|
|
f(args.colour );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_MULTILAYER:
|
|
{
|
|
OP::ImageMultiLayerArgs args = program.GetOpArgs<OP::ImageMultiLayerArgs>(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<OP::ImageNormalCompositeArgs>(at);
|
|
f(args.base);
|
|
f(args.normal);
|
|
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_PIXELFORMAT:
|
|
{
|
|
OP::ImagePixelFormatArgs args = program.GetOpArgs<OP::ImagePixelFormatArgs>(at);
|
|
f(args.source );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_MIPMAP:
|
|
{
|
|
OP::ImageMipmapArgs args = program.GetOpArgs<OP::ImageMipmapArgs>(at);
|
|
f(args.source );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_RESIZE:
|
|
{
|
|
OP::ImageResizeArgs args = program.GetOpArgs<OP::ImageResizeArgs>(at);
|
|
f(args.source );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_RESIZELIKE:
|
|
{
|
|
OP::ImageResizeLikeArgs args = program.GetOpArgs<OP::ImageResizeLikeArgs>(at);
|
|
f(args.source );
|
|
f(args.sizeSource );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_RESIZEREL:
|
|
{
|
|
OP::ImageResizeRelArgs args = program.GetOpArgs<OP::ImageResizeRelArgs>(at);
|
|
f(args.source );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_BLANKLAYOUT:
|
|
{
|
|
OP::ImageBlankLayoutArgs args = program.GetOpArgs<OP::ImageBlankLayoutArgs>(at);
|
|
f(args.layout );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_COMPOSE:
|
|
{
|
|
OP::ImageComposeArgs args = program.GetOpArgs<OP::ImageComposeArgs>(at);
|
|
f(args.layout );
|
|
f(args.base );
|
|
f(args.blockImage );
|
|
f(args.mask );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_INTERPOLATE:
|
|
{
|
|
OP::ImageInterpolateArgs args = program.GetOpArgs<OP::ImageInterpolateArgs>(at);
|
|
f(args.factor );
|
|
|
|
for (int t=0;t<MUTABLE_OP_MAX_INTERPOLATE_COUNT;++t)
|
|
{
|
|
f(args.targets[t] );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_SWIZZLE:
|
|
{
|
|
OP::ImageSwizzleArgs args = program.GetOpArgs<OP::ImageSwizzleArgs>(at);
|
|
for (int t=0;t<MUTABLE_OP_MAX_SWIZZLE_CHANNELS;++t)
|
|
{
|
|
f(args.sources[t] );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_SATURATE:
|
|
{
|
|
OP::ImageSaturateArgs args = program.GetOpArgs<OP::ImageSaturateArgs>(at);
|
|
f(args.base );
|
|
f(args.factor );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_LUMINANCE:
|
|
{
|
|
OP::ImageLuminanceArgs args = program.GetOpArgs<OP::ImageLuminanceArgs>(at);
|
|
f(args.base );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_COLOURMAP:
|
|
{
|
|
OP::ImageColourMapArgs args = program.GetOpArgs<OP::ImageColourMapArgs>(at);
|
|
f(args.base );
|
|
f(args.mask );
|
|
f(args.map );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_GRADIENT:
|
|
{
|
|
OP::ImageGradientArgs args = program.GetOpArgs<OP::ImageGradientArgs>(at);
|
|
f(args.colour0 );
|
|
f(args.colour1 );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_BINARISE:
|
|
{
|
|
OP::ImageBinariseArgs args = program.GetOpArgs<OP::ImageBinariseArgs>(at);
|
|
f(args.base );
|
|
f(args.threshold );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_PLAINCOLOUR:
|
|
{
|
|
OP::ImagePlainColourArgs args = program.GetOpArgs<OP::ImagePlainColourArgs>(at);
|
|
f(args.colour );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_CROP:
|
|
{
|
|
OP::ImageCropArgs args = program.GetOpArgs<OP::ImageCropArgs>(at);
|
|
f(args.source );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_PATCH:
|
|
{
|
|
OP::ImagePatchArgs args = program.GetOpArgs<OP::ImagePatchArgs>(at);
|
|
f(args.base );
|
|
f(args.patch );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_RASTERMESH:
|
|
{
|
|
OP::ImageRasterMeshArgs args = program.GetOpArgs<OP::ImageRasterMeshArgs>(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<OP::ImageMakeGrowMapArgs>(at);
|
|
f(args.mask );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_DISPLACE:
|
|
{
|
|
OP::ImageDisplaceArgs args = program.GetOpArgs<OP::ImageDisplaceArgs>(at);
|
|
f(args.source );
|
|
f(args.displacementMap );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_INVERT:
|
|
{
|
|
OP::ImageInvertArgs args = program.GetOpArgs<OP::ImageInvertArgs>(at);
|
|
f(args.base);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::IM_TRANSFORM:
|
|
{
|
|
OP::ImageTransformArgs Args = program.GetOpArgs<OP::ImageTransformArgs>(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<OP::MeshApplyLayoutArgs>(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<OP::MeshMergeArgs>(at);
|
|
f(args.base );
|
|
f(args.added );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_INTERPOLATE:
|
|
{
|
|
OP::MeshInterpolateArgs args = program.GetOpArgs<OP::MeshInterpolateArgs>(at);
|
|
f(args.factor );
|
|
f(args.base );
|
|
|
|
for (int t=0;t<MUTABLE_OP_MAX_INTERPOLATE_COUNT-1;++t)
|
|
{
|
|
f(args.targets[t] );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_MASKCLIPMESH:
|
|
{
|
|
OP::MeshMaskClipMeshArgs args = program.GetOpArgs<OP::MeshMaskClipMeshArgs>(at);
|
|
f(args.source);
|
|
f(args.clip);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_MASKCLIPUVMASK:
|
|
{
|
|
OP::MeshMaskClipUVMaskArgs args = program.GetOpArgs<OP::MeshMaskClipUVMaskArgs>(at);
|
|
f(args.Source);
|
|
f(args.MaskImage);
|
|
f(args.MaskLayout);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_MASKDIFF:
|
|
{
|
|
OP::MeshMaskDiffArgs args = program.GetOpArgs<OP::MeshMaskDiffArgs>(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<removes; ++r)
|
|
{
|
|
mu::OP::ADDRESS condition;
|
|
FMemory::Memcpy( &condition, data, sizeof(OP::ADDRESS) ); data+=sizeof(OP::ADDRESS);
|
|
f(condition);
|
|
|
|
mu::OP::ADDRESS mask;
|
|
FMemory::Memcpy( &mask, data, sizeof(OP::ADDRESS) ); data+=sizeof(OP::ADDRESS);
|
|
f(mask);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_ADDTAGS:
|
|
{
|
|
const uint8_t* data = program.GetOpArgsPointer(at);
|
|
mu::OP::ADDRESS source;
|
|
FMemory::Memcpy(&source, data, sizeof(OP::ADDRESS)); data += sizeof(OP::ADDRESS);
|
|
f(source);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_FORMAT:
|
|
{
|
|
OP::MeshFormatArgs args = program.GetOpArgs<OP::MeshFormatArgs>(at);
|
|
f(args.source );
|
|
f(args.format );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_TRANSFORM:
|
|
{
|
|
OP::MeshTransformArgs args = program.GetOpArgs<OP::MeshTransformArgs>(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<OP::MeshClipMorphPlaneArgs>(at);
|
|
f(args.source);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_CLIPWITHMESH :
|
|
{
|
|
OP::MeshClipWithMeshArgs args = program.GetOpArgs<OP::MeshClipWithMeshArgs>(at);
|
|
f(args.source);
|
|
f(args.clipMesh);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_CLIPDEFORM:
|
|
{
|
|
OP::MeshClipDeformArgs args = program.GetOpArgs<OP::MeshClipDeformArgs>(at);
|
|
f(args.mesh);
|
|
f(args.clipShape);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_MORPHRESHAPE:
|
|
{
|
|
OP::MeshMorphReshapeArgs Args = program.GetOpArgs<OP::MeshMorphReshapeArgs>(at);
|
|
f(Args.Morph);
|
|
f(Args.Reshape);
|
|
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_SETSKELETON :
|
|
{
|
|
OP::MeshSetSkeletonArgs args = program.GetOpArgs<OP::MeshSetSkeletonArgs>(at);
|
|
f(args.source);
|
|
f(args.skeleton);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_PROJECT :
|
|
{
|
|
OP::MeshProjectArgs args = program.GetOpArgs<OP::MeshProjectArgs>(at);
|
|
f(args.mesh);
|
|
f(args.projector);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_APPLYPOSE:
|
|
{
|
|
OP::MeshApplyPoseArgs args = program.GetOpArgs<OP::MeshApplyPoseArgs>(at);
|
|
f(args.base);
|
|
f(args.pose);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_GEOMETRYOPERATION:
|
|
{
|
|
OP::MeshGeometryOperationArgs args = program.GetOpArgs<OP::MeshGeometryOperationArgs>(at);
|
|
f(args.meshA);
|
|
f(args.meshB);
|
|
f(args.scalarA);
|
|
f(args.scalarB);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_BINDSHAPE:
|
|
{
|
|
OP::MeshBindShapeArgs args = program.GetOpArgs<OP::MeshBindShapeArgs>(at);
|
|
f(args.mesh);
|
|
f(args.shape);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_APPLYSHAPE:
|
|
{
|
|
OP::MeshApplyShapeArgs args = program.GetOpArgs<OP::MeshApplyShapeArgs>(at);
|
|
f(args.mesh);
|
|
f(args.shape);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_OPTIMIZESKINNING:
|
|
{
|
|
OP::MeshOptimizeSkinningArgs args = program.GetOpArgs<OP::MeshOptimizeSkinningArgs>(at);
|
|
f(args.source);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::ME_TRANSFORMWITHMESH :
|
|
{
|
|
OP::MeshTransformWithinMeshArgs args = program.GetOpArgs<OP::MeshTransformWithinMeshArgs>(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<OP::InstanceAddArgs>(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<OP::InstanceAddExtensionDataArgs>(at);
|
|
|
|
f(Args.Instance);
|
|
f(Args.ExtensionData);
|
|
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
case OP_TYPE::LA_PACK:
|
|
{
|
|
OP::LayoutPackArgs args = program.GetOpArgs<OP::LayoutPackArgs>(at);
|
|
f(args.Source );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::LA_MERGE:
|
|
{
|
|
OP::LayoutMergeArgs args = program.GetOpArgs<OP::LayoutMergeArgs>(at);
|
|
f(args.Base );
|
|
f(args.Added );
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::LA_REMOVEBLOCKS:
|
|
{
|
|
OP::LayoutRemoveBlocksArgs args = program.GetOpArgs<OP::LayoutRemoveBlocksArgs>(at);
|
|
f(args.Source);
|
|
f(args.ReferenceLayout);
|
|
break;
|
|
}
|
|
|
|
case OP_TYPE::LA_FROMMESH:
|
|
{
|
|
OP::LayoutFromMeshArgs args = program.GetOpArgs<OP::LayoutFromMeshArgs>(at);
|
|
f(args.Mesh);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
check( false );
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|