using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement; using UnityEditorInternal; using RayFire; namespace RayFireEditor { [CanEditMultipleObjects] [CustomEditor (typeof(RayfireShatter))] public class RayfireShatterEditor : Editor { RayfireShatter shat; Transform transForm; Vector3 centerWorldPos; Quaternion centerWorldQuat; ReorderableList rl_tp_cus_tms; ReorderableList rl_tp_cus_list; ReorderableList rl_tp_slc_list; // Foldout static bool exp_deb; static bool exp_lim; static bool exp_fil; // Frag Types Minimum & Maximum ranges const float bias_min = 0; const float bias_max = 1f; const float strength_min = 0; const float strength_max = 1f; const float rad_radius_min = 0.01f; const float rad_radius_max = 30f; const float rad_div_min = 0f; const float rad_div_max = 1f; const int rad_rings_min = 3; const int rad_rings_max = 60; const int rad_rand_min = 0; const int rad_rand_max = 100; const int rad_focus_min = 0; const int rad_focus_max = 100; const int rad_twist_min = -90; const int rad_twist_max = 90; const float hex_size_min = 0.01f; const float hex_size_max = 10f; const int hex_row_min = 3; const int hex_row_max = 200; const int cus_amount_min = 3; const int cus_amount_max = 999; const float cus_radius_min = 0.01f; const float cus_radius_max = 10f; const float cus_size_min = 0.01f; const float cus_size_max = 0.4f; const float brick_mult_min = 0.1f; const float brick_mult_max = 10f; const int brick_amount_min = 0; const int brick_amount_max = 50; const float brick_size_min = 0.01f; const float brick_size_max = 10f; const int brick_var_min = 0; const int brick_var_max = 100; const float brick_offset_min = 0f; const float brick_offset_max = 1f; const int brick_prob_min = 0; const int brick_prob_max = 100; const int brick_rotation_min = 0; const int brick_rotation_max = 90; const float brick_split_offset_min = 0f; const float brick_split_offset_max = 0.95f; const float vox_size_min = 0.05f; const float vox_size_max = 10f; const int tet_dens_min = 1; const int tet_dens_max = 50; const int tet_noise_min = 0; const int tet_noise_max = 100; // Material Minimum & Maximum ranges const float mat_scale_min = 0.01f; const float mat_scale_max = 5f; // Clusters Minimum & Maximum ranges const int cls_count_min = 2; const int cls_count_max = 200; const int cls_seed_min = 0; const int cls_seed_max = 100; const float cls_relax_min = 0; const float cls_relax_max = 1f; const int cls_amount_min = 0; const int cls_amount_max = 100; const int cls_layers_min = 0; const int cls_layers_max = 5; const float cls_scale_min = 0; const float cls_scale_max = 1f; const int cls_frags_min = 0; const int cls_frags_max = 5; // Advanced Minimum & Maximum ranges const float adv_size_min = 0.1f; const float adv_size_max = 100f; const int adv_vert_min = 100; const int adv_vert_max = 1900; const int adv_tris_min = 100; const int adv_tris_max = 1900; const int adv_rel_min = 0; const int adv_rel_max = 10; const float adv_abs_min = 0; const float adv_abs_max = 1f; const int adv_element_min = 1; const int adv_element_max = 100; // Frag Types Serialized properties SerializedProperty sp_engine; SerializedProperty sp_tp; SerializedProperty sp_interactive; SerializedProperty sp_tp_vor_amount; SerializedProperty sp_tp_vor_bias; SerializedProperty sp_tp_spl_axis; SerializedProperty sp_tp_spl_amount; SerializedProperty sp_tp_spl_str; SerializedProperty sp_tp_spl_bias; SerializedProperty sp_tp_slb_axis; SerializedProperty sp_tp_slb_amount; SerializedProperty sp_tp_slb_str; SerializedProperty sp_tp_slb_bias; SerializedProperty sp_tp_rad_axis; SerializedProperty sp_tp_rad_radius; SerializedProperty sp_tp_rad_div; SerializedProperty sp_tp_rad_rest; SerializedProperty sp_tp_rad_rings; SerializedProperty sp_tp_rad_focus; SerializedProperty sp_tp_rad_str; SerializedProperty sp_tp_rad_randRing; SerializedProperty sp_tp_rad_rays; SerializedProperty sp_tp_rad_randRay; SerializedProperty sp_tp_rad_twist; SerializedProperty sp_tp_hex_size; SerializedProperty sp_tp_hex_en; SerializedProperty sp_tp_hex_pl; SerializedProperty sp_tp_hex_row; SerializedProperty sp_tp_hex_col; SerializedProperty sp_tp_hex_div; SerializedProperty sp_tp_hex_rest; SerializedProperty sp_tp_cus_src; SerializedProperty sp_tp_cus_use; SerializedProperty sp_tp_cus_am; SerializedProperty sp_tp_cus_rad; SerializedProperty sp_tp_cus_en; SerializedProperty sp_tp_cus_sz; SerializedProperty sp_tp_cus_list; SerializedProperty sp_tp_cus_tms; SerializedProperty sp_tp_slc_pl; SerializedProperty sp_tp_slc_list; SerializedProperty sp_tp_brk_type; SerializedProperty sp_tp_brk_mult; SerializedProperty sp_tp_brk_am_X; SerializedProperty sp_tp_brk_am_Y; SerializedProperty sp_tp_brk_am_Z; SerializedProperty sp_tp_brk_lock; SerializedProperty sp_tp_brk_sz_X; SerializedProperty sp_tp_brk_sz_Y; SerializedProperty sp_tp_brk_sz_Z; SerializedProperty sp_tp_brk_sz_var_X; SerializedProperty sp_tp_brk_sz_var_Y; SerializedProperty sp_tp_brk_sz_var_Z; SerializedProperty sp_tp_brk_of_X; SerializedProperty sp_tp_brk_of_Y; SerializedProperty sp_tp_brk_of_Z; SerializedProperty sp_tp_brk_sp_X; SerializedProperty sp_tp_brk_sp_Y; SerializedProperty sp_tp_brk_sp_Z; SerializedProperty sp_tp_brk_sp_prob; SerializedProperty sp_tp_brk_sp_offs; SerializedProperty sp_tp_brk_sp_rot; SerializedProperty sp_tp_vxl_sz; SerializedProperty sp_tp_tet_dn; SerializedProperty sp_tp_tet_ns; // Material Serialized properties SerializedProperty sp_mat_scl; SerializedProperty sp_mat_in; SerializedProperty sp_mat_col_en; SerializedProperty sp_mat_uve_en; SerializedProperty sp_mat_col; SerializedProperty sp_mat_uve; // Clusters Serialized properties SerializedProperty sp_cls_en; SerializedProperty sp_cls_cnt; SerializedProperty sp_cls_seed; SerializedProperty sp_cls_rel; SerializedProperty sp_cls_amount; SerializedProperty sp_cls_layers; SerializedProperty sp_cls_scale; SerializedProperty sp_cls_min; SerializedProperty sp_cls_max; // Advanced Serialized properties SerializedProperty sp_mode; SerializedProperty sp_adv_seed; SerializedProperty sp_adv_copy; SerializedProperty sp_adv_smooth; SerializedProperty sp_adv_combine; SerializedProperty sp_adv_col; SerializedProperty sp_adv_dec; SerializedProperty sp_adv_input; SerializedProperty sp_adv_output; SerializedProperty sp_adv_lim; SerializedProperty sp_adv_size_lim; SerializedProperty sp_adv_size_am; SerializedProperty sp_adv_vert_lim; SerializedProperty sp_adv_vert_am; SerializedProperty sp_adv_tri_lim; SerializedProperty sp_adv_tri_am; SerializedProperty sp_adv_inner; SerializedProperty sp_adv_planar; SerializedProperty sp_adv_rel; SerializedProperty sp_adv_abs; SerializedProperty sp_adv_element; SerializedProperty sp_adv_remove; SerializedProperty sp_exp_src; SerializedProperty sp_exp_sfx; SerializedProperty sp_cn_pos; SerializedProperty sp_cn_sh; private void OnEnable() { // Get component shat = (RayfireShatter)target; // Find Frag Types Serialized properties sp_engine = serializedObject.FindProperty(nameof(shat.engine)); sp_tp = serializedObject.FindProperty(nameof(shat.type)); sp_interactive = serializedObject.FindProperty(nameof(shat.interactive)); sp_tp_vor_amount = serializedObject.FindProperty(nameof(shat.voronoi) + "." + nameof(shat.voronoi.amount)); sp_tp_vor_bias = serializedObject.FindProperty(nameof(shat.voronoi) + "." + nameof(shat.voronoi.centerBias)); sp_tp_spl_axis = serializedObject.FindProperty(nameof(shat.splinters) + "." + nameof(shat.splinters.axis)); sp_tp_spl_amount = serializedObject.FindProperty(nameof(shat.splinters) + "." + nameof(shat.splinters.amount)); sp_tp_spl_str = serializedObject.FindProperty(nameof(shat.splinters) + "." + nameof(shat.splinters.strength)); sp_tp_spl_bias = serializedObject.FindProperty(nameof(shat.splinters) + "." + nameof(shat.splinters.centerBias)); sp_tp_slb_axis = serializedObject.FindProperty(nameof(shat.slabs) + "." + nameof(shat.slabs.axis)); sp_tp_slb_amount = serializedObject.FindProperty(nameof(shat.slabs) + "." + nameof(shat.slabs.amount)); sp_tp_slb_str = serializedObject.FindProperty(nameof(shat.slabs) + "." + nameof(shat.slabs.strength)); sp_tp_slb_bias = serializedObject.FindProperty(nameof(shat.slabs) + "." + nameof(shat.slabs.centerBias)); sp_tp_rad_axis = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.centerAxis)); sp_tp_rad_radius = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.radius)); sp_tp_rad_div = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.divergence)); sp_tp_rad_rest = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.restrictToPlane)); sp_tp_rad_rings = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.rings)); sp_tp_rad_focus = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.focus)); sp_tp_rad_str = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.focusStr)); sp_tp_rad_randRing = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.randomRings)); sp_tp_rad_rays = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.rays)); sp_tp_rad_randRay = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.randomRays)); sp_tp_rad_twist = serializedObject.FindProperty(nameof(shat.radial) + "." + nameof(shat.radial.twist)); sp_tp_hex_size = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.size)); sp_tp_hex_en = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.enable)); sp_tp_hex_pl = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.plane)); sp_tp_hex_row = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.row)); sp_tp_hex_col = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.col)); sp_tp_hex_div = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.div)); sp_tp_hex_rest = serializedObject.FindProperty(nameof(shat.hexagon) + "." + nameof(shat.hexagon.rest)); sp_tp_cus_src = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.source)); sp_tp_cus_use = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.useAs)); sp_tp_cus_am = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.amount)); sp_tp_cus_rad = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.radius)); sp_tp_cus_en = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.enable)); sp_tp_cus_sz = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.size)); sp_tp_cus_list = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.vector3)); sp_tp_cus_tms = serializedObject.FindProperty(nameof(shat.custom) + "." + nameof(shat.custom.transforms)); sp_tp_slc_pl = serializedObject.FindProperty(nameof(shat.slice) + "." + nameof(shat.slice.plane)); sp_tp_slc_list = serializedObject.FindProperty(nameof(shat.slice) + "." + nameof(shat.slice.sliceList)); sp_tp_brk_type = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.amountType)); sp_tp_brk_mult = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.mult)); sp_tp_brk_am_X = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.amount_X)); sp_tp_brk_am_Y = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.amount_Y)); sp_tp_brk_am_Z = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.amount_Z)); sp_tp_brk_lock = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.size_Lock)); sp_tp_brk_sz_X = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.size_X)); sp_tp_brk_sz_Y = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.size_Y)); sp_tp_brk_sz_Z = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.size_Z)); sp_tp_brk_sz_var_X = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.sizeVar_X)); sp_tp_brk_sz_var_Y = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.sizeVar_Y)); sp_tp_brk_sz_var_Z = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.sizeVar_Z)); sp_tp_brk_of_X = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.offset_X)); sp_tp_brk_of_Y = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.offset_Y)); sp_tp_brk_of_Z = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.offset_Z)); sp_tp_brk_sp_X = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.split_X)); sp_tp_brk_sp_Y = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.split_Y)); sp_tp_brk_sp_Z = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.split_Z)); sp_tp_brk_sp_prob = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.split_probability)); sp_tp_brk_sp_offs = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.split_offset)); sp_tp_brk_sp_rot = serializedObject.FindProperty(nameof(shat.bricks) + "." + nameof(shat.bricks.split_rotation)); sp_tp_vxl_sz = serializedObject.FindProperty(nameof(shat.voxels) + "." + nameof(shat.voxels.size)); sp_tp_tet_dn = serializedObject.FindProperty(nameof(shat.tets) + "." + nameof(shat.tets.density)); sp_tp_tet_ns = serializedObject.FindProperty(nameof(shat.tets) + "." + nameof(shat.tets.noise)); // Find Material Serialized properties sp_mat_scl = serializedObject.FindProperty(nameof(shat.material) + "." + nameof(shat.material.mScl)); sp_mat_in = serializedObject.FindProperty(nameof(shat.material) + "." + nameof(shat.material.iMat)); sp_mat_col_en = serializedObject.FindProperty(nameof(shat.material) + "." + nameof(shat.material.cE)); sp_mat_uve_en = serializedObject.FindProperty(nameof(shat.material) + "." + nameof(shat.material.uvE)); sp_mat_col = serializedObject.FindProperty(nameof(shat.material) + "." + nameof(shat.material.cC)); sp_mat_uve = serializedObject.FindProperty(nameof(shat.material) + "." + nameof(shat.material.uvC)); // Clusters Serialized properties sp_cls_en = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.enable)); sp_cls_cnt = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.count)); sp_cls_seed = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.seed)); sp_cls_rel = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.relax)); sp_cls_amount = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.amount)); sp_cls_layers = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.layers)); sp_cls_scale = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.scale)); sp_cls_min = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.min)); sp_cls_max = serializedObject.FindProperty(nameof(shat.clusters) + "." + nameof(shat.clusters.max)); // Advanced Serialized properties sp_mode = serializedObject.FindProperty(nameof(shat.mode)); sp_adv_seed = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.seed)); sp_adv_copy = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.copyComponents)); sp_adv_smooth = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.smooth)); sp_adv_combine = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.combineChildren)); sp_adv_col = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.removeCollinear)); sp_adv_dec = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.decompose)); sp_adv_input = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.inputPrecap)); sp_adv_output = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.outputPrecap)); sp_adv_size_lim = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.sizeLimitation)); sp_adv_size_am = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.sizeAmount)); sp_adv_vert_lim = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.vertexLimitation)); sp_adv_vert_am = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.vertexAmount)); sp_adv_tri_lim = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.triangleLimitation)); sp_adv_tri_am = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.triangleAmount)); sp_adv_inner = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.inner)); sp_adv_planar = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.planar)); sp_adv_rel = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.relativeSize)); sp_adv_abs = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.absoluteSize)); sp_adv_element = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.elementSizeThreshold)); sp_adv_remove = serializedObject.FindProperty(nameof(shat.advanced) + "." + nameof(shat.advanced.removeDoubleFaces)); sp_exp_src = serializedObject.FindProperty(nameof(shat.export) + "." + nameof(shat.export.source)); sp_exp_sfx = serializedObject.FindProperty(nameof(shat.export) + "." + nameof(shat.export.suffix)); sp_cn_pos = serializedObject.FindProperty(nameof(shat.centerPosition)); sp_cn_sh = serializedObject.FindProperty(nameof(shat.showCenter)); // Reorderable lists rl_tp_cus_tms = new ReorderableList (serializedObject, sp_tp_cus_tms, true, true, true, true) { drawElementCallback = DrawCustTmListItems, drawHeaderCallback = DrawCustTmHeader, onAddCallback = AddCustTm, onRemoveCallback = RemoveCustTm }; rl_tp_cus_list = new ReorderableList (serializedObject, sp_tp_cus_list, true, true, true, true) { drawElementCallback = DrawCustPointListItems, drawHeaderCallback = DrawCustPointHeader, onAddCallback = AddCustPoint, onRemoveCallback = RemoveCustPoint }; rl_tp_slc_list = new ReorderableList (serializedObject, sp_tp_slc_list, true, true, true, true) { drawElementCallback = DrawSliceTmListItems, drawHeaderCallback = DrawSliceTmHeader, onAddCallback = AddSliceTm, onRemoveCallback = RemoveSliceTm }; } /// ///////////////////////////////////////////////////////// /// Inspector /// ///////////////////////////////////////////////////////// public override void OnInspectorGUI() { if (shat == null) return; // Update changed properties serializedObject.Update(); // Space GUILayout.Space (8); GUI_Fragment(); GUI_Interactive(); GUI_Preview(); // Reset scale if fragments were deleted shat.ResetScale (shat.previewScale); GUICommon.Space (); GUI_Types(); GUICommon.Space (); GUI_Material(); GUICommon.Space (); GUI_Cluster(); GUICommon.Space (); GUI_Advanced(); GUICommon.Space (); GUI_Export(); GUICommon.Space (); GUI_Collider(); GUICommon.Space (); GUI_Center(); GUICommon.Space (); GUI_Info(); // Apply changes serializedObject.ApplyModifiedProperties(); } /// ///////////////////////////////////////////////////////// /// Types /// ///////////////////////////////////////////////////////// void GUI_Types() { EditorGUI.BeginChangeCheck(); GUICommon.CaptionBox (TextSht.gui_cap_frg); GUICommon.PropertyField (sp_tp, TextSht.gui_tp); EditorGUI.indentLevel++; if (shat.type == FragType.Voronoi) GUI_Type_Voronoi(); else if (shat.type == FragType.Splinters) GUI_Type_Splinters(); else if (shat.type == FragType.Slabs) GUI_Type_Slabs(); else if (shat.type == FragType.Radial) GUI_Type_Radial(); else if (shat.type == FragType.Hexagon) GUI_Type_HexGrid(); else if (shat.type == FragType.Custom) GUI_Type_Custom(); else if (shat.type == FragType.Slices) GUI_Type_Slices(); else if (shat.type == FragType.Bricks) GUI_Type_Bricks(); else if (shat.type == FragType.Voxels) GUI_Type_Voxels(); else if (shat.type == FragType.Tets) GUI_Type_Tets(); EditorGUI.indentLevel--; if (EditorGUI.EndChangeCheck() == true) InteractiveChange(); } void GUI_Type_Voronoi() { GUICommon.Caption (TextSht.gui_cap_vor); GUICommon.PropertyField (sp_tp_vor_amount, TextSht.gui_tp_vor_amount); GUICommon.Slider (sp_tp_vor_bias, bias_min, bias_max, TextSht.gui_tp_vor_bias); } void GUI_Type_Splinters() { GUICommon.Caption (TextSht.gui_cap_spl); GUICommon.PropertyField (sp_tp_spl_axis, TextSht.gui_tp_spl_axis); GUICommon.PropertyField (sp_tp_spl_amount, TextSht.gui_tp_vor_amount); GUICommon.Slider (sp_tp_spl_str, strength_min, strength_max, TextSht.gui_tp_spl_str); GUICommon.Slider (sp_tp_spl_bias, bias_min, bias_max, TextSht.gui_tp_vor_bias); } void GUI_Type_Slabs() { GUICommon.Caption (TextSht.gui_cap_slb); GUICommon.PropertyField (sp_tp_slb_axis, TextSht.gui_tp_spl_axis); GUICommon.PropertyField (sp_tp_slb_amount, TextSht.gui_tp_vor_amount); GUICommon.Slider (sp_tp_slb_str, strength_min, strength_max, TextSht.gui_tp_spl_str); GUICommon.Slider (sp_tp_slb_bias, bias_min, bias_max, TextSht.gui_tp_vor_bias); } void GUI_Type_Radial() { GUICommon.Caption (TextSht.gui_cap_rad); GUICommon.PropertyField (sp_tp_rad_axis, TextSht.gui_tp_rad_axis); GUICommon.Slider (sp_tp_rad_radius, rad_radius_min, rad_radius_max, TextSht.gui_tp_rad_radius); GUICommon.Slider (sp_tp_rad_div, rad_div_min, rad_div_max, TextSht.gui_tp_rad_div); if (sp_tp_rad_div.floatValue > 0) GUICommon.PropertyField (sp_tp_rad_rest, TextSht.gui_tp_rad_rest); GUICommon.Caption (TextSht.gui_cap_rings); GUICommon.IntSlider (sp_tp_rad_rings, rad_rings_min, rad_rings_max, TextSht.gui_tp_rad_rings); GUICommon.IntSlider (sp_tp_rad_randRing, rad_rand_min, rad_rand_max, TextSht.gui_tp_rad_randRing); GUICommon.IntSlider (sp_tp_rad_focus, rad_focus_min, rad_focus_max, TextSht.gui_tp_rad_focus); GUICommon.IntSlider (sp_tp_rad_str, rad_focus_min, rad_focus_max, TextSht.gui_tp_rad_str); GUICommon.Caption (TextSht.gui_cap_rays); GUICommon.IntSlider (sp_tp_rad_rays, rad_rings_min, rad_rings_max, TextSht.gui_tp_rad_rays); GUICommon.IntSlider (sp_tp_rad_randRay, rad_rand_min, rad_rand_max, TextSht.gui_tp_rad_randRay); GUICommon.IntSlider (sp_tp_rad_twist, rad_twist_min, rad_twist_max, TextSht.gui_tp_rad_twist); } void GUI_Type_HexGrid() { GUICommon.Caption (TextSht.gui_cap_hex); GUICommon.Slider (sp_tp_hex_size, hex_size_min, hex_size_max, TextSht.gui_tp_hex_size); GUICommon.PropertyField (sp_tp_hex_en, TextSht.gui_tp_cus_en); GUICommon.Caption (TextSht.gui_cap_hex_grd); GUICommon.PropertyField (sp_tp_hex_pl, TextSht.gui_tp_slc_pl); GUICommon.IntSlider (sp_tp_hex_row, hex_row_min, hex_row_max, TextSht.gui_tp_hex_am); GUICommon.IntSlider (sp_tp_hex_col, hex_row_min, hex_row_max, TextSht.gui_tp_hex_emp); GUICommon.Slider (sp_tp_hex_div, 0f, shat.hexagon.size, TextSht.gui_tp_rad_div); if (sp_tp_hex_div.floatValue > 0) GUICommon.PropertyField (sp_tp_hex_rest, TextSht.gui_tp_rad_rest); } void GUI_Type_Custom() { GUICommon.Caption (TextSht.gui_cap_cus); GUICommon.PropertyField (sp_tp_cus_src, TextSht.gui_tp_cus_src); GUICommon.PropertyField (sp_tp_cus_use, TextSht.gui_tp_cus_use); if (sp_tp_cus_src.intValue == (int)RFCustom.RFPointCloudSourceType.TransformList) rl_tp_cus_tms.DoLayoutList(); if (sp_tp_cus_src.intValue == (int)RFCustom.RFPointCloudSourceType.Vector3List) rl_tp_cus_list.DoLayoutList(); if (sp_tp_cus_use.intValue == (int)RFCustom.RFPointCloudUseType.VolumePoints) { GUICommon.Caption (TextSht.gui_cap_vol); GUICommon.IntSlider (sp_tp_cus_am, cus_amount_min, cus_amount_max, TextSht.gui_tp_cus_am); GUICommon.Slider (sp_tp_cus_rad, cus_radius_min, cus_radius_max, TextSht.gui_tp_cus_rad); if (shat.custom.inBoundPoints.Count > 0) { GUICommon.Space (); GUILayout.Label (TextSht.str_points + shat.custom.inBoundPoints.Count + "/" + shat.custom.outBoundPoints.Count); } } GUICommon.Caption (TextSht.gui_cap_prev); GUICommon.PropertyField (sp_tp_cus_en, TextSht.gui_tp_cus_en); if (sp_tp_cus_en.boolValue == true) GUICommon.Slider (sp_tp_cus_sz, cus_size_min, cus_size_max, TextSht.gui_tp_cus_sz); } void GUI_Type_Slices() { GUICommon.Caption (TextSht.gui_cap_slc); GUICommon.PropertyField (sp_tp_slc_pl, TextSht.gui_tp_slc_pl); rl_tp_slc_list.DoLayoutList(); } void GUI_Type_Bricks() { GUICommon.Caption (TextSht.gui_cap_brk); GUICommon.PropertyField (sp_tp_brk_type, TextSht.gui_tp_brk_type); GUICommon.Slider (sp_tp_brk_mult, brick_mult_min, brick_mult_max, TextSht.gui_tp_brk_mult); if (sp_tp_brk_type.intValue == (int)RFBricks.RFBrickType.ByAmount) //if (shat.bricks.amountType == RFBricks.RFBrickType.ByAmount) { GUICommon.Caption (TextSht.gui_cap_am); GUICommon.IntSlider (sp_tp_brk_am_X, brick_amount_min, brick_amount_max, TextSht.gui_tp_brk_am_X); GUICommon.IntSlider (sp_tp_brk_am_Y, brick_amount_min, brick_amount_max, TextSht.gui_tp_brk_am_Y); GUICommon.IntSlider (sp_tp_brk_am_Z, brick_amount_min, brick_amount_max, TextSht.gui_tp_brk_am_Z); } else { GUICommon.Caption (TextSht.gui_cap_size); EditorGUI.BeginChangeCheck(); GUICommon.Slider (sp_tp_brk_sz_X, brick_size_min, brick_size_max, TextSht.gui_tp_brk_am_X); if (EditorGUI.EndChangeCheck() == true && sp_tp_brk_lock.boolValue == true) { sp_tp_brk_sz_Y.floatValue = sp_tp_brk_sz_X.floatValue; sp_tp_brk_sz_Z.floatValue = sp_tp_brk_sz_X.floatValue; } EditorGUI.BeginChangeCheck(); GUICommon.Slider (sp_tp_brk_sz_Y, brick_size_min, brick_size_max, TextSht.gui_tp_brk_am_Y); if (EditorGUI.EndChangeCheck() == true && sp_tp_brk_lock.boolValue == true) { sp_tp_brk_sz_X.floatValue = sp_tp_brk_sz_Y.floatValue; sp_tp_brk_sz_Z.floatValue = sp_tp_brk_sz_Y.floatValue; } EditorGUI.BeginChangeCheck(); GUICommon.Slider (sp_tp_brk_sz_Z, brick_size_min, brick_size_max, TextSht.gui_tp_brk_am_Z); if (EditorGUI.EndChangeCheck() == true && sp_tp_brk_lock.boolValue == true) { sp_tp_brk_sz_X.floatValue = sp_tp_brk_sz_Z.floatValue; sp_tp_brk_sz_Y.floatValue = sp_tp_brk_sz_Z.floatValue; } GUICommon.PropertyField (sp_tp_brk_lock, TextSht.gui_tp_brk_lock); } GUICommon.Caption (TextSht.gui_cap_var); GUICommon.IntSlider (sp_tp_brk_sz_var_X, brick_var_min, brick_var_max, TextSht.gui_tp_brk_am_X); GUICommon.IntSlider (sp_tp_brk_sz_var_Y, brick_var_min, brick_var_max, TextSht.gui_tp_brk_am_Y); GUICommon.IntSlider (sp_tp_brk_sz_var_Z, brick_var_min, brick_var_max, TextSht.gui_tp_brk_am_Z); GUICommon.Caption (TextSht.gui_cap_ofs); GUICommon.Slider (sp_tp_brk_of_X, brick_offset_min, brick_offset_max, TextSht.gui_tp_brk_am_X); GUICommon.Slider (sp_tp_brk_of_Y, brick_offset_min, brick_offset_max, TextSht.gui_tp_brk_am_Y); GUICommon.Slider (sp_tp_brk_of_Z, brick_offset_min, brick_offset_max, TextSht.gui_tp_brk_am_Z); GUICommon.Caption (TextSht.gui_cap_sp); GUICommon.PropertyField (sp_tp_brk_sp_X, TextSht.gui_tp_brk_am_X); GUICommon.PropertyField (sp_tp_brk_sp_Y, TextSht.gui_tp_brk_am_Y); GUICommon.PropertyField (sp_tp_brk_sp_Z, TextSht.gui_tp_brk_am_Z); GUICommon.IntSlider (sp_tp_brk_sp_prob, brick_prob_min, brick_prob_max, TextSht.gui_tp_brk_sp_prob); GUICommon.IntSlider (sp_tp_brk_sp_rot, brick_rotation_min, brick_rotation_max, TextSht.gui_tp_brk_sp_rot); GUICommon.Slider (sp_tp_brk_sp_offs, brick_split_offset_min, brick_split_offset_max, TextSht.gui_tp_brk_sp_offs); } void GUI_Type_Voxels() { GUICommon.Caption (TextSht.gui_cap_vxl); GUICommon.Slider (sp_tp_vxl_sz, vox_size_min, vox_size_max, TextSht.gui_tp_cus_sz); } void GUI_Type_Tets() { GUICommon.Caption (TextSht.gui_cap_tet); GUICommon.IntSlider (sp_tp_tet_dn, tet_dens_min, tet_dens_max, TextSht.gui_tp_tetDn); GUICommon.IntSlider (sp_tp_tet_ns, tet_noise_min, tet_noise_max, TextSht.gui_tp_tetNs); } void GUI_Material() { if (sp_tp.intValue == (int)FragType.Decompose) return; GUICommon.CaptionBox (TextSht.gui_cap_mat); GUICommon.Slider (sp_mat_scl, mat_scale_min, mat_scale_max, TextSht.gui_mat_scl); GUICommon.PropertyField (sp_mat_in, TextSht.gui_mat_in); GUICommon.PropertyField (sp_mat_col_en, TextSht.gui_mat_col); if (sp_mat_col_en.boolValue == true) { EditorGUILayout.PropertyField (sp_mat_col, TextSht.gui_tp_hex_emp); GUICommon.Space (); } GUICommon.PropertyField (sp_mat_uve_en, TextSht.gui_mat_uve); if (sp_mat_uve_en.boolValue == true) { EditorGUILayout.PropertyField (sp_mat_uve, TextSht.gui_tp_hex_emp); GUICommon.Space (); } } void GUI_Cluster() { // NOT SUPPORTED YET if (sp_engine.intValue == 1) return; // Not for bricks, slices and decompose if (shat.type == FragType.Bricks || shat.type == FragType.Decompose || shat.type == FragType.Voxels || shat.type == FragType.Slices) return; GUICommon.CaptionBox (TextSht.gui_cap_cls); GUICommon.PropertyField (sp_cls_en, TextSht.gui_cls_en); if (sp_cls_en.boolValue == true) { GUICommon.IntSlider (sp_cls_cnt, cls_count_min, cls_count_max, TextSht.gui_cls_cnt); GUICommon.IntSlider (sp_cls_seed, cls_seed_min, cls_seed_max, TextSht.gui_cls_seed); GUICommon.Slider (sp_cls_rel, cls_relax_min, cls_relax_max, TextSht.gui_cls_rel); GUICommon.Foldout (ref exp_deb, TextSht.gui_cls_debris.text); if (exp_deb == true) { EditorGUI.indentLevel++; GUICommon.IntSlider (sp_cls_amount, cls_amount_min, cls_amount_max, TextSht.gui_cls_amount); GUICommon.IntSlider (sp_cls_layers, cls_layers_min, cls_layers_max, TextSht.gui_cls_layers); GUICommon.Slider (sp_cls_scale, cls_scale_min, cls_scale_max, TextSht.gui_cls_scale); GUICommon.IntSlider (sp_cls_min, cls_frags_min, cls_frags_max, TextSht.gui_cls_min); GUICommon.IntSlider (sp_cls_max, cls_frags_min, cls_frags_max, TextSht.gui_cls_max); EditorGUI.indentLevel--; } } } /// ///////////////////////////////////////////////////////// /// Properties /// ///////////////////////////////////////////////////////// void GUI_Advanced() { GUICommon.CaptionBox (TextSht.gui_cap_prp); GUICommon.PropertyField (sp_engine, TextSht.gui_engine); if (sp_engine.intValue == 0) GUICommon.PropertyField (sp_mode, TextSht.gui_mode); GUICommon.IntSlider (sp_adv_seed, cls_seed_min, cls_seed_max, TextSht.gui_adv_seed); if (sp_engine.intValue == 0) GUICommon.PropertyField (sp_adv_copy, TextSht.gui_adv_copy); GUICommon.PropertyField (sp_adv_smooth, TextSht.gui_adv_smooth); GUICommon.PropertyField (sp_adv_combine, TextSht.gui_adv_combine); if (sp_engine.intValue == 0) GUICommon.PropertyField (sp_adv_col, TextSht.gui_adv_col); GUICommon.PropertyField (sp_adv_dec, TextSht.gui_adv_dec); GUICommon.PropertyField (sp_adv_input, TextSht.gui_adv_input); if (sp_adv_input.boolValue == true) GUICommon.PropertyField (sp_adv_output, TextSht.gui_adv_output); GUICommon.Foldout (ref exp_lim, TextSht.gui_adv_lim.text); if (exp_lim == true) { EditorGUI.indentLevel++; GUICommon.PropertyField (sp_adv_size_lim, TextSht.gui_adv_size_lim); if (shat.advanced.sizeLimitation == true) GUICommon.Slider (sp_adv_size_am, adv_size_min, adv_size_max, TextSht.gui_adv_size_am); GUICommon.PropertyField (sp_adv_vert_lim, TextSht.gui_adv_vert_lim); if (shat.advanced.vertexLimitation == true) GUICommon.IntSlider (sp_adv_vert_am, adv_vert_min, adv_vert_max, TextSht.gui_adv_vert_am); GUICommon.PropertyField (sp_adv_tri_lim, TextSht.gui_adv_tri_lim); if (shat.advanced.triangleLimitation == true) GUICommon.IntSlider (sp_adv_tri_am, adv_tris_min, adv_tris_max, TextSht.gui_adv_tri_am); EditorGUI.indentLevel--; } GUICommon.Space(); GUICommon.Foldout (ref exp_fil, TextSht.gui_adv_flt.text); if (exp_fil == true) { EditorGUI.indentLevel++; GUICommon.PropertyField (sp_adv_inner, TextSht.gui_adv_inner); GUICommon.PropertyField (sp_adv_planar, TextSht.gui_adv_planar); GUICommon.IntSlider (sp_adv_rel, adv_rel_min, adv_rel_max, TextSht.gui_adv_rel); GUICommon.Slider (sp_adv_abs, adv_abs_min, adv_abs_max, TextSht.gui_adv_abs); EditorGUI.indentLevel--; } if (sp_mode.intValue == (int)FragmentMode.Editor) { GUICommon.CaptionBox (TextSht.gui_cap_edt); GUICommon.IntSlider (sp_adv_element, adv_element_min, adv_element_max, TextSht.gui_adv_element); GUICommon.PropertyField (sp_adv_remove, TextSht.gui_adv_remove); } } /// ///////////////////////////////////////////////////////// /// Buttons /// ///////////////////////////////////////////////////////// void GUI_Fragment() { if (GUILayout.Button (TextSht.gui_btn_frag, GUILayout.Height (25))) { foreach (var targ in targets) { if (targ as RayfireShatter != null) { if ((targ as RayfireShatter).interactive == false) (targ as RayfireShatter).Fragment(); else (targ as RayfireShatter).InteractiveFragment(); // TODO APPLY LOCAL SHATTER PREVIEW PROPS TO ALL SELECTED } } // Scale preview if preview turn on if (shat.previewScale > 0 && shat.scalePreview == true) ScalePreview (shat); } GUILayout.Space (1); GUILayout.BeginHorizontal(); // Delete last if (shat.fragmentsLast.Count > 0) // TODO SUPPORT MASS CHECK { if (GUILayout.Button (TextSht.gui_btn_frag_last, GUILayout.Height (22))) { foreach (var targ in targets) if (targ as RayfireShatter != null) { (targ as RayfireShatter).DeleteFragmentsLast (1); (targ as RayfireShatter).resetState = true; (targ as RayfireShatter).Fragment (RayfireShatter.FragLastMode.ToLast); // Scale preview if preview turn on if ((targ as RayfireShatter).previewScale > 0 && (targ as RayfireShatter).scalePreview == true) ScalePreview (targ as RayfireShatter); } } if (GUILayout.Button (TextSht.gui_btn_frag_last_del, GUILayout.Height (22))) { foreach (var targ in targets) if (targ as RayfireShatter != null) { (targ as RayfireShatter).DeleteFragmentsLast(); (targ as RayfireShatter).resetState = true; (targ as RayfireShatter).ResetScale (0f); } } } // Delete all fragments if (shat.fragmentsAll.Count > 0 && shat.fragmentsAll.Count > shat.fragmentsLast.Count) { if (GUILayout.Button (TextSht.gui_btn_frag_del, GUILayout.Height (22))) { foreach (var targ in targets) if (targ as RayfireShatter != null) { (targ as RayfireShatter).DeleteFragmentsAll(); (targ as RayfireShatter).resetState = true; (targ as RayfireShatter).ResetScale (0f); } } } EditorGUILayout.EndHorizontal(); } void GUI_Interactive() { /* Doesnt work EditorGUI.BeginChangeCheck(); GUICommon.Toggle (sp_interactive, TextSht.gui_btn_inter, 25); if (EditorGUI.EndChangeCheck() == true) { shat.interactive = sp_interactive.boolValue; Debug.Log (shat.interactive); Debug.Log (sp_interactive.boolValue); if (shat.interactive == true) { shat.InteractiveStart(); } else { shat.InteractiveStop(); } Debug.Log (shat.interactive); Debug.Log (sp_interactive.boolValue); } GUICommon.Space (); */ EditorGUI.BeginChangeCheck(); shat.interactive = GUILayout.Toggle (shat.interactive, TextSht.gui_btn_inter, "Button", GUILayout.Height (25)); if (EditorGUI.EndChangeCheck() == true) { if (shat.interactive == true) { shat.InteractiveStart(); } else { shat.InteractiveStop(); } SetDirty (shat); } GUICommon.Space (); } void GUI_Preview() { // Preview if (shat.fragmentsLast.Count == 0 && shat.interactive == false) return; GUICommon.Caption (TextSht.gui_cap_prv); GUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); shat.scalePreview = GUILayout.Toggle (shat.scalePreview, TextSht.gui_btn_scale, "Button"); if (EditorGUI.EndChangeCheck() == true) { if (shat.scalePreview == true) ScalePreview (shat); else { shat.resetState = true; shat.ResetScale (0f); } SetDirty (shat); InteractiveChange(); } // Color preview toggle if (shat.fragmentsLast.Count > 0) shat.colorPreview = GUILayout.Toggle (shat.colorPreview, TextSht.gui_btn_color, "Button"); EditorGUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUICommon.Space (); GUILayout.Label (TextSht.gui_prv_scl, GUILayout.Width (90)); EditorGUI.BeginChangeCheck(); shat.previewScale = GUILayout.HorizontalSlider (shat.previewScale, 0f, 0.99f); if (EditorGUI.EndChangeCheck() == true) { if (shat.scalePreview == true) ScalePreview (shat); SetDirty (shat); InteractiveChange(); // TODO only change scale, do not refrag. LIB update } EditorGUILayout.EndHorizontal(); } /// ///////////////////////////////////////////////////////// /// Export /// ///////////////////////////////////////////////////////// void GUI_Export() { if (CanExport() == true) { GUICommon.Caption (TextSht.gui_cap_exp); GUICommon.PropertyField (sp_exp_src, TextSht.gui_exp_src); if (HasToExport() == true) GUICommon.PropertyField (sp_exp_sfx, TextSht.gui_exp_sfx); // Export Last fragments if (shat.export.source == RFMeshExport.MeshExportType.LastFragments && shat.fragmentsLast.Count > 0) if (GUILayout.Button (TextSht.gui_btn_export_last, GUILayout.Height (25))) RFMeshAsset.SaveFragments (shat, null); // Export children if (shat.export.source == RFMeshExport.MeshExportType.Children && shat.transform.childCount > 0) if (GUILayout.Button (TextSht.gui_btn_export_child, GUILayout.Height (25))) RFMeshAsset.SaveFragments (shat, null); } } bool CanExport() { if (shat.fragmentsLast.Count > 0 || shat.transform.childCount > 0) return true; return false; } bool HasToExport() { if (shat.export.source == RFMeshExport.MeshExportType.LastFragments && shat.fragmentsLast.Count > 0) return true; if (shat.export.source == RFMeshExport.MeshExportType.Children && shat.transform.childCount > 0) return true; return false; } /// ///////////////////////////////////////////////////////// /// Center /// ///////////////////////////////////////////////////////// void GUI_Center() { if ((int)shat.type <= 5) { GUICommon.CaptionBox (TextSht.gui_cap_cent); GUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); GUICommon.Toggle (sp_cn_sh, TextSht.gui_btn_show, 18); if (EditorGUI.EndChangeCheck()) SceneView.RepaintAll(); if (GUILayout.Button (TextSht.gui_cn_res)) { foreach (var targ in targets) { if (targ as RayfireShatter != null) { (targ as RayfireShatter).ResetCenter(); SetDirty (targ as RayfireShatter); } } InteractiveChange(); SceneView.RepaintAll(); } EditorGUILayout.EndHorizontal(); GUICommon.Space (); GUICommon.PropertyField (sp_cn_pos, TextSht.gui_cn_pos); } } /// ///////////////////////////////////////////////////////// /// Info /// ///////////////////////////////////////////////////////// void GUI_Info() { if (shat.fragmentsLast.Count > 0 || shat.fragmentsAll.Count > 0) { GUICommon.Caption (TextSht.gui_cap_info); GUILayout.BeginHorizontal(); GUILayout.Label (TextSht.str_roots + shat.rootChildList.Count); GUILayout.Label (TextSht.str_last + shat.fragmentsLast.Count); GUILayout.Label (TextSht.str_total + shat.fragmentsAll.Count); EditorGUILayout.EndHorizontal(); } } /// ///////////////////////////////////////////////////////// /// Preview /// ///////////////////////////////////////////////////////// static void ColorPreview (RayfireShatter scr) { if (scr.fragmentsLast.Count > 0) { Random.InitState (1); foreach (Transform root in scr.rootChildList) { if (root != null) { MeshFilter[] meshFilters = root.GetComponentsInChildren(); foreach (var mf in meshFilters) { Gizmos.color = new Color (Random.Range (0.2f, 0.8f), Random.Range (0.2f, 0.8f), Random.Range (0.2f, 0.8f)); Gizmos.DrawMesh (mf.sharedMesh, mf.transform.position, mf.transform.rotation, mf.transform.lossyScale * 1.01f); } } } } } static void ScalePreview (RayfireShatter scr) { if (scr.fragmentsLast.Count > 0 && scr.previewScale > 0f) { // Do not scale if (scr.skinnedMeshRend != null) scr.skinnedMeshRend.enabled = false; if (scr.meshRenderer != null) scr.meshRenderer.enabled = false; foreach (GameObject fragment in scr.fragmentsLast) if (fragment != null) fragment.transform.localScale = Vector3.one * scr.PreviewScale(); scr.resetState = true; } if (scr.previewScale == 0f) scr.ResetScale (0f); } /// ///////////////////////////////////////////////////////// /// Colliders /// ///////////////////////////////////////////////////////// void GUI_Collider() { if (shat.fragmentsLast.Count == 0) return; GUICommon.Caption (TextSht.gui_cap_col); GUILayout.BeginHorizontal(); if (GUILayout.Button (TextSht.gui_btn_coll_add)) { foreach (var targ in targets) if (targ as RayfireShatter != null) AddColliders (targ as RayfireShatter); SceneView.RepaintAll(); } if (GUILayout.Button (TextSht.gui_btn_coll_rem)) { foreach (var targ in targets) if (targ as RayfireShatter != null) RemoveColliders (targ as RayfireShatter); SceneView.RepaintAll(); } EditorGUILayout.EndHorizontal(); } static void AddColliders (RayfireShatter scr) { if (scr.fragmentsLast.Count > 0) foreach (var frag in scr.fragmentsLast) { MeshCollider mc = frag.GetComponent(); if (mc == null) mc = frag.AddComponent(); mc.convex = true; } } static void RemoveColliders (RayfireShatter scr) { if (scr.fragmentsLast.Count > 0) foreach (var frag in scr.fragmentsLast) { MeshCollider mc = frag.gameObject.GetComponent(); if (mc != null) DestroyImmediate (mc); } } /// ///////////////////////////////////////////////////////// /// Draw /// ///////////////////////////////////////////////////////// [DrawGizmo (GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] static void DrawGizmosSelected (RayfireShatter shatter, GizmoType gizmoType) { // Color preview if (shatter.colorPreview == true) ColorPreview (shatter); // HexGrid cloud preview if (shatter.type == FragType.Hexagon && shatter.hexagon.enable == true) { // Get bounds for preview Bounds bound = shatter.GetBound(); if (bound.size.magnitude > 0) { // Center position from local to global Vector3 centerPos = shatter.transform.TransformPoint (shatter.centerPosition); // Collect point cloud and draw RFHexagon.GetHexPointCLoud (shatter.hexagon, shatter.transform, centerPos, shatter.centerDirection, shatter.advanced.seed, bound); DrawSpheres (shatter.hexagon.pcBndIn, shatter.hexagon.pcBndOut, shatter.hexagon.size / 4f); } } // Custom point cloud preview if (shatter.type == FragType.Custom && shatter.custom.enable == true) { // Get bounds for preview Bounds bound = shatter.GetBound(); if (bound.size.magnitude > 0) { // Collect point cloud and draw RFCustom.GetCustomPointCLoud (shatter.custom, shatter.transform, shatter.advanced.seed, bound); DrawSpheres (shatter.custom.inBoundPoints, shatter.custom.outBoundPoints, shatter.custom.size); } } } // Draw In/Out points static void DrawSpheres(List inBoundPoints, List outBoundPoints, float size) { if (inBoundPoints != null && inBoundPoints.Count > 0) { Gizmos.color = Color.green; for (int i = 0; i < inBoundPoints.Count; i++) Gizmos.DrawSphere (inBoundPoints[i], size); } if (outBoundPoints != null && outBoundPoints.Count > 0) { Gizmos.color = Color.red; for (int i = 0; i < outBoundPoints.Count; i++) Gizmos.DrawSphere (outBoundPoints[i], size / 2f); } } // Show center move handle private void OnSceneGUI() { // Get shatter shat = (RayfireShatter)target; if (shat == null) return; transForm = shat.transform; centerWorldPos = transForm.TransformPoint (shat.centerPosition); centerWorldQuat = transForm.rotation * shat.centerDirection; // Point3 handle if (shat.showCenter == true) { EditorGUI.BeginChangeCheck(); centerWorldPos = Handles.PositionHandle (centerWorldPos, centerWorldQuat.RFNormalize()); if (EditorGUI.EndChangeCheck() == true) { Undo.RecordObject (shat, TextSht.str_move); InteractiveChange(); SetDirty (shat); } EditorGUI.BeginChangeCheck(); centerWorldQuat = Handles.RotationHandle (centerWorldQuat, centerWorldPos); if (EditorGUI.EndChangeCheck() == true) { Undo.RecordObject (shat, TextSht.str_rotate); InteractiveChange(); SetDirty (shat); } } shat.centerDirection = Quaternion.Inverse (transForm.rotation) * centerWorldQuat; shat.centerPosition = transForm.InverseTransformPoint (centerWorldPos); } /// ///////////////////////////////////////////////////////// /// ReorderableList Custom Transform /// ///////////////////////////////////////////////////////// void DrawCustTmListItems (Rect rect, int index, bool isActive, bool isFocused) { SerializedProperty element = rl_tp_cus_tms.serializedProperty.GetArrayElementAtIndex (index); EditorGUI.PropertyField (new Rect (rect.x, rect.y + 2, EditorGUIUtility.currentViewWidth - 80f, EditorGUIUtility.singleLineHeight), element, GUIContent.none); } void DrawCustTmHeader (Rect rect) { rect.x += 10; EditorGUI.LabelField (rect, TextSht.gui_tp_cus_tms); } void AddCustTm (ReorderableList list) { if (shat.custom.transforms == null) shat.custom.transforms = new List(); shat.custom.transforms.Add (null); list.index = list.count; InteractiveChange(); } void RemoveCustTm (ReorderableList list) { if (shat.custom.transforms != null) { shat.custom.transforms.RemoveAt (list.index); list.index = list.index - 1; InteractiveChange(); } } /// ///////////////////////////////////////////////////////// /// ReorderableList Custom Point 3 /// ///////////////////////////////////////////////////////// void DrawCustPointListItems (Rect rect, int index, bool isActive, bool isFocused) { SerializedProperty element = rl_tp_cus_list.serializedProperty.GetArrayElementAtIndex (index); EditorGUI.PropertyField (new Rect (rect.x, rect.y + 2, EditorGUIUtility.currentViewWidth - 80f, EditorGUIUtility.singleLineHeight), element, GUIContent.none); } void DrawCustPointHeader (Rect rect) { rect.x += 10; EditorGUI.LabelField (rect, TextSht.gui_tp_cus_vec); } void AddCustPoint (ReorderableList list) { if (shat.custom.vector3 == null) shat.custom.vector3 = new List(); shat.custom.vector3.Add (Vector3.zero); list.index = list.count; InteractiveChange(); } void RemoveCustPoint (ReorderableList list) { if (shat.custom.vector3 != null) { shat.custom.vector3.RemoveAt (list.index); list.index = list.index - 1; InteractiveChange(); } } /// ///////////////////////////////////////////////////////// /// ReorderableList Slice Transform /// ///////////////////////////////////////////////////////// void DrawSliceTmListItems (Rect rect, int index, bool isActive, bool isFocused) { SerializedProperty element = rl_tp_slc_list.serializedProperty.GetArrayElementAtIndex (index); EditorGUI.PropertyField (new Rect (rect.x, rect.y + 2, EditorGUIUtility.currentViewWidth - 80f, EditorGUIUtility.singleLineHeight), element, GUIContent.none); } void DrawSliceTmHeader (Rect rect) { rect.x += 10; EditorGUI.LabelField (rect, TextSht.gui_tp_cus_tms); } void AddSliceTm (ReorderableList list) { if (shat.slice.sliceList == null) shat.slice.sliceList = new List(); shat.slice.sliceList.Add (null); list.index = list.count; InteractiveChange(); } void RemoveSliceTm (ReorderableList list) { if (shat.slice.sliceList != null) { shat.slice.sliceList.RemoveAt (list.index); list.index = list.index - 1; InteractiveChange(); } } /// ///////////////////////////////////////////////////////// /// Common /// ///////////////////////////////////////////////////////// // Property change void InteractiveChange() { if (shat != null && shat.interactive == true) { // Apply changes serializedObject.ApplyModifiedProperties(); // Refragment shat.InteractiveChange(); } } // Set dirty void SetDirty (RayfireShatter scr) { if (Application.isPlaying == false) { EditorUtility.SetDirty (scr); EditorSceneManager.MarkSceneDirty (scr.gameObject.scene); SceneView.RepaintAll(); } } } // Normalize quat in order to support Unity 2018.1 public static class RFQuaternionExtension { public static Quaternion RFNormalize (this Quaternion q) { float f = 1f / Mathf.Sqrt (q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); return new Quaternion (q.x * f, q.y * f, q.z * f, q.w * f); } } } /* // Get inspector width // float width = EditorGUIUtility.currentViewWidth - 20f; public class ExampleClass: EditorWindow { GameObject gameObject; Editor gameObjectEditor; [MenuItem("Example/GameObject Editor")] static void ShowWindow() { GetWindowWithRect(new Rect(0, 0, 256, 256)); } void OnGUI() { gameObject = (GameObject) EditorGUILayout.ObjectField(gameObject, typeof(GameObject), true); GUIStyle bgColor = new GUIStyle(); bgColor.normal.background = EditorGUIUtility.whiteTexture; if (gameObject != null) { if (gameObjectEditor == null) gameObjectEditor = Editor.CreateEditor(gameObject); gameObjectEditor.OnInteractivePreviewGUI(GUILayoutUtility.GetRect(256, 256), bgColor); } } } [CustomPreview(typeof(GameObject))] public class MyPreview : ObjectPreview { public override bool HasPreviewGUI() { return true; } public override void OnPreviewGUI(Rect r, GUIStyle background) { GUI.Label(r, target.name + " is being previewed"); } } */