private void ProcessSG(SceneGraphInfo sceneGraph) { }
public void Populate(int width, int height, SceneGraphInfo scg) { var svc = new SceneGraphService(); svc.Populate(new GlobalIndexObjLoader(), new MaterialLoader()); var cameras = new List<LtCamera>(); var geometry = new List<LtGeoObject>(); var lights = new List<LtLightsource>(); var volumes = new List<LtVolume>(); var solidMats = new List<SolidMaterial>(); var matInfos = new List<MaterialInfo>(); var lightInfos = new List<LightsourceInfo>(); svc.SceneGraph.Visit((s) => { if (s is GeometryGroupNode) { sceneGeoInfo = (SceneGeometryInfo)scg.ResolveDataNode<SceneGeometryDataNode>(s as GeometryGroupNode).GetDataItem(); } else if (s is LightsourceNode) { var li = (LightsourceInfo)s.GetDataItem(); lightInfos.Add(li); } else if (s is CameraNode) { var ci = (CameraInfo)s.GetDataItem(); cameras.Add(new LtCamera(new BasicPerspectiveCamera(ci.Position, ci.Direction, ci.Up, width, height, ci.Fov), ci)); } else if (s is SceneMaterialDataNode) { var mi = (MaterialInfo)s.GetDataItem(); matInfos.Add(mi); Trace.TraceInformation("Loading textures for "+mi.Name); Tracer.TraceLine("Loading textures for " + mi.Name); foreach (var textureInfo in new[] { mi.Diffuse, mi.Alpha, mi.BumpMap, mi.NormalMap, mi.Specular }) { TextureManager.Instance.LoadTexture(textureInfo); } } }); bool hasAreaLights = lightInfos.Any(item => item.Type == LightSourceTypes.Area); var solids = new Dictionary<string, SolidMaterial>(); //Materials building foreach (var materialInfo in matInfos) { var bsdf = SolidMaterialFactory.Instance.CreateMaterial(materialInfo); bsdf.Alpha = TextureManager.Instance.GetByInfo(materialInfo.Alpha); bsdf.Diffuse = TextureManager.Instance.GetByInfo(materialInfo.Diffuse); bsdf.Specular = TextureManager.Instance.GetByInfo(materialInfo.Specular); bsdf.Bump = TextureManager.Instance.GetByInfo(materialInfo.BumpMap); bsdf.Normal = TextureManager.Instance.GetByInfo(materialInfo.NormalMap); solidMats.Add(bsdf); bsdf.scene = scene; solids.Add(materialInfo.Name.ToLowerInvariant(), bsdf); } //Geometry foreach (var triangleMeshInfo in sceneData.Meshes) { if (VolumeSampler.IsVolume(triangleMeshInfo)) { var volumeObject = new LtVolume(new MeshShape(triangleMeshInfo), new VolumeProfile()); volumes.Add(volumeObject); } else { var geoObject = new LtGeoObject(triangleMeshInfo, solids[triangleMeshInfo.MaterialName.ToLowerInvariant()]); geometry.Add(geoObject); } /* if (hasAreaLights) { if (LightSampler.IsLight(triangleMeshInfo.MeshName)) { } } */ } //Lights foreach (var lightsourceInfo in lightInfos) { switch (lightsourceInfo.Type) { case LightSourceTypes.Point: lights.Add(new LtLightsource(new PointLightsource(), new EmissionProfile())); break; } } }
private SceneGraphInfo CreateSceneGraph( SceneGeometryInfo geoInfo, Transform worldTransform, SceneGraphChangesType changes = SceneGraphChangesType.FullGraph ) { var scene = new SceneGraphInfo() { RootNode = new SceneGraphRootNode() }; var cams = (cameras.Select( cameraInfo => new { cameraInfo, camTransform = Transform.LookAt((Point)cameraInfo.Position, (Point)cameraInfo.Direction, cameraInfo.Up) }) .Select( @t => new CameraNode(@t.camTransform, @t.camTransform.GetInverse(), @t.cameraInfo) { Name = @t.cameraInfo.CameraName })).Cast<SceneGraphElement>().ToList(); var scg = new SceneGeometryDataNode(worldTransform, worldTransform.GetInverse(), geoInfo); scene.RootNode.Children.Add(scg); var geoGroup = new GeometryGroupNode(worldTransform, worldTransform.GetInverse(), scg.Id) {FindRoot = scene.RootNode}; scene.RootNode.Children.Add(geoGroup); var elements = geoInfo.Geometry.Select( geometryInfo => new { geometryInfo, geoTransform = new Transform()} ) .Select( @t => new GeometryElementNode(@t.geoTransform, @t.geoTransform.GetInverse(), @t.geometryInfo)).ToArray(); geoGroup.Children.AddRange(elements); geoGroup.Children.AddRange(elements.Select(geoData => new GeometryInstanceNode(geoData.ObjectToWorld, geoData.WorldToObject, geoData.Id){ FindRoot = scg })); scene.RootNode.Children.AddRange(cams); scene.RootNode.Children.AddRange(mats.Select(item => new SceneMaterialDataNode(item))); scene.RootNode.Children.AddRange(this.lights.Select(item=>new LightsourceNode(null, null, item))); if (volumeMats != null && volumeMats.Any()) scene.RootNode.Children.AddRange(volumeMats.Select(item=>new VolumeNode<VolumeMaterialInfo>(null, null, item))); scene.RootNode.WorldToObject = worldTransform; return scene; }
public SceneGraphService() { sceneGraph = new SceneGraphInfo(); frameParsers = new Dictionary<Type, Action<IFrameElement>>(); cameras = new List<CameraInfo>(); frameParsers.Add(typeof(FrameCamera), cameraItem => { var item = (FrameCamera)cameraItem; cameras.Add(new CameraInfo(item)); //var transform = Transform.LookAt(item.Position, item.Target, item.Up); //CameraNode cam = new CameraNode(transform, transform.GetInverse(), ); /*Camera = new PinholeCamera(width, height){ Fov = 40f}; Camera.LookAt(item.Position, item.Target, item.Up);*/ }); frameParsers.Add(typeof(FrameObjFileReference), item => { var objFileRef = (FrameObjFileReference)item; var loader = BaseContainer.Get<IGeometryLoader>("LoadObj"); //new GlobalIndexObjLoader(); scene = loader.Load(objFileRef.ObjFilePath, objFileRef.InvertNormals); var mload = BaseContainer.Get<IMaterialLoader>("LoadMtl"); //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.DiffuseReflectance; materialInfo.DiffuseReflectance = RgbSpectrum.ZeroSpectrum(); materialInfo.MediumInfo = MediumInfo.Glass; } if (materialInfo.Name.ToLower().Contains("metal")) { materialInfo.SpecularReflectance = materialInfo.DiffuseReflectance; } } }); /* 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<LightsourceInfo>(); } var lightsource = (FrameLightsource)item; lights.Add(new LightsourceInfo(lightsource)); }); frameParsers.Add(typeof(FrameVolumeArea) , item => { if (volumeMats == null) { volumeMats = new List<VolumeMaterialInfo>(); } var vm = (FrameVolumeArea) item; volumeMats.Add(new VolumeMaterialInfo() { Name = vm.MeshName, Outscattering = vm.Emittance, Inscattering = vm.Scattering, Absorbtion = vm.Absorbance }); }); }
public void OpenFrame(FrameDescription frameDescription) { //width = frame.Get<int>("ImageWidth"); //height = frame.Get<int>("ImageHeight"); if (!string.IsNullOrWhiteSpace(frameDescription.WorkingDir)) Directory.SetCurrentDirectory(frameDescription.WorkingDir); foreach (var frameElement in frameDescription.Elements.Where(frameElement => frameParsers.ContainsKey(frameElement.GetType()))) { frameParsers[frameElement.GetType()](frameElement); } this.sceneGraph = this.CreateSceneGraph(scene, Transform.Scale(1f, 1f, 1f)); this.SceneGraph.Parameters = frameDescription; this.SceneGraph.SceneName = frameDescription.FrameName; }