/** * \brief Creates a new pb_Object with passed vertex array and pb_Face array. Allows for a great deal of control when constructing geometry. * @param _vertices The vertex array to use in construction of mesh. * @param _faces A pb_Face array containing triangle, material per face, and pb_UV parameters for each face. * \sa pb_Face pb_UV * \returns The newly created pb_Object. */ public static pb_Object CreateInstanceWithVerticesFaces(Vector3[] v, pb_Face[] f) { GameObject _gameObject = new GameObject(); pb_Object pb_obj = _gameObject.AddComponent <pb_Object>(); pb_obj.SetName("Object"); pb_obj.GeometryWithVerticesFaces(v, f); return(pb_obj); }
private pb_Object GetShadowObject(pb_Object pb) { if (pb == null || pb.name.Contains("-ShadowVolume")) { return(null); } for (int i = 0; i < pb.transform.childCount; i++) { Transform t = pb.transform.GetChild(i); if (t.name.Equals(string.Format("{0}-ShadowVolume", pb.name))) { pb_Object shadow = t.GetComponent <pb_Object>(); if (shadow != null) { pbUndo.RecordObject(shadow, "Update Shadow Object"); pb_Face[] faces = new pb_Face[pb.faces.Length]; for (int nn = 0; nn < pb.faces.Length; nn++) { faces[nn] = new pb_Face(pb.faces[nn]); } shadow.GeometryWithVerticesFaces(pb.vertices, faces); return(shadow); } } } pb_Object new_shadow = pb_Object.InitWithObject(pb); new_shadow.name = string.Format("{0}-ShadowVolume", pb.name); new_shadow.MakeUnique(); new_shadow.transform.SetParent(pb.transform, false); Undo.RegisterCreatedObjectUndo(new_shadow.gameObject, "Create Shadow Object"); return(new_shadow); }
public static pb_Object ProBuilderize(Transform t, bool preserveFaces) { Mesh m = t.GetComponent <MeshFilter>().sharedMesh; Vector3[] m_vertices = m.vertices; Vector2[] m_uvs = m.uv; List <Vector3> verts = preserveFaces ? new List <Vector3>(m.vertices) : new List <Vector3>(); List <Vector2> uvs = preserveFaces ? new List <Vector2>(m.uv) : new List <Vector2>(); List <pb_Face> faces = new List <pb_Face>(); for (int n = 0; n < m.subMeshCount; n++) { int[] tris = m.GetTriangles(n); for (int i = 0; i < tris.Length; i += 3) { int index = -1; if (preserveFaces) { for (int j = 0; j < faces.Count; j++) { if (faces[j].distinctIndices.Contains(tris[i + 0]) || faces[j].distinctIndices.Contains(tris[i + 1]) || faces[j].distinctIndices.Contains(tris[i + 2])) { index = j; break; } } } if (index > -1 && preserveFaces) { int len = faces[index].indices.Length; int[] arr = new int[len + 3]; System.Array.Copy(faces[index].indices, 0, arr, 0, len); arr[len + 0] = tris[i + 0]; arr[len + 1] = tris[i + 1]; arr[len + 2] = tris[i + 2]; faces[index].SetIndices(arr); faces[index].RebuildCaches(); } else { int[] faceTris; if (preserveFaces) { faceTris = new int[3] { tris[i + 0], tris[i + 1], tris[i + 2] }; } else { verts.Add(m_vertices[tris[i + 0]]); verts.Add(m_vertices[tris[i + 1]]); verts.Add(m_vertices[tris[i + 2]]); uvs.Add(m_uvs[tris[i + 0]]); uvs.Add(m_uvs[tris[i + 1]]); uvs.Add(m_uvs[tris[i + 2]]); faceTris = new int[3] { i + 0, i + 1, i + 2 }; } faces.Add( new pb_Face( faceTris, t.GetComponent <MeshRenderer>().sharedMaterials[n], new pb_UV(), 0, // smoothing group -1, // texture group -1, // element group true, // manualUV Color.white )); } } } GameObject go = (GameObject)GameObject.Instantiate(t.gameObject); go.GetComponent <MeshFilter>().sharedMesh = null; pb_Object pb = go.AddComponent <pb_Object>(); pb.GeometryWithVerticesFaces(verts.ToArray(), faces.ToArray()); pb.SetUV(uvs.ToArray()); pb.SetName(t.name); pb_Editor_Utility.SetEntityType(EntityType.Detail, pb.gameObject); go.transform.position = t.position; go.transform.localRotation = t.localRotation; go.transform.localScale = t.localScale; pb.FreezeScaleTransform(); #if UNITY_3_0 || UNITY_3_0_0 || UNITY_3_1 || UNITY_3_2 || UNITY_3_3 || UNITY_3_4 || UNITY_3_5 t.gameObject.active = false; #else t.gameObject.SetActive(false); #endif return(pb); }
/** * "ProBuilder-ize function" */ public static pb_Object CreatePbObjectWithTransform(Transform t, bool preserveFaces) { Mesh m = t.GetComponent <MeshFilter>().sharedMesh; Vector3[] m_vertices = m.vertices; Color[] m_colors = m.colors ?? new Color[m_vertices.Length]; Vector2[] m_uvs = m.uv; List <Vector3> verts = preserveFaces ? new List <Vector3>(m.vertices) : new List <Vector3>(); List <Color> cols = preserveFaces ? new List <Color>(m.colors) : new List <Color>(); List <Vector2> uvs = preserveFaces ? new List <Vector2>(m.uv) : new List <Vector2>(); List <pb_Face> faces = new List <pb_Face>(); for (int n = 0; n < m.subMeshCount; n++) { int[] tris = m.GetTriangles(n); for (int i = 0; i < tris.Length; i += 3) { int index = -1; if (preserveFaces) { for (int j = 0; j < faces.Count; j++) { if (faces[j].distinctIndices.Contains(tris[i + 0]) || faces[j].distinctIndices.Contains(tris[i + 1]) || faces[j].distinctIndices.Contains(tris[i + 2])) { index = j; break; } } } if (index > -1 && preserveFaces) { int len = faces[index].indices.Length; int[] arr = new int[len + 3]; System.Array.Copy(faces[index].indices, 0, arr, 0, len); arr[len + 0] = tris[i + 0]; arr[len + 1] = tris[i + 1]; arr[len + 2] = tris[i + 2]; faces[index].SetIndices(arr); faces[index].RebuildCaches(); } else { int[] faceTris; if (preserveFaces) { faceTris = new int[3] { tris[i + 0], tris[i + 1], tris[i + 2] }; } else { verts.Add(m_vertices[tris[i + 0]]); verts.Add(m_vertices[tris[i + 1]]); verts.Add(m_vertices[tris[i + 2]]); cols.Add(m_colors != null ? m_colors[tris[i + 0]] : Color.white); cols.Add(m_colors != null ? m_colors[tris[i + 1]] : Color.white); cols.Add(m_colors != null ? m_colors[tris[i + 2]] : Color.white); uvs.Add(m_uvs[tris[i + 0]]); uvs.Add(m_uvs[tris[i + 1]]); uvs.Add(m_uvs[tris[i + 2]]); faceTris = new int[3] { i + 0, i + 1, i + 2 }; } faces.Add( new pb_Face( faceTris, t.GetComponent <MeshRenderer>().sharedMaterials[n], new pb_UV(), 0, // smoothing group -1, // texture group -1, // element group true // manualUV )); } } } GameObject go = (GameObject)GameObject.Instantiate(t.gameObject); go.GetComponent <MeshFilter>().sharedMesh = null; pb_Object pb = go.AddComponent <pb_Object>(); pb.GeometryWithVerticesFaces(verts.ToArray(), faces.ToArray()); pb.SetColors(cols.ToArray()); pb.SetUV(uvs.ToArray()); pb.SetName(t.name); go.transform.position = t.position; go.transform.localRotation = t.localRotation; go.transform.localScale = t.localScale; pb.CenterPivot(null); return(pb); }