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

Legal Stuff:

  Copyright (c) 1993-2012 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 C++ openNURBS toolkit has been tested with

  Microsoft Visual Studio 2010 (VC 10.0 SP1) (Windows 7 Professional SP1)
    To build opennurbs and the examples with Visual Studio 2010 SP1,
	use the solution build_opennurbs_vs2010.sln.

  gcc version 4.2.1 (Apple Build 5658)
    To build opennurbs and the examples with gcc use the makefile.
  
  Apple Xcode 4.5 (4G182) (OSX 10.8.2)
    To build opennurbs and the examples with Xcode 4.5, use the
	workspace build_opennurbs_xcode.workspace.

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, 32-bit or 64-bit pointers, and wchar_t support.

OpenNURBS uses UTF-16 to store text information in
3DM files and provides tools for converting UTF-16
strings to UTF-8 and UTF-32 strings. The ON_wString
has wchar_t characters.

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.

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

Microsoft Visual C++ 6.0 Users:
  You are on your own.  Support for this compiler is no longer
  provided.

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

Microsoft Visual Studio 2003 users:
  You are on your own.  Support for this compiler is no longer
  provided.

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

Microsoft Visual Studio 2005 users:
  You are on your own.  Support for this compiler is no longer
  provided.

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

Microsoft Visual Studio 2010 users:
  This is the current platform for opennurbs development.

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

The Open GL example:

Past versions of opennurbs have included a crude version of an
Open GL example.  The code for this example is still included in
the current version, but we no longer provide support for using
OpenGL with opennurbs.  Nothing has changed in opennurbs to with
respect to using OpenGL; we simply do not have the resources to
provide quality OpenGL support on the wide variety of platforms
where opennurbs is used.

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

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>.

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