|
|
|
|
|
|
|
|
|
|
namespace UnityEngine.MaterialGraph |
|
|
|
{ |
|
|
|
[Title("Math/Matrix/Multiply")] |
|
|
|
public class MatrixMultiplyNode : Function2Input, IGeneratesFunction |
|
|
|
[Title("Math/Matrix/MultiplyMatrix")] |
|
|
|
public class MatrixMultiplyNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction |
|
|
|
protected const string kInputSlot1ShaderName = "Input1"; |
|
|
|
protected const string kInputSlot2ShaderName = "Input2"; |
|
|
|
protected const string kOutputSlotShaderName = "Output"; |
|
|
|
|
|
|
|
public const int InputSlot1Id = 0; |
|
|
|
public const int InputSlot2Id = 1; |
|
|
|
public const int OutputSlotId = 2; |
|
|
|
|
|
|
|
public override bool hasPreview |
|
|
|
{ |
|
|
|
get { return false; } |
|
|
|
} |
|
|
|
|
|
|
|
name = "MatrixMultiply"; |
|
|
|
name = "MultiplyMatrix"; |
|
|
|
UpdateNodeAfterDeserialization(); |
|
|
|
protected override string GetFunctionName() |
|
|
|
protected string GetFunctionName() |
|
|
|
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode) |
|
|
|
public sealed override void UpdateNodeAfterDeserialization() |
|
|
|
var outputString = new ShaderGenerator(); |
|
|
|
outputString.AddShaderChunk(GetFunctionPrototype("arg1", "arg2"), false); |
|
|
|
outputString.AddShaderChunk("{", false); |
|
|
|
outputString.Indent(); |
|
|
|
outputString.AddShaderChunk("return mul(arg1, arg2);", false); |
|
|
|
outputString.Deindent(); |
|
|
|
outputString.AddShaderChunk("}", false); |
|
|
|
|
|
|
|
visitor.AddShaderChunk(outputString.GetShaderString(0), true); |
|
|
|
AddSlot(GetInputSlot1()); |
|
|
|
AddSlot(GetInputSlot2()); |
|
|
|
AddSlot(GetOutputSlot()); |
|
|
|
RemoveSlotsNameNotMatching(validSlots); |
|
|
|
public override bool hasPreview |
|
|
|
protected int[] validSlots |
|
|
|
get { return false; } |
|
|
|
get { return new[] { InputSlot1Id, InputSlot2Id, OutputSlotId }; } |
|
|
|
/*protected override MaterialSlot GetInputSlot1() |
|
|
|
protected MaterialSlot GetInputSlot1() |
|
|
|
protected override MaterialSlot GetInputSlot2() |
|
|
|
protected MaterialSlot GetInputSlot2() |
|
|
|
protected override MaterialSlot GetOutputSlot() |
|
|
|
protected MaterialSlot GetOutputSlot() |
|
|
|
}*/ |
|
|
|
} |
|
|
|
|
|
|
|
protected virtual string GetInputSlot1Name() |
|
|
|
{ |
|
|
|
return "Input1"; |
|
|
|
} |
|
|
|
|
|
|
|
protected virtual string GetInputSlot2Name() |
|
|
|
{ |
|
|
|
return "Input2"; |
|
|
|
} |
|
|
|
|
|
|
|
protected string GetOutputSlotName() |
|
|
|
{ |
|
|
|
return "Output"; |
|
|
|
} |
|
|
|
|
|
|
|
protected string GetFunctionPrototype(string arg1Name, string arg2Name) |
|
|
|
{ |
|
|
|
return "inline " + precision + outputDimension + " " + GetFunctionName() + " (" |
|
|
|
+ precision + input1Dimension + " " + arg1Name + ", " |
|
|
|
+ precision + input2Dimension + " " + arg2Name + ")"; |
|
|
|
} |
|
|
|
|
|
|
|
public void GenerateNodeCode(ShaderGenerator visitor, GenerationMode generationMode) |
|
|
|
{ |
|
|
|
NodeUtils.SlotConfigurationExceptionIfBadConfiguration(this, new[] { InputSlot1Id, InputSlot2Id }, new[] { OutputSlotId }); |
|
|
|
string input1Value = GetSlotValue(InputSlot1Id, generationMode); |
|
|
|
string input2Value = GetSlotValue(InputSlot2Id, generationMode); |
|
|
|
visitor.AddShaderChunk(precision + outputDimension + " " + GetVariableNameForSlot(OutputSlotId) + " = " + GetFunctionCallBody(input1Value, input2Value) + ";", true); |
|
|
|
} |
|
|
|
|
|
|
|
protected string GetFunctionCallBody(string input1Value, string input2Value) |
|
|
|
{ |
|
|
|
return GetFunctionName() + " (" + input1Value + ", " + input2Value + ")"; |
|
|
|
} |
|
|
|
|
|
|
|
public string outputDimension |
|
|
|
{ |
|
|
|
get { return ConvertConcreteSlotValueTypeToString(FindInputSlot<MaterialSlot>(InputSlot2Id).concreteValueType); } |
|
|
|
} |
|
|
|
|
|
|
|
private string input1Dimension |
|
|
|
{ |
|
|
|
get { return ConvertConcreteSlotValueTypeToString(FindInputSlot<MaterialSlot>(InputSlot1Id).concreteValueType); } |
|
|
|
} |
|
|
|
|
|
|
|
private string input2Dimension |
|
|
|
{ |
|
|
|
get { return ConvertConcreteSlotValueTypeToString(FindInputSlot<MaterialSlot>(InputSlot2Id).concreteValueType); } |
|
|
|
} |
|
|
|
|
|
|
|
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode) |
|
|
|
{ |
|
|
|
var outputString = new ShaderGenerator(); |
|
|
|
outputString.AddShaderChunk(GetFunctionPrototype("arg1", "arg2"), false); |
|
|
|
outputString.AddShaderChunk("{", false); |
|
|
|
outputString.Indent(); |
|
|
|
outputString.AddShaderChunk("return mul(arg1, arg2);", false); |
|
|
|
outputString.Deindent(); |
|
|
|
outputString.AddShaderChunk("}", false); |
|
|
|
|
|
|
|
visitor.AddShaderChunk(outputString.GetShaderString(0), true); |
|
|
|
} |
|
|
|
} |
|
|
|
} |