summaryrefslogtreecommitdiff
path: root/plot/vrml.h
diff options
context:
space:
mode:
Diffstat (limited to 'plot/vrml.h')
-rw-r--r--plot/vrml.h186
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 */