ThrowBall/Assets/Plugins/RayFire/Scripts/Editor/RayfireRigidEditor.cs

1345 lines
64 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEditorInternal;
using RayFire;
namespace RayFireEditor
{
[CanEditMultipleObjects]
[CustomEditor (typeof(RayfireRigid), true)]
public class RayfireRigidEditor : Editor
{
RayfireRigid rigid;
ReorderableList rl_ref_list;
static readonly GUIStyle damageStyle = new GUIStyle();
// Foldout
static bool fld_phy;
static bool fld_act;
static bool fld_lim;
static bool fld_msh;
static bool fld_prp;
static bool fld_cls;
static bool fld_clp;
static bool fld_ref;
static bool fld_mat;
static bool fld_dmg;
static bool fld_fad;
static bool fld_res;
// Physic Minimum & Maximum ranges
const int solver_min = 1;
const int solver_max = 20;
const float sleep_min = 0.001f;
const float sleep_max = 0.1f;
const float dampen_min = 0f;
const float dampen_max = 1f;
// Activation Minimum & Maximum ranges
const float offset_min = 0;
const float offset_max = 10f;
const float velocity_min = 0;
const float velocity_max = 5f;
const float damage_act_min = 0;
const float damage_act_max = 100f;
// Limitation Minimum & Maximum ranges
const float solidity_min = 0;
const float solidity_max = 10f;
const int depth_min = 0;
const int depth_max = 7;
const float time_min = 0.05f;
const float time_max = 10f;
const float size_dml_min = 0.01f;
const float size_dml_max = 50f;
// Mesh Minimum & Maximum ranges
const int amount_frg_min = 2;
const int amount_frg_max = 300;
const int amount_frg_var_min = 0;
const int amount_frg_var_max = 100;
const float depth_fade_min = 0.01f;
const float depth_fade_max = 1f;
const float bias_min = 0f;
const float bias_max = 1f;
const int seed_frg_min = 0;
const int seed_frg_max = 99;
const int cache_frame_min = 2;
const int cache_frame_max = 300;
const int cache_frags_min = 1;
const int cache_frags_max = 20;
const float size_adv_min = 0;
const float size_adv_max = 10f;
// Cluster Minimum & Maximum ranges
const float cls_flt_area_min = 0f;
const float cls_flt_area_max = 1f;
const float cls_flt_size_min = 0;
const float cls_flt_size_max = 10f;
const int cls_flt_perc_min = 0;
const int cls_flt_perc_max = 100;
const int cls_flt_seed_min = 0;
const int cls_flt_seed_max = 100;
const int cls_ratio_min = 1;
const int cls_ratio_max = 100;
const float cls_units_min = 0;
const float cls_units_max = 10f;
const int cls_shard_area_min = 0;
const int cls_shard_area_max = 100;
const int cls_clusters_min = 0;
const int cls_clusters_max = 40;
// Collapse Minimum & Maximum ranges
const int clp_start_min = 0;
const int clp_start_max = 99;
const int clp_end_min = 1;
const int clp_end_max = 100;
const int clp_steps_min = 1;
const int clp_steps_max = 100;
const float clp_duration_min = 0;
const float clp_duration_max = 60f;
const int clp_var_min = 0;
const int clp_var_max = 100;
const int clp_seed_min = 0;
const int clp_seed_max = 99;
// Material Minimum & Maximum ranges
const float mat_scale_min = 0.01f;
const float mat_scale_max = 2f;
// Damage Minimum & Maximum ranges
const float damage_mlt_min = 0.01f;
const float damage_mlt_max = 10f;
// Fade Minimum & Maximum ranges
const float fade_offset_min = 0;
const float fade_offset_max = 20f;
const float fade_time_min = 1f;
const float fade_time_max = 30f;
const float fade_life_min = 0f;
const float fade_life_max = 90f;
const float fade_size_min = 0f;
const float fade_size_max = 20f;
const int fade_shards_min = 0;
const int fade_shards_max = 50;
// Reset Minimum & Maximum ranges
const float reset_del_min = 0;
const float reset_del_max = 60f;
// Main Serialized properties
SerializedProperty sp_mn_ini;
SerializedProperty sp_mn_obj;
SerializedProperty sp_mn_sim;
SerializedProperty sp_mn_dml;
// Physic Serialized properties
SerializedProperty sp_phy_mtp;
SerializedProperty sp_phy_mat;
SerializedProperty sp_phy_mby;
SerializedProperty sp_phy_mss;
SerializedProperty sp_phy_ctp;
SerializedProperty sp_phy_pln;
SerializedProperty sp_phy_ign;
SerializedProperty sp_phy_grv;
SerializedProperty sp_phy_slv;
SerializedProperty sp_phy_slt;
SerializedProperty sp_phy_dmp;
// Activation Serialized properties
SerializedProperty sp_act_off;
SerializedProperty sp_act_loc;
SerializedProperty sp_act_vel;
SerializedProperty sp_act_dmg;
SerializedProperty sp_act_act;
SerializedProperty sp_act_imp;
SerializedProperty sp_act_con;
SerializedProperty sp_act_uny;
SerializedProperty sp_act_atb;
SerializedProperty sp_act_l;
SerializedProperty sp_act_lay;
// limitations Serialized properties
SerializedProperty sp_lim_col;
SerializedProperty sp_lim_sol;
SerializedProperty sp_lim_tag;
SerializedProperty sp_lim_dep;
SerializedProperty sp_lim_tim;
SerializedProperty sp_lim_siz;
SerializedProperty sp_lim_vis;
SerializedProperty sp_lim_bld;
// Mesh Demolition Serialized properties
SerializedProperty sp_msh_am;
SerializedProperty sp_msh_var;
SerializedProperty sp_msh_dpf;
SerializedProperty sp_msh_bias;
SerializedProperty sp_msh_sd;
SerializedProperty sp_msh_use;
SerializedProperty sp_msh_cld;
SerializedProperty sp_msh_sim;
SerializedProperty sp_msh_cnv;
SerializedProperty sp_msh_rnt;
SerializedProperty sp_msh_rnt_fr;
SerializedProperty sp_msh_rnt_fg;
SerializedProperty sp_msh_rnt_sk;
SerializedProperty sp_msh_adv_rem;
SerializedProperty sp_msh_adv_dec;
SerializedProperty sp_msh_adv_cap;
SerializedProperty sp_msh_adv_inp;
SerializedProperty sp_msh_adv_col;
SerializedProperty sp_msh_adv_szf;
SerializedProperty sp_msh_adv_l;
SerializedProperty sp_msh_adv_lay;
SerializedProperty sp_msh_adv_t;
SerializedProperty sp_msh_adv_tag;
// Cluster Demolition Serialized properties
SerializedProperty sp_cls_cn;
SerializedProperty sp_cls_nd;
SerializedProperty sp_cls_cnt;
SerializedProperty sp_cls_sim;
SerializedProperty sp_cls_fl_ar;
SerializedProperty sp_cls_fl_sz;
SerializedProperty sp_cls_fl_pr;
SerializedProperty sp_cls_fl_sd;
SerializedProperty sp_cls_ds_tp;
SerializedProperty sp_cls_ds_rt;
SerializedProperty sp_cls_ds_un;
SerializedProperty sp_cls_sh_ar;
SerializedProperty sp_cls_sh_dm;
SerializedProperty sp_cls_min;
SerializedProperty sp_cls_max;
SerializedProperty sp_cls_dml;
// Collapse Serialized properties
SerializedProperty sp_clp_type;
SerializedProperty sp_clp_start;
SerializedProperty sp_clp_end;
SerializedProperty sp_clp_steps;
SerializedProperty sp_clp_dur;
SerializedProperty sp_clp_var;
SerializedProperty sp_clp_seed;
// Reference Serialized properties
SerializedProperty sp_ref_rfs;
SerializedProperty sp_ref_rnd;
SerializedProperty sp_ref_act;
SerializedProperty sp_ref_add;
SerializedProperty sp_ref_scl;
SerializedProperty sp_ref_mat;
// Material Serialized properties
SerializedProperty sp_mat_scl;
SerializedProperty sp_mat_inn;
SerializedProperty sp_mat_out;
// Damage Serialized properties
SerializedProperty sp_dmg_en;
SerializedProperty sp_dmg_max;
SerializedProperty sp_dmg_cur;
SerializedProperty sp_dmg_col;
SerializedProperty sp_dmg_mlt;
SerializedProperty sp_dmg_shr;
// Fade Serialized properties
SerializedProperty sp_fad_dml;
SerializedProperty sp_fad_act;
SerializedProperty sp_fad_ofs;
SerializedProperty sp_fad_tp;
SerializedProperty sp_fad_tm;
SerializedProperty sp_fad_lf_tp;
SerializedProperty sp_fad_lf_tm;
SerializedProperty sp_fad_lf_vr;
SerializedProperty sp_fad_sz;
SerializedProperty sp_fad_sh;
// Reset Serialized properties
SerializedProperty sp_res_tm;
SerializedProperty sp_res_dm;
SerializedProperty sp_res_cn;
SerializedProperty sp_res_ac;
SerializedProperty sp_res_dl;
SerializedProperty sp_res_ms;
SerializedProperty sp_res_fr;
private void OnEnable()
{
// Get component
rigid = (RayfireRigid)target;
// Set tag list
GUICommon.SetTags();
// Find Main properties
sp_mn_ini = serializedObject.FindProperty(nameof(rigid.initialization));
sp_mn_obj = serializedObject.FindProperty(nameof(rigid.objTp));
sp_mn_sim = serializedObject.FindProperty(nameof(rigid.simTp));
sp_mn_dml = serializedObject.FindProperty(nameof(rigid.dmlTp));
// Find Physic properties
sp_phy_mtp = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.mt));
sp_phy_mat = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.ma));
sp_phy_mby = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.mb));
sp_phy_mss = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.ms));
sp_phy_ctp = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.ct));
sp_phy_pln = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.pc));
sp_phy_ign = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.ine));
sp_phy_grv = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.gr));
sp_phy_slv = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.si));
sp_phy_slt = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.st));
sp_phy_dmp = serializedObject.FindProperty(nameof(rigid.physics) + "." + nameof(rigid.physics.dm));
// Find Activation properties
sp_act_off = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.off));
sp_act_loc = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.loc));
sp_act_vel = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.vel));
sp_act_dmg = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.dmg));
sp_act_act = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.act));
sp_act_imp = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.imp));
sp_act_con = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.con));
sp_act_uny = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.uny));
sp_act_atb = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.atb));
sp_act_l = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.l));
sp_act_lay = serializedObject.FindProperty(nameof(rigid.activation) + "." + nameof(rigid.activation.lay));
// Find limitations properties
sp_lim_col = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.col));
sp_lim_sol = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.sol));
sp_lim_tag = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.tag));
sp_lim_dep = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.depth));
sp_lim_tim = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.time));
sp_lim_siz = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.size));
sp_lim_vis = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.vis));
sp_lim_bld = serializedObject.FindProperty(nameof(rigid.limitations) + "." + nameof(rigid.limitations.bld));
// Find Mesh Demolition properties
sp_msh_am = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.am));
sp_msh_var = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.var));
sp_msh_dpf = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.dpf));
sp_msh_bias = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.bias));
sp_msh_sd = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.sd));
sp_msh_use = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.use));
sp_msh_cld = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.cld));
sp_msh_sim = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.sim));
sp_msh_cnv = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.cnv));
sp_msh_rnt = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.ch) + "." + nameof(rigid.mshDemol.ch.tp));
sp_msh_rnt_fr = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.ch) + "." + nameof(rigid.mshDemol.ch.frm));
sp_msh_rnt_fg = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.ch) + "." + nameof(rigid.mshDemol.ch.frg));
sp_msh_rnt_sk = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.ch) + "." + nameof(rigid.mshDemol.ch.skp));
sp_msh_adv_rem = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.rem));
sp_msh_adv_dec = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.dec));
sp_msh_adv_cap = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.cap));
sp_msh_adv_inp = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.inp));
sp_msh_adv_col = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.col));
sp_msh_adv_szf = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.szF));
sp_msh_adv_l = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.l));
sp_msh_adv_lay = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.lay));
sp_msh_adv_t = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.t));
sp_msh_adv_tag = serializedObject.FindProperty(nameof(rigid.mshDemol) + "." + nameof(rigid.mshDemol.prp) + "." + nameof(rigid.mshDemol.prp.tag));
// Find Cluster Demolition properties
sp_cls_cn = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.cn));
sp_cls_nd = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.nd));
sp_cls_cnt = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.cnt));
sp_cls_sim = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.sim));
sp_cls_fl_ar = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.mAr));
sp_cls_fl_sz = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.mSz));
sp_cls_fl_pr = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.pct));
sp_cls_fl_sd = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.seed));
sp_cls_ds_tp = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.type));
sp_cls_ds_rt = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.ratio));
sp_cls_ds_un = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.units));
sp_cls_sh_ar = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.sAr));
sp_cls_sh_dm = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.sDm));
sp_cls_min = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.mnAm));
sp_cls_max = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.mxAm));
sp_cls_dml = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.cDm));
// Find Collapse properties
sp_clp_type = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.type));
sp_clp_start = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.start));
sp_clp_end = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.end));
sp_clp_steps = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.steps));
sp_clp_dur = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.duration));
sp_clp_var = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.var));
sp_clp_seed = serializedObject.FindProperty(nameof(rigid.clsDemol) + "." + nameof(rigid.clsDemol.collapse) + "." + nameof(rigid.clsDemol.collapse.seed));
// Find Reference properties
sp_ref_rfs = serializedObject.FindProperty(nameof(rigid.refDemol) + "." + nameof(rigid.refDemol.rfs));
sp_ref_rnd = serializedObject.FindProperty(nameof(rigid.refDemol) + "." + nameof(rigid.refDemol.rnd));
sp_ref_act = serializedObject.FindProperty(nameof(rigid.refDemol) + "." + nameof(rigid.refDemol.act));
sp_ref_add = serializedObject.FindProperty(nameof(rigid.refDemol) + "." + nameof(rigid.refDemol.add));
sp_ref_scl = serializedObject.FindProperty(nameof(rigid.refDemol) + "." + nameof(rigid.refDemol.scl));
sp_ref_mat = serializedObject.FindProperty(nameof(rigid.refDemol) + "." + nameof(rigid.refDemol.mat));
// Find Material properties
sp_mat_scl = serializedObject.FindProperty(nameof(rigid.materials) + "." + nameof(rigid.materials.mScl));
sp_mat_inn = serializedObject.FindProperty(nameof(rigid.materials) + "." + nameof(rigid.materials.iMat));
sp_mat_out = serializedObject.FindProperty(nameof(rigid.materials) + "." + nameof(rigid.materials.oMat));
// Find Damage properties
sp_dmg_en = serializedObject.FindProperty(nameof(rigid.damage) + "." + nameof(rigid.damage.en));
sp_dmg_max = serializedObject.FindProperty(nameof(rigid.damage) + "." + nameof(rigid.damage.max));
sp_dmg_cur = serializedObject.FindProperty(nameof(rigid.damage) + "." + nameof(rigid.damage.cur));
sp_dmg_col = serializedObject.FindProperty(nameof(rigid.damage) + "." + nameof(rigid.damage.col));
sp_dmg_mlt = serializedObject.FindProperty(nameof(rigid.damage) + "." + nameof(rigid.damage.mlt));
sp_dmg_shr = serializedObject.FindProperty (nameof(rigid.damage) + "." + nameof(rigid.damage.shr));
// Find Fade properties
sp_fad_dml = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.onDemolition));
sp_fad_act = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.onActivation));
sp_fad_ofs = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.byOffset));
sp_fad_tp = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.fadeType));
sp_fad_tm = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.fadeTime));
sp_fad_lf_tp = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.lifeType));
sp_fad_lf_tm = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.lifeTime));
sp_fad_lf_vr = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.lifeVariation));
sp_fad_sz = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.sizeFilter));
sp_fad_sh = serializedObject.FindProperty(nameof(rigid.fading) + "." + nameof(rigid.fading.shardAmount));
// Reset Serialized properties
sp_res_tm = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.transform));
sp_res_dm = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.damage));
sp_res_cn = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.connectivity));
sp_res_ac = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.action));
sp_res_dl = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.destroyDelay));
sp_res_ms = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.mesh));
sp_res_fr = serializedObject.FindProperty(nameof(rigid.reset) + "." + nameof(rigid.reset.fragments));
// Reorderable list
rl_ref_list = new ReorderableList(serializedObject, sp_ref_rnd, true, true, true, true)
{
drawElementCallback = DrawRefListItems,
drawHeaderCallback = DrawRefHeader,
onAddCallback = AddRed,
onRemoveCallback = RemoveRef
};
// Foldout
if (EditorPrefs.HasKey (TextKeys.rig_fld_phy) == true) fld_phy = EditorPrefs.GetBool (TextKeys.rig_fld_phy);
if (EditorPrefs.HasKey (TextKeys.rig_fld_act) == true) fld_act = EditorPrefs.GetBool (TextKeys.rig_fld_act);
if (EditorPrefs.HasKey (TextKeys.rig_fld_lim) == true) fld_lim = EditorPrefs.GetBool (TextKeys.rig_fld_lim);
if (EditorPrefs.HasKey (TextKeys.rig_fld_msh) == true) fld_msh = EditorPrefs.GetBool (TextKeys.rig_fld_msh);
if (EditorPrefs.HasKey (TextKeys.rig_fld_cls) == true) fld_cls = EditorPrefs.GetBool (TextKeys.rig_fld_cls);
if (EditorPrefs.HasKey (TextKeys.rig_fld_clp) == true) fld_clp = EditorPrefs.GetBool (TextKeys.rig_fld_clp);
if (EditorPrefs.HasKey (TextKeys.rig_fld_ref) == true) fld_ref = EditorPrefs.GetBool (TextKeys.rig_fld_ref);
if (EditorPrefs.HasKey (TextKeys.rig_fld_mat) == true) fld_mat = EditorPrefs.GetBool (TextKeys.rig_fld_mat);
if (EditorPrefs.HasKey (TextKeys.rig_fld_dmg) == true) fld_dmg = EditorPrefs.GetBool (TextKeys.rig_fld_dmg);
if (EditorPrefs.HasKey (TextKeys.rig_fld_fad) == true) fld_fad = EditorPrefs.GetBool (TextKeys.rig_fld_fad);
if (EditorPrefs.HasKey (TextKeys.rig_fld_res) == true) fld_res = EditorPrefs.GetBool (TextKeys.rig_fld_res);
}
/// /////////////////////////////////////////////////////////
/// Inspector
/// /////////////////////////////////////////////////////////
public override void OnInspectorGUI()
{
// Update changed properties
serializedObject.Update();
GUICommon.Space ();
GUI_Buttons();
GUI_Info();
GUICommon.Space ();
GUI_Main();
GUICommon.Space ();
GUI_Simulation();
GUICommon.Space ();
UI_Demolition();
GUICommon.Space ();
GUICommon.CaptionBox (TextRig.gui_cap_com);
GUI_Fade();
GUI_Reset();
// Apply changes
serializedObject.ApplyModifiedProperties();
}
/// /////////////////////////////////////////////////////////
/// Main
/// /////////////////////////////////////////////////////////
void GUI_Main()
{
GUICommon.CaptionBox (TextRig.gui_cap_mn);
GUICommon.Space ();
GUICommon.PropertyField (sp_mn_ini, TextRig.gui_mn_ini);
GUICommon.PropertyField (sp_mn_obj, TextRig.gui_mn_obj);
GUI_Main_Warning();
}
void GUI_Main_Warning()
{
if (sp_mn_obj.intValue == (int)ObjectType.MeshRoot ||
sp_mn_obj.intValue == (int)ObjectType.ConnectedCluster ||
sp_mn_obj.intValue == (int)ObjectType.NestedCluster)
if (rigid.transform.childCount < 2)
GUICommon.HelpBox (TextRig.hlp_obj, MessageType.Warning, true);
}
/// /////////////////////////////////////////////////////////
/// Simulation
/// /////////////////////////////////////////////////////////
void GUI_Simulation()
{
GUICommon.CaptionBox (TextRig.gui_cap_sim);
GUICommon.Space ();
GUICommon.PropertyField (sp_mn_sim, TextRig.gui_mn_sim);
GUI_Physic();
GUICommon.Space ();
GUI_Activation();
}
void GUI_Physic()
{
GUICommon.Foldout (ref fld_phy, TextKeys.rig_fld_phy, TextPhy.gui_phy.text);
if (fld_phy == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextPhy.gui_cap_mat);
GUICommon.PropertyField (sp_phy_mtp, TextPhy.gui_phy_mtp);
GUICommon.PropertyField (sp_phy_mat, TextPhy.gui_phy_mat);
GUICommon.Caption (TextPhy.gui_cap_mas);
GUICommon.PropertyField (sp_phy_mby, TextPhy.gui_phy_mby);
if (rigid.physics.mb == MassType.MassProperty)
GUICommon.PropertyField (sp_phy_mss, TextPhy.gui_phy_mss);
GUICommon.Caption (TextPhy.gui_cap_col);
GUICommon.PropertyField (sp_phy_ctp, TextPhy.gui_phy_ctp);
GUICommon.PropertyField (sp_phy_pln, TextPhy.gui_phy_pln);
GUICommon.PropertyField (sp_phy_ign, TextPhy.gui_phy_ign);
GUICommon.Caption (TextPhy.gui_cap_oth);
GUICommon.PropertyField (sp_phy_grv, TextPhy.gui_phy_grv);
GUICommon.IntSlider (sp_phy_slv, solver_min, solver_max, TextPhy.gui_phy_slv);
GUICommon.Slider (sp_phy_slt, sleep_min, sleep_max, TextPhy.gui_phy_slt);
GUICommon.Caption (TextPhy.gui_cap_frg);
GUICommon.Slider (sp_phy_dmp, dampen_min, dampen_max, TextPhy.gui_phy_dmp);
EditorGUI.indentLevel--;
}
}
void GUI_Activation()
{
if (ActivatableState() == false)
return;
GUICommon.Foldout (ref fld_act, TextKeys.rig_fld_act, TextAcv.gui_act.text);
if (fld_act == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextAcv.gui_cap_act);
GUICommon.Slider (sp_act_off, offset_min, offset_max, TextAcv.gui_act_off);
if (rigid.activation.off > 0)
GUICommon.PropertyField (sp_act_loc, TextAcv.gui_act_loc);
GUICommon.Slider (sp_act_vel, velocity_min, velocity_max, TextAcv.gui_act_vel);
GUICommon.Slider (sp_act_dmg, damage_act_min, damage_act_max, TextAcv.gui_act_dmg);
GUICommon.PropertyField (sp_act_act, TextAcv.gui_act_act);
GUICommon.PropertyField (sp_act_imp, TextAcv.gui_act_imp);
GUICommon.PropertyField (sp_act_con, TextAcv.gui_act_con);
if (rigid.activation.con == true)
{
GUICommon.PropertyField (sp_act_uny, TextAcv.gui_act_uny);
GUICommon.PropertyField (sp_act_atb, TextAcv.gui_act_atb);
}
GUICommon.Caption (TextAcv.gui_cap_pst);
GUICommon.PropertyField (sp_act_l, TextAcv.gui_act_l);
if (rigid.activation.l == true)
GUICommon.LayerField (sp_act_lay, TextAcv.gui_act_lay);
EditorGUI.indentLevel--;
}
}
bool ActivatableState()
{
foreach (RayfireRigid scr in targets)
if (ActivatableState(scr) == true)
return true;
return false;
}
static bool ActivatableState(RayfireRigid scr)
{
if (scr.simTp == SimType.Inactive || scr.simTp == SimType.Kinematic)
return true;
if (scr.mshDemol.sim == FragSimType.Inactive || scr.mshDemol.sim == FragSimType.Kinematic)
return true;
return false;
}
/// /////////////////////////////////////////////////////////
/// Demolition
/// /////////////////////////////////////////////////////////
void UI_Demolition()
{
GUICommon.CaptionBox (TextRig.gui_cap_dml);
GUICommon.Space ();
GUICommon.PropertyField (sp_mn_dml, TextRig.gui_mn_dml);
GUI_Limitations();
GUI_Mesh();
GUI_Cluster();
GUI_Reference();
GUI_Materials();
GUI_Damage();
}
bool MeshState()
{
foreach (RayfireRigid scr in targets)
if (MeshState(scr) == true)
return true;
return false;
}
static bool MeshState(RayfireRigid scr)
{
if (scr.objTp == ObjectType.Mesh ||
scr.objTp == ObjectType.MeshRoot ||
scr.objTp == ObjectType.SkinnedMesh)
return true;
if (scr.clsDemol.sDm == true)
return true;
return false;
}
/// /////////////////////////////////////////////////////////
/// Limitations
/// /////////////////////////////////////////////////////////
void GUI_Limitations()
{
if (rigid.objTp == ObjectType.MeshRoot || rigid.dmlTp != DemolitionType.None)
{
GUICommon.Foldout (ref fld_lim, TextKeys.rig_fld_lim, TextLim.gui_lim.text);
if (fld_lim == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextLim.gui_cap_col);
GUICommon.PropertyField (sp_lim_col, TextLim.gui_lim_col);
if (rigid.limitations.col == true)
GUICommon.Slider (sp_lim_sol, solidity_min, solidity_max, TextLim.gui_lim_sol);
if (sp_lim_sol.floatValue == 0)
GUICommon.HelpBox (TextRig.hlp_sol, MessageType.Info, true);
GUICommon.TagField (sp_lim_tag, TextLim.gui_lim_tag);
GUICommon.Caption (TextLim.gui_cap_oth);
GUICommon.IntSlider (sp_lim_dep, depth_min, depth_max, TextLim.gui_lim_dep);
if (sp_lim_dep.intValue == 0)
GUICommon.HelpBox (TextRig.hlp_limit, MessageType.Info, true);
if (sp_lim_dep.intValue >= 3)
GUICommon.HelpBox (TextRig.hlp_depth, MessageType.Info, true);
GUICommon.Slider (sp_lim_tim, time_min, time_max, TextLim.gui_lim_tim);
GUICommon.Slider (sp_lim_siz, size_dml_min, size_dml_max, TextLim.gui_lim_siz);
GUICommon.PropertyField (sp_lim_vis, TextLim.gui_lim_vis);
GUICommon.PropertyField (sp_lim_bld, TextLim.gui_lim_bld);
EditorGUI.indentLevel--;
}
GUICommon.Space ();
}
}
/// /////////////////////////////////////////////////////////
/// Mesh
/// /////////////////////////////////////////////////////////
void GUI_Mesh()
{
if (MeshState() == true && rigid.dmlTp != DemolitionType.None)
{
GUICommon.Foldout (ref fld_msh, TextKeys.rig_fld_msh, TextMsh.gui_msh.text);
if (fld_msh == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextMsh.gui_cap_frg);
GUICommon.IntSlider (sp_msh_am, amount_frg_min, amount_frg_max, TextMsh.gui_msh_am);
GUICommon.IntSlider (sp_msh_var, amount_frg_var_min, amount_frg_var_max, TextMsh.gui_msh_var);
GUICommon.Slider (sp_msh_dpf, depth_fade_min, depth_fade_max, TextMsh.gui_msh_dpf);
GUICommon.Slider (sp_msh_bias, bias_min, bias_max, TextMsh.gui_msh_bias);
GUICommon.IntSlider (sp_msh_sd, seed_frg_min, seed_frg_max, TextMsh.gui_msh_sd);
GUICommon.PropertyField (sp_msh_use, TextMsh.gui_msh_use);
GUICommon.PropertyField (sp_msh_cld, TextMsh.gui_msh_cld);
GUI_Mesh_Advanced();
EditorGUI.indentLevel--;
}
GUICommon.Space ();
}
}
void GUI_Mesh_Advanced()
{
GUICommon.Caption (TextMsh.gui_cap_adv);
GUICommon.PropertyField (sp_msh_sim, TextMsh.gui_msh_sim);
GUICommon.PropertyField (sp_msh_cnv, TextMsh.gui_msh_cnv);
GUICommon.PropertyField (sp_msh_rnt, TextMsh.gui_msh_rnt);
if (rigid.mshDemol.ch.tp != CachingType.Disabled)
{
EditorGUI.indentLevel++;
if (rigid.mshDemol.ch.tp == CachingType.ByFrames)
GUICommon.IntSlider (sp_msh_rnt_fr, cache_frame_min, cache_frame_max, TextMsh.gui_msh_rnt_fr);
if (rigid.mshDemol.ch.tp == CachingType.ByFragmentsPerFrame)
GUICommon.IntSlider (sp_msh_rnt_fg, cache_frags_min, cache_frags_max, TextMsh.gui_msh_rnt_fg);
GUICommon.PropertyField (sp_msh_rnt_sk, TextMsh.gui_msh_rnt_sk);
EditorGUI.indentLevel--;
}
GUICommon.Foldout (ref fld_prp, TextMsh.gui_msh_adv.text);
if (fld_prp == true)
{
EditorGUI.indentLevel++;
GUICommon.PropertyField (sp_msh_adv_rem, TextMsh.gui_msh_adv_rem);
GUICommon.PropertyField (sp_msh_adv_dec, TextMsh.gui_msh_adv_dec);
GUICommon.PropertyField (sp_msh_adv_cap, TextMsh.gui_msh_adv_cap);
GUICommon.PropertyField (sp_msh_adv_inp, TextMsh.gui_msh_adv_inp);
GUICommon.PropertyField (sp_msh_adv_col, TextMsh.gui_msh_adv_col);
GUICommon.Slider (sp_msh_adv_szf, size_adv_min, size_adv_max, TextMsh.gui_msh_adv_szf);
GUI_Layer_Tag();
EditorGUI.indentLevel--;
}
}
void GUI_Layer_Tag()
{
GUICommon.PropertyField (sp_msh_adv_l, TextMsh.gui_msh_adv_l);
if (sp_msh_adv_l.boolValue == false)
GUICommon.LayerField (sp_msh_adv_lay, TextMsh.gui_msh_adv_lay);
GUICommon.PropertyField (sp_msh_adv_t, TextMsh.gui_msh_adv_t);
if (sp_msh_adv_t.boolValue == false)
GUICommon.TagField (sp_msh_adv_tag, TextMsh.gui_msh_adv_tag);
}
/// /////////////////////////////////////////////////////////
/// Cluster
/// /////////////////////////////////////////////////////////
void GUI_Cluster()
{
if (rigid.IsCluster == true || rigid.mshDemol.cnv == RFDemolitionMesh.ConvertType.ConnectedCluster || rigid.objTp == ObjectType.MeshRoot)
{
GUICommon.Foldout (ref fld_cls, TextKeys.rig_fld_cls, TextCls.gui_cls.text);
if (fld_cls == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextCls.gui_cap_prp);
GUICommon.PropertyField (sp_cls_cnt, TextCls.gui_cls_cnt);
GUICommon.PropertyField (sp_cls_sim, TextCls.gui_cls_sim);
GUICommon.Caption (TextCls.gui_cap_flt);
if (rigid.clsDemol.cnt != ConnectivityType.ByBoundingBox)
GUICommon.Slider (sp_cls_fl_ar, cls_flt_area_min, cls_flt_area_max, TextCls.gui_cls_fl_ar);
GUICommon.Slider (sp_cls_fl_sz, cls_flt_size_min, cls_flt_size_max, TextCls.gui_cls_fl_sz);
GUICommon.IntSlider(sp_cls_fl_pr, cls_flt_perc_min, cls_flt_perc_max, TextCls.gui_cls_fl_pr);
GUICommon.IntSlider (sp_cls_fl_sd, cls_flt_seed_min, cls_flt_seed_max, TextCls.gui_cls_fl_sd);
GUICommon.Caption (TextCls.gui_cap_dml);
GUICommon.PropertyField (sp_cls_ds_tp, TextCls.gui_cls_ds_tp);
if (rigid.clsDemol.type == RFDemolitionCluster.RFDetachType.RatioToSize)
GUICommon.IntSlider (sp_cls_ds_rt, cls_ratio_min, cls_ratio_max, TextCls.gui_cls_ds_rt);
else
GUICommon.Slider (sp_cls_ds_un, cls_units_min, cls_units_max, TextCls.gui_cls_ds_un);
GUICommon.Caption (TextCls.gui_cap_shd);
GUICommon.IntSlider (sp_cls_sh_ar, cls_shard_area_min, cls_shard_area_max, TextCls.gui_cls_sh_ar);
GUICommon.PropertyField (sp_cls_sh_dm, TextCls.gui_cls_sh_dm);
if (sp_cls_sh_dm.boolValue == true)
GUICommon.HelpBox (TextRig.hlp_sh_dml, MessageType.Info, true);
GUICommon.Caption (TextCls.gui_cap_cls);
GUICommon.IntSlider(sp_cls_min, cls_clusters_min, cls_clusters_max, TextCls.gui_cls_min);
GUICommon.IntSlider(sp_cls_max, cls_clusters_min, cls_clusters_max, TextCls.gui_cls_max);
GUICommon.PropertyField (sp_cls_dml, TextCls.gui_cls_dml);
GUI_Collapse();
GUICommon.Caption (TextCls.gui_cap_lt);
GUI_Layer_Tag();
EditorGUI.indentLevel--;
}
GUICommon.Space ();
}
}
void GUI_Collapse()
{
GUICommon.Caption (TextCls.gui_cap_clp);
GUICommon.Foldout (ref fld_clp, TextKeys.rig_fld_clp, TextCls.gui_cls_prp.text);
if (fld_clp == true)
{
EditorGUI.indentLevel++;
GUICommon.PropertyField (sp_clp_type, TextClp.gui_type);
GUICommon.IntSlider (sp_clp_start, clp_start_min, clp_start_max, TextClp.gui_start);
GUICommon.IntSlider (sp_clp_end, clp_end_min, clp_end_max, TextClp.gui_end);
GUICommon.IntSlider (sp_clp_steps, clp_steps_min, clp_steps_max, TextClp.gui_steps);
GUICommon.Slider (sp_clp_dur, clp_duration_min, clp_duration_max, TextClp.gui_duration);
if (rigid.clsDemol.collapse.type != RFCollapse.RFCollapseType.Random)
GUICommon.IntSlider (sp_clp_var, clp_var_min, clp_var_max, TextClp.gui_var);
GUICommon.IntSlider (sp_clp_seed, clp_seed_min, clp_seed_max, TextClp.gui_seed);
EditorGUI.indentLevel--;
}
}
/// /////////////////////////////////////////////////////////
/// Reference
/// /////////////////////////////////////////////////////////
void GUI_Reference()
{
if (rigid.dmlTp == DemolitionType.ReferenceDemolition)
{
GUICommon.Foldout (ref fld_ref, TextKeys.rig_fld_ref, TextRig.gui_ref.text);
if (fld_ref == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextRig.gui_cap_prp);
GUICommon.PropertyField (sp_ref_act, TextRig.gui_ref_act);
GUICommon.PropertyField (sp_ref_add, TextRig.gui_ref_add);
GUICommon.PropertyField (sp_ref_scl, TextRig.gui_ref_scl);
GUICommon.PropertyField (sp_ref_mat, TextRig.gui_ref_mat);
GUICommon.Caption (TextRig.gui_cap_src);
GUICommon.PropertyField (sp_ref_rfs, TextRig.gui_ref_rfs);
rl_ref_list.DoLayoutList();
EditorGUI.indentLevel--;
}
GUICommon.Space ();
}
}
/// /////////////////////////////////////////////////////////
/// Materials
/// /////////////////////////////////////////////////////////
void GUI_Materials()
{
if (MeshState() == false)
return;
GUICommon.Foldout (ref fld_mat, TextKeys.rig_fld_mat, TextRig.gui_mat.text);
if (fld_mat == true)
{
EditorGUI.indentLevel++;
GUICommon.Slider (sp_mat_scl, mat_scale_min, mat_scale_max, TextRig.gui_mat_scl);
GUICommon.PropertyField (sp_mat_inn, TextRig.gui_mat_inn);
GUICommon.PropertyField (sp_mat_out, TextRig.gui_mat_out);
EditorGUI.indentLevel--;
}
GUICommon.Space ();
}
/// /////////////////////////////////////////////////////////
/// Damage
/// /////////////////////////////////////////////////////////
void GUI_Damage()
{
GUICommon.Foldout (ref fld_dmg, TextKeys.rig_fld_dmg, TextRig.gui_dmg.text);
if (fld_dmg == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextCls.gui_cap_prp);
GUICommon.PropertyField (sp_dmg_en, TextRig.gui_dmg_en);
if (rigid.objTp == ObjectType.ConnectedCluster)
GUICommon.PropertyField (sp_dmg_shr, TextRig.gui_dmg_shr);
GUICommon.PropertyField (sp_dmg_max, TextRig.gui_dmg_max);
if (rigid.objTp == ObjectType.ConnectedCluster && rigid.damage.shr == true)
{
// To Damage preview
}
else
GUICommon.PropertyField (sp_dmg_cur, TextRig.gui_dmg_cur);
GUICommon.Caption (TextRig.gui_cap_col);
GUICommon.PropertyField (sp_dmg_col, TextRig.gui_dmg_col);
GUICommon.Slider (sp_dmg_mlt, damage_mlt_min, damage_mlt_max, TextRig.gui_dmg_mlt);
EditorGUI.indentLevel--;
}
}
/// /////////////////////////////////////////////////////////
/// Fade
/// /////////////////////////////////////////////////////////
void GUI_Fade()
{
GUICommon.Foldout (ref fld_fad, TextKeys.rig_fld_fad, TextFad.gui_fad.text);
if (fld_fad == true)
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextFad.gui_cap_ini);
GUICommon.PropertyField (sp_fad_dml, TextFad.gui_fad_dml);
GUICommon.PropertyField (sp_fad_act, TextFad.gui_fad_act);
GUICommon.Slider (sp_fad_ofs, fade_offset_min, fade_offset_max, TextFad.gui_fad_ofs);
GUICommon.Caption (TextFad.gui_cap_tp);
GUICommon.PropertyField (sp_fad_tp, TextFad.gui_fad_tp);
GUICommon.Slider (sp_fad_tm, fade_time_min, fade_time_max, TextFad.gui_fad_tm);
GUICommon.Caption (TextFad.gui_cap_lf);
GUICommon.PropertyField (sp_fad_lf_tp, TextFad.gui_fad_lf_tp);
GUICommon.Slider (sp_fad_lf_tm, fade_life_min, fade_life_max, TextFad.gui_fad_lf_tm);
GUICommon.Slider (sp_fad_lf_vr, fade_life_min, fade_life_max, TextFad.gui_fad_lf_vr);
GUICommon.Caption (TextFad.gui_cap_flt);
GUICommon.Slider (sp_fad_sz, fade_size_min, fade_size_max, TextFad.gui_fad_sz);
GUICommon.IntSlider (sp_fad_sh, fade_shards_min, fade_shards_max, TextFad.gui_fad_sh);
EditorGUI.indentLevel--;
}
GUICommon.Space ();
}
/// /////////////////////////////////////////////////////////
/// Reset
/// /////////////////////////////////////////////////////////
void GUI_Reset()
{
GUICommon.Foldout (ref fld_res, TextKeys.rig_fld_res, TextRes.gui_res.text);
if (fld_res == true )
{
EditorGUI.indentLevel++;
GUICommon.Caption (TextRes.gui_cap_res);
GUICommon.PropertyField (sp_res_tm, TextRes.gui_res_tm);
GUICommon.PropertyField (sp_res_dm, TextRes.gui_res_dm);
GUICommon.PropertyField (sp_res_cn, TextRes.gui_res_cn);
if (rigid.dmlTp != DemolitionType.None)
{
GUICommon.Caption (TextRes.gui_cap_dml);
GUICommon.PropertyField (sp_res_ac, TextRes.gui_res_ac);
if (rigid.reset.action == RFReset.PostDemolitionType.DestroyWithDelay)
GUICommon.Slider (sp_res_dl, reset_del_min, reset_del_max, TextRes.gui_res_dl);
if (ReuseState (rigid) == true && rigid.reset.action == RFReset.PostDemolitionType.DeactivateToReset)
{
GUICommon.Caption (TextRes.gui_cap_reu);
GUICommon.PropertyField (sp_res_ms, TextRes.gui_res_ms);
GUICommon.PropertyField (sp_res_fr, TextRes.gui_res_fr);
}
}
EditorGUI.indentLevel--;
}
}
bool ReuseState(RayfireRigid scr)
{
if (scr.objTp == ObjectType.Mesh || scr.objTp == ObjectType.MeshRoot)
return true;
if (scr.clsDemol.sDm == true)
return true;
return false;
}
/// /////////////////////////////////////////////////////////
/// Reorderable Reference list
/// /////////////////////////////////////////////////////////
void DrawRefListItems(Rect rect, int index, bool isActive, bool isFocused)
{
SerializedProperty element = rl_ref_list.serializedProperty.GetArrayElementAtIndex(index);
EditorGUI.PropertyField(new Rect(rect.x, rect.y+2, EditorGUIUtility.currentViewWidth - 80f, EditorGUIUtility.singleLineHeight), element, GUIContent.none);
}
void DrawRefHeader(Rect rect)
{
rect.x += 10;
EditorGUI.LabelField(rect, TextRig.gui_ref_lst);
}
void AddRed(ReorderableList list)
{
if (rigid.refDemol.rnd == null)
rigid.refDemol.rnd = new List<GameObject>();
rigid.refDemol.rnd.Add (null);
list.index = list.count;
}
void RemoveRef(ReorderableList list)
{
if (rigid.refDemol.rnd != null)
{
rigid.refDemol.rnd.RemoveAt (list.index);
list.index = list.index - 1;
}
}
/// /////////////////////////////////////////////////////////
/// Methods
/// /////////////////////////////////////////////////////////
void GUI_Info()
{
// Cache info
if (rigid.HasMeshes == true)
GUILayout.Label (TextRig.str_precache + rigid.meshes.Length);
if (rigid.HasFragments == true)
GUILayout.Label (TextRig.str_frags + rigid.fragments.Count);
// Demolition info
if (Application.isPlaying == true && rigid.enabled == true && rigid.initialized == true && rigid.objTp != ObjectType.MeshRoot)
{
// Space
GUILayout.Space (3);
// Info
GUILayout.Label (TextRig.str_info, EditorStyles.boldLabel);
// Excluded
if (rigid.physics.exclude == true)
GUILayout.Label (TextRig.str_excluded);
// Size
GUILayout.Label (TextRig.str_size + rigid.limitations.bboxSize);
// Demolition
GUILayout.Label (TextRig.str_depth + rigid.limitations.currentDepth + "/" + rigid.limitations.depth);
// Damage
if (rigid.damage.en == true)
GUILayout.Label (TextRig.str_damage + rigid.damage.cur + "/" + rigid.damage.max);
// Fading
if (rigid.fading.state == 1)
GUILayout.Label (TextRig.str_fade_pre);
// Fading
if (rigid.fading.state == 2)
GUILayout.Label (TextRig.str_fade_prg);
// Bad mesh
if (rigid.mshDemol.badMesh > RayfireMan.inst.advancedDemolitionProperties.badMeshTry)
GUILayout.Label (TextRig.str_bad);
}
// Mesh Root info
if (rigid.objTp == ObjectType.MeshRoot)
{
if (rigid.physics.HasIgnore == true)
GUILayout.Label (TextRig.str_ignore + rigid.physics.ign.Count / 2);
}
// Cluster info
if (rigid.objTp == ObjectType.NestedCluster || rigid.objTp == ObjectType.ConnectedCluster)
{
if (rigid.physics.cc == null)
return;
if (rigid.physics.cc.Count == 0)
return;
if (rigid.clsDemol == null)
return;
if (rigid.clsDemol.cluster == null)
return;
GUILayout.Label (TextRig.str_cls_coll + rigid.physics.cc.Count);
if (rigid.objTp == ObjectType.ConnectedCluster)
{
GUILayout.Label (TextRig.str_cls_shards + rigid.clsDemol.cluster.shards.Count + "/" + rigid.clsDemol.am);
GUILayout.Label (TextRig.str_integrity + rigid.AmountIntegrity + "%");
}
if (rigid.physics.HasIgnore == true)
GUILayout.Label (TextRig.str_ignore + rigid.physics.ign.Count / 2);
}
}
void GUI_Buttons()
{
if (Application.isPlaying == true)
{
if (rigid.initialized == false)
{
if (GUILayout.Button (TextRig.gui_btn_init, GUILayout.Height (25)))
foreach (var targ in targets)
if (targ as RayfireRigid != null && (targ as RayfireRigid).initialized == false)
(targ as RayfireRigid).Initialize();
}
// Reuse
else
{
if (GUILayout.Button (TextRig.gui_btn_reset, GUILayout.Height (25)))
foreach (var targ in targets)
if (targ as RayfireRigid != null && (targ as RayfireRigid).initialized == true)
(targ as RayfireRigid).ResetRigid();
}
GUILayout.BeginHorizontal();
// Demolition
if (rigid.objTp != ObjectType.MeshRoot)
{
if (GUILayout.Button (TextRig.gui_btn_dml, GUILayout.Height (25)))
Demolish();
}
// Activate
if (rigid.simTp == SimType.Inactive || rigid.simTp == SimType.Kinematic)
{
if (GUILayout.Button (TextRig.gui_btn_act, GUILayout.Height (25)))
Activate();
}
// Fade
if (GUILayout.Button (TextRig.gui_btn_fad, GUILayout.Height (25)))
Fade();
EditorGUILayout.EndHorizontal();
}
// Setup
if (Application.isPlaying == false)
{
// Clusters
if (rigid.objTp == ObjectType.MeshRoot)
{
GUILayout.Label (TextRig.str_mesh_root, EditorStyles.boldLabel);
SetupUI();
}
}
// Clusters
if (rigid.IsCluster == true)
{
GUILayout.Label (TextRig.str_cls, EditorStyles.boldLabel);
if (Application.isPlaying == false)
SetupUI();
GUILayout.Space (1);
GUI_Cluster_Preview ();
if (Application.isPlaying == true)
ClusterCollapseUI();
}
}
void Demolish()
{
if (Application.isPlaying == true)
foreach (var targ in targets)
if (targ as RayfireRigid != null)
(targ as RayfireRigid).DemolishForced();
}
void Activate()
{
if (Application.isPlaying == true)
foreach (var targ in targets)
if (targ as RayfireRigid != null)
if ((targ as RayfireRigid).simTp == SimType.Inactive || (targ as RayfireRigid).simTp == SimType.Kinematic)
(targ as RayfireRigid).Activate();
}
void Fade()
{
if (Application.isPlaying == true)
foreach (var targ in targets)
if (targ as RayfireRigid != null)
(targ as RayfireRigid).Fade();
}
void SetupUI()
{
GUILayout.BeginHorizontal();
if (GUILayout.Button (TextRig.gui_btn_edt_setup, GUILayout.Height (25)))
foreach (var targ in targets)
if (targ as RayfireRigid != null)
{
(targ as RayfireRigid).EditorSetup();
SetDirty (targ as RayfireRigid);
}
if (GUILayout.Button (TextRig.gui_btn_edt_reset, GUILayout.Height (25)))
foreach (var targ in targets)
if (targ as RayfireRigid != null)
{
(targ as RayfireRigid).ResetSetup();
SetDirty (targ as RayfireRigid);
}
EditorGUILayout.EndHorizontal();
}
/// /////////////////////////////////////////////////////////
/// Cluster UI
/// /////////////////////////////////////////////////////////
void ClusterCollapseUI()
{
if (rigid.objTp == ObjectType.ConnectedCluster)
{
GUILayout.Label (" Collapse", EditorStyles.boldLabel);
GUILayout.BeginHorizontal();
GUILayout.Label (TextClp.str_area, GUILayout.Width (55));
// Start check for slider change
EditorGUI.BeginChangeCheck();
rigid.clsDemol.cluster.areaCollapse = EditorGUILayout.Slider (rigid.clsDemol.cluster.areaCollapse,
rigid.clsDemol.cluster.minimumArea, rigid.clsDemol.cluster.maximumArea);
if (EditorGUI.EndChangeCheck() == true)
if (Application.isPlaying == true)
RFCollapse.AreaCollapse (rigid, rigid.clsDemol.cluster.areaCollapse);
EditorGUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label (TextClp.str_size, GUILayout.Width (55));
// Start check for slider change
EditorGUI.BeginChangeCheck();
rigid.clsDemol.cluster.sizeCollapse = EditorGUILayout.Slider (rigid.clsDemol.cluster.sizeCollapse,
rigid.clsDemol.cluster.minimumSize, rigid.clsDemol.cluster.maximumSize);
if (EditorGUI.EndChangeCheck() == true)
if (Application.isPlaying == true)
RFCollapse.SizeCollapse (rigid, rigid.clsDemol.cluster.sizeCollapse);
EditorGUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label (TextClp.str_rand, GUILayout.Width (55));
// Start check for slider change
EditorGUI.BeginChangeCheck();
rigid.clsDemol.cluster.randomCollapse = EditorGUILayout.IntSlider (rigid.clsDemol.cluster.randomCollapse, 0, 100);
if (EditorGUI.EndChangeCheck() == true)
RFCollapse.RandomCollapse (rigid, rigid.clsDemol.cluster.randomCollapse);
EditorGUILayout.EndHorizontal();
if (GUILayout.Button (TextRig.gui_btn_clp_start, GUILayout.Height (25)))
if (Application.isPlaying)
foreach (var targ in targets)
if (targ as RayfireRigid != null)
RFCollapse.StartCollapse (targ as RayfireRigid);
}
}
void GUI_Cluster_Preview()
{
if (rigid.objTp == ObjectType.ConnectedCluster)
{
EditorGUI.BeginChangeCheck();
GUILayout.BeginHorizontal();
GUICommon.Toggle (sp_cls_cn, TextRig.gui_btn_conns);
GUICommon.Toggle (sp_cls_nd, TextRig.gui_btn_nodes);
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck())
SceneView.RepaintAll();
}
}
/// /////////////////////////////////////////////////////////
/// Draw
/// /////////////////////////////////////////////////////////
[DrawGizmo (GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)]
static void DrawGizmosSelected (RayfireRigid targ, GizmoType gizmoType)
{
// Missing shards
if (RFCluster.IntegrityCheck (targ.clsDemol.cluster) == false)
Debug.Log (TextRig.rfRig + targ.name + TextRig.str_mis_shards, targ.gameObject);
ClusterDraw (targ);
}
// CLuster connection and nodes viewport preview
static void ClusterDraw(RayfireRigid targ)
{
if (targ.objTp == ObjectType.ConnectedCluster)
{
// Damage style
damageStyle.fontSize = 15;
damageStyle.normal.textColor = Color.red;
if (targ.clsDemol.cluster != null && targ.clsDemol.cluster.shards.Count > 0)
{
// Reinit connections
if (targ.clsDemol.cluster.initialized == false)
RFCluster.InitCluster (targ, targ.clsDemol.cluster);
// Draw
for (int i = 0; i < targ.clsDemol.cluster.shards.Count; i++)
{
if (targ.clsDemol.cluster.shards[i].tm != null)
{
// Damage
if (targ.damage.shr == true)
{
if (targ.clsDemol.cluster.shards[i].dm > 0)
{
Vector3 pos = targ.clsDemol.cluster.shards[i].tm.position;
Handles.Label (pos, targ.clsDemol.cluster.shards[i].dm.ToString ("F1"), damageStyle);
}
}
// Set color
if (targ.clsDemol.cluster.shards[i].uny == false)
{
Gizmos.color = targ.clsDemol.cluster.shards[i].nIds.Count > 0
? Color.blue
: Color.gray;
}
else
Gizmos.color = targ.clsDemol.cluster.shards[i].act == true ? Color.magenta : Color.red;
// Nodes
if (targ.clsDemol.nd == true)
Gizmos.DrawWireSphere (targ.clsDemol.cluster.shards[i].tm.position, targ.clsDemol.cluster.shards[i].sz / 12f);
// Connections
if (targ.clsDemol.cn == true)
if (targ.clsDemol.cluster.shards[i].neibShards != null)
for (int j = 0; j < targ.clsDemol.cluster.shards[i].neibShards.Count; j++)
if (targ.clsDemol.cluster.shards[i].neibShards[j].tm != null)
Gizmos.DrawLine (targ.clsDemol.cluster.shards[i].tm.position, targ.clsDemol.cluster.shards[i].neibShards[j].tm.position);
}
}
}
}
}
/// /////////////////////////////////////////////////////////
/// Common
/// /////////////////////////////////////////////////////////
void SetDirty (RayfireRigid scr)
{
if (Application.isPlaying == false)
{
EditorUtility.SetDirty (scr);
EditorSceneManager.MarkSceneDirty (scr.gameObject.scene);
SceneView.RepaintAll();
}
}
}
}