[brlcad-commits] SF.net SVN: brlcad:[45900] brlcad/trunk/src/libgcv/wfobj
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <n_...@us...> - 2011-08-10 14:50:58
|
Revision: 45900 http://brlcad.svn.sourceforge.net/brlcad/?rev=45900&view=rev Author: n_reed Date: 2011-08-10 14:50:49 +0000 (Wed, 10 Aug 2011) Log Message: ----------- Removing unused C versions of obj parser sources. They will be out-of-sync with the refactored C++ parser sources. Modified Paths: -------------- brlcad/trunk/src/libgcv/wfobj/Makefile.am Added Paths: ----------- brlcad/trunk/src/libgcv/wfobj/obj_parser.h Removed Paths: ------------- brlcad/trunk/src/libgcv/wfobj/obj_grammar.y brlcad/trunk/src/libgcv/wfobj/obj_parser.c brlcad/trunk/src/libgcv/wfobj/obj_parser.h brlcad/trunk/src/libgcv/wfobj/obj_parser.h.orig brlcad/trunk/src/libgcv/wfobj/obj_rules.l Modified: brlcad/trunk/src/libgcv/wfobj/Makefile.am =================================================================== --- brlcad/trunk/src/libgcv/wfobj/Makefile.am 2011-08-10 14:04:10 UTC (rev 45899) +++ brlcad/trunk/src/libgcv/wfobj/Makefile.am 2011-08-10 14:50:49 UTC (rev 45900) @@ -3,33 +3,24 @@ bin_PROGRAMS = \ parse -#libobj_la_LDFLAGS = -#libobj_la_LIBADD = ${BU} -#libobj_la_SOURCES = \ -# obj_grammar.y \ -# obj_rules.l \ -# obj_parser.c - parse_LDADD = ${BU} parse_SOURCES = \ - obj_grammar.y \ - obj_rules.l \ - obj_parser.c + obj_grammar.yy \ + obj_rules.ll \ + obj_parser.cc noinst_HEADERS = \ obj_grammar.h \ obj_parser.h -obj_grammar.h : obj_grammar.y +obj_grammar.h : obj_grammar.yy obj_parser.lo : obj_grammar.h BUILT_SOURCES = \ - obj_rules.c \ + obj_rules.cc \ obj_grammar.h \ - obj_grammar.c + obj_grammar.cc -EXTRA_DIST = obj_parser.h.orig - DISTCLEANFILES = $(BUILT_SOURCES) include $(top_srcdir)/misc/Makefile.defs Deleted: brlcad/trunk/src/libgcv/wfobj/obj_grammar.y =================================================================== --- brlcad/trunk/src/libgcv/wfobj/obj_grammar.y 2011-08-10 14:04:10 UTC (rev 45899) +++ brlcad/trunk/src/libgcv/wfobj/obj_grammar.y 2011-08-10 14:50:49 UTC (rev 45900) @@ -1,394 +0,0 @@ -%{ - #include <stdlib.h> - #include <stdio.h> - #include <stddef.h> - #include <string.h> - #include "obj_parser.h" - -int yydebug = 1; - -extern FILE *yyin; -extern int yylex(); -extern char *yytext; - -/* lex/yacc definitions */ - -void obj_parser_error() -{ - printf("obj_parser_error\n"); -} - -void yyerror(const char *str) -{ - fprintf(stderr,"error: %s\n",str); -} - -int yywrap() -{ - return 1; -} - -%} - -%token <real> FLOAT -%token <integer> INTEGER -%token <reference> V_REFERENCE -%token <reference> TV_REFERENCE -%token <reference> NV_REFERENCE -%token <reference> TNV_REFERENCE - -%token ID -%token VERTEX -%token T_VERTEX -%token N_VERTEX -%token POINT -%token LINE -%token FACE -%token GROUP -%token SMOOTH -%token OBJECT -%token USEMTL -%token MTLLIB -%token USEMAP -%token MAPLIB -%token BEVEL -%token C_INTERP -%token D_INTERP -%token LOD -%token SHADOW_OBJ -%token TRACE_OBJ -%token ON -%token OFF - -%type <real> coord -%type <toggle> toggle -%type <index> p_v_reference_list -%type <index> l_v_reference_list -%type <index> l_tv_reference_list -%type <index> f_v_reference_list -%type <index> f_tv_reference_list -%type <index> f_nv_reference_list -%type <index> f_tnv_reference_list -%% - -statement_list: '\n' - | statement '\n' - | statement_list '\n' - | statement_list statement '\n' - ; - -statement: vertex - | t_vertex - | n_vertex - | point - | line - | face - | group - | smooth - | object - | usemtl - | mtllib - | usemap - | maplib - | shadow_obj - | trace_obj - | bevel - | c_interp - | d_interp - | lod - ; - -coord: FLOAT { $$ = $1; } - | INTEGER { $$ = $1; } - ; - -vertex - : VERTEX coord coord coord - { - obj_add_vertex(0, $2, $3, $4); - } - | VERTEX coord coord coord coord - { - printf("\tVERTEX: %f,%f,%f,%f\n", $2,$3,$4,$5); - } - ; - -t_vertex - : T_VERTEX coord - { - obj_add_vertex(1, $2, 0, 0); - } - | T_VERTEX coord coord - { - obj_add_vertex(1, $2, $3, 0); - } - | T_VERTEX coord coord coord - { - obj_add_vertex(1, $2, $3, $4); - } - ; - -n_vertex - : N_VERTEX coord coord coord - { - obj_add_vertex(2, $2, $3, $4); - } - ; - -p_v_reference_list - : INTEGER - { - printf("\tpvrl INTEGER: %d\n", $1); - } - | V_REFERENCE - { - printf("\tpvrl V_REFERENCE\n"); - } - | p_v_reference_list INTEGER - { - printf("\tpvrl p_v_reference_list INTEGER: %d\n", $2); - } - | p_v_reference_list V_REFERENCE - { - printf("\tpvrl p_v_reference_list V_REFERENCE\n"); - } - ; - -l_v_reference_list - : INTEGER - { - printf("\tlvrl INTEGER: %d\n", $1); - } - | V_REFERENCE - { - printf("\tlvrl V_REFERENCE\n"); - } - | l_v_reference_list INTEGER - { - printf("\tlvrl l_v_reference_list INTEGER: %d\n", $2); - } - | l_v_reference_list V_REFERENCE - { - printf("\tlvrl l_v_reference_list V_REFERENCE"); - } - ; - -l_tv_reference_list - : TV_REFERENCE - { - printf("\tltvrl TV_REFERENCE\n"); - } - | l_tv_reference_list TV_REFERENCE - { - printf("\tltvrl l_tv_reference_list TV_REFERENCE\n"); - } - ; - -f_v_reference_list - : INTEGER - { - printf("\tfvrl INTEGER %d\n", $1); - } - | V_REFERENCE - { - printf("\tfvrl V_REFERENCE\n"); - } - | f_v_reference_list INTEGER - { - printf("\tfvrl f_v_reference_list INTEGER: %d\n", $2); - } - | f_v_reference_list V_REFERENCE - { - printf("\tfvrl f_v_reference_list V_REFERENCE\n"); - } - ; - -f_tv_reference_list - : TV_REFERENCE - { - printf("\tftvrl TV_REFERENCE\n"); - } - | f_tv_reference_list TV_REFERENCE - { - printf("\tftvrl f_tv_reference_list TV_REFERENCE"); - } - ; - -f_nv_reference_list - : NV_REFERENCE - { - printf("\tfnvrl NV_REFERENCE: %d,%d\n", $1[0],$1[2]); - } - | f_nv_reference_list NV_REFERENCE - { - printf("\tfnvrl f_nv_reference_list NV_REFERENCE: %d,%d\n",$2[0],$2[2]); - } - ; - -f_tnv_reference_list - : TNV_REFERENCE - { - printf("\tftnvrl TNV_REFERENCE\n"); - } - | f_tnv_reference_list TNV_REFERENCE - { - printf("\tftnvrl f_tnv_reference_list TNV_REFERENCE\n"); - } - ; - -point - : POINT p_v_reference_list - { - printf("\tPOINT f_tnv_reference_list\n"); - } - ; - -line - : LINE l_v_reference_list - { - printf("\tLINE l_v_reference_list\n"); - } - | - LINE l_tv_reference_list - { - printf("\tLINE l_tv_reference_list\n"); - } - ; - -face - : FACE f_v_reference_list - { - printf("\tFACE f_v_reference_list\n"); - } - | FACE f_tv_reference_list - { - printf("\tFACE f_tv_reference_list\n"); - } - | FACE f_nv_reference_list - { - printf("\tFACE f_nv_reference_list\n"); - } - | FACE f_tnv_reference_list - { - printf("\tFACE f_tnv_reference_list\n"); - } - ; - -group: GROUP id_list - { - printf("\tGROUP id_list\n"); - } - ; - -smooth: SMOOTH INTEGER - { - if($2 < 0) { - obj_parser_error(); - YYERROR; - } - printf("\tSMOOTH INTEGER: %d\t\n", $2); - } - | SMOOTH OFF - { - printf("\tSMOOTH OFF\n"); - } - ; - -object: OBJECT ID - { - printf("\tOBJECT ID: %s\n", yytext); - } - ; - -usemtl: USEMTL ID - { - printf("\tUSEMTL ID: %s\n", yytext); - } - ; - -mtllib: MTLLIB id_list - { - printf("\tMTLLIB id_list\n"); - } - ; - -usemap: USEMAP ID - { - printf("\tUSEMAP ID %s\n", yytext); - } - | USEMAP OFF - { - printf("\tUSEMAP OFF\n"); - } - ; - -maplib: MAPLIB id_list - { - printf("\tMAPLIB id_list\n"); - } - ; - -shadow_obj: SHADOW_OBJ ID - { - printf("\tSHADOW_OBJ ID: %s\n", yytext); - } - ; - -trace_obj: TRACE_OBJ ID - { - printf("\tTRACE_OBJ ID: %s\n", yytext); - } - ; - -bevel: BEVEL toggle - { - printf("\tBEVEL toggle\n"); - } - ; - -c_interp: C_INTERP toggle - { - printf("\tC_INTERP toggle\n"); - } - ; - -d_interp: D_INTERP toggle - { - printf("\tD_INTERP toggle\n"); - } - ; - -lod: LOD INTEGER - { - if(!($2 >= 0 && $2 <= 100)) { - obj_parser_error(); - YYERROR; - } - - printf("\tLOD INTEGER: %s\n", $2); - } - ; - -id_list: ID - { - printf("\til ID: %s\n", yytext); - } - | id_list ID - { - printf("\til id_list ID\n"); - } - ; - -toggle: ON - { - printf("1\n"); - $$ = 1; - } - | OFF - { - printf("0\n"); - $$ = 0; - } - ; - -%% Deleted: brlcad/trunk/src/libgcv/wfobj/obj_parser.c =================================================================== --- brlcad/trunk/src/libgcv/wfobj/obj_parser.c 2011-08-10 14:04:10 UTC (rev 45899) +++ brlcad/trunk/src/libgcv/wfobj/obj_parser.c 2011-08-10 14:50:49 UTC (rev 45900) @@ -1,196 +0,0 @@ -/* O B J _ P A R S E R . C - * BRL-CAD - * - * Copyright (c) 2004-2011 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - * - */ -/** @file obj_parser.c - * - * Handling routines for obj parsing - * - */ - -/* interface header */ -#include "./obj_parser.h" - -#include <stdio.h> -#ifdef HAVE_STDINT_H -# include <stdint.h> -#else -# ifdef HAVE_INTTYPES_H -# include <inttypes.h> -# endif -#endif - -#include "bu.h" -#include "vmath.h" - - -#define INITIAL_SIZE 100 - - -extern FILE *yyin; -extern int yyparse (void); - -obj_vertices_t obj_global_vertices; -obj_elements_t obj_global_elements; -obj_groups_t obj_global_groups; - - -int -obj_add_vertex(int type, fastf_t x, fastf_t y, fastf_t z) -{ - int *curr; - int *max; - point_t **array; - switch (type) { - case 1: - curr = &(obj_global_vertices.t_count); - max = &(obj_global_vertices.t_max); - array = &(obj_global_vertices.texture); - break; - case 2: - curr = &(obj_global_vertices.n_count); - max = &(obj_global_vertices.n_max); - array = &(obj_global_vertices.vertex_norm); - break; - default: - curr = &(obj_global_vertices.v_count); - max = &(obj_global_vertices.v_max); - array = &(obj_global_vertices.geometric); - } - if (*curr == *max - 1) { - printf("curr: %d\n", *curr); - printf("max: %d\n", *max); - *array = (point_t *)bu_realloc(*array, sizeof(point_t) * (*max + INITIAL_SIZE), "realloc geometric vertices"); - *max = *max + INITIAL_SIZE; - } - (*array)[*curr][0] = x; - (*array)[*curr][1] = y; - (*array)[*curr][2] = z; - *curr = *curr + 1; - return *curr; -} - - -int -obj_add_group(char *grpname) -{ - int curr = obj_global_groups.g_count; - int max = obj_global_groups.g_max; - if (curr == max - 1) { - obj_global_groups.groups = (obj_group_t *)bu_realloc(obj_global_groups.groups, sizeof(obj_group_t) * (max + INITIAL_SIZE), "realloc groups array"); - obj_global_groups.g_max = max + INITIAL_SIZE; - } -} - - -int -obj_add_line() -{ - int curr = obj_global_elements.l_count; - int max = obj_global_elements.l_max; - if (curr == max - 1) { - obj_global_elements.lines = (obj_line_t *)bu_realloc(obj_global_elements.lines, sizeof(obj_line_t) * (max + INITIAL_SIZE), "realloc lines array"); - obj_global_elements.l_max = max + INITIAL_SIZE; - } -} - - -int -obj_add_face() -{ - int curr = obj_global_elements.f_count; - int max = obj_global_elements.f_max; - if (curr == max - 1) { - obj_global_elements.faces = (obj_face_t *)bu_realloc(obj_global_elements.faces, sizeof(obj_face_t) * (max + INITIAL_SIZE), "realloc lines array"); - obj_global_elements.f_max = max * INITIAL_SIZE; - } -} - - -int -main(int argc, char *argv[]) -{ - int i; - obj_global_vertices.geometric = (point_t *)bu_malloc(sizeof(point_t)*INITIAL_SIZE, "initial geometric vertices malloc"); - obj_global_vertices.v_count = 0; - obj_global_vertices.v_max = INITIAL_SIZE; - obj_global_vertices.texture = (point_t *)bu_malloc(sizeof(point_t)*INITIAL_SIZE, "initial texture vertices malloc"); - obj_global_vertices.t_count = 0; - obj_global_vertices.t_max = INITIAL_SIZE; - obj_global_vertices.vertex_norm = (point_t *)bu_malloc(sizeof(point_t)*INITIAL_SIZE, "initial texture vertices malloc"); - obj_global_vertices.v_count = 0; - obj_global_vertices.v_max = INITIAL_SIZE; - obj_global_elements.points = (point_t *)bu_malloc(sizeof(point_t)*INITIAL_SIZE, "initial point array malloc"); - obj_global_elements.p_count = 0; - obj_global_elements.p_max = INITIAL_SIZE; - obj_global_elements.lines = (obj_line_t *)bu_malloc(sizeof(obj_line_t)*INITIAL_SIZE, "initial line array malloc"); - obj_global_elements.l_count = 0; - obj_global_elements.l_max = INITIAL_SIZE; - obj_global_elements.faces = (obj_face_t *)bu_malloc(sizeof(obj_face_t)*INITIAL_SIZE, "initial face array malloc"); - obj_global_elements.f_count = 0; - obj_global_elements.f_max = INITIAL_SIZE; - obj_global_groups.groups = (obj_group_t *)bu_malloc(sizeof(obj_group_t)*INITIAL_SIZE, "initial group array malloc"); - obj_global_groups.g_count = 0; - obj_global_groups.g_max = INITIAL_SIZE; - - if (argc > 0) { - printf("Reading from %s\n", argv[1]); - yyin = fopen(argv[1], "r"); - if (!yyin) { - perror("Unable to open file"); - return -1; - } - while (!feof(yyin)) { - yyparse(); - } - if (yyin) { - fclose(yyin); - } - } else { - printf("Reading from stdin\n"); - yyin = stdin; - yyparse(); - } - - for (i = 0; i < obj_global_vertices.v_count; i++) { - printf("added geometric vertex %d: (%f, %f, %f)\n", i+1, obj_global_vertices.geometric[i][0], obj_global_vertices.geometric[i][1], obj_global_vertices.geometric[i][2]); - } - - for (i = 0; i < obj_global_vertices.t_count; i++) { - printf("added texture vertex %d: (%f, %f, %f)\n", i+1, obj_global_vertices.texture[i][0], obj_global_vertices.texture[i][1], obj_global_vertices.texture[i][2]); - } - - for (i = 0; i < obj_global_vertices.n_count; i++) { - printf("added vertex normal %d: (%f, %f, %f)\n", i+1, obj_global_vertices.vertex_norm[i][0], obj_global_vertices.vertex_norm[i][1], obj_global_vertices.vertex_norm[i][2]); - } - - - return 0; -} - - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ Deleted: brlcad/trunk/src/libgcv/wfobj/obj_parser.h =================================================================== --- brlcad/trunk/src/libgcv/wfobj/obj_parser.h 2011-08-10 14:04:10 UTC (rev 45899) +++ brlcad/trunk/src/libgcv/wfobj/obj_parser.h 2011-08-10 14:50:49 UTC (rev 45900) @@ -1,190 +0,0 @@ -/* O B J _ P A R S E R . H - * BRL-CAD - * - * Copyright (c) 2010-2011 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ - -#ifndef OBJ_PARSER_H -#define OBJ_PARSER_H -#endif - -#include "common.h" -#include "vmath.h" - - -/* Freeform curve and surface types */ -#define BEZIER 1 -#define BASISMATRIX 2 -#define BSPLINE 3 -#define CARDINAL 4 -#define TAYLOR 5 - -/* Basic 3D vertices */ - -typedef struct ctrl_point { - point_t pt; - fastf_t w; -} ctrl_point_t; - -typedef struct obj_vertices { - int v_count; - int v_max; - point_t *geometric; - int t_count; - int t_max; - point_t *texture; - int n_count; - int n_max; - vect_t *vertex_norm; - int c_count; - int c_max; - ctrl_point_t *control; -} obj_vertices_t; - -/* Elements */ - -typedef struct obj_line { - int v_count; - int v_max; - int t_count; - int t_max; - point_t **vertex; - point_t **texture; -} obj_line_t; - -typedef struct obj_face { - int v_count; - int v_max; - int t_count; - int t_max; - int n_count; - int n_max; - point_t **vertex; - point_t **texture; - vect_t **normal; -} obj_face_t; - -typedef struct obj_elements { - int p_count; - int p_max; - point_t *points; - int l_count; - int l_max; - obj_line_t *lines; - int f_count; - int f_max; - obj_face_t *faces; -} obj_elements_t; - -/* Curves and Surfaces */ - -typedef struct obj_freeform_curve { - int type; - int rational; - int degree_u; - int step_u; - fastf_t *basis_matrix; - fastf_t u0; - fastf_t u1; - ctrl_point_t **control; - fastf_t *param_u; -} obj_freeform_curve_t; - -typedef struct obj_trim { - int type; /* 0 = hole, 1 = trim */ - obj_freeform_curve_t *curve; - fastf_t u0; - fastf_t u1; -} obj_trim_t; - -typedef struct obj_trim_loop { - obj_trim_t **trims; -} obj_trim_loop_t; - -typedef struct obj_freeform_surface { - int type; - int rational; - int degree_u; - int degree_v; - int step_u; - int step_v; - fastf_t *basis_matrix; - fastf_t s0; - fastf_t s1; - fastf_t t0; - fastf_t t1; - ctrl_point_t **control; - point_t **texture; - vect_t **normal; - fastf_t *param_u; - fastf_t *param_v; - obj_trim_loop_t *loops; -} obj_freeform_surface_t; - -typedef struct obj_group { - int active; - int l_count; - int l_max; - obj_line_t *lines; - int f_count; - int f_max; - obj_face_t *faces; -} obj_group_t; - -typedef struct obj_groups { - int g_count; - int g_max; - obj_group_t *groups; -} obj_groups_t; - -typedef struct obj_data { - float real; - int integer; - int reference[3]; - int toggle; - size_t index; -} obj_data_t; - -#undef YYSTYPE -#define YYSTYPE obj_data_t - -#ifndef YY_STACK_USED -# define YY_STACK_USED 0 -#endif -#ifndef YY_STACK_UNUSED -# define YY_STACK_UNUSED 0 -#endif -#ifndef YY_ALWAYS_INTERACTIVE -# define YY_ALWAYS_INTERACTIVE 0 -#endif -#ifndef YY_NEVER_INTERACTIVE -# define YY_NEVER_INTERACTIVE 0 -#endif -#ifndef YY_MAIN -# define YY_MAIN 0 -#endif - - -/* - * Local Variables: - * mode: C++ - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ Copied: brlcad/trunk/src/libgcv/wfobj/obj_parser.h (from rev 45899, brlcad/trunk/src/libgcv/wfobj/obj_parser.h.orig) =================================================================== --- brlcad/trunk/src/libgcv/wfobj/obj_parser.h (rev 0) +++ brlcad/trunk/src/libgcv/wfobj/obj_parser.h 2011-08-10 14:50:49 UTC (rev 45900) @@ -0,0 +1,775 @@ +/* O B J _ P A R S E R . H + * BRL-CAD + * + * Copyright (c) 2010-2011 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ + +#ifndef OBJ_PARSER_H +#define OBJ_PARSER_H + +#include "common.h" +#include "vmath.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#undef YYSTYPE +#define YYSTYPE point_line_t + +#ifndef YY_STACK_USED +# define YY_STACK_USED 0 +#endif +#ifndef YY_STACK_UNUSED +# define YY_STACK_UNUSED 0 +#endif +#ifndef YY_ALWAYS_INTERACTIVE +# define YY_ALWAYS_INTERACTIVE 0 +#endif +#ifndef YY_NEVER_INTERACTIVE +# define YY_NEVER_INTERACTIVE 0 +#endif +#ifndef YY_MAIN +# define YY_MAIN 0 +#endif + +#include "./obj_grammar.h" + +/** + * A structure containing the contents of a parsed wavefront obj file + */ +typedef struct { + void *p; +} obj_contents_t; + +/** + * A structure with the attributes describing a polygonal element + * + * groupset_index + * An index into a set of group sets this element belongs to. + * See obj_groups and obj_groupsets + * + * object_index + * An index into a set of object labels that this element belongs to + * See obj_objects + * + * material_index + * An index into a set of materials that describes this element + * See obj_materials + * + * materiallibset_index + * An index into a set of material library sets this element uses + * See obj_materiallibs and obj_materiallibsets + * + * texmap_index + * An index into a set of texture maps that describes this element + * See obj_texmaps + * + * texmaplibset_index + * An index into a set of texture map library sets this element uses + * See obj_texmaplibs and obj_texmaplibsets + * + * shadow_obj_index + * An index into a set of shadow objects that this element uses + * See obj_shadow_objs + * + * trace_obj_index + * An index into a set of trace objects that this element uses + * See obj_trace_objs + * + * smooth_group + * A smoothing group id for this element + * N.B. unspecified in signess or default in wavefront obj spec, + * here unsigned and 0 + * + * bevel + * Whether this element bevel flag is off (zero) or on (non-zero), as per + * wavefront spec, default is off + * + * c_interp + * Whether color interpolation is off (zero) or on (non-zero), as per + * wavefront spec, default is off + * + * d_interp + * Whether dissolve interpolation is off (zero) or on (non-zero), as per + * wavefront spec, default is off + * + * lod + * The level of detail this element should be displayed as. This is a value + * between 0 (all elements) and 100. As per wavefront spec, default is 0. + */ +typedef struct { + size_t groupset_index; + size_t object_index; + size_t material_index; + size_t materiallibset_index; + size_t texmap_index; + size_t texmaplibset_index; + size_t shadow_obj_index; + size_t trace_obj_index; + unsigned int smooth_group; + unsigned char bevel; + unsigned char c_interp; + unsigned char d_interp; + unsigned char lod; +} obj_polygonal_attributes_t; + +/** + * Parse the obj file 'filename' with 'parser', create and place results into + * 'contents'. + * + * If the filename begins with the '/' character, then the file is + * understood to be an absolute path starting at the root directory. If the + * filename does not begin with a '/' character, the file is understood to + * be relative to the current working directory. In either case any additional + * relative file inclusion mechanism will be relative to the directory that + * holds the input file. + * + * After a successful call to obj_parse_file, you must eventually + * call obj_contents_destroy. + * + * If unable to successfully parse 'filename' a negative value will be + * returned and the reason can be obtained by obj_parse_error. + * + * Warnings or information about non-implemented features will return success + * and be reported via obj_parse_error. + * + * Return values: + * 0 - success + * ENOMEM - out of memory + * Any error code returned by fopen + * <0 - failure, see obj_parse_error + */ +int obj_file_parse(FILE *filename, obj_contents_t *contents); + +/** + * Parse the obj data pointed to by 'data', create and + * place results into 'contents'. + * + * After a successful call to obj_parse_file, you must eventually + * call obj_contents_destroy. + * + * If unable to successfully parse the data pointed to by 'data' a + * negative value will be returned and the reason can be obtained by + * obj_parse_error. + * + * Warnings or information about non-implemented features will return success + * and be reported via obj_parse_error. + * + * Return values: + * 0 - success + * ENOMEM - out of memory + * Any error code returned by fopen + * <0 - failure, see obj_parse_error + */ +int obj_parse(const char *data, obj_contents_t *contents); + +/** + * Return the reason the last attempt to parse a file failed or warnings + * generated during the parse. + * + * Return: + * 0 - The previous parse attempt succeeded and no warnings generated. + * !0 - A null terminated string containing information about the last parse + */ +const char * obj_parse_error(); + +/** + * Destroy the obj_contents_t object. + * + * Return values: + * 0 - success + */ +int obj_contents_destroy(obj_contents_t contents); + +/** + * Obtain a list of all vertices contained in 'contents'. + * + * Copy a pointer to a multidimensional array of vertices contained in + * 'contents' to the location pointed to by val_arr and return its length. + * + * The vertices are contained in an array of type const float[][4] and must + * not be modified by the caller. The format of the second dimension is: + * {x y z w} where w is 1.0 by default. + * + * Return value: + * The length of the vertex list + */ +size_t obj_vertices(obj_contents_t contents, const float (*val_arr[])[4]); + +/** + * Obtain a list of all texture vertices contained in 'contents'. + * + * Copy a pointer to a multidimensional array of texture vertices contained in + * 'contents' to the location pointed to by val_arr and return its length. + * + * The vertices are contained in an array of type const float[][3] and must + * not be modified by the caller. The format of the second dimension is: + * {u v w} where v and w 0 by default. + * + * Return value: + * The length of the texture vertex list + */ +size_t obj_texture_coord(obj_contents_t contents, const float (*val_arr[])[3]); + +/** + * Obtain a list of all normals contained in 'contents'. + * + * Copy a pointer to a multidimensional array of normals contained in + * 'contents' to the location pointed to by val_arr and return its length. + * + * The normals are contained in an array of type const float[][3] and must + * not be modified by the caller. The format of the second dimension is: + * {i j j}. + * + * Return value: + * The length of the normal list + */ +size_t obj_normals(obj_contents_t contents, const float (*val_arr[])[3]); + +/** + * Obtain a unique set of all group names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of group names + * contained in 'contents' to the location pointed to by val_arr and return + * its length. + * + * Group names are guaranteed to be a unique set. + * + * If an element has not been explicitly tagged as being part of a particular + * group, per the wavefront obj spec, the element is placed in the "default" + * group. + * + * Return value: + * The length of the group name list. + */ +size_t obj_groups(obj_contents_t contents, const char * const (*val_arr[])); + +/** + * Return the number of group sets contained in 'contents' + * + * Return value: + * The number of group sets + */ +size_t obj_num_groupsets(obj_contents_t contents); + +/** + * Obtain the 'n'th group set contained in 'contents' + * + * Copy a pointer to an index set of group indices for the 'n'th set + * contained in 'contents' to the location pointed to by val_arr and return + * its length. + * + * Group sets are guaranteed to be a unique set. + * + * When an element references a groupset index of 'n', calling obj_groupset + * with the 'n'th set will obtain a unique set of indices that can be used + * to obtain the group name. + * + * Return value: + * The length of the group set. + */ +size_t obj_groupset(obj_contents_t contents, size_t n, + const size_t (*index_arr[])); + +/** + * Obtain a unique set of all object names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of object + * names contained in 'contents' to the location pointed to by val_arr and + * return its length. + * + * Object names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as being a part of an object. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * being part of a particular object, the element shall have the "" object + * tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * object name to the empty string, the "" tag is unique to elements that + * have not had the object explicitly set. + * + * Return value: + * The length of the object name list. + */ +size_t obj_objects(obj_contents_t contents, const char * const (*val_arr[])); + +/** + * Obtain a unique set of all material names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of material + * names contained in 'contents' to the location pointed to by val_arr and + * return its length. + * + * Material names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as having a material trait. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * having a material trait, the element shall have the "" material trait tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * material name to the empty string, the "" tag is unique to elements that + * have not had the material trait explicitly set. + * + * Return value: + * The length of the material name list. + */ +size_t obj_materials(obj_contents_t contents, const char * const (*val_arr[])); + +/** + * Obtain a unique set of all material library names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of material + * library names contained in 'contents' to the location pointed to by val_arr + * and return its length. + * + * Material library names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as using a material library. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * using a material library, the element shall have the "" material library + * tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * material library to the empty string, the "" tag is unique to elements that + * have not had the material library explicitly set. + * + * Return value: + * The length of the material library name list. + */ +size_t obj_materiallibs(obj_contents_t contents, + const char * const (*val_arr[])); + +/** + * Return the number of material library sets contained in 'contents' + * + * Return value: + * The number of material library sets + */ +size_t obj_num_materiallibsets(obj_contents_t contents); + +/** + * Obtain the 'n'th material libary set contained in 'contents' + * + * Copy a pointer to an index set of material library indices for the 'n'th + * set contained in 'contents' to the location pointed to by val_arr and + * return its length. + * + * Material library sets are guaranteed to be a unique set. + * + * When an element references a materiallibset index of 'n', calling + * obj_materiallibset with the 'n'th set will obtain a unique set of indices + * that can be used to obtain the material library name. + * + * Return value: + * The length of the material library set. + */ +size_t obj_materiallibset(obj_contents_t contents, size_t n, + const size_t (*index_arr[])); + +/** + * Obtain a unique set of all texture map names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of texture map + * names contained in 'contents' to the location pointed to by val_arr and + * return its length. + * + * Texture map names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as having a texture map. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * having a texture map, the element shall have the "" texture map tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * texture map name to the empty string, the "" tag is unique to elements that + * have not had a texture map explicitly set. + * + * Return value: + * The length of the texture map list. + */ +size_t obj_texmaps(obj_contents_t contents, const char * const (*val_arr[])); + +/** + * Obtain a unique set of all texture map library names contained in + * 'contents' + * + * Copy a pointer to a null terminated character sequence array of texture map + * library names contained in 'contents' to the location pointed to by val_arr + * and return its length. + * + * Texture map library names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as using a texture map library. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * using a texture map library, the element shall have the "" material library + * tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * texture map library to the empty string, the "" tag is unique to elements + * that have not had the texture mao library explicitly set. + * + * Return value: + * The length of the texture map library name list. + */ +size_t obj_texmaplibs(obj_contents_t contents, + const char * const (*val_arr[])); + +/** + * Return the number of texture map library sets contained in 'contents' + * + * Return value: + * The number of texture map library sets + */ +size_t obj_num_texmaplibsets(obj_contents_t contents); + +/** + * Obtain the 'n'th texture map libary set contained in 'contents' + * + * Copy a pointer to an index set of texture map library indices for the 'n'th + * set contained in 'contents' to the location pointed to by val_arr and + * return its length. + * + * Texture map library sets are guaranteed to be a unique set. + * + * When an element references a texmaplibset index of 'n', calling + * obj_textmaplibset with the 'n'th set will obtain a unique set of indices + * that can be used to obtain the texture map library name. + * + * Return value: + * The length of the texture map library set. + */ +size_t obj_texmaplibset(obj_contents_t contents, size_t set, + const size_t (*index_arr[])); + +/** + * Obtain a unique set of all shadow object names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of shadow + * object names contained in 'contents' to the location pointed to by val_arr + * and return its length. + * + * Shadow object names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as having a shadow object. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * having a shadow object, the element shall have the "" shadow object tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * shadow object name to the empty string, the "" tag is unique to elements + * that have not had the shadow object explicitly set. + * + * Return value: + * The length of the shadow object name list. + */ +size_t obj_shadow_objs(obj_contents_t contents, + const char * const (*val_arr[])); + +/** + * Obtain a unique set of all trace object names contained in 'contents' + * + * Copy a pointer to a null terminated character sequence array of trace + * object names contained in 'contents' to the location pointed to by val_arr + * and return its length. + * + * Trace object names are guaranteed to be a unique set. + * + * The wavefront obj spec does not specify the default behavior for elements + * not explicitly being defined as having a trace object. Therefore, + * for this implementation, if an element has not been explicitly tagged as + * having a trace object, the element shall have the "" trace object tag. + * + * N.B. As it is impossible as per the wavefront obj spec to set a particular + * trace object name to the empty string, the "" tag is unique to elements + * that have not had the trace object explicitly set. + * + * Return value: + * The length of the trace object name list. + */ +size_t obj_trace_objs(obj_contents_t contents, + const char * const (*val_arr[])); + +/** + * Obtain a list of polygonal attributes in 'contents' + * + * Copy a pointer to a const obj_polygonal_attributes_t array of polygonal + * attrbutes contained in 'contents' to the location pointed to by attr_arr + * and return its length. + * + * Polygonal attributes are guaranteed to be a unique set. + * + * The ith index corresponds to to ith index of attindex obtained via one of + * the obj_polygonal_*_faces functions. The member value of the ith element + * obtained via this function is the index into the '*_list' array obtained + * via corresponding the obj_* function. + * + * Return value + * The length of the polygonal attributes list + */ +size_t obj_polygonal_attributes(obj_contents_t contents, + const obj_polygonal_attributes_t (*attr_list[])); + +/** + * Obtain the list of polygonal attributes for all polygonal points + * in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes describing the + * polygonal attributes for the ith point. + * + * Return value + * The total number of polygonal points + */ +size_t obj_polygonal_v_points(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the vertex indices for the 'n'th polygonal point only identifed by + * vertices in 'contents' + * + * Copy a pointer to the 'n'th vertex index array to the location pointed to + * by 'index_arr' and return the length of the array. The index array + * contains the vertices that make up the 'n'th point. + * + * Return value + * The number of vertices that make up the 'n'th polygonal point + */ +size_t obj_polygonal_v_point_vertices(obj_contents_t contents, size_t n, + const size_t (*index_arr[])); + +/** + * Obtain the list of polygonal attributes for all polygonal lines only + * identifed by vertices in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes describing the + * polygonal attributes for the ith line. + * + * Return value + * The total number of polygonal lines only identified by vertices + */ +size_t obj_polygonal_v_lines(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the vertex indices for the 'n'th polygonal line only identifed by + * vertices in 'contents' + * + * Copy a pointer to the 'n'th vertex index array to the location pointed to + * by 'index_arr' and return the length of the array. The index array + * contains the vertices that make up the 'n'th line. + * + * Return value + * The number of vertices that make up the 'n'th polygonal line + */ +size_t obj_polygonal_v_line_vertices(obj_contents_t contents, size_t n, + const size_t (*index_arr[])); + +/** + * Obtain the list of polygonal attributes for all textured polygonal lines + * in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes desribing the + * polygonal attributes for the ith line. + * + * Return value + * The total number of textured polygonal line + */ +size_t obj_polygonal_tv_lines(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the textured coordinate and vertex indices for the 'n'th textured + * polygonal line in 'contents' + * + * Copy a pointer to the 'n'th multidimensional index array to the location + * pointed to by 'index_arr' and return the length of the array. + * + * The line indices are contained in an array of type const size_t[][2] and + * must not be modified by the caller. The format of the second dimension is: + * {vertex_index, texture_coordinate_index} + * + * Return value + * The number of vertices that make up the 'n'th polygonal line + */ +size_t obj_polygonal_tv_line_vertices(obj_contents_t contents, size_t face, + const size_t (*index_arr[])[2]); + +/** + * Obtain the list of polygonal attributes for all polygonal faces only + * identifed by vertices in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes describing the + * polygonal attributes for the ith face. + * + * Return value + * The total number of polygonal faces only identified by vertices + */ +size_t obj_polygonal_v_faces(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the vertex indices for the 'n'th polygonal face only identifed by + * vertices in 'contents' + * + * Copy a pointer to the 'n'th vertex index array to the location pointed to + * by 'index_arr' and return the length of the array. The index array + * contains the vertices that make up the 'n'th face. + * + * Return value + * The number of vertices that make up the 'n'th polygonal face + */ +size_t obj_polygonal_v_face_vertices(obj_contents_t contents, size_t n, + const size_t (*index_arr[])); + +/** + * Obtain the list of polygonal attributes for all textured polygonal faces + * in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes desribing the + * polygonal attributes for the ith face. + * + * Return value + * The total number of textured polygonal faces + */ +size_t obj_polygonal_tv_faces(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the textured coordinate and vertex indices for the 'n'th textured + * polygonal face in 'contents' + * + * Copy a pointer to the 'n'th multidimensional index array to the location + * pointed to by 'index_arr' and return the length of the array. + * + * The face indices are contained in an array of type const size_t[][2] and + * must not be modified by the caller. The format of the second dimension is: + * {vertex_index, texture_coordinate_index} + * + * Return value + * The number of vertices that make up the 'n'th polygonal face + */ +size_t obj_polygonal_tv_face_vertices(obj_contents_t contents, size_t face, + const size_t (*index_arr[])[2]); + +/** + * Obtain the list of polygonal attributes for all oriented polygonal faces + * in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes desribing the + * polygonal attributes for the ith face. + * + * Return value + * The total number of oriented polygonal faces + */ +size_t obj_polygonal_nv_faces(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the normal and vertex indices for the 'n'th oriented polygonal face + * in 'contents' + * + * Copy a pointer to the 'n'th multidimensional index array to the location + * pointed to by 'index_arr' and return the length of the array. + * + * The face indices are contained in an array of type const size_t[][2] and + * must not be modified by the caller. The format of the second dimension is: + * {vertex_index, normal_index} + * + * Return value + * The number of vertices that make up the 'n'th polygonal face + */ +size_t obj_polygonal_nv_face_vertices(obj_contents_t contents, size_t face, + const size_t (*index_arr[])[2]); + +/** + * Obtain the list of polygonal attributes for all textured and oriented + * polygonal faces in 'contents' + * + * Copy a pointer to an index array to the location pointed to by attindex_arr + * and return the list length. + * + * The value of the ith element in 'attindex_arr' is the index into the + * 'attr_list' obtained from obj_polygonal_attributes desribing the + * polygonal attributes for the ith face. + * + * Return value + * The total number of textured oriented polygonal faces + */ +size_t obj_polygonal_tnv_faces(obj_contents_t contents, + const size_t (*attindex_arr[])); + +/** + * Obtain the texture cordinate, normal and vertex indices for the 'n'th + * textured and oriented polygonal face in 'contents' + * + * Copy a pointer to the 'n'th multidimensional index array to the location + * pointed to by 'index_arr' and return the length of the array. + * + * The face indices are contained in an array of type const size_t[][3] and + * must not be modified by the caller. The format of the second dimension is: + * {vertex_index, texture_coordinate_index, normal_index} + * + * Return value + * The number of vertices that make up the 'n'th polygonal face + */ +size_t obj_polygonal_tnv_face_vertices(obj_contents_t contents, size_t face, + const size_t (*index_arr[])[3]); + +#if defined(__cplusplus) +} +#endif + +#endif + +/* + * Local Variables: + * mode: C++ + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Deleted: brlcad/trunk/src/libgcv/wfobj/obj_parser.h.orig =================================================================== --- brlcad/trunk/src/libgcv/wfobj/obj_parser.h.orig 2011-08-10 14:04:10 UTC (rev 45899) +++ brlcad/trunk/src/libgcv/wfobj/obj_parser.h.orig 2011-08-10 14:50:49 UTC (rev 45900) @@ -1,775 +0,0 @@ -/* O B J _ P A R S E R . H - * BRL-CAD - * - * Copyright (c) 2010-2011 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ - -#ifndef OBJ_PARSER_H -#define OBJ_PARSER_H - -#include "common.h" -#include "vmath.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#undef YYSTYPE -#define YYSTYPE point_line_t - -#ifndef YY_STACK_USED -# define YY_STACK_USED 0 -#endif -#ifndef YY_STACK_UNUSED -# define YY_STACK_UNUSED 0 -#endif -#ifndef YY_ALWAYS_INTERACTIVE -# define YY_ALWAYS_INTERACTIVE 0 -#endif -#ifndef YY_NEVER_INTERACTIVE -# define YY_NEVER_INTERACTIVE 0 -#endif -#ifndef YY_MAIN -# define YY_MAIN 0 -#endif - -#include "./obj_grammar.h" - -/** - * A structure containing the contents of a parsed wavefront obj file - */ -typedef struct { - void *p; -} obj_contents_t; - -/** - * A structure with the attributes describing a polygonal element - * - * groupset_index - * An index into a set of group sets this element belongs to. - * See obj_groups and obj_groupsets - * - * object_index - * An index into a set of object labels that this element belongs to - * See obj_objects - * - * material_index - * An index into a set of materials that describes this element - * See obj_materials - * - * materiallibset_index - * An index into a set of material library sets this element uses - * See obj_materiallibs and obj_materiallibsets - * - * texmap_index - * An index into a set of texture maps that describes this element - * See obj_texmaps - * - * texmaplibset_index - * An index into a set of texture map library sets this element uses - * See obj_texmaplibs and obj_texmaplibsets - * - * shadow_obj_index - * An index into a set of shadow objects that this element uses - * See obj_shadow_objs - * - * trace_obj_index - * An index into a set of trace objects that this element uses - * See obj_trace_objs - * - * smooth_group - * A smoothing group id for this element - * N.B. unspecified in signess or default in wavefront obj spec, - * here unsigned and 0 - * - * bevel - * Whether this element bevel flag is off (zero) or on (non-zero), as per - * wavefront spec, default is off - * - * c_interp - * Whether color interpolation is off (zero) or on (non-zero), as per - * wavefront spec, default is off - * - * d_interp - * Whether dissolve interpolation is off (zero) or on (non-zero), as per - * wavefront spec, default is off - * - * lod - * The level of detail this element should be displayed as. This is a value - * between 0 (all elements) and 100. As per wavefront spec, default is 0. - */ -typedef struct { - size_t groupset_index; - size_t object_index; - size_t material_index; - size_t materiallibset_index; - size_t texmap_index; - size_t texmaplibset_index; - size_t shadow_obj_index; - size_t trace_obj_index; - unsigned int smooth_group; - unsigned char bevel; - unsigned char c_interp; - unsigned char d_interp; - unsigned char lod; -} obj_polygonal_attributes_t; - -/** - * Parse the obj file 'filename' with 'parser', create and place results into - * 'contents'. - * - * If the filename begins with the '/' character, then the file is - * understood to be an absolute path starting at the root directory. If the - * filename does not begin with a '/' character, the file is understood to - * be relative to the current working directory. In either case any additional - * relative file inclusion mechanism will be relative to the directory that - * holds the input file. - * - * After a successful call to obj_parse_file, you must eventually - * call obj_contents_destroy. - * - * If unable to successfully parse 'filename' a negative value will be - * returned and the reason can be obtained by obj_parse_error. - * - * Warnings or information about non-implemented features will return success - * and be reported via obj_parse_error. - * - * Return values: - * 0 - success - * ENOMEM - out of memory - * Any error code returned by fopen - * <0 - failure, see obj_parse_error - */ -int obj_file_parse(FILE *filename, obj_contents_t *contents); - -/** - * Parse the obj data pointed to by 'data', create and - * place results into 'contents'. - * - * After a successful call to obj_parse_file, you must eventually - * call obj_contents_destroy. - * - * If unable to successfully parse the data pointed to by 'data' a - * negative value will be returned and the reason can be obtained by - * obj_parse_error. - * - * Warnings or information about non-implemented features will return success - * and be reported via obj_parse_error. - * - * Return values: - * 0 - success - * ENOMEM - out of memory - * Any error code returned by fopen - * <0 - failure, see obj_parse_error - */ -int obj_parse(const char *data, obj_contents_t *contents); - -/** - * Return the reason the last attempt to parse a file failed or warnings - * generated during the parse. - * - * Return: - * 0 - The previous parse attempt succeeded and no warnings generated. - * !0 - A null terminated string containing information about the last parse - */ -const char * obj_parse_error(); - -/** - * Destroy the obj_contents_t object. - * - * Return values: - * 0 - success - */ -int obj_contents_destroy(obj_contents_t contents); - -/** - * Obtain a list of all vertices contained in 'contents'. - * - * Copy a pointer to a multidimensional array of vertices contained in - * 'contents' to the location pointed to by val_arr and return its length. - * - * The vertices are contained in an array of type const float[][4] and must - * not be modified by the caller. The format of the second dimension is: - * {x y z w} where w is 1.0 by default. - * - * Return value: - * The length of the vertex list - */ -size_t obj_vertices(obj_contents_t contents, const float (*val_arr[])[4]); - -/** - * Obtain a list of all texture vertices contained in 'contents'. - * - * Copy a pointer to a multidimensional array of texture vertices contained in - * 'contents' to the location pointed to by val_arr and return its length. - * - * The vertices are contained in an array of type const float[][3] and must - * not be modified by the caller. The format of the second dimension is: - * {u v w} where v and w 0 by default. - * - * Return value: - * The length of the texture vertex list - */ -size_t obj_texture_coord(obj_contents_t contents, const float (*val_arr[])[3]); - -/** - * Obtain a list of all normals contained in 'contents'. - * - * Copy a pointer to a multidimensional array of normals contained in - * 'contents' to the location pointed to by val_arr and return its length. - * - * The normals are contained in an array of type const float[][3] and must - * not be modified by the caller. The format of the second dimension is: - * {i j j}. - * - * Return value: - * The length of the normal list - */ -size_t obj_normals(obj_contents_t contents, const float (*val_arr[])[3]); - -/** - * Obtain a unique set of all group names contained in 'contents' - * - * Copy a pointer to a null terminated character sequence array of group names - * contained in 'contents' to the location pointed to by val_arr and return - * its length. - * - * Group names are guaranteed to be a unique set. - * - * If an element has not been explicitly tagged as being part of a particular - * group, per the wavefront obj spec, the element is placed in the "default" - * group. - * - * Return value: - * The length of the group name list. - */ -size_t obj_groups(obj_contents_t contents, const char * const (*val_arr[])); - -/** - * Return the number of group sets contained in 'contents' - * - * Return value: - * The number of group sets - */ -size_t obj_num_groupsets(obj_contents_t contents); - -/** - * Obtain the 'n'th group set contained in 'contents' - * - * Copy a pointer to an index set of group indices for the 'n'th set - * contained in 'contents' to the location pointed to by val_arr and return - * its length. - * - * Group sets are guaranteed to be a unique set. - * - * When an element references a groupset index of 'n', calling obj_groupset - * with the 'n'th set will obtain a unique set of indices that can be used - * to obtain the group name. - * - * Return value: - * The length of the group set. - */ -size_t obj_groupset(obj_contents_t contents, size_t n, - const size_t (*index_arr[])); - -/** - * Obtain a unique set of all object names contained in 'contents' - * - * Copy a pointer to a null terminated character sequence array of object - * names contained in 'contents' to the location pointed to by val_arr and - * return its length. - * - * Object names are guaranteed to be a unique set. - * - * The wavefront obj spec does not specify the default behavior for elements - * not explicitly being defined as being a part of an object. Therefore, - * for this implementation, if an element has not been explicitly tagged as - * being part of a particular object, the element shall have the "" object - * tag. - * - * N.B. As it is impossible as per the wavefront obj spec to set a particular - * object name to the empty string, the "" tag is unique to elements that - * have not had the object explicitly set. - * - * Return value: - * The length of the object name list. - */ -size_t obj_objects(obj_contents_t contents, const char * const (*val_arr[])); - -/** - * Obtain a unique set of all material names contained in 'contents' - * - * Copy a pointer to a null terminated character sequence array of material - * names contained in 'contents' to the location pointed to by val_arr and - * return its length. - * - * Material names are guaranteed to be a unique set. - * - * The wavefront obj spec does not specify the default behavior for elements - * not explicitly being defined as having a material trait. Therefore, - * for this implementation, if an element has not been explicitly tagged as - * having a material trait, the element shall have the "" material trait tag. - * - * N.B. As it is impossible as per the wavefront obj spec to set a particular - * material name to the empty string, the "" tag is unique to elements that - * have not had the material trait explicitly set. - * - * Return value: - * The length of the material name list. - */ -size_t obj_materials(obj_contents_t contents, const char * const (*val_arr[])); - -/** - * Obtain a unique set of all material library names contained in 'contents' - * - * Copy a pointer to a null terminated character sequence array of material - * library names contained in 'contents' to the location pointed to by val_arr - * and return its length. - * - * Material library names are guaranteed to be a unique set. - * - * The wavefront obj spec does not specify the default behavior for elements - * not explicitly being defined as using a material library. Therefore, - * for this implementation, if an element has not been explicitly tagged as - * using a material library, the element shall have the "" material library - * tag. - * - * N.B. As it is impossible as per the wavefront obj spec to set a particular - * material library to the empty string, the "" tag is unique to elements that - * have not had the material library explicitly set. - * - * Return value: - * The length of the material library name list. - */ -size_t obj_materiallibs(obj_contents_t contents, - const char * const (*val_arr[])); - -/** - * Return the number of material library sets contained in 'contents' - * - * Return value: - * The number of material library sets - */ -size_t obj_num_materiallibsets(obj_contents_t contents); - -/** - * Obtain the 'n'th material libary set contained in 'contents' - * - * Copy a pointer to an index set of material library indices for the 'n'th - * set contained in 'contents' to the location pointed to by val_arr and - * return its length. - * - * Material library sets are guaranteed to be a unique set. - * - * When an element references a materiallibset index of 'n', calling - * obj_materiallibset with the 'n'th set will obtain a unique set of indices - * that can be used to obtain the material library name. - * - * Return value: - * The length of the material library set. - */ -size_t obj_materiallibset(obj_contents_t contents, size_t n, - const size_t (*index_arr[])); - -/** - * Obtain a unique set of all texture map names... [truncated message content] |