genital rotation, requires special ver. of RimNudeWorld. Enable in options

This commit is contained in:
Platinum 2020-04-28 20:42:53 -07:00
parent 89d93091b0
commit 1707afaa4d
9 changed files with 69 additions and 25 deletions

View file

@ -471,6 +471,7 @@
<li>Human</li>
</defNames>
<isFucking>true</isFucking>
<controlGenitalAngle>true</controlGenitalAngle>
<initiator>true</initiator>
</li>
</actors>
@ -622,6 +623,7 @@
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>90</genitalAngle>
</li>
<li>
<tickDuration>59</tickDuration>
@ -641,6 +643,7 @@
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>90</genitalAngle>
</li>
</keyframes>
</li>
@ -698,6 +701,7 @@
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>90</genitalAngle>
</li>
<li>
<tickDuration>14</tickDuration>
@ -717,6 +721,7 @@
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>90</genitalAngle>
</li>
</keyframes>
</li>
@ -801,6 +806,7 @@
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>90</genitalAngle>
</li>
<li>
<tickDuration>7</tickDuration>
@ -849,6 +855,7 @@
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>90</genitalAngle>
</li>
</keyframes>
</li>
@ -1968,8 +1975,6 @@
<li>Vaginal</li>
</sexTypes>
<actors>
<li>
@ -1986,6 +1991,7 @@
<li>Human</li>
</defNames>
<isFucking>true</isFucking>
<controlGenitalAngle>true</controlGenitalAngle>
</li>
</actors>
@ -2178,30 +2184,33 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>0</genitalAngle>
</li>
<li>
<tickDuration>33</tickDuration>
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.213</bodyOffsetZ>
<bodyOffsetZ>-0.313</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0.045</headBob>
<genitalAngle>0</genitalAngle>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>0</genitalAngle>
</li>
</keyframes>
</li>
@ -2256,30 +2265,33 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>0</genitalAngle>
</li>
<li>
<tickDuration>13</tickDuration>
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.213</bodyOffsetZ>
<bodyOffsetZ>-0.313</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0.045</headBob>
<genitalAngle>0</genitalAngle>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>0</genitalAngle>
</li>
</keyframes>
</li>
@ -2420,17 +2432,18 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>0</genitalAngle>
</li>
<li>
<tickDuration>10</tickDuration>
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.213</bodyOffsetZ>
<bodyOffsetZ>-0.313</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0.045</headBob>
@ -2440,7 +2453,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
@ -2451,7 +2464,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
@ -2461,7 +2474,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.213</bodyOffsetZ>
<bodyOffsetZ>-0.313</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0.045</headBob>
@ -2471,7 +2484,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
@ -2482,7 +2495,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
@ -2492,7 +2505,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.213</bodyOffsetZ>
<bodyOffsetZ>-0.313</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0.045</headBob>
@ -2502,7 +2515,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
@ -2512,7 +2525,7 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
@ -2522,10 +2535,11 @@
<bodyAngle>180</bodyAngle>
<headAngle>180</headAngle>
<bodyOffsetX>0</bodyOffsetX>
<bodyOffsetZ>-0.263</bodyOffsetZ>
<bodyOffsetZ>-0.363</bodyOffsetZ>
<bodyFacing>2</bodyFacing>
<headFacing>2</headFacing>
<headBob>0</headBob>
<genitalAngle>0</genitalAngle>
</li>
</keyframes>
</li>

View file

@ -15,6 +15,7 @@ namespace Rimworld_Animations {
public string gender;
public bool isFucking = false;
public bool isFucked = false;
public bool controlGenitalAngle = false;
public Vector3 offset = new Vector2(0, 0);
}
}

View file

@ -77,10 +77,10 @@ namespace Rimworld_Animations {
}
//TESTING ANIMATIONS ONLY REMEMBER TO COMMENT OUT BEFORE PUSH
/*
if (x.defName != "Test")
if (x.defName != "Cowgirl")
return false;
*/
if (x.actors[i].isFucking && !rjw.xxx.can_fuck(localParticipants[i])) {

View file

@ -14,6 +14,7 @@ namespace Rimworld_Animations {
public Dictionary<int, string> SoundEffects = new Dictionary<int, string>();
public Dictionary<int, bool> quiver = new Dictionary<int, bool>();
public SimpleCurve GenitalAngle = new SimpleCurve();
public SimpleCurve BodyAngle = new SimpleCurve();
public SimpleCurve HeadAngle = new SimpleCurve();
public SimpleCurve HeadBob = new SimpleCurve();
@ -60,9 +61,14 @@ namespace Rimworld_Animations {
if (frame.headBob.HasValue)
HeadBob.Add((float)frame.atTick / (float)duration, frame.headBob.Value, true);
if (frame.genitalAngle.HasValue)
GenitalAngle.Add((float)frame.atTick / (float)duration, frame.genitalAngle.Value, true);
if (frame.soundEffect != null) {
SoundEffects.Add((int)frame.atTick, frame.soundEffect);
}
}
else {
if (frame.bodyAngle.HasValue)
@ -86,6 +92,9 @@ namespace Rimworld_Animations {
if (frame.headBob.HasValue)
HeadBob.Add((float)keyframePosition / (float)duration, frame.headBob.Value, true);
if (frame.genitalAngle.HasValue)
GenitalAngle.Add((float)keyframePosition / (float)duration, frame.genitalAngle.Value, true);
if (frame.soundEffect != null) {
SoundEffects.Add(keyframePosition, frame.soundEffect);
}

View file

@ -11,6 +11,8 @@ namespace Rimworld_Animations {
public float? bodyAngle;
public float? headAngle;
public float? genitalAngle;
public float? bodyOffsetZ;
public float? bodyOffsetX;

View file

@ -43,9 +43,11 @@ namespace Rimworld_Animations {
private float clipPercent = 0;
public Vector3 anchor, deltaPos, headBob;
public float bodyAngle, headAngle;
public float bodyAngle, headAngle, genitalAngle;
public Rot4 headFacing, bodyFacing;
public bool controlGenitalAngle = false;
private AnimationDef anim;
private AnimationStage stage => anim.animationStages[curStage];
private PawnAnimationClip clip => (PawnAnimationClip)stage.animationClips[actor];
@ -117,6 +119,8 @@ namespace Rimworld_Animations {
quiver = false;
this.shiver = shiver && AnimationSettings.rapeShiver;
controlGenitalAngle = anim.actors[actor].controlGenitalAngle;
//tick once for initialization
tickAnim();
@ -218,6 +222,11 @@ namespace Rimworld_Animations {
if (headAngle < 0) headAngle = 360 - ((-1f * headAngle) % 360);
if (headAngle > 360) headAngle %= 360;
if (controlGenitalAngle) {
genitalAngle = clip.GenitalAngle.Evaluate(clipPercent) * (mirror ? -1 : 1);
if (genitalAngle < 0) genitalAngle = 360 - ((-1f * genitalAngle) % 360);
if (genitalAngle > 360) genitalAngle %= 360;
}
bodyFacing = mirror ? new Rot4((int)clip.BodyFacing.Evaluate(clipPercent)).Opposite : new Rot4((int)clip.BodyFacing.Evaluate(clipPercent));
@ -231,6 +240,7 @@ namespace Rimworld_Animations {
headFacing = headFacing.Opposite;
}
headBob = new Vector3(0, 0, clip.HeadBob.Evaluate(clipPercent));
}
public Vector3 getPawnHeadPosition() {

View file

@ -125,10 +125,16 @@ namespace Rimworld_Animations {
quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * headQuatInAnimation, mat: alienComp.addonGraphics[index: i].MatAt(rot: pawnAnimator.headFacing), drawNow: portrait);
}
else {
Quaternion addonRotation = quat;
if (AnimationSettings.controlGenitalRotation && pawnAnimator.controlGenitalAngle && ba.hediffGraphics[0] != null && (ba.hediffGraphics[0].path.Contains("Penis") || ba.hediffGraphics[0].path.Contains("penis"))) {
addonRotation = Quaternion.AngleAxis(angle: pawnAnimator.genitalAngle, axis: Vector3.up);
}
GenDraw.DrawMeshNowOrLater(mesh: alienComp.addonGraphics[index: i].MeshAt(rot: rotation), loc: vector + offsetVector.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: quat)) * 2f * 57.29578f),
quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * quat, mat: alienComp.addonGraphics[index: i].MatAt(rot: rotation), drawNow: portrait);
quat: Quaternion.AngleAxis(angle: num, axis: Vector3.up) * addonRotation, mat: alienComp.addonGraphics[index: i].MatAt(rot: rotation), drawNow: portrait);
}

View file

@ -9,13 +9,14 @@ using UnityEngine;
namespace Rimworld_Animations {
public class AnimationSettings : ModSettings {
public static bool orgasmQuiver, rapeShiver, soundOverride = true, hearts = true;
public static bool orgasmQuiver, rapeShiver, soundOverride = true, hearts = true, controlGenitalRotation = false;
public static float shiverIntensity = 2f;
public override void ExposeData() {
base.ExposeData();
Scribe_Values.Look(ref controlGenitalRotation, "controlGenitalRotation", false);
Scribe_Values.Look(ref orgasmQuiver, "orgasmQuiver");
Scribe_Values.Look(ref rapeShiver, "rapeShiver");
Scribe_Values.Look(ref hearts, "heartsOnLovin");
@ -39,6 +40,7 @@ namespace Rimworld_Animations {
listingStandard.Begin(inRect);
listingStandard.CheckboxLabeled("Enable Sound Override", ref AnimationSettings.soundOverride);
listingStandard.CheckboxLabeled("Control Genital Rotation", ref AnimationSettings.controlGenitalRotation);
listingStandard.CheckboxLabeled("Enable Orgasm Quiver", ref AnimationSettings.orgasmQuiver);
listingStandard.CheckboxLabeled("Enable Rape Shiver", ref AnimationSettings.rapeShiver);
listingStandard.CheckboxLabeled("Enable hearts during lovin'", ref AnimationSettings.hearts);