Если вы знаете, что такое лучевое приведение, то все, что вам нужно сделать, это жестко закодировать его. Это не слишком сложно, если у вас есть координаты для каждой вершины.
Сначала создайте светоизлучающий объект. Поместите свой свет в координаты х, у.
#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
lightOccludingVertices[i] = vertex;
i++;
}
//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest
//vertex on the x-axis, and the furthest vertex on the y-axis
Это не гарантируется для вогнутого многоугольника, но оно должно работать нормально для любых выпуклых многоугольников.
Это сработает, если ваши затененные объекты (стены, персонажи, летающие фиолетовые пожиратели людей) будут окрашены на экране после применения освещения. В противном случае половина стены будет выглядеть значительно ярче, чем другая половина. Если ваш точечный источник света находится на одинаковом расстоянии от двух пар вершин одной стены (ровно в два раза меньше высоты вашей стены), примените треугольник к двум ближайшим вершинам, а не к двум, находящимся дальше.
Я должен также упомянуть, что этот метод требует динамически создаваемой точки вершины, где край радиуса света встречается с поверхностью затеняющего объекта. Это создает как минимум 3 вершины для любого перекрывающего объекта и позволит стенам, которые простираются за радиус света (или за пределы экрана), также блокировать любой свет.
Больше информации о вогнутых и выпуклых многоугольниках