Skip to content

Commit 98c084d

Browse files
[src] Start work on factorizing code in SofaSphereCollision and fix code (#245)
* SURG4D-42 #time 10h * [src] Add method to setNbrVertices to a mechanicalObject * [src] Add Debug option to draw sofa positions as spheres * [src] Start work on factorizing code in SofaSphereCollision and fix code * fix map size * backup last changes on sphereCollision refactoring * [src] Update SofaSphereCollision to use existing SOFA component as the registration is not working right now in SofaVerseAPI * [src] Update SofaSphereCollisionObject to match the change of SofaSphereCollision (names are very bad) * Add demo scene * added link for sofaSphereCollisionObject script in demo * Less quality mesh for a faster scene --------- Co-authored-by: PierreFonda3D <pierre.fonda@infinytech3d.com>
1 parent e4850b5 commit 98c084d

9 files changed

Lines changed: 8643 additions & 251 deletions

File tree

Core/Plugins/SofaUnityAPI/BaseAPI/SofaBaseMeshAPI.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,20 @@ public virtual void UpdateTexCoords(Mesh mesh)
848848
}
849849

850850

851+
/// <summary> Method to set the number of vertices to this Mesh Object. </summary>
852+
/// <param name="nbr"> Number of vertices </param>
853+
public void SetNumberOfVertices(int nbr)
854+
{
855+
if (!m_isReady)
856+
return;
857+
858+
int res = sofaMeshAPI_setNbVertices(m_simu, m_name, nbr);
859+
860+
if (res < 0)
861+
Debug.LogError("SofaBaseMeshAPI SetNumberOfVertices: " + m_name + " " + SofaDefines.msg_error[res]);
862+
}
863+
864+
851865
/// Method to set new vertices position to this mesh
852866
public void SetPositions(Vector3[] vertices, Transform sofaTransform)
853867
{
@@ -867,7 +881,7 @@ public void SetPositions(Vector3[] vertices, Transform sofaTransform)
867881

868882
int resUpdate = sofaMeshAPI_setVertices(m_simu, m_name, val);
869883
if (resUpdate < 0)
870-
Debug.LogError("SofaBaseMeshAPI updateMesh: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
884+
Debug.LogError("SofaBaseMeshAPI SetPositions: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
871885

872886
}
873887

@@ -878,7 +892,7 @@ public void SetRawPositions(float[] vertices)
878892

879893
int resUpdate = sofaMeshAPI_setVertices(m_simu, m_name, vertices);
880894
if (resUpdate < 0)
881-
Debug.LogError("SofaBaseMeshAPI updateMesh: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
895+
Debug.LogError("SofaBaseMeshAPI SetRawPositions: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
882896

883897
}
884898

@@ -889,7 +903,7 @@ public void SetRawVelocities(float[] values)
889903

890904
int resUpdate = sofaMeshAPI_setVelocities(m_simu, m_name, values);
891905
if (resUpdate < 0)
892-
Debug.LogError("SofaBaseMeshAPI updateMesh: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
906+
Debug.LogError("SofaBaseMeshAPI SetRawVelocities: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
893907

894908
}
895909

@@ -912,7 +926,7 @@ public void SetRawRestPositions(float[] vertices)
912926

913927
int resUpdate = sofaMeshAPI_setRestPositions(m_simu, m_name, vertices);
914928
if (resUpdate < 0)
915-
Debug.LogError("SofaBaseMeshAPI updateMesh: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
929+
Debug.LogError("SofaBaseMeshAPI SetRawRestPositions: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
916930

917931
}
918932

@@ -935,7 +949,7 @@ public void SetVelocities(Vector3[] vels)
935949

936950
int resUpdate = sofaMeshAPI_setVelocities(m_simu, m_name, val);
937951
if (resUpdate < 0)
938-
Debug.LogError("SofaBaseMeshAPI updateMesh: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
952+
Debug.LogError("SofaBaseMeshAPI SetVelocities: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
939953

940954
}
941955

@@ -951,7 +965,7 @@ public void SetNewPosition(Vector3 value)
951965
val[2] = value[2];
952966
int resUpdate = sofaMeshAPI_setVertices(m_simu, m_name, val);
953967
if (resUpdate < 0)
954-
Debug.LogError("SofaBaseMeshAPI updateMesh: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
968+
Debug.LogError("SofaBaseMeshAPI SetNewPosition: " + m_name + " return error: " + SofaDefines.msg_error[resUpdate]);
955969

956970
}
957971

Core/Scripts/Core/Components/SofaMesh.cs

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,20 @@ public int GetTopologyRevision()
133133
return m_sofaMeshAPI.GetTopologyRevision();
134134
}
135135

136+
public void setNbrVertices(int _nbVertices)
137+
{
138+
if (m_sofaMeshAPI != null)
139+
{
140+
m_sofaMeshAPI.SetNumberOfVertices(_nbVertices);
141+
142+
// First check if topology has changed and handle it
143+
HandleTopologyChange();
144+
145+
// Then update the topology and vertices positions
146+
UpdateTopology();
147+
}
148+
}
149+
136150
/// Method to set new vertices position to this mesh
137151
public void SetPositions(Vector3[] vertices)
138152
{
@@ -508,20 +522,62 @@ public bool DrawForces
508522
}
509523
}
510524

525+
526+
private bool drawDebugPositions = false;
527+
public bool DrawDebugPositions
528+
{
529+
get { return drawDebugPositions; }
530+
set
531+
{
532+
if (drawDebugPositions == value)
533+
return;
534+
535+
drawDebugPositions = value;
536+
if (drawDebugPositions)
537+
{
538+
m_listenerCounter++;
539+
}
540+
else
541+
m_listenerCounter--;
542+
}
543+
}
544+
511545
void OnDrawGizmosSelected()
512546
{
513-
if (!drawForces)
514-
return;
547+
if (drawDebugPositions)
548+
{
549+
Gizmos.color = Color.green;
550+
if (m_topology != null && m_topology.m_mesh != null)
551+
{
552+
for (int i = 0; i < m_topology.m_mesh.vertexCount; i++)
553+
{
554+
Vector3 pos = m_topology.m_mesh.vertices[i];
555+
Gizmos.DrawSphere(pos, 0.5f);
556+
}
557+
}
558+
else if (m_unityVertices != null)
559+
{
560+
for (int i = 0; i < m_unityVertices.Length; i++)
561+
{
562+
Vector3 pos = m_unityVertices[i];
563+
Gizmos.DrawSphere(pos, 0.5f);
564+
}
565+
}
566+
}
567+
515568

516569
if (m_topology == null|| m_topology.m_mesh == null)
517570
return;
518571

519-
Gizmos.color = Color.red;
520-
for (int i=0; i< m_topology.m_mesh.vertexCount; i++)
572+
if (drawForces && forces != null)
521573
{
522-
Vector3 startPos = m_topology.m_mesh.vertices[i];
523-
Vector3 endPos = startPos + forces[i].normalized;
524-
Gizmos.DrawLine(startPos, endPos);
574+
Gizmos.color = Color.red;
575+
for (int i = 0; i < m_topology.m_mesh.vertexCount; i++)
576+
{
577+
Vector3 startPos = m_topology.m_mesh.vertices[i];
578+
Vector3 endPos = startPos + forces[i].normalized;
579+
Gizmos.DrawLine(startPos, endPos);
580+
}
525581
}
526582

527583
}

Core/Scripts/Editor/Components/SofaMeshEditor.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,12 @@ public override void OnInspectorGUI()
2020

2121
SofaMesh compo = (SofaMesh)this.target;
2222

23-
EditorGUILayout.IntField("Nb Points", compo.NbVertices());
24-
25-
if (!compo.HasTopology())
26-
return;
27-
28-
EditorGUILayout.Separator();
29-
3023
EditorGUI.BeginDisabledGroup(true);
3124
TopologyObjectType type = compo.TopologyType();
3225
EditorGUILayout.EnumPopup("MeshTopology Type", type);
3326

27+
EditorGUILayout.IntField("Nb Points", compo.NbVertices());
28+
3429
if (type == TopologyObjectType.HEXAHEDRON)
3530
{
3631
EditorGUILayout.IntField("Nb Hexahedra", compo.NbHexahedra());
@@ -48,10 +43,12 @@ public override void OnInspectorGUI()
4843
{
4944
EditorGUILayout.IntField("Nb Edges", compo.NbEdges());
5045
}
46+
EditorGUI.EndDisabledGroup();
5147

52-
compo.DrawForces = EditorGUILayout.Toggle("DrawGizmoForces", compo.DrawForces);
5348

54-
EditorGUI.EndDisabledGroup();
49+
EditorGUILayout.Separator();
50+
compo.DrawForces = EditorGUILayout.Toggle("DrawGizmoForces", compo.DrawForces);
51+
compo.DrawDebugPositions = EditorGUILayout.Toggle("DrawDebugPositions", compo.DrawDebugPositions);
5552
}
5653
}
5754
}

Core/Scripts/Editor/Objects/SofaSphereCollisionObjectEditor.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,23 @@ public class SofaSphereCollisionObjectEditor : SofaMeshObjectEditor
7272

7373
public override void OnInspectorGUI()
7474
{
75+
SofaSphereCollisionObject model = (SofaSphereCollisionObject)this.target;
7576

77+
model.m_sofaMesh = (SofaMesh)EditorGUILayout.ObjectField("Hand SOFA mesh",
78+
model.m_sofaMesh, typeof(SofaMesh), true);
7679

77-
SofaSphereCollisionObject model = (SofaSphereCollisionObject)this.target;
78-
model.parentT = (GameObject)EditorGUILayout.ObjectField("Parent Gameobject to mirror position", model.parentT, typeof(GameObject), true);
79-
model.UsePositionOnly = EditorGUILayout.Toggle("Use Object Position Only (1 dof)", model.UsePositionOnly);
80+
model.m_sphereModel = (SofaCollisionModel)EditorGUILayout.ObjectField("Hand SOFA collision spheres",
81+
model.m_sphereModel, typeof(SofaCollisionModel), true);
82+
83+
84+
model.SofaSphereCollision.ParentT = (GameObject)EditorGUILayout.ObjectField("Parent Gameobject to mirror position", model.SofaSphereCollision.ParentT, typeof(GameObject), true);
8085
model.Factor = EditorGUILayout.Slider("Interpolation factor", model.Factor, 1, 100);
81-
model.Radius = EditorGUILayout.Slider("Sphere radius", model.Radius, 0.001f, 10);
82-
model.Activated = EditorGUILayout.Toggle("Activate collision", model.Activated);
83-
model.Stiffness = EditorGUILayout.Slider("Contact stiffness", model.Stiffness, 1, 5000);
84-
model.m_startOnPlay = EditorGUILayout.Toggle("Start on Play", model.m_startOnPlay);
86+
model.SofaSphereCollision.Radius = EditorGUILayout.Slider("Sphere radius", model.SofaSphereCollision.Radius, 0.001f, 10);
87+
model.SofaSphereCollision.Activated = EditorGUILayout.Toggle("Activate collision", model.SofaSphereCollision.Activated);
88+
model.SofaSphereCollision.Stiffness = EditorGUILayout.Slider("Contact stiffness", model.SofaSphereCollision.Stiffness, 1, 5000);
89+
model.SofaSphereCollision.StartOnPlay = EditorGUILayout.Toggle("Start on Play", model.SofaSphereCollision.StartOnPlay);
8590

86-
EditorGUILayout.LabelField("Number of spheres", model.NbrSpheres.ToString());
91+
EditorGUILayout.LabelField("Number of spheres", model.SofaSphereCollision.NbrSpheres.ToString());
8792
}
8893
}
8994
}

0 commit comments

Comments
 (0)