예제 #1
0
 public SolidObject(BaseMaterial material, TriangleMeshInfo mesh) : base(mesh)
 {
     if (mesh == null)
     {
         throw new ArgumentNullException("mesh");
     }
     this.Material = (SolidMaterial)material;            
 }
예제 #2
0
        public void Build()
        {
            int id = 0;
            Tracer.TraceLine("Spectral-#-  Start scene building-");
            Tracer.TraceLine("Spectral-##- Materials-");

            foreach (var material in Scene.MaterialProvider.GetAll())
            {
                if (!solidMaterials.ContainsKey(material.MaterialName.ToLower()))
                {
                    var mat = new SolidMaterial(id++, material, Scene, BrdfFactory.Instance.CreateBrdf(material));
                    solidMaterials.Add(material.MaterialName.ToLower(), mat);
                }
            }

            lightMaterials.Add("D6500", new LightMaterial(SPD_Data.FromSampled(SPD_Data.D6500, SpectrumType.Illuminant)));
            lightMaterials.Add("D5000", new LightMaterial(SPD_Data.FromSampled(SPD_Data.D5000, SpectrumType.Illuminant)));
            lightMaterials.Add("A", new LightMaterial(SPD_Data.FromSampled(SPD_Data.A, SpectrumType.Illuminant)));

            Tracer.TraceLine("Spectral-##- Solids-");


            int objects = 0, lights = 0;
            foreach (var triangleMesh in Scene.Meshes.Cast<TriangleMeshInfo>())
            {
                var solid = new SolidObject(solidMaterials[triangleMesh.MaterialName.ToLower()], triangleMesh)
                {
                    IsLightsource = IsLight(triangleMesh.MeshName),
                    ID = objects+1
                };
                this.Objects[objects++] = solid;
            }

            Tracer.TraceLine("Spectral-##- Lights-");

            foreach (var lt in Scene.Lights)
            {
                BaseLight light = null;
                int solidId = 0;
                LightMaterial lightMat = lightMaterials.ContainsKey(lt.Profile.Name.ToUpper())
                    ? lightMaterials[lt.Profile.Name.ToUpper()]
                    : lightMaterials[DefaultLightProfile];

                if (lt is RayDen.RayEngine.Data.PointLight)
                {
                    var l = lt as RayDen.RayEngine.Data.PointLight;
                    light = new RayEngine.Spectral.Entities.Lighting.PointLight(lightMat, l.Position);
                }
                else if (lt is InfiniteLight)
                {
                    var l = lt as InfiniteLight;
                    light = new BasicInfiniteLight(l.Sampler, lightMat);
                }
                else if (lt is RayDen.RayEngine.Data.MeshLight)
                {
                    var l = lt as RayDen.RayEngine.Data.MeshLight;
                    light = new TriangleMeshLight(lightMat, Scene, (TriangleMeshInfo)Scene.Meshes.First(mesh => mesh.MeshName.ToLower().Equals(l.MeshName.ToLower())));
                    var prim =
                        this.Objects.FirstOrDefault(
                            mesh => mesh.Mesh.MeshName.Equals(l.MeshName, StringComparison.InvariantCultureIgnoreCase));
                    if (prim != null)
                    {
                        prim.ChildID = lights;
                        solidId = Array.IndexOf(this.Objects, prim);
                    }
                }

                if (light != null)
                    this.Lights[lights++] = new LightsourceObject(lightMat, light)
                    {
                        ID = lights, SolidId = solidId
                    };

            }
            Tracer.TraceLine("Spectral-#-  Complete scene building-");

        }