/*
======================================================================
lwmod.h

Ernie Wright  01 Jun 05

LightWave Modeler interface.
====================================================================== */

#ifndef LWMOD_H
#define LWMOD_H

#include <lwserver.h>
#include <lwcmdseq.h>
#include <lwmodeler.h>
#include <lwhost.h>
#include <lwdisplay.h>
#include <lwsurf.h>


typedef struct st_ModData {
   GlobalFunc         *global;
   LWModCommand       *local;
   MeshEditOp         *edit;
   DynaValue           result;
   int                 cmderror;
   EltOpSelect         opsel;
   float               version;
   int                 build;
   int                 product;
   unsigned long       serialno;
   unsigned long       locale;
   DynaMonitorFuncs   *monf;
   LWMonitor          *mon;
   LWStateQueryFuncs  *query;
   LWSurfaceFuncs     *surface;
   LWFontListFuncs    *font;
   HostDisplayInfo    *hdi;
   LWMessageFuncs     *message;
   LWFileReqFunc      *filereq;
   LWDirInfoFunc      *dirinfo;
} ModData;


#ifdef CS_MACROS
#define LOOKUP(cmd) if (!ccode) ccode = md.local->lookup(md.local->data, cmd)
#define EXECUTE(ac,av) \
   md.cmderror = md.local->execute(md.local->data, ccode, ac, av, \
      md.opsel, &md.result)
#define OK (md.cmderror == CSERR_NONE)
#endif  /* CS_MACROS */


ModData *lwInit( GlobalFunc *global, LWModCommand *local, int teslvl );
void lwDone( void );
int  lwMeshBegin( int pntbufsize, int polbufsize, EltOpSelect select );
void lwMeshDone( EDError ederror, int selm );
const char *lwGetCurrentObject( void );
LWSurfaceID *lwGetSurfacesByName( char *objname, char *surfname );
LWSurfaceID lwCreateSurface( char *objname, char *surfname );
int  lwSetDefaultSurface( char *surfname );
int  lwSetSurfEdSurface( char *objname, char *surfname );
int  lwSetSurfaceColor( char *channel, double color[ 3 ] );
int  lwSetSurfaceFloat( char *channel, double val );
LWPntID lwAddPoint( double *coord );
LWPolID lwAddFace( int npoints, LWPntID *ptarray );
int  lwMergePoints( double d );
void lwMonitorBegin( char *title, char *caption, int total );
int  lwMonitorStep( int step );
void lwMonitorDone( void );

int match_spdname( char *name );
int get_user( LWXPanelFuncs *xpanf, int *spd, int *sf, int *teslvl,
   int *merge, int *savescene, char *filename );
int parse_cmdline( const char *cmdline, int *spd, int *sf, int *teslvl,
       int *merge, int *savescene, char *filename );

/* lwscene.c, for writing scene files */

void lwInitScene( void );
void lwSetCamera( double *pos, double *at, double *up, double vfov,
   double faspect, int width, int height );
void lwAddLight( double *pos, double intensity );
void lwSetBackgroundColor( double *color );
int lwWriteScene( char *filename );

#endif  /* LWMOD_H */
