示例#1
0
        public static void LookAtDanSetup(Transform lookAtTransform, string currentMotion, bool topStick, int maleNum, int femaleNum, bool twoDans, bool isInScene)
        {
            if (maleNum >= danAgents.Count || femaleNum >= collisionAgents.Count)
            {
                return;
            }

            if (!twoDans && danAgents.Count > 1 && danAgents[1] != null)
            {
                danAgents[1].RemoveDanColliders(collisionAgents[femaleNum]);
#if HS2 || AI
                danAgents[1].RemoveMidsectionColliders(collisionAgents[femaleNum].m_collisionCharacter);
                danAgents[1].RemoveDanCollidersFromDB2(collisionAgents[femaleNum].m_collisionCharacter);
#endif
            }

            if (maleNum == 1 && !twoDans)
            {
                return;
            }

            CollisionAgent firstAgent  = collisionAgents[femaleNum];
            CollisionAgent secondAgent = null;

            var secondFemaleNum = femaleNum == 0 ? 1 : 0;
            if (collisionAgents.Count > secondFemaleNum && collisionAgents[secondFemaleNum].m_collisionCharacter.visibleAll && collisionAgents[secondFemaleNum].m_collisionCharacter.objTop != null)
            {
                secondAgent = collisionAgents[secondFemaleNum];
            }

            danAgents[maleNum].SetupNewDanTarget(lookAtTransform, currentMotion, topStick, isInScene, firstAgent, secondAgent, twoDans);
            danHasNewTarget[maleNum] = false;
        }
示例#2
0
        internal static void ClearFingerColliders(DanAgent danAgent, CollisionAgent firstAgent, CollisionAgent secondAgent = null)
        {
            if (firstAgent == null)
            {
                return;
            }

            firstAgent.RemoveFingerColliders(firstAgent);

            if (danAgent != null)
            {
                danAgent.RemoveFingerColliders(firstAgent);
            }

            if (secondAgent == null)
            {
                return;
            }

            firstAgent.RemoveFingerColliders(secondAgent);
            secondAgent.RemoveFingerColliders(firstAgent);

            if (danAgent != null)
            {
                danAgent.RemoveFingerColliders(secondAgent);
            }
        }
示例#3
0
        public void SetCollisionAgent(ChaControl target, bool kokanTarget, bool anaTarget, bool oralTarget)
        {
            if (danAgent == null || controllerOptions == null || !danTargetsValid)
            {
                return;
            }

            if (collisionAgent != null && collisionAgent.m_collisionCharacter != null)
            {
                danAgent.RemoveDanCollidersFromTarget(collisionAgent.m_collisionCharacter, isKokan, isAna);
                danAgent.RemoveTamaColliders();
            }

            collisionAgent = new CollisionAgent(target, collisionOptions);

            isKokan = kokanTarget;
            isAna   = anaTarget;
            isOral  = oralTarget;

            if (isKokan)
            {
                danAgent.AddDanCollidersToTargetKokan(collisionAgent.m_collisionCharacter, collisionOptions.enableBellyBulge);
            }

            if (isAna)
            {
                danAgent.AddDanCollidersToTargetAna(collisionAgent.m_collisionCharacter);
            }

            danAgent.AddTamaColliders(collisionAgent.m_collisionCharacter, false);
        }
示例#4
0
        internal void SetDanTarget(CollisionAgent targetAgent)
        {
            if (!m_danPointsFound || !targetAgent.m_collisionPointsFound)
            {
                return;
            }

            if (m_referenceTarget == null)
            {
                m_danPoints.AimDanTop();
                return;
            }

            Vector3 danStartPosition = m_danPoints.GetDanStartPosition();
            Vector3 danTarget        = m_referenceTarget.position;

            if (m_referenceTarget.name == LookTargets.KokanTarget)
            {
                danTarget += (m_referenceTarget.forward * targetAgent.m_collisionOptions.kokanForwardOffset) + (m_referenceTarget.up * targetAgent.m_collisionOptions.kokanUpOffset);
            }
            else if (m_referenceTarget.name == LookTargets.HeadTarget)
            {
                danTarget += (m_referenceTarget.forward * targetAgent.m_collisionOptions.headForwardOffset) + (m_referenceTarget.up * targetAgent.m_collisionOptions.headUpOffset);
            }

            if (targetAgent.m_collisionOptions.kokan_adjust && targetAgent.adjustFAnimation && (m_referenceTarget.name == LookTargets.KokanTarget || m_referenceTarget.name == LookTargets.BPKokanTarget))
            {
                danTarget += m_referenceTarget.forward * targetAgent.m_collisionOptions.kokan_adjust_position_z;
            }

            Vector3 danTargetVector = Vector3.Normalize(danTarget - danStartPosition);
            Vector3 danEndTarget    = danStartPosition + danTargetVector * m_baseDanLength;

            float danDistanceToTarget = Vector3.Distance(danStartPosition, danTarget);
            float adjustedDanLength   = GetSquishedDanLength(danDistanceToTarget);
            float girthScaleFactor    = GetSquishedDanGirth(danDistanceToTarget);

            if (m_referenceTarget.name != LookTargets.HeadTarget || m_danOptions.squishOralGirth)
            {
                m_danPoints.SquishDanGirth(girthScaleFactor);
            }

            if (m_referenceTarget.name == LookTargets.KokanTarget || m_referenceTarget.name == LookTargets.AnaTarget || m_referenceTarget.name == LookTargets.BPKokanTarget)
            {
                adjustedDanLength = GetMaxDanLength(adjustedDanLength, danTarget, targetAgent.m_innerTarget.position, danDistanceToTarget);
            }
            else if (m_referenceTarget.name == LookTargets.HeadTarget)
            {
                adjustedDanLength = GetMaxDanLength(adjustedDanLength, danTarget, targetAgent.m_innerHeadTarget.position, danDistanceToTarget);
            }

            danEndTarget = ConstrainDan(danStartPosition, danTargetVector, danEndTarget, adjustedDanLength, danDistanceToTarget, targetAgent);
            ScaleDanColliders(adjustedDanLength);

            List <Vector3> adjustedDanPoints = AdjustDanPointsToTargets(danTarget, danEndTarget, adjustedDanLength, danDistanceToTarget);

            m_danPoints.AimDanPoints(adjustedDanPoints);
        }
示例#5
0
        private Vector3 ConstrainDanToBody(CollisionAgent target, Vector3 dan101_pos, Vector3 danVector, float squishedDanLength)
        {
            Vector3 adjustedDan109      = dan101_pos + danVector * squishedDanLength;
            bool    constrainPointFound = false;

            adjustedDan109 = ConstrainDanToCollisionPoints(dan101_pos, adjustedDan109, squishedDanLength, ref constrainPointFound, target.m_collisionPoints.frontCollisionPoints, target.m_collisionOptions.clippingDepth, true);
            adjustedDan109 = ConstrainDanToCollisionPoints(dan101_pos, adjustedDan109, squishedDanLength, ref constrainPointFound, target.m_collisionPoints.backCollisionPoints, target.m_collisionOptions.clippingDepth, false);
            return(adjustedDan109);
        }
示例#6
0
 internal void ClearDanTarget(CollisionAgent firstTarget, CollisionAgent secondTarget = null)
 {
     ClearTarget();
     ResetDanAdjustment();
     RemoveTamaColliders();
     RemoveColliders(firstTarget);
     if (secondTarget != null)
     {
         RemoveColliders(secondTarget);
     }
 }
示例#7
0
        public void RemoveCollisionAgent(bool wasKokan, bool wasAna)
        {
            if (danAgent == null || controllerOptions == null || !danTargetsValid || collisionAgent == null || collisionAgent.m_collisionCharacter == null)
            {
                return;
            }

            danAgent.RemoveDanCollidersFromTarget(collisionAgent.m_collisionCharacter, wasKokan, wasAna);
            danAgent.RemoveTamaColliders();

            collisionAgent = null;
        }
示例#8
0
 private void AddDanColliders(CollisionAgent target)
 {
     foreach (var danCollider in m_danColliders)
     {
         foreach (DynamicBone dynamicBone in target.m_kokanDynamicBones)
         {
             if (danCollider != null && !dynamicBone.m_Colliders.Contains(danCollider))
             {
                 dynamicBone.m_Colliders.Add(danCollider);
             }
         }
     }
 }
示例#9
0
 private void RemoveDanColliders(CollisionAgent target)
 {
     foreach (var danCollider in m_danColliders)
     {
         foreach (DynamicBone dynamicBone in target.m_kokanDynamicBones)
         {
             if (danCollider != null)
             {
                 dynamicBone.m_Colliders.Remove(danCollider);
             }
         }
     }
 }
示例#10
0
        internal void AddFingerColliders(CollisionAgent target)
        {
            if (m_fingerColliders == null || m_fingerColliders.Count == 0)
            {
                return;
            }

            foreach (DynamicBone dynamicBone in target.m_kokanDynamicBones)
            {
                foreach (var collider in m_fingerColliders)
                {
                    if (collider != null && !dynamicBone.m_Colliders.Contains(collider))
                    {
                        dynamicBone.m_Colliders.Add(collider);
                    }
                }
            }
        }
示例#11
0
        internal void RemoveFingerColliders(CollisionAgent target)
        {
            if (m_fingerColliders == null || m_fingerColliders.Count == 0)
            {
                return;
            }

            foreach (DynamicBone dynamicBone in target.m_kokanDynamicBones)
            {
                foreach (var collider in m_fingerColliders)
                {
                    if (collider != null)
                    {
                        dynamicBone.m_Colliders.Remove(collider);
                    }
                }
            }
        }
示例#12
0
        internal static void ClearFingerColliders()
        {
            DanAgent danAgent = null;

            if (danAgents != null && danAgents.Count > 0)
            {
                danAgent = danAgents[0];
            }

            CollisionAgent firstAgent  = collisionAgents[0];
            CollisionAgent secondAgent = null;

            if (collisionAgents.Count > 1)
            {
                secondAgent = collisionAgents[1];
            }

            ClearFingerColliders(danAgent, firstAgent, secondAgent);
        }
示例#13
0
        private void RemoveFingerColliders(CollisionAgent target)
        {
            foreach (DynamicBone dynamicBone in target.m_kokanDynamicBones)
            {
                if (m_indexCollider != null)
                {
                    dynamicBone.m_Colliders.Remove(m_indexCollider);
                }

                if (m_middleCollider != null)
                {
                    dynamicBone.m_Colliders.Remove(m_middleCollider);
                }

                if (m_ringCollider != null)
                {
                    dynamicBone.m_Colliders.Remove(m_ringCollider);
                }
            }
        }
示例#14
0
        private void AddFingerColliders(CollisionAgent target)
        {
            foreach (DynamicBone dynamicBone in target.m_kokanDynamicBones)
            {
                if (m_indexCollider != null && !dynamicBone.m_Colliders.Contains(m_indexCollider))
                {
                    dynamicBone.m_Colliders.Add(m_indexCollider);
                }

                if (m_middleCollider != null && !dynamicBone.m_Colliders.Contains(m_middleCollider))
                {
                    dynamicBone.m_Colliders.Add(m_middleCollider);
                }

                if (m_ringCollider != null && !dynamicBone.m_Colliders.Contains(m_ringCollider))
                {
                    dynamicBone.m_Colliders.Add(m_ringCollider);
                }
            }
        }
示例#15
0
        internal static void SetupFingerColliders(string animation)
        {
            DanAgent danAgent = null;

            if (danAgents != null && danAgents.Count > 0)
            {
                danAgent = danAgents[0];
            }

            CollisionAgent firstAgent  = collisionAgents[0];
            CollisionAgent secondAgent = null;

            if (collisionAgents.Count > 1 && collisionAgents[1].m_collisionCharacter.visibleAll && collisionAgents[1].m_collisionCharacter.objTop != null)
            {
                secondAgent = collisionAgents[1];
            }

            ClearFingerColliders(danAgent, firstAgent, secondAgent);
            AddFingerColliders(animation, danAgent, firstAgent, secondAgent);
        }
示例#16
0
        internal static void AddFingerColliders(string animation, DanAgent danAgent, CollisionAgent firstAgent, CollisionAgent secondAgent = null)
        {
            if (animation == null || firstAgent == null)
            {
                return;
            }

            if (danAgent != null && BoneNames.maleFingerAnimationNames.Contains(animation))
            {
                danAgent.AddFingerColliders(firstAgent);

                if (secondAgent != null)
                {
                    danAgent.AddFingerColliders(secondAgent);
                }

                return;
            }

            if (BoneNames.femaleSelfFingerAnimationNames.Contains(animation))
            {
                firstAgent.AddFingerColliders(firstAgent);
                return;
            }

            if (secondAgent == null)
            {
                return;
            }

            if (BoneNames.lesbianFingerAnimationNames.Contains(animation))
            {
                firstAgent.AddFingerColliders(secondAgent);
                secondAgent.AddFingerColliders(firstAgent);
                return;
            }
        }
示例#17
0
 internal void RemoveColliders(CollisionAgent target)
 {
     RemoveDanColliders(target);
     RemoveFingerColliders(target);
 }
示例#18
0
        internal void SetupNewDanTarget(Transform lookAtTransform, string currentMotion, bool topStick, CollisionAgent firstTarget, CollisionAgent secondTarget = null)
        {
            ClearTarget();

            if (!m_danPointsFound)
            {
                return;
            }

            if (secondTarget != null)
            {
                if (lookAtTransform == null)
                {
                    AddDanColliders(firstTarget);
                    AddDanColliders(secondTarget);
                    RemoveFingerColliders(firstTarget);
                    RemoveFingerColliders(secondTarget);
                }
                else if (lookAtTransform.name == LookTargets.KokanTarget)
                {
                    AddDanColliders(firstTarget);
                    RemoveDanColliders(secondTarget);
                    RemoveFingerColliders(firstTarget);

                    if (m_danOptions.useFingerColliders)
                    {
                        AddFingerColliders(secondTarget);
                    }
                    else
                    {
                        RemoveFingerColliders(secondTarget);
                    }
                }
                else
                {
                    RemoveDanColliders(firstTarget);
                    RemoveDanColliders(secondTarget);
                    RemoveFingerColliders(firstTarget);
                    RemoveFingerColliders(secondTarget);
                }
            }
            else
            {
                if (lookAtTransform == null || lookAtTransform.name == LookTargets.KokanTarget)
                {
                    AddDanColliders(firstTarget);
                }
                else
                {
                    RemoveDanColliders(firstTarget);
                }

                if (m_danOptions.useFingerColliders && lookAtTransform == null)
                {
                    AddFingerColliders(firstTarget);
                }
                else
                {
                    RemoveFingerColliders(firstTarget);
                }
            }

            ResetDanAdjustment();

            if (lookAtTransform == null)
            {
                return;
            }

            m_referenceTarget = lookAtTransform;
            if (topStick && m_referenceTarget.name == LookTargets.KokanTarget && !currentMotion.Contains("Idle") && !currentMotion.Contains("Pull") && !currentMotion.Contains("OUT") && firstTarget.m_bpKokanTarget != null)
            {
                m_referenceTarget = firstTarget.m_bpKokanTarget;
            }

            m_danPenetration = topStick || currentMotion.Contains("IN");
        }
示例#19
0
        private Vector3 ConstrainDan(Vector3 danStart, Vector3 danTargetVector, Vector3 danEndTarget, float danLength, float danDistanceToTarget, CollisionAgent targetAgent)
        {
            if (m_danPenetration)
            {
                if (m_referenceTarget.name == LookTargets.KokanTarget || m_referenceTarget.name == LookTargets.AnaTarget || m_referenceTarget.name == LookTargets.BPKokanTarget)
                {
                    if (m_danOptions.simplifyPenetration && m_bpDanPointsFound)
                    {
                        danEndTarget = targetAgent.m_innerTarget.position;
                    }
                    else
                    {
                        danEndTarget = ConstrainDanToBody(targetAgent, danStart, danTargetVector, danLength);
                    }
                }
                else if (m_referenceTarget.name == LookTargets.HeadTarget)
                {
                    if (m_danOptions.simplifyOral && m_bpDanPointsFound)
                    {
                        danEndTarget = targetAgent.m_innerHeadTarget.position;
                    }
                    else
                    {
                        danEndTarget = ConstrainDanToHead(danStart, danTargetVector, danLength);
                    }
                }
            }
            else if ((m_referenceTarget.name == LookTargets.KokanTarget) && (m_baseDanLength > danDistanceToTarget))
            {
                danEndTarget = ConstrainDanToPull(danStart, danTargetVector, danLength);
            }

            return(danEndTarget);
        }
示例#20
0
        internal void SetupNewDanTarget(Transform lookAtTransform, string currentMotion, bool topStick, CollisionAgent firstTarget, CollisionAgent secondTarget = null)
        {
            ClearDanTarget(firstTarget, secondTarget);

            if (!m_danPointsFound)
            {
                return;
            }

            if (secondTarget != null)
            {
                if (lookAtTransform == null)
                {
                    AddDanColliders(firstTarget);
                    AddDanColliders(secondTarget);
                }
                else if (lookAtTransform.name == LookTargets.KokanTarget)
                {
                    AddDanColliders(firstTarget);
                    if (m_danOptions.useFingerColliders)
                    {
                        AddFingerColliders(secondTarget);
                    }
                }
            }
            else
            {
                if (lookAtTransform == null || lookAtTransform.name == LookTargets.KokanTarget)
                {
                    AddDanColliders(firstTarget);
                }

                if (m_danOptions.useFingerColliders && lookAtTransform == null)
                {
                    AddFingerColliders(firstTarget);
                }
            }

            AddTamaColliders(firstTarget.m_collisionCharacter, false);
            if (secondTarget != null)
            {
                AddTamaColliders(secondTarget.m_collisionCharacter, false);
            }

            if (currentMotion == string.Empty)
            {
                return;
            }

            m_referenceTarget = lookAtTransform;
#if KK
            m_danPenetration = (topStick && m_referenceTarget != null) || currentMotion.Contains("IN");
#else
            m_danPenetration = topStick && m_referenceTarget != null;
#endif

            if (m_danPenetration && firstTarget.m_bpKokanTarget != null &&
                (m_referenceTarget == null || m_referenceTarget.name == LookTargets.KokanTarget) &&
                !currentMotion.Contains("Idle") && !currentMotion.Contains("Pull") && !currentMotion.Contains("OUT"))
            {
                m_referenceTarget = firstTarget.m_bpKokanTarget;
            }
        }