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; }
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); }