diff options
Diffstat (limited to 'plot/vrml.h')
-rw-r--r-- | plot/vrml.h | 186 |
1 files changed, 154 insertions, 32 deletions
diff --git a/plot/vrml.h b/plot/vrml.h index e3991c5..ff44a6c 100644 --- a/plot/vrml.h +++ b/plot/vrml.h @@ -11,42 +11,104 @@ * see the License.txt file for licencing details. */ +/* Set global format using environment variable: + + ARGYLL_3D_DISP_FORMAT to "VRML", "X3D" or "X3DOM". +*/ + +/* Problems with .x3d using FreeWRL: + + Latest version makes surface colors look emissive, and you can't see + the poligon edges == no detail. + + Lighting is weird - some stuff is black unless -1-1-1 light intensity is turned up. + + Poor navigation. + + Text size is different to Cosmo. +*/ + +/* Output format */ +typedef enum { + fmt_uninit = -1, + fmt_vrml = 0, + fmt_x3d = 1, + fmt_x3dom = 2 +} vrml_fmt; + +/* (Make sure all callers are using vrml_space enum. before changing any values) */ +typedef enum { + vrml_lab = 0, /* L*a*b* 0..100 */ + vrml_xyz = 1, /* XYZ scale 0..1 */ + vrml_rgb = 2 /* RGB scale 0..1 */ +} vrml_space; + + +struct vrml_point { + double pp[3]; /* Vertex position */ + double cc[3]; /* Vertex color */ + int last; /* Last vertex of line flag */ +}; + +struct vrml_triquad { + int ix[4]; + double cc[3]; /* Per polygon color if ppoly, natural if cc[0] < 0 */ +}; + struct _vrml { /* Private: */ + char *name; /* Name including extension */ FILE *fp; - int isxyz; /* nz if XYZ plot, (range 0..1) */ + int written; /* Set to nz when file has been written */ + + vrml_fmt fmt; /* Format to output. Defaults to global format */ + /* (Have to add ext() and format() methods if we change this) */ + vrml_space ispace; /* 0 if Lab, 1 if XYZ plot, (range 0..1), 2 if RGB (range 0..1) */ double scale; /* Scale factor to use (applied before off) */ - double off; /* Gamut L center, usually 50, to put 50 at center of view */ + double off; /* Gamut L center, usually 50, to put Z 0 at center of view */ - /* Expandable point arrays */ + /* Expandable point and line/patch arrays */ struct { int npoints; int paloc; - struct { - double pp[3]; /* Vertex position */ - double cc[3]; /* Vertex color */ - int last; /* Last vertex of line flag */ - } *pary; - } set[10]; /* Ten sets */ - - /* Expandable triangle vertex index */ - int ntris; - int taloc; - struct { int set; int ix[3]; } *tary; + struct vrml_point *pary; + + /* Expandable line/triangle/quad vertex index */ + /* (Line has ix[2] = -1, Triangle has ix[3] = -1) */ + int ntrqu; + int taloc; + struct vrml_triquad *tqary; + + int ppoly; /* Use per poligon color rather than vertex */ + + } set[10]; /* Up to ten sets */ /* Public: */ /* Methods */ + /* Return this files format extension (i.e. ".wrl" */ + char *(*ext)(struct _vrml *s); + + /* Return this files format type name */ + char *(*format)(struct _vrml *s); + + /* Write the file out. Return nz on error */ + int (*flush)(struct _vrml *s); + /* Finish writing the file and free ourselves */ void (*del)(struct _vrml *s); + /* Add a spherical marker point to the plot. col == NULL for natural color */ /* (Need to do this before or after start_line_set()/dd_vertex()/make_lines() !) */ void (*add_marker)(struct _vrml *s, double pos[3], double col[3], double rad); + /* Add a spherical marker with transparency */ + void (*add_marker_trans)(struct _vrml *s, double pos[3], double col[3], double trans, double rad); + /* Add a cone marker to the plot. col == NULL for natural color */ /* (Need to do this before or after start_line_set()/dd_vertex()/make_lines() !) */ void (*add_cone)(struct _vrml *s, double p0[3], double p1[3], double col[3], double rad); @@ -56,33 +118,81 @@ struct _vrml { void (*add_text)(struct _vrml *s, char *text, double p[3], double col[3], double size); - /* Start building up verticies that will be converted to lines */ - /* Set can be from 0 - 9 */ + /* Start building up verticies that will be converted to lines, triangles or quads. */ + /* Set can be from 0 - 9 (call this before add_vertx() etc) */ void (*start_line_set)(struct _vrml *s, int set); - /* Add a verticy (color automatic from Lab position) */ - void (*add_vertex)(struct _vrml *s, int set, double pos[3]); + /* Add a verticy (default natural color from pos.) */ + /* Return the index number */ + int (*add_vertex)(struct _vrml *s, int set, double pos[3]); + + /* Add a verticy with per vertex color */ + /* Return the index number */ + int (*add_col_vertex)(struct _vrml *s, int set, double pos[3], double col[3]); + - /* Add a verticy with color */ - void (*add_col_vertex)(struct _vrml *s, int set, double pos[3], double col[3]); + /* Turn all the vertexes into a set of points */ + void (*make_points)(struct _vrml *s, int set); - /* Turn the last added vertex into the last vertex of the line */ + //void (*make_col_points)(struct _vrml *s, int set, double col[3]); + + + /* Turn the last added vertex into the last vertex of the line (incremental line creation) */ + /* (Sets .last flag on vertex) */ void (*make_last_vertex)(struct _vrml *s, int set); /* Convert the verticies to lines, ppset verticies per line (or using .last flag) */ - /* Use large ppset for just .last flag */ + /* and output all the lines, using per vertex color. */ + /* Use ppset > no verticies for just .last flag */ void (*make_lines)(struct _vrml *s, int set, int ppset); - /* Add a triangles vertexes defined by vertex index */ + + /* Add a line defined by vertex indexes using per vertex color */ + void (*add_line)(struct _vrml *s, int set, int ix[2]); + + /* Add a line defined by vertex index, and set per line color. */ + /* col == NULL or col[0] < 0.0 not to set per line color */ + void (*add_col_line)(struct _vrml *s, int set, int ix[2], double col[3]); + + /* Output lines using per vertex or per line colors. */ + void (*make_lines_vc)(struct _vrml *s, int set, double trans); + + /* Output lines with overall per line color */ + /* col == NULL or col[0] < 0.0 not to set overall color */ + void (*make_lines_cc)(struct _vrml *s, int set, double trans, double col[3]); + + + /* Add a triangles defined by vertex indexes using per vertex color */ void (*add_triangle)(struct _vrml *s, int set, int ix[3]); - /* Convert the triangle vertexes to triangles with overall color */ - void (*make_triangles)(struct _vrml *s, int set, double trans, double col[3]); + /* Add a triangle defined by vertex indexes, and set per triangle color. */ + /* col == NULL or col[0] < 0.0 not to set per line color */ + void (*add_col_triangle)(struct _vrml *s, int set, int ix[3], double col[3]); - /* Convert the triangle vertexes to triangles using vertex colors */ + /* Output triangles using per vertex colors. */ void (*make_triangles_vc)(struct _vrml *s, int set, double trans); - /* Clear verticies and triangles */ + /* Output triangles with overall per line color */ + /* col == NULL or col[0] < 0.0 not to set overall color */ + void (*make_triangles)(struct _vrml *s, int set, double trans, double col[3]); + + + /* Add a quad defined by vertex index using per vertex color */ + void (*add_quad)(struct _vrml *s, int set, int ix[4]); + + /* Add a quad defined by vertex indexes, and set per quad color. */ + /* col == NULL or col[0] < 0.0 not to set per quad color */ + void (*add_col_quad)(struct _vrml *s, int set, int ix[4], double col[3]); + + /* Output quads using per vertex colors. */ + void (*make_quads_vc)(struct _vrml *s, int set, double trans); + + /* Output quads with overall per line color. */ + /* col == NULL or col[0] < 0.0 not to set overall color */ + void (*make_quads)(struct _vrml *s, int set, double trans, double col[3]); + + + /* Clear verticies and lines/triangles/quads */ void (*clear)(struct _vrml *s); /* Helper :- convert a Lab value to RGB */ @@ -91,23 +201,35 @@ struct _vrml { /* Helper :- convert a XYZ value to RGB */ void (*XYZ2RGB)(struct _vrml *s, double *out, double *in); + /* Always put these last */ #ifdef GAMUT_H /* If gamut.h is #included ahead of us */ /* Create a solid gamut surface from the given gamut */ - /* trans is trasparency, cc is surface color, cc[0] < 0.0 for natural */ + /* trans is trasparency, cc is surface color, cc[0] < 0.0 for natural (Uses set 9) */ void (*make_gamut_surface)(struct _vrml *s, gamut *g, double trans, double cc[3]); - /* Create a solid or wireframe gamut surface from the given gamut */ + /* Create a solid or wireframe gamut surface from the given gamut (Uses set 9) */ /* trans is trasparency, cc is surface color, cc[0] < 0.0 for natural */ void (*make_gamut_surface_2)(struct _vrml *s, gamut *g, double trans, int wire, double cc[3]); - /* Add cusp markers from the gamut surface */ + /* Add cusp markers from the gamut surface) */ void (*add_cusps)(struct _vrml *s, gamut *g, double trans, double cc[3]); #endif /* GAMUT_H */ }; typedef struct _vrml vrml; -/* Constructor. */ -vrml *new_vrml(char *name, int doaxes, int isxyz); +/* Return the global file format extension (i.e. ".wrl" */ +char *vrml_ext(); + +/* Return the global file format type name */ +char *vrml_format(); + +/* Create a vrml/x3d plot object. */ +/* Filename will have appropriate extension added automatically. */ +vrml *new_vrml_vdist(char *name, int doaxes, vrml_space ispace, double vdist); + +/* Same as above but override default Z viewing distance */ +vrml *new_vrml(char *name, int doaxes, vrml_space ispace); + #define VRML_H #endif /* VRML_H */ |