/** * \brief Duplicates and mirrors the passed pb_Object. * @param pb The donor pb_Object. * @param axe The axis to mirror the object on. * \returns The newly duplicated pb_Object. * \sa ProBuilder.Axis */ public static pb_Object Mirror(pb_Object pb, Vector3 scale) { pb_Object p = ProBuilder.CreateObjectWithObject(pb); // p.SetName(p.GetName()+"-DUPLICATE-"); p.transform.position = pb.transform.position; p.transform.localRotation = pb.transform.localRotation; Vector3 lScale = p.gameObject.transform.localScale; p.transform.localScale = new Vector3(lScale.x * scale.x, lScale.y * scale.y, lScale.z * scale.z); // if flipping on an odd number of axes, flip winding order if ((scale.x * scale.y * scale.z) < 0) { p.ReverseWindingOrder(); } p.FreezeScaleTransform(); EditorUtility.SetDirty(p); return(p); }
/** * \brief Duplicates and mirrors the passed pb_Object. * @param pb The donor pb_Object. * @param axe The axis to mirror the object on. * \returns The newly duplicated pb_Object. * \sa ProBuilder.Axis */ public static pb_Object Mirror(pb_Object pb, Vector3 scale) { pb_Object p = ProBuilder.CreateObjectWithObject(pb); p.MakeUnique(); p.transform.parent = pb.transform.parent; p.transform.position = pb.transform.position; p.transform.localRotation = pb.transform.localRotation; Vector3 lScale = p.gameObject.transform.localScale; p.transform.localScale = new Vector3(lScale.x * scale.x, lScale.y * scale.y, lScale.z * scale.z); // if flipping on an odd number of axes, flip winding order if ((scale.x * scale.y * scale.z) < 0) { p.ReverseWindingOrder(p.faces); } p.FreezeScaleTransform(); p.Refresh(); p.GenerateUV2(true); pb_Editor_Utility.InitObjectFlags(p, ColliderType.MeshCollider, pb.entity.entityType); return(p); }
/** * \brief Duplicates and mirrors the passed pb_Object. * @param pb The donor pb_Object. * @param axe The axis to mirror the object on. * \returns The newly duplicated pb_Object. * \sa ProBuilder.Axis */ public static pb_Object Mirror(pb_Object pb, Vector3 scale) { pb_Object p = pb_Object.InitWithObject(pb); p.MakeUnique(); p.transform.parent = pb.transform.parent; p.transform.localRotation = pb.transform.localRotation; Vector3 lScale = p.gameObject.transform.localScale; p.transform.localScale = new Vector3(lScale.x * scale.x, lScale.y * scale.y, lScale.z * scale.z); // if flipping on an odd number of axes, flip winding order if ((scale.x * scale.y * scale.z) < 0) { p.ReverseWindingOrder(p.faces); } p.FreezeScaleTransform(); p.transform.localScale = pb.transform.localScale; Collider col = pb.GetComponent <Collider>(); ColliderType colType = ColliderType.None; if (col != null) { if (col is MeshCollider) { colType = ColliderType.MeshCollider; } else { colType = ColliderType.BoxCollider; } } pb_Editor_Utility.InitObjectFlags(p, colType, pb.GetComponent <pb_Entity>().entityType); p.ToMesh(); p.Refresh(); // InitObjectFlags runs ScreenCenter() p.transform.position = pb.transform.position; Undo.RegisterCreatedObjectUndo(p.gameObject, "Mirror Object"); return(p); }
private void AlignWithPreviewObject(GameObject go) { if (go == null || previewObject == null) { return; } go.transform.position = previewObject.transform.position; go.transform.rotation = previewObject.transform.rotation; go.transform.localScale = previewObject.transform.localScale; pb_Object pb = go.GetComponent <pb_Object>(); pb.FreezeScaleTransform(); pb.ToMesh(); pb.Refresh(); }
public static pb_Object ProBuilderize(Transform t) { Mesh m = t.GetComponent <MeshFilter>().sharedMesh; pb_Face[] faces = new pb_Face[m.triangles.Length / 3]; int f = 0; for (int n = 0; n < m.subMeshCount; n++) { for (int i = 0; i < m.triangles.Length; i += 3) { faces[f] = new pb_Face( new int[3] { m.triangles[i + 0], m.triangles[i + 1], m.triangles[i + 2] }, t.GetComponent <MeshRenderer>().sharedMaterials[n], new pb_UV(), 0, Color.white ); f++; } } t.gameObject.SetActive(false); pb_Object pb = ProBuilder.CreateObjectWithVerticesFaces(m.vertices, faces); pb.SetName("FrankenMesh"); pb_Editor_Utility.SetEntityType(ProBuilder.EntityType.Detail, pb.gameObject); GameObject go = pb.gameObject; go.transform.position = t.position; go.transform.localRotation = t.localRotation; go.transform.localScale = t.localScale; pb.FreezeScaleTransform(); return(pb); }
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); }
public static pb_Object ProBuilderize(Transform t) { Mesh m = t.GetComponent <MeshFilter>().sharedMesh; // pb_Face[] faces = new pb_Face[m.triangles.Length/3]; 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; 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) { 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 { faces.Add( new pb_Face( new int[3] { tris[i + 0], tris[i + 1], tris[i + 2] }, t.GetComponent <MeshRenderer>().sharedMaterials[n], new pb_UV(), 0, -1, Color.white )); } } } #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 pb_Object pb = ProBuilder.CreateObjectWithVerticesFaces(m.vertices, faces.ToArray()); pb.SetName("FrankenMesh"); pb.Refresh(); pb_Editor_Utility.SetEntityType(ProBuilder.EntityType.Detail, pb.gameObject); GameObject go = pb.gameObject; go.transform.position = t.position; go.transform.localRotation = t.localRotation; go.transform.localScale = t.localScale; pb.FreezeScaleTransform(); return(pb); }
void OnSceneGUI() { // #if !PROTOTYPE // // Event.current.type == EventType.DragUpdated || // if(Event.current.type == EventType.DragPerform) // { // if( HandleUtility.PickGameObject(Event.current.mousePosition, false) == pb.gameObject ) // { // Material mat = null; // foreach(Object t in DragAndDrop.objectReferences) // { // if(t is Material) // { // mat = (Material)t; // break; // } // /* This works, but throws some bullshit errors. Not creating a material leaks, so disable this functionality. */ // // else // // if(t is Texture2D) // // { // // mat = new Material(Shader.Find("Diffuse")); // // mat.mainTexture = (Texture2D)t; // // // string texPath = AssetDatabase.GetAssetPath(mat.mainTexture); // // // int lastDot = texPath.LastIndexOf("."); // // // texPath = texPath.Substring(0, texPath.Length - (texPath.Length-lastDot)); // // // texPath = AssetDatabase.GenerateUniqueAssetPath(texPath + ".mat"); // // AssetDatabase.CreateAsset(mat, texPath); // // AssetDatabase.Refresh(); // // break; // // } // } // if(mat != null) // { // if( pb_Editor.instanceIfExists != null && // pb_Editor.instanceIfExists.editLevel == EditLevel.Geometry) // { // // Bugger.Log("Setting SELECT face material - DragAndDrop"); // pbUndo.RecordObjects(pb_Editor.instanceIfExists.selection, "Set Face Materials"); // foreach(pb_Object pbs in pb_Editor.instanceIfExists.selection) // { // pbs.SetFaceMaterial(pbs.SelectedFaces.Length < 1 ? pbs.faces : pbs.SelectedFaces, mat); // } // } // else // { // // Bugger.Log("Setting ALL face material - DragAndDrop"); // pbUndo.RecordObjects(pbUtil.GetComponents<pb_Object>(Selection.transforms), "Set Face Materials"); // foreach(pb_Object pbs in pbUtil.GetComponents<pb_Object>(Selection.transforms)) // { // pbs.SetFaceMaterial(pbs.faces, mat); // } // } // pb.GenerateUV2(true); // Event.current.Use(); // } // } // } // #endif if (EditorApplication.isPlayingOrWillChangePlaymode || pb == null) { return; } if (GUIUtility.hotControl < 1 && pb.transform.localScale != Vector3.one) { pb.FreezeScaleTransform(); } }