Skip to content
Snippets Groups Projects
command.h 15.70 KiB
////////////////////////
///// command.h    /////
////////////////////////

#if !defined COMMAND_H
#define COMMAND_H

	//----- inclusion of header files
#include <cstdio>
#include <cctype>
#include <fstream>
#include <cstdlib>
#include <cstring>	

#include "FRDevice.h"

#include "box.h" 
#include "colortype.h" 
#include "filereader.h" 
#include "hid.h"
#include "hidline.h"
#include "linetype.h"
#include "name_and_value.h"
#include "object.h"
#include "parameter.h"
#include "perspective.h"

#include "list.h"
#include "shading.h"
#include "version.h"

using namespace std ;

	//-------------------------//
	//----- class Command -----//
	//-------------------------//
class Command {
	enum { ERROR, NORMAL };

 public:
	Command () {;} 
	~Command() {;}

		//-------------------//
		//----- general -----//
		//-------------------//

		//----- error message
	void	errorMessage(	char* string1 = NULL, 
				char* string2 = NULL, 
				char terminal = '\n' ) ;

		//----- display opening title to stdout
	void	openDawn( int& argc, char* argv[] , Parameter& parameter ) ;

		//----- set camera
	void	setCamera( const Parameter& parameter , Perspective& camera ) ; 

	void	setCamera(	double		distance , 
				double		v_angle  , 
				double		h_angle  , 
				Vector3		target   , 
				double		focal_distance ,
				double		epsilon3d       ,
				Perspective&	camera           ) ;
	void	setCameraAuto(	const Box3D&	totalBoundingBox, 
				Parameter&	parameter, 
			        Perspective&	camera           ) ;

	void	setCameraPositionToParameter(	double camera_distance , 
						double camera_v_angle ,
						double camera_h_angle ,
						Parameter& parameter ) ;


	void	setTargetPointToParameter(	double x, 
						double y,
						double z,
						Parameter& parameter ) ;
	void	setScaleToParameter(	double scale_given, 
					Parameter& parameter );
	void	setFocalDistanceToParameter(	double focal_distance, 
						Parameter& parameter );
	void	setAutoTargetFlagToParameter(	int        is_auto, 
						Parameter& parameter );
	void	setDeviceToParameter(	int        device ,
					Parameter& parameter );

	void	setTarget( const Vector3& target , Parameter& parameter, Perspective& camera );


		//----- auto positioning
		//.....  set parameter.camera_distance and camera.rho by auto.
	void	autoPositioning( double total_rough_size , Parameter& parameter, Perspective& camera );

		//----- auto target
	void	autoZoom( const Box3D& total_bounding_box, Parameter& parameter, Perspective& camera );


		//----- auto tolerance setting
	void	autoToleranceSetting( double total_size, double ratio, Parameter& parameter ) 
		{	
			if( ratio >= 0.0 ) { parameter.epsilon3d = total_size * ratio ;}
		}

		//----- set total bounding box to parameter
	void	setTotalBoundingBox(	double xmin, double ymin, double zmin, 
					double xmax, double ymax, double zmax, 
					Box3D* total_bounding_box_p              ) ;
	void	setTotalBoundingBoxToParameter(	const Box3D& total_bounding_box ,
						Parameter* parameter             ) ;

		//----- analyse option 
		//..... Return: 1  if argv_i is a option (with "-")
		//.....         0  else
	int	analyzeOption( char* argv_i, Parameter& parameter ) ;

		//----- scan data file
		//..... (1) object_name_server cleared and then 
		//..... (2) make database of data file names 
		//.....     and set it to object_name_server
		//..... (3) analyze option
		//..... (4) sort data if necessary
		//..... (5) see if polygon.out data is included 
		//.....     (If it is included parameter.read_polyon_out becomes 1 )
		//..... (6) calc total bounding box
		//..... (7) decide ps file name and set it to parameter.ps_file
	void	scanDataFile( 	char*			argv[],
				int			argc , 
				FileReader&		filereader ,
				Perspective&		camera     ,
				List<NameAndValue>&	object_name_server , 
				Box3D&			total_bounding_box ,
				Parameter&		parameter          );

		//----- read data file
	void	readDataFile(	const Parameter&	parameter, 
				FileReader&		filereader , 
				List<NameAndValue>&	object_name_server ,
				List<Object>&		object_server , 
				List<LineSegment>&	lineseg_server , 
				DataSize&		total_data_size     );	

	void	readDataFile_DrawWireFrame_Clear(	const Parameter&	parameter          , 
							FileReader&		filereader         , 
							List<NameAndValue>&	object_name_server ,
							List<Object>&		object_server      , 
							List<LineSegment>&	lineseg_server     ,
							DataSize&		total_data_size    ,
							PostScript&		ps           ,
							Perspective&		camera        );

		//----- set objects to hidden surface removal routine
	void	passFacetToHidCMD(	Object*			object_p      , 
					Perspective&		camera        ,
					Hid&			hid           ,
					HidLine&		hidline       ,
					const Parameter&	parameter     ,
					int		backface_culling_mode  = 1 ) ; 

	void	passFacetToHidCMD(	List<Object>&	object_server , 
					Perspective&	camera        ,
					Hid&		hid           ,
					HidLine&	hidline       ,
					Parameter&	parameter     );
						 // backface_culling_mode  = 1 ;


	void	passtFaceFromCurrentObjectToHid(	List<Object>&		object_server , 
							Perspective&		camera        ,
							Hid&			hid           ,
							HidLine&		hidline       ,
							Parameter&		parameter       );


		//----- Command::passEdgeToHidLine()
	void	passEdgeToHidLineCMD(	List<Object>&		object_server , 
					Perspective&		camera        ,
					HidLine&		hidline       ,
					const Parameter&	parameter      ) ;

	void	passEdgeToHidLineCMD(	Object*			object_p      , 
					Perspective&		camera        ,
					HidLine&		hidline       ,
					const Parameter&	parameter      ) ;


		//----- pass linesegment data to HidLine 
		//..... and set linetype to linesegments 
		//..... in linesegServer 
	void	passLineSegmentToHidLine (	List<LineSegment>&	linesegServer , 
						Perspective&		camera        ,  
						HidLine& 		hidline       , 
						Parameter&		parameter      ) ;

		//----- Command::readDataFile_doHiddenSurfaceElimination()
	void	readDataFile_doHiddenSurfaceElimination(	const Parameter&	parameter          ,
								FileReader&		filereader         , 
								List<NameAndValue>&	object_name_server , 
								List<Object>&		object_server      , 
								List<LineSegment>&	lineseg_server     , 
								Hid&			hid                , 
								HidLine&		hidline            ,
								DataSize&		total_data_size      );	

	void	doIncrementalHiddenSurfaceElimination(	const Parameter&	parameter          ,
						        List<Object>&		object_server      , 
						        Hid&			hid                , 
						        HidLine&		hidline            , 
							int			flush_mode = 0       );


		//----- do hidden line elimination
	void	doHiddenLineElimination   (	const Parameter&	parameter          ,
						HidLine&		hidline            , 
						double			epsilon3d = 1.0e-6 ,
						double			epsilon2d = 1.0e-6   ); 
	void	doHiddenLineElimination(	Parameter&		parameter , 
						List<LineSegment>&	lineseg_server       ,
						HidLine&		hidline_remover      ,
						Hid&			hid_surface_remover  ,
						Perspective&		camera                );


		//----- output result of hidden line/surface removal to file
	void	savePolygon( const Parameter& parameter , Hid& hid ) ;

		//----------------------------//
		//----- parameter setting-----//
		//----------------------------//
	void	setParameter( Parameter& parameter );

		//----- read history file
		//..... Return: ERROR or NORMAL
	int	readHistoryFile(	Parameter& parameter , 
					char* history_file_given = NULL ) ;

		//----- write parameters to history file
		//..... Return: ERROR or NORMAL
	int	writeParameterToHistoryFile(	const Parameter& parameter , 
						char* history_file_given = NULL ) ;
	void	inputParameter_Tk( Parameter& parameter );
	void	printParameter (  const Parameter& parameter , ostream& out ) ;
	void	printDataSize  (  const DataSize&  data_size , ostream& out ) ;
	void	saveCamera(	const Parameter& 	parameter	,
				const char*		output_file = DEFAULT_CAMERA_OUTPUT_FILE );

		//----- set parameter.winded_edge_mode
	int	setWingedEdgeModeToParameter( Parameter& parameter ) ;

		//-----
	void	readObjectRenderingParameter(	ifstream& fin , Parameter& parameter ) ;
	void	setLineTypeToObject ( const Parameter& parameter , Object* object_p ) ;
	void	setShading          ( Parameter& parameter , Shading* shading_p ) ;


		//----- clearing 
	void	clearCurrentObject( List<Object>& object_server ) ;

		//----- set clipping mode 
				// clipping_mode =  0 ( no cllipping)
				//               =  1 ( clipping) 
				//               =  2 ( landscape clipping) 
	int	getClippingMode ( const Parameter& parameter );


		//-----------------------------//
		//----- Drawing functions -----//
		//-----------------------------//

		//----- open device
		//..... Return: 1 (normal) or 0 (error)
	int	open_PS( PostScript& ps , Parameter& paremeter ) ;

#if defined USE_XWIN
	int	open_X ( PostScript& ps , X_Window& xwin, PS2X& ps2x , Parameter& parameter , int flag_immediate = 0 )  ;
#endif

		//----- DRAW
#if defined USE_OPEN_GL
	void	openDevice (	Perspective&		camera	     ,
				Parameter&              parameter    ,
				PostScript&		ps           ,
				X_Window&		xwin         , 
				PS2X&			ps2x         ,
				FROpenGL&		gl	     ,
				int			flag_immediate = 0 )  ;
	int	closeDevice (	Parameter&              parameter    ,
				PostScript&		ps           ,
				X_Window&		xwin         , 
				PS2X&			ps2x         ,
				FROpenGL&		gl	      );

	void	drawAll(	const Parameter&        parameter    ,
				PostScript&		ps           ,
				FROpenGL&		gl	     ,
				List<Object>&		objectServer ,
				Perspective&		camera       ,
				Hid&			hid          ,
				HidLine&		hidline      ,
				char*			title          );

#elif defined USE_XWIN

	void	openDevice (	Perspective&		camera	     ,
				Parameter&              parameter    ,
				PostScript&		ps           ,
				X_Window&		xwin         , 
				PS2X&			ps2x         ,
				int			flag_immediate = 0 )  ;
	int	closeDevice (	Parameter&              parameter    ,
				PostScript&		ps           ,
				X_Window&		xwin         , 
				PS2X&			ps2x         );

	void	drawAll(	const Parameter&        parameter    ,
				PostScript&		ps           ,
				List<Object>&		objectServer ,
				Perspective&		camera       ,
				Hid&			hid          ,
				HidLine&		hidline      ,
				char*			title          );
#else 
	void	openDevice (	Perspective&		camera	     ,
				Parameter&              parameter    ,
				PostScript&		ps           ) ;

	int	closeDevice (	Parameter&              parameter    ,
				PostScript&		ps           ) ;

	void	drawAll(	const Parameter&        parameter    ,
				PostScript&		ps           ,
				List<Object>&		objectServer ,
				Perspective&		camera       ,
				Hid&			hid          ,
				HidLine&		hidline      ,
				char*			title          );
#endif

	void	drawLine(	const Parameter&        parameter    ,
				PostScript&		ps           ,
				HidLine&		hidline       ) ;

	void	drawLine(	const Parameter&        parameter    ,
				PostScript&		ps           ,
				Perspective&		camera       ,
				List<LineSegment>&	lineseg_server  ) ;

	void	setImage(	const Parameter&        parameter    ,
				List<LineSegment>&	lineseg_server  , 
				Perspective&		camera        );

	void	drawCurrentObject_WireFrame(	const Parameter&        parameter    ,
						PostScript&		ps           ,
						List<Object>&		object_server ,
						Perspective&		camera        );

		//----- draw line data (PS)
	void
	drawLine_PS(	PostScript&		ps            ,
			HidLine&		hidline       ,
			double			blank_scale  = 0.0 ); 

		//----- draw (hidden line/surface removal, PS )
	void	draw_Hid_PS(	const Parameter&	parameter ,
				PostScript&		ps        , 
				Hid& 			hid       ,
				List<Object>*		object_server_p = NULL );

		//----- Command::drawVisiblePartOfLineSegment_PS ()
	void
	drawVisiblePartOfLineSegment_PS (	const	Vector3&	A ,
						const	Vector3&	B ,
						const	LineType&	linetype , 
						Hid&			hid      ,
						PostScript&		ps ,
						const Parameter&	parameter ) ;

		//----- draw frame (PS)
	void	drawFrame_PS( PostScript& ps , LineType linetype ) ;

		//----- close PostScript routine
	void	close_PS( Parameter& parameter , PostScript& ps ) ;

#if defined USE_XWIN
	int	close_X ( PostScript& ps , X_Window& xwin, PS2X& ps2x ) ;
			// 0: mouse button press
			// 1: key press
	int	showpage_X( PostScript& ps , X_Window& xwin );
	void	waitEvent( const Parameter& parameter, X_Window& xwin) ;
#endif

		//----- preview (PS)
		//..... Return: return of previewer
//	int	preview_PS( char* previewer, char* psfile ) ;
	int	preview_PS( const Parameter& parameter    ) ;

		//----- display string
	void	drawString_PS( PostScript& ps, char* string , double x , double y );

		//----- display parematers
	void	displayParameter_PS(	PostScript&	ps,
					Perspective&	camera    ,
					double		epsilon2d  ,
					double		epsilon3d  ) ;

		//----- display parematers
	void	displayAxes_PS(	PostScript&	ps,
					Perspective&	camera    ,
					const Parameter& parameter );
	void	displayAxes_landscape_PS(	PostScript&	ps,
						Perspective&	camera    ,
						const Parameter& parameter );


		//----- Command::drawLine_landscape_PS()
	void	drawLine_landscape_PS(	PostScript&		ps            ,
					HidLine&		hidline       ,
					double			blank_scale    );

		//----- Command::draw_Hid_landscape_PS()
	void	draw_Hid_landscape_PS(	const Parameter&	parameter ,
					PostScript&		ps        , 
					Hid& 			hid       ,
					List<Object>*		object_server_p = NULL );

		//------ Command::drawVisiblePartOfLineSegment_landscape_PS ()
	void 	drawVisiblePartOfLineSegment_landscape_PS (	const	Vector3&	A ,
								const	Vector3&	B ,
								const	LineType&	linetype , 
								Hid&			hid      ,
								PostScript&		ps ,
								const Parameter&	parameter );

		//----- draw marks
	void	fillCircle_PS(	const Parameter& parameter      , 
				PostScript&		ps      ,
				const Vector3&		P	,
				Perspective&		camera	, 
				double			R_mm	, 
				ColorType*		color_p );

	void	fillSquare_PS(	const  Parameter& parameter     , 
				PostScript&		ps      ,
				const Vector3&		P	,
				Perspective&		camera	, 
				double			dL_mm	, 
				ColorType*		color_p  );

		//----- draw string
	void	drawColoredString_PS(	const char*		string    , 
					const ColorType&	color     ,
					double			size_pt   ,
					const Vector2&		P_mm	  ,
					PostScript&		ps         );
	void	drawColoredString_vp_PS(const char*             string    , 
					const ColorType&	color     ,
					double			size_vp   ,
					double			offset_x_vp ,
					double			offset_y_vp ,
					const Vector3&		P	  ,
					Perspective&		camera	  , 
					const  Parameter&	parameter , 
					PostScript&		ps         );

#if defined USE_OPEN_GL

	void	fillCircle_GL(	const Parameter& parameter      , 
				FROpenGL&		gl	,
				const Vector3&		P	,
				Perspective&		camera	, 
				double			dR	, 
				ColorType*		color_p ,
				size_t			Ndiv = 24 );

	void	fillSquare_GL(	const  Parameter& parameter     , 
				FROpenGL&		gl	,
				const Vector3&		P	,
				Perspective&		camera	, 
				double			dL	, 
				ColorType*		color_p  );

		//----- OpenGL
	void	open_GL(	Perspective& camera , 
				X_Window&          xwin   ,
				FROpenGL&	   gl	  ,
				const Parameter&   parameter );

	void	close_GL( void );
	void	readDataFile_DrawGL_Clear(	const Parameter&	parameter          , 
						List<NameAndValue>&	object_name_server ,
						DataSize&		total_data_size    ,
						Perspective&		camera             ,    
						FROpenGL&		gl                   ) ;


	void	drawObject_GL(	const Parameter&	parameter          , 
				Perspective&		camera             ,
				Object*			object_p           ,
				FROpenGL&		gl                  ) ;
	void	drawPolygon_GL ( Hid& polygon_server , List<Object>& object_server, FROpenGL& gl );
	void	fillPolygon_GL ( Hid& polygon_server , Object* object_p, FROpenGL& gl , const Parameter& parameter );
	void	drawLine_GL    ( List<LineSegment>& lineseg_server , FROpenGL& gl );

	void	displayAxes_GL(	FROpenGL&        gl      ,
				const Parameter& parameter );

#endif

}; // Command

////////////////////////////// end of command.h
#endif