Several fixes

This commit is contained in:
barsdeveloper
2024-02-15 00:09:15 +01:00
parent 67fc3c219b
commit 34a4f2746f
10 changed files with 311 additions and 77 deletions

95
dist/ueblueprint.js vendored
View File

@@ -180,6 +180,7 @@ class Configuration {
materialExpressionConstant2Vector: "/Script/Engine.MaterialExpressionConstant2Vector", materialExpressionConstant2Vector: "/Script/Engine.MaterialExpressionConstant2Vector",
materialExpressionConstant3Vector: "/Script/Engine.MaterialExpressionConstant3Vector", materialExpressionConstant3Vector: "/Script/Engine.MaterialExpressionConstant3Vector",
materialExpressionConstant4Vector: "/Script/Engine.MaterialExpressionConstant4Vector", materialExpressionConstant4Vector: "/Script/Engine.MaterialExpressionConstant4Vector",
materialExpressionFunctionInput: "/Script/Engine.MaterialExpressionFunctionInput",
materialExpressionLogarithm: "/Script/InterchangeImport.MaterialExpressionLogarithm", materialExpressionLogarithm: "/Script/InterchangeImport.MaterialExpressionLogarithm",
materialExpressionLogarithm10: "/Script/Engine.MaterialExpressionLogarithm10", materialExpressionLogarithm10: "/Script/Engine.MaterialExpressionLogarithm10",
materialExpressionLogarithm2: "/Script/Engine.MaterialExpressionLogarithm2", materialExpressionLogarithm2: "/Script/Engine.MaterialExpressionLogarithm2",
@@ -282,11 +283,12 @@ class Configuration {
static subObjectAttributeNamePrefix = "#SubObject" static subObjectAttributeNamePrefix = "#SubObject"
/** @param {ObjectEntity} objectEntity */ /** @param {ObjectEntity} objectEntity */
static subObjectAttributeNameFromEntity = (objectEntity, nameOnly = false) => static subObjectAttributeNameFromEntity = (objectEntity, nameOnly = false) =>
this.subObjectAttributeNamePrefix + (!nameOnly && objectEntity.Class ? `_${objectEntity.Class}` : "") this.subObjectAttributeNamePrefix + (!nameOnly && objectEntity.Class ? `_${objectEntity.Class.type}` : "")
+ `_${objectEntity.Name}` + "_" + objectEntity.Name
/** @param {ObjectReferenceEntity} objectReferenceEntity */ /** @param {ObjectReferenceEntity} objectReferenceEntity */
static subObjectAttributeNameFromReference = (objectReferenceEntity, nameOnly = false) => static subObjectAttributeNameFromReference = (objectReferenceEntity, nameOnly = false) =>
this.subObjectAttributeNamePrefix + (!nameOnly ? "_" + objectReferenceEntity.type : "") + "_" + objectReferenceEntity.path this.subObjectAttributeNamePrefix + (!nameOnly ? "_" + objectReferenceEntity.type : "")
+ "_" + objectReferenceEntity.path
static subObjectAttributeNameFromName = name => this.subObjectAttributeNamePrefix + "_" + name static subObjectAttributeNameFromName = name => this.subObjectAttributeNamePrefix + "_" + name
static switchTargetPattern = /\/Script\/[\w\.\/\:]+K2Node_Switch([A-Z]\w+)+/ static switchTargetPattern = /\/Script\/[\w\.\/\:]+K2Node_Switch([A-Z]\w+)+/
static trackingMouseEventName = { static trackingMouseEventName = {
@@ -2573,17 +2575,6 @@ class Grammar {
static colorValue = Parsernostrum.numberByte static colorValue = Parsernostrum.numberByte
static word = Parsernostrum.reg(Grammar.Regex.Word) static word = Parsernostrum.reg(Grammar.Regex.Word)
static pathQuotes = Parsernostrum.regArray(new RegExp(
`'"(` + Grammar.Regex.InsideString.source + `)"'`
+ `|'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
+ `|"(` + Grammar.Regex.InsideString.source + `)"`
)).map(([_0, a, b, c]) => a ?? b ?? c)
static path = Parsernostrum.regArray(new RegExp(
`'"(` + Grammar.Regex.InsideString.source + `)"'`
+ `|'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
+ `|"(` + Grammar.Regex.InsideString.source + `)"`
+ `|(` + Grammar.Regex.Path.source + `)`
)).map(([_0, a, b, c, d]) => a ?? b ?? c ?? d)
static symbol = Parsernostrum.reg(Grammar.Regex.Symbol) static symbol = Parsernostrum.reg(Grammar.Regex.Symbol)
static symbolQuoted = Parsernostrum.reg(new RegExp('"(' + Grammar.Regex.Symbol.source + ')"'), 1) static symbolQuoted = Parsernostrum.reg(new RegExp('"(' + Grammar.Regex.Symbol.source + ')"'), 1)
static attributeName = Parsernostrum.reg(Grammar.Regex.DotSeparatedSymbols) static attributeName = Parsernostrum.reg(Grammar.Regex.DotSeparatedSymbols)
@@ -2592,7 +2583,6 @@ class Grammar {
static commaSeparation = Parsernostrum.reg(/\s*,\s*(?!\))/) static commaSeparation = Parsernostrum.reg(/\s*,\s*(?!\))/)
static commaOrSpaceSeparation = Parsernostrum.reg(/\s*,\s*(?!\))|\s+/) static commaOrSpaceSeparation = Parsernostrum.reg(/\s*,\s*(?!\))|\s+/)
static equalSeparation = Parsernostrum.reg(/\s*=\s*/) static equalSeparation = Parsernostrum.reg(/\s*=\s*/)
static typeReference = Parsernostrum.alt(Parsernostrum.reg(Grammar.Regex.Path), this.symbol)
static hexColorChannel = Parsernostrum.reg(new RegExp(Grammar.Regex.HexDigit.source + "{2}")) static hexColorChannel = Parsernostrum.reg(new RegExp(Grammar.Regex.HexDigit.source + "{2}"))
/* --- Factory --- */ /* --- Factory --- */
@@ -2832,22 +2822,44 @@ class ObjectReferenceEntity extends IEntity {
static { static {
this.cleanupAttributes(this.attributes); this.cleanupAttributes(this.attributes);
} }
static noneReferenceGrammar = Parsernostrum.str("None").map(() => this.createNoneInstance()) static quoted = Parsernostrum.regArray(new RegExp(
static fullReferenceGrammar = Parsernostrum.seq( `'"(` + Grammar.Regex.InsideString.source + `)"'`
Grammar.typeReference, + `|'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
Parsernostrum.whitespaceInlineOpt, + `|"(` + Grammar.Regex.InsideString.source + `)"`
Grammar.pathQuotes )).map(([_0, a, b, c]) => a ?? b ?? c)
).map(([type, _2, path]) => new this({ type, path })) static path = this.quoted.getParser().parser.regexp.source + "|" + Grammar.Regex.Path.source
static typeReferenceGrammar = Grammar.typeReference.map(v => new this({ type: v, path: "" })) static typeReference = Parsernostrum.reg(
static pathReferenceGrammar = Grammar.path.map(path => new this({ type: "", path: path })) new RegExp(Grammar.Regex.Path.source + "|" + Grammar.symbol.getParser().regexp.source)
)
static fullReferenceGrammar = Parsernostrum.regArray(
new RegExp(
"(" + this.typeReference.getParser().regexp.source + ")"
+ /\s*/.source
+ "(?:" + this.quoted.getParser().parser.regexp.source + ")"
)
).map(([_0, type, ...path]) => new this({ type, path: path.find(v => v) }))
static fullReferenceSerializedGrammar = Parsernostrum.regArray(
new RegExp(
"(" + this.typeReference.getParser().regexp.source + ")"
+ /\s*/.source
+ `'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
)
).map(([_0, type, ...path]) => new this({ type, path: path.find(v => v) }))
static typeReferenceGrammar = this.typeReference.map(v => new this({ type: v, path: "" }))
static grammar = this.createGrammar() static grammar = this.createGrammar()
static createGrammar() { static createGrammar() {
return Parsernostrum.alt( return Parsernostrum.alt(
this.noneReferenceGrammar, Parsernostrum.seq(
Parsernostrum.str('"'),
Parsernostrum.alt(
this.fullReferenceSerializedGrammar,
this.typeReferenceGrammar,
),
Parsernostrum.str('"'),
).map(([_0, objectReference, _1]) => objectReference),
this.fullReferenceGrammar, this.fullReferenceGrammar,
this.typeReferenceGrammar, this.typeReferenceGrammar,
this.pathReferenceGrammar,
) )
} }
@@ -2885,7 +2897,7 @@ class ObjectReferenceEntity extends IEntity {
} }
toString() { toString() {
return `${this.type}'"${this.path}"'` return this.type + (this.path ? `'${this.path}'` : "")
} }
} }
@@ -4900,10 +4912,12 @@ class ObjectEntity extends IEntity {
HiGenGridSize: { type: SymbolEntity }, HiGenGridSize: { type: SymbolEntity },
InputAxisKey: { type: SymbolEntity }, InputAxisKey: { type: SymbolEntity },
InputKey: { type: SymbolEntity }, InputKey: { type: SymbolEntity },
InputName: { type: String },
InputPins: { InputPins: {
type: [ObjectReferenceEntity], type: [ObjectReferenceEntity],
inlined: true, inlined: true,
}, },
InputType: { type: SymbolEntity },
MacroGraphReference: { type: MacroGraphReferenceEntity }, MacroGraphReference: { type: MacroGraphReferenceEntity },
MaterialExpression: { type: ObjectReferenceEntity }, MaterialExpression: { type: ObjectReferenceEntity },
MaterialExpressionComment: { type: ObjectReferenceEntity }, MaterialExpressionComment: { type: ObjectReferenceEntity },
@@ -5006,7 +5020,6 @@ class ObjectEntity extends IEntity {
.map(object => .map(object =>
values => values[Configuration.subObjectAttributeNameFromEntity(object)] = object values => values[Configuration.subObjectAttributeNameFromEntity(object)] = object
) )
} }
static createGrammar() { static createGrammar() {
@@ -5160,6 +5173,7 @@ class ObjectEntity extends IEntity {
/** @type {String} */ this.CustomFunctionName; /** @type {String} */ this.CustomFunctionName;
/** @type {String} */ this.DelegatePropertyName; /** @type {String} */ this.DelegatePropertyName;
/** @type {String} */ this.ErrorMsg; /** @type {String} */ this.ErrorMsg;
/** @type {String} */ this.InputName;
/** @type {String} */ this.Name; /** @type {String} */ this.Name;
/** @type {String} */ this.NodeComment; /** @type {String} */ this.NodeComment;
/** @type {String} */ this.NodeTitle; /** @type {String} */ this.NodeTitle;
@@ -5172,6 +5186,7 @@ class ObjectEntity extends IEntity {
/** @type {SymbolEntity} */ this.HiGenGridSize; /** @type {SymbolEntity} */ this.HiGenGridSize;
/** @type {SymbolEntity} */ this.InputAxisKey; /** @type {SymbolEntity} */ this.InputAxisKey;
/** @type {SymbolEntity} */ this.InputKey; /** @type {SymbolEntity} */ this.InputKey;
/** @type {SymbolEntity} */ this.InputType;
/** @type {SymbolEntity} */ this.MoveMode; /** @type {SymbolEntity} */ this.MoveMode;
/** @type {SymbolEntity} */ this.SelfContextInfo; /** @type {SymbolEntity} */ this.SelfContextInfo;
/** @type {VariableReferenceEntity} */ this.DelegateReference; /** @type {VariableReferenceEntity} */ this.DelegateReference;
@@ -5388,7 +5403,24 @@ class ObjectEntity extends IEntity {
} }
isMaterial() { isMaterial() {
return this.getClass() === Configuration.paths.materialGraphNode return this.getClass() === Configuration.paths.materialGraphNode
// return [
// Configuration.paths.materialExpressionConstant,
// Configuration.paths.materialExpressionConstant2Vector,
// Configuration.paths.materialExpressionConstant3Vector,
// Configuration.paths.materialExpressionConstant4Vector,
// Configuration.paths.materialExpressionLogarithm,
// Configuration.paths.materialExpressionLogarithm10,
// Configuration.paths.materialExpressionLogarithm2,
// Configuration.paths.materialExpressionMaterialFunctionCall,
// Configuration.paths.materialExpressionSquareRoot,
// Configuration.paths.materialExpressionTextureCoordinate,
// Configuration.paths.materialExpressionTextureSample,
// Configuration.paths.materialGraphNode,
// Configuration.paths.materialGraphNodeComment,
// ]
// .includes(this.getClass())
} }
/** @return {ObjectEntity} */ /** @return {ObjectEntity} */
@@ -5515,6 +5547,11 @@ class ObjectEntity extends IEntity {
return input.map(v => Utility.printExponential(v)).reduce((acc, cur) => acc + "," + cur) return input.map(v => Utility.printExponential(v)).reduce((acc, cur) => acc + "," + cur)
} }
break break
case Configuration.paths.materialExpressionFunctionInput:
const materialObject = this.getMaterialSubobject();
const inputName = materialObject?.InputName ?? "In";
const inputType = materialObject?.InputType?.value.match(/^.+?_(\w+)$/)?.[1] ?? "Vector3";
return `Input ${inputName} (${inputType})`
case Configuration.paths.materialExpressionLogarithm: case Configuration.paths.materialExpressionLogarithm:
return "Ln" return "Ln"
case Configuration.paths.materialExpressionLogarithm10: case Configuration.paths.materialExpressionLogarithm10:
@@ -5759,6 +5796,8 @@ class ObjectEntity extends IEntity {
return Configuration.nodeColors.darkBlue return Configuration.nodeColors.darkBlue
case Configuration.paths.materialExpressionMaterialFunctionCall: case Configuration.paths.materialExpressionMaterialFunctionCall:
return Configuration.nodeColors.blue return Configuration.nodeColors.blue
case Configuration.paths.materialExpressionFunctionInput:
return Configuration.nodeColors.red
case Configuration.paths.materialExpressionTextureSample: case Configuration.paths.materialExpressionTextureSample:
return Configuration.nodeColors.darkTurquoise return Configuration.nodeColors.darkTurquoise
case Configuration.paths.materialExpressionTextureCoordinate: case Configuration.paths.materialExpressionTextureCoordinate:
@@ -12798,7 +12837,7 @@ Grammar.unknownValue =
// Remember to keep the order, otherwise parsing might fail // Remember to keep the order, otherwise parsing might fail
Grammar.boolean, Grammar.boolean,
GuidEntity.createGrammar(), GuidEntity.createGrammar(),
ObjectReferenceEntity.noneReferenceGrammar, Parsernostrum.str("None").map(() => new ObjectReferenceEntity({ type: "None" })),
Grammar.null, Grammar.null,
Grammar.number, Grammar.number,
Grammar.string, Grammar.string,

File diff suppressed because one or more lines are too long

View File

@@ -156,6 +156,7 @@ export default class Configuration {
materialExpressionConstant2Vector: "/Script/Engine.MaterialExpressionConstant2Vector", materialExpressionConstant2Vector: "/Script/Engine.MaterialExpressionConstant2Vector",
materialExpressionConstant3Vector: "/Script/Engine.MaterialExpressionConstant3Vector", materialExpressionConstant3Vector: "/Script/Engine.MaterialExpressionConstant3Vector",
materialExpressionConstant4Vector: "/Script/Engine.MaterialExpressionConstant4Vector", materialExpressionConstant4Vector: "/Script/Engine.MaterialExpressionConstant4Vector",
materialExpressionFunctionInput: "/Script/Engine.MaterialExpressionFunctionInput",
materialExpressionLogarithm: "/Script/InterchangeImport.MaterialExpressionLogarithm", materialExpressionLogarithm: "/Script/InterchangeImport.MaterialExpressionLogarithm",
materialExpressionLogarithm10: "/Script/Engine.MaterialExpressionLogarithm10", materialExpressionLogarithm10: "/Script/Engine.MaterialExpressionLogarithm10",
materialExpressionLogarithm2: "/Script/Engine.MaterialExpressionLogarithm2", materialExpressionLogarithm2: "/Script/Engine.MaterialExpressionLogarithm2",
@@ -258,11 +259,12 @@ export default class Configuration {
static subObjectAttributeNamePrefix = "#SubObject" static subObjectAttributeNamePrefix = "#SubObject"
/** @param {ObjectEntity} objectEntity */ /** @param {ObjectEntity} objectEntity */
static subObjectAttributeNameFromEntity = (objectEntity, nameOnly = false) => static subObjectAttributeNameFromEntity = (objectEntity, nameOnly = false) =>
this.subObjectAttributeNamePrefix + (!nameOnly && objectEntity.Class ? `_${objectEntity.Class}` : "") this.subObjectAttributeNamePrefix + (!nameOnly && objectEntity.Class ? `_${objectEntity.Class.type}` : "")
+ `_${objectEntity.Name}` + "_" + objectEntity.Name
/** @param {ObjectReferenceEntity} objectReferenceEntity */ /** @param {ObjectReferenceEntity} objectReferenceEntity */
static subObjectAttributeNameFromReference = (objectReferenceEntity, nameOnly = false) => static subObjectAttributeNameFromReference = (objectReferenceEntity, nameOnly = false) =>
this.subObjectAttributeNamePrefix + (!nameOnly ? "_" + objectReferenceEntity.type : "") + "_" + objectReferenceEntity.path this.subObjectAttributeNamePrefix + (!nameOnly ? "_" + objectReferenceEntity.type : "")
+ "_" + objectReferenceEntity.path
static subObjectAttributeNameFromName = name => this.subObjectAttributeNamePrefix + "_" + name static subObjectAttributeNameFromName = name => this.subObjectAttributeNamePrefix + "_" + name
static switchTargetPattern = /\/Script\/[\w\.\/\:]+K2Node_Switch([A-Z]\w+)+/ static switchTargetPattern = /\/Script\/[\w\.\/\:]+K2Node_Switch([A-Z]\w+)+/
static trackingMouseEventName = { static trackingMouseEventName = {

View File

@@ -97,10 +97,12 @@ export default class ObjectEntity extends IEntity {
HiGenGridSize: { type: SymbolEntity }, HiGenGridSize: { type: SymbolEntity },
InputAxisKey: { type: SymbolEntity }, InputAxisKey: { type: SymbolEntity },
InputKey: { type: SymbolEntity }, InputKey: { type: SymbolEntity },
InputName: { type: String },
InputPins: { InputPins: {
type: [ObjectReferenceEntity], type: [ObjectReferenceEntity],
inlined: true, inlined: true,
}, },
InputType: { type: SymbolEntity },
MacroGraphReference: { type: MacroGraphReferenceEntity }, MacroGraphReference: { type: MacroGraphReferenceEntity },
MaterialExpression: { type: ObjectReferenceEntity }, MaterialExpression: { type: ObjectReferenceEntity },
MaterialExpressionComment: { type: ObjectReferenceEntity }, MaterialExpressionComment: { type: ObjectReferenceEntity },
@@ -203,7 +205,6 @@ export default class ObjectEntity extends IEntity {
.map(object => .map(object =>
values => values[Configuration.subObjectAttributeNameFromEntity(object)] = object values => values[Configuration.subObjectAttributeNameFromEntity(object)] = object
) )
} }
static createGrammar() { static createGrammar() {
@@ -357,6 +358,7 @@ export default class ObjectEntity extends IEntity {
/** @type {String} */ this.CustomFunctionName /** @type {String} */ this.CustomFunctionName
/** @type {String} */ this.DelegatePropertyName /** @type {String} */ this.DelegatePropertyName
/** @type {String} */ this.ErrorMsg /** @type {String} */ this.ErrorMsg
/** @type {String} */ this.InputName
/** @type {String} */ this.Name /** @type {String} */ this.Name
/** @type {String} */ this.NodeComment /** @type {String} */ this.NodeComment
/** @type {String} */ this.NodeTitle /** @type {String} */ this.NodeTitle
@@ -369,6 +371,7 @@ export default class ObjectEntity extends IEntity {
/** @type {SymbolEntity} */ this.HiGenGridSize /** @type {SymbolEntity} */ this.HiGenGridSize
/** @type {SymbolEntity} */ this.InputAxisKey /** @type {SymbolEntity} */ this.InputAxisKey
/** @type {SymbolEntity} */ this.InputKey /** @type {SymbolEntity} */ this.InputKey
/** @type {SymbolEntity} */ this.InputType
/** @type {SymbolEntity} */ this.MoveMode /** @type {SymbolEntity} */ this.MoveMode
/** @type {SymbolEntity} */ this.SelfContextInfo /** @type {SymbolEntity} */ this.SelfContextInfo
/** @type {VariableReferenceEntity} */ this.DelegateReference /** @type {VariableReferenceEntity} */ this.DelegateReference
@@ -585,7 +588,24 @@ export default class ObjectEntity extends IEntity {
} }
isMaterial() { isMaterial() {
return this.getClass() === Configuration.paths.materialGraphNode return this.getClass() === Configuration.paths.materialGraphNode
// return [
// Configuration.paths.materialExpressionConstant,
// Configuration.paths.materialExpressionConstant2Vector,
// Configuration.paths.materialExpressionConstant3Vector,
// Configuration.paths.materialExpressionConstant4Vector,
// Configuration.paths.materialExpressionLogarithm,
// Configuration.paths.materialExpressionLogarithm10,
// Configuration.paths.materialExpressionLogarithm2,
// Configuration.paths.materialExpressionMaterialFunctionCall,
// Configuration.paths.materialExpressionSquareRoot,
// Configuration.paths.materialExpressionTextureCoordinate,
// Configuration.paths.materialExpressionTextureSample,
// Configuration.paths.materialGraphNode,
// Configuration.paths.materialGraphNodeComment,
// ]
// .includes(this.getClass())
} }
/** @return {ObjectEntity} */ /** @return {ObjectEntity} */
@@ -712,6 +732,11 @@ export default class ObjectEntity extends IEntity {
return input.map(v => Utility.printExponential(v)).reduce((acc, cur) => acc + "," + cur) return input.map(v => Utility.printExponential(v)).reduce((acc, cur) => acc + "," + cur)
} }
break break
case Configuration.paths.materialExpressionFunctionInput:
const materialObject = this.getMaterialSubobject()
const inputName = materialObject?.InputName ?? "In"
const inputType = materialObject?.InputType?.value.match(/^.+?_(\w+)$/)?.[1] ?? "Vector3"
return `Input ${inputName} (${inputType})`
case Configuration.paths.materialExpressionLogarithm: case Configuration.paths.materialExpressionLogarithm:
return "Ln" return "Ln"
case Configuration.paths.materialExpressionLogarithm10: case Configuration.paths.materialExpressionLogarithm10:
@@ -956,6 +981,8 @@ export default class ObjectEntity extends IEntity {
return Configuration.nodeColors.darkBlue return Configuration.nodeColors.darkBlue
case Configuration.paths.materialExpressionMaterialFunctionCall: case Configuration.paths.materialExpressionMaterialFunctionCall:
return Configuration.nodeColors.blue return Configuration.nodeColors.blue
case Configuration.paths.materialExpressionFunctionInput:
return Configuration.nodeColors.red
case Configuration.paths.materialExpressionTextureSample: case Configuration.paths.materialExpressionTextureSample:
return Configuration.nodeColors.darkTurquoise return Configuration.nodeColors.darkTurquoise
case Configuration.paths.materialExpressionTextureCoordinate: case Configuration.paths.materialExpressionTextureCoordinate:

View File

@@ -18,22 +18,44 @@ export default class ObjectReferenceEntity extends IEntity {
static { static {
this.cleanupAttributes(this.attributes) this.cleanupAttributes(this.attributes)
} }
static noneReferenceGrammar = Parsernostrum.str("None").map(() => this.createNoneInstance()) static quoted = Parsernostrum.regArray(new RegExp(
static fullReferenceGrammar = Parsernostrum.seq( `'"(` + Grammar.Regex.InsideString.source + `)"'`
Grammar.typeReference, + `|'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
Parsernostrum.whitespaceInlineOpt, + `|"(` + Grammar.Regex.InsideString.source + `)"`
Grammar.pathQuotes )).map(([_0, a, b, c]) => a ?? b ?? c)
).map(([type, _2, path]) => new this({ type, path })) static path = this.quoted.getParser().parser.regexp.source + "|" + Grammar.Regex.Path.source
static typeReferenceGrammar = Grammar.typeReference.map(v => new this({ type: v, path: "" })) static typeReference = Parsernostrum.reg(
static pathReferenceGrammar = Grammar.path.map(path => new this({ type: "", path: path })) new RegExp(Grammar.Regex.Path.source + "|" + Grammar.symbol.getParser().regexp.source)
)
static fullReferenceGrammar = Parsernostrum.regArray(
new RegExp(
"(" + this.typeReference.getParser().regexp.source + ")"
+ /\s*/.source
+ "(?:" + this.quoted.getParser().parser.regexp.source + ")"
)
).map(([_0, type, ...path]) => new this({ type, path: path.find(v => v) }))
static fullReferenceSerializedGrammar = Parsernostrum.regArray(
new RegExp(
"(" + this.typeReference.getParser().regexp.source + ")"
+ /\s*/.source
+ `'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
)
).map(([_0, type, ...path]) => new this({ type, path: path.find(v => v) }))
static typeReferenceGrammar = this.typeReference.map(v => new this({ type: v, path: "" }))
static grammar = this.createGrammar() static grammar = this.createGrammar()
static createGrammar() { static createGrammar() {
return Parsernostrum.alt( return Parsernostrum.alt(
this.noneReferenceGrammar, Parsernostrum.seq(
Parsernostrum.str('"'),
Parsernostrum.alt(
this.fullReferenceSerializedGrammar,
this.typeReferenceGrammar,
),
Parsernostrum.str('"'),
).map(([_0, objectReference, _1]) => objectReference),
this.fullReferenceGrammar, this.fullReferenceGrammar,
this.typeReferenceGrammar, this.typeReferenceGrammar,
this.pathReferenceGrammar,
) )
} }
@@ -71,6 +93,6 @@ export default class ObjectReferenceEntity extends IEntity {
} }
toString() { toString() {
return `${this.type}'"${this.path}"'` return this.type + (this.path ? `'${this.path}'` : "")
} }
} }

View File

@@ -53,17 +53,6 @@ export default class Grammar {
static colorValue = Parsernostrum.numberByte static colorValue = Parsernostrum.numberByte
static word = Parsernostrum.reg(Grammar.Regex.Word) static word = Parsernostrum.reg(Grammar.Regex.Word)
static pathQuotes = Parsernostrum.regArray(new RegExp(
`'"(` + Grammar.Regex.InsideString.source + `)"'`
+ `|'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
+ `|"(` + Grammar.Regex.InsideString.source + `)"`
)).map(([_0, a, b, c]) => a ?? b ?? c)
static path = Parsernostrum.regArray(new RegExp(
`'"(` + Grammar.Regex.InsideString.source + `)"'`
+ `|'(` + Grammar.Regex.InsideSingleQuotedString.source + `)'`
+ `|"(` + Grammar.Regex.InsideString.source + `)"`
+ `|(` + Grammar.Regex.Path.source + `)`
)).map(([_0, a, b, c, d]) => a ?? b ?? c ?? d)
static symbol = Parsernostrum.reg(Grammar.Regex.Symbol) static symbol = Parsernostrum.reg(Grammar.Regex.Symbol)
static symbolQuoted = Parsernostrum.reg(new RegExp('"(' + Grammar.Regex.Symbol.source + ')"'), 1) static symbolQuoted = Parsernostrum.reg(new RegExp('"(' + Grammar.Regex.Symbol.source + ')"'), 1)
static attributeName = Parsernostrum.reg(Grammar.Regex.DotSeparatedSymbols) static attributeName = Parsernostrum.reg(Grammar.Regex.DotSeparatedSymbols)
@@ -72,7 +61,6 @@ export default class Grammar {
static commaSeparation = Parsernostrum.reg(/\s*,\s*(?!\))/) static commaSeparation = Parsernostrum.reg(/\s*,\s*(?!\))/)
static commaOrSpaceSeparation = Parsernostrum.reg(/\s*,\s*(?!\))|\s+/) static commaOrSpaceSeparation = Parsernostrum.reg(/\s*,\s*(?!\))|\s+/)
static equalSeparation = Parsernostrum.reg(/\s*=\s*/) static equalSeparation = Parsernostrum.reg(/\s*=\s*/)
static typeReference = Parsernostrum.alt(Parsernostrum.reg(Grammar.Regex.Path), this.symbol)
static hexColorChannel = Parsernostrum.reg(new RegExp(Grammar.Regex.HexDigit.source + "{2}")) static hexColorChannel = Parsernostrum.reg(new RegExp(Grammar.Regex.HexDigit.source + "{2}"))
/* --- Factory --- */ /* --- Factory --- */

View File

@@ -45,7 +45,7 @@ Grammar.unknownValue =
// Remember to keep the order, otherwise parsing might fail // Remember to keep the order, otherwise parsing might fail
Grammar.boolean, Grammar.boolean,
GuidEntity.createGrammar(), GuidEntity.createGrammar(),
ObjectReferenceEntity.noneReferenceGrammar, Parsernostrum.str("None").map(() => new ObjectReferenceEntity({ type: "None" })),
Grammar.null, Grammar.null,
Grammar.number, Grammar.number,
Grammar.string, Grammar.string,

View File

@@ -25,6 +25,9 @@ function getFirstWordOrder(words) {
return new RegExp(/\s*/.source + words.join(/[^\n]+\n\s*/.source) + /\s*/.source) return new RegExp(/\s*/.source + words.join(/[^\n]+\n\s*/.source) + /\s*/.source)
} }
test.describe.configure({ mode: "parallel" })
for (const nodeTest of nodeTests) { for (const nodeTest of nodeTests) {
test.describe(nodeTest.name, () => { test.describe(nodeTest.name, () => {

View File

@@ -204,17 +204,48 @@ test.describe("Serializer", () => {
expect(reference).toBeInstanceOf(ObjectReferenceEntity) expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({ type: "EdGraphPin", path: "K2Node_DynamicCast_2126.EdGraphPin_3990988" }) expect(reference).toMatchObject({ type: "EdGraphPin", path: "K2Node_DynamicCast_2126.EdGraphPin_3990988" })
reference = serializer.read(`/Script/Engine.EdGraph'"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:Do N"'`) reference = serializer.read(
`"/Script/Engine.MaterialExpressionMaterialFunctionCall'MaterialExpressionMaterialFunctionCall_0'"`
)
expect(reference).toBeInstanceOf(ObjectReferenceEntity) expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({ type: "/Script/Engine.EdGraph", path: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:Do N" }) expect(reference).toMatchObject({
type: "/Script/Engine.MaterialExpressionMaterialFunctionCall",
path: "MaterialExpressionMaterialFunctionCall_0",
})
reference = serializer.read(`Function'"/Game/Mods/CrazyDinos/ElementalDragon/CDElementalDragon_Character_BP.SKEL_CDElementalDragon_Character_BP_C:ROS Change Element"'`) reference = serializer.read(
`/Script/Engine.EdGraph'"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:Do N"'`
)
expect(reference).toBeInstanceOf(ObjectReferenceEntity) expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({ type: "Function", path: "/Game/Mods/CrazyDinos/ElementalDragon/CDElementalDragon_Character_BP.SKEL_CDElementalDragon_Character_BP_C:ROS Change Element" }) expect(reference).toMatchObject({
type: "/Script/Engine.EdGraph",
path: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:Do N",
})
reference = serializer.read(
`EdGraphPin'"K2Node_CommutativeAssociativeBinaryOperator_152.EdGraphPin_4045"'`
)
expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({
type: "EdGraphPin",
path: "K2Node_CommutativeAssociativeBinaryOperator_152.EdGraphPin_4045",
})
reference = serializer.read(
`Function'"/Game/Mods/CrazyDinos/ElementalDragon/CDElementalDragon_Character_BP.SKEL_CDElementalDragon_Character_BP_C:ROS Change Element"'`
)
expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({
type: "Function",
path: "/Game/Mods/CrazyDinos/ElementalDragon/CDElementalDragon_Character_BP.SKEL_CDElementalDragon_Character_BP_C:ROS Change Element",
})
reference = serializer.read(`EdGraph'/Game/Systems/BP_MacroGlobal.BP_MacroGlobal:Or+Branch'`) reference = serializer.read(`EdGraph'/Game/Systems/BP_MacroGlobal.BP_MacroGlobal:Or+Branch'`)
expect(reference).toBeInstanceOf(ObjectReferenceEntity) expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({ type: "EdGraph", path: "/Game/Systems/BP_MacroGlobal.BP_MacroGlobal:Or+Branch" }) expect(reference).toMatchObject({
type: "EdGraph",
path: "/Game/Systems/BP_MacroGlobal.BP_MacroGlobal:Or+Branch",
})
reference = serializer.read(`/Script/Engine.EdGraph'"+-Weird/2,Macro"'`) reference = serializer.read(`/Script/Engine.EdGraph'"+-Weird/2,Macro"'`)
expect(reference).toBeInstanceOf(ObjectReferenceEntity) expect(reference).toBeInstanceOf(ObjectReferenceEntity)
@@ -223,6 +254,24 @@ test.describe("Serializer", () => {
reference = serializer.read(`/Script/BlueprintGraph.K2Node_VariableGet`) reference = serializer.read(`/Script/BlueprintGraph.K2Node_VariableGet`)
expect(reference).toBeInstanceOf(ObjectReferenceEntity) expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({ type: "/Script/BlueprintGraph.K2Node_VariableGet", path: "" }) expect(reference).toMatchObject({ type: "/Script/BlueprintGraph.K2Node_VariableGet", path: "" })
reference = serializer.read(
`/Script/Engine.MaterialExpressionMaterialFunctionCall'MaterialExpressionMaterialFunctionCall_0'`
)
expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({
type: "/Script/Engine.MaterialExpressionMaterialFunctionCall",
path: "MaterialExpressionMaterialFunctionCall_0",
})
reference = serializer.read(
`/Script/Engine.MaterialExpressionMaterialFunctionCall'/Engine/Transient.Material_0:MaterialGraph_0.MaterialGraphNode_3.MaterialExpressionMaterialFunctionCall_0'`
)
expect(reference).toBeInstanceOf(ObjectReferenceEntity)
expect(reference).toMatchObject({
type: "/Script/Engine.MaterialExpressionMaterialFunctionCall",
path: "/Engine/Transient.Material_0:MaterialGraph_0.MaterialGraphNode_3.MaterialExpressionMaterialFunctionCall_0",
})
}) })
test("String", () => { test("String", () => {

View File

@@ -410,6 +410,122 @@ export default class MaterialNodes extends NodeTests {
expect(values).toStrictEqual([77, 55]) expect(values).toStrictEqual([77, 55])
} }
}, },
{
name: "AppendMany",
value: String.raw`
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_3" ExportPath="/Script/UnrealEd.MaterialGraphNode'/Engine/Transient.Material_0:MaterialGraph_0.MaterialGraphNode_3'"
Begin Object Class=/Script/Engine.MaterialExpressionMaterialFunctionCall Name="MaterialExpressionMaterialFunctionCall_0" ExportPath="/Script/Engine.MaterialExpressionMaterialFunctionCall'/Engine/Transient.Material_0:MaterialGraph_0.MaterialGraphNode_3.MaterialExpressionMaterialFunctionCall_0'"
End Object
Begin Object Name="MaterialExpressionMaterialFunctionCall_0" ExportPath="/Script/Engine.MaterialExpressionMaterialFunctionCall'/Engine/Transient.Material_0:MaterialGraph_0.MaterialGraphNode_3.MaterialExpressionMaterialFunctionCall_0'"
MaterialFunction="/Script/Engine.MaterialFunction'/Engine/Functions/Engine_MaterialFunctions02/Utility/AppendMany.AppendMany'"
FunctionInputs(0)=(ExpressionInputId=885D0D3941709A0021D522BB0D350E84,Input=(OutputIndex=-1,InputName="R"))
FunctionInputs(1)=(ExpressionInputId=66655BEF4DEEE4FBB682D1B2533B646B,Input=(OutputIndex=-1,InputName="G"))
FunctionInputs(2)=(ExpressionInputId=7971790B4C1CF3D12A6BD5849BF51222,Input=(OutputIndex=-1,InputName="B"))
FunctionInputs(3)=(ExpressionInputId=E0358D7C4B4022F69AB64786F99318D6,Input=(OutputIndex=-1,InputName="A"))
FunctionOutputs(0)=(ExpressionOutputId=FA6B13694608C010AF452E92B3981900,Output=(OutputName="RG"))
FunctionOutputs(1)=(ExpressionOutputId=C48A5AA9468A429E4D9984AD43B50CE5,Output=(OutputName="RGB"))
FunctionOutputs(2)=(ExpressionOutputId=B55BAD0C44C4D883F0D33CB57D00AB3C,Output=(OutputName="RGBA"))
MaterialExpressionEditorX=384
MaterialExpressionEditorY=768
MaterialExpressionGuid=971FA65449F74582B4418B816DDCBCCF
Material="/Script/Engine.Material'/Engine/Transient.Material_0'"
Outputs(0)=(OutputName="RG")
Outputs(1)=(OutputName="RGB")
Outputs(2)=(OutputName="RGBA")
End Object
MaterialExpression="/Script/Engine.MaterialExpressionMaterialFunctionCall'MaterialExpressionMaterialFunctionCall_0'"
NodePosX=384
NodePosY=768
NodeGuid=7CBF0C7DDBF848FE8D7E9A85D56C3772
CustomProperties Pin (PinId=36EB45FD36FA4918947D2811918524EF,PinName="R (S)",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=3D2F2B761F6646E298BC96093285F44E,PinName="G (S)",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=4194B7FE10FC4AEEB2B9B620437618C3,PinName="B (S)",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=A29788A42F2E43E9B5F8959DF5478E8F,PinName="A (S)",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=7C55A39ECC2E4A78B0A2918AF200EED4,PinName="RG",Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=A21DE80A4A454574AF9B1E0F8CD7E9F1,PinName="RGB",Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=E5937F981A604CF1AF885868325FC83E,PinName="RGBA",Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
`,
color: Configuration.nodeColors.blue,
icon: null,
pins: 7,
pinNames: [
"R (S)",
"G (S)",
"B (S)",
"A (S)",
"RG",
"RGB",
"RGBA",
],
delegate: false,
development: false,
},
{
name: "Input X_1 (Scalar)",
value: String.raw`
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_14" ExportPath="/Script/UnrealEd.MaterialGraphNode'/Engine/Transient.Material_1:MaterialGraph_0.MaterialGraphNode_14'"
Begin Object Class=/Script/Engine.MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_4" ExportPath="/Script/Engine.MaterialExpressionFunctionInput'/Engine/Transient.Material_1:MaterialGraph_0.MaterialGraphNode_14.MaterialExpressionFunctionInput_4'"
End Object
Begin Object Name="MaterialExpressionFunctionInput_4" ExportPath="/Script/Engine.MaterialExpressionFunctionInput'/Engine/Transient.Material_1:MaterialGraph_0.MaterialGraphNode_14.MaterialExpressionFunctionInput_4'"
InputName="X_1"
Id=220B12C48A1B4FD2A2F1964A3670D092
InputType=FunctionInput_Scalar
bUsePreviewValueAsDefault=True
SortPriority=2
MaterialExpressionEditorX=-64
MaterialExpressionEditorY=208
MaterialExpressionGuid=5B9F03CCBBD54567A9B6EAD08AAA08F0
Material="/Script/Engine.Material'/Engine/Transient.Material_1'"
Function="/Script/Engine.MaterialFunction'/Engine/Transient.AppendMany'"
End Object
MaterialExpression="/Script/Engine.MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_4'"
NodePosX=-64
NodePosY=208
NodeGuid=9379668BD62A45458DC56BE5B3F80A73
CustomProperties Pin (PinId=1021DF0F4ABC4FE3BF1CF97F6FD78496,PinName="Preview",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=C875FB5EEFDC4CE6BD98B872403F7C29,PinName="Output",PinFriendlyName=NSLOCTEXT("MaterialGraphNode", "Space", " "),Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
`,
color: Configuration.nodeColors.red,
icon: null,
pins: 2,
pinNames: [
"Preview",
],
delegate: false,
development: false,
},
{
name: "Input In (Vector3)",
value: String.raw`
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_17" ExportPath="/Script/UnrealEd.MaterialGraphNode'/Engine/Transient.Material_1:MaterialGraph_0.MaterialGraphNode_17'"
Begin Object Class=/Script/Engine.MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_7" ExportPath="/Script/Engine.MaterialExpressionFunctionInput'/Engine/Transient.Material_1:MaterialGraph_0.MaterialGraphNode_17.MaterialExpressionFunctionInput_7'"
End Object
Begin Object Name="MaterialExpressionFunctionInput_7" ExportPath="/Script/Engine.MaterialExpressionFunctionInput'/Engine/Transient.Material_1:MaterialGraph_0.MaterialGraphNode_17.MaterialExpressionFunctionInput_7'"
Id=2590318028564D9BAF90BEA43FBD3F1F
MaterialExpressionEditorX=512
MaterialExpressionEditorY=224
MaterialExpressionGuid=B0F1358EACAF46E5A277253263F0ECFC
Material="/Script/Engine.Material'/Engine/Transient.Material_1'"
End Object
MaterialExpression="/Script/Engine.MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_7'"
NodePosX=512
NodePosY=224
NodeGuid=7F222623B44A4774BCA3C2F32DD16E98
CustomProperties Pin (PinId=DD534EE002554330B23E7F4B984A52F5,PinName="Preview",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=22FB979A3F314CBA9B2ABE11214E9827,PinName="Output",PinFriendlyName=NSLOCTEXT("MaterialGraphNode", "Space", " "),Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
`,
color: Configuration.nodeColors.red,
icon: null,
pins: 2,
pinNames: [
"Preview",
],
delegate: false,
development: false,
},
]) ])
} }
} }