/// <summary> /// Called when free mode is selected for the first time - copies all existing points to /// the free mode configuration /// </summary> public void OnCopyToFreeModeSelected() { if(IsSpriteValid()) { m_FreeModeBodyPositions.Clear(); m_FreeModeBodyRadii.Clear(); m_FreeModeBodyKinematic.Clear(); Bounds spriteBounds = GetSpriteBounds(); float width = spriteBounds.size.x * m_SoftBodyScale.x * m_SpriteScale.x; float height = spriteBounds.size.y * m_SoftBodyScale.y * m_SpriteScale.y; switch(m_Style) { case PhysicsStyle.Circle: { width = spriteBounds.size.x * m_SpriteScale.x; height = spriteBounds.size.y * m_SpriteScale.x; int numPoints = m_RadiusPoints; float radius = width * 0.5f; AddFreeModeBodyDefinition(Vector2.zero, width * m_SphereRadius, m_CentralBodyKinematic); for(int loop = 0; loop < numPoints; loop++) { float angle = ((Mathf.PI * 2)/numPoints) * loop; Vector2 offset = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)); offset *= radius; offset.x *= m_SoftBodyScale.x; offset.y *= m_SoftBodyScale.y; AddFreeModeBodyDefinition(offset * (1.0f - (2 * m_SphereRadius)), width * m_SphereRadius, false); } } break; case PhysicsStyle.Triangle: { float radius = spriteBounds.size.y * m_SphereRadius * m_SpriteScale.y; float offsetFactor = 0.5f - m_SphereRadius; AddFreeModeBodyDefinition(Vector2.zero, radius, m_CentralBodyKinematic); AddFreeModeBodyDefinition(new Vector2(-width * offsetFactor, -height * offsetFactor), radius, false); AddFreeModeBodyDefinition(new Vector2(width * offsetFactor, -height * offsetFactor), radius, false); AddFreeModeBodyDefinition(new Vector2(0.0f, height * offsetFactor), radius, false); } break; case PhysicsStyle.Rectangle: { float radius = spriteBounds.size.y * m_SphereRadius * m_SpriteScale.y; float offsetFactor = 0.5f - m_SphereRadius; AddFreeModeBodyDefinition(Vector2.zero, radius, m_CentralBodyKinematic); AddFreeModeBodyDefinition(new Vector2(-width * offsetFactor, -height * offsetFactor), radius, false); AddFreeModeBodyDefinition(new Vector2(width * offsetFactor, -height * offsetFactor), radius, false); AddFreeModeBodyDefinition(new Vector2(-width * offsetFactor, height * offsetFactor), radius, false); AddFreeModeBodyDefinition(new Vector2(width * offsetFactor, height * offsetFactor), radius, false); } break; case PhysicsStyle.Free: break; case PhysicsStyle.Grid: { width -= (m_SphereRadius * 4); height -= (m_SphereRadius * 4); float radius = spriteBounds.size.x * m_SphereRadius * m_SpriteScale.x; AddFreeModeBodyDefinition(Vector2.zero, radius, m_CentralBodyKinematic); int columns = m_GridColumns; int rows = m_GridRows; for(int y = 0; y < rows; y++) { for(int x = 0; x < (y % 2 == 0? columns : columns - 1); x++) { Vector2 position; position.x = (-width * 0.5f) + ((width/(float)(columns - 1)) * x); if(y % 2 != 0) { position.x += width/(float)(columns - 1) * 0.5f; } position.y = (-height * 0.5f) + ((height/(float)(rows - 1)) * y); AddFreeModeBodyDefinition(position, radius, false); } } } break; } m_Style = PhysicsStyle.Free; } }
/// <summary> /// Called when free mode is selected for the first time - copies all existing points to /// the free mode configuration /// </summary> public void OnCopyToFreeModeSelected() { if(IsMeshValid()) { m_FreeModeBodyPositions.Clear(); m_FreeModeBodyRadii.Clear(); m_FreeModeBodyKinematic.Clear(); Bounds meshBounds = m_SourceMesh.bounds; float width = meshBounds.size.x * m_SoftBodyScale.x * m_MeshScale.x; float height = meshBounds.size.y * m_SoftBodyScale.y * m_MeshScale.y; float depth = meshBounds.size.z * m_SoftBodyScale.z * m_MeshScale.z; switch(m_Style) { case PhysicsStyle.Circle: { width = meshBounds.size.x * m_MeshScale.x; height = meshBounds.size.y * m_MeshScale.x; int numPoints = m_RadiusPoints; float radius = width * 0.5f; AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, width * m_SphereRadius, m_CentralBodyKinematic); for(int loop = 0; loop < numPoints; loop++) { float angle = ((Mathf.PI * 2)/numPoints) * loop; Vector3 offset = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)); offset *= radius; offset.x *= m_SoftBodyScale.x; offset.y *= m_SoftBodyScale.y; AddFreeModeBodyDefinition(offset * (1.0f - (2 * m_SphereRadius)) + m_SoftBodyOffset, width * m_SphereRadius, false); } } break; case PhysicsStyle.Sphere: { width = meshBounds.size.x * m_MeshScale.x; float radius = width * 0.5f; AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, width * m_SphereRadius, m_CentralBodyKinematic); int latitudes = m_RadiusPoints; int longitudes = m_RadiusPoints; float latitudeIncrement = 360.0f / latitudes; float longitudeIncrement = 180.0f / longitudes; for (float u = 0; u <= 360.0f; u += latitudeIncrement) { for (float t = 0; t <= 180.0f; t += longitudeIncrement) { float rad = radius; float x = (float) (rad * Mathf.Sin(Mathf.Deg2Rad * t) * Mathf.Sin(Mathf.Deg2Rad * u)) * m_SoftBodyScale.x; float y = (float) (rad * Mathf.Cos(Mathf.Deg2Rad * t)) * m_SoftBodyScale.y; float z = (float) (rad * Mathf.Sin(Mathf.Deg2Rad * t) * Mathf.Cos(Mathf.Deg2Rad * u)) * m_SoftBodyScale.z; AddFreeModeBodyDefinition((new Vector3(x, y, z) * (1.0f - (2 * m_SphereRadius))) + m_SoftBodyOffset, width * m_SphereRadius, false); } } } break; case PhysicsStyle.Triangle: { float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y; float offsetFactor = 0.5f - m_SphereRadius; AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(0.0f, height * offsetFactor) + m_SoftBodyOffset, radius, false); } break; case PhysicsStyle.Pyramid: { float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y; float offsetFactor = 0.5f - m_SphereRadius; AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(0.0f, height * offsetFactor), radius, false); } break; case PhysicsStyle.Rectangle: { float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y; float offsetFactor = 0.5f - m_SphereRadius; AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, height * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, height * offsetFactor) + m_SoftBodyOffset, radius, false); } break; case PhysicsStyle.Cube: { float radius = meshBounds.size.y * m_SphereRadius * m_MeshScale.y; float offsetFactor = 0.5f - m_SphereRadius; AddFreeModeBodyDefinition(m_SoftBodyPivotOffset, radius, m_CentralBodyKinematic); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, height * offsetFactor, -depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, -height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(-width * offsetFactor, height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false); AddFreeModeBodyDefinition(new Vector3(width * offsetFactor, height * offsetFactor, depth * offsetFactor) + m_SoftBodyOffset, radius, false); } break; case PhysicsStyle.Free: break; } m_SoftBodyPivotOffset = Vector3.zero; m_SoftBodyRotation = Vector3.zero; m_SoftBodyRotation = Vector3.zero; m_Style = PhysicsStyle.Free; } }