Ejemplo n.º 1
0
 private void ProcessSG(SceneGraphInfo sceneGraph)
 {
     
 }
Ejemplo n.º 2
0
        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;
                }
            }

        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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
                });
            });
        }
Ejemplo n.º 5
0
        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;
        }