private void OnDrawGizmosSelected() { if (!((Behaviour)this).get_enabled() || Object.op_Equality((Object)this.m_Root, (Object)null)) { return; } if (Application.get_isEditor() && !Application.get_isPlaying() && ((Component)this).get_transform().get_hasChanged()) { this.InitTransforms(); this.SetupParticles(); } Gizmos.set_color(Color.get_white()); foreach (DynamicBone_Ver01.Particle particle1 in this.m_Particles) { if (particle1.m_ParentIndex >= 0) { DynamicBone_Ver01.Particle particle2 = this.m_Particles[particle1.m_ParentIndex]; Gizmos.DrawLine(particle1.m_Position, particle2.m_Position); } if ((double)particle1.m_Radius > 0.0) { Gizmos.DrawWireSphere(particle1.m_Position, particle1.m_Radius * this.m_ObjectScale); } } }
private void UpdateParticles2() { for (int index = 1; index < this.m_Particles.Count; ++index) { DynamicBone_Ver01.Particle particle1 = this.m_Particles[index]; DynamicBone_Ver01.Particle particle2 = this.m_Particles[particle1.m_ParentIndex]; float num1; if (Object.op_Inequality((Object)particle1.m_Transform, (Object)null)) { Vector3 vector3 = Vector3.op_Subtraction(particle2.m_Transform.get_position(), particle1.m_Transform.get_position()); num1 = ((Vector3) ref vector3).get_magnitude(); } else { num1 = ((Vector3) ref particle1.m_EndOffset).get_magnitude() * this.m_ObjectScale; } float num2 = Mathf.Lerp(1f, particle1.m_Stiffness, this.m_Weight); if ((double)num2 > 0.0 || (double)particle1.m_Elasticity > 0.0) { Matrix4x4 localToWorldMatrix = particle2.m_Transform.get_localToWorldMatrix(); ((Matrix4x4) ref localToWorldMatrix).SetColumn(3, Vector4.op_Implicit(particle2.m_Position)); Vector3 vector3_1 = !Object.op_Inequality((Object)particle1.m_Transform, (Object)null) ? ((Matrix4x4) ref localToWorldMatrix).MultiplyPoint3x4(particle1.m_EndOffset) : ((Matrix4x4) ref localToWorldMatrix).MultiplyPoint3x4(particle1.m_LocalPosition); Vector3 vector3_2 = Vector3.op_Subtraction(vector3_1, particle1.m_Position); DynamicBone_Ver01.Particle particle3 = particle1; particle3.m_Position = Vector3.op_Addition(particle3.m_Position, Vector3.op_Multiply(vector3_2, particle1.m_Elasticity)); if ((double)num2 > 0.0) { Vector3 vector3_3 = Vector3.op_Subtraction(vector3_1, particle1.m_Position); float magnitude = ((Vector3) ref vector3_3).get_magnitude(); float num3 = (float)((double)num1 * (1.0 - (double)num2) * 2.0); if ((double)magnitude > (double)num3) { DynamicBone_Ver01.Particle particle4 = particle1; particle4.m_Position = Vector3.op_Addition(particle4.m_Position, Vector3.op_Multiply(vector3_3, (magnitude - num3) / magnitude)); } } } float particleRadius = particle1.m_Radius * this.m_ObjectScale; foreach (DynamicBoneCollider collider in this.m_Colliders) { if (Object.op_Inequality((Object)collider, (Object)null) && ((Behaviour)collider).get_enabled()) { collider.Collide(ref particle1.m_Position, particleRadius); } } Vector3 vector3_4 = Vector3.op_Subtraction(particle2.m_Position, particle1.m_Position); float magnitude1 = ((Vector3) ref vector3_4).get_magnitude(); if ((double)magnitude1 > 0.0) { DynamicBone_Ver01.Particle particle3 = particle1; particle3.m_Position = Vector3.op_Addition(particle3.m_Position, Vector3.op_Multiply(vector3_4, (magnitude1 - num1) / magnitude1)); } } }
private void SkipUpdateParticles() { foreach (DynamicBone_Ver01.Particle particle1 in this.m_Particles) { if (particle1.m_ParentIndex >= 0) { Vector3 vector3_1 = Vector3.op_Multiply(this.m_ObjectMove, particle1.m_Inert); DynamicBone_Ver01.Particle particle2 = particle1; particle2.m_PrevPosition = Vector3.op_Addition(particle2.m_PrevPosition, vector3_1); DynamicBone_Ver01.Particle particle3 = particle1; particle3.m_Position = Vector3.op_Addition(particle3.m_Position, vector3_1); DynamicBone_Ver01.Particle particle4 = this.m_Particles[particle1.m_ParentIndex]; float num1; if (Object.op_Inequality((Object)particle1.m_Transform, (Object)null)) { Vector3 vector3_2 = Vector3.op_Subtraction(particle4.m_Transform.get_position(), particle1.m_Transform.get_position()); num1 = ((Vector3) ref vector3_2).get_magnitude(); } else { num1 = ((Vector3) ref particle1.m_EndOffset).get_magnitude() * this.m_ObjectScale; } float num2 = Mathf.Lerp(1f, particle1.m_Stiffness, this.m_Weight); if ((double)num2 > 0.0) { Matrix4x4 localToWorldMatrix = particle4.m_Transform.get_localToWorldMatrix(); ((Matrix4x4) ref localToWorldMatrix).SetColumn(3, Vector4.op_Implicit(particle4.m_Position)); Vector3 vector3_2 = Vector3.op_Subtraction(!Object.op_Inequality((Object)particle1.m_Transform, (Object)null) ? ((Matrix4x4) ref localToWorldMatrix).MultiplyPoint3x4(particle1.m_EndOffset) : ((Matrix4x4) ref localToWorldMatrix).MultiplyPoint3x4(particle1.m_Transform.get_localPosition()), particle1.m_Position); float magnitude = ((Vector3) ref vector3_2).get_magnitude(); float num3 = (float)((double)num1 * (1.0 - (double)num2) * 2.0); if ((double)magnitude > (double)num3) { DynamicBone_Ver01.Particle particle5 = particle1; particle5.m_Position = Vector3.op_Addition(particle5.m_Position, Vector3.op_Multiply(vector3_2, (magnitude - num3) / magnitude)); } } Vector3 vector3_3 = Vector3.op_Subtraction(particle4.m_Position, particle1.m_Position); float magnitude1 = ((Vector3) ref vector3_3).get_magnitude(); if ((double)magnitude1 > 0.0) { DynamicBone_Ver01.Particle particle5 = particle1; particle5.m_Position = Vector3.op_Addition(particle5.m_Position, Vector3.op_Multiply(vector3_3, (magnitude1 - num1) / magnitude1)); } } else { particle1.m_PrevPosition = particle1.m_Position; particle1.m_Position = particle1.m_Transform.get_position(); } } }
private DynamicBone_Ver01.Particle AppendParticles( DynamicBone_Ver01.BoneNode b, int parentIndex, float boneLength) { DynamicBone_Ver01.Particle particle = new DynamicBone_Ver01.Particle(); particle.m_Transform = b.Transform; particle.m_bRotationCalc = b.RotationCalc; particle.m_ParentIndex = parentIndex; if (Object.op_Inequality((Object)b.Transform, (Object)null)) { particle.m_Position = particle.m_PrevPosition = b.Transform.get_position(); particle.m_InitLocalPosition = b.Transform.get_localPosition(); particle.m_InitLocalRotation = b.Transform.get_localRotation(); particle.m_InitEuler = b.Transform.get_localEulerAngles(); if (parentIndex >= 0) { this.CalcLocalPosition(particle, this.m_Particles[parentIndex]); } } else { Transform transform = this.m_Particles[parentIndex].m_Transform; if ((double)this.m_EndLength > 0.0) { Transform parent = transform.get_parent(); particle.m_EndOffset = !Object.op_Inequality((Object)parent, (Object)null) ? new Vector3(this.m_EndLength, 0.0f, 0.0f) : Vector3.op_Multiply(transform.InverseTransformPoint(Vector3.op_Subtraction(Vector3.op_Multiply(transform.get_position(), 2f), parent.get_position())), this.m_EndLength); } else { particle.m_EndOffset = this.m_EndOffset; } particle.m_Position = particle.m_PrevPosition = transform.TransformPoint(particle.m_EndOffset); } if (parentIndex >= 0) { double num = (double)boneLength; Vector3 vector3 = Vector3.op_Subtraction(this.m_Particles[parentIndex].m_Transform.get_position(), particle.m_Position); double magnitude = (double)((Vector3) ref vector3).get_magnitude(); boneLength = (float)(num + magnitude); particle.m_BoneLength = boneLength; this.m_BoneTotalLength = Mathf.Max(this.m_BoneTotalLength, boneLength); } this.m_Particles.Add(particle); return(particle); }
private void UpdateParticles1() { Vector3 vector3_1 = Vector3.op_Multiply(Vector3.op_Addition(this.m_Gravity, this.m_Force), this.m_ObjectScale); foreach (DynamicBone_Ver01.Particle particle1 in this.m_Particles) { if (particle1.m_ParentIndex >= 0) { Vector3 vector3_2 = Vector3.op_Subtraction(particle1.m_Position, particle1.m_PrevPosition); Vector3 vector3_3 = Vector3.op_Multiply(this.m_ObjectMove, particle1.m_Inert); particle1.m_PrevPosition = Vector3.op_Addition(particle1.m_Position, vector3_3); DynamicBone_Ver01.Particle particle2 = particle1; particle2.m_Position = Vector3.op_Addition(particle2.m_Position, Vector3.op_Addition(Vector3.op_Addition(Vector3.op_Multiply(vector3_2, 1f - particle1.m_Damping), vector3_1), vector3_3)); } else { particle1.m_PrevPosition = particle1.m_Position; particle1.m_Position = particle1.m_Transform.get_position(); } } }
private void ApplyParticlesToTransforms() { for (int index = 1; index < this.m_Particles.Count; ++index) { DynamicBone_Ver01.Particle particle1 = this.m_Particles[index]; DynamicBone_Ver01.Particle particle2 = this.m_Particles[particle1.m_ParentIndex]; if (particle2.m_bRotationCalc) { Vector3 vector3_1 = !Object.op_Inequality((Object)particle1.m_Transform, (Object)null) ? particle1.m_EndOffset : particle1.m_LocalPosition; Vector3 vector3_2 = Vector3.op_Subtraction(particle1.m_Position, particle2.m_Position); Quaternion quaternion = Quaternion.FromToRotation(particle2.m_Transform.TransformDirection(vector3_1), vector3_2); float num; Vector3 vector3_3; ((Quaternion) ref quaternion).ToAngleAxis(ref num, ref vector3_3); num *= particle1.m_AddAngleScale; quaternion = Quaternion.AngleAxis(num, vector3_3); particle2.m_Transform.set_rotation(Quaternion.op_Multiply(quaternion, particle2.m_Transform.get_rotation())); } if (Object.op_Implicit((Object)particle1.m_Transform)) { particle1.m_Transform.set_position(particle1.m_Position); } } }
private void CalcLocalPosition( DynamicBone_Ver01.Particle particle, DynamicBone_Ver01.Particle parent) { particle.m_LocalPosition = parent.m_Transform.InverseTransformPoint(particle.m_Position); }
public void SetupParticles() { this.m_Particles.Clear(); if (Object.op_Equality((Object)this.m_Root, (Object)null) && this.m_Nodes.Count > 0) { this.m_Root = this.m_Nodes[0].Transform; } if (Object.op_Equality((Object)this.m_Root, (Object)null)) { return; } this.m_ObjectScale = (float)((Component)this).get_transform().get_lossyScale().x; this.m_ObjectPrevPosition = ((Component)this).get_transform().get_position(); this.m_ObjectMove = Vector3.get_zero(); this.m_BoneTotalLength = 0.0f; DynamicBone_Ver01.Particle particle1 = (DynamicBone_Ver01.Particle)null; int parentIndex = -1; foreach (DynamicBone_Ver01.BoneNode node in this.m_Nodes) { float boneLength = particle1 == null ? 0.0f : particle1.m_BoneLength; particle1 = this.AppendParticles(node, parentIndex, boneLength); ++parentIndex; } if ((double)this.m_EndLength > 0.0 || (double)((Vector3) ref this.m_EndOffset).get_magnitude() != 0.0) { this.AppendParticles(new DynamicBone_Ver01.BoneNode(), parentIndex, particle1.m_BoneLength); } float num1 = this.m_Particles.Count > 1 ? 1f / (float)(this.m_Particles.Count - 1) : 0.0f; float num2 = 0.0f; foreach (DynamicBone_Ver01.Particle particle2 in this.m_Particles) { particle2.m_Damping = this.m_Damping; particle2.m_Elasticity = this.m_Elasticity; particle2.m_Stiffness = this.m_Stiffness; particle2.m_Inert = this.m_Inert; particle2.m_Radius = this.m_Radius; particle2.m_AddAngleScale = this.m_AddAngleScale; if (this.m_DampingDistrib.get_keys().Length > 0) { particle2.m_Damping *= this.m_DampingDistrib.Evaluate(num2); } if (this.m_ElasticityDistrib.get_keys().Length > 0) { particle2.m_Elasticity *= this.m_ElasticityDistrib.Evaluate(num2); } if (this.m_StiffnessDistrib.get_keys().Length > 0) { particle2.m_Stiffness *= this.m_StiffnessDistrib.Evaluate(num2); } if (this.m_InertDistrib.get_keys().Length > 0) { particle2.m_Inert *= this.m_InertDistrib.Evaluate(num2); } if (this.m_RadiusDistrib.get_keys().Length > 0) { particle2.m_Radius *= this.m_RadiusDistrib.Evaluate(num2); } if (this.m_AddAngleScaleDistrib.get_keys().Length > 0) { particle2.m_AddAngleScale *= this.m_AddAngleScaleDistrib.Evaluate(num2); } num2 += num1; particle2.m_Damping = Mathf.Clamp01(particle2.m_Damping); particle2.m_Elasticity = Mathf.Clamp01(particle2.m_Elasticity); particle2.m_Stiffness = Mathf.Clamp01(particle2.m_Stiffness); particle2.m_Inert = Mathf.Clamp01(particle2.m_Inert); particle2.m_Radius = Mathf.Max(particle2.m_Radius, 0.0f); particle2.m_AddAngleScale = Mathf.Max(particle2.m_AddAngleScale, 0.0f); } }