Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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());
        }
Пример #8
0
        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);
        }
Пример #10
0
        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);
        }
Пример #12
0
        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));
        }
Пример #14
0
        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));
            }
        }
Пример #15
0
        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));
            }
        }
Пример #16
0
        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);
        }
Пример #17
0
        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));
        }
Пример #19
0
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
        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);
        }
Пример #23
0
        /// <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);
        }
Пример #24
0
        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);
        }
Пример #25
0
        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);
        }
Пример #26
0
        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);
        }
Пример #27
0
 public static LoadResult loadObject(string fileName)
 {
     return(ObjLoaderFactory.Create().Load(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)));
 }
Пример #28
0
        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));
        }
Пример #29
0
        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);
        }
Пример #30
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));
        }