/*	
 *		MAXNURBS.h - MAX NURBS access classes
 *
 *			Copyright © Autodesk, Inc. 1997
 *			Author: John Wainwright
 *
 */

#ifndef _H_MAXNURBS
#define _H_MAXNURBS

#include "Max.h"
#include "MaxObj.h"

#ifndef NO_NURBS

class NURBSSetValue;

/* ----------- base class for MAXScript NURBS wrapper classes -------- */

visible_class (NURBSObjectValue)

class NURBSObjectValue : public Value
{
public:
//	NURBSSetValue*		nset;			// NURBBSet I'm in
	static HashTable*	intern_table;
	static void			setup();
	BOOL				in_set;			// TRUE if residing in a NURBSSet (can only be in one and the NS owns deletion)

				NURBSObjectValue() { in_set = FALSE; }
				classof_methods(NURBSObjectValue, Value);
	void		collect() { delete this; }

	// operations
#include "defimpfn.h"
	// standard props
	def_property    ( name );
	def_prop_getter ( nurbsID );
	def_property    ( selected );
	def_prop_getter ( index );
//	def_prop_getter ( nurbsSet );

	void		common_nurbs_params(Value** arg_list, int count);

};

#define NRB_DIRECT		0x0001	// direct access

/* --------------- base class for NURBSPoints ----------------------- */

visible_class_s (NURBSPointValue, NURBSObjectValue)

class NURBSPointValue : public NURBSObjectValue
{
public:
				classof_methods(NURBSPointValue, NURBSObjectValue);
	void		collect() { delete this; }
	
	// operations
#include "defimpfn.h"
	// built-in property accessors
	def_prop_getter ( pos );
	def_prop_getter ( x );
	def_prop_getter ( y );
	def_prop_getter ( z );

	Point3	to_point3() { return to_nurbspoint()->GetPosition(MAXScript_time()); }
};

/* ---------------  wrapper for NURBSIndependentPoints ----------------------- */

applyable_class_s (NURBSIndependentPointValue, NURBSPointValue)

class NURBSIndependentPointValue : public NURBSPointValue
{
public:
	NURBSIndependentPoint* point;

	ScripterExport NURBSIndependentPointValue(Point3 pt);
	ScripterExport NURBSIndependentPointValue(NURBSIndependentPoint* pt);
	static ScripterExport NURBSIndependentPointValue* intern(NURBSIndependentPoint* pt);
	ScripterExport ~NURBSIndependentPointValue() { if (!in_set) delete point; }

				classof_methods(NURBSIndependentPointValue, NURBSPointValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	use_generic  ( eq,	"=");
	use_generic  ( ne,	"!=");

	// built-in property accessors
	def_prop_setter ( pos );
	def_prop_setter ( x );
	def_prop_setter ( y );
	def_prop_setter ( z );

	NURBSIndependentPoint*	to_nurbsindependentpoint() { return point; }
	NURBSPoint*				to_nurbspoint() { return point; }
	NURBSObject*			to_nurbsobject() { return point; }
};

/* ---------------  wrapper for NURBSPointConstPoints ----------------------- */

applyable_class_s (NURBSPointConstPointValue, NURBSPointValue)

class NURBSPointConstPointValue : public NURBSPointValue
{
public:
	NURBSPointConstPoint* point;

	ScripterExport NURBSPointConstPointValue();
	ScripterExport NURBSPointConstPointValue(NURBSPointConstPoint* pt);
	static ScripterExport NURBSPointConstPointValue* intern(NURBSPointConstPoint* pt);
	ScripterExport ~NURBSPointConstPointValue() { if (!in_set) delete point; }

				classof_methods(NURBSPointConstPointValue, NURBSPointValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	 
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( type );
	def_property ( offset );

	NURBSPointConstPoint*	to_nurbspointconstpoint() { return point; }
	NURBSPoint*				to_nurbspoint() { return point; }
	NURBSObject*			to_nurbsobject() { return point; }
};

/* ---------------  wrapper for NURBSCurveConstPoints ----------------------- */

applyable_class_s (NURBSCurveConstPointValue, NURBSPointValue)

class NURBSCurveConstPointValue : public NURBSPointValue
{
public:
	NURBSCurveConstPoint* point;

	ScripterExport NURBSCurveConstPointValue();
	ScripterExport NURBSCurveConstPointValue(NURBSCurveConstPoint* pt);
	static ScripterExport NURBSCurveConstPointValue* intern(NURBSCurveConstPoint* pt);
	ScripterExport ~NURBSCurveConstPointValue() { if (!in_set) delete point; }

				classof_methods(NURBSCurveConstPointValue, NURBSPointValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( type );
	def_property ( offset );
	def_property ( uParam );
	def_property ( normal );
	def_property ( uTangent );
	def_property ( trimCurve );
	def_property ( flipTrim );

	NURBSCurveConstPoint*	to_nurbscurveconstpoint() { return point; }
	NURBSPoint*				to_nurbspoint() { return point; }
	NURBSObject*			to_nurbsobject() { return point; }
};

/* --------------- wrapper for NURBSCurveIntersectPoint ----------------------- */

applyable_class_s (NURBSCurveIntersectPointValue, NURBSPointValue)

class NURBSCurveIntersectPointValue : public NURBSPointValue
{
public:
	NURBSCurveCurveIntersectionPoint* point;

	ScripterExport NURBSCurveIntersectPointValue();
	ScripterExport NURBSCurveIntersectPointValue(NURBSCurveCurveIntersectionPoint* pt);
	static ScripterExport NURBSCurveIntersectPointValue* intern(NURBSCurveCurveIntersectionPoint* pt);
	ScripterExport ~NURBSCurveIntersectPointValue() { if (!in_set) delete point; }

				classof_methods(NURBSCurveIntersectPointValue, NURBSPointValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( trimCurve1 );
	def_property ( trimCurve2 );
	def_property ( flipTrim1 );
	def_property ( flipTrim2 );

	NURBSCurveCurveIntersectionPoint*	to_nurbscurvecurveintersectionpoint() { return point; }
	NURBSPoint*							to_nurbspoint() { return point; }
	NURBSObject*						to_nurbsobject() { return point; }
};

/* --------------- wrapper for NURBSCurveSurfaceIntersectPoint ----------------------- */

applyable_class_s (NURBSCurveSurfaceIntersectPointValue, NURBSPointValue)

class NURBSCurveSurfaceIntersectPointValue : public NURBSPointValue
{
public:
	NURBSCurveSurfaceIntersectionPoint* point;

	ScripterExport NURBSCurveSurfaceIntersectPointValue();
	ScripterExport NURBSCurveSurfaceIntersectPointValue(NURBSCurveSurfaceIntersectionPoint* pt);
	static ScripterExport NURBSCurveSurfaceIntersectPointValue* intern(NURBSCurveSurfaceIntersectionPoint* pt);
	ScripterExport ~NURBSCurveSurfaceIntersectPointValue() { if (!in_set) delete point; }

				classof_methods(NURBSCurveSurfaceIntersectPointValue, NURBSPointValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// built-in property accessors
	def_property ( seed );
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( trimCurve );
	def_property ( flipTrim );

	NURBSCurveSurfaceIntersectionPoint*	to_nurbscurvesurfaceintersectionpoint() { return point; }
	NURBSPoint*							to_nurbspoint() { return point; }
	NURBSObject*						to_nurbsobject() { return point; }
};

/* --------------- wrapper for NURBSSurfConstPoint ----------------------- */

applyable_class_s (NURBSSurfConstPointValue, NURBSPointValue)

class NURBSSurfConstPointValue : public NURBSPointValue
{
public:
	NURBSSurfConstPoint* point;

	ScripterExport NURBSSurfConstPointValue();
	ScripterExport NURBSSurfConstPointValue(NURBSSurfConstPoint* pt);
	static ScripterExport NURBSSurfConstPointValue* intern(NURBSSurfConstPoint* pt);
	ScripterExport ~NURBSSurfConstPointValue() { if (!in_set) delete point; }

				classof_methods(NURBSSurfConstPointValue, NURBSPointValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( type );
	def_property ( offset );
	def_property ( uParam );
	def_property ( vParam );
	def_property ( normal );
	def_property ( uTangent );
	def_property ( vTangent );

	NURBSSurfConstPoint*	to_nurbssurfconstpoint() { return point; }
	NURBSPoint*				to_nurbspoint() { return point; }
	NURBSObject*			to_nurbsobject() { return point; }
};

#ifdef WAITING_ON_APT
	/* --------------- 	wrapper for NURBSTrimPoint ----------------------- */

	applyable_class_s (NURBSTrimPointValue, NURBSPointValue)

	class NURBSTrimPointValue : public Value
	{
	public:
		NURBSTrimPoint point;

		ScripterExport NURBSTrimPointValue(double param, NURBSTrimDirection dir);
		ScripterExport NURBSTrimPointValue(NURBSTrimPoint* pt);

					classof_methods(NURBSTrimPointValue, Value);
		void		collect() { delete this; }
		ScripterExport void		sprin1(CharStream* s);
		
		// operations
	#include "defimpfn.h"
		// built-in property accessors
		def_prop_getter ( parameter );
		def_prop_setter ( dir );

		NURBSTrimPoint*			to_nurbstrimpoint() { return point; }
	};
#endif

/* --------------- wrapper for NURBSControlVertex ----------------------- */

applyable_class_s (NURBSControlVertexValue, NURBSObjectValue)

class NURBSControlVertexValue : public NURBSObjectValue
{
public:
	NURBSControlVertex*	cv;

	ScripterExport NURBSControlVertexValue(NURBSControlVertex* icv);
	ScripterExport NURBSControlVertexValue(Point3 pt, float weight);
	static ScripterExport NURBSControlVertexValue* intern(NURBSControlVertex* icv);
	ScripterExport ~NURBSControlVertexValue() { if (!in_set) delete cv; }

				classof_methods(NURBSControlVertexValue, NURBSObjectValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
#	define		is_nurbscontrolvertex(p) ((p)->tag == class_tag(NURBSControlVertexValue))
	
	// operations
#include "defimpfn.h"
	use_generic  ( eq,	"=");
	use_generic  ( ne,	"!=");

	// built-in property accessors
	def_property ( weight );
	def_property ( pos );
	def_property ( x );
	def_property ( y );
	def_property ( z );

	Point3				to_point3() { return cv->GetPosition(MAXScript_time()); }
	NURBSControlVertex* to_nurbscontrolvertex() { return cv; }
	NURBSObject*		to_nurbsobject() { return cv; }
};

/* --------------- base class for NURBSCurve ----------------------- */

class NURBSCurveValueClass : public ValueMetaClass  // visible_class_s (NURBSCurveValue)
{
	public:	
				NURBSCurveValueClass(TCHAR* name) : ValueMetaClass (name) { }
	Value*		classOf_vf(Value** arg_list, int count) { return class_tag(NURBSObjectValue); }
	Value*		superClassOf_vf(Value** arg_list, int count) { return NURBSObjectValue_class.classOf_vf(NULL, 0);}
	void		collect() { delete this; }
	Class_ID	get_max_class_id() { return EDITABLE_CVCURVE_CLASS_ID; }
};
extern ScripterExport NURBSCurveValueClass NURBSCurveValue_class;

class NURBSCurveValue : public NURBSObjectValue
{
public:
				classof_methods(NURBSCurveValue, NURBSObjectValue);
	void		collect() { delete this; }
	
	// operations
#include "defimpfn.h"
	def_generic ( evalPos,	   "evalPos" );
	def_generic ( evalTangent, "evalTangent" );

	// built-in property accessors
	def_prop_getter ( isClosed );
	def_prop_getter ( numTrimPoints );
	def_prop_getter ( parameterRangeMin );
	def_prop_getter ( parameterRangeMax );
	def_property	( matID );

	void		common_curve_params(Value** arg_list, int count);
};

/* --------------- wrapper for NURBSCVCurve ----------------------- */

applyable_class_s (NURBSCVCurveValue, NURBSCurveValue)

class NURBSCVCurveValue : public NURBSCurveValue
{
public:
	NURBSCVCurve* curve;

	ScripterExport NURBSCVCurveValue();
	ScripterExport NURBSCVCurveValue(NURBSCVCurve* pt);
	static ScripterExport NURBSCVCurveValue* intern(NURBSCVCurve* pt);
	ScripterExport ~NURBSCVCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSCVCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	use_generic ( close,	"close" );
	def_generic ( getKnot,	"getKnot" );
	def_generic ( setKnot,	"setKnot" );
	def_generic ( getCV,	"getCV" );
	def_generic ( setCV,	"setCV" );
	def_generic ( refine,	"refine" );
	def_generic ( reparameterize, "reparameterize" );

	// built-in property accessors
	def_property ( order );
	def_property ( numKnots );
	def_property ( numCVs );
	def_property ( transform );
	def_property ( autoParam );
	def_prop_getter ( endsOverlap );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSCVCurve*	to_nurbscvcurve() { return curve;  }
	NURBSObject*	to_nurbsobject() { return curve; }

};

/* --------------- wrapper for NURBSPointCurve ----------------------- */

applyable_class_s (NURBSPointCurveValue, NURBSCurveValue)

class NURBSPointCurveValue : public NURBSCurveValue
{
public:
	NURBSPointCurve* curve;

	ScripterExport NURBSPointCurveValue();
	ScripterExport NURBSPointCurveValue(NURBSPointCurve* pt);
	static ScripterExport NURBSPointCurveValue* intern(NURBSPointCurve* pt);
	ScripterExport ~NURBSPointCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSPointCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	use_generic ( close,	"close" );
	def_generic ( getPoint,	"getPoint" );
	def_generic ( setPoint,	"setPoint" );
	def_generic ( refine,	"refine" );

	// built-in property accessors
	def_property ( numPoints );
	def_property ( transform );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSBlendCurve ----------------------- */

applyable_class_s (NURBSBlendCurveValue, NURBSCurveValue)

class NURBSBlendCurveValue : public NURBSCurveValue
{
public:
	NURBSBlendCurve* curve;

	ScripterExport NURBSBlendCurveValue();
	ScripterExport NURBSBlendCurveValue(NURBSBlendCurve* pt);
	static ScripterExport NURBSBlendCurveValue* intern(NURBSBlendCurve* pt);
	ScripterExport ~NURBSBlendCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSBlendCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( flip1 );
	def_property ( flip2 );
	def_property ( tension1 );
	def_property ( tension2 );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSOffsetCurve ----------------------- */

applyable_class_s (NURBSOffsetCurveValue, NURBSCurveValue)

class NURBSOffsetCurveValue : public NURBSCurveValue
{
public:
	NURBSOffsetCurve* curve;

	ScripterExport NURBSOffsetCurveValue();
	ScripterExport NURBSOffsetCurveValue(NURBSOffsetCurve* pt);
	static ScripterExport NURBSOffsetCurveValue* intern(NURBSOffsetCurve* pt);
	ScripterExport ~NURBSOffsetCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSOffsetCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( distance );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSXFormCurve ----------------------- */

applyable_class_s (NURBSXFormCurveValue, NURBSCurveValue)

class NURBSXFormCurveValue : public NURBSCurveValue
{
public:
	NURBSXFormCurve* curve;

	ScripterExport NURBSXFormCurveValue();
	ScripterExport NURBSXFormCurveValue(NURBSXFormCurve* pt);
	static ScripterExport NURBSXFormCurveValue* intern(NURBSXFormCurve* pt);
	ScripterExport ~NURBSXFormCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSXFormCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( transform );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSMirrorCurve ----------------------- */

applyable_class_s (NURBSMirrorCurveValue, NURBSCurveValue)

class NURBSMirrorCurveValue : public NURBSCurveValue
{
public:
	NURBSMirrorCurve* curve;

	ScripterExport NURBSMirrorCurveValue();
	ScripterExport NURBSMirrorCurveValue(NURBSMirrorCurve* pt);
	static ScripterExport NURBSMirrorCurveValue* intern(NURBSMirrorCurve* pt);
	ScripterExport ~NURBSMirrorCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSMirrorCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( axis );
	def_property ( distance );
	def_property ( transform );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSFilletCurve ----------------------- */

applyable_class_s (NURBSFilletCurveValue, NURBSCurveValue)

class NURBSFilletCurveValue : public NURBSCurveValue
{
public:
	NURBSFilletCurve* curve;

	ScripterExport NURBSFilletCurveValue();
	ScripterExport NURBSFilletCurveValue(NURBSFilletCurve* pt);
	static ScripterExport NURBSFilletCurveValue* intern(NURBSFilletCurve* pt);
	ScripterExport ~NURBSFilletCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSFilletCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( flip1 );
	def_property ( flip2 );
	def_property ( radius );
	def_property ( trim1 );
	def_property ( trim2 );
	def_property ( flipTrim1 );
	def_property ( flipTrim2 );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSChamferCurve ----------------------- */

applyable_class_s (NURBSChamferCurveValue, NURBSCurveValue)

class NURBSChamferCurveValue : public NURBSCurveValue
{
public:
	NURBSChamferCurve* curve;

	ScripterExport NURBSChamferCurveValue();
	ScripterExport NURBSChamferCurveValue(NURBSChamferCurve* pt);
	static ScripterExport NURBSChamferCurveValue* intern(NURBSChamferCurve* pt);
	ScripterExport ~NURBSChamferCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSChamferCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( flip1 );
	def_property ( flip2 );
	def_property ( length1 );
	def_property ( length2 );
	def_property ( trim1 );
	def_property ( trim2 );
	def_property ( flipTrim1 );
	def_property ( flipTrim2 );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSIsoCurve ----------------------- */

applyable_class_s (NURBSIsoCurveValue, NURBSCurveValue)

class NURBSIsoCurveValue : public NURBSCurveValue
{
public:
	NURBSIsoCurve* curve;

	ScripterExport NURBSIsoCurveValue();
	ScripterExport NURBSIsoCurveValue(NURBSIsoCurve* pt);
	static ScripterExport NURBSIsoCurveValue* intern(NURBSIsoCurve* pt);
	ScripterExport ~NURBSIsoCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSIsoCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( dir );
	def_property ( parameter );
	def_property ( trim );
	def_property ( flipTrim );
	def_property ( seed );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSProjectVectorCurve ----------------------- */

applyable_class_s (NURBSProjectVectorCurveValue, NURBSCurveValue)

class NURBSProjectVectorCurveValue : public NURBSCurveValue
{
public:
	NURBSProjectVectorCurve* curve;

	ScripterExport NURBSProjectVectorCurveValue();
	ScripterExport NURBSProjectVectorCurveValue(NURBSProjectVectorCurve* pt);
	static ScripterExport NURBSProjectVectorCurveValue* intern(NURBSProjectVectorCurve* pt);
	ScripterExport ~NURBSProjectVectorCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSProjectVectorCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( trim );
	def_property ( flipTrim );
	def_property ( seed );
	def_property ( pVec );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSProjectNormalCurve ----------------------- */

applyable_class_s (NURBSProjectNormalCurveValue, NURBSCurveValue)

class NURBSProjectNormalCurveValue : public NURBSCurveValue
{
public:
	NURBSProjectNormalCurve* curve;

	ScripterExport NURBSProjectNormalCurveValue();
	ScripterExport NURBSProjectNormalCurveValue(NURBSProjectNormalCurve* pt);
	static ScripterExport NURBSProjectNormalCurveValue* intern(NURBSProjectNormalCurve* pt);
	ScripterExport ~NURBSProjectNormalCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSProjectNormalCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( trim );
	def_property ( flipTrim );
	def_property ( seed );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSSurfSurfIntersectionCurve ----------------------- */

applyable_class_s (NURBSSurfSurfIntersectionCurveValue, NURBSCurveValue)

class NURBSSurfSurfIntersectionCurveValue : public NURBSCurveValue
{
public:
	NURBSSurfSurfIntersectionCurve* curve;

	ScripterExport NURBSSurfSurfIntersectionCurveValue();
	ScripterExport NURBSSurfSurfIntersectionCurveValue(NURBSSurfSurfIntersectionCurve* pt);
	static ScripterExport NURBSSurfSurfIntersectionCurveValue* intern(NURBSSurfSurfIntersectionCurve* pt);
	ScripterExport ~NURBSSurfSurfIntersectionCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSSurfSurfIntersectionCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( trim1 );
	def_property ( flipTrim1 );
	def_property ( trim2 );
	def_property ( flipTrim2 );
	def_property ( seed );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSCurveOnSurface ----------------------- */

applyable_class_s (NURBSCurveOnSurfaceValue, NURBSCVCurveValue)

class NURBSCurveOnSurfaceValue : public NURBSCVCurveValue
{
public:
	NURBSCurveOnSurface* curve;

	ScripterExport NURBSCurveOnSurfaceValue();
	ScripterExport NURBSCurveOnSurfaceValue(NURBSCurveOnSurface* pt);
	static ScripterExport NURBSCurveOnSurfaceValue* intern(NURBSCurveOnSurface* pt);
	ScripterExport ~NURBSCurveOnSurfaceValue() { if (!in_set) delete curve; }

				classof_methods(NURBSCurveOnSurfaceValue, NURBSCVCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// operations
#include "defimpfn.h"
	// from NURBSCVCurve
	use_generic ( close,	"close" );
	def_generic ( getKnot,	"getKnot" );
	def_generic ( setKnot,	"setKnot" );
	def_generic ( getCV,	"getCV" );
	def_generic ( setCV,	"setCV" );
	def_generic ( refine,	"refine" );

	// built-in property accessors
	// from NURBSCVCurve
	def_property ( order ); 
	def_property ( numKnots );
	def_property ( numCVs );
	def_property ( transform );
	def_prop_getter ( endsOverlap );

	// from NURBSCurveOnSurface
	def_property ( parent );
	def_property ( parentID );
	def_property ( trim );
	def_property ( flipTrim );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSPointCurveOnSurface ----------------------- */

applyable_class_s (NURBSPointCurveOnSurfaceValue, NURBSPointCurveValue)

class NURBSPointCurveOnSurfaceValue : public NURBSPointCurveValue
{
public:
	NURBSPointCurveOnSurface* curve;

	ScripterExport NURBSPointCurveOnSurfaceValue();
	ScripterExport NURBSPointCurveOnSurfaceValue(NURBSPointCurveOnSurface* pt);
	static ScripterExport NURBSPointCurveOnSurfaceValue* intern(NURBSPointCurveOnSurface* pt);
	ScripterExport ~NURBSPointCurveOnSurfaceValue() { if (!in_set) delete curve; }

				classof_methods(NURBSPointCurveOnSurfaceValue, NURBSPointCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// operations
#include "defimpfn.h"
	// from NURBSPointCurve
	use_generic ( close,	"close" );
	def_generic ( getPoint,	"getPoint" );
	def_generic ( setPoint,	"setPoint" );
	def_generic ( refine,	"refine" );

	// built-in property accessors
	// from NURBSPointCurve
	def_property ( numPoints );
	def_property ( transform );

	// from NURBSPointCurveOnSurface
	def_property ( parent );
	def_property ( parentID );
	def_property ( trim );
	def_property ( flipTrim );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSSurfaceNormalCurve ----------------------- */

applyable_class_s (NURBSSurfaceNormalCurveValue, NURBSCurveValue)

class NURBSSurfaceNormalCurveValue : public NURBSCurveValue
{
public:
	NURBSSurfaceNormalCurve* curve;

	ScripterExport NURBSSurfaceNormalCurveValue();
	ScripterExport NURBSSurfaceNormalCurveValue(NURBSSurfaceNormalCurve* pt);
	static ScripterExport NURBSSurfaceNormalCurveValue* intern(NURBSSurfaceNormalCurve* pt);
	ScripterExport ~NURBSSurfaceNormalCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSSurfaceNormalCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( distance );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSIsoCurve ----------------------- */

applyable_class_s (NURBSSurfaceEdgeCurveValue, NURBSCurveValue)

class NURBSSurfaceEdgeCurveValue : public NURBSCurveValue
{
public:
	NURBSSurfaceEdgeCurve* curve;

	ScripterExport NURBSSurfaceEdgeCurveValue();
	ScripterExport NURBSSurfaceEdgeCurveValue(NURBSSurfaceEdgeCurve* c);
	static ScripterExport NURBSSurfaceEdgeCurveValue* intern(NURBSSurfaceEdgeCurve* c);
	ScripterExport ~NURBSSurfaceEdgeCurveValue() { if (!in_set) delete curve; }

				classof_methods(NURBSSurfaceEdgeCurveValue, NURBSCurveValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( seed );

	NURBSCurve*		to_nurbscurve() { return curve; }
	NURBSObject*	to_nurbsobject() { return curve; }
};

/* --------------- wrapper for NURBSTextureSurfaceValue ----------------------- */

applyable_class (NURBSTextureSurfaceValue)

class NURBSTextureSurfaceValue : public Value
{
public:
	NURBSTextureSurface	surface;		// surface texture

	ScripterExport NURBSTextureSurfaceValue();
	ScripterExport NURBSTextureSurfaceValue(NURBSTextureSurface& surf);

				classof_methods(NURBSTextureSurfaceValue, Value);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
#	define		is_nurbstexturesurface(p) ((p)->tag == class_tag(NURBSTextureSurfaceValue))
	
	// operations
#include "defimpfn.h"
	def_generic ( getPoint,		"getPoint" );
	def_generic ( setPoint,		"setPoint" );

	// built-in property accessors
	def_property ( type );
	def_property ( numPoints );
	def_prop_getter ( numUPoints );
	def_prop_getter ( numVPoints );
	def_property ( parent );
	def_property ( parentID );

	NURBSTextureSurface*	to_nurbstexturesurface() { return &surface; }
};

/* --------------- base class for NURBSSurface ----------------------- */

class NURBSSurfaceValueClass : public ValueMetaClass  // visible_class_s (NURBSSurfaceValue)
{
	public:	
				NURBSSurfaceValueClass(TCHAR* name) : ValueMetaClass (name) { }
	Value*		classOf_vf(Value** arg_list, int count) { return class_tag(NURBSObjectValue); }
	Value*		superClassOf_vf(Value** arg_list, int count) { return NURBSObjectValue_class.classOf_vf(NULL, 0);}
	void		collect() { delete this; }
	Class_ID	get_max_class_id() { return EDITABLE_SURF_CLASS_ID; }
};
extern ScripterExport NURBSSurfaceValueClass NURBSSurfaceValue_class;

class NURBSSurfaceValue : public NURBSObjectValue
{
public:
	void		common_surface_params(Value** arg_list, int count);
				classof_methods(NURBSSurfaceValue, NURBSObjectValue);
	void		collect() { delete this; }

	// operations
#include "defimpfn.h"
	def_generic ( evalPos,			"evalPos" );
	def_generic ( evalUTangent,		"evalUTangent" );
	def_generic ( evalVTangent,		"evalVTangent" );
	def_generic ( setTiling,		"setTiling" );
	def_generic ( getTiling,		"getTiling" );
	def_generic ( setTilingOffset,	"setTilingOffset" );
	def_generic ( getTilingOffset,	"getTilingOffset" );
	def_generic ( setTextureUVs,	"setTextureUVs" );
	def_generic ( getTextureUVs,	"getTextureUVs" );
	def_generic ( setGenerateUVs,	"setGenerateUVs" );
	def_generic ( getGenerateUVs,	"getGenerateUVs" );
	def_generic ( setTextureSurface, "setTextureSurface" );
	def_generic ( getTextureSurface, "getTextureSurface" );
	def_generic ( getProdTess,		"getProdTess" );
	def_generic ( setProdTess,		"setProdTess" );
	def_generic ( getViewTess,		"getViewTess" );
	def_generic ( setViewTess,		"setViewTess" );
	def_generic ( clearViewTess,	"clearViewTess" );
	def_generic ( clearProdTess,	"clearProdTess" );

	// built-in property accessors
	def_property ( renderable );
	def_property ( flipNormals );
	def_property ( generateUVs1 );
	def_property ( generateUVs2 );
	def_property ( textureSurface1 );
	def_property ( textureSurface2 );
	def_property ( matID );
	def_prop_getter ( closedInU );
	def_prop_getter ( closedInV );
	def_prop_getter ( uParameterRangeMin );
	def_prop_getter ( vParameterRangeMin );
	def_prop_getter ( uParameterRangeMax );
	def_prop_getter ( vParameterRangeMax );
	def_prop_getter ( numChannels );
};

/* --------------- wrapper for NURBSCVSurface ----------------------- */

applyable_class_s (NURBSCVSurfaceValue, NURBSSurfaceValue)

class NURBSCVSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSCVSurface* surface;

	ScripterExport NURBSCVSurfaceValue();
	ScripterExport NURBSCVSurfaceValue(NURBSCVSurface* pt);
	static ScripterExport NURBSCVSurfaceValue* intern(NURBSCVSurface* pt);
	ScripterExport ~NURBSCVSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSCVSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	def_generic ( closeU,	"closeU" );
	def_generic ( closeV,	"closeV" );
	def_generic ( getUKnot,	"getUKnot" );
	def_generic ( getVKnot,	"getVKnot" );
	def_generic ( setUKnot,	"setUKnot" );
	def_generic ( setVKnot,	"setVKnot" );
	def_generic ( getCV,	"getCV" );
	def_generic ( setCV,	"setCV" );
	def_generic ( refineU,	"refineU" );
	def_generic ( refineV,	"refineV" );
	def_generic ( refine,	"refine" );
	def_generic ( reparameterize, "reparameterize" );

	// built-in property accessors
	def_property ( uOrder );
	def_property ( vOrder );
	def_property ( numUKnots );
	def_property ( numVKnots );
	def_property ( numCVs );
	def_property ( transform );
	def_property ( rigid );
	def_property ( autoParam );
	def_prop_getter ( uEdgesOverlap );
	def_prop_getter ( vEdgesOverlap );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSPointSurface ----------------------- */

applyable_class_s (NURBSPointSurfaceValue, NURBSSurfaceValue)

class NURBSPointSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSPointSurface* surface;

	ScripterExport NURBSPointSurfaceValue();
	ScripterExport NURBSPointSurfaceValue(NURBSPointSurface* pt);
	static ScripterExport NURBSPointSurfaceValue* intern(NURBSPointSurface* pt);
	ScripterExport ~NURBSPointSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSPointSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	def_generic ( closeU,	"closeU" );
	def_generic ( closeV,	"closeV" );
	def_generic ( getPoint,	"getPoint" );
	def_generic ( setPoint,	"setPoint" );
	def_generic ( refineU,	"refineU" );
	def_generic ( refineV,	"refineV" );
	def_generic ( refine,	"refine" );

	// built-in property accessors
	def_property ( numPoints );
	def_property ( transform );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSBlendSurface ----------------------- */

applyable_class_s (NURBSBlendSurfaceValue, NURBSSurfaceValue)

class NURBSBlendSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSBlendSurface* surface;

	ScripterExport NURBSBlendSurfaceValue();
	ScripterExport NURBSBlendSurfaceValue(NURBSBlendSurface* pt);
	static ScripterExport NURBSBlendSurfaceValue* intern(NURBSBlendSurface* pt);
	ScripterExport ~NURBSBlendSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSBlendSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2ID );
	def_property ( parent2 );
	def_property ( edge1 );
	def_property ( edge2 );
	def_property ( flip1 );
	def_property ( flip2 );
	def_property ( tension1 );
	def_property ( tension2 );
	def_property ( curveStartPoint1 );
	def_property ( curveStartPoint2 );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSNBlendSurface ----------------------- */

applyable_class_s (NURBSNBlendSurfaceValue, NURBSSurfaceValue)

class NURBSNBlendSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSNBlendSurface* surface;

	ScripterExport NURBSNBlendSurfaceValue();
	ScripterExport NURBSNBlendSurfaceValue(NURBSNBlendSurface* pt);
	static ScripterExport NURBSNBlendSurfaceValue* intern(NURBSNBlendSurface* pt);
	ScripterExport ~NURBSNBlendSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSNBlendSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	def_generic ( setParent,	"setParent" );
	def_generic ( getParent,	"getParent" );
	def_generic ( setParentID,	"setParentID" );
	def_generic ( getParentID,	"getParentID" );
	def_generic ( setEdge,		"setEdge" );
	def_generic ( getEdge,		"getEdge" );

	// built-in property accessors

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSMultiCurveTrimSurfaceValue ----------------------- */

applyable_class_s (NURBSMultiCurveTrimSurfaceValue, NURBSSurfaceValue)

class NURBSMultiCurveTrimSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSMultiCurveTrimSurface* surface;

	ScripterExport NURBSMultiCurveTrimSurfaceValue();
	ScripterExport NURBSMultiCurveTrimSurfaceValue(NURBSMultiCurveTrimSurface* pt);
	static ScripterExport NURBSMultiCurveTrimSurfaceValue* intern(NURBSMultiCurveTrimSurface* pt);
	ScripterExport ~NURBSMultiCurveTrimSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSMultiCurveTrimSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	def_generic ( setParent,		"setParent" );
	def_generic ( getParent,		"getParent" );
	def_generic ( setParentID,		"setParentID" );
	def_generic ( getParentID,		"getParentID" );
	def_generic ( appendCurve,		"appendCurve" );
	def_generic ( appendCurveByID,	"appendCurveByID" );

	// built-in property accessors
	def_property ( numCurves );
	def_property ( flipTrim );
	def_property ( surfaceParent );
	def_property ( surfaceParentID );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSFilletSurfaceValue ----------------------- */

applyable_class_s (NURBSFilletSurfaceValue, NURBSSurfaceValue)

class NURBSFilletSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSFilletSurface* surface;

	ScripterExport NURBSFilletSurfaceValue();
	ScripterExport NURBSFilletSurfaceValue(NURBSFilletSurface* pt);
	static ScripterExport NURBSFilletSurfaceValue* intern(NURBSFilletSurface* pt);
	ScripterExport ~NURBSFilletSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSFilletSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	def_generic ( setParent,		"setParent" );
	def_generic ( getParent,		"getParent" );
	def_generic ( setParentID,		"setParentID" );
	def_generic ( getParentID,		"getParentID" );
	def_generic ( setSeed,			"setSeed" );
	def_generic ( getSeed,			"getSeed" );
	def_generic ( getRadius,		"getRadius" );
	def_generic ( setRadius,		"setRadius" );
	def_generic ( getTrimSurface,	"getTrimSurface" );
	def_generic ( setTrimSurface,	"setTrimSurface" );
	def_generic ( getFlipTrim,		"getFlipTrim" );
	def_generic ( setFlipTrim,		"setFlipTrim" );

	// built-in property accessors
	def_property ( cubic );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSOffsetSurface ----------------------- */

applyable_class_s (NURBSOffsetSurfaceValue, NURBSSurfaceValue)

class NURBSOffsetSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSOffsetSurface* surface;

	ScripterExport NURBSOffsetSurfaceValue();
	ScripterExport NURBSOffsetSurfaceValue(NURBSOffsetSurface* pt);
	static ScripterExport NURBSOffsetSurfaceValue* intern(NURBSOffsetSurface* pt);
	ScripterExport ~NURBSOffsetSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSOffsetSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( distance );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSXFormSurface ----------------------- */

applyable_class_s (NURBSXFormSurfaceValue, NURBSSurfaceValue)

class NURBSXFormSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSXFormSurface* surface;

	ScripterExport NURBSXFormSurfaceValue();
	ScripterExport NURBSXFormSurfaceValue(NURBSXFormSurface* pt);
	static ScripterExport NURBSXFormSurfaceValue* intern(NURBSXFormSurface* pt);
	ScripterExport ~NURBSXFormSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSXFormSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( transform );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSMirrorSurface ----------------------- */

applyable_class_s (NURBSMirrorSurfaceValue, NURBSSurfaceValue)

class NURBSMirrorSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSMirrorSurface* surface;

	ScripterExport NURBSMirrorSurfaceValue();
	ScripterExport NURBSMirrorSurfaceValue(NURBSMirrorSurface* pt);
	static ScripterExport NURBSMirrorSurfaceValue* intern(NURBSMirrorSurface* pt);
	ScripterExport ~NURBSMirrorSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSMirrorSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( axis );
	def_property ( distance );
	def_property ( transform );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSRuledSurface ----------------------- */

applyable_class_s (NURBSRuledSurfaceValue, NURBSSurfaceValue)

class NURBSRuledSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSRuledSurface* surface;

	ScripterExport NURBSRuledSurfaceValue();
	ScripterExport NURBSRuledSurfaceValue(NURBSRuledSurface* pt);
	static ScripterExport NURBSRuledSurfaceValue* intern(NURBSRuledSurface* pt);
	ScripterExport ~NURBSRuledSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSRuledSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent1 );
	def_property ( parent1ID );
	def_property ( parent2 );
	def_property ( parent2ID );
	def_property ( flip1 );
	def_property ( flip2 );
	def_property ( curveStartPoint1 );
	def_property ( curveStartPoint2 );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSULoftSurface ----------------------- */

applyable_class_s (NURBSULoftSurfaceValue, NURBSSurfaceValue)

class NURBSULoftSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSULoftSurface* surface;

	ScripterExport NURBSULoftSurfaceValue();
	ScripterExport NURBSULoftSurfaceValue(NURBSULoftSurface* pt);
	static ScripterExport NURBSULoftSurfaceValue* intern(NURBSULoftSurface* pt);
	ScripterExport ~NURBSULoftSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSULoftSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	def_generic ( appendCurve,		"appendCurve" );
	def_generic ( appendCurveByID,	"appendCurveByID" );
	def_generic ( getCurve,			"getCurve" );
	def_generic ( getCurveID,		"getCurveID" );
	def_generic ( setCurve,			"setCurve" );
	def_generic ( setCurveByID,		"setCurveByID" );
	def_generic ( getFlip,			"getFlip" );
	def_generic ( setFlip,			"setFlip" );

	// built-in property accessors
	def_property ( numCurves );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSUVLoftSurface ----------------------- */

applyable_class_s (NURBSUVLoftSurfaceValue, NURBSSurfaceValue)

class NURBSUVLoftSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSUVLoftSurface* surface;

	ScripterExport NURBSUVLoftSurfaceValue();
	ScripterExport NURBSUVLoftSurfaceValue(NURBSUVLoftSurface* pt);
	static ScripterExport NURBSUVLoftSurfaceValue* intern(NURBSUVLoftSurface* pt);
	ScripterExport ~NURBSUVLoftSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSUVLoftSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	def_generic ( appendUCurve,		"appendCurve" );
	def_generic ( appendUCurveByID,	"appendCurveByID" );
	def_generic ( getUCurve,		"getCurve" );
	def_generic ( getUCurveID,		"getCurveID" );
	def_generic ( setUCurve,		"setCurve" );
	def_generic ( setUCurveByID,	"setCurveByID" );

	def_generic ( appendVCurve,		"appendCurve" );
	def_generic ( appendVCurveByID,	"appendCurveByID" );
	def_generic ( getVCurve,		"getCurve" );
	def_generic ( getVCurveID,		"getCurveID" );
	def_generic ( setVCurve,		"setCurve" );
	def_generic ( setVCurveByID,	"setCurveByID" );

	// built-in property accessors
	def_property ( numUCurves );
	def_property ( numVCurves );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSExtrudeSurface ----------------------- */

applyable_class_s (NURBSExtrudeSurfaceValue, NURBSSurfaceValue)

class NURBSExtrudeSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSExtrudeSurface* surface;

	ScripterExport NURBSExtrudeSurfaceValue();
	ScripterExport NURBSExtrudeSurfaceValue(NURBSExtrudeSurface* pt);
	static ScripterExport NURBSExtrudeSurfaceValue* intern(NURBSExtrudeSurface* pt);
	ScripterExport ~NURBSExtrudeSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSExtrudeSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( axisTM );
	def_property ( distance );
	def_property ( curveStartPoint );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSLatheSurface ----------------------- */

applyable_class_s (NURBSLatheSurfaceValue, NURBSSurfaceValue)

class NURBSLatheSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSLatheSurface* surface;

	ScripterExport NURBSLatheSurfaceValue();
	ScripterExport NURBSLatheSurfaceValue(NURBSLatheSurface* pt);
	static ScripterExport NURBSLatheSurfaceValue* intern(NURBSLatheSurface* pt);
	ScripterExport ~NURBSLatheSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSLatheSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( axisTM );
	def_property ( sweep );
	def_property ( curveStartPoint );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSCapSurface ----------------------- */

applyable_class_s (NURBSCapSurfaceValue, NURBSSurfaceValue)

class NURBSCapSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBSCapSurface* surface;

	ScripterExport NURBSCapSurfaceValue();
	ScripterExport NURBSCapSurfaceValue(NURBSCapSurface* pt);
	static ScripterExport NURBSCapSurfaceValue* intern(NURBSCapSurface* pt);
	ScripterExport ~NURBSCapSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBSCapSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( parent );
	def_property ( parentID );
	def_property ( edge );
	def_property ( curveStartPoint );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBS1RailSweepSurface ----------------------- */

applyable_class_s (NURBS1RailSweepSurfaceValue, NURBSSurfaceValue)

class NURBS1RailSweepSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBS1RailSweepSurface* surface;

	ScripterExport NURBS1RailSweepSurfaceValue();
	ScripterExport NURBS1RailSweepSurfaceValue(NURBS1RailSweepSurface* pt);
	static ScripterExport NURBS1RailSweepSurfaceValue* intern(NURBS1RailSweepSurface* pt);
	ScripterExport ~NURBS1RailSweepSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBS1RailSweepSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	def_generic ( appendCurve,		"appendCurve" );
	def_generic ( appendCurveByID,	"appendCurveByID" );
	def_generic ( getCurve,			"getCurve" );
	def_generic ( getCurveID,		"getCurveID" );
	def_generic ( setCurve,			"setCurve" );
	def_generic ( setCurveByID,		"setCurveByID" );
	def_generic ( getFlip,			"getFlip" );
	def_generic ( setFlip,			"setFlip" );
	def_generic ( getCurveStartPoint, "getCurveStartPoint" );
	def_generic ( setCurveStartPoint, "setCurveStartPoint" );

	// built-in property accessors
	def_property ( rail );
	def_property ( railID );
	def_property ( numCurves );
	def_property ( parallel );
	def_property ( axisTM );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};
/* --------------- wrapper for NURBS2RailSweepSurface ----------------------- */

applyable_class_s (NURBS2RailSweepSurfaceValue, NURBSSurfaceValue)

class NURBS2RailSweepSurfaceValue : public NURBSSurfaceValue
{
public:
	NURBS2RailSweepSurface* surface;

	ScripterExport NURBS2RailSweepSurfaceValue();
	ScripterExport NURBS2RailSweepSurfaceValue(NURBS2RailSweepSurface* pt);
	static ScripterExport NURBS2RailSweepSurfaceValue* intern(NURBS2RailSweepSurface* pt);
	ScripterExport ~NURBS2RailSweepSurfaceValue() { if (!in_set) delete surface; }

				classof_methods(NURBS2RailSweepSurfaceValue, NURBSSurfaceValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	def_generic ( appendCurve,		"appendCurve" );
	def_generic ( appendCurveByID,	"appendCurveByID" );
	def_generic ( getCurve,			"getCurve" );
	def_generic ( getCurveID,		"getCurveID" );
	def_generic ( setCurve,			"setCurve" );
	def_generic ( setCurveByID,		"setCurveByID" );
	def_generic ( getFlip,			"getFlip" );
	def_generic ( setFlip,			"setFlip" );
	def_generic ( getCurveStartPoint, "getCurveStartPoint" );
	def_generic ( setCurveStartPoint, "setCurveStartPoint" );

	// built-in property accessors
	def_property ( rail1 );
	def_property ( rail1ID );
	def_property ( rail2 );
	def_property ( rail2ID );
	def_property ( numCurves );
	def_property ( parallel );

	NURBSSurface*	to_nurbssurface() { return surface; }
	NURBSObject*	to_nurbsobject() { return surface; }
};

/* --------------- wrapper for NURBSDisplay ----------------------- */

applyable_class (NURBSDisplayValue)

class NURBSDisplayValue : public Value
{
public:
	NURBSDisplay	display;		// surface texture

	ScripterExport NURBSDisplayValue();
	ScripterExport NURBSDisplayValue(NURBSDisplay& surf);

				classof_methods(NURBSDisplayValue, Value);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
#	define		is_nurbsdisplay(p) ((p)->tag == class_tag(NURBSDisplayValue))
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( displayCurves );
	def_property ( displaySurfaces );
	def_property ( displayLattices );
	def_property ( displaySurfCVLattices );
	def_property ( displayCurveCVLattices );
	def_property ( displayDependents );
	def_property ( displayTrimming );
	def_property ( degradeOnMove );
	def_property ( displayShadedLattice );

	NURBSDisplay*	to_nurbsdisplay() { return &display; }
};

/* --------------- wrapper for NURBSSurfaceApproximation ----------------------- */

applyable_class (NURBSSurfaceApproximationValue)

class NURBSSurfaceApproximationValue : public Value
{
public:
	TessApprox	tess;		// surface approximation

	ScripterExport NURBSSurfaceApproximationValue();
	ScripterExport NURBSSurfaceApproximationValue(TessApprox& surf);

				classof_methods(NURBSSurfaceApproximationValue, Value);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
#	define		is_NURBSSurfaceApproximation(p) ((p)->tag == class_tag(NURBSSurfaceApproximationValue))
	
	// operations
#include "defimpfn.h"

	// built-in property accessors
	def_property ( config );
	def_property ( isoULines );
	def_property ( isoVLines );
	def_property ( meshUSteps );
	def_property ( meshVSteps );
	def_property ( meshApproxType );
	def_property ( spacialEdge );
	def_property ( curvatureAngle );
	def_property ( curvatureDistance );
	def_property ( viewDependent );

	def_property ( merge );
	def_property ( subdivStyle );
	def_property ( minLevels );
	def_property ( maxLevels );
	def_property ( maxTris );

	Value*		get_property(Value** arg_list, int count);
	Value*		set_property(Value** arg_list, int count);

	TessApprox*	to_tessapprox() { return &tess; }
};

/* --------------- wrapper for NURBSTexturePoint ----------------------- */

applyable_class_s (NURBSTexturePointValue, NURBSObjectValue)

class NURBSTexturePointValue : public NURBSObjectValue
{
public:
	NURBSTexturePoint* point;

	ScripterExport NURBSTexturePointValue();
	ScripterExport NURBSTexturePointValue(Point2 pt);
	ScripterExport NURBSTexturePointValue(NURBSTexturePoint* pt);
	static ScripterExport NURBSTexturePointValue* intern(NURBSTexturePoint* pt);
	ScripterExport ~NURBSTexturePointValue() { if (!in_set) delete point; }

				classof_methods(NURBSTexturePointValue, NURBSObjectValue);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
	
	// operations
#include "defimpfn.h"
	// built-in property accessors
	def_property ( pos );

	def_generic ( setIndices,		"setIndices" );

	NURBSTexturePoint*	to_nurbstexturepoint() { return point; }
	NURBSObject*		to_nurbsobject() { return point; }
};

/* --------------- wrapper for NURBSSet ----------------------- */

applyable_class (NURBSSetValue)

class NURBSSetValue : public Value
{
public:
	NURBSSet set;							// wrapped NURBSet

	ScripterExport NURBSSetValue();
	ScripterExport NURBSSetValue(NURBSSet& set);

				classof_methods(NURBSSetValue, Value);
	void		collect() { delete this; }
	ScripterExport void		sprin1(CharStream* s);
#	define		is_nurbsset(p) ((p)->tag == class_tag(NURBSSetValue))
	NURBSObject* sel_index_to_obj(int i);

	// operations
#include "defimpfn.h"
	def_generic ( getObject,		"getObject" );
	def_generic ( setObject,		"setObject" );
	def_generic ( appendObject,		"appendObject" );
	def_generic ( removeObject,		"removeObject" );
	def_generic ( deleteObjects,	"deleteObjects" );
	def_generic ( disconnect,		"disconnect" );
	def_generic ( getProdTess,		"getProdTess" );
	def_generic ( setProdTess,		"setProdTess" );
	def_generic ( getViewTess,		"getViewTess" );
	def_generic ( setViewTess,		"setViewTess" );
	def_generic ( clearViewTess,	"clearViewTess" );
	def_generic ( clearProdTess,	"clearProdTess" );

	// built-in property accessors
	def_prop_getter ( numObjects );

	// tesselation properties
	def_property ( viewConfig );
	def_property ( viewIsoULines );
	def_property ( viewIsoVLines );
	def_property ( viewMeshUSteps );
	def_property ( viewMeshVSteps );
	def_property ( viewMeshApproxType );
	def_property ( viewSpacialEdge );
	def_property ( viewCurvatureAngle );
	def_property ( viewCurvatureDistance );
	def_property ( viewViewDependent );
	def_property ( renderConfig );
	def_property ( renderIsoULines );
	def_property ( renderIsoVLines );
	def_property ( renderMeshUSteps );
	def_property ( renderMeshVSteps );
	def_property ( renderMeshApproxType );
	def_property ( renderSpacialEdge );
	def_property ( renderCurvatureAngle );
	def_property ( renderCurvatureDistance );
	def_property ( renderViewDependent );
	def_property ( merge );
	def_property ( display );
	def_property ( viewApproximation );
	def_property ( renderApproximation );

	NURBSSet*	to_nurbsset() { return &set; }

	// add array protocol
	def_generic ( get,		"get" );
	def_generic ( put,		"put" );
	ScripterExport Value* map(node_map& m);

	def_prop_getter(count);
};

extern void check_nurbs_result(NURBSResult r);

#endif
#endif
