コード例 #1
0
ファイル: TriangleLight.cs プロジェクト: HungryBear/rayden
        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);
        }
コード例 #2
0
ファイル: TriangleMesh.cs プロジェクト: HungryBear/rayden
        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++;
                }
            }
        }
コード例 #3
0
ファイル: BaseRenderer.cs プロジェクト: HungryBear/rayden
 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;
 }