public static void AddPColliders()
        {
            if (hScene == null)
            {
                return;
            }

            male_list = hScene.GetMales().Where(male => male != null).ToArray();
            fem_list  = hScene.GetFemales().Where(female => female != null).ToArray();

            danPoints             = new DanPoints[male_list.Length];
            referenceLookAtTarget = new Transform[male_list.Length];
            constrainPoints       = new ConstrainPoints[fem_list.Length];
            kokanBones            = new List <DynamicBone> [fem_list.Length];

            int maleNum = 0;

            foreach (var male in male_list.Where(male => male != null))
            {
                Transform dan101 = male.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(dan_base)).FirstOrDefault();
                Transform dan109 = male.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(dan_head)).FirstOrDefault();
                Transform danTop = male.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(dan_sack)).FirstOrDefault();

                bDansFound[maleNum]      = false;
                bDanPenetration[maleNum] = false;
                targetF[maleNum]         = 0;
                if (dan101 != null && dan109 != null && danTop != null)
                {
                    danPoints[maleNum] = new DanPoints(dan101, dan109, danTop);

                    bDansFound[maleNum] = true;
                    dan101.localScale   = new Vector3(_dan_girth[maleNum].Value, _dan_girth[maleNum].Value, 1);

                    danCollider[maleNum] = dan101.GetComponent <DynamicBoneCollider>();

                    if (danCollider[maleNum] == null)
                    {
                        danCollider[maleNum] = dan101.gameObject.AddComponent(typeof(DynamicBoneCollider)) as DynamicBoneCollider;
                    }

                    danCollider[maleNum].m_Direction = DynamicBoneColliderBase.Direction.Z;
                    danCollider[maleNum].m_Center    = new Vector3(0, _dan_collider_verticalcenter[maleNum].Value, _dan_length[maleNum].Value / 2);
                    danCollider[maleNum].m_Bound     = DynamicBoneColliderBase.Bound.Outside;
                    danCollider[maleNum].m_Radius    = _dan_collider_radius[maleNum].Value;
                    danCollider[maleNum].m_Height    = _dan_length[maleNum].Value + (_dan_collider_headlength[maleNum].Value * 2);

                    danPoints[maleNum].danTop.localScale = new Vector3(_dan_sack_size[maleNum].Value, _dan_sack_size[maleNum].Value, _dan_sack_size[maleNum].Value);
                    lastDan109Position[maleNum]          = danPoints[maleNum].danEnd.position;
                    lastDanRotation[maleNum]             = danPoints[maleNum].danEnd.rotation;
                    lastAdjustTime[maleNum] = Time.time;
                }

                referenceLookAtTarget[maleNum]    = danPoints[maleNum].danEnd;
                lastDan101TargetDistance[maleNum] = Vector3.Distance(referenceLookAtTarget[maleNum].position, danPoints[maleNum].danStart.position);
                Console.WriteLine("bDansFound " + bDansFound[maleNum]);
                maleNum++;
            }

            int femaleNum = 0;

            foreach (var female in fem_list.Where(female => female != null))
            {
                List <Transform> frontHPoints = new List <Transform>();
                List <Transform> backHPoints  = new List <Transform>();
                Transform        hPointBackOfHead;
                bHPointsFound[femaleNum] = false;

                for (int index = 0; index < frontHPointsList.Length; index++)
                {
                    frontHPoints.Add(female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(frontHPointsList[index])).FirstOrDefault());
                }

                for (int index = 0; index < backHPointsList.Length; index++)
                {
                    backHPoints.Add(female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(backHPointsList[index])).FirstOrDefault());
                }

                hPointBackOfHead = female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(headHPoint)).FirstOrDefault();

                bpKokanTarget[femaleNum] = female.GetComponentsInChildren <Transform>().Where(x => x.name.Equals(bp_kokan_target)).FirstOrDefault();
                if (bpKokanTarget[femaleNum] != null)
                {
                    Console.WriteLine("BP Target Found " + bpKokanTarget[femaleNum].name);
                    frontHPoints[0] = bpKokanTarget[femaleNum];
                }

                if (frontHPoints.Count == frontHPointsList.Length && backHPoints.Count == backHPointsList.Length && hPointBackOfHead != null)
                {
                    bHPointsFound[femaleNum]   = true;
                    constrainPoints[femaleNum] = new ConstrainPoints(frontHPoints, backHPoints, hPointBackOfHead);
                }

                foreach (DynamicBone db in female.GetComponentsInChildren <DynamicBone>().Where(x => x.name.Contains("cf_J_Vagina")))
                {
                    db.m_Colliders.Clear();
                }

                Console.WriteLine("bHPointsFound " + bHPointsFound[femaleNum]);

                List <DynamicBone> dbList = new List <DynamicBone>();
                foreach (DynamicBone db in female.GetComponentsInChildren <DynamicBone>().Where(x => x.name.Contains("cf_J_Vagina")))
                {
                    if (db == null)
                    {
                        continue;
                    }

                    if (db.m_Root != null)
                    {
                        for (int i = 0; i < colliderList.Length; i++)
                        {
                            if (db.m_Root.name.Equals(dynamicBonesList[i]))
                            {
                                DynamicBoneCollider dbc = female.GetComponentsInChildren <DynamicBoneCollider>().Where(x => x.name.Contains(colliderList[i])).FirstOrDefault();
                                if (dbc == null)
                                {
                                    Transform colliderTransform = female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(colliderList[i])).FirstOrDefault();

                                    if (colliderTransform != null)
                                    {
                                        Console.WriteLine("collider " + colliderTransform.name);

                                        dbc             = colliderTransform.gameObject.AddComponent(typeof(DynamicBoneCollider)) as DynamicBoneCollider;
                                        dbc.m_Bound     = DynamicBoneColliderBase.Bound.Inside;
                                        dbc.m_Direction = DynamicBoneColliderBase.Direction.Y;
                                        dbc.m_Height    = colliderHeightList[i];
                                        dbc.m_Radius    = colliderRadiusList[i];
                                    }
                                }

                                if (dbc != null)
                                {
                                    db.m_Colliders.Add(dbc);
                                    foreach (DynamicBoneColliderBase dbcb in db.m_Colliders)
                                    {
                                        Console.WriteLine(db.m_Root.name + " collider " + dbcb.name);
                                    }
                                }
                                else
                                {
                                    Console.WriteLine(colliderList[i] + " collider not found for " + female.name);
                                }
                            }
                        }
                    }

                    dbList.Add(db);
                }

                kokanBones[femaleNum] = dbList;
                femaleNum++;
            }

            Console.WriteLine("AddColliders done.");
        }
        public static void AddPColliders(HScene __instance)
        {
            hScene    = __instance;
            male_list = __instance.GetMales().Where(male => male != null).ToArray();
            fem_list  = __instance.GetFemales().Where(female => female != null).ToArray();

            danPoints             = new DanPoints[male_list.Length];
            referenceLookAtTarget = new Transform[male_list.Length];
            constrainPoints       = new ConstrainPoints[fem_list.Length];
            kokanBones            = new List <DynamicBone> [fem_list.Length];

            int maleNum = 0;

            foreach (var male in male_list.Where(male => male != null))
            {
                Transform dan101 = male.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(dan_base)).FirstOrDefault();
                Transform dan109 = male.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(dan_head)).FirstOrDefault();
                Transform danTop = male.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(dan_sack)).FirstOrDefault();

                bDansFound[maleNum]      = false;
                bDanPenetration[maleNum] = false;
                targetF[maleNum]         = 0;
                if (dan101 != null && dan109 != null && danTop != null)
                {
                    danPoints[maleNum] = new DanPoints(dan101, dan109, danTop);

                    bDansFound[maleNum] = true;
                    dan101.localScale   = new Vector3(_dan_girth[maleNum].Value, _dan_girth[maleNum].Value, 1);

                    danCollider[maleNum] = dan101.GetComponent <DynamicBoneCollider>();

                    if (danCollider[maleNum] == null)
                    {
                        danCollider[maleNum] = dan101.gameObject.AddComponent(typeof(DynamicBoneCollider)) as DynamicBoneCollider;
                    }

                    danCollider[maleNum].m_Direction     = DynamicBoneColliderBase.Direction.Z;
                    danCollider[maleNum].m_Center        = new Vector3(0, 0, _dan_length[maleNum].Value / 2);
                    danCollider[maleNum].m_Bound         = DynamicBoneColliderBase.Bound.Outside;
                    danCollider[maleNum].m_Radius        = _dan_collider_radius[maleNum].Value;
                    danCollider[maleNum].m_Height        = _dan_length[maleNum].Value + (_dan_collider_headlength[maleNum].Value * 2);
                    danPoints[maleNum].danTop.localScale = new Vector3(_dan_sack_size[maleNum].Value, _dan_sack_size[maleNum].Value, _dan_sack_size[maleNum].Value);

                    lastDan109Position[maleNum] = danPoints[maleNum].danEnd.position;
                    lastDanRotation[maleNum]    = danPoints[maleNum].danEnd.rotation;
                    lastDanVector[maleNum]      = danPoints[maleNum].danEnd.position - danPoints[maleNum].danStart.position;
                    lastDanLength[maleNum]      = _dan_length[maleNum].Value;
                    lastAdjustTime[maleNum]     = Time.time;
                }

                referenceLookAtTarget[maleNum]    = danPoints[maleNum].danEnd;
                lastDan101TargetDistance[maleNum] = Vector3.Distance(referenceLookAtTarget[maleNum].position, danPoints[maleNum].danStart.position);
                Console.WriteLine("bDansFound " + bDansFound[maleNum]);
                maleNum++;
            }

            int femaleNum = 0;

            foreach (var female in fem_list.Where(female => female != null))
            {
                List <Transform> frontHPoints = new List <Transform>();
                List <Transform> backHPoints  = new List <Transform>();
                Transform        hPointBackOfHead;
                bHPointsFound[femaleNum] = false;

                for (int index = 0; index < frontHPointsList.Length; index++)
                {
                    frontHPoints.Add(female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(frontHPointsList[index])).FirstOrDefault());
                }

                for (int index = 0; index < backHPointsList.Length; index++)
                {
                    backHPoints.Add(female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(backHPointsList[index])).FirstOrDefault());
                }

                hPointBackOfHead = female.GetComponentsInChildren <Transform>().Where(x => x.name.Contains(headHPoint)).FirstOrDefault();

                if (frontHPoints.Count == frontHPointsList.Length && backHPoints.Count == backHPointsList.Length && hPointBackOfHead != null)
                {
                    bHPointsFound[femaleNum]   = true;
                    constrainPoints[femaleNum] = new ConstrainPoints(frontHPoints, backHPoints, hPointBackOfHead);
                }

                Console.WriteLine("bHPointsFound " + bHPointsFound[femaleNum]);

                List <DynamicBone> dbList = new List <DynamicBone>();

                foreach (DynamicBone db in female.GetComponentsInChildren <DynamicBone>().Where(x => x.name.Contains("cf_J_Vagina")))
                {
                    if (db != null)
                    {
                        Console.WriteLine(db.m_Root.name + " found, adding collilders");

                        dbList.Add(db);

                        for (int i = 0; i < danCollider.Length; i++)
                        {
                            if (db.m_Colliders.Contains(danCollider[i]))
                            {
                                Console.WriteLine("Instance of " + danCollider[i].name + " already exists in list for DB " + db.name);
                            }
                            else
                            {
                                db.m_Colliders.Add(danCollider[i]);
                                Console.WriteLine(danCollider[i].name + " added to " + female.name + " for bone " + db.name);
                            }
                        }
                    }
                }

                kokanBones[femaleNum] = dbList;
                femaleNum++;
            }
            inHScene = true;
            Console.WriteLine("AddColliders done.");
        }