void LateUpdate() { if (bridge) { // Get the bridge modifier if (mod == null) { mod = bridge.GetComponent <MegaRopeDeform>(); } if (mesh == null) { MeshFilter mf = bridge.GetComponent <MeshFilter>(); mesh = mf.sharedMesh; } if (mod && mesh) { int ax = (int)mod.axis; Vector3 pos = transform.position; // Get into local space Vector3 lpos = mod.transform.worldToLocalMatrix.MultiplyPoint(pos); bool onbridge = true; if (checkonbridge) { if (lpos.x > mesh.bounds.min.x && lpos.x < mesh.bounds.max.x && lpos.z > mesh.bounds.min.z && lpos.z < mesh.bounds.max.z) { onbridge = true; } else { onbridge = false; } } // Are we on the bridge if (onbridge) { // How far across are we float alpha = (lpos[ax] - mod.soft.masses[0].pos.x) / (mod.soft.masses[mod.soft.masses.Count - 1].pos.x - mod.soft.masses[0].pos.x); if (alpha > 0.0f || alpha < 1.0f) { Vector2 rpos = mod.SetWeight(lpos[ax], weight); lpos.y = rpos.y + (offset * 0.01f); // 0.01 is just to make inspector easier to control in my test scene which is obvioulsy very small transform.position = bridge.transform.localToWorldMatrix.MultiplyPoint(lpos); } } else { SetPos(mod, 0.0f); } } } }
void LateUpdate() { if ( bridge ) { // Get the bridge modifier if ( mod == null ) mod = bridge.GetComponent<MegaRopeDeform>(); if ( mesh == null ) { MeshFilter mf = bridge.GetComponent<MeshFilter>(); mesh = mf.sharedMesh; } if ( mod && mesh ) { int ax = (int)mod.axis; Vector3 pos = transform.position; // Get into local space Vector3 lpos = mod.transform.worldToLocalMatrix.MultiplyPoint(pos); bool onbridge = true; if ( checkonbridge ) { if ( lpos.x > mesh.bounds.min.x && lpos.x < mesh.bounds.max.x && lpos.z > mesh.bounds.min.z && lpos.z < mesh.bounds.max.z ) onbridge = true; else onbridge = false; } // Are we on the bridge if ( onbridge ) { // How far across are we float alpha = (lpos[ax] - mod.soft.masses[0].pos.x) / (mod.soft.masses[mod.soft.masses.Count - 1].pos.x - mod.soft.masses[0].pos.x); if ( alpha > 0.0f || alpha < 1.0f ) { Vector2 rpos = mod.SetWeight(lpos[ax], weight); lpos.y = rpos.y + (offset * 0.01f); // 0.01 is just to make inspector easier to control in my test scene which is obvioulsy very small transform.position = bridge.transform.localToWorldMatrix.MultiplyPoint(lpos); } } else { SetPos(mod, 0.0f); } } } }
public float offset = 0.0f; // Character offset //Vector3 lastpos = Vector3.zero; void LateUpdate() { if (bridge) { // Get the bridge modifier if (mod == null) { mod = bridge.GetComponent <MegaRopeDeform>(); } if (mod) { int ax = (int)mod.axis; Vector3 pos = transform.position; // Get into local space Vector3 lpos = mod.transform.worldToLocalMatrix.MultiplyPoint(pos); // Are we on the bridge //if ( lpos.x > mod.bbox.min.x && lpos.x < mod.bbox.max.x && lpos.z > mod.bbox.min.z && lpos.z < mod.bbox.max.z ) //{ // How far across are we //float alpha = (lpos[ax] - mod.bbox.min[ax]) / (mod.bbox.max[ax] - mod.bbox.min[ax]); float alpha = (lpos[ax] - mod.soft.masses[0].pos.x) / (mod.soft.masses[mod.soft.masses.Count - 1].pos.x - mod.soft.masses[0].pos.x); if (alpha > 0.0f || alpha < 1.0f) { //if ( alpha < 0.0f ) // alpha = 0.0f; // Deform the bridge //SetPos(mod, alpha); // Place object on deformed bridge //Vector2 rpos = mod.GetPos3(lpos[ax]); Vector2 rpos = mod.SetWeight(lpos[ax], weight); //lpos[ax] = rpos.x; lpos.y = rpos.y + (offset * 0.01f); // 0.01 is just to make inspector easier to control in my test scene which is obvioulsy very small //lpos.y = mod.GetPos(alpha) + (offset * 0.01f); // 0.01 is just to make inspector easier to control in my test scene which is obvioulsy very small transform.position = bridge.transform.localToWorldMatrix.MultiplyPoint(lpos); } //} //else //{ //SetPos(mod, 0.0f); //} } } }
public float offset = 0.0f; // Character offset //Vector3 lastpos = Vector3.zero; void LateUpdate() { if ( bridge ) { // Get the bridge modifier if ( mod == null ) { mod = bridge.GetComponent<MegaRopeDeform>(); } if ( mod ) { int ax = (int)mod.axis; Vector3 pos = transform.position; // Get into local space Vector3 lpos = mod.transform.worldToLocalMatrix.MultiplyPoint(pos); // Are we on the bridge //if ( lpos.x > mod.bbox.min.x && lpos.x < mod.bbox.max.x && lpos.z > mod.bbox.min.z && lpos.z < mod.bbox.max.z ) //{ // How far across are we //float alpha = (lpos[ax] - mod.bbox.min[ax]) / (mod.bbox.max[ax] - mod.bbox.min[ax]); float alpha = (lpos[ax] - mod.soft.masses[0].pos.x) / (mod.soft.masses[mod.soft.masses.Count - 1].pos.x - mod.soft.masses[0].pos.x); if ( alpha > 0.0f || alpha < 1.0f ) { //if ( alpha < 0.0f ) // alpha = 0.0f; // Deform the bridge //SetPos(mod, alpha); // Place object on deformed bridge //Vector2 rpos = mod.GetPos3(lpos[ax]); Vector2 rpos = mod.SetWeight(lpos[ax], weight); //lpos[ax] = rpos.x; lpos.y = rpos.y + (offset * 0.01f); // 0.01 is just to make inspector easier to control in my test scene which is obvioulsy very small //lpos.y = mod.GetPos(alpha) + (offset * 0.01f); // 0.01 is just to make inspector easier to control in my test scene which is obvioulsy very small transform.position = bridge.transform.localToWorldMatrix.MultiplyPoint(lpos); } //} //else //{ //SetPos(mod, 0.0f); //} } } }
public override bool Inspector() { MegaRopeDeform mod = (MegaRopeDeform)target; //DrawDefaultInspector(); //EditorGUIUtility.LookLikeControls(); //mod.angle = EditorGUILayout.FloatField("Angle", mod.angle); //mod.dir = EditorGUILayout.FloatField("Dir", mod.dir); //mod.axis = (MegaAxis)EditorGUILayout.EnumPopup("Axis", mod.axis); //mod.doRegion = EditorGUILayout.Toggle("Do Region", mod.doRegion); //mod.from = EditorGUILayout.FloatField("From", mod.from); //mod.to = EditorGUILayout.FloatField("To", mod.to); if (GUILayout.Button("Rebuild")) { mod.init = true; } //mod.timeStep = EditorGUILayout.Slider("Time Step", mod.timeStep, 0.001f, 0.2f); mod.floorOff = EditorGUILayout.FloatField("Floor Off", mod.floorOff); mod.NumMasses = EditorGUILayout.IntField("Num Masses", mod.NumMasses); if (mod.NumMasses < 2) { mod.NumMasses = 2; } mod.Mass = EditorGUILayout.FloatField("Mass", mod.Mass); if (mod.Mass < 0.01f) { mod.Mass = 0.01f; } mod.axis = (MegaAxis)EditorGUILayout.EnumPopup("Axis", mod.axis); mod.stiffnessCrv = EditorGUILayout.CurveField("Stiffness Crv", mod.stiffnessCrv); mod.stiffspring = EditorGUILayout.FloatField("Stiff Spring", mod.stiffspring); mod.stiffdamp = EditorGUILayout.FloatField("Stiff Damp", mod.stiffdamp); mod.spring = EditorGUILayout.FloatField("Spring", mod.spring); mod.damp = EditorGUILayout.FloatField("Damp", mod.damp); mod.off = EditorGUILayout.FloatField("Off", mod.off); mod.SpringCompress = EditorGUILayout.FloatField("Spring Compress", mod.SpringCompress); mod.BendSprings = EditorGUILayout.Toggle("Bend Springs", mod.BendSprings); mod.Constraints = EditorGUILayout.Toggle("Constraints", mod.Constraints); mod.DampingRatio = EditorGUILayout.FloatField("Damping Ratio", mod.DampingRatio); mod.left = (Transform)EditorGUILayout.ObjectField("Left", mod.left, typeof(Transform), true); mod.right = (Transform)EditorGUILayout.ObjectField("Right", mod.right, typeof(Transform), true); mod.weight = EditorGUILayout.FloatField("Weight", mod.weight); mod.weightPos = EditorGUILayout.FloatField("Weight Pos", mod.weightPos); showsoft = EditorGUILayout.Foldout(showsoft, "Physics"); if (showsoft) { mod.soft.timeStep = EditorGUILayout.Slider("Time Step", mod.soft.timeStep, 0.001f, 0.2f); mod.soft.gravity = EditorGUILayout.Vector3Field("Gravity", mod.soft.gravity); mod.soft.airdrag = EditorGUILayout.FloatField("Air Drag", mod.soft.airdrag); mod.soft.friction = EditorGUILayout.FloatField("Friction", mod.soft.friction); mod.soft.iters = EditorGUILayout.IntField("Iterations", mod.soft.iters); mod.soft.method = (MegaIntegrator)EditorGUILayout.EnumPopup("Method", mod.soft.method); mod.soft.applyConstraints = EditorGUILayout.Toggle("Apply Constraints", mod.soft.applyConstraints); } mod.DisplayDebug = EditorGUILayout.BeginToggleGroup("Display Debug", mod.DisplayDebug); mod.drawsteps = EditorGUILayout.IntField("Draw Steps", mod.drawsteps); mod.boxsize = EditorGUILayout.FloatField("Box Size", mod.boxsize); EditorGUILayout.EndToggleGroup(); return(false); }
public void SetPos(MegaRopeDeform mod, float alpha) { mod.weightPos = alpha * 100.0f; mod.weight = weight; }