void *trpgr_ChildRefCB::Parse(trpgToken tok, trpgReadBuffer& rbuf) { // It should be a tile ref token, if not then something is wrong if(tok == TRPG_CHILDREF) { childList.push_back(trpgChildRef()); trpgChildRef &childRef = childList.back(); if(childRef.Read(rbuf)) return &childRef; else return 0; } else return 0; }
/* Read Helper parse method sets up the correct class depending on the token and asks it to read and print itself. It will save any child ref node encountered that a user can access to continue traversal. */ void *trpgPrintGraphParser::ReadHelper::Parse(trpgToken tok,trpgReadBuffer &buf) { // This will celar any child ref list from a previous parse. trpgReadWriteable *obj = NULL; trpgTileHeader *tileHead = NULL; switch (tok) { case TRPG_GEOMETRY: obj = new trpgGeometry(); break; case TRPG_GROUP: obj = new trpgGroup(); break; case TRPG_ATTACH: obj = new trpgAttach(); break; case TRPG_CHILDREF: childRefList.push_back(trpgChildRef()); obj = &childRefList.back(); break; case TRPG_BILLBOARD: obj = new trpgBillboard(); break; case TRPG_LOD: obj = new trpgLod(); break; case TRPG_TRANSFORM: obj = new trpgTransform(); break; case TRPG_MODELREF: obj = new trpgModelRef(); break; case TRPG_LAYER: obj = new trpgLayer(); break; case TRPG_LIGHT: obj = new trpgLight(); break; case TRPG_LABEL: obj = new trpgLabel(); break; case TRPGTILEHEADER: obj = tileHead = new trpgTileHeader(); break; }; if (obj) { if (obj->Read(buf)) obj->Print(*pBuf); // For the tile header, do a little more work if (tok == TRPGTILEHEADER) { int numMat; tileHead->GetNumLocalMaterial(numMat); for (int i=0;i<numMat;i++) { trpgLocalMaterial locMat; tileHead->GetLocalMaterial(i,locMat); const trpgMaterial *baseMat; const trpgTexture *baseTex; int totSize; trpgrImageHelper *imageHelp = parse->GetImageHelp(); int numImages=1; locMat.GetNumLocals(numImages); for (int imgN=0;imgN<numImages;imgN++) { // read all the images for each local material imageHelp->GetNthImageInfoForLocalMat(&locMat,imgN,&baseMat,&baseTex,totSize); // Fetch the whole image { char *pixels = new char[totSize]; bool failed = false; try { failed = !imageHelp->GetNthImageForLocalMat(&locMat,imgN,pixels,totSize); } catch (...) { failed = true; } if (failed) { fprintf(stderr,"Failed to read local image %d from local material %d.\n",imgN,i); } else fprintf(stderr,"Read local image %d from local material %d successfully.\n",imgN,i); delete [] pixels; } // Fetch the individual mipmap levels { bool hasMipmap = false; baseTex->GetIsMipmap(hasMipmap); int numMipmap = hasMipmap ? baseTex->CalcNumMipmaps() : 0; for (int j=1;j<numMipmap;j++) { //int mipOffset = (const_cast<trpgTexture *>(baseTex))->MipLevelOffset(j); int mipSize = (const_cast<trpgTexture *>(baseTex))->MipLevelSize(j); if (mipSize) { char *pixels = new char[mipSize]; bool failed = false; try { failed = !imageHelp->GetNthImageMipLevelForLocalMat(j,&locMat,imgN,pixels,mipSize); } catch (...) { failed = true; } if (failed) fprintf(stderr,"Failed to read mipmap level %d for local image %d from local material %d.\n",j,imgN,i); else fprintf(stderr,"Read mipmap level %d for local image %d from local material %d.\n",j,imgN,i); delete [] pixels; } } } } } } // We delete all object except the child ref node if(tok != TRPG_CHILDREF) delete obj; } // Need to return non-zero. Otherwise it's interpreted as an error return (void *)1; }