protected override void FillTexture(Texture2D texture) { if (Data == null) { return; } Data.BeginInputInit(); _color = Data.CteateOutput(ValueType.Color, "Color"); _position = Data.CteateInput(ValueType.Vector2, "Position"); _rToBorder = Data.CteateInput(ValueType.Float, "Radius To Border"); _rToCorner = Data.CteateInput(ValueType.Float, "Radius To Corner"); _angle = Data.CteateInput(ValueType.Float, "Angle"); Data.EndInputInit(); if (Input == null) { Input = new NodeDataInput(); } Input.InitializeFrom(Data); Input.SetTo(Data); int width = texture.width; int height = texture.height; Color[] colors = new Color[width * height]; float halfWidth = width * 0.5f; float halfHeight = height * 0.5f; float cornerlength = Mathf.Sqrt(2); for (int i = 0; i < colors.Length; i++) { float y = (int)(i / width); float x = i - y * width; y -= halfHeight - 0.5f; x -= halfWidth - 0.5f; Vector2 position = new Vector2(x / halfWidth, y / halfHeight); float r = position.magnitude; float rToBorder = r; float rToCorner = r / cornerlength; float angle = 0.5f + Mathf.Atan2(-x, -y) / (2 * Mathf.PI); Data.SetVector2(_position, new Vector2(position.x * 0.5f + 0.5f, position.y * 0.5f + 0.5f)); Data.SetFloat(_rToBorder, rToBorder); Data.SetFloat(_rToCorner, rToCorner); Data.SetFloat(_angle, angle); Data.Process(); colors[i] = Data.GetColor(_color); } texture.SetPixels(colors); texture.Apply(); Texture = texture; }
void OnEnable() { if (Data == null) { return; } Data.Prepare(); if (Input == null) { Input = new NodeDataInput(); } Input.InitializeFrom(Data); }
void GenerateMesh(Mesh mesh, int width, int height) { if (Data == null) { return; } Data.BeginInputInit(); _x = Data.CteateInput(ValueType.Float, "X"); _y = Data.CteateInput(ValueType.Float, "Y"); _width = Data.CteateInput(ValueType.Float, "Width"); _height = Data.CteateInput(ValueType.Float, "Height"); _start = Data.CteateInput(ValueType.Bool, "Start"); _position = Data.CteateOutput(ValueType.Vector3, "Position"); _normal = Data.CteateOutput(ValueType.Vector3, "Normal"); _tangent = Data.CteateOutput(ValueType.Vector4, "Tangent"); _color = Data.CteateOutput(ValueType.Color, "Color"); _uv0 = Data.CteateOutput(ValueType.Vector2, "UV0"); _uv1 = Data.CteateOutput(ValueType.Vector2, "UV1"); _uv2 = Data.CteateOutput(ValueType.Vector2, "UV2"); _uv3 = Data.CteateOutput(ValueType.Vector2, "UV3"); Data.EndInputInit(); if (Input == null) { Input = new NodeDataInput(); } Input.InitializeFrom(Data); Input.SetTo(Data); int vertWidth = width + 1; int vertHeight = height + 1; int verticesCount = vertWidth * vertHeight; Vector3[] positions = IsConnected(_position) ? new Vector3[verticesCount] : null; Vector3[] normals = IsConnected(_normal) ? new Vector3[verticesCount] : null; Vector4[] tangents = IsConnected(_tangent) ? new Vector4[verticesCount] : null; Color[] colors = IsConnected(_color) ? new Color[verticesCount] : null; Vector2[] uv0 = IsConnected(_uv0) ? new Vector2[verticesCount] : null; Vector2[] uv1 = IsConnected(_uv1) ? new Vector2[verticesCount] : null; Vector2[] uv2 = IsConnected(_uv2) ? new Vector2[verticesCount] : null; Vector2[] uv3 = IsConnected(_uv3) ? new Vector2[verticesCount] : null; if (positions == null) { mesh.Clear(); return; } Data.SetFloat(_width, width); Data.SetFloat(_height, height); for (int y = 0, i = 0; y < vertHeight; y++) { for (int x = 0; x < vertWidth; x++, i++) { float fx = x / (float)width; float fy = y / (float)height; Data.SetBool(_start, i == 0); Data.SetFloat(_x, fx); Data.SetFloat(_y, fy); Data.Process(); positions[i] = Data.GetVector3(_position); if (normals != null) { normals[i] = Data.GetVector3(_normal); } if (tangents != null) { tangents[i] = Data.GetVector4(_tangent); } if (colors != null) { colors[i] = Data.GetColor(_color); } if (uv0 != null) { uv0[i] = Data.GetVector2(_uv0); } if (uv1 != null) { uv1[i] = Data.GetVector2(_uv1); } if (uv2 != null) { uv2[i] = Data.GetVector2(_uv2); } if (uv3 != null) { uv3[i] = Data.GetVector2(_uv3); } } } // \ | \ | // - 0 - 1 - // \ | \ | \ // - 2 - 3 - // | \ | \ int[] triangles = new int[width * height * 6]; for (int y = 0, t = 0; y < height; y++) { for (int x = 0; x < width; x++) { int v0 = y * vertWidth + x; int v1 = v0 + 1; int v2 = v0 + vertWidth; int v3 = v2 + 1; triangles[t++] = v0; triangles[t++] = v2; triangles[t++] = v3; triangles[t++] = v3; triangles[t++] = v1; triangles[t++] = v0; } } mesh.Clear(); mesh.vertices = positions; mesh.triangles = triangles; if (normals != null) { mesh.normals = normals; } if (tangents != null) { mesh.tangents = tangents; } if (colors != null) { mesh.colors = colors; } if (uv0 != null) { mesh.uv = uv0; } if (uv1 != null) { mesh.uv2 = uv1; } if (uv2 != null) { mesh.uv3 = uv2; } if (uv3 != null) { mesh.uv4 = uv3; } mesh.RecalculateBounds(); if (RecalculateNormals) { mesh.RecalculateNormals(); } if (RecalculateTangents) { mesh.RecalculateTangents(); } }
protected override void FillTexture(Texture2D texture) { if (Data == null || Source == null) return; bool isReadable = false; #if UNITY_EDITOR string path = UnityEditor.AssetDatabase.GetAssetPath(Source); UnityEditor.TextureImporter ti = (UnityEditor.TextureImporter)UnityEditor.TextureImporter.GetAtPath(path); if (ti != null) isReadable = ti.isReadable; #endif if (!isReadable) return; Data.BeginInputInit(); _in0 = Data.CteateInput(ValueType.Color, "In 0"); _in1 = Data.CteateInput(ValueType.Color, "In 1"); _in2 = Data.CteateInput(ValueType.Color, "In 2"); _in3 = Data.CteateInput(ValueType.Color, "In 3"); _original = Data.CteateInput(ValueType.Color, "Original"); _pos = Data.CteateInput(ValueType.Vector2, "Position"); _mipPos = Data.CteateInput(ValueType.Float, "Mip Position"); _mipCount = Data.CteateInput(ValueType.Float, "Mip Count"); _out = Data.CteateOutput(ValueType.Color, "Color"); Data.EndInputInit(); if (Input == null) Input = new NodeDataInput(); Input.InitializeFrom(Data); Input.SetTo(Data); int mipmapCount = 1 + (int)Mathf.Log(Mathf.Max(Source.width, Source.height), 2); Color[] lastColors = null; Data.SetFloat(_mipCount, mipmapCount); for (int mI = 0; mI < mipmapCount; mI++) { int mipWidth = Mathf.Max(texture.width >> mI, 1); int mipHeight = Mathf.Max(texture.height >> mI, 1); int lastMipWidth = Mathf.Max(texture.width >> (mI - 1), 1); int lastMipHeight = Mathf.Max(texture.height >> (mI - 1), 1); int mipDelta = lastMipWidth > mipWidth ? 2 : 1; int mipDeltaY = mipDelta * (lastMipHeight > mipHeight ? 2 : 1); Data.SetFloat(_mipPos, mI / (float)mipmapCount); Color[] colors = lastColors == null || Source.mipmapCount == mipmapCount ? Source.GetPixels(mI) : new Color[mipWidth * mipHeight]; if (lastColors != null) { for (int i = 0; i < colors.Length; i++) { int y = i / mipWidth; int x = i - y * mipWidth; int i2 = x * mipDelta + y * mipWidth * mipDeltaY; if (lastColors.Length < 4) lastMipWidth = 0; Data.SetVector2(_pos, new Vector2(x / (float)mipWidth, y / (float)mipHeight)); Data.SetColor(_in0, lastColors[i2]); Data.SetColor(_in1, lastColors[i2 + 1]); Data.SetColor(_in2, lastColors[i2 + lastMipWidth]); Data.SetColor(_in3, lastColors[i2 + lastMipWidth + 1]); Data.SetColor(_original, colors[i]); Data.Process(); colors[i] = Data.GetColor(_out); } } texture.SetPixels(colors, mI); lastColors = colors; } texture.Apply(false); }