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(); }
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; }
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; } }); }