/* $Header: $ */
/* $NoKeywords: $ */

Legal Stuff:

  Copyright (c) 1993-2010 Robert McNeel & Associates. All Rights Reserved.
  Rhinoceros is a registered trademark of Robert McNeel & Associates.

  THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
  WARRANTY.  ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR
  PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.

====================================================================

Answers to frequently asked questions.

====================================================================

Support:

  If you have a question concerning the openNURBS Toolkit that
  is not answered in faq.txt or covered in the examples,
  then please post your question on the support newsgroup at
  <news://news.mcneel.com/opennurbs>.

  If you are at a location that does not permit access to
  <news://news.mcneel.com/opennurbs>, then you can use the web
  version of the newsgroup at
  <http://news2.mcneel.com/scripts/dnewsweb.exe?cmd=xover&group=opennurbs>
  
  You can search archived newsgroup messages at
  <http://news2.mcneel.com/scripts/dnewsweb.exe?cmd=f_search&utag=>

====================================================================

Versions of 3DM files.

Version 1 3DM files:
  The openNURBS toolkit will read version 1 files.
  Rhino 1 and other applications using the old Rhino I/O toolkit 
  create version 1 files.

Version 2 3DM files:
  The openNURBS toolkit will read and write version 2 files.
  Rhino 2 and applications using an openNURBS toolkit released on
  or after December 2000 create version 2 files.  (Rhino 1 and
  the old Rhino I/O toolkit will not read version 2 files.)

Version 3 3DM files:
  The openNURBS toolkit will read and write version 3 files.
  Rhino 3 and applications using an openNURBS toolkit released on
  or after October 2002 create version 3 files.  (Rhino 1 and
  Rhino 2 will not read version 2 files.)

Version 4 3DM files:
  The openNURBS toolkit will read and write version 4 files.
  Rhino 4 and applications using an openNURBS toolkit released on
  or after September 2006 create version 4 files.  (Rhino 1, 
  Rhino 2, and Rhino 3 will not read version 4 files.)

Version 5 3DM files:
  The openNURBS toolkit will read and write version 5 files.
  Rhino 5 and applications using an openNURBS toolkit released on
  or after September 2009 create version 5 files.  (Rhino 1, 
  Rhino 2, Rhino 3 and Rhino 4 will not read version 5 files.)

====================================================================

Supported compilers:

Question:

Can I use my brand X C++ compiler?

Answer:

The openNURBS toolkit has been successfully used with

  Microsoft Visual C++ 2005 (VC 8.0) (32 and 64 bit Windows 7, Vista, XP )

  gcc version 4.2.1 (Apple Inc. build 5646)
  
  Apple XCode (MaxBook Pro + OSX)

The openNURBS C++ source code is clean and fairly simple.  You
should be able to use any good C++ compiler that has 32-bit
integers and 32-bit or 64-bit pointers.

OpenNURBS uses UNICODE to store text information in
3DM files.  At the time of this release, support for
UNICODE / ASCII conversion on UNIX platforms is spotty
at best.

Excellent compilers and make utilities are available from
The Free Software Foundation <http://www.fsf.org>.  You have
the option of using these tools free of charge.

If you are using a good quality C++ compiler and run into
some toolkit code that causes problems, please let us know
and we'll attempt to change the code to accommodate the
compiler.

====================================================================

Compiling the Open GL example:

Carefully read the three paragraphs in the readme.txt file that cover
example_gl.cpp.

1)
Your system must have the Open GL header files and libraries,
including the auxiliary library (usually contains the Open GL
NURBS rendering stuff) and the utility library.  Consult your
documentation or local GL whiz for details.

2)
To create the example_gl program you must compile two openNURBS
toolkit files (example_gl.cpp and opennurbs_gl.cpp) and link both
resulting objects with the openNURBS library and Open GL libraries.
If you get unresolved references to ON_GL() functions, then you
probably forgot compile opennurbs_gl.cpp or forgot to link with
opennurbs_gl.o/obj.

====================================================================

Vertex ordering in ON_Mesh faces:

All faces in a ON_Mesh are stored with vertices listed in
counter-clockwise order.  In particular, for quads the
vertices are ordered as

v3-----v2
|     |
v0-----v1

The quads may be non-planar.

The definition of

   void ON_GL( const ON_Mesh&  )

in opennurbs_gl.cpp demonstrates how to go through an ON_Mesh and
render all the quads as two triangles.

====================================================================

Orientation of ON_Brep faces:

The "UV" orientation of surfaces in a Brep is arbitrary.  If the

BOOL ON_BrepFace::m_bRev

member is FALSE, then the face's orientation agrees with the
surface's natural Du X Dv orientation.  When the member is TRUE,
the face's orientation is opposite the surface's natural Du X Dv
orientation.

If your application cannot handle ON_BrepFaces that have a
TRUE m_bRev flag, then call ON_Brep::FlipReversedSurfaces().
See the comments in ON_Brep::FlipReversedSurfaces() and
ON_Brep::SwapFaceParameters() for details.

====================================================================

Trimming loop order and nesting:

The ON_BrepLoop::m_type member records the type of boundary
(inner, outer, etc.).  A ON_BrepFace has exactly one outer
loop and it is the first loop referenced in the
ON_BrepFace::m_li[] array.  The inner loops all define "holes"
in the ON_BrepFace.  All of the inner holes lie inside of the
outer loop.  A ON_BrepFace is always path connected.
In particular, inner loops are not "nested".

====================================================================

Surfaces in Rhino are read as ON_Breps

Internally, Rhino stores all surfaces as some type of b-rep and the
openNURBS toolkit reads these objects as b-reps.  To see if an entire
ON_Brep is really just a surface, use

BOOL ON_Brep::IsSurface().

If ON_Brep::IsSurface() returns TRUE, then the b-rep geometry
is the same as the surface ON_Brep::m_S[0].

To see of a particular face in a b-rep is really just a surface,
use 

BOOL ON_Brep::FaceIsSurface( face_index ).

If ON_Brep::FaceIsSurface( face_index ) returns TRUE, then the
face's geometry is the same as the surface ON_Brep::m_S[face.m_si].

====================================================================


For details about Rhino, please visit the Rhino web site at

    <http://www.rhino3d.com>.

If you have questions or comments about Rhino that do not directly
pertain to Rhino toolkits, please use the Rhino discussion list.
To subscribe or learn more about the Rhino discussion list, please
visit <http://www.rhino3d.com/support/forum.html>.

====================================================================
