public TriangleLight(SceneGeometryInfo sc, ref Triangle tri, int triIndex = -1, RgbSpectrum gain = new RgbSpectrum()) : this(sc) { Gain = gain; if (triIndex != -1) triangleIndex = triIndex; this.tri = tri; var computeNormal = true; //Configuration.Instance.Get("Integrator.ComputeNormals", false); var normalInverse = true; //Configuration.Instance.Get("Integrator.InverseLightNormals", false); var multiplicator = normalInverse ? -1f : 1f; this.TriangleNormal = multiplicator * (computeNormal ? tri.ComputeNormal(ref scene.Vertices) : tri.Owner.GetTriangleNormal(triIndex, 0)); this.area = tri.AreaV(ref scene.Vertices); }
public void Init(GeometryInfo model, SceneGeometryInfo scene) { this.scene = scene; triangles = new List<Triangle>(); normals = new Dictionary<int, Normal[]>(300); texCoords = new Dictionary<int, UV[]>(); this.MaterialName = model.MaterialName; this.MeshName = model.Name; var delta = -1; var index = 0; bool hasNormals = false; Normal[] norms = null; int[] ni = null; bool hasTexCoords = false; UV[] texs = null; int[] ti = null; if (model.IndexData.Any()) { hasNormals = model.NormalIndexData.Any(); hasTexCoords = model.TextureIndexData != null && model.TextureIndexData.Any(); if (hasTexCoords) { texs = scene.TexCoords.ToUVArray(); if (!texs.Any()) hasTexCoords = false; ti = model.TextureIndexData.ToArray(); } if (hasNormals) { norms = scene.Normals.Select(item => new Normal(item)).ToArray(); ni = model.NormalIndexData.ToArray(); } for (int i = 0; i < model.IndexData.Count; i += 3) { index++; var newTriangle = new Triangle(model.IndexData[i] - delta, model.IndexData[i + 1] - delta, model.IndexData[i + 2] - delta); newTriangle.Index = triangles.Count; newTriangle.Owner = this; triangles.Add(newTriangle); //meshIndexes.Add(extMesh); if (hasTexCoords) { var triIndex = index; var t1 = texs[(ti[i] - 1)]; var t2 = texs[(ti[i + 1] - 1)]; var t3 = texs[(ti[i + 2] - 1)]; texCoords.Add(triIndex, new[] { t1, t2, t3 }); } if (hasNormals) { //Add vertice normal var triIndex = index; var norm1 = a*norms[(ni[i] - 1)]; var norm2 = a*norms[(ni[i + 1] - 1)]; var norm3 = a*norms[(ni[i + 2] - 1)]; normals.Add(triIndex, new[] { norm1, norm2, norm3 }); } else { var triIndex = index; var norm1 = newTriangle.ComputeVerticeNormal(0, ref scene.Vertices); var norm2 = newTriangle.ComputeVerticeNormal(1, ref scene.Vertices); var norm3 = newTriangle.ComputeVerticeNormal(2, ref scene.Vertices); normals.Add(triIndex, new[] { norm1, norm2, norm3 }); } } //extMesh.Indexes = model.IndexBuffer.Select(item => item - (extMesh.StartVertice - 1)).ToArray(); } else { for (int i = 0; i < scene.Vertices.Length; i += 3) { var tri = new Triangle(Array.IndexOf(scene.Vertices, scene.Vertices[i]), Array.IndexOf(scene.Vertices, scene.Vertices[i + 1]), Array.IndexOf(scene.Vertices, scene.Vertices[i + 2])); triangles.Add(tri); //meshIndexes.Add(extMesh); index++; } } }
public bool IsLight(Triangle tri) { for (int index = 0; index < areaLights.Count; index++) { if (areaLights[index].GeoName.Equals(tri.Owner.MeshName)) return true; } return false; }