35 #define FGETS(buf, len, file) gzgets(file, buf, len) 36 #define FGETC(file) gzgetc(file) 37 #define FOPEN(path, mode) gzopen(path, mode) 38 #define FCLOSE(fd) gzclose(fd) 66 static sgVec3 *
vtab = NULL ;
67 static sgVec3 *
ntab = NULL ;
97 #define NOTEXTURE "empty_texture_no_mapping" 98 #define MAX_MATERIALS 1000 108 static int do_name (
char *s ) ;
109 static int do_data (
char *s ) ;
113 static int do_rot (
char *s ) ;
114 static int do_loc (
char *s ) ;
115 static int do_url (
char *s ) ;
118 static int do_surf (
char *s ) ;
119 static int do_mat (
char *s ) ;
120 static int do_refs (
char *s ) ;
121 static int do_kids (
char *s ) ;
140 while ( **s ==
' ' || **s ==
'\t' )
155 while ( *t !=
'\0' && *t !=
'\"' )
159 ulSetError ( UL_WARNING,
"ac_to_gl: Mismatched double-quote ('\"') in '%900s'", *s ) ;
164 ulSetError ( UL_WARNING,
"ac_to_gl: Expected double-quote ('\"') in '%900s'", *s ) ;
173 for (
int i = 0 ; tags[i].
token != NULL ; i++ )
174 if ( ulStrNEqual ( tags[i].token, s, strlen(tags[i].token) ) )
176 s += strlen ( tags[i].token ) ;
180 return (*(tags[i].func))( s ) ;
183 ulSetError ( UL_WARNING,
"ac_to_gl: Unrecognised token '%900s' (%d)", s , strlen(s)) ;
250 #ifdef EEE_PAS_COMPRIS 251 #warning: HELLO --------------------- 263 st -> setMaterial ( GL_SPECULAR, mat -> spec ) ;
264 st -> setMaterial ( GL_EMISSION, mat -> emis ) ;
265 st -> setMaterial ( GL_AMBIENT_AND_DIFFUSE, mat -> amb ) ;
266 st -> setShininess ( mat -> shi ) ;
268 st -> enable ( GL_COLOR_MATERIAL ) ;
269 st -> setColourMaterial ( GL_AMBIENT_AND_DIFFUSE ) ;
271 st -> enable ( GL_LIGHTING ) ;
273 st -> setShadeModel ( GL_SMOOTH ) ;
276 st -> setAlphaClamp(0);
279 st -> enable ( GL_BLEND );
280 st -> setTranslucent () ;
282 st -> enable ( GL_BLEND );
284 }
else if ( mat -> rgb[3] < 0.99 ) {
285 st -> enable ( GL_ALPHA_TEST ) ;
286 st -> enable ( GL_BLEND ) ;
287 st -> setTranslucent () ;
289 st -> disable ( GL_BLEND ) ;
295 st -> enable( GL_TEXTURE_2D ) ;
299 st->setAlphaClamp(0.65f);
300 st -> enable ( GL_ALPHA_TEST ) ;
301 st -> enable ( GL_BLEND );
304 st -> disable ( GL_BLEND ) ;
305 st -> disable( GL_TEXTURE_2D ) ;
317 st->disable(GL_BLEND);
322 st->enable(GL_TEXTURE_2D) ;
324 st->enable(GL_BLEND);
325 st->setAlphaClamp(0.7f);
326 st->enable(GL_ALPHA_TEST);
329 st->disable(GL_BLEND);
330 st->disable(GL_TEXTURE_2D);
347 "%1023s rgb %f %f %f amb %f %f %f emis %f %f %f spec %f %f %f shi %d trans %f",
349 &rgb [0], &rgb [1], &rgb [2],
350 &amb [0], &amb [1], &amb [2],
351 &emis[0], &emis[1], &emis[2],
352 &spec[0], &spec[1], &spec[2],
358 ulSetError ( UL_WARNING,
"grloadac:do_material: Can't parse this MATERIAL:%900s", s ) ;
366 amb [ 3 ] = emis [ 3 ] = spec [ 3 ] = 1.0f ;
367 rgb [ 3 ] = 1.0f - trans ;
397 sgSetVec2(
texrep, 1.0f, 1.0f);
398 sgSetVec2(
texoff, 0.0f, 0.0f);
405 ssgBranch *current_branch_g = NULL;
412 current_branch_g->setCallback(SSG_CALLBACK_PREDRAW,
preScene);
417 ssgTransform *tr =
new ssgTransform () ;
430 for (
int i = 0 ; i < num_kids ; i++ ) {
449 if (!strncmp(s,
"WI", 2)) {
455 if (strstr(s,
"__TKMN"))
458 if (!strncmp(s,
"TKMN",4))
469 if (!strncmp(s,
"DR", 2)) {
481 int len = strtol ( s, NULL, 0 ) ;
485 for (
int i = 0 ; i < len ; i++ )
511 if ( s == NULL || s[0] ==
'\0' )
515 if ((
p=strstr(s,
" base"))!=NULL)
534 else if ((
p=strstr(s,
" tiled"))!=NULL)
552 else if ((
p=strstr(s,
" skids"))!=NULL)
568 else if ((
p=strstr(s,
" shad"))!=NULL)
607 if ( sscanf ( s,
"%f %f", &
texrep [ 0 ], &
texrep [ 1 ] ) != 2 )
608 ulSetError ( UL_WARNING,
"ac_to_gl: Illegal texrep record." ) ;
616 if ( sscanf ( s,
"%f %f", &
texoff [ 0 ], &
texoff [ 1 ] ) != 2 )
617 ulSetError ( UL_WARNING,
"ac_to_gl: Illegal texoff record." ) ;
628 if ( sscanf ( s,
"%f %f %f %f %f %f %f %f %f",
632 ulSetError ( UL_WARNING,
"ac_to_gl: Illegal rot record." ) ;
641 ulSetError ( UL_WARNING,
"ac_to_gl: Illegal loc record." ) ;
655 printf (
"/* URL: \"%s\" */\n", s ) ;
663 char buffer [ 1024 ] ;
665 nv = strtol ( s, NULL, 0 ) ;
676 vtab =
new sgVec3 [
nv ] ;
677 ntab =
new sgVec3 [
nv ] ;
695 for (
int i = 0 ; i <
nv ; i++ )
699 if ( sscanf ( buffer,
"%f %f %f %f %f %f",
703 if ( sscanf ( buffer,
"%f %f %f",
706 ulSetError ( UL_FATAL,
"ac_to_gl: Illegal vertex record." ) ;
712 float tmp =
ntab[i][1] ;
717 float tmp =
vtab[i][1] ;
738 int ns = strtol ( s, NULL, 0 ) ;
740 for (
int i = 0 ; i < ns ; i++ )
742 char buffer [ 1024 ] ;
755 char buffer [ 1024 ] ;
767 int mat = strtol ( s, NULL, 0 ) ;
778 int nrefs = strtol( s, NULL, 0 );
785 ssgVertexArray *vlist =
new ssgVertexArray(nrefs);
786 ssgTexCoordArray *tlist =
new ssgTexCoordArray (nrefs);
787 ssgTexCoordArray *tlist1 = NULL;
788 ssgTexCoordArray *tlist2 = NULL;
789 ssgTexCoordArray *tlist3 = NULL;
791 ssgNormalArray *nrm =
new ssgNormalArray(nrefs);
794 tlist1 =
new ssgTexCoordArray(nrefs);
797 tlist2 =
new ssgTexCoordArray(nrefs);
800 tlist3 =
new ssgTexCoordArray(nrefs);
803 for (
int i = 0; i < nrefs; i++) {
812 tn= sscanf ( buffer,
"%d %f %f %f %f %f %f %f %f", &vtx,
820 ulSetError ( UL_FATAL,
"ac_to_gl: Illegal ref record not enough text coord." ) ;
828 tlist -> add ( tc ) ;
832 t1tab[vtx][0]=tc1[0];
833 t1tab[vtx][1]=tc1[1];
835 t2tab[vtx][0]=tc2[0];
836 t2tab[vtx][1]=tc2[1];
838 t3tab[vtx][0]=tc3[0];
839 t3tab[vtx][1]=tc3[1];
851 vlist->add(
vtab[vtx]);
860 printf(
"use normal\n");
864 ssgColourArray *col =
new ssgColourArray(1);
872 sgSetVec3 (nm, 0.0f, 0.0f, 1.0f);
874 sgMakeNormal (nm, vlist->get(0), vlist->get(1), vlist->get(2));
881 if ( type >= 0 && type <= 4 ) {
882 GLenum gltype = GL_TRIANGLES ;
885 case 0 : gltype = GL_TRIANGLE_FAN ;
887 case 1 : gltype = GL_LINE_LOOP ;
889 case 2 : gltype = GL_LINE_STRIP ;
891 case 4 : gltype = GL_TRIANGLE_STRIP ;
899 ssgVertexArray *vlinelist =
new ssgVertexArray(
nv*2);
900 for (i = 0; i <
nv; i++) {
902 tv[0] =
ntab[i][0]*0.2 +
vtab[i][0];
903 tv[1] =
ntab[i][1]*0.2 +
vtab[i][1];
904 tv[2] =
ntab[i][2]*0.2 +
vtab[i][2];
905 vlinelist->add(
vtab[i]);
908 ssgVtxTable *vline =
new ssgVtxTable(GL_LINES, vlinelist, NULL, NULL, NULL);
928 #define VTXARRAY_GUIONS 929 #ifdef VTXARRAY_GUIONS 973 #ifdef VTXARRAY_GUIONS 996 if (col->getRef() == 0) {
1006 #ifdef VTXARRAY_GUIONS 1008 ssgVertexArray *vlist =
new ssgVertexArray(
totalnv);
1009 ssgNormalArray *nrm =
new ssgNormalArray(
totalnv);
1010 ssgTexCoordArray *tlist0 =
new ssgTexCoordArray(
totalnv);
1011 ssgTexCoordArray *tlist1 = NULL;
1012 ssgTexCoordArray *tlist2 = NULL;
1013 ssgTexCoordArray *tlist3 = NULL;
1015 tlist1 =
new ssgTexCoordArray(
totalnv);
1017 tlist2 =
new ssgTexCoordArray(
totalnv);
1019 tlist3 =
new ssgTexCoordArray(
totalnv);
1020 for (
int i = 0; i <
totalnv; i++) {
1021 tlist0 -> add (
t0tab[i] ) ;
1023 tlist1 -> add (
t1tab[i] ) ;
1025 tlist2 -> add (
t2tab[i] ) ;
1027 tlist3 -> add (
t3tab[i] ) ;
1028 vlist -> add (
vtab[i] ) ;
1030 nrm -> add (
ntab[i] ) ;
1034 ssgColourArray *col =
new ssgColourArray ( 1 ) ;
1038 GLenum gltype = GL_TRIANGLE_STRIP ;
1063 tlist0,tlist1,tlist2,tlist3,
1094 if ( obj -> isAKindOf ( ssgTypeBranch() ) )
1096 ssgBranch *br = (ssgBranch *) obj ;
1098 if (!strnicmp(br->getKid(0)->getName(),
"tkmn",4))
1100 if (!strncasecmp(br->getKid(0)->getName(),
"tkmn",4))
1103 ssgFlatten(br->getKid(0));
1107 for (
int i = 0 ; i < br -> getNumKids () ; i++ )
1108 ssgFlatten( br -> getKid ( i ) );
1126 GfOut(
"CarLoadAC3D loading %s\n", fname);
1135 ssgBranch *model =
new ssgBranch () ;
1136 model -> addKid ( obj ) ;
1140 ssgFlatten ( obj ) ;
1141 ssgStripify ( model ) ;
1160 GfOut(
"LoadAC3D loading %s\n", fname);
1170 ssgBranch *model =
new ssgBranch () ;
1171 model -> addKid ( obj ) ;
1174 ssgFlatten ( obj ) ;
1175 ssgStripify ( model ) ;
1196 ssgSetCurrentOptions ( (ssgLoaderOptions*)
options ) ;
1199 char filename [ 1024 ] ;
1210 sgSetVec2 (
texrep, 1.0, 1.0 ) ;
1211 sgSetVec2 (
texoff, 0.0, 0.0 ) ;
1217 ulSetError ( UL_WARNING,
"ssgLoadAC: Failed to open '%900s' for reading", filename ) ;
1221 char buffer [ 1024 ] ;
1222 int firsttime = TRUE ;
1237 if ( *s <
' ' && *s !=
'\t' ) continue ;
1238 if ( *s ==
'#' || *s ==
';' ) continue ;
1244 if ( ! ulStrNEqual ( s,
"AC3D", 4 ) )
1247 ulSetError ( UL_WARNING,
"ssgLoadAC: '%900s' is not in AC3D format.", filename ) ;
static ssgState * get_state_ext(char *name)
static _ssgMaterial * current_material
static int do_surf(char *s)
static ssgLoaderOptionsEx options
static void skip_quotes(char **s)
static _ssgMaterial * mlist[MAX_MATERIALS]
static int do_data(char *s)
static int do_obj_poly(char *s)
#define FGETS(buf, len, file)
static char * current_tshad
static int do_rot(char *s)
static char * current_data
static int do_name(char *s)
static int do_texoff(char *s)
static sgVec4 * current_colour
static char * current_tfname
static ssgLoaderOptions * current_options
static char * current_tbase
#define FOPEN(path, mode)
static char * current_tskids
static ssgBranch * current_branch
static ssgState * get_state(_ssgMaterial *mat)
static int do_object(char *s)
static ssgIndexArray * striplist
grManagedState * grStateFactory(void)
static int do_url(char *s)
ssgEntity * grssgCarLoadAC3D(const char *fname, const ssgLoaderOptions *options, int index)
static int do_refs(char *s)
static int do_obj_group(char *s)
static ssgIndexArray * vertlist
static int do_texture(char *s)
static int do_numvert(char *s)
static int do_loc(char *s)
static char * current_ttiled
static int do_obj_world(char *s)
static int do_mat(char *s)
virtual void setTexture(ssgTexture *tex)
static sgMat4 current_matrix
static int do_kids(char *s)
static sgVec4 * clist[MAX_MATERIALS]
int preScene(ssgEntity *e)
static int do_obj_light(char *s)
static ssgEntity * myssgLoadAC(const char *fname, const ssgLoaderOptions *options)
static Tag obj_type_tags[]
void myssgFlatten(ssgEntity *obj)
static int do_texrep(char *s)
ssgEntity * grssgLoadAC3D(const char *fname, const ssgLoaderOptions *options)
static int do_numsurf(char *s)
static void skip_spaces(char **s)
static int search(Tag *tags, char *s)
static Tag surface_tags[]
static int do_material(char *s)