summaryrefslogtreecommitdiff
path: root/VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-12-27 00:56:58 -0500
committerFreya Murphy <freya@freyacat.org>2024-12-27 00:58:02 -0500
commit799e6680d40119dc9c2a9e0b320054a40324bebe (patch)
treedbcd308d59eb6e4f937a5547dd77d9f91d4fec20 /VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs
parentmove to self host (diff)
downloadunityprojects-799e6680d40119dc9c2a9e0b320054a40324bebe.tar.gz
unityprojects-799e6680d40119dc9c2a9e0b320054a40324bebe.tar.bz2
unityprojects-799e6680d40119dc9c2a9e0b320054a40324bebe.zip
VRCSDK3Avatars found!
Diffstat (limited to 'VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs')
-rw-r--r--VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs152
1 files changed, 152 insertions, 0 deletions
diff --git a/VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs b/VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs
new file mode 100644
index 00000000..961b661c
--- /dev/null
+++ b/VRCSDK3Avatars/Assets/Resources/RalivDynamicPenetrationSystem/Includes/OrificeSetup.cs
@@ -0,0 +1,152 @@
+#if UNITY_EDITOR
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using UnityEngine.Experimental.Rendering;
+
+public class OrificeSetup : ScriptableWizard {
+
+ public GameObject orifice;
+ private string errorInfo="";
+ private int[] shapes;
+ private Material orificeMaterial;
+
+ [MenuItem("Tools/Raliv/Orifice Setup")]
+ static void Setup() {
+ ScriptableWizard.DisplayWizard<OrificeSetup>("Orifice Setup");
+ }
+
+ private List<string> blendshapeNameList(Mesh m) {
+ List<string> nameList = new List<string>();
+ nameList.Add("None");
+ for (int i=0; i<m.blendShapeCount; i++) {
+ nameList.Add(m.GetBlendShapeName(i));
+ }
+ return nameList;
+ }
+
+ Vector3 ToTangentSpace(Vector3 input, Vector3 normal, Vector3 tangent) {
+ Vector3 X = normal;
+ Vector3 Y = new Vector3(tangent.x, tangent.y, tangent.z);
+ Vector3 Z = Vector3.Cross(X, Y);
+ Vector3.OrthoNormalize(ref X, ref Y, ref Z);
+ Matrix4x4 toNewSpace = new Matrix4x4();
+ toNewSpace.SetRow(0, X);
+ toNewSpace.SetRow(1, Y);
+ toNewSpace.SetRow(2, Z);
+ toNewSpace[3, 3] = 1.0F;
+ return toNewSpace.MultiplyPoint(input);
+ }
+
+ void BlitShape(Texture2D texture, Mesh mesh, int shapeIndex, int encodingIndex) {
+ Vector3[] deltaVerts = new Vector3[mesh.vertexCount];
+ Vector3[] deltaNormals = new Vector3[mesh.vertexCount];
+ Vector3[] deltaTangents = new Vector3[mesh.vertexCount];
+ Vector3[] vertices = mesh.vertices;
+ Vector3[] normals = mesh.normals;
+ Vector4[] tangents = mesh.tangents;
+
+ mesh.GetBlendShapeFrameVertices(shapeIndex, 0, deltaVerts, deltaNormals, deltaTangents);
+ BlitShapeInfo(texture, encodingIndex*2, vertices, normals, tangents, deltaVerts);
+ BlitShapeInfo(texture, encodingIndex*2+1, vertices, normals, tangents, deltaNormals);
+ }
+
+ void BlitShapeInfo(Texture2D texture, float index, Vector3[] v, Vector3[] n, Vector4[] t, Vector3[] d) {
+ Color color;
+ int currentVert=0;
+ for (int y = Mathf.FloorToInt((texture.height/8f)*index); y < Mathf.FloorToInt((texture.height/8f)*(index+1)); y++) {
+ for (int x = 0; x < texture.width; x++) {
+ if (currentVert<d.Length) {
+ Vector3 deltaVert=Vector3.zero;
+ deltaVert = d[currentVert];
+ float tn=Vector3.Project(deltaVert, n[currentVert]).magnitude * Mathf.Sign(Vector3.Dot(deltaVert, n[currentVert]));
+ float tt=Vector3.Project(deltaVert, t[currentVert]).magnitude * Mathf.Sign(Vector3.Dot(deltaVert, t[currentVert]));
+ float tb=Vector3.Project(deltaVert, Vector3.Cross(n[currentVert].normalized, t[currentVert].normalized)).magnitude * Mathf.Sign(Vector3.Dot(deltaVert, Vector3.Cross(n[currentVert].normalized, t[currentVert].normalized)));
+ tn+=1f;
+ tt+=1f;
+ tb+=1f;
+ color = new Color(tn, tt, tb);
+ //Vector3 ntb=ToTangentSpace(deltaVert, n[currentVert], t[currentVert]);
+ //ntb+=Vector3.one;
+ //color = new Color(ntb.x, ntb.y, ntb.z);
+ texture.SetPixel(x, y, color);
+ currentVert++;
+ } else {
+ //texture.SetPixel(x, y, new Color(128f/255f,128f/255f,128f/255f));
+ texture.SetPixel(x, y, new Color(1f,1f,1f));
+ }
+ }
+ }
+ }
+
+ void CreateTexture() {
+ SkinnedMeshRenderer meshRenderer = orifice.GetComponent<SkinnedMeshRenderer>();
+ Mesh mesh = meshRenderer.sharedMesh;
+ if (mesh.tangents.Length<mesh.vertices.Length) {
+ errorInfo="Tangents not available";
+ } else {
+ Texture2D texture = new Texture2D(1024, 1024, TextureFormat.RGBAFloat, false, true);
+ var fillColorArray = texture.GetPixels();
+ for(var i = 0; i < fillColorArray.Length; ++i)
+ {
+ fillColorArray[i] = new Color(1f,1f,1f);
+ }
+ texture.SetPixels( fillColorArray );
+ if (shapes[0]>0) BlitShape(texture, mesh, shapes[0]-1, 0);
+ if (shapes[1]>0) BlitShape(texture, mesh, shapes[1]-1, 1);
+ if (shapes[2]>0) BlitShape(texture, mesh, shapes[2]-1, 2);
+ if (shapes[3]>0) BlitShape(texture, mesh, shapes[3]-1, 3);
+ texture.Apply();
+ AssetDatabase.CreateAsset(texture, "Assets/RalivDynamicPenetrationSystem/MyData/"+orifice.name+".asset");
+ AssetDatabase.SaveAssets();
+ if (orifice.GetComponent<SkinnedMeshRenderer>()!=null) {
+ orificeMaterial.SetTexture("_OrificeData",(Texture2D)AssetDatabase. LoadAssetAtPath("Assets/RalivDynamicPenetrationSystem/MyData/"+orifice.name+".asset",typeof(Texture2D)));
+ }
+ }
+ }
+
+ void FindOrificeMaterial(SkinnedMeshRenderer meshRenderer) {
+ for (int i=0;i<meshRenderer.sharedMaterials.Length;i++) {
+ if (meshRenderer.sharedMaterials[i].HasProperty("_OrificeData")) orificeMaterial=meshRenderer.sharedMaterials[i];
+ }
+ }
+
+ void OnGUI() {
+ GUIStyle textStyle = EditorStyles.label;
+ textStyle.wordWrap = true;
+ if (shapes==null) shapes=new int[4];
+ orifice = (GameObject)EditorGUILayout.ObjectField("Orifice", orifice, typeof(GameObject), true);
+ if (errorInfo!="") EditorGUILayout.HelpBox(errorInfo, MessageType.Error);
+ if (orifice==null) {
+ EditorGUILayout.HelpBox("Drop your orifice object above", MessageType.Info);
+ } else {
+ if (orifice.GetComponent<SkinnedMeshRenderer>()==null) {
+ EditorGUILayout.HelpBox("No skinned mesh renderer detected!", MessageType.Error);
+ } else {
+ if (orificeMaterial==null) {
+ FindOrificeMaterial(orifice.GetComponent<SkinnedMeshRenderer>());
+ if (orificeMaterial==null) EditorGUILayout.HelpBox("Mesh does not have orifice material!", MessageType.Error);
+ } else {
+ EditorGUILayout.LabelField("Select blendshapes for penetration deformations", textStyle);
+ EditorGUILayout.LabelField("", textStyle);
+ EditorGUILayout.LabelField("Entrance", textStyle);
+ shapes[0] = EditorGUILayout.Popup(shapes[0], blendshapeNameList(orifice.GetComponent<SkinnedMeshRenderer>().sharedMesh).ToArray());
+ EditorGUILayout.LabelField("Depth1", textStyle);
+ shapes[1] = EditorGUILayout.Popup(shapes[1], blendshapeNameList(orifice.GetComponent<SkinnedMeshRenderer>().sharedMesh).ToArray());
+ EditorGUILayout.LabelField("Depth2", textStyle);
+ shapes[2] = EditorGUILayout.Popup(shapes[2], blendshapeNameList(orifice.GetComponent<SkinnedMeshRenderer>().sharedMesh).ToArray());
+ EditorGUILayout.LabelField("Depth3", textStyle);
+ shapes[3] = EditorGUILayout.Popup(shapes[3], blendshapeNameList(orifice.GetComponent<SkinnedMeshRenderer>().sharedMesh).ToArray());
+ EditorGUILayout.LabelField("", textStyle);
+ if (GUILayout.Button("Generate Texture")) {
+ CreateTexture();
+ Close();
+ }
+ }
+ }
+ }
+ }
+}
+
+#endif \ No newline at end of file