Skip to content

Commit 351f27a

Browse files
authored
Merge pull request #10 from axw-pub/male_asset
added Male-Asset motion source
2 parents 7de0248 + 7ea939f commit 351f27a

6 files changed

Lines changed: 206 additions & 145 deletions

File tree

ADD_ME.cslist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ src\MotionSource\References\DildoReference.cs
2525
src\MotionSource\References\IMotionSourceReference.cs
2626
src\MotionSource\References\MaleReference.cs
2727
src\MotionSource\Targets\AbstractPersonTarget.cs
28+
src\MotionSource\Targets\AssetTarget.cs
2829
src\MotionSource\Targets\FemaleTarget.cs
2930
src\MotionSource\Targets\IMotionSourceTarget.cs
3031
src\MotionSource\Targets\MaleTarget.cs
32+
src\MotionSource\AbstractAssetBase.cs
3133
src\MotionSource\AbstractRefreshableMotionSource.cs
3234
src\MotionSource\AnimationMotionSource.cs
3335
src\MotionSource\CompositeMotionSource.cs

ToySerialController.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,13 @@
111111
<Compile Include="src\Device\TCodeDevice.cs" />
112112
<Compile Include="src\Device\TCodeDevice.UI.cs" />
113113
<Compile Include="src\Device\IDevice.cs" />
114+
<Compile Include="src\MotionSource\AbstractAssetBase.cs" />
114115
<Compile Include="src\MotionSource\References\AssetReference.cs" />
115116
<Compile Include="src\MotionSource\References\DildoReference.cs" />
116117
<Compile Include="src\MotionSource\References\IMotionSourceReference.cs" />
117118
<Compile Include="src\MotionSource\References\MaleReference.cs" />
118119
<Compile Include="src\MotionSource\CompositeMotionSource.cs" />
120+
<Compile Include="src\MotionSource\Targets\AssetTarget.cs" />
119121
<Compile Include="src\MotionSource\Targets\AbstractPersonTarget.cs" />
120122
<Compile Include="src\MotionSource\Targets\FemaleTarget.cs" />
121123
<Compile Include="src\MotionSource\AbstractRefreshableMotionSource.cs" />
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
using SimpleJSON;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using ToySerialController.UI;
5+
using ToySerialController.Utils;
6+
using UnityEngine;
7+
using DebugUtils;
8+
using ToySerialController.Config;
9+
10+
namespace ToySerialController.MotionSource
11+
{
12+
public abstract class AbstractAssetBase : IUIProvider, IConfigProvider
13+
{
14+
private Atom _assetAtom;
15+
private Component _assetComponent;
16+
17+
private JSONStorableStringChooser AssetChooser, ComponentChooser, UpDirectionChooser;
18+
private JSONStorableFloat UpOffsetSlider, RightOffsetSlider, ForwardOffsetSlider;
19+
20+
private SuperController Controller => SuperController.singleton;
21+
22+
protected Vector3 Extents { get; private set; }
23+
24+
public Vector3 Position { get; private set; }
25+
public Vector3 Up { get; private set; }
26+
public Vector3 Right { get; private set; }
27+
public Vector3 Forward { get; private set; }
28+
29+
public virtual void CreateUI(IUIBuilder builder)
30+
{
31+
AssetChooser = builder.CreateScrollablePopup("MotionSource:Asset", "Select Asset", null, null, AssetChooserCallback);
32+
ComponentChooser = builder.CreateScrollablePopup("MotionSource:Component", "Select Component", null, null, ComponentChooserCallback);
33+
UpDirectionChooser = builder.CreateScrollablePopup("MotionSource:UpDirection", "Select Up Direction", new List<string> { "+Up", "+Right", "+Forward", "-Up", "-Right", "-Forward" }, "+Up", null);
34+
UpOffsetSlider = builder.CreateSlider("MotionSource:UpOffset", "Up Offset", -0.5f, -1, 1, true, true);
35+
RightOffsetSlider = builder.CreateSlider("MotionSource:RightOffset", "Right Offset", 0, -1, 1, true, true);
36+
ForwardOffsetSlider = builder.CreateSlider("MotionSource:ForwardOffset", "Forward Offset", 0, -1, 1, true, true);
37+
38+
FindAssets();
39+
}
40+
41+
public virtual void DestroyUI(IUIBuilder builder)
42+
{
43+
builder.Destroy(AssetChooser);
44+
builder.Destroy(ComponentChooser);
45+
builder.Destroy(UpDirectionChooser);
46+
builder.Destroy(UpOffsetSlider);
47+
builder.Destroy(RightOffsetSlider);
48+
builder.Destroy(ForwardOffsetSlider);
49+
}
50+
51+
public virtual void StoreConfig(JSONNode config)
52+
{
53+
config.Store(AssetChooser);
54+
config.Store(ComponentChooser);
55+
config.Store(UpDirectionChooser);
56+
config.Store(UpOffsetSlider);
57+
config.Store(RightOffsetSlider);
58+
config.Store(ForwardOffsetSlider);
59+
}
60+
61+
public virtual void RestoreConfig(JSONNode config)
62+
{
63+
config.Restore(AssetChooser);
64+
config.Restore(ComponentChooser);
65+
config.Restore(UpDirectionChooser);
66+
config.Restore(UpOffsetSlider);
67+
config.Restore(RightOffsetSlider);
68+
config.Restore(ForwardOffsetSlider);
69+
70+
FindAssets(AssetChooser.val);
71+
ComponentChooserCallback(ComponentChooser.val);
72+
}
73+
74+
public virtual bool Update()
75+
{
76+
if (_assetAtom == null || _assetComponent == null || !_assetAtom.on)
77+
return false;
78+
79+
if (DebugDraw.Enabled)
80+
{
81+
foreach (var c in _assetAtom.GetComponentsInChildren<MeshFilter>())
82+
DebugDraw.DrawLocalBox(c.mesh.bounds, c.transform.position, c.transform.rotation, c == _assetComponent ? Color.green : Color.white);
83+
84+
foreach (var c in _assetAtom.GetComponentsInChildren<SkinnedMeshRenderer>())
85+
DebugDraw.DrawLocalBox(c.sharedMesh.bounds, c.transform.position, c.transform.rotation, c == _assetComponent ? Color.green : Color.white);
86+
}
87+
88+
Bounds bounds;
89+
if (_assetComponent is MeshFilter)
90+
bounds = (_assetComponent as MeshFilter).mesh.bounds;
91+
else if (_assetComponent is SkinnedMeshRenderer)
92+
bounds = (_assetComponent as SkinnedMeshRenderer).sharedMesh.bounds;
93+
else
94+
return false;
95+
96+
var transform = _assetComponent.transform;
97+
if (UpDirectionChooser.val == "-Up")
98+
{
99+
Up = -transform.up;
100+
Right = -transform.right;
101+
Forward = -transform.forward;
102+
}
103+
else
104+
{
105+
if (UpDirectionChooser.val == "+Up") Up = transform.up;
106+
else if (UpDirectionChooser.val == "+Right") Up = transform.right;
107+
else if (UpDirectionChooser.val == "+Forward") Up = transform.forward;
108+
else if (UpDirectionChooser.val == "-Right") Up = -transform.right;
109+
else if (UpDirectionChooser.val == "-Forward") Up = -transform.forward;
110+
111+
var upRotation = Quaternion.FromToRotation(transform.up, Up);
112+
Right = upRotation * transform.right;
113+
Forward = upRotation * transform.forward;
114+
}
115+
116+
Extents = transform.rotation * bounds.extents;
117+
var offsetUp = Up * Vector3.Project(Extents, Up).magnitude * UpOffsetSlider.val * 2;
118+
var offsetRight = Right * Vector3.Project(Extents, Right).magnitude * RightOffsetSlider.val * 2;
119+
var offsetForward = Forward * Vector3.Project(Extents, Forward).magnitude * ForwardOffsetSlider.val * 2;
120+
121+
Position = transform.position + transform.rotation * bounds.center + offsetUp + offsetRight + offsetForward;
122+
123+
return true;
124+
}
125+
126+
private void FindAssets(string defaultUid = null)
127+
{
128+
var assetUids = Controller.GetAtoms()
129+
.Where(a => a.type == "CustomUnityAsset")
130+
.Select(a => a.uid)
131+
.ToList();
132+
133+
if (!assetUids.Contains(defaultUid))
134+
defaultUid = assetUids.FirstOrDefault(uid => uid == _assetAtom?.uid) ?? assetUids.FirstOrDefault() ?? "None";
135+
136+
assetUids.Insert(0, "None");
137+
138+
AssetChooser.choices = assetUids;
139+
AssetChooserCallback(defaultUid);
140+
}
141+
142+
private void AssetChooserCallback(string s)
143+
{
144+
_assetAtom = Controller.GetAtomByUid(s);
145+
146+
if(_assetAtom == null)
147+
{
148+
AssetChooser.valNoCallback = "None";
149+
ComponentChooser.choices = new List<string> { "None" };
150+
ComponentChooserCallback("None");
151+
return;
152+
}
153+
154+
AssetChooser.valNoCallback = s;
155+
156+
var meshFilters = _assetAtom.GetComponentsInChildren<MeshFilter>().Select(c => c.name) ?? Enumerable.Empty<string>();
157+
var skinnedMeshRenderers = _assetAtom.GetComponentsInChildren<SkinnedMeshRenderer>().Select(c => c.name) ?? Enumerable.Empty<string>();
158+
var componentNames = meshFilters.Concat(skinnedMeshRenderers).ToList();
159+
160+
var defaultComponent = componentNames.FirstOrDefault() ?? "None";
161+
componentNames.Insert(0, "None");
162+
163+
ComponentChooser.choices = componentNames;
164+
ComponentChooserCallback(defaultComponent);
165+
}
166+
167+
private void ComponentChooserCallback(string s)
168+
{
169+
_assetComponent = (Component)_assetAtom?.GetComponentByName<MeshFilter>(s)
170+
?? (_assetAtom?.GetComponentByName<SkinnedMeshRenderer>(s));
171+
172+
ComponentChooser.valNoCallback = _assetComponent == null ? "None" : s;
173+
}
174+
175+
public void Refresh() => FindAssets(AssetChooser.val);
176+
}
177+
}

0 commit comments

Comments
 (0)