示例#1
0
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;
}