Files
argyllcms/plot/vrml.h
2026-08-20 20:28:40 +01:00

240 lines
8.0 KiB
C

#ifndef VRML_H
/*
* Simple diagnostic VRML function library for debugging
*
* Copyright 2005 - 2007 Graeme W. Gill
* All rights reserved.
*
* This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
* 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 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 Z 0 at center of view */
/* Expandable point and line/patch arrays */
struct {
int npoints;
int paloc;
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 */
/* rad is in normalized delta E scale units */
/* (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 */
/* rad is in normalized delta E scale units */
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 */
/* rad is in normalized delta E scale units */
/* (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);
/* Add a text marker to the plot. col == NULL for natural color */
/* size is in normalized delta E scale units */
/* (Need to do this before or after start_line_set()/dd_vertex()/make_lines() !) */
void (*add_text)(struct _vrml *s, char *text, double p[3], double col[3], double size);
/* Start building up vertices 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 (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]);
/* Turn all the vertexes into a set of points */
void (*make_points)(struct _vrml *s, int set);
//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 vertices to lines, ppset vertices per line (or using .last flag) */
/* and output all the lines, using per vertex color. */
/* Use ppset == 0 for just .last flag */
void (*make_lines)(struct _vrml *s, int set, int ppset);
/* 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]);
/* 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]);
/* Output triangles using per vertex colors. */
void (*make_triangles_vc)(struct _vrml *s, int set, double trans);
/* 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 vertices and lines/triangles/quads */
void (*clear)(struct _vrml *s);
/* Helper :- convert a Lab value to RGB */
void (*Lab2RGB)(struct _vrml *s, double *out, double *in);
/* 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 (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 (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) */
void (*add_cusps)(struct _vrml *s, gamut *g, double trans, double cc[3]);
#endif /* GAMUT_H */
}; typedef struct _vrml vrml;
/* 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(char *name, int doaxes, vrml_space ispace);
/* Same as above but override default Z viewing distance */
vrml *new_vrml_vdist(char *name, int doaxes, vrml_space ispace, double vdist);
#define VRML_H
#endif /* VRML_H */