public override void SetReferenceObject()
        {
            FindAssist findAssist1 = new FindAssist();

            findAssist1.Initialize(((Component)this).get_transform());
            this.rendHair = ((IEnumerable <Renderer>)((Component)this).GetComponentsInChildren <Renderer>(true)).Where <Renderer>((Func <Renderer, bool>)(x => !((Object)x).get_name().Contains("_acs"))).ToArray <Renderer>();
            DynamicBone[] components = (DynamicBone[])((Component)this).GetComponents <DynamicBone>();
            KeyValuePair <string, GameObject> keyValuePair1 = ((IEnumerable <KeyValuePair <string, GameObject> >)findAssist1.dictObjName).FirstOrDefault <KeyValuePair <string, GameObject> >((Func <KeyValuePair <string, GameObject>, bool>)(x => x.Key.Contains("_top")));

            if (keyValuePair1.Equals((object)new KeyValuePair <string, GameObject>()))
            {
                return;
            }
            this.boneInfo = new CmpHair.BoneInfo[keyValuePair1.Value.get_transform().get_childCount()];
            for (int index = 0; index < this.boneInfo.Length; ++index)
            {
                Transform child = keyValuePair1.Value.get_transform().GetChild(index);
                findAssist1.Initialize(child);
                CmpHair.BoneInfo boneInfo = new CmpHair.BoneInfo();
                KeyValuePair <string, GameObject> keyValuePair2 = ((IEnumerable <KeyValuePair <string, GameObject> >)findAssist1.dictObjName).FirstOrDefault <KeyValuePair <string, GameObject> >((Func <KeyValuePair <string, GameObject>, bool>)(x => x.Key.Contains("_s")));
                if (!keyValuePair2.Equals((object)new KeyValuePair <string, GameObject>()))
                {
                    Transform transform = keyValuePair2.Value.get_transform();
                    boneInfo.trfCorrect = transform;
                    boneInfo.basePos    = ((Component)boneInfo.trfCorrect).get_transform().get_localPosition();
                    boneInfo.posMin.x   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localPosition().x + 0.100000001490116);
                    boneInfo.posMin.y   = ((Component)boneInfo.trfCorrect).get_transform().get_localPosition().y;
                    boneInfo.posMin.z   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localPosition().z + 0.100000001490116);
                    boneInfo.posMax.x   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localPosition().x - 0.100000001490116);
                    boneInfo.posMax.y   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localPosition().y - 0.200000002980232);
                    boneInfo.posMax.z   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localPosition().z - 0.100000001490116);
                    boneInfo.baseRot    = ((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles();
                    boneInfo.rotMin.x   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles().x - 15.0);
                    boneInfo.rotMin.y   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles().y - 15.0);
                    boneInfo.rotMin.z   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles().z - 15.0);
                    boneInfo.rotMax.x   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles().x + 15.0);
                    boneInfo.rotMax.y   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles().y + 15.0);
                    boneInfo.rotMax.z   = (__Null)(((Component)boneInfo.trfCorrect).get_transform().get_localEulerAngles().z + 15.0);
                    boneInfo.moveRate.x = (__Null)(double)Mathf.InverseLerp((float)boneInfo.posMin.x, (float)boneInfo.posMax.x, (float)boneInfo.basePos.x);
                    boneInfo.moveRate.y = (__Null)(double)Mathf.InverseLerp((float)boneInfo.posMin.y, (float)boneInfo.posMax.y, (float)boneInfo.basePos.y);
                    boneInfo.moveRate.z = (__Null)(double)Mathf.InverseLerp((float)boneInfo.posMin.z, (float)boneInfo.posMax.z, (float)boneInfo.basePos.z);
                    boneInfo.rotRate.x  = (__Null)(double)Mathf.InverseLerp((float)boneInfo.rotMin.x, (float)boneInfo.rotMax.x, (float)boneInfo.baseRot.x);
                    boneInfo.rotRate.y  = (__Null)(double)Mathf.InverseLerp((float)boneInfo.rotMin.y, (float)boneInfo.rotMax.y, (float)boneInfo.baseRot.y);
                    boneInfo.rotRate.z  = (__Null)(double)Mathf.InverseLerp((float)boneInfo.rotMin.z, (float)boneInfo.rotMax.z, (float)boneInfo.baseRot.z);
                }
                List <DynamicBone> dynamicBoneList = new List <DynamicBone>();
                foreach (DynamicBone dynamicBone in components)
                {
                    DynamicBone n = dynamicBone;
                    if (!((IEnumerable <KeyValuePair <string, GameObject> >)findAssist1.dictObjName).FirstOrDefault <KeyValuePair <string, GameObject> >((Func <KeyValuePair <string, GameObject>, bool>)(x => x.Key == ((Object)n.m_Root).get_name())).Equals((object)new KeyValuePair <string, GameObject>()))
                    {
                        dynamicBoneList.Add(n);
                    }
                }
                boneInfo.dynamicBone = dynamicBoneList.ToArray();
                this.boneInfo[index] = boneInfo;
            }
            FindAssist findAssist2 = new FindAssist();

            findAssist2.Initialize(((Component)this).get_transform());
            this.rendAccessory = ((IEnumerable <KeyValuePair <string, GameObject> >)findAssist2.dictObjName).Where <KeyValuePair <string, GameObject> >((Func <KeyValuePair <string, GameObject>, bool>)(s => s.Key.Contains("_acs"))).Select <KeyValuePair <string, GameObject>, Renderer>((Func <KeyValuePair <string, GameObject>, Renderer>)(x => (Renderer)x.Value.GetComponent <Renderer>())).Where <Renderer>((Func <Renderer, bool>)(r => Object.op_Inequality((Object)null, (Object)r))).ToArray <Renderer>();
            this.SetColor();
        }
    public static void InitializeHair(GameObject selectedObject)
    {
        GameObject hairObject = selectedObject;

        hairObject.layer = 10;

        if (hairObject != null)
        {
            AIChara.CmpHair hairComponent = hairObject.GetComponent <AIChara.CmpHair>();
            if (hairComponent == null)
            {
                hairComponent = hairObject.AddComponent <AIChara.CmpHair>();
            }

            FindAssist findAssist = new FindAssist();
            findAssist.Initialize(hairComponent.transform);
            hairComponent.rendHair = (from x in hairComponent.GetComponentsInChildren <Renderer>(true) where !x.name.Contains("_acs") select x).ToArray();

            // remove all dynamic bones. smh...
            DynamicBone[] components = hairComponent.GetComponents <DynamicBone>();
            foreach (var comp in components)
            {
                Object.DestroyImmediate(comp);
            }

            DevPreviewHair previewComp = hairObject.GetComponent <DevPreviewHair>();
            if (previewComp == null)
            {
                previewComp = hairObject.AddComponent <DevPreviewHair>();
            }
            previewComp.hairTexturePath = ModPacker.GetProjectPath().Replace("Assets/", "");

            var dynBones = (from x in findAssist.dictObjName where x.Value.transform.name.Contains("_s") select x.Value).ToArray();
            foreach (GameObject bone in dynBones)
            {
                DynamicBone dynBone = hairObject.AddComponent <DynamicBone>();
                dynBone.m_Root              = bone.transform;
                dynBone.m_UpdateRate        = 60;
                dynBone.m_UpdateMode        = DynamicBone.UpdateMode.AnimatePhysics;
                dynBone.m_Damping           = 0.102f;
                dynBone.m_Elasticity        = 0.019f;
                dynBone.m_ElasticityDistrib = new AnimationCurve();
                dynBone.m_ElasticityDistrib.AddKey(0f, 0.969f);
                dynBone.m_ElasticityDistrib.AddKey(1f, 0.603f);
                dynBone.m_Stiffness     = 0.144f;
                dynBone.m_Inert         = 0.072f;
                dynBone.m_Radius        = 0.1f;
                dynBone.m_RadiusDistrib = new AnimationCurve();
                dynBone.m_RadiusDistrib.AddKey(0f, 1f);
                dynBone.m_RadiusDistrib.AddKey(1f, 0.5f);
                dynBone.m_EndLength = 0f;
                dynBone.m_Force     = new Vector3(0, -0.005f, 0);
            }
            components = hairComponent.GetComponents <DynamicBone>();

            KeyValuePair <string, GameObject> keyValuePair = findAssist.dictObjName.FirstOrDefault((KeyValuePair <string, GameObject> x) => x.Key.Contains("_top"));
            if (keyValuePair.Equals(default(KeyValuePair <string, GameObject>)))
            {
                return;
            }
            hairComponent.boneInfo = new AIChara.CmpHair.BoneInfo[keyValuePair.Value.transform.childCount];
            for (int i = 0; i < hairComponent.boneInfo.Length; i++)
            {
                Transform child = keyValuePair.Value.transform.GetChild(i);
                findAssist.Initialize(child);
                AIChara.CmpHair.BoneInfo          boneInfo      = new AIChara.CmpHair.BoneInfo();
                KeyValuePair <string, GameObject> keyValuePair2 = findAssist.dictObjName.FirstOrDefault((KeyValuePair <string, GameObject> x) => x.Key.Contains("_s"));
                if (!keyValuePair2.Equals(default(KeyValuePair <string, GameObject>)))
                {
                    Transform transform = keyValuePair2.Value.transform;
                    boneInfo.trfCorrect = transform;
                    boneInfo.basePos    = boneInfo.trfCorrect.transform.localPosition;
                    boneInfo.posMin.x   = boneInfo.trfCorrect.transform.localPosition.x + 0.5f;
                    boneInfo.posMin.y   = boneInfo.trfCorrect.transform.localPosition.y;
                    boneInfo.posMin.z   = boneInfo.trfCorrect.transform.localPosition.z + 0.5f;
                    boneInfo.posMax.x   = boneInfo.trfCorrect.transform.localPosition.x - 0.5f;
                    boneInfo.posMax.y   = boneInfo.trfCorrect.transform.localPosition.y - 0.5f;
                    boneInfo.posMax.z   = boneInfo.trfCorrect.transform.localPosition.z - 0.5f;
                    boneInfo.baseRot    = boneInfo.trfCorrect.transform.localEulerAngles;
                    boneInfo.rotMin.x   = boneInfo.trfCorrect.transform.localEulerAngles.x - 30f;
                    boneInfo.rotMin.y   = boneInfo.trfCorrect.transform.localEulerAngles.y - 30f;
                    boneInfo.rotMin.z   = boneInfo.trfCorrect.transform.localEulerAngles.z - 30f;
                    boneInfo.rotMax.x   = boneInfo.trfCorrect.transform.localEulerAngles.x + 30f;
                    boneInfo.rotMax.y   = boneInfo.trfCorrect.transform.localEulerAngles.y + 30f;
                    boneInfo.rotMax.z   = boneInfo.trfCorrect.transform.localEulerAngles.z + 30f;
                    boneInfo.moveRate.x = Mathf.InverseLerp(boneInfo.posMin.x, boneInfo.posMax.x, boneInfo.basePos.x);
                    boneInfo.moveRate.y = Mathf.InverseLerp(boneInfo.posMin.y, boneInfo.posMax.y, boneInfo.basePos.y);
                    boneInfo.moveRate.z = Mathf.InverseLerp(boneInfo.posMin.z, boneInfo.posMax.z, boneInfo.basePos.z);
                    boneInfo.rotRate.x  = Mathf.InverseLerp(boneInfo.rotMin.x, boneInfo.rotMax.x, boneInfo.baseRot.x);
                    boneInfo.rotRate.y  = Mathf.InverseLerp(boneInfo.rotMin.y, boneInfo.rotMax.y, boneInfo.baseRot.y);
                    boneInfo.rotRate.z  = Mathf.InverseLerp(boneInfo.rotMin.z, boneInfo.rotMax.z, boneInfo.baseRot.z);
                }
                List <DynamicBone> list  = new List <DynamicBone>();
                DynamicBone[]      array = components;
                for (int j = 0; j < array.Length; j++)
                {
                    DynamicBone n = array[j];
                    if (!findAssist.dictObjName.FirstOrDefault((KeyValuePair <string, GameObject> x) => x.Key == n.m_Root.name).Equals(default(KeyValuePair <string, GameObject>)))
                    {
                        list.Add(n);
                    }
                }
                boneInfo.dynamicBone      = list.ToArray();
                hairComponent.boneInfo[i] = boneInfo;
            }
            findAssist = new FindAssist();
            findAssist.Initialize(hairComponent.transform);
            hairComponent.rendAccessory = (from s in findAssist.dictObjName
                                           where s.Key.Contains("_acs")
                                           select s into x
                                           select x.Value.GetComponent <Renderer>() into r
                                           where null != r
                                           select r).ToArray <Renderer>();

            SkinnedMeshRenderer[] renderers = hairObject.GetComponentsInChildren <SkinnedMeshRenderer>();
            hairComponent.rendCheckVisible = new SkinnedMeshRenderer[renderers.Length];
            for (int i = 0; i < renderers.Length; i++)
            {
                renderers[i].gameObject.layer     = 10;
                hairComponent.rendCheckVisible[i] = renderers[i];
            }
        }
    }