protected void Load3dCube() { // This is coming from our resources //StreamResourceInfo stri =Application.GetResourceStream (new Uri ( // @"Autodesk.ADN.Toolkit.Wpf.Viewer;3dCube\3dCube.zip", // UriKind.Relative //)) ; //LoadModel (stri.Stream) ; Assembly assembly = Assembly.GetCallingAssembly(); string resourceName = assembly.GetName().Name + ".g"; ResourceManager rm = new ResourceManager(resourceName, assembly); using (ResourceSet set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true)) { UnmanagedMemoryStream s = (UnmanagedMemoryStream)set.GetObject(@"3dCube/3dCube.zip", true); StreamResourceInfo stri = new StreamResourceInfo(s, ""); using (ZipArchive zip = new ZipArchive(stri.Stream)) { ZipArchiveEntry mesh = zip.GetEntry("mesh.obj"); ZipArchiveEntry mtl = zip.GetEntry("mesh.mtl"); ZipArchiveEntry texture = zip.GetEntry("tex_0.jpg"); using (new CursorSwitcher(null)) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(new ObjMaterialStreamProvider(mtl)); var result = objLoader.Load(mesh.Open()); _3dCubeMesh = ObjTriangleMeshAdapater.BuildVisualModel(result, texture); _3dCubeMeshMatGroup = (_3dCubeMesh.Content as GeometryModel3D).Material; // Reset the model & transform(s) this.cubeModel.Children.Clear(); this.cubeModel.Children.Add(_3dCubeMesh); } } } }
private void LoadObj() { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream("G:\\универ\\4 курс\\компьютерная графика\\Kompyuteraya_grafika\\Компьютерая графика\\obj файлы\\Hammer.obj", FileMode.Open); var loadedObj = objLoader.Load(fileStream); foreach (var g in loadedObj.Groups) { foreach (var f in g.Faces) { values.Add(f.Count); for (var i = 0; i < f.Count; i++) { vectors.Add(new Vector3D( loadedObj.Vertices[f[i].VertexIndex - 1].X, loadedObj.Vertices[f[i].VertexIndex - 1].Y, loadedObj.Vertices[f[i].VertexIndex - 1].Z )); } } } fileStream.Close(); }
public List <Triangle> ParseObject(string inputPath) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream(inputPath, FileMode.Open); var result = objLoader.Load(fileStream); List <Triangle> faces = new List <Triangle>(); for (int i = 0; i < result.Groups.Count; i++) { for (int j = 0; j < result.Groups[i].Faces.Count; j++) { Vector3 a = new Vector3(result.Vertices[result.Groups[i].Faces[j][0].VertexIndex - 1].X, result.Vertices[result.Groups[i].Faces[j][0].VertexIndex - 1].Y, result.Vertices[result.Groups[i].Faces[j][0].VertexIndex - 1].Z); Vector3 b = new Vector3(result.Vertices[result.Groups[i].Faces[j][1].VertexIndex - 1].X, result.Vertices[result.Groups[i].Faces[j][1].VertexIndex - 1].Y, result.Vertices[result.Groups[i].Faces[j][1].VertexIndex - 1].Z); Vector3 c = new Vector3(result.Vertices[result.Groups[i].Faces[j][2].VertexIndex - 1].X, result.Vertices[result.Groups[i].Faces[j][2].VertexIndex - 1].Y, result.Vertices[result.Groups[i].Faces[j][2].VertexIndex - 1].Z); faces.Add(new Triangle(a, b, c)); } } return(faces); }
/// <summary>Creates a new <see><c>Entity</c></see> from 3D model in file.</summary> /// <para> /// Uses the package CjClutter.ObjLoader to handle the parsing. Then it performs /// additional checks to ensure Sharpen constraints: /// - only 1 group is allowed in the model definition. /// </para> /// <param name="modelPath">Name of Wavefront-OBJ format file containing the 3D model.</param> /// <param name="texturePath">Path and file name of the graphical file to use for the texture</param> /// <returns>An <see><c>Entity</c></see> instance.</returns> /// <seealso>Entity</seealso> public Entity LoadEntity(string modelPath, string texturePath) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var modelStream = new FileStream(modelPath, FileMode.Open); var modelObj = objLoader.Load(modelStream); if (!ValidateModel(modelObj)) { string msg = $"[{modelPath}]: Model was loaded successfully but failed LoadEntity validation."; l.Error(msg); throw new Exception(msg); } var numberOfPositionCoordinates = modelObj.Vertices.Count * 3; var numberOfTextureCoordinates = modelObj.Vertices.Count * 2; var numberOfIndices = modelObj.Groups[0].Faces.Count * 3; float[] vertices = new float[numberOfPositionCoordinates]; float[] uvCoordinates = new float[numberOfTextureCoordinates]; int[] indices = new int[numberOfIndices]; GetModelRawData(modelObj, vertices, uvCoordinates, indices); return(LoadEntity(vertices, indices, uvCoordinates, texturePath)); }
public static (Mesh mesh, Vector3[] positions, Vector3[] normals) LoadObj(string path) { ObjLoaderFactory factory = new ObjLoaderFactory(); var objLoader = factory.Create(); using (var fStream = new FileStream(path, FileMode.Open)) { var result = objLoader.Load(fStream); Dictionary <FaceVertex, VertexObjData> vertexData = new Dictionary <FaceVertex, VertexObjData>(); var verts = result.Vertices; var norms = result.Normals; var tex = result.Textures; var faces = result.Groups[0].Faces; uint[] indices = new uint[faces.Count * 3]; for (int i = 0; i < faces.Count; i++) { for (int j = 0; j < 3; j++) { var vert = faces[i][j]; if (vertexData.ContainsKey(vert) == false) { var v = ConvertVert(verts[vert.VertexIndex - 1]); var n = ConvertNorm(norms[vert.NormalIndex - 1]); var t = ConvertTexCoord(tex[vert.TextureIndex - 1]); vertexData.Add(vert, new VertexObjData(v, n, t, vertexData.Count)); } } } List <VertexObjData> sortedVertexData = vertexData.Values.ToList(); //sortedVertexData.Sort((a, b) => a.index.CompareTo(b.index)); for (int i = 0; i < faces.Count; i++) { for (int j = 0; j < 3; j++) { indices[i * 3 + j] = (uint)vertexData[faces[i][j]].index; } } var positions = new Vector3[sortedVertexData.Count]; var normals = new Vector3[sortedVertexData.Count]; float[] vertices = new float[sortedVertexData.Count * VertexLayout.Stride(VertexLayout.Type.PositionNormal)]; for (int i = 0; i < sortedVertexData.Count; i++) { var vert = sortedVertexData[i]; positions[vert.index] = vert.position; normals[vert.index] = vert.normal; VBOUtility.SetVertex(vertices, vert.position, vert.normal, vert.index); } var mesh = new Mesh(VertexLayout.Type.PositionNormal); mesh.SetBufferData(vertices, indices, OpenTK.Graphics.OpenGL.BufferUsageHint.StaticDraw); return(mesh, positions, normals); } }
static void Main(string[] args) { var fact = new ObjLoaderFactory(); var loader = fact.Create(); using (var fs = File.OpenRead(args[0])) { var res = loader.Load(fs); List <Vector3> verts = new List <Vector3>(); List <ushort> indices = new List <ushort>(); foreach (var vert in res.Vertices) { verts.Add(new Vector3(vert.X, vert.Y, vert.Z)); } foreach (var idx in res.Groups[0].Faces) { indices.Add((ushort)(idx[0].VertexIndex - 1)); indices.Add((ushort)(idx[1].VertexIndex - 1)); indices.Add((ushort)(idx[2].VertexIndex - 1)); } HKX2.Builders.hknpCollisionMeshBuilder colBuilder = new HKX2.Builders.hknpCollisionMeshBuilder(); colBuilder.AddMesh(verts, indices); var root = colBuilder.CookCollision(); using (FileStream s2 = File.Create(args[0] + ".hkx")) { BinaryWriterEx bw = new BinaryWriterEx(false, s2); var s = new HKX2.PackFileSerializer(); s.Serialize(root, bw); } } }
public static string Convert(Stream stream) { var factory = new ObjLoaderFactory(); var loader = factory.Create(); var result = loader.Load(stream); var jsonVertices = new JArray(); var json = new JObject(new JProperty("vertices", jsonVertices)); foreach (var group in result.Groups) { foreach (var face in group.Faces) { for (int i = 0; i < face.Count; i++) { var vert = result.Vertices[face[i].VertexIndex - 1]; jsonVertices.Add(vert.X); jsonVertices.Add(vert.Y); jsonVertices.Add(vert.Z); } } } return(json.ToString()); }
public Form1() { InitializeComponent(); OpenGlControl.InitializeContexts(); int height = OpenGlControl.Height; int width = OpenGlControl.Width; Gl.glEnable(Gl.GL_LIGHTING); Gl.glEnable(Gl.GL_LIGHT0); float[] light_pos = new float[4] { 1, 0.5F, 1, 0 }; Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light_pos); Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glDepthFunc(Gl.GL_LEQUAL); Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST); Gl.glClearColor(0, 0, 0, 1); Gl.glViewport(0, 0, width, height); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(45.0f, (double)width / (double)height, 0.01f, 5000.0f); Gl.glMatrixMode(Gl.GL_MODELVIEW); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream("bardak.obj", FileMode.Open, FileAccess.Read); result = objLoader.Load(fileStream); }
private LoadResult Load(string fileString) { var objectStream = CreateMemoryStreamFromString(fileString); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(new MaterialNullStreamProvider()); var _loadResult = objLoader.Load(objectStream); return(_loadResult); }
public static Mesh Load(Stream stream) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var loadResult = objLoader.Load(stream); return(loadResult.ToMesh()); }
public LoadResult LoadObj(string path) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); FileStream fileStream = new FileStream(path, FileMode.Open); var result = objLoader.Load(fileStream); return(result); }
public static LoadResult LoadObjSolid(string fileName) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream(fileName, FileMode.OpenOrCreate); LoadResult solid = objLoader.Load(fileStream); fileStream.Close(); return(solid); }
public ObjectModel ParseObject(string pathToFile) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = File.OpenRead(pathToFile); var object3D = objLoader.Load(fileStream); return(LoadResultToObjectModel.ToObjectModel(object3D)); }
private LoadResult GetResult(string file) { IObjLoaderFactory factory = new ObjLoaderFactory(); IObjLoader objLoader = factory.Create(); using (var stream = new FileStream(file, FileMode.Open)) { return(objLoader.Load(stream)); } }
public Mesh Parse(string source) { var objLoader = ObjLoaderFactory.Create(); var bytes = IoWorker.Read(source); using (var stream = new MemoryStream(bytes)) { var result = objLoader.Load(stream); return(ModelToObjectConverter.Convert(result)); } }
private LoadResult LoadObj(string objFile) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var text = (TextAsset)Resources.Load(objFile); var ms = new MemoryStream(Encoding.UTF8.GetBytes(text.text)); var result = objLoader.Load(ms); return(result); }
public static LoadResult LoadOBJ(string filename) { if (objLoader != null) { var objloaderFactory = new ObjLoaderFactory(); objLoader = objloaderFactory.Create(); } FileStream fileStream = new FileStream(filename, FileMode.Open); return(objLoader.Load(fileStream)); }
public ObjectModel ParseObject(string pathToFile) { var sceneData = _sceneIO.Read(pathToFile); var obj = sceneData.SceneObjects[0]; var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = File.OpenRead(obj.MeshedObject.Reference); var object3D = objLoader.Load(fileStream); return(LoadResultToObjectModel.ToObjectModel(object3D)); }
private static void Main(string[] args) { Console.WriteLine("Hello World!"); // parsing section var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream("Resources/Dodec.obj", FileMode.Open, FileAccess.Read); var result = objLoader.Load(fileStream); Console.WriteLine(result.Vertices.Count); // parser call var ourMesh = new Mesh(); // Convert the vertices into the superior format foreach (var vert in result.Vertices) { ourMesh.Vertices.Add(new Vector(vert.X, vert.Y, vert.Z)); } var ind = result.Groups[0]?.Faces; if (ind != null) { foreach (var face in ind) { for (var j = 0; j < face.Count; j++) { ourMesh.Triangles.Add(face[j].VertexIndex); } } } else { return; } Console.WriteLine(ourMesh.Triangles.Count); Console.WriteLine(ourMesh.Vertices.Count); var decomped = Decompose(ourMesh); Console.WriteLine(decomped); }
private LoadResult LoadObjSolid( string fileName, float scale) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream(fileName, FileMode.OpenOrCreate); LoadResult solid = objLoader.Load(fileStream); fileStream.Close(); OpenGLUtilities.UnitizeObject(ref solid); OpenGLUtilities.ScaleObject(ref solid, scale); return(solid); }
public static List <Polygon> Load(string path) { var polygons = new List <Polygon>(); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream(path, FileMode.Open); var loadedObj = objLoader.Load(fileStream); var colors = new[] { Color.FromArgb(255, 0, 128, 255), Color.FromArgb(255, 255, 215, 0), Color.FromArgb(255, 5, 128, 0), Color.FromArgb(255, 255, 0, 64), Color.FromArgb(255, 200, 0, 160), Color.FromArgb(255, 60, 0, 64), Color.FromArgb(255, 100, 100, 100), Color.Crimson }; var k = -1; foreach (var g in loadedObj.Groups) { k = (k + 1) % colors.Length; var color = colors[k++]; foreach (var f in g.Faces) { var p = new Polygon(color); for (var i = 0; i < f.Count; i++) { p.AddPoint( loadedObj.Vertices[f[i].VertexIndex - 1].X, loadedObj.Vertices[f[i].VertexIndex - 1].Y, loadedObj.Vertices[f[i].VertexIndex - 1].Z ); } polygons.Add(p); } } fileStream.Close(); return(polygons); }
static void Main(string[] args) { var stopwatch = new Stopwatch(); stopwatch.Start(); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(new MaterialStreamProvider()); var fileStream = new FileStream(args[0], FileMode.Open, FileAccess.Read); var result = objLoader.Load(fileStream); stopwatch.Stop(); Console.WriteLine(stopwatch.Elapsed); PrintResult(result); }
/// <summary> /// Loads geometry from an OBJ file into native Dynamo geometry. /// </summary> /// <param name="filePath">The filepath of the .OBJ file.</param> /// <returns>List of OBJ Groups as Dynamo PolySurfaces.</returns> public static List <PolySurface> LoadObj(string filePath) { var loaderFactory = new ObjLoaderFactory(); var loader = loaderFactory.Create(); var fs = new FileStream(filePath, FileMode.Open); var result = loader.Load(fs); fs.Close(); List <PolySurface> polySurfaces = new List <PolySurface>(); foreach (var group in result.Groups) { polySurfaces.Add(GetObjGroupMesh(group, result)); } return(polySurfaces); }
public Bitmap Run() { var screen = new Bitmap(640, 480, PixelFormat.Format32bppArgb); var texture = new Bitmap("Data/box.png"); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(new IgnoreMaterial()); var box = objLoader.Load(File.OpenRead("Data/box.obj")); (var idata, var vdata) = CreateVertexArray(box); var lookAt = Matrix4x4.CreateLookAt(new Vector3(3.0f, 2.0f, 5.0f), new Vector3(0.0f), new Vector3(0.0f, 1.0f, 0.0f)); var fieldOfView = (float)(60.0 * Math.PI / 180.0); var aspect = 4.0f / 3.0f; var perspective = Matrix4x4.CreatePerspectiveFieldOfView(fieldOfView, aspect, 0.1f, 10.0f); var r = new Rasterizer(); var v = new VertexProcessor(r); r.SetRasterMode(RasterMode.Span); r.SetScissorRect(0, 0, 640, 480); v.SetViewport(0, 0, 640, 480); v.SetCullMode(CullMode.CW); var pixelShader = new PixelShader(); pixelShader.Screen = screen; pixelShader.Texture = texture; r.SetPixelShader(pixelShader); var vertexShader = new VertexShader(); vertexShader.Data = vdata; vertexShader.ModelViewProjectionMatrix = lookAt * perspective; v.SetVertexShader(vertexShader); v.DrawElements(DrawMode.Triangle, idata.Count, idata); return(screen); }
protected void LoadModel(Stream str) { using (ZipArchive zip = new ZipArchive(str)) { ZipArchiveEntry mesh = zip.GetEntry("mesh.obj"); ZipArchiveEntry mtl = zip.GetEntry("mesh.mtl"); ZipArchiveEntry texture = zip.GetEntry("tex_0.jpg"); using (new CursorSwitcher(null)) { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(new ObjMaterialStreamProvider(mtl)); var result = objLoader.Load(mesh.Open()); _currentWireframe = null; _currentMesh = ObjTriangleMeshAdapater.BuildVisualModel(result, texture); _currentMeshMatGroup = (_currentMesh.Content as GeometryModel3D).Material; // Reset the model & transform(s) this.model.Children.Clear(); _currentDisplayMode = DisplayMode.Textured; this.model.Children.Add(_currentMesh); } } Home_Click(null, null); }
public static (List <IHitable>, Camera) CornellScene(string objPath, ImSoRandom rnd, int nx, int ny) { var world = new List <IHitable>(); var grad = new Lambertian(new ColourTexture()); var blue = new Lambertian(new ConstantTexture(0.05f, 0.05f, 0.65f)); var red = new Lambertian(new ConstantTexture(0.65f, 0.05f, 0.05f)); var white = new Lambertian(new ConstantTexture(0.73f, 0.73f, 0.73f)); var green = new Lambertian(new ConstantTexture(0.12f, 0.45f, 0.15f)); var light = new DiffuseLight(new ConstantTexture(15f, 15f, 15f)); var glass = new Dialectric(1.5f); world.Add(new RectXZ(213, 343, 227, 332, 554, light)); world.Add(new FlipNormals(new RectYZ(0, 555, 0, 555, 555, green))); world.Add(new RectYZ(0, 555, 0, 555, 0, red)); world.Add(new FlipNormals(new RectXZ(0, 555, 0, 555, 555, white))); world.Add(new RectXZ(0, 555, 0, 555, 0, white)); world.Add(new FlipNormals(new RectXY(0, 555, 0, 555, 555, white))); //world.Add( new Translate( new Box(Vector3.Zero, new Vector3(165, 165, 165), white), new Vector3(130, 0, 65))); //world.Add( new Translate( new Box(Vector3.Zero, new Vector3(165, 330, 165), white), new Vector3(265, 0, 295))); //world.Add(new Sphere(new Vector3(0, 0, 0), 3000.0f, new DiffuseLight(new ConstantTexture(new Vector3(1, 1, 1))))); /* * for (int i = 0; i < 50; i++) * { * var a = rnd.RandomVector(); * var b = rnd.RandomVector(); * var c = rnd.RandomVector(); * * //world.Add(new Translate(new Triangle(new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), red),new Vector3(10 + rnd.NextFloat() * 100f, 10 + rnd.NextFloat() * 100f, 10 + rnd.NextFloat() * 100f))); * world.Add(new Triangle(a, b, c, blue)); * } * */ //world.Add(new Triangle( new Vector3(340, 90, 62),new Vector3(100, 320, 190), new Vector3(262, 331, 400), grad)); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream(objPath, FileMode.Open); var obj = objLoader.Load(fileStream); var objBox = obj.GetBoundingBox(); var centerOffset = objBox.Center(); var height = objBox.Max.Y - objBox.Min.Y; var scaleFactor = new Vector3(50, 50, 50); // scale obj to wold space var displacement = new Vector3(555f / 2, height / 2f * scaleFactor.Y, 555f / 3 * 2); var glossScaleFactor = new Vector3(0.5f, 0.5f, 0.5f); // scale the unit vector normal foreach (var g in obj.Groups) { foreach (var f in g.Faces) { // Verticies have their origin set to the center of the bounding box var v0 = obj.Vertices[f[0].VertexIndex - 1].ToVector3() - centerOffset; var v1 = obj.Vertices[f[1].VertexIndex - 1].ToVector3() - centerOffset; var v2 = obj.Vertices[f[2].VertexIndex - 1].ToVector3() - centerOffset; var t = new Triangle(v0 * scaleFactor, v1 * scaleFactor, v2 * scaleFactor, glass); // add Dialectric world.Add(new Translate(t, displacement)); // add Lambertian. translated toward obj center by glossScaleFactor of a unit vector world.Add(new Translate(new Triangle(v0 * scaleFactor, v1 * scaleFactor, v2 * scaleFactor, white), displacement - Vector3.Normalize(t.Normal))); } } var lookFrom = new Vector3(278, 278, -800); var lookAt = new Vector3(278, 278, 0); var distToFocus = (lookFrom - lookAt).Length() - scaleFactor.Length() / 2; var aperture = 0.1f; var vFov = 40; var cam = new Camera(lookFrom, lookAt, new Vector3(0, 1, 0), vFov, (float)nx / (float)ny, aperture, distToFocus, 0.0f, 1.0f); return(world, cam); }
public static LoadResult loadObject(string fileName) { return(ObjLoaderFactory.Create().Load(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None))); }
private void ModelsLoading() { var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); var fileStream = new FileStream("humanoid_tri.obj", FileMode.Open); var result = objLoader.Load(fileStream); fileStream.Close(); //man1 float[] color = new float[] { 1.0f, 0.0f, 0.0f, 1.0f }; Vector3 position = new Vector3(10, -11.5f, -5); Vector3 rotation = new Vector3(-1, 0, 0); float rotationAngle = 90.0f; Vector3 scale = new Vector3(1.0f, 0.5f, 0.5f); //Models.Add(new Mesh(result, position, rotation, rotationAngle, scale, color)); ////man2 //color = new float[] { 0.0f, 1.0f, 0.0f, 1.0f }; //position = new Vector3(10, -11.5f, 7); //rotation = new Vector3(-1, 0, 0); //rotationAngle = 90.0f; //scale = new Vector3(1.0f, 0.5f, 0.5f); //Models.Add(new Mesh(result, position, rotation, rotationAngle, scale, color)); objLoader = objLoaderFactory.Create(); fileStream = new FileStream("teapot.obj", FileMode.Open); result = objLoader.Load(fileStream); fileStream.Close(); color = new float[] { 0.0f, 0.0f, 1.0f, 1.0f }; //position = new Vector3(-30, 1, 1); //rotation = new Vector3(0, 1, 0); rotationAngle = 360.0f; scale = new Vector3(0.15f, 0.15f, 0.15f); position = new Vector3(5, 0, -5); Models.Add(new Mesh(result, position, rotation, rotationAngle, scale, color)); //objLoader = objLoaderFactory.Create(); //fileStream = new FileStream("sphere.obj", FileMode.Open); //result = objLoader.Load(fileStream); //fileStream.Close(); //color = new float[] { 0.5f, 0.5f, 0.5f, 1.0f }; //position = new Vector3(-10.0f, 0.0f + drawEps, 1.0f); //rotation = new Vector3(0, 1.0f, 0); //rotationAngle = 360.0f; //scale = new Vector3(1.0f, 1.0f, 1.0f); //Models.Add(new Mesh(result, position, rotation, rotationAngle, scale, color)); //objLoader = objLoaderFactory.Create(); //fileStream = new FileStream("cube.obj", FileMode.Open); //result = objLoader.Load(fileStream); //fileStream.Close(); //color = new float[] { 0.5f, 0.5f, 0.5f, 1.0f }; //position = new Vector3(-10.0f, -9.0f + drawEps, 1.0f); //rotation = new Vector3(0, 1.0f, 0); //rotationAngle = 360.0f; //scale = new Vector3(1.0f, 1.0f, 1.0f); //Models.Add(new Mesh(result, position, rotation, rotationAngle, scale, color)); }
static void Main(string[] args) { Engine.AppName = "Test"; Engine.EnableValidation = true; Engine.RebuildShaders = true; Engine.Initialize(); var graph = new FrameGraph(0); Engine.RenderGraph = graph; int trace_side = 1024; var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(); using (var fs = File.OpenRead("sponza.obj")) { var obj_loaded = objLoader.Load(fs); ulong idxCount = 0; for (int i = 0; i < obj_loaded.Groups.Count; i++) { idxCount += (ulong)obj_loaded.Groups[i].Faces.Count * 3; } vertexBuffer = new StreamableBuffer("vbo", (ulong)obj_loaded.Vertices.Count * 3 * sizeof(float), BufferUsage.Storage); indexBuffer = new StreamableBuffer("ibo", idxCount * sizeof(uint), BufferUsage.Index | BufferUsage.Storage); rayIntersections = new RayIntersections("rayInter", (uint)trace_side * (uint)trace_side, 0); geometry = new RayGeometry("rayGeom", (uint)obj_loaded.Vertices.Count); unsafe { float *fp = (float *)vertexBuffer.BeginBufferUpdate(); for (int i = 0; i < obj_loaded.Vertices.Count; i++) { fp[0] = obj_loaded.Vertices[i].X; fp[1] = obj_loaded.Vertices[i].Y; fp[2] = obj_loaded.Vertices[i].Z; fp += 3; } vertexBuffer.EndBufferUpdate(); uint *ui = (uint *)indexBuffer.BeginBufferUpdate(); for (int i = 0; i < obj_loaded.Groups.Count; i++) { for (int j = 0; j < obj_loaded.Groups[i].Faces.Count; j++) { ui[0] = (uint)(obj_loaded.Groups[i].Faces[j][0].VertexIndex - 1); ui[1] = (uint)(obj_loaded.Groups[i].Faces[j][1].VertexIndex - 1); ui[2] = (uint)(obj_loaded.Groups[i].Faces[j][2].VertexIndex - 1); ui += 3; } } indexBuffer.EndBufferUpdate(); float *rp = (float *)rayIntersections.RayBuffer.BeginBufferUpdate(); for (uint x = 0; x < trace_side; x++) { for (uint y = 0; y < trace_side; y++) { //uint i = 0; //for(int j = 0; j < 15; j++) //{ // i |= ((x & (1u << j)) << j) | ((y & (1u << j)) << (j + 1)); //} //i *= 8; uint i = ((uint)trace_side * y + x) * 8; rp[i + 0] = 0.0f; rp[i + 1] = 15.0f; rp[i + 2] = 0.0f; rp[i + 4] = -1.0f; rp[i + 5] = -1.0f + (2.0f / trace_side) * y; rp[i + 6] = -1.0f + (2.0f / trace_side) * x; rp[i + 3] = 0.001f; rp[i + 7] = 100000.0f; } } rayIntersections.RayBuffer.EndBufferUpdate(); geometry.SetupBuild(0, (uint)(idxCount / 3), vertexBuffer.LocalBuffer, 0, indexBuffer.LocalBuffer, 0, false); } } vertS = new SpecializedShader() { Name = "FST_Vert", Shader = ShaderSource.Load(ShaderType.VertexShader, "FullScreenTriangle/vertex.glsl"), SpecializationData = null }; fragS = new SpecializedShader() { Name = "UVR_Frag", Shader = ShaderSource.Load(ShaderType.FragmentShader, "FullScreenTriangle/clear_frag.glsl"), SpecializationData = null, }; depthImages = new Image[GraphicsDevice.MaxFramesInFlight]; depthImageViews = new ImageView[GraphicsDevice.MaxFramesInFlight]; for (int i = 0; i < GraphicsDevice.MaxFramesInFlight; i++) { depthImages[i] = new Image($"depthImage_{i}") { Cubemappable = false, Width = GraphicsDevice.Width, Height = GraphicsDevice.Height, Depth = 1, Dimensions = 2, InitialLayout = ImageLayout.Undefined, Layers = 1, Levels = 1, MemoryUsage = MemoryUsage.GpuOnly, Usage = ImageUsage.DepthAttachment | ImageUsage.Sampled, Format = ImageFormat.Depth32f, }; depthImages[i].Build(0); depthImageViews[i] = new ImageView($"depthImageView_{i}") { BaseLayer = 0, BaseLevel = 0, Format = ImageFormat.Depth32f, LayerCount = 1, LevelCount = 1, ViewType = ImageViewType.View2D, }; depthImageViews[i].Build(depthImages[i]); } Engine.OnRebuildGraph += Engine_OnRebuildGraph; Engine.OnRender += Engine_OnRender; Engine.OnUpdate += Engine_OnUpdate; Engine.Start(0); }
private unsafe IAsset BuildAsset(AssetLoadInfo loadInfo) { var fileData = loadInfo.FileSystem.ReadAllBytes(loadInfo.LoadPath); var objLoaderFactory = new ObjLoaderFactory(); var objLoader = objLoaderFactory.Create(new MyMaterialStreamProvider(Path.GetDirectoryName(loadInfo.LoadPath), loadInfo.FileSystem)); LoadResult objLoadResult; using (var stream = new MemoryStream(fileData)) objLoadResult = objLoader.Load(stream); var anyTextures = objLoadResult.Textures.Any(); var initialMediatorIndices = new int?[objLoadResult.Vertices.Count]; var mediators = new List <VertexMediator>(); var faceMediatorIndices = new List <int>(); var indexList = new List <int>(); var materials = new List <IStandardMaterial>(); var modelParts = new List <FlexibleModelPart>(); foreach (var grp in objLoadResult.Groups) { var startIndexLocation = indexList.Count; foreach (var face in grp.Faces) { faceMediatorIndices.Clear(); foreach (var fv in face.EnumerateVertices()) { var newMediator = new VertexMediator { PositionIndex = fv.VertexIndex - 1, NormalIndex = fv.NormalIndex - 1, TexCoordIndex = anyTextures ? fv.TextureIndex - 1 : 0 }; var initialIndex = initialMediatorIndices[newMediator.PositionIndex]; if (!initialIndex.HasValue) { var mediatorIndex = mediators.Count; mediators.Add(newMediator); faceMediatorIndices.Add(mediatorIndex); initialMediatorIndices[newMediator.PositionIndex] = mediatorIndex; } else { var mediatorIndex = initialIndex.Value; var oldMediator = mediators[mediatorIndex]; while (true) { if (oldMediator.PositionIndex == newMediator.PositionIndex && oldMediator.NormalIndex == newMediator.NormalIndex && oldMediator.TexCoordIndex == newMediator.TexCoordIndex) { break; } if (!oldMediator.NextMediator.HasValue) { mediatorIndex = mediators.Count; mediators.Add(newMediator); oldMediator.NextMediator = mediatorIndex; break; } mediatorIndex = oldMediator.NextMediator.Value; oldMediator = mediators[mediatorIndex]; } faceMediatorIndices.Add(mediatorIndex); } } if (faceMediatorIndices.Count <= 3) { for (int i = 0; i < faceMediatorIndices.Count - 3; i++) { indexList.Add(faceMediatorIndices[0]); } foreach (var mi in faceMediatorIndices) { indexList.Add(mi); } } else { for (int i = 0; i < faceMediatorIndices.Count - 2; i++) { indexList.Add(faceMediatorIndices[0]); indexList.Add(faceMediatorIndices[i + 1]); indexList.Add(faceMediatorIndices[i + 2]); } } } var indexCount = indexList.Count - startIndexLocation; var color = grp.Material != null ? new Color4( grp.Material.DiffuseColor.X, grp.Material.DiffuseColor.Y, grp.Material.DiffuseColor.Z) : (Color4?)null; // todo: use material modelParts.Add(new FlexibleModelPart { VertexSetIndex = 0, ModelMaterialName = grp.Material?.Name ?? "DefaultMaterial", PrimitiveTopology = FlexibleModelPrimitiveTopology.TriangleList, IndexCount = indexCount, FirstIndex = startIndexLocation }); } VertexPosNormTex[] finalVertices; int[] finalIndices; if (objLoadResult.Normals.Count > 0) { var vertices = mediators.Select(m => new VertexPosNormTex()).ToArray(); for (int i = 0; i < mediators.Count; i++) { var mediator = mediators[i]; vertices[i].Position = objLoadResult.Vertices[mediator.PositionIndex].ToClarity(); vertices[i].Normal = objLoadResult.Normals[mediator.NormalIndex].ToClarity(); if (anyTextures) { vertices[i].TexCoord = objLoadResult.Textures[mediator.TexCoordIndex].ToClarity(); } } finalVertices = vertices; finalIndices = indexList.ToArray(); } else { var newIndices = Enumerable.Range(0, indexList.Count).ToArray(); var newVertices = new VertexPosNormTex[newIndices.Length]; for (int i = 0; i + 2 < indexList.Count; i += 3) { var mediator0 = mediators[indexList[i]]; var mediator1 = mediators[indexList[i + 1]]; var mediator2 = mediators[indexList[i + 2]]; var pos0 = objLoadResult.Vertices[mediator0.PositionIndex].ToClarity(); var pos1 = objLoadResult.Vertices[mediator1.PositionIndex].ToClarity(); var pos2 = objLoadResult.Vertices[mediator2.PositionIndex].ToClarity(); newVertices[i] = new VertexPosNormTex { Position = pos0, Normal = -Vector3.Cross(pos2 - pos0, pos1 - pos0).Normalize(), TexCoord = new Vector2(0.3f, 0.3f) }; newVertices[i + 1] = new VertexPosNormTex { Position = pos1, Normal = -Vector3.Cross(pos0 - pos1, pos2 - pos1).Normalize(), TexCoord = new Vector2(0.7f, 0.3f) }; newVertices[i + 2] = new VertexPosNormTex { Position = pos2, Normal = -Vector3.Cross(pos1 - pos2, pos0 - pos2).Normalize(), TexCoord = new Vector2(0.5f, 0.7f) }; } finalVertices = newVertices; finalIndices = newIndices; } var pack = new ResourcePack(ResourceVolatility.Immutable); IRawDataResource vertexRawData; fixed(VertexPosNormTex *pVertices = finalVertices) vertexRawData = new RawDataResource(ResourceVolatility.Immutable, (IntPtr)pVertices, sizeof(VertexPosNormTex) * finalVertices.Length); pack.AddSubresource("VertexRawData", vertexRawData); IRawDataResource indexRawData; fixed(int *pIndices = finalIndices) indexRawData = new RawDataResource(ResourceVolatility.Immutable, (IntPtr)pIndices, sizeof(int) * finalIndices.Length); pack.AddSubresource("IndexRawData", indexRawData); var arraySubranges = new [] { vertexRawData.GetSubrange(0), indexRawData.GetSubrange(0) }; var elementInfos = VertexPosNormTex.GetElementsInfos(0); var indicesInfo = new VertexIndicesInfo(1, CommonFormat.R32_UINT); var vertexSet = new FlexibleModelVertexSet(ResourceVolatility.Immutable, arraySubranges, elementInfos, indicesInfo); pack.AddSubresource("VertexSet", vertexSet); var sphere = Sphere.BoundingSphere(finalVertices, x => x.Position); var model = new FlexibleModel(ResourceVolatility.Immutable, new [] { vertexSet }, modelParts, sphere); pack.AddSubresource("Model", model); pack.MainSubresource = model; var hash = AssetHashMd5.FromSingleFile(fileData); var fileName = Path.GetFileName(loadInfo.LoadPath); return(new Asset(loadInfo.AssetName, pack, AssetStorageType.CopyLocal, hash, loadInfo.ReferencePath, fileName)); }