Ejemplo n.º 1
0
 public RayEngineScene3(SceneGeometryInfo geometry, IMaterialProvider materials, ILight[] lights = null) {
     this.MaterialProvider = materials;
     this.SceneGeometry = geometry;
     Triangles = new List<TriangleDataInfo>();
     Meshes = new List<ITriangleMesh>();
     meshTriangleMap = new Dictionary<int, ITriangleMesh>();
     this.Lights = lights;
     this.BuildSceneData();
 }
Ejemplo n.º 2
0
        public SceneGeometryInfo Load( string fileName, params string[] additionalFiles ) {
            var result = new SceneGeometryInfo();
            var objs = new List<GeometryInfo>();
            string lastCommand = "f";

            FloatStore vb = null;
            FloatStore vt = null;
            FloatStore vn = null;

            IntStore ib = null;

            IntStore tib = null;
            IntStore nib = null;
            int oCount = 0;
            var buffer = new Queue<string>();
            using( var reader = new StreamReader(fileName) ) {
                while( !reader.EndOfStream ) {
                    var s = reader.ReadLine();
                    if( String.IsNullOrEmpty(s) )
                        continue;
                    buffer.Enqueue(s);
                }
            }

            while( buffer.Count > 0 ) {
                string line = buffer.Dequeue();

                if( string.IsNullOrEmpty(line) )
                    continue;
                if( line.StartsWith("#") )
                    continue;


                //try
                //{
                var tag = line.Contains(" ") ? line.Substring(0, line.IndexOf(" ")).Trim() : line.Trim();
                switch( tag ) {
                    case "vt":
                        if( vt == null ) {
                            vt = objs[oCount - 1].TextureData;
                        }
                        objs[oCount - 1].UseTextures = true;
                        vt.AddRange(ObjHandler.Process_VT(line));
                        break;
                    case "vn":

                        if( vn == null ) {
                            vn = objs[oCount - 1].NormalData;
                        }
                        objs[oCount - 1].UseNormals = true;
                        vn.AddRange(ObjHandler.Process_VN(line));
                        break;
                    case "v":
                        if( lastCommand.Equals("f") ) {
                            var newObj = new GeometryInfo();
                            objs.Add(newObj);
                            //vb = newObj.VertexBuffer;
                            vn = null;
                            ib = null;
                            tib = null;
                            nib = null;
                            oCount++;
                        }
                        if( vb == null ) {
                            vb = objs[oCount - 1].VertexData;
                        }
                        vb.AddRange(ObjHandler.Process_V(line));
                        break;

                    case "f":
                        if( ib == null ) {
                            ib = objs[oCount - 1].IndexData;
                        }
                        int[] tibs, nibs;
                        var ibValues = ObjHandler.Process_F(line, out nibs, out tibs);
                        bool TexInd = false;
                        bool NormInd = false;
                        ib.AddRange(ibValues);
                        if( objs[oCount - 1].UseTextures && objs[oCount - 1].UseNormals ) {
                            NormInd = true;
                            TexInd = true;
                        }
                        else if( objs[oCount - 1].UseTextures && !objs[oCount - 1].UseNormals ) {
                            TexInd = true;
                            tibs = nibs;
                        }
                        else
                            if( !objs[oCount - 1].UseTextures && objs[oCount - 1].UseNormals ) {
                                NormInd = true;
                            }
                        if( TexInd ) {
                            if( tib == null ) {
                                objs[oCount - 1].TextureIndexData = new IntStore();
                                tib = objs[oCount - 1].TextureIndexData;
                            }
                            if( tibs != null ) {
                                tib.AddRange(tibs);
                            }
                            else {
                                tib.AddRange(nibs);
                            }
                        }

                        if( NormInd ) {
                            if( nib == null ) {
                                objs[oCount - 1].NormalIndexData = new IntStore();
                                nib = objs[oCount - 1].NormalIndexData;
                            }
                            nib.AddRange(nibs);
                        }
                        break;

                    case "g":
                        if( lastCommand.Equals("f") ) {
                            var newObj = new GeometryInfo();
                            objs.Add(newObj);
                            //vb = null;
                            vn = null;
                            ib = null;
                            tib = null;
                            nib = null;
                            oCount++;
                        }
                        string name = string.Empty;
                        ObjHandler.Process_G(line, out name);
                        objs[oCount - 1].Name = name;
                        break;
                    case "usemtl":
                        string mtl = string.Empty;
                        ObjHandler.Process_Mtl(line, out mtl);
                        objs[oCount - 1].MaterialName = mtl.ToLowerInvariant();
                        break;
                    default:
                        continue;


                }
                lastCommand = tag;
                //}
                //catch (Exception ex)
                //{
                //    throw ex;
                //    //continue;

                //}
            }


            result.Vertices = vb.TodVectorList().ToArray();
            result.TexCoords = vt.TodVectorList().ToArray();
            result.Normals = vn.TodVectorList().ToArray();


            objs.ForEach(ob => {
                ob.IndexData.Iterator(Math.Abs);
                if( ob.TextureIndexData != null )
                    ob.TextureIndexData.Iterator(Math.Abs);
                if( ob.NormalIndexData != null )
                    ob.NormalIndexData.Iterator(Math.Abs);

                ob.Name = String.IsNullOrEmpty(ob.Name) ? Guid.NewGuid().ToString() : ob.Name;
            });


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