The idea is to build a geometry viewer application that generates a standalone double-clickable file that views a given model. The approach is to concatenate the contents of a given “.g” file with the function calls from librt, libdm that parse and display a “.g” file, in a standard brlcad setup.

+

The idea is to build a geometry viewer application that generates a standalone double-clickable file that views a given model. The approach is to concatenate the contents of a given “.g” file with the function calls from librt and display a “.g” file, in a standard brlcad setup.

Our source code will generate an executable, we will then separately concatenate a ".g" file into this executable:

Our source code will generate an executable, we will then separately concatenate a ".g" file into this executable:

Line 18:

Line 18:

# Finding the start of ".g" file bytes/headers

# Finding the start of ".g" file bytes/headers

# Populating the g file database for librt

# Populating the g file database for librt

−

# Pass this onto libdm for creation

+

# Plotting the items in the g file using [http://www.glfw.org/docs/latest/pages.html glfw3].

Our motivation is to introduce portability and ability to share results of brlcad via email with users who don’t have brlcad setup in their environments. First we will develop a standalone application but later this can be integrated into mged or any other tool as a brlcad feature.

Our motivation is to introduce portability and ability to share results of brlcad via email with users who don’t have brlcad setup in their environments. First we will develop a standalone application but later this can be integrated into mged or any other tool as a brlcad feature.

−

== Status (06.07.2016) ==

+

== Status (15.08.2016) ==

−

+

−

Our source code takes an embedded .g file and locates it's header bytes from there on it calls db_open() by writing the gbytes into a temporary file and populates struct db_i.

+

+

Our source code takes an embedded .g file and locates it's header bytes from there on it calls db_open() by writing the gbytes into a temporary file and populates struct db_i. The source also calls db_ls to get a count of objects in the database and calls db_walk_tree on one of the objects. Then work a list of all top level objects is fetched via db_ls and then db_walk_tree is called on each of them. The next step is to plot these zones, for this purpose we have decided to choose [http://www.glfw.org/docs/latest/pages.html glfw3]. Currently the work is being done to generate a simple window from our application using glfw.

== Task Breakdown ==

== Task Breakdown ==

Line 38:

Line 37:

• [http://brlcad.org/docs/doxygen-r64112/d4/de4/group__libdm.xhtml '''Libdm'''] is BRL-CAD's primary graphics display manager (dm) library. It is used to display geometry in GUI. This will be utilized by our source to visualize model files.

• [http://brlcad.org/docs/doxygen-r64112/d4/de4/group__libdm.xhtml '''Libdm'''] is BRL-CAD's primary graphics display manager (dm) library. It is used to display geometry in GUI. This will be utilized by our source to visualize model files.

−

This resulting draw result will then be bundled into an “.exe” (windows) and later into packages for Mac & Linux.

+

This resulting draw result will then be bundled into an executable (Linux) and later into packages for Mac & Windows.

Librt is used to open brlcad geometry files and edit them. It reads a .g file by calling the function [http://brlcad.org/docs/doxygen-r64112/d3/d9b/group__dbio.xhtml#gaa9eb8edb99fa1da5d188587e07d8dacc '''db_open'''] and populates a [http://brlcad.org/docs/doxygen-r64112/d2/d66/structdb__i.xhtml '''db_i structure''' ]. To view the geometry files we need [http://brlcad.org/docs/doxygen-r64112/d4/de4/group__libdm.xhtml '''Libdm'''] which takes this db_i structure as input to do so.

Librt is used to open brlcad geometry files and edit them. It reads a .g file by calling the function [http://brlcad.org/docs/doxygen-r64112/d3/d9b/group__dbio.xhtml#gaa9eb8edb99fa1da5d188587e07d8dacc '''db_open'''] and populates a [http://brlcad.org/docs/doxygen-r64112/d2/d66/structdb__i.xhtml '''db_i structure''' ]. To view the geometry files we need [http://brlcad.org/docs/doxygen-r64112/d4/de4/group__libdm.xhtml '''Libdm'''] which takes this db_i structure as input to do so.

As we have located the g file bytes, we simply write out these bytes onto a temporary file and pass this file onto db_open(). db_open then populates the database structure db_i. An [http://brlcad.org/wiki/Example_db_walk_tree '''example'''] is already available that shows the usage of db_open. We are utilizing the skeleton of this example to populate the struct db_i. A cleaner approach would be to directly populate the struct db_i and I am working on that.

As we have located the g file bytes, we simply write out these bytes onto a temporary file and pass this file onto db_open(). db_open then populates the database structure db_i. An [http://brlcad.org/wiki/Example_db_walk_tree '''example'''] is already available that shows the usage of db_open. We are utilizing the skeleton of this example to populate the struct db_i. A cleaner approach would be to directly populate the struct db_i and I am working on that.

+

The next step is to identify the top level objects of a g file. These can be listed by issuing a [http://brlcad.org/wiki/MGED_CMD_tops "tops"] command on mged after opening a g file. In code this can be achieved by following db_ls and/or DB_LS_TOPS in src/libged/*.c.

+

After these top level objects have been identified we need to call [http://brlcad.sourceforge.net/doxygen/d3/d9b/group__dbio.html#ge69d8a8eb90d514e554e1b84bbb7018f db_walk_tree] on each of them.

−

* Interface with libdm

+

;5 Plot the Model using GLFW

−

Interfacing with librt was aided by the hello_world example but interfacing librt was a bit more tricky due to lack of resources. To find out the function calls, dependencies and call graph of "mged->libdm" I used profiling tools and printfs. Currently I have understood the basic architecture of the interaction:

Now I am in the process of figuring out which calls are required by my application source.

+

−

; 4. Create application interface with model file:

+

−

* Create input interface to parse “.g” file

+

−

+

−

The [https://github.com/asadpiz/brlcad-viewer/commit/f064ad3bdb37bbfd0d9f982c73891bbe47724d8d '''commit'''], simply reads a file into a buffer and prints out its contents. Our interest is in the header bits of the file i.e., the bits that start with 7601...., these will help us identify the start of a ".g" file later.

+

GLFW is basically a library to use with OpenGL, to aid in the creation of graphical windows and some other stuff. The plan is to use this library to open up a simple window and then plot all the members of the g file into this window.

Contents

The idea is to build a geometry viewer application that generates a standalone double-clickable file that views a given model. The approach is to concatenate the contents of a given “.g” file with the function calls from librt and display a “.g” file, in a standard brlcad setup.

Our source code will generate an executable, we will then separately concatenate a ".g" file into this executable:

Our motivation is to introduce portability and ability to share results of brlcad via email with users who don’t have brlcad setup in their environments. First we will develop a standalone application but later this can be integrated into mged or any other tool as a brlcad feature.

Our source code takes an embedded .g file and locates it's header bytes from there on it calls db_open() by writing the gbytes into a temporary file and populates struct db_i. The source also calls db_ls to get a count of objects in the database and calls db_walk_tree on one of the objects. Then work a list of all top level objects is fetched via db_ls and then db_walk_tree is called on each of them. The next step is to plot these zones, for this purpose we have decided to choose glfw3. Currently the work is being done to generate a simple window from our application using glfw.

The brlcad suite has many tools and libraries that interact with each other to render and view models. The general architecture is given below:

The most important part for us out of this architecture is the geometry rendering libraries, to be more specific librt & libdm.

• Librt, the library that contains all of the geometry support. It parses the “.g” file and its function calls can be used to extract contents of “g” file. We will use this to parse our model file for Libdm. The relevant function call is “db_open”. There is also possibility to use a higher level library “libged” (ged_open)

• Libdm is BRL-CAD's primary graphics display manager (dm) library. It is used to display geometry in GUI. This will be utilized by our source to visualize model files.

This resulting draw result will then be bundled into an executable (Linux) and later into packages for Mac & Windows.

First step is to merge .g file into executable and then read it's contents. This is achieved by simply concatenating .g file with executable using the Linux "cat" command e.g., cat viewer moss.g > exec.

Then we locate the header bytes (hex) of the embedded .g file from within the executable. From "hexdump" command we can conclude that .g files have the bytes (76 01 00 00 00 00 01 35) in common:

Getting a file descriptor of bytes in memory and passing it on to db_open.

4. Create application Interface with librt

Librt is used to open brlcad geometry files and edit them. It reads a .g file by calling the function db_open and populates a db_i structure. To view the geometry files we need Libdm which takes this db_i structure as input to do so.

As we have located the g file bytes, we simply write out these bytes onto a temporary file and pass this file onto db_open(). db_open then populates the database structure db_i. An example is already available that shows the usage of db_open. We are utilizing the skeleton of this example to populate the struct db_i. A cleaner approach would be to directly populate the struct db_i and I am working on that.

The next step is to identify the top level objects of a g file. These can be listed by issuing a "tops" command on mged after opening a g file. In code this can be achieved by following db_ls and/or DB_LS_TOPS in src/libged/*.c.

After these top level objects have been identified we need to call db_walk_tree on each of them.

5 Plot the Model using GLFW

GLFW is basically a library to use with OpenGL, to aid in the creation of graphical windows and some other stuff. The plan is to use this library to open up a simple window and then plot all the members of the g file into this window.

"When you measure what you are speaking about, and express it in
numbers, you know something about it. When you can not measure and you
can not express it in numbers, your knowledge is of a meager and
unsatisfactory kind. It may be the beginning of knowledge, but you have
scarcely in your thoughts advanced to the stage of science." - William Thompson, Lord Kelvin, 1891

All trademarks referenced herein are the properties of their respective owners. This site is not sponsored, endorsed, or run by the U.S. Government.