void PlaceRopes() { GameObject staticContainer = new GameObject(); staticContainer.name = "Ropes"; staticContainer.transform.SetParent(world.transform); int ropenum = 1; foreach (SourceEntity ent in entities) { if (ent.GetStringValue("classname") != "keyframe_rope" && ent.GetStringValue("classname") != "move_rope") { continue; } SourceEntity next = GetSourceEntityByName(ent.GetStringValue("NextKey")); if (next == null) { continue; } GameObject ropeRoot = Instantiate(ropePrefab); RopeSim rope = ropeRoot.GetComponentInChildren <RopeSim> (); rope.start.position = SourceToUnityPosition(ent.GetVectorValue("origin")); rope.end.position = SourceToUnityPosition(next.GetVectorValue("origin")); ropeRoot.transform.SetParent(staticContainer.transform); ropeRoot.name = "Rope" + ropenum; ropenum++; } }
void Start() { ropesim = GetComponent <RopeSim>(); SkinnedMeshRenderer renderer = GetComponent <SkinnedMeshRenderer>(); if (!ropesim.sane) { if (renderer.sharedMesh != null) { renderer.sharedMesh.Clear(); renderer.sharedMesh = null; } return; } Mesh mesh = new Mesh(); int parts = (int)(Vector3.Distance(ropesim.start.position, ropesim.end.position) * ropesim.boneDensity); List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); List <int> tris = new List <int>(); List <BoneWeight> weights = new List <BoneWeight>(); float distMultiplier = Vector3.Distance(ropesim.start.position, ropesim.end.position) / (float)parts; // End cap BoneWeight capweight = new BoneWeight(); capweight.boneIndex0 = ropesim.bones.Count - 1; capweight.weight0 = 1f; verts.Add(new Vector3(-radius, ((float)parts) * distMultiplier, -radius)); weights.Add(capweight); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(-radius, ((float)parts) * distMultiplier, radius)); weights.Add(capweight); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(radius, ((float)parts) * distMultiplier, radius)); weights.Add(capweight); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(-radius, ((float)parts) * distMultiplier, -radius)); weights.Add(capweight); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(radius, ((float)parts) * distMultiplier, radius)); weights.Add(capweight); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(radius, ((float)parts) * distMultiplier, -radius)); weights.Add(capweight); uvs.Add(new Vector2(1, 0)); capweight.boneIndex0 = 0; capweight.weight0 = 1f; verts.Add(new Vector3(-radius, 0, -radius)); weights.Add(capweight); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(radius, 0, radius)); weights.Add(capweight); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(-radius, 0, radius)); weights.Add(capweight); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(-radius, 0, -radius)); weights.Add(capweight); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(radius, 0, -radius)); weights.Add(capweight); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(radius, 0, radius)); weights.Add(capweight); uvs.Add(new Vector2(1, 1)); for (int i = 0; i < parts; i++) { BoneWeight w1 = new BoneWeight(); if (i == parts || i == 0) { w1.boneIndex0 = i; w1.weight0 = 1f; } else { w1.boneIndex0 = i - 1; w1.weight0 = 1f / 4f; w1.boneIndex1 = i; w1.weight1 = 2f / 4f; w1.boneIndex2 = i + 1; w1.weight2 = 1f / 4f; } BoneWeight w2 = new BoneWeight(); if (i + 1 == parts) { w2.boneIndex0 = i + 1; w2.weight0 = 1f; } else { w2.boneIndex0 = i; w2.weight0 = 1f / 4f; w2.boneIndex1 = i + 1; w2.weight1 = 2f / 4f; w2.boneIndex2 = i + 2; w2.weight2 = 1f / 4f; } verts.Add(new Vector3(-radius, i * distMultiplier, -radius)); weights.Add(w1); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(radius, i * distMultiplier, -radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(radius, i * distMultiplier, -radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(radius, i * distMultiplier, -radius)); weights.Add(w1); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(radius, (i + 1) * distMultiplier, radius)); weights.Add(w2); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(-radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(radius, (i + 1) * distMultiplier, radius)); weights.Add(w2); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(-radius, i * distMultiplier, -radius)); weights.Add(w1); uvs.Add(new Vector2(0, 0)); verts.Add(new Vector3(-radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); verts.Add(new Vector3(-radius, i * distMultiplier, radius)); weights.Add(w1); uvs.Add(new Vector2(1, 0)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, radius)); weights.Add(w2); uvs.Add(new Vector2(1, 1)); verts.Add(new Vector3(-radius, (i + 1) * distMultiplier, -radius)); weights.Add(w2); uvs.Add(new Vector2(0, 1)); } mesh.vertices = verts.ToArray(); mesh.uv = uvs.ToArray(); for (int i = 0; i < verts.Count; i += 3) { tris.Add(i); tris.Add(i + 1); tris.Add(i + 2); } mesh.triangles = tris.ToArray(); mesh.RecalculateNormals(); mesh.boneWeights = weights.ToArray(); List <Matrix4x4> bindPoses = new List <Matrix4x4>(); foreach (Transform bone in ropesim.bones) { bindPoses.Add(bone.worldToLocalMatrix * transform.localToWorldMatrix); } mesh.bindposes = bindPoses.ToArray(); renderer.bones = ropesim.bones.ToArray(); if (renderer.sharedMesh != null) { renderer.sharedMesh.Clear(); } renderer.sharedMesh = mesh; TextAsset t = AssetDatabase.LoadAssetAtPath <TextAsset>("Assets/" + transform.parent.gameObject.name + ".txt") as TextAsset; if (t) { MatchCollection matches = Regex.Matches(t.text, @"-?\d+\.?\d*"); Vector3 center = new Vector3(float.Parse(matches [0].Value), float.Parse(matches [1].Value), float.Parse(matches [2].Value)); Vector3 extents = new Vector3(float.Parse(matches [3].Value), float.Parse(matches [4].Value), float.Parse(matches [5].Value)); renderer.localBounds = new Bounds(center, extents); AssetDatabase.DeleteAsset("Assets/" + transform.parent.gameObject.name + ".txt"); } }