Exemple #1
0
Intersection Triangle::hit(Ray ray)
{

	ray.setOrigin(vec3(getInverseTransform() * vec4(ray.getOrigin(),1)));
	ray.setDirection(glm::normalize(vec3(getInverseTransform() * vec4(ray.getDirection(),0))));

	// R(t) = o + td;
	// ax + by + cz = d => n·X=d
	// n·R(t) = d
	// n · [o + td] = d
	// n·o + nt·d = d
	// t = (d-n·o)/(n·d)
	vec3 ab = m_b-m_a;
	vec3 ac = m_c-m_a;
	vec3 normal = glm::normalize(glm::cross(ab,ac));
	float nd = glm::dot(normal,ray.getDirection());
	if (nd == 0) // PARAREL
	{
		return Intersection(false);
	}
	float d = glm::dot(normal, m_a);
	float t = (d-glm::dot(normal,ray.getOrigin())) / nd;
	if (t < 0)
	{
		return Intersection(false);
	}
	vec3 pointq = ray.getOrigin() + t * ray.getDirection();
	vec3 ap = pointq - m_a; 
	vec3 bp = pointq - m_b; 
	vec3 cp = pointq - m_c; 
	vec3 bc = m_c - m_b;
	vec3 ca = m_a - m_c;

	float e1 = glm::dot(glm::cross(ab, ap),normal);
	float e2 = glm::dot(glm::cross(bc, bp),normal);
	float e3 = glm::dot(glm::cross(ca, cp),normal);

	if (e1 < 0 || e2 < 0 || e3 < 0)
	{
		return Intersection(false);
	}
	float dom = glm::dot(glm::cross(ab, ac),normal);
	float alpha = e2 /dom;
	float beta = e3/dom;
	float gamma = e1/dom;


	vec3 point = m_a*alpha + m_b*beta + m_c*gamma;

	return Intersection(true, point, normal);
}
Exemple #2
0
void Selector::click(sf::Vector2f clickPos, xy::MessageBus& mb)
{
    if (m_target != m_vertices[0].texCoords.y) return;

    auto point = getInverseTransform().transformPoint(clickPos);
    if (m_bottomButton.contains(point))
    {
        if (m_currentIndex > 0)
        {
            m_currentIndex--;
            m_target = m_vertices[0].texCoords.y - m_bottomButton.height;

            auto msg = mb.post<Message::InterfaceEvent>(Message::Interface);
            msg->type = Message::InterfaceEvent::SelectorClick;
        }
    }
    else if (m_topButton.contains(point))
    {
        if (m_currentIndex < maxIndex)
        {
            m_currentIndex++;
            m_target = m_vertices[0].texCoords.y + m_topButton.height;

            auto msg = mb.post<Message::InterfaceEvent>(Message::Interface);
            msg->type = Message::InterfaceEvent::SelectorClick;
        }
    }
}
Exemple #3
0
        bool Node::shapeOverlaps(const std::vector<Vector2>& edges) const
        {
            Matrix4 inverse = getInverseTransform();

            std::vector<Vector2> transformedEdges;

            for (const Vector2& edge : edges)
            {
                Vector3 transformedEdge = edge;

                inverse.transformPoint(transformedEdge);

                transformedEdges.push_back(Vector2(transformedEdge.x, transformedEdge.y));
            }

            for (const DrawablePtr& drawable : drawables)
            {
                if (drawable->shapeOverlaps(transformedEdges))
                {
                    return true;
                }
            }

            return false;
        }
Exemple #4
0
        Vector2 Node::convertWorldToLocal(const Vector2& worldPosition) const
        {
            Vector3 localPosition = worldPosition;

            const Matrix4& currentInverseTransform = getInverseTransform();
            currentInverseTransform.transformPoint(localPosition);

            return Vector2(localPosition.x, localPosition.y);
        }
Exemple #5
0
sf::Vector2f  SGItem::mapFromItem(const SGItem& initialBasis, sf::Vector2f  point) const
{
    sf::Vector2f  ret = point;
    ret = initialBasis.getTransform().transformPoint(ret);
    ret = initialBasis.m_globalTransform.transformPoint(ret);
    ret = m_globalTransform.getInverse().transformPoint(ret);
    ret = getInverseTransform().transformPoint(ret);

    return ret;
}