浏览代码
Merge branch 'hackweek2017' of https://github.com/stramit/MaterialGraph into hackweek2017
/main
Merge branch 'hackweek2017' of https://github.com/stramit/MaterialGraph into hackweek2017
/main
Natasha Tatarchuk
8 年前
当前提交
419516e8
共有 45 个文件被更改,包括 1134 次插入 和 281 次删除
-
146MaterialGraphProject/Assets/Andre/Materials/Mat.mat
-
8MaterialGraphProject/Assets/Andre/Nodes/Editor/TransformNodePresenter.cs
-
194MaterialGraphProject/Assets/Andre/Nodes/TransformNode.cs
-
2MaterialGraphProject/Assets/Andre/Shaders/TestingGraph.ShaderGraph
-
1MaterialGraphProject/Assets/Eduardo/ConstantsNode.cs
-
2MaterialGraphProject/Assets/Eduardo/EduardoTestGraph.ShaderGraph
-
4MaterialGraphProject/Assets/Eduardo/EduardoTestMat.mat
-
141MaterialGraphProject/Assets/GeneratedShader.shader
-
8MaterialGraphProject/Assets/Matt/CommonMatrixType.cs
-
5MaterialGraphProject/Assets/TestAssets/Materials/Default.mat
-
2MaterialGraphProject/Assets/TestAssets/Teapot.fbx.meta
-
17MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Presenters/MaterialGraphPresenter.cs
-
17MaterialGraphProject/Assets/UnityShaderEditor/Editor/HelperShader.shader
-
2MaterialGraphProject/Assets/UnityShaderEditor/Editor/HelperShader.shader.meta
-
6MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Function2Input.cs
-
5MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/MaterialSlot.cs
-
4MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Procedural/CheckerboardNode.cs
-
42MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Procedural/VoronoiNoise.cs
-
2MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/UV/UVTileNode.cs
-
3MaterialGraphProject/Assets/Vlad/TextureAssetNode.cs
-
2MaterialGraphProject/Assets/_MingWai/ColorBalanceNode.cs
-
9MaterialGraphProject/Assets/Florent.meta
-
9MaterialGraphProject/Assets/Matt/Examples.meta
-
151MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Presenters/ConvolutionFilterNodePresenter.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Presenters/ConvolutionFilterNodePresenter.cs.meta
-
43MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Presenters/ScatterNodePresenter.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Presenters/ScatterNodePresenter.cs.meta
-
9MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Art/Filters.meta
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Procedural/NoiseNode.cs.meta
-
60MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/UV/TwistNode.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/UV/TwistNode.cs.meta
-
121MaterialGraphProject/Assets/_MingWai/ScatterNode.cs
-
12MaterialGraphProject/Assets/_MingWai/ScatterNode.cs.meta
-
9MaterialGraphProject/Assets/Florent/GeneratedTexture.meta
-
1MaterialGraphProject/Assets/Matt/Examples/HueStrip.ShaderGraph
-
9MaterialGraphProject/Assets/Matt/Examples/HueStrip.ShaderGraph.meta
-
1MaterialGraphProject/Assets/Matt/Examples/Swirl.ShaderGraph
-
9MaterialGraphProject/Assets/Matt/Examples/Swirl.ShaderGraph.meta
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Art/Filters/ConvolutionFilterNode.cs.meta
-
287MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Art/Filters/ConvolutionFilterNode.cs
-
12MaterialGraphProject/Assets/Brandon/NoiseNode.cs.meta
-
0/MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/Procedural/NoiseNode.cs
|
|||
namespace UnityEngine.MaterialGraph |
|||
using UnityEngine.Graphing; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
public class TransformNode : Function1Input |
|||
public class TransformNode : AbstractMaterialNode, IGeneratesBodyCode, IMayRequireTangent, IMayRequireBitangent, IMayRequireNormal |
|||
[SerializeField] |
|||
private SimpleMatrixType m_spaceListFrom; |
|||
[SerializeField] |
|||
private SimpleMatrixType m_spaceListTo; |
|||
|
|||
private const int InputSlotId = 0; |
|||
private const int OutputSlotId = 1; |
|||
private const string kInputSlotName = "Input"; |
|||
private const string kOutputSlotName = "Output"; |
|||
|
|||
public SimpleMatrixType spaceFrom |
|||
{ |
|||
get { return m_spaceListFrom; } |
|||
set |
|||
{ |
|||
if (m_spaceListFrom == value) |
|||
return; |
|||
|
|||
m_spaceListFrom = value; |
|||
if (onModified != null) |
|||
{ |
|||
onModified(this, ModificationScope.Graph); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public override bool hasPreview |
|||
{ |
|||
get { return false; } |
|||
} |
|||
|
|||
public SimpleMatrixType spaceTo |
|||
{ |
|||
get { return m_spaceListTo; } |
|||
set |
|||
{ |
|||
if (m_spaceListTo == value) |
|||
return; |
|||
|
|||
m_spaceListTo = value; |
|||
if (onModified != null) |
|||
{ |
|||
onModified(this, ModificationScope.Graph); |
|||
} |
|||
} |
|||
} |
|||
|
|||
UpdateNodeAfterDeserialization (); |
|||
protected override string GetFunctionName () |
|||
public sealed override void UpdateNodeAfterDeserialization() |
|||
AddSlot(GetInputSlot()); |
|||
AddSlot(GetOutputSlot()); |
|||
RemoveSlotsNameNotMatching(validSlots); |
|||
} |
|||
//mul(unity_WorldToObject, float4(i.posWorld.rgb,0) ).xyz - world to local
|
|||
//mul( tangentTransform, i.posWorld.rgb ).xyz - world to tangent
|
|||
//mul( UNITY_MATRIX_V, float4(i.posWorld.rgb,0) ).xyz - world to view
|
|||
protected int[] validSlots |
|||
{ |
|||
get { return new[] {InputSlotId, OutputSlotId}; } |
|||
} |
|||
//mul( unity_ObjectToWorld, float4(i.posWorld.rgb,0) ).xyz - local to world
|
|||
//mul( tangentTransform, mul( unity_ObjectToWorld, float4(i.posWorld.rgb,0) ).xyz - local to tangent
|
|||
//mul( UNITY_MATRIX_MV, float4(i.posWorld.rgb,0) ).xyz - local to view
|
|||
protected virtual MaterialSlot GetInputSlot() |
|||
{ |
|||
return new MaterialSlot(InputSlotId, GetInputSlotName(), kInputSlotName, SlotType.Input, SlotValueType.Vector3, Vector3.zero); |
|||
} |
|||
//mul( i.posWorld.rgb, tangentTransform ).xyz - tangent to world
|
|||
//mul( unity_WorldToObject, float4(mul( i.posWorld.rgb, tangentTransform ),0) ).xyz - tangent to local
|
|||
//mul( UNITY_MATRIX_V, float4(mul( i.posWorld.rgb, tangentTransform ),0) ).xyz - tangent to view
|
|||
protected virtual MaterialSlot GetOutputSlot() |
|||
{ |
|||
return new MaterialSlot(OutputSlotId, GetOutputSlotName(), kOutputSlotName, SlotType.Output, SlotValueType.Vector3, Vector4.zero); |
|||
} |
|||
//mul( float4(i.posWorld.rgb,0), UNITY_MATRIX_V ).xyz - view to world
|
|||
//mul( float4(i.posWorld.rgb,0), UNITY_MATRIX_MV ).xyz - view to local
|
|||
//mul( tangentTransform, mul( float4(i.posWorld.rgb,0), UNITY_MATRIX_V ).xyz ).xyz - view to tangent
|
|||
protected virtual string GetInputSlotName() |
|||
{ |
|||
return "Input"; |
|||
} |
|||
return "exp"; |
|||
protected virtual string GetOutputSlotName() |
|||
{ |
|||
return "Output"; |
|||
} |
|||
|
|||
public void GenerateNodeCode(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
NodeUtils.SlotConfigurationExceptionIfBadConfiguration(this, new[] { InputSlotId }, new[] { OutputSlotId }); |
|||
string inputValue = GetSlotValue(InputSlotId, generationMode); |
|||
string transformString = ""; |
|||
bool requiresTangentTransform = false; |
|||
|
|||
if(spaceFrom == SimpleMatrixType.World){ |
|||
if (spaceTo == SimpleMatrixType.World) { |
|||
transformString = inputValue; |
|||
} else if (spaceTo == SimpleMatrixType.Local) { |
|||
transformString = "mul(unity_WorldToObject, float4(" + inputValue + ", 0)).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.Tangent) { |
|||
requiresTangentTransform = true; |
|||
transformString = "mul(tangentTransform, " + inputValue + ").xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.View) { |
|||
transformString = "mul( UNITY_MATRIX_V, float4(" + inputValue + ", 0)).xyz"; |
|||
} |
|||
}else if(spaceFrom == SimpleMatrixType.Local){ |
|||
if (spaceTo == SimpleMatrixType.World) { |
|||
transformString = "mul(unity_ObjectToWorld, float4(" + inputValue + ", 0)).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.Local) { |
|||
transformString = inputValue; |
|||
} else if (spaceTo == SimpleMatrixType.Tangent) { |
|||
requiresTangentTransform = true; |
|||
transformString = "mul( tangentTransform, mul( unity_ObjectToWorld, float4(" + inputValue + ", 0) ).xyz).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.View) { |
|||
transformString = "mul( UNITY_MATRIX_MV, float4(" + inputValue + ", 0)).xyz"; |
|||
} |
|||
}else if(spaceFrom == SimpleMatrixType.Tangent){ |
|||
requiresTangentTransform = true; |
|||
if (spaceTo == SimpleMatrixType.World) { |
|||
transformString = "mul( " + inputValue + ", tangentTransform ).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.Local) { |
|||
transformString = "mul( unity_WorldToObject, float4(mul(" + inputValue + ", tangentTransform ),0) ).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.Tangent) { |
|||
transformString = inputValue; |
|||
} else if (spaceTo == SimpleMatrixType.View) { |
|||
transformString = "mul( UNITY_MATRIX_V, float4(mul(" + inputValue + ", tangentTransform ),0) ).xyz"; |
|||
} |
|||
}else if(spaceFrom == SimpleMatrixType.View){ |
|||
if (spaceTo == SimpleMatrixType.World) { |
|||
transformString = "mul( float4(" + inputValue + ", 0), UNITY_MATRIX_V ).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.Local) { |
|||
transformString = "mul( float4(" + inputValue + ", 0), UNITY_MATRIX_MV ).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.Tangent) { |
|||
requiresTangentTransform = true; |
|||
transformString = "mul( tangentTransform, mul( float4(" + inputValue + ", 0), UNITY_MATRIX_V ).xyz ).xyz"; |
|||
} else if (spaceTo == SimpleMatrixType.View) { |
|||
transformString = inputValue; |
|||
} |
|||
} |
|||
|
|||
if(requiresTangentTransform) |
|||
visitor.AddShaderChunk ("float3x3 tangentTransform = float3x3( worldSpaceTangent, worldSpaceBitangent, worldSpaceNormal);", false); |
|||
|
|||
visitor.AddShaderChunk(precision + outputDimension + " " + GetVariableNameForSlot(OutputSlotId) + " = " + transformString + ";", true); |
|||
} |
|||
|
|||
//float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir);------
|
|||
|
|||
//mul(unity_WorldToObject, float4(i.posWorld.rgb,0) ).xyz - world to local---------
|
|||
//mul( tangentTransform, i.posWorld.rgb ).xyz - world to tangent-----------------
|
|||
//mul( UNITY_MATRIX_V, float4(i.posWorld.rgb,0) ).xyz - world to view-------------
|
|||
|
|||
//mul( unity_ObjectToWorld, float4(i.posWorld.rgb,0) ).xyz - local to world--------
|
|||
//mul( tangentTransform, mul( unity_ObjectToWorld, float4(i.posWorld.rgb,0) ).xyz - local to tangent------------
|
|||
//mul( UNITY_MATRIX_MV, float4(i.posWorld.rgb,0) ).xyz - local to view--------------
|
|||
|
|||
//mul( i.posWorld.rgb, tangentTransform ).xyz - tangent to world---------
|
|||
//mul( unity_WorldToObject, float4(mul( i.posWorld.rgb, tangentTransform ),0) ).xyz - tangent to local-----
|
|||
//mul( UNITY_MATRIX_V, float4(mul( i.posWorld.rgb, tangentTransform ),0) ).xyz - tangent to view-------
|
|||
|
|||
//mul( float4(i.posWorld.rgb,0), UNITY_MATRIX_V ).xyz - view to world
|
|||
//mul( float4(i.posWorld.rgb,0), UNITY_MATRIX_MV ).xyz - view to local
|
|||
//mul( tangentTransform, mul( float4(i.posWorld.rgb,0), UNITY_MATRIX_V ).xyz ).xyz - view to tangent
|
|||
|
|||
|
|||
public string outputDimension |
|||
{ |
|||
get { return ConvertConcreteSlotValueTypeToString(FindOutputSlot<MaterialSlot>(OutputSlotId).concreteValueType); } |
|||
} |
|||
private string inputDimension |
|||
{ |
|||
get { return ConvertConcreteSlotValueTypeToString(FindInputSlot<MaterialSlot>(InputSlotId).concreteValueType); } |
|||
} |
|||
|
|||
public bool RequiresTangent() |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
public bool RequiresBitangent() |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
public bool RequiresNormal(){ |
|||
return true; |
|||
} |
|||
} |
|||
} |
2
MaterialGraphProject/Assets/Andre/Shaders/TestingGraph.ShaderGraph
文件差异内容过多而无法显示
查看文件
文件差异内容过多而无法显示
查看文件
2
MaterialGraphProject/Assets/Eduardo/EduardoTestGraph.ShaderGraph
文件差异内容过多而无法显示
查看文件
文件差异内容过多而无法显示
查看文件
|
|||
fileFormatVersion: 2 |
|||
guid: e9dab59e587c7f244adde1add29b34fc |
|||
folderAsset: yes |
|||
timeCreated: 1495531757 |
|||
licenseType: Pro |
|||
DefaultImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: 6a5311f2c2db6e34f8da2333309aab50 |
|||
folderAsset: yes |
|||
timeCreated: 1495713891 |
|||
licenseType: Pro |
|||
DefaultImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using RMGUI.GraphView; |
|||
using UnityEditor.Graphing.Drawing; |
|||
using UnityEngine.MaterialGraph; |
|||
using UnityEngine; |
|||
|
|||
namespace UnityEditor.MaterialGraph.Drawing |
|||
{ |
|||
class ConvolutionFilterControlPresenter : GraphControlPresenter |
|||
{ |
|||
enum KernelPresets |
|||
{ |
|||
Presets, |
|||
BoxBlur, |
|||
GaussianBlur, |
|||
EdgesDetection, |
|||
EnhanceEdges, |
|||
Sharpen, |
|||
Emboss, |
|||
}; |
|||
|
|||
private void ApplyPreset(KernelPresets preset, ref float[,] values, ref float divisor) |
|||
{ |
|||
if (preset == KernelPresets.BoxBlur) |
|||
{ |
|||
values = new float[,] { {1,1,1,1,1}, |
|||
{1,1,1,1,1}, |
|||
{1,1,1,1,1}, |
|||
{1,1,1,1,1}, |
|||
{1,1,1,1,1} }; |
|||
divisor = 25; |
|||
} |
|||
if (preset == KernelPresets.GaussianBlur) |
|||
{ |
|||
values = new float[,] { { 1, 4, 6, 4, 1}, |
|||
{ 4,16,24,16, 4}, |
|||
{ 6,24,36,24, 6}, |
|||
{ 4,16,24,16, 4}, |
|||
{ 1, 4, 6, 4, 1} }; |
|||
divisor = 256; |
|||
} |
|||
if (preset == KernelPresets.EdgesDetection) |
|||
{ |
|||
values = new float[,] { {-1,-1,-1, -1,-1}, |
|||
{-1,-2,-2, -2,-1}, |
|||
{-1,-2, 33,-2,-1}, |
|||
{-1,-2,-2, -2,-1}, |
|||
{-1,-1,-1, -1,-1} }; |
|||
divisor = 1; |
|||
} |
|||
if (preset == KernelPresets.EnhanceEdges) |
|||
{ |
|||
values = new float[,] { { 0, 0, 0, 0, 0}, |
|||
{ 0, 1, 1, 1, 0}, |
|||
{ 0, 1,-7, 1, 0}, |
|||
{ 0, 1, 1, 1, 0}, |
|||
{ 0, 0, 0, 0, 0} }; |
|||
divisor = 1; |
|||
} |
|||
if (preset == KernelPresets.Sharpen) |
|||
{ |
|||
values = new float[,] { {-1,-1,-1, -1,-1}, |
|||
{-1, 2, 2, 2,-1}, |
|||
{-1, 2, 8, 2,-1}, |
|||
{-1, 2, 2, 2,-1}, |
|||
{-1,-1,-1, -1,-1} }; |
|||
divisor = 8; |
|||
} |
|||
if (preset == KernelPresets.Emboss) |
|||
{ |
|||
values = new float[,] { {-1,-1,-1,-1, 0}, |
|||
{-1,-1,-1, 0, 1}, |
|||
{-1,-1, 0, 1, 1}, |
|||
{-1, 0, 1, 1, 1}, |
|||
{ 0, 1, 1, 1, 1} }; |
|||
divisor = 1; |
|||
} |
|||
} |
|||
|
|||
public override void OnGUIHandler() |
|||
{ |
|||
base.OnGUIHandler(); |
|||
|
|||
var tNode = node as ConvolutionFilterNode; |
|||
if (tNode == null) |
|||
return; |
|||
|
|||
float divisor = tNode.GetConvolutionDivisor(); |
|||
float[,] values = new float[5,5]; |
|||
for (int row = 0; row < 5; ++row) |
|||
{ |
|||
for (int col = 0; col < 5; ++col) |
|||
{ |
|||
values[row,col] = tNode.GetConvolutionWeight(row,col); |
|||
} |
|||
} |
|||
|
|||
EditorGUILayout.BeginVertical(); |
|||
EditorGUI.BeginChangeCheck(); |
|||
|
|||
EditorGUILayout.LabelField("Kernel"); |
|||
KernelPresets kernelPresets = KernelPresets.Presets; |
|||
kernelPresets = (KernelPresets)EditorGUILayout.EnumPopup(kernelPresets); |
|||
ApplyPreset(kernelPresets, ref values, ref divisor); |
|||
|
|||
for (int col = 0; col < 5; ++col) |
|||
{ |
|||
EditorGUILayout.BeginHorizontal(); |
|||
for (int row = 0; row < 5; ++row) |
|||
{ |
|||
values[row, col] = EditorGUILayout.FloatField(values[row, col], GUILayout.Width(35)); |
|||
} |
|||
EditorGUILayout.EndHorizontal(); |
|||
} |
|||
EditorGUILayout.Space(); |
|||
|
|||
divisor = EditorGUILayout.FloatField("Divisor", divisor); |
|||
|
|||
EditorGUILayout.EndVertical(); |
|||
|
|||
if (EditorGUI.EndChangeCheck()) |
|||
{ |
|||
tNode.SetConvolutionDivisor(divisor); |
|||
for (int row = 0; row < 5; ++row) |
|||
{ |
|||
for (int col = 0; col < 5; ++col) |
|||
{ |
|||
tNode.SetConvolutionWeight(row, col, values[row, col]); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
public override float GetHeight() |
|||
{ |
|||
return (EditorGUIUtility.singleLineHeight * 10 + EditorGUIUtility.standardVerticalSpacing) + EditorGUIUtility.standardVerticalSpacing; |
|||
} |
|||
} |
|||
|
|||
[Serializable] |
|||
public class ConvolutionFilterNodePresenter : PropertyNodePresenter |
|||
{ |
|||
protected override IEnumerable<GraphElementPresenter> GetControlData() |
|||
{ |
|||
var instance = CreateInstance<ConvolutionFilterControlPresenter>(); |
|||
instance.Initialize(node); |
|||
return new List<GraphElementPresenter>(base.GetControlData()) { instance }; |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: f3a416c372d21b6479241e837d4257da |
|||
timeCreated: 1495705790 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using RMGUI.GraphView; |
|||
using UnityEditor.Graphing.Drawing; |
|||
|
|||
|
|||
namespace UnityEditor.MaterialGraph.Drawing |
|||
{ |
|||
[Serializable] |
|||
class ScatterContolPresenter : GraphControlPresenter |
|||
{ |
|||
public override void OnGUIHandler() |
|||
{ |
|||
base.OnGUIHandler(); |
|||
|
|||
var cNode = node as UnityEngine.MaterialGraph.ScatterNode; |
|||
if (cNode == null) |
|||
return; |
|||
|
|||
cNode.num = EditorGUILayout.IntField(cNode.num, "Number", null); |
|||
cNode.num = Math.Min(cNode.num, 50); //prevent infinite => hang!
|
|||
} |
|||
|
|||
public override float GetHeight() |
|||
{ |
|||
return EditorGUIUtility.singleLineHeight + 10 * EditorGUIUtility.standardVerticalSpacing; |
|||
} |
|||
|
|||
} |
|||
|
|||
[Serializable] |
|||
public class ScatterNodePresenter : MaterialNodePresenter |
|||
{ |
|||
protected override IEnumerable<GraphElementPresenter> GetControlData() |
|||
{ |
|||
var instance = CreateInstance<ScatterContolPresenter>(); |
|||
instance.Initialize(node); |
|||
return new List<GraphElementPresenter> { instance }; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 324b6873762a09544a3cebd0f0c7721d |
|||
timeCreated: 1495713547 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: 7ed888a282fe7b54e968311cd68c4862 |
|||
folderAsset: yes |
|||
timeCreated: 1495638073 |
|||
licenseType: Pro |
|||
DefaultImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: 3b0333da20fc0bf48a4d9b09a9d8d9db |
|||
timeCreated: 1495718308 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using UnityEngine.Graphing; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
[Title("UV/Twist")] |
|||
public class TwistNode : Function2Input, IGeneratesFunction |
|||
{ |
|||
public TwistNode() |
|||
{ |
|||
name = "Twist"; |
|||
} |
|||
|
|||
protected override string GetFunctionName() |
|||
{ |
|||
return "unity_twist_" + precision; |
|||
} |
|||
|
|||
protected override string GetInputSlot1Name() |
|||
{ |
|||
return "UV"; |
|||
} |
|||
|
|||
protected override string GetInputSlot2Name() |
|||
{ |
|||
return "Twist"; |
|||
} |
|||
|
|||
protected override MaterialSlot GetInputSlot1() |
|||
{ |
|||
return new MaterialSlot(InputSlot1Id, GetInputSlot1Name(), kInputSlot1ShaderName, SlotType.Input, SlotValueType.Vector2, Vector2.zero); |
|||
} |
|||
|
|||
protected override MaterialSlot GetInputSlot2() |
|||
{ |
|||
return new MaterialSlot(InputSlot2Id, GetInputSlot2Name(), kInputSlot2ShaderName, SlotType.Input, SlotValueType.Vector1, Vector2.zero); |
|||
} |
|||
|
|||
protected override MaterialSlot GetOutputSlot() |
|||
{ |
|||
return new MaterialSlot(OutputSlotId, GetOutputSlotName(), kOutputSlotShaderName, SlotType.Output, SlotValueType.Vector2, Vector2.zero); |
|||
} |
|||
|
|||
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
var outputString = new ShaderGenerator(); |
|||
outputString.AddShaderChunk(GetFunctionPrototype("uv", "twist"), false); |
|||
outputString.AddShaderChunk("{", false); |
|||
outputString.Indent(); |
|||
outputString.AddShaderChunk("float angle = twist * length(uv);", false); |
|||
outputString.AddShaderChunk("float x = cos(angle) * uv.x - sin(angle) * uv.y;", false); |
|||
outputString.AddShaderChunk("float y = sin(angle) * uv.x + cos(angle) * uv.y;", false); |
|||
outputString.AddShaderChunk("return float2(x, y);", false); |
|||
|
|||
outputString.Deindent(); |
|||
outputString.AddShaderChunk("}", false); |
|||
|
|||
visitor.AddShaderChunk(outputString.GetShaderString(0), true); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 3933f2692da9060438719b86844dcc7e |
|||
timeCreated: 1495718285 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using UnityEngine.Graphing; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
[Title("Procedural/Scatter")] |
|||
public class ScatterNode : FunctionNInNOut, IGeneratesFunction |
|||
{ |
|||
|
|||
[SerializeField] |
|||
private int m_num = 1 ; |
|||
|
|||
|
|||
public int num |
|||
{ |
|||
get { return m_num; } |
|||
set |
|||
{ |
|||
|
|||
if (m_num == value) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
m_num = value; |
|||
if (onModified != null) |
|||
{ |
|||
onModified(this, ModificationScope.Graph); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public ScatterNode() |
|||
{ |
|||
name = "Scatter"; |
|||
AddSlot("Texture", "inputTex", Graphing.SlotType.Input, SlotValueType.sampler2D, Vector4.zero); |
|||
AddSlot("UV", "inputUV", Graphing.SlotType.Input, SlotValueType.Vector2, Vector2.one); |
|||
AddSlot("Seed", "seed", Graphing.SlotType.Input, SlotValueType.Vector2, Vector2.one); |
|||
AddSlot("PositionRange", "p_range", Graphing.SlotType.Input, SlotValueType.Vector2, Vector2.zero); |
|||
AddSlot("RotationRange", "r_range", Graphing.SlotType.Input, SlotValueType.Vector2, Vector2.zero); |
|||
AddSlot("ScaleRange", "s_range", Graphing.SlotType.Input, SlotValueType.Vector2, Vector2.zero); |
|||
AddSlot("RGBA", "finalColor", Graphing.SlotType.Output, SlotValueType.Vector4, Vector4.zero); |
|||
UpdateNodeAfterDeserialization(); |
|||
} |
|||
|
|||
protected override string GetFunctionName() |
|||
{ |
|||
return "unity_scatter_" + precision; |
|||
} |
|||
|
|||
public override bool hasPreview |
|||
{ |
|||
get { return true; } |
|||
} |
|||
|
|||
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
var outputString = new ShaderGenerator(); |
|||
|
|||
//RotateUVFunction ===================================================================
|
|||
outputString.AddShaderChunk("inline float2 rotateUV( float2 arg1, float arg2 )", false); |
|||
outputString.AddShaderChunk("{", false); |
|||
outputString.Indent(); |
|||
//center texture's pivot
|
|||
outputString.AddShaderChunk("arg1.xy -= 0.5;", false); |
|||
//rotation matrix
|
|||
outputString.AddShaderChunk(precision + " s = sin(arg2);", false); |
|||
outputString.AddShaderChunk(precision + " c = cos(arg2);", false); |
|||
outputString.AddShaderChunk(precision + "2x2 rMatrix = float2x2(c, -s, s, c);", false); |
|||
//center rotation matrix
|
|||
outputString.AddShaderChunk("rMatrix *= 0.5;", false); |
|||
outputString.AddShaderChunk("rMatrix += 0.5;", false); |
|||
outputString.AddShaderChunk("rMatrix = rMatrix*2 - 1;", false); |
|||
//multiply the UVs by the rotation matrix
|
|||
outputString.AddShaderChunk("arg1.xy = mul(arg1.xy, rMatrix);", false); |
|||
outputString.AddShaderChunk("arg1.xy += 0.5;", false); |
|||
outputString.AddShaderChunk("return " + "arg1;", false); |
|||
outputString.Deindent(); |
|||
outputString.AddShaderChunk("}", false); |
|||
|
|||
//RamdomFunction ===================================================================
|
|||
outputString.AddShaderChunk("inline float randomrange(float2 randomseed, float min, float max)", false); |
|||
outputString.AddShaderChunk("{", false); |
|||
outputString.Indent(); |
|||
outputString.AddShaderChunk("float randomno = frac(sin(dot(randomseed, float2(12.9898, 78.233)))*43758.5453);", false); |
|||
outputString.AddShaderChunk("return floor(randomno * (max - min + 1)) + min;", false); |
|||
outputString.Deindent(); |
|||
outputString.AddShaderChunk("}", false); |
|||
|
|||
//ScatterFunction ===================================================================
|
|||
outputString.AddShaderChunk(GetFunctionPrototype(), false); |
|||
outputString.AddShaderChunk("{", false); |
|||
outputString.Indent(); |
|||
|
|||
outputString.AddShaderChunk("finalColor = float4(0,0,0,0);", false); |
|||
outputString.AddShaderChunk("float2 newuv = inputUV;", false); |
|||
outputString.AddShaderChunk("float4 tex = tex2D(inputTex,newuv);", false); |
|||
|
|||
for (int i=0; i<m_num; i++) |
|||
{ |
|||
//random UV
|
|||
outputString.AddShaderChunk("newuv *= randomrange(seed,s_range.x,s_range.y);", false); //Scale
|
|||
outputString.AddShaderChunk("newuv = rotateUV(newuv,randomrange(seed,r_range.x,r_range.y));", false); //Rotate
|
|||
outputString.AddShaderChunk("newuv += randomrange(seed,p_range.x,p_range.y));", false); //Position
|
|||
|
|||
//seamless
|
|||
|
|||
|
|||
//sample
|
|||
outputString.AddShaderChunk("tex = tex2D(inputTex,newuv);", false); |
|||
|
|||
//blend together
|
|||
outputString.AddShaderChunk("finalColor += tex/"+m_num+";", false); |
|||
} |
|||
|
|||
outputString.Deindent(); |
|||
outputString.AddShaderChunk("}", false); |
|||
|
|||
visitor.AddShaderChunk(outputString.GetShaderString(0), true); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 7726e0a353d4a53499b58140956b2c9b |
|||
timeCreated: 1495709638 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: fbb15485f0112484eaa58e88a4ac393f |
|||
folderAsset: yes |
|||
timeCreated: 1495654193 |
|||
licenseType: Pro |
|||
DefaultImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
1
MaterialGraphProject/Assets/Matt/Examples/HueStrip.ShaderGraph
文件差异内容过多而无法显示
查看文件
文件差异内容过多而无法显示
查看文件
|
|||
fileFormatVersion: 2 |
|||
guid: ef4863cc0eaedba4d8ab1d6de73caabf |
|||
timeCreated: 1495713916 |
|||
licenseType: Pro |
|||
ScriptedImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} |
1
MaterialGraphProject/Assets/Matt/Examples/Swirl.ShaderGraph
文件差异内容过多而无法显示
查看文件
文件差异内容过多而无法显示
查看文件
|
|||
fileFormatVersion: 2 |
|||
guid: c4bdf1ebef2b7aa4f8683354d16b64a1 |
|||
timeCreated: 1495715410 |
|||
licenseType: Pro |
|||
ScriptedImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|||
script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} |
|
|||
fileFormatVersion: 2 |
|||
guid: 930d27407d5f02d4a931a8a2aaf451cf |
|||
timeCreated: 1495638643 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using UnityEngine.Graphing; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
[Title("Art/Filters/Convolution")] |
|||
public class ConvolutionFilterNode : Function2Input, IGeneratesFunction, IGeneratesBodyCode, IMayRequireMeshUV |
|||
{ |
|||
private const string kUVSlotName = "UV"; |
|||
private const string kTextureSlotName = "Texture"; |
|||
private const int kNumConvolutionVector4 = 7; |
|||
|
|||
[SerializeField] |
|||
private Vector4[] m_ConvolutionFilter = new Vector4[kNumConvolutionVector4] |
|||
{ new Vector4(1,1,1,1), |
|||
new Vector4(1,1,1,1), |
|||
new Vector4(1,1,1,1), |
|||
new Vector4(1,1,1,1), |
|||
new Vector4(1,1,1,1), |
|||
new Vector4(1,1,1,1), |
|||
new Vector4(1,0,0,25.0f) }; |
|||
|
|||
private void GetPositionInData(int row, int col, out int vectorIndex, out int vectorOffset) |
|||
{ |
|||
row = Math.Max(row, 0); |
|||
col = Math.Max(col, 0); |
|||
|
|||
row = Math.Min(row, 4); |
|||
col = Math.Min(col, 4); |
|||
|
|||
int valueIndex = col * 5 + row; |
|||
vectorIndex = valueIndex / 4; |
|||
vectorOffset = valueIndex % 4; |
|||
} |
|||
|
|||
public float GetConvolutionDivisor() |
|||
{ |
|||
return m_ConvolutionFilter[6].w; |
|||
} |
|||
|
|||
public void SetConvolutionDivisor(float value) |
|||
{ |
|||
if (value == m_ConvolutionFilter[6].w) |
|||
return; |
|||
|
|||
m_ConvolutionFilter[6].w = value; |
|||
|
|||
if (onModified != null) |
|||
onModified(this, ModificationScope.Node); |
|||
} |
|||
|
|||
public float GetConvolutionWeight(int row, int col) |
|||
{ |
|||
int vectorIndex; |
|||
int vectorOffset; |
|||
GetPositionInData(row, col, out vectorIndex, out vectorOffset); |
|||
|
|||
switch(vectorOffset) |
|||
{ |
|||
case 0: return m_ConvolutionFilter[vectorIndex].x; |
|||
case 1: return m_ConvolutionFilter[vectorIndex].y; |
|||
case 2: return m_ConvolutionFilter[vectorIndex].z; |
|||
default: return m_ConvolutionFilter[vectorIndex].w; |
|||
} |
|||
} |
|||
|
|||
public void SetConvolutionWeight(int row, int col, float value) |
|||
{ |
|||
float prevValue = GetConvolutionWeight(row, col); |
|||
|
|||
if (value == prevValue) |
|||
return; |
|||
|
|||
int vectorIndex; |
|||
int vectorOffset; |
|||
GetPositionInData(row, col, out vectorIndex, out vectorOffset); |
|||
|
|||
switch (vectorOffset) |
|||
{ |
|||
case 0: m_ConvolutionFilter[vectorIndex].x = value; break; |
|||
case 1: m_ConvolutionFilter[vectorIndex].y = value; break; |
|||
case 2: m_ConvolutionFilter[vectorIndex].z = value; break; |
|||
default: m_ConvolutionFilter[vectorIndex].w = value; break; |
|||
} |
|||
|
|||
if (onModified != null) |
|||
onModified(this, ModificationScope.Node); |
|||
} |
|||
|
|||
protected override string GetFunctionName() |
|||
{ |
|||
return "unity_convolution_" + precision; |
|||
} |
|||
|
|||
protected override MaterialSlot GetInputSlot1() |
|||
{ |
|||
return new MaterialSlot(InputSlot1Id, kTextureSlotName, kTextureSlotName, SlotType.Input, SlotValueType.sampler2D, Vector4.zero, false); |
|||
} |
|||
|
|||
protected override MaterialSlot GetInputSlot2() |
|||
{ |
|||
return new MaterialSlot(InputSlot2Id, kUVSlotName, kUVSlotName, SlotType.Input, SlotValueType.Vector2, Vector4.zero, false); |
|||
} |
|||
|
|||
protected override MaterialSlot GetOutputSlot() |
|||
{ |
|||
return new MaterialSlot(OutputSlotId, kOutputSlotShaderName, kOutputSlotShaderName, SlotType.Output, SlotValueType.Vector4, Vector4.zero); |
|||
} |
|||
|
|||
public ConvolutionFilterNode() |
|||
{ |
|||
name = "Convolution"; |
|||
UpdateNodeAfterDeserialization(); |
|||
} |
|||
|
|||
public override bool hasPreview |
|||
{ |
|||
get { return true; } |
|||
} |
|||
|
|||
public override PreviewMode previewMode |
|||
{ |
|||
get |
|||
{ |
|||
return PreviewMode.Preview2D; |
|||
} |
|||
} |
|||
|
|||
public override void GeneratePropertyUsages(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
if (generationMode.IsPreview()) |
|||
{ |
|||
string propGuid = guid.ToString().Replace("-", "_"); |
|||
for (int i = 0; i < kNumConvolutionVector4; ++i) |
|||
{ |
|||
visitor.AddShaderChunk(precision + "4 " + GetPropertyName(i, propGuid) + ";", true); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private string GetPropertyName(int index, string nodeGuid) |
|||
{ |
|||
return "convolutionFilter" + index + "_" + nodeGuid; |
|||
} |
|||
|
|||
public override void GenerateNodeCode(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
NodeUtils.SlotConfigurationExceptionIfBadConfiguration(this, new[] { InputSlot1Id, InputSlot2Id }, new[] { OutputSlotId }); |
|||
|
|||
if (!generationMode.IsPreview()) |
|||
{ |
|||
string propGuid = guid.ToString().Replace("-", "_"); |
|||
for (int i = 0; i < kNumConvolutionVector4; ++i) |
|||
{ |
|||
visitor.AddShaderChunk(precision + "4 " + GetPropertyName(i, propGuid) + "=" + precision + "4 (" + m_ConvolutionFilter[i].x + ", " + m_ConvolutionFilter[i].y + ", " + m_ConvolutionFilter[i].z + ", " + m_ConvolutionFilter[i].w + ");", true); |
|||
} |
|||
} |
|||
|
|||
string samplerName = GetSlotValue(InputSlot1Id, generationMode); |
|||
|
|||
//uv
|
|||
var uvSlot = FindInputSlot<MaterialSlot>(InputSlot2Id); |
|||
if (uvSlot == null) |
|||
return; |
|||
|
|||
var baseUV = string.Format("{0}.xy", UVChannel.uv0.GetUVName()); |
|||
var uvEdges = owner.GetEdges(uvSlot.slotReference).ToList(); |
|||
if (uvEdges.Count > 0) |
|||
{ |
|||
var uvEdge = uvEdges[0]; |
|||
var fromNode = owner.GetNodeFromGuid<AbstractMaterialNode>(uvEdge.outputSlot.nodeGuid); |
|||
baseUV = ShaderGenerator.AdaptNodeOutput(fromNode, uvEdge.outputSlot.slotId, ConcreteSlotValueType.Vector2, true); |
|||
} |
|||
|
|||
//texelSize
|
|||
string texelSize = samplerName + "_TexelSize.xy"; |
|||
visitor.AddShaderChunk(precision + "4 " + GetVariableNameForSlot(OutputSlotId) + " = " + GetFunctionCallBody(samplerName, baseUV, texelSize) + ";", true); |
|||
|
|||
|
|||
} |
|||
|
|||
protected string GetFunctionCallBody(string samplerName, string baseUv, string texelSize) |
|||
{ |
|||
string propGuid = guid.ToString().Replace("-", "_"); |
|||
|
|||
return GetFunctionName() + " (" + samplerName + ", " + baseUv + ", " |
|||
+ GetPropertyName(0, propGuid) + ", " |
|||
+ GetPropertyName(1, propGuid) + ", " |
|||
+ GetPropertyName(2, propGuid) + ", " |
|||
+ GetPropertyName(3, propGuid) + ", " |
|||
+ GetPropertyName(4, propGuid) + ", " |
|||
+ GetPropertyName(5, propGuid) + ", " |
|||
+ GetPropertyName(6, propGuid) + ", " |
|||
+ texelSize + ")"; |
|||
} |
|||
|
|||
protected override string GetFunctionPrototype(string arg1Name, string arg2Name) |
|||
{ |
|||
string propGuid = guid.ToString().Replace("-", "_"); |
|||
|
|||
return "inline " + precision + "4 " + GetFunctionName() + " (" |
|||
+ "sampler2D " + arg1Name + ", " |
|||
+ precision + "2 " + arg2Name + ", " |
|||
+ precision + "4 weights0," |
|||
+ precision + "4 weights1," |
|||
+ precision + "4 weights2," |
|||
+ precision + "4 weights3," |
|||
+ precision + "4 weights4," |
|||
+ precision + "4 weights5," |
|||
+ precision + "4 weights6, float2 texelSize)"; |
|||
} |
|||
|
|||
|
|||
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
var outputString = new ShaderGenerator(); |
|||
|
|||
outputString.AddShaderChunk(GetFunctionPrototype("textSampler", "baseUv"), false); |
|||
outputString.AddShaderChunk("{", false); |
|||
outputString.Indent(); |
|||
|
|||
outputString.AddShaderChunk("fixed4 fetches = fixed4(0,0,0,0);", false); |
|||
outputString.AddShaderChunk("fixed weight = 1;", false); |
|||
|
|||
string[] channelNames = { ".x", ".y", ".z", ".w" }; |
|||
for(int col=0; col < 5; ++col) |
|||
{ |
|||
for(int row=0; row < 5; ++row) |
|||
{ |
|||
int valueIndex = col * 5 + row; |
|||
int vectorIndex = valueIndex / 4; |
|||
int vectorOffset = valueIndex % 4; |
|||
outputString.AddShaderChunk("weight = weights" + vectorIndex + channelNames[vectorOffset] + ";", false); |
|||
outputString.AddShaderChunk("fetches += weight * tex2D(textSampler, baseUv + texelSize * fixed2("+(row-2)+","+(col-2)+"));", false); |
|||
} |
|||
} |
|||
|
|||
outputString.AddShaderChunk("fetches /= weights6.w;", false); |
|||
outputString.AddShaderChunk("return fetches;", false); |
|||
|
|||
outputString.Deindent(); |
|||
outputString.AddShaderChunk("}", false); |
|||
|
|||
visitor.AddShaderChunk(outputString.GetShaderString(0), true); |
|||
} |
|||
|
|||
//prevent validation errors when a sampler2D input is missing
|
|||
//use on any input requiring a TextureAssetNode
|
|||
public override void ValidateNode() |
|||
{ |
|||
base.ValidateNode(); |
|||
var slot = FindInputSlot<MaterialSlot>(InputSlot1Id); |
|||
if (slot == null) |
|||
return; |
|||
|
|||
var edges = owner.GetEdges(slot.slotReference).ToList(); |
|||
hasError |= edges.Count == 0; |
|||
} |
|||
|
|||
public override void CollectPreviewMaterialProperties(List<PreviewProperty> properties) |
|||
{ |
|||
base.CollectPreviewMaterialProperties(properties); |
|||
string propGuid = guid.ToString().Replace("-", "_"); |
|||
for (int i = 0; i < kNumConvolutionVector4; ++i) |
|||
{ |
|||
properties.Add(new PreviewProperty { m_Name = GetPropertyName(i, propGuid), m_PropType = PropertyType.Vector4, m_Vector4 = m_ConvolutionFilter[i] }); |
|||
} |
|||
} |
|||
|
|||
public bool RequiresMeshUV(UVChannel channel) |
|||
{ |
|||
if (channel != UVChannel.uv0) |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
var uvSlot = FindInputSlot<MaterialSlot>(InputSlot2Id); |
|||
if (uvSlot == null) |
|||
return true; |
|||
|
|||
var edges = owner.GetEdges(uvSlot.slotReference).ToList(); |
|||
return edges.Count == 0; |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 6e05bd4324babff4498e856ab63b993c |
|||
timeCreated: 1495526233 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
撰写
预览
正在加载...
取消
保存
Reference in new issue