public override void DrawNodePropertyEditor() { base.DrawNodePropertyEditor(); m_Angle.SliderLabel(this, "Angle");//,m_Value1, -180.0f, 180.0f) ;//,new GUIContent("Red", "Float"), m_R); m_Uniform = GUILayout.Toggle(m_Uniform, "Uniform Scale:"); EditorGUI.indentLevel++; m_ScaleX.SliderLabel(this, m_Uniform ? "Scale": "ScaleX");//, m_Value2);//, -10.0f, 10.0f);//,new GUIContent("Red", "Float"), m_R); // m_NonUniform = EditorGUILayout.BeginToggle("NonUniform Scale:", m_NonUniform); GUI.enabled = !m_Uniform; m_ScaleY.SliderLabel(this, "ScaleY");//, -10, 10.0f); GUI.enabled = true; EditorGUI.indentLevel--; // EditorGUILayout.EndToggleGroup(); if (m_Uniform) { m_ScaleY.Set(m_ScaleX); } m_OffsetX.SliderLabel(this, "OffsetX"); //, 0.0f, 10.0f);//,new GUIContent("Red", "Float"), m_R); m_OffsetY.SliderLabel(this, "OffsetY"); //, 0.0f, 10.0f);//,new GUIContent("Red", "Float"), m_R); }
public void Generate(TextureParam _output) { int seed = (int)m_MaterialIndex; Random.InitState(seed); RenderTexture destination = CreateRenderDestination(null, _output); TriangleDraw.GPUStart(destination, GL.LINES); List <Vector2> uvs = new List <Vector2>(); List <Vector3> norms = new List <Vector3>(); List <Vector3> pos = new List <Vector3>(); if ((int)m_MaterialIndex.m_Value >= m_Mesh.subMeshCount) { m_MaterialIndex.Set(m_Mesh.subMeshCount - 1); } int[] indicies = m_Mesh.GetIndices((int)m_MaterialIndex.m_Value); m_Mesh.GetUVs(0, uvs); m_Mesh.GetNormals(norms); m_Mesh.GetVertices(pos); Vector3[] averageTri = new Vector3[indicies.Length / 3]; Dictionary <double, Int64> edgeToTri = new Dictionary <double, long>(); Dictionary <Int64, int> TriTriToEdge = new Dictionary <Int64, int>(); for (int i = 0; i < indicies.Length; i += 3) { int i0 = indicies[i]; int i1 = indicies[i + 1]; int i2 = indicies[i + 2]; Vector3 n0 = norms[i0]; Vector3 n1 = norms[i1]; Vector3 n2 = norms[i2]; Vector3 p0 = pos[i0]; Vector3 p1 = pos[i1]; Vector3 p2 = pos[i2]; Vector3 average = (n0 + n1 + n2) * .3333333333f; averageTri[i / 3] = average; double key = GetEdgeKey(i0, i1); long triIndex = (i / 3) + 1; long existingTri = 0; edgeToTri.TryGetValue(key, out existingTri); Debug.Log(" key " + key + " ia " + i0 + " ib " + i1 + " tri: " + (i / 3) + "existing from dict " + existingTri); if (edgeToTri.ContainsKey(key)) { Int64 tris = edgeToTri[key]; if (tris < (1 << 30)) {//allready done tris |= triIndex << 32; edgeToTri[key] = tris; TriTriToEdge[tris] = 0; } else { Debug.LogError("e0 third attempt at tri " + (i / 3)); } } else { edgeToTri[key] = triIndex; TriTriToEdge[triIndex] = 0; } key = GetEdgeKey(i1, i2); edgeToTri.TryGetValue(key, out existingTri); Debug.Log(" key " + key + " ia " + i1 + " ib " + i2 + " tri: " + (i / 3) + "existing from dict " + existingTri); if (edgeToTri.ContainsKey(key)) { Int64 tris = edgeToTri[key]; if (tris < (1 << 30)) {//allready done tris |= triIndex << 32; edgeToTri[key] = tris; TriTriToEdge[tris] = 1; } else { Debug.LogError("e1 third attempt at tri " + (i / 3)); } } else { edgeToTri[key] = triIndex; TriTriToEdge[triIndex] = 1; } key = GetEdgeKey(i2, i0); edgeToTri.TryGetValue(key, out existingTri); Debug.Log(" key " + key + " ia " + i2 + " ib " + i0 + " tri: " + (i / 3) + "existing from dict " + existingTri); if (edgeToTri.ContainsKey(key)) { Int64 tris = edgeToTri[key]; if (tris < (1 << 30)) {//allready done tris |= triIndex << 32; edgeToTri[key] = tris; TriTriToEdge[tris] = 2; } else { Debug.LogError("e2 third attempt at tri " + (i / 3)); } } else { edgeToTri[key] = triIndex; TriTriToEdge[triIndex] = 2; } } TriangleDraw.AddCol(Color.white); foreach (double key in edgeToTri.Keys) { long index = edgeToTri[key]; int left = (int)(index & 0xfffffff) - 1; int right = (int)((index >> 32) & 0xfffffffff) - 1; bool drawEdge = false; if (right < 0) { drawEdge = false; int offset = TriTriToEdge[index]; int v0 = left * 3 + offset; int v1 = left * 3 + ((offset + 1) % 3); Vector3 uv0 = uvs[indicies[v0]]; Vector3 uv1 = uvs[indicies[v1]]; TriangleDraw.AddVert(new Vector3(uv0.x, uv0.y, 0)); TriangleDraw.AddVert(new Vector3(uv1.x, uv1.y, 0)); } else { float dot = Vector3.Dot(averageTri[left], averageTri[right]); if (dot < m_EdgeAngleDif && right >= 0) { drawEdge = true; } } if (drawEdge) { int offset = TriTriToEdge[index]; int v0 = right * 3 + offset; int v1 = right * 3 + (offset + 1) % 3; Vector3 uv0 = uvs[indicies[v0]]; Vector3 uv1 = uvs[indicies[v1]]; TriangleDraw.AddVert(new Vector3(uv0.x, uv0.y, 0)); TriangleDraw.AddVert(new Vector3(uv1.x, uv1.y, 0)); } } /* * for (int i = 0; i < indicies.Length; i +=3) * { * Vector3 uv0 = uvs[indicies[i]]; * Vector3 uv1 = uvs[indicies[i+1]]; * Vector3 uv2 = uvs[indicies[i+2]]; * TriangleDraw.AddVert(new Vector3(uv0.x,uv0.y,0)); * TriangleDraw.AddVert(new Vector3(uv1.x, uv1.y, 0)); * * TriangleDraw.AddVert(new Vector3(uv1.x, uv1.y, 0)); * TriangleDraw.AddVert(new Vector3(uv2.x, uv2.y, 0)); * * TriangleDraw.AddVert(new Vector3(uv2.x, uv2.y, 0)); * TriangleDraw.AddVert(new Vector3(uv0.x, uv0.y, 0)); * } */ TriangleDraw.GPUEnd(); }