private void CreatePointJoints() { var vertices = provider.GetVertices(); var sizeY = settings.StandsSettings.Segments; if (pointJoints == null) { pointJoints = new GPPointJoint[vertices.Count]; } for (var i = 0; i < vertices.Count; i++) { var vertex = vertices[i]; var matrixId = settings.StandsSettings.Provider.GetScalpMeshType() == ScalpMeshType.Skinned ? i / sizeY : 0; var t = i % sizeY; var elasticity = t == 0 ? 1f : Mathf.Clamp01(1 - settings.PhysicsSettings.ElasticityCurve.Evaluate((float)t / sizeY)); elasticity += JointAreaAdd(vertex); pointJoints[i] = new GPPointJoint(i, matrixId, vertex, Mathf.Clamp01(elasticity)); } }
public void AddPointJoint(GPBody body, Vector3 point, Matrix4x4 matrix, float elasticity) { var bodyId = Array.IndexOf(bodies, body); Assert.IsTrue(bodyId >= 0, "Add body to world first"); var joint = new GPPointJoint(bodyId, matrices.Length, point, elasticity); ArrayUtils.Add(ref pointJoints, joint); ArrayUtils.Add(ref matrices, matrix); }
private void InitBuffers() { TryAddBufferOrArray("matrices", data.MatricesBuffer, data.Matrices, sizeof(float) * 16); TryCreateBuffer("bodies", data.Bodies, GPBody.Size()); TryCreateBuffer("sphereColliders", data.SphereColliders, GPSphereCollider.Size()); TryCreateBuffer("kinematicBodies", data.KinematicsBodies, GPBody.Size()); TryCreateBuffer("kinematicSphereColliders", data.KinematicsSphereColliders, GPSphereCollider.Size()); TryCreateBuffer("kinematicsLineSphereColliders", data.KinematicsLineSphereColliders, GPLineSphereCollider.Size()); TryCreateBuffer("distanceJoints", data.DistanceJoints.Data, GPDistanceJoint.Size()); TryCreateBuffer("pointJoints", data.PointJoints, GPPointJoint.Size()); bodiesThreadGroupsNum = Mathf.CeilToInt(wraper.GetBuffer("bodies").count / 1024f); }