public BaseRayEngine() { frameParsers = new Dictionary<Type, Action<IFrameElement>>(); frameParsers.Add(typeof(FrameCamera), cameraItem => { var item = (FrameCamera)cameraItem; Camera = new BasicPerspectiveCamera(item.Position, item.Target, item.Up, width, height) { Fov = 60 }; }); frameParsers.Add(typeof(FrameObjFileReference), item => { var objFileRef = (FrameObjFileReference)item; var loader = new GlobalIndexObjLoader(); scene = loader.Load(objFileRef.ObjFilePath); var mload = new MaterialLoader(); mats = mload.LoadMaterials(objFileRef.MtlFilePath); foreach (var materialInfo in mats) { if (materialInfo.Name.ToLower().Contains("glass") || materialInfo.Name.ToLower().Contains("wire_134006006") ) { materialInfo.Kt = materialInfo.Kd; materialInfo.Kd = RgbSpectrum.ZeroSpectrum(); materialInfo.MediumInfo = Glass; } if (materialInfo.Name.ToLower().Contains("metal")) { materialInfo.Kr = materialInfo.Kd; } } }); frameParsers.Add(typeof(Frame3DsFileReference), item => { var sceneFileRef = (Frame3DsFileReference)item; var loader = new SceneLoader(); scene = loader.Load(sceneFileRef.FilePath); mats = loader.LoadMaterials(sceneFileRef.FilePath); foreach (var materialInfo in mats) { if (materialInfo.Name.ToLower().Contains("glass") || materialInfo.Name.ToLower().Contains("wire_134006006") ) { materialInfo.Kt = materialInfo.Kd; materialInfo.Kd = RgbSpectrum.ZeroSpectrum(); materialInfo.MediumInfo = Glass; } if (materialInfo.Name.ToLower().Contains("metal")) { materialInfo.Kr = materialInfo.Kd; } } if (scene.Cameras != null && scene.Cameras.Any()) { Camera = new BasicPerspectiveCamera(scene.Cameras[0].Position, scene.Cameras[0].Direction, scene.Cameras[0].Up, width, height) { Fov = scene.Cameras[0].Fov }; } }); frameParsers.Add(typeof(FrameLightsource), item => { if (lights == null) { lights = new List<ILight>(); } var lightsource = (FrameLightsource)item; switch (lightsource.LightType) { case LightSourceTypes.Point: lights.Add(new PointLight(lightsource)); break; case LightSourceTypes.EnvironmentMap: lights.Add(envMap = new InfiniteLight(lightsource)); break; case LightSourceTypes.Area: //if (AreaLightAsMeshLight) lights.Add(new MeshLight(lightsource)); break; } }); }