Editing User:Clouddrift/GSoC2014/Midterm

From BRL-CAD

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
 
== Reorganize NMG Data Structure ==
 
== Reorganize NMG Data Structure ==
  
The functionality of struct '''model''' and '''nmgregion''' are top two level of old nmg structure. One '''model''' can include multiple '''nmgregion''', and one '''nmgregion''' can include multiple '''shell'''. We can have a brief view at following class definition.  
+
The functionality of struct '''model''' and '''nmgregion''' are redundant to '''combination''' concept in BRL-CAD.
  
<pre>
 
 
struct model
 
struct model
 
{
 
{
Line 10: Line 9:
 
     char *manifolds;            /**< @brief structure 1-3manifold table */
 
     char *manifolds;            /**< @brief structure 1-3manifold table */
 
     long index; /**< @brief struct # in this model */
 
     long index; /**< @brief struct # in this model */
     long maxindex; /**< @brief # of structs so far */
+
     '''long maxindex; /**< @brief # of structs so far */'''
 
};
 
};
</pre>
 
  
<pre>
 
 
struct nmgregion {
 
struct nmgregion {
 
     struct bu_list l; /**< @brief regions, in model's r_hd list */
 
     struct bu_list l; /**< @brief regions, in model's r_hd list */
Line 22: Line 19:
 
     long index; /**< @brief struct # in this model */
 
     long index; /**< @brief struct # in this model */
 
};
 
};
</pre>
 
  
In general, it's a classical representation for NMG structure. But they are  redundant in BRL-CAD. There have been similar concepts here called '''combination''' which can hold several primitives as a whole. So some reorganization is necessary that these two structs ('''model''' and '''nmgregion''') are replaced by the BRL-CAD inner '''combination''' to fit new NMG philosophy.
+
Then, change struct '''shell''' to fit new nmg philosophy.
  
To achieve this target, we should move some important members from '''model''' and '''nmgregion''' to new '''shell''' to keep existing function, then take the new '''shell''' as the top level of new NMG structure. Details as following:
+
old:
  
* '''char *manifolds''': Describe the meaning of a NMG structure.
 
* '''long maxindex''': Record the element(nmg structure of various levels) count of a NMG structure. It is important in MAKE and IMPORT/EXPORT part such as deciding how big memory should be allocated.
 
 
Then, let's check the definition of old '''shell''':
 
 
<pre>
 
 
struct shell {
 
struct shell {
     struct bu_list l; /**< @brief shells, in region's s_hd list */
+
     '''struct bu_list l; /**< @brief shells, in region's s_hd list */'''
     struct nmgregion *r_p; /**< @brief owning region */
+
     '''struct nmgregion *r_p; /**< @brief owning region */'''
 
     struct shell_a *sa_p; /**< @brief attribs */
 
     struct shell_a *sa_p; /**< @brief attribs */
 
     struct bu_list fu_hd; /**< @brief list of face uses in shell */
 
     struct bu_list fu_hd; /**< @brief list of face uses in shell */
Line 44: Line 34:
 
     long index; /**< @brief struct # in this model */
 
     long index; /**< @brief struct # in this model */
 
};
 
};
</pre>
 
  
Obviously, some members should be changed to achieve new NMG philosophy:
+
new:
* '''struct nmgregion *r_p''': Can be removed since there is no '''nmgregion''' concept any more.
 
* '''struct bu_list l''': We don't need this backward point which points to '''shell''' 'superior level structure. But a new member '''uint32_t magic''' is still necessary.
 
 
 
Following is the new '''shell''' definition after reorganization.
 
 
 
<pre>
 
 
struct shell {
 
struct shell {
     uint32_t magic;
+
     '''uint32_t magic;'''
 
     struct shell_a *sa_p; /**< @brief attribs */
 
     struct shell_a *sa_p; /**< @brief attribs */
 
     struct bu_list fu_hd; /**< @brief list of face uses in shell */
 
     struct bu_list fu_hd; /**< @brief list of face uses in shell */
Line 60: Line 43:
 
     struct bu_list eu_hd; /**< @brief wire list (shell has wires) */
 
     struct bu_list eu_hd; /**< @brief wire list (shell has wires) */
 
     struct vertexuse *vu_p; /**< @brief internal ptr to single vertexuse */
 
     struct vertexuse *vu_p; /**< @brief internal ptr to single vertexuse */
     char *manifolds; /**< @brief structure 1-3manifold table */
+
     '''char *manifolds; /**< @brief structure 1-3manifold table */'''
 
     long index; /**< @brief struct # in this model */
 
     long index; /**< @brief struct # in this model */
     long maxindex; /**< @brief # of structs so far */
+
     '''long maxindex; /**< @brief # of structs so far */'''
 
};
 
};
</pre>
 
  
== Fit New NMG Data Structure ==
+
== Fix Debugs ==
  
Changing the NMG data structure is just first step. Due to these change, thousands of compiling errors are coming. I spent most of my time in these weeks to fix and test them properly.
+
Due to the change of core NMG data structure, thousands of compiling errors are coming. I spend most time in these weeks to fix and test them properly.
  
It worth mentioning that 28 functions in raytrace.h are removed which may simplify the future work because they are no longer useful. The detailed list is as following:
+
28 functions in raytrace.h are removed because they are no longer necessary. The detailed list is as following:
  
 
* struct model *'''nmg_mmr'''(void);
 
* struct model *'''nmg_mmr'''(void);
Line 100: Line 82:
 
* void '''nmg_visit_region'''(struct nmgregion *r, const struct nmg_visit_handlers *htab, genptr_t state);
 
* void '''nmg_visit_region'''(struct nmgregion *r, const struct nmg_visit_handlers *htab, genptr_t state);
 
* void '''nmg_visit_model'''(struct model *model, const struct  nmg_visit_handlers *htab, genptr_t state);
 
* void '''nmg_visit_model'''(struct model *model, const struct  nmg_visit_handlers *htab, genptr_t state);
 
After that, there is no shortcut but to check the compiling errors one by one. Read the codes, understand the context and fix them to fit new nmg structure. It's a bit tedious but helpful for getting familiar with this part of BRL-CAD further more. There are some main kinds of situation:
 
* Change a function of '''model/nmgregion''' version to a '''shell''' version.
 
* Extend existing function to support new members of '''shell'''.
 
* Remove the traversal of '''model/nmgregion'''. Fortunately, some function assume only one '''shell''' in the '''model'''.
 
  
 
== Conclusion ==
 
== Conclusion ==
 
At first, I'd like to extend my heartfelt gratitude to my mentor, Daniel and other developers in BRL-CAD community. I was so excited to learn plenty of knowledge and skills which cannot be gained in other places.
 
 
I am sorry that my progress falls a little bit behind compared with my initial proposal because some mistake make me go into a wrong way especially when I fix the functionality about Import/export modules. It takes me some time to figure out what happens exactly to MGED when user use 'facetize -n' command and to find out the most proper solution. In next weeks, I will speed up to catch up with the schedule and try my best to finish the project as what I promised.
 
 
As for the code statistics, the result from statSVN shows 303 places in my branch have been changed. The count of code lines been changed is 3608.
 

Please note that all contributions to BRL-CAD may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see BRL-CAD:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)