Esempio n. 1
0
bool LightmapGenerator::ProcessConvexPolygon(const RCONVEXPOLYGONINFO* poly,
	int PolyIndex, int& lightmapsize)
{
	rboundingbox bbox;

	bbox.vmin = bbox.vmax = poly->pVertices[0];
	for (int j = 1; j < poly->nVertices; j++)
	{
		for (int k = 0; k < 3; k++)
		{
			bbox.vmin[k] = min(bbox.vmin[k], poly->pVertices[j][k]);
			bbox.vmax[k] = max(bbox.vmax[k], poly->pVertices[j][k]);
		}
	}

	lightmapsize = MaxLightmapSize;

	float targetarea = MaximumArea / 4.f;
	while (poly->fArea < targetarea && lightmapsize > MinLightmapSize)
	{
		targetarea /= 4.f;
		lightmapsize /= 2;
	}

	v3 diff = float(lightmapsize) / float(lightmapsize - 1) * (bbox.vmax - bbox.vmin);

	// 1 texel
	for (int k = 0; k < 3; k++)
	{
		bbox.vmin[k] -= .5f / float(lightmapsize)*diff[k];
		bbox.vmax[k] += .5f / float(lightmapsize)*diff[k];
	}

	v3 pnormal{ poly->plane.a, poly->plane.b, poly->plane.c };

	LightIndex = 0;

	for (auto& Light : bsp.StaticMapLightList)
	{
		if (GetDistance(Light.Position, poly->plane) > Light.fAttnEnd) continue;

		for (int iv = 0; iv < poly->nVertices; iv++)
		{
			if (DotProduct(Light.Position - poly->pVertices[iv], poly->pNormals[iv])>0) {
				pplight[LightIndex] = &Light;
				++LightIndex;
				break;
			}

		}
	}

	int au, av, ax;

	if (fabs(poly->plane.a) > fabs(poly->plane.b) && fabs(poly->plane.a) > fabs(poly->plane.c))
		ax = 0; // yz
	else if (fabs(poly->plane.b) > fabs(poly->plane.c))
		ax = 1;	// xz
	else
		ax = 2;	// xy

	au = (ax + 1) % 3;
	av = (ax + 2) % 3;

	for (int j = 0; j < lightmapsize; j++)			// v 
	{
		for (int k = 0; k < lightmapsize; k++)		// u
		{
			lightmap[j*lightmapsize + k] = AmbientLight;
		}
	}

	for (int l = 0; l < LightIndex; l++)
	{
		RLIGHT *plight = pplight[l];

		for (int j = 0; j < lightmapsize + 1; j++)			// v 
		{
			for (int k = 0; k < lightmapsize + 1; k++)		// u
			{
				isshadow[k*(lightmapsize + 1) + j] = CheckShadow(plight,
					poly,
					bbox,
					pnormal, diff,
					lightmapsize,
					j, k,
					au, av, ax);
			}
		}

		for (int j = 0; j < lightmapsize; j++)
		{
			for (int k = 0; k < lightmapsize; k++)
			{
				lightmap[j*lightmapsize + k] += CalcDiffuse(bbox,
					poly,
					pnormal, diff,
					plight,
					lightmapsize,
					j, k,
					au, av, ax);
			}
		}
	}

	for (int j = 0; j < Square(lightmapsize); j++)
	{
		auto color = lightmap[j];

		color *= 0.25f;
		color.x = min(color.x, 1.f);
		color.y = min(color.y, 1.f);
		color.z = min(color.z, 1.f);
		lightmap[j] = color;
		lightmapdata[j] =
			((u32)(color.x * 255)) << 16 |
			((u32)(color.y * 255)) << 8 |
			((u32)(color.z * 255));
	}

	return true;
}
Esempio n. 2
0
glm::vec3 Triangle::PhongShading(float _t, glm::vec3 ROrigin, glm::vec3 RDirection, glm::vec3 lightpos, float intensity, Shape* ShapeArray[], int numberofshapes)
{
	glm::vec3 ContactPoint = ROrigin + _t*RDirection;
	glm::vec3 l = glm::normalize(lightpos-ContactPoint);
	return CalcAmbient() + CalcDiffuse(l, Normal, intensity) + CalcSpecular(-l,Normal,ROrigin,ContactPoint, intensity);
}