public static void CreateMaterial(CreationModeFlags flags) { GameObject selection; if (!TryGetActiveGameObject(out selection)) { return; } StartCoroutine(selection, CreateMaterial(selection, flags)); }
public static void CreateVertexTexture(CreationModeFlags flags) { GameObject selection; if (!TryGetActiveGameObject(out selection)) { return; } //AssureEditorApplicationIsPlaying(); StartCoroutine(selection, CreateVertexTexture(selection, flags)); }
public static IEnumerator CreateMaterial(GameObject selection, CreationModeFlags flags) { var sampler = ContainsAllFlags(flags, CreationModeFlags.COMBINED_MESH) ? (IMeshSampler) new CombinedMeshSampler(selection) : (IMeshSampler) new SingleMeshSampler(selection); var vtex = new VertexTex(sampler); var folderPath = AssureExistAndGetRootFolder(); folderPath = CreateTargetFolder(selection, folderPath); yield return(0); Material mat = CreateMaterial(sampler, vtex); SaveAsset(mat, folderPath + "/" + selection.name + ".mat"); }
public static IEnumerator CreateVertexTexture(GameObject selection, CreationModeFlags flags) { var sampler = ContainsAllFlags(flags, CreationModeFlags.COMBINED_MESH) ? (IMeshSampler) new CombinedMeshSampler(selection) : (IMeshSampler) new SingleMeshSampler(selection); var vtex = new VertexTex(sampler); var folderPath = AssureExistAndGetRootFolder(); folderPath = CreateTargetFolder(selection, folderPath); yield return(0); var posPngPath = folderPath + "/" + selection.name + ".png"; var normPngPath = folderPath + "/" + selection.name + "_normal.png"; var posTex = Save(vtex.positionTex, posPngPath); var normTex = Save(vtex.normalTex, normPngPath); var renderer = selection.GetComponentInChildren <Renderer>(); Material mat = CreateMaterial(sampler, vtex, posTex, normTex, renderer); SaveAsset(mat, folderPath + "/" + selection.name + ".mat"); var smr = selection.GetComponentInChildren <SkinnedMeshRenderer>(); var mesh = (smr != null ? smr.sharedMesh : null); if (ContainsAllFlags(flags, CreationModeFlags.NEW_MESH)) { mesh = sampler.Output; mesh.bounds = vtex.Bounds(); SaveAsset(mesh, folderPath + "/" + selection.name + ".asset"); } GameObject go = new GameObject(selection.name); go.AddComponent <MeshRenderer>().sharedMaterial = mat; go.AddComponent <MeshFilter>().sharedMesh = mesh; PrefabUtility.CreatePrefab(folderPath + "/" + selection.name + ".prefab", go); }
static bool ContainsAllFlags(CreationModeFlags flags, CreationModeFlags contains) { return((flags & contains) == contains); }
public static IEnumerator CreateVertexTextures(GameObject selection, CreationModeFlags flags) { var bakeModelMatrix = ContainsAllFlags(flags, CreationModeFlags.BAKE_MATRIX_TEX); if (bakeModelMatrix) { selection.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity); selection.transform.localScale = Vector3.one; } var sampler = new DividedMeshSampler(selection); var vtex = new VertexTexList(sampler, bakeModelMatrix); var folderPath = AssureExistAndGetRootFolder(); folderPath = CreateTargetFolder(selection, folderPath); yield return(0); var renderers = selection.GetComponentsInChildren <SkinnedMeshRenderer>(); GameObject go = new GameObject(selection.name); Texture2D modelMatrixTex; var meshCount = sampler.Outputs.Count; for (int i = 0; i < meshCount; i++) { var posPngPath = folderPath + "/" + sampler.Outputs[i].transform.name + ".png"; var normPngPath = folderPath + "/" + sampler.Outputs[i].transform.name + "_normal.png"; var posTex = Save(vtex.positionTextures[i], posPngPath); var normTex = Save(vtex.normalTextures[i], normPngPath); Material mat; if (bakeModelMatrix) { var modelMatrixPngPath = folderPath + "/" + sampler.Outputs[i].transform.name + "._model.png"; modelMatrixTex = Save(vtex.matrixTextures[i], modelMatrixPngPath, TextureImporterFormat.RGBA32); mat = CreateMaterial(i, sampler, vtex, posTex, normTex, renderers[i], modelMatrixTex); } else { mat = CreateMaterial(i, sampler, vtex, posTex, normTex, renderers[i]); } SaveAsset(mat, folderPath + "/" + sampler.Outputs[i].transform.name + ".mat"); var mesh = renderers[i].sharedMesh; if (ContainsAllFlags(flags, CreationModeFlags.NEW_MESH)) { mesh = sampler.Outputs[i].mesh; mesh.bounds = vtex.Bounds(i); SaveAsset(mesh, folderPath + "/" + sampler.Outputs[i].transform.name + ".asset"); } var child = new GameObject(sampler.Outputs[i].transform.name); child.AddComponent <MeshRenderer>().sharedMaterial = mat; child.AddComponent <MeshFilter>().sharedMesh = mesh; child.transform.parent = go.transform; } PrefabUtility.SaveAsPrefabAsset(go, folderPath + "/" + selection.name + ".prefab"); }