void Shape::updateOutline() { std::size_t count = m_vertices.getVertexCount() - 2; m_outlineVertices.resize((count + 1) * 2); for (std::size_t i = 0; i < count; ++i) { std::size_t index = i + 1; // Get the two segments shared by the current point Vector2f p0 = (i == 0) ? m_vertices[count].position : m_vertices[index - 1].position; Vector2f p1 = m_vertices[index].position; Vector2f p2 = m_vertices[index + 1].position; // Compute their normal Vector2f n1 = computeNormal(p0, p1); Vector2f n2 = computeNormal(p1, p2); // Make sure that the normals point towards the outside of the shape // (this depends on the order in which the points were defined) if (dotProduct(n1, m_vertices[0].position - p1) > 0) n1 = -n1; if (dotProduct(n2, m_vertices[0].position - p1) > 0) n2 = -n2; // Combine them to get the extrusion direction float factor = 1.f + (n1.x * n2.x + n1.y * n2.y); Vector2f normal = (n1 + n2) / factor; // Update the outline points m_outlineVertices[i * 2 + 0].position = p1; m_outlineVertices[i * 2 + 1].position = p1 + normal * m_outlineThickness; } // Duplicate the first point at the end, to close the outline m_outlineVertices[count * 2 + 0].position = m_outlineVertices[0].position; m_outlineVertices[count * 2 + 1].position = m_outlineVertices[1].position; // Update outline colors updateOutlineColors(); // Update the shape's bounds m_bounds = m_outlineVertices.getBounds(); }
void Shape::updateOutline() { unsigned int count = m_vertices.getVertexCount() - 2; m_outlineVertices.resize((count + 1) * 2); for (unsigned int i = 0; i < count; ++i) { unsigned int index = i + 1; // Get the two segments shared by the current point Vector2f p0 = (i == 0) ? m_vertices[count].position : m_vertices[index - 1].position; Vector2f p1 = m_vertices[index].position; Vector2f p2 = m_vertices[index + 1].position; // Compute their normal Vector2f n1 = computeNormal(p0, p1); Vector2f n2 = computeNormal(p1, p2); // Combine them to get the extrusion direction float factor = 1.f + (n1.x * n2.x + n1.y * n2.y); Vector2f normal = -(n1 + n2) / factor; // Update the outline points m_outlineVertices[i * 2 + 0].position = p1; m_outlineVertices[i * 2 + 1].position = p1 + normal * m_outlineThickness; } // Duplicate the first point at the end, to close the outline m_outlineVertices[count * 2 + 0].position = m_outlineVertices[0].position; m_outlineVertices[count * 2 + 1].position = m_outlineVertices[1].position; // Update outline colors updateOutlineColors(); // Update the shape's bounds m_bounds = m_outlineVertices.getBounds(); }
void Shape::setOutlineColor(const Color& color) { m_outlineColor = color; updateOutlineColors(); }