public GenerationLayerJob(GenerationLayer layer, int resolution, bool is_3d, int x_tile, Vector3 tiling) { this.layer = layer; this.resolution = resolution; this.is_3d = is_3d; this.x_tile = x_tile; this.tiling = tiling; ValueBuffer = new NativeArray <float>(resolution * resolution * ((is_3d) ? resolution : 1), Allocator.Persistent); }
public GenerationLayer Copy() { GenerationLayer copy = new GenerationLayer(); copy.Channels = Channels; copy.Mode = Mode; copy.Generator = Generator.Copy(); copy.Visible = Visible; return(copy); }
private void GenerateTexture() { can_generate = false; can_write = false; texture = new Texture2D(resolution * x_tile, resolution * y_tile, TextureFormat.RGBAFloat, false); int vis_count = 0; for (int i = 0; i < layers.Length; i++) { if (layers[i].Visible) { vis_count++; } } GenerationLayer[] visible_layers = new GenerationLayer[vis_count]; int v = 0; for (int i = 0; i < layers.Length; i++) { if (layers[i].Visible) { visible_layers[v++] = layers[i]; } } GenerationLayerJob[] jobs = new GenerationLayerJob[visible_layers.Length]; JobHandle[] handles = new JobHandle[visible_layers.Length]; for (int i = 0; i < visible_layers.Length; i++) { jobs[i] = new GenerationLayerJob(visible_layers[i], resolution, is_3d, x_tile, (is_3d) ? tiling_3 : new Vector3(tiling_2.x, tiling_2.y)); handles[i] = jobs[i].Schedule(resolution * resolution * ((is_3d) ? resolution : 1), 128); } NativeArray <float>[] ValueBuffers = new NativeArray <float> [visible_layers.Length]; for (int i = 0; i < visible_layers.Length; i++) { EditorUtility.DisplayProgressBar("Generating Texture Data", "Updating all texture layers [" + (i + 1) + "/" + visible_layers.Length + "]", i / (float)visible_layers.Length); handles[i].Complete(); ValueBuffers[i] = jobs[i].ValueBuffer; } EditorUtility.DisplayProgressBar("Generating Texture Data", "Writing data to texture.", 0); int pixel_count = resolution * resolution * ((is_3d) ? resolution : 1); WriteTextureJob write_job = new WriteTextureJob(texture.GetRawTextureData <Color>(), visible_layers, is_3d, resolution, x_tile, ValueBuffers); JobHandle write_handle = write_job.Schedule(pixel_count, 128); write_handle.Complete(); EditorUtility.DisplayProgressBar("Generating Texture Data", "Writing data to texture.", 1); for (int i = 0; i < visible_layers.Length; i++) { jobs[i].ValueBuffer.Dispose(); } texture.Apply(); EditorUtility.ClearProgressBar(); can_generate = true; can_write = true; }
private void OnGUI() { Window_SO = new SerializedObject(this); GUIStyle boldFoldoutStyle = EditorStyles.foldout; FontStyle previousStyle = boldFoldoutStyle.fontStyle; boldFoldoutStyle.fontStyle = FontStyle.Bold; float smallestSize = (position.width < position.height) ? position.width : position.height; EditorGUILayout.BeginVertical(); scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, false, false); textureSettings = EditorGUILayout.Foldout(textureSettings, "Texture Settings", boldFoldoutStyle); if (textureSettings) { //resolution = EditorGUILayout.IntField("Resolution", resolution); if (is_3d) { if (resolution > 256) { resolution = 256; } resolution = EditorGUILayout.IntPopup("Resolution", resolution, resolutions_3s, resolutions_3); } else { resolution = EditorGUILayout.IntPopup("Resolution", resolution, resolutions_2s, resolutions_2); } file_name = EditorGUILayout.TextField("File Name", file_name); is_3d = EditorGUILayout.Toggle("Is 3D", is_3d); if (is_3d) { x_tile = GetClosestToSquareFactor(resolution); y_tile = resolution / x_tile; tiling_2 = new Vector2(1, 1); tiling_3 = EditorGUILayout.Vector3Field("Pattern Tiling", tiling_3); EditorGUILayout.LabelField("Volume Texture X Tiles: " + x_tile); EditorGUILayout.LabelField("Volume Texture Y Tiles: " + y_tile); } else { if (x_tile != 1 || y_tile != 1) { x_tile = 1; y_tile = 1; } tiling_2 = EditorGUILayout.Vector2Field("Pattern Tiling", tiling_2); tiling_3 = new Vector3(1, 1, 1); } } EditorGUILayout.Space(); int layers_count = layers.Length; int insert_at = -1; bool duplicate_flag = false; int removed = 0; int delete_at = -1; if (layers.Length == 0) { if (GUILayout.Button("Insert")) { insert_at = 0; } } for (int i = 0; i < layers.Length; i++) { EditorGUILayout.PropertyField(Window_SO.FindProperty("layers").GetArrayElementAtIndex(i), new GUIContent("Layer " + i.ToString() + ":"), true); EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); EditorGUI.BeginDisabledGroup(i == 0); if (GUILayout.Button("Move Up", EditorStyles.miniButtonLeft)) { GenerationLayer temp = layers[i]; layers[i] = layers[i - 1]; layers[i - 1] = temp; } EditorGUI.EndDisabledGroup(); EditorGUI.BeginDisabledGroup(i == layers.Length - 1); if (GUILayout.Button("Move Down", EditorStyles.miniButtonMid)) { GenerationLayer temp = layers[i]; layers[i] = layers[i + 1]; layers[i + 1] = temp; } EditorGUI.EndDisabledGroup(); if (GUILayout.Button("Duplicate", EditorStyles.miniButtonMid)) { insert_at = i + 1; duplicate_flag = true; } if (GUILayout.Button("Copy", EditorStyles.miniButtonMid)) { copy_buffer = layers[i].Copy(); } EditorGUI.BeginDisabledGroup(copy_buffer == null); if (GUILayout.Button("Paste", EditorStyles.miniButtonMid)) { layers[i] = copy_buffer ?? new GenerationLayer(LayerMode.Multiply); } EditorGUI.EndDisabledGroup(); if (GUILayout.Button("Insert", EditorStyles.miniButtonMid)) { insert_at = i + 1; } if (GUILayout.Button("Delete", EditorStyles.miniButtonRight)) { delete_at = i; removed++; } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } if (insert_at != -1) { GenerationLayer[] new_layers = new GenerationLayer[layers_count + 1]; for (int i = 0; i < layers_count + 1; i++) { if (i < insert_at) { new_layers[i] = layers[i]; } else if (i == insert_at && duplicate_flag) { new_layers[i] = layers[i - 1].Copy(); } else if (i == insert_at) { new_layers[i] = new GenerationLayer(0); } else { new_layers[i] = layers[i - 1]; } } layers = new_layers; } layers_count = layers.Length; if (delete_at != -1) { GenerationLayer[] updated_layers = new GenerationLayer[layers_count - removed]; int _removed = 0; for (int i = 0; i < layers_count; i++) { if (i == delete_at) { _removed++; } else { updated_layers[i - _removed] = layers[i]; } } layers = updated_layers; } EditorGUILayout.Space(); EditorGUI.BeginDisabledGroup(!can_generate); bool generate_flag; if (texture == null) { generate_flag = GUILayout.Button("Generate Texture"); } else { generate_flag = GUILayout.Button("Update Texture"); } EditorGUI.EndDisabledGroup(); if (generate_flag) { GenerateTexture(); } EditorGUI.BeginDisabledGroup(texture == null); bool clear_flag; clear_flag = GUILayout.Button("Clear Texture"); EditorGUI.EndDisabledGroup(); if (clear_flag) { texture = null; } EditorGUI.BeginDisabledGroup(!can_write || texture == null); if (GUILayout.Button("Write Texture To File")) { WriteTextureToFile(); } if (GUILayout.Button("Write Texture To Asset")) { Texture2D asset = new Texture2D(texture.width, texture.height, TextureFormat.RGBAFloat, false); Graphics.CopyTexture(texture, asset); AssetDatabase.CreateAsset(asset, "Assets/" + file_name + ".asset"); } EditorGUI.EndDisabledGroup(); if (texture != null) { EditorGUILayout.Space(); GUILayout.Label("Preview: "); EditorGUILayout.Space(); EditorGUI.DrawPreviewTexture(GUILayoutUtility.GetRect(position.width, position.width), texture, null, ScaleMode.ScaleToFit); } Window_SO.ApplyModifiedProperties(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); boldFoldoutStyle.fontStyle = previousStyle; }