From: Dave J. <dav...@go...> - 2010-05-10 12:39:29
|
On 10 May 2010 16:29, John A. Stewart <ale...@cr...> wrote: > Doug; once again you are 100% correct. You get the gold star! ;-) > > I'm going to add a bit to Doug's comments. > > >>> So, given I know that the node type of a node is 76, how do I find out >>> the names of all the fields for that type of node? > > There are some interesting tables and functions that are generated by the initial Perl code (run perl VRMLC.pm). > > All nodes have a node type. > > eg: > > struct X3D_Shape *myShape = (struct X3D_Shape *) createNewX3DNode(NODE_Shape); > > the "myShape->_nodeType" field will be the int equivalent of "NODE_Shape". > > The function "stringNodeType(myShape->_nodeType)" will return a pointer to a string, so you can use this in a printf ("%s",) type of call easily. > >> const int *NODE_OFFSETS[] = { >> OFFSETS_Anchor, <<<<< this is element [0] on line 5115 >> .... >> OFFSETS_Material, <<<<< this is element [76] on line 5115 + 76 = 5191 >> >> I do the go-to-definition trick on OFFSETS_Material and it takes me to generatedCode.c L3653 > > > Yes, so, if you wanted to see what the fields of your Shape node are, as Doug notes: > > int * fieldOffsetsPtr = (int *) NODE_OFFSETS[myShape->_nodeType]; > > >> const int OFFSETS_Material[] = { >> (int) FIELDNAMES_transparency, (int) offsetof (struct X3D_Material, transparency), (int) FIELDTYPE_SFFloat, (int) KW_inputOutput, (int) (SPEC_VRML | SPEC_X3D30 | SPEC_X3D31 | SPEC_X3D32 | SPEC_X3D33), >> ... >> -1, -1, -1, -1, -1}; >> >> It appears to be a table of field names for Material. The -1,-1,-1,-1,-1 is obviously a sentinal value so if you are looping through fields you know when you're done. > > > Ok - the info for each field is grouped into groups of 5 integers. You know when you are at the end of the fields for that node when you hit the -1, or, for readability, the macro "INT_ID_UNDEFINED" > > Some fields are for internal use only, these field names will start off with an underscore. I'll go through a field here for the Shape node. > > >From generated code.c: > > const int OFFSETS_Shape[] = { > ... > (int) FIELDNAMES_appearance, > - this is the shape "Appearance" field... > > (int) offsetof (struct X3D_Shape, appearance), > - offset in the structure of this field; offset is in bytes; > > (int) FIELDTYPE_SFNode, > - this is the type of the node; other types might be FIELDTYPE_SFInt32, etc. > > (int) KW_inputOutput, > - for routing, can we send and/or receive events to this node??? > > (int) (SPEC_VRML | SPEC_X3D30 | SPEC_X3D31 | SPEC_X3D32 | SPEC_X3D33), > - if we are interested in checking, we can see if this field exists in a specific level of X3D. > .... > > > >> That's what the makeFIELDDEFret() appears to be doing. >> >> /* now go through and get the name, type, keyword */ >> np = NODE_OFFSETS[boxptr->_nodeType]; >> while (*np != -1) { >> if (strcmp (FIELDNAMES[*np],"_") != 0) { >> sprintf (myline,"%s %c %s ",stringFieldType(np[0]), (char) mapFieldTypeToEAItype(np[2]), >> stringKeywordType(np[3])); >> strcat (buf, myline); >> } >> np += 5; >> } >> > > Absolutely correct method of accessing. Note that the strcmp in the above while loop gets rid of the internal-only fields, as mentioned briefly above. > > If you change the "sprintf(myLine," to a "printf(", you'll get the fields of the node printed out, much like you'll see in the VRML/X3D spec. OK, a crude patch to replace boxptr = X3D_NODE(myptr); with boxptr = getEAINodeFromTable(myptr,-1); in makeFIELDDEFret produces: (line breaks inserted for clarity) ........ 56 13 transparency d inputOutput specularColor c inputOutput shininess d inputOutput diffuseColor c inputOutput ambientIntensity d inputOutput _scol P inputOutput _dcol P inputOutput _ecol P inputOutput emissiveColor c inputOutput metadata h inputOutput _amb P inputOutput __oldmetadata h inputOutput _shin d inputOutput I suspect this needs a bit of a cleanup to deliver what (in theory) the SAI wants, according to the Java code in the other mail thread, but I will look at this in more detail. I think Java wants 7 transparency specularColor shininess diffuseColor ambientIntensity emissiveColor metadata (Unsure about metadata) Dave |