OpenSubdiv::OsdGLPtexTexture *
OpenSubdivPtexShader::loadPtex(const MString &filename) 
{
    if (filename.length()) {
        printf("Load ptex %s\n", filename.asChar());
        Ptex::String ptexError;
        PtexTexture *ptex = PtexTexture::open(filename.asChar(),
                                              ptexError, true);
        if (ptex) {
            // create osdptex
            OpenSubdiv::OsdGLPtexTexture *osdptex =
                OpenSubdiv::OsdGLPtexTexture::Create(ptex, 0,
                                                     /*gutterWidth=*/1,
                                                     /*pageMargin=*/8);
            ptex->release();
            return osdptex;
        }
        printf("Load ptex failed on file: \"%s\"\n", filename.asChar());
    }
    return NULL;
}
Beispiel #2
0
void IBLWidget::loadIBL( const char* filename )
{
    printf( "opening %s... ", filename );

    // try and load it
    Ptex::String error;
    PtexTexture* tx = PtexTexture::open(filename, error);
    if (!tx) {
        printf( "failed\n");
        return;
    }

    CKGL();

    Ptex::DataType dataType = tx->dataType();
    int numChannels = tx->numChannels();
    int numFaces=tx->numFaces();
    int faceWidth=0, faceHeight=0;

    if( dataType != Ptex::dt_float || numChannels != 3 || numFaces != 6 )
    {
        printf( "not the right kind\n" );
        return;
    }

    for( int i = 0; i < numFaces; i++ )
    {
        int face = i;


        Ptex::Res res = tx->getFaceInfo(i).res;
        if( i == 0 )
        {
            faceWidth = res.u();
            faceHeight = res.v();

            // printf( "size: %dx%d    (%dx%d)\n", faceWidth, faceHeight, faceWidth*6, faceHeight );

            envTex.create( faceWidth*6, faceHeight );
        }

        if( faceWidth != res.u() || faceHeight != res.v() )
        {
            printf( "error loading ptex file\n" );
            return;
        }

        float* faceData = (float*)malloc( faceWidth*faceHeight*numChannels*sizeof(float) );
        tx->getData( i, faceData, 0 );

        // copy the data into the envmap texture
        for( int j = 0; j < faceHeight * faceWidth; j++ )
        {
            color3 c( faceData[j*3+0], faceData[j*3+1], faceData[j*3+2] );
            envTex.setPixel( faceWidth*face + j % faceWidth, j / faceWidth, c );
        }

        free( faceData );

    }
    tx->release();
    printf( "success\n");

    // allocate texture names (if we haven't before)
    if( envTexID == 0 ) {
        glf->glGenTextures( 1, &envTexID );
        glf->glGenTextures( 1, &probTexID );
        glf->glGenTextures( 1, &marginalProbTexID );
    }

    CKGL();

    // now that the envmap tex is loaded, compute the sampling data
    computeEnvMapSamplingData();
    createGLSamplingTextures();

    CKGL();

    glf->glGenTextures(1, &envTexID);
    glf->glBindTexture( GL_TEXTURE_CUBE_MAP, envTexID );
    glf->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);


    BitmapContainer<color3> flip;
    flip.create(envTex.w, envTex.h);//get face flipped to match GL thinking!
    for (int y=0; y < envTex.h; y++){
        color3* in = &envTex.data[y*envTex.w];
        color3* out = &flip.data[(envTex.h-y-1)*envTex.w];
        for (int x=0; x < envTex.w; x++)
            out[x] = in[x];
    }

    BitmapContainer<color3> tmp;
    tmp.create(envTex.h, envTex.h);

    CKGL();

    for (int y=0; y < tmp.h; y++)
        for (int x=0; x < tmp.w; x++)
            tmp.setPixel(x, y,flip.getPixel(x+tmp.w*0, y));
    glf->glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X , 0,GL_R11F_G11F_B10F, tmp.w, tmp.h, 0, GL_RGB, GL_FLOAT, tmp.getPtr() );


    for (int y=0; y < tmp.h; y++)
        for (int x=0; x < tmp.w; x++)
            tmp.setPixel(x, y,flip.getPixel(x+tmp.w*1, y));
    glf->glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_X , 0,GL_R11F_G11F_B10F, tmp.w, tmp.h, 0, GL_RGB, GL_FLOAT, tmp.getPtr() );

    for (int y=0; y < tmp.h; y++)
        for (int x=0; x < tmp.w; x++)
            tmp.setPixel(x, y,flip.getPixel(x+tmp.w*2, y));
    glf->glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Y , 0,GL_R11F_G11F_B10F, tmp.w, tmp.h, 0, GL_RGB, GL_FLOAT, tmp.getPtr() );

    for (int y=0; y < tmp.h; y++)
        for (int x=0; x < tmp.w; x++)
            tmp.setPixel(x, y,flip.getPixel(x+tmp.w*3, y));
    glf->glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Y , 0,GL_R11F_G11F_B10F, tmp.w, tmp.h, 0, GL_RGB, GL_FLOAT, tmp.getPtr() );

    for (int y=0; y < tmp.h; y++)
        for (int x=0; x < tmp.w; x++)
            tmp.setPixel(x, y,flip.getPixel(x+tmp.w*4, y));
    glf->glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Z , 0,GL_R11F_G11F_B10F, tmp.w, tmp.h, 0, GL_RGB, GL_FLOAT, tmp.getPtr() );


    CKGL();

    for (int y=0; y < tmp.h; y++)
        for (int x=0; x < tmp.w; x++)
            tmp.setPixel(x, y,flip.getPixel(x+tmp.w*5, y));
    glf->glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z , 0,GL_R11F_G11F_B10F, tmp.w, tmp.h, 0, GL_RGB, GL_FLOAT, tmp.getPtr() );

    CKGL();

    glf->glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
    glf->glBindTexture( GL_TEXTURE_CUBE_MAP, 0 );

    CKGL();
}
Beispiel #3
0
//------------------------------------------------------------------------------
void
createOsdMesh(int level, int kernel) {

    Ptex::String ptexError;
    PtexTexture *ptexColor = PtexTexture::open(g_ptexColorFile, ptexError, true);

    // generate Hbr representation from ptex
    OpenSubdiv::OsdHbrMesh * hmesh = createPTexGeo<OpenSubdiv::OsdVertex>(ptexColor);
    if(hmesh == NULL) return;

    g_normals.resize(g_positions.size(),0.0f);
    calcNormals( hmesh, g_positions, g_normals );

    // generate Osd mesh from Hbr mesh
    if (g_osdmesh) delete g_osdmesh;
    g_osdmesh = new OpenSubdiv::OsdMesh();
    g_osdmesh->Create(hmesh, level, kernel);
    if (g_vertexBuffer) {
        delete g_vertexBuffer;
        g_vertexBuffer = NULL;
    }

    // Hbr mesh can be deleted
    delete hmesh;

    // generate oOsdPTexture
    if (g_osdPTexDisplacement) delete g_osdPTexDisplacement;
    if (g_osdPTexOcclusion) delete g_osdPTexOcclusion;
    g_osdPTexDisplacement = NULL;
    g_osdPTexOcclusion = NULL;

    OpenSubdiv::OsdPTexture::SetGutterWidth(g_gutterWidth);
    OpenSubdiv::OsdPTexture::SetPageMargin(g_gutterWidth*8);
    OpenSubdiv::OsdPTexture::SetGutterDebug(g_gutterDebug);

    if (g_osdPTexImage) delete g_osdPTexImage;
    g_osdPTexImage = OpenSubdiv::OsdPTexture::Create(ptexColor, 0 /*targetmemory*/);
    ptexColor->release();

    if (g_ptexDisplacementFile) {
        PtexTexture *ptexDisplacement = PtexTexture::open(g_ptexDisplacementFile, ptexError, true);
        g_osdPTexDisplacement = OpenSubdiv::OsdPTexture::Create(ptexDisplacement, 0);
        ptexDisplacement->release();
    }
    if (g_ptexOcclusionFile) {
        PtexTexture *ptexOcclusion = PtexTexture::open(g_ptexOcclusionFile, ptexError, true);
        g_osdPTexOcclusion = OpenSubdiv::OsdPTexture::Create(ptexOcclusion, 0);
        ptexOcclusion->release();
    }

    // create element array buffer
    if (g_elementArrayBuffer) delete g_elementArrayBuffer;
    g_elementArrayBuffer = g_osdmesh->CreateElementArrayBuffer(level);

    // create ptex coordinates buffer
    if (g_ptexCoordinatesTextureBuffer) delete g_ptexCoordinatesTextureBuffer;
    g_ptexCoordinatesTextureBuffer = g_osdmesh->CreatePtexCoordinatesTextureBuffer(level);
    
    updateGeom();

    linkProgram();
    linkDebugProgram();
}
Beispiel #4
0
//------------------------------------------------------------------------------
void
createOsdMesh(int level, int kernel) {

    Ptex::String ptexError;
    PtexTexture *ptexColor = PtexTexture::open(g_ptexColorFile, ptexError, true);

    // generate Hbr representation from ptex
    OpenSubdiv::OsdHbrMesh * hmesh = createPTexGeo<OpenSubdiv::OsdVertex>(ptexColor);
    if(hmesh == NULL) return;

    g_normals.resize(g_positions.size(),0.0f);
    calcNormals( hmesh, g_positions, g_normals );

    // generate Osd mesh from Hbr mesh
    if (g_osdmesh) delete g_osdmesh;
    g_osdmesh = new OpenSubdiv::OsdMesh();
    g_osdmesh->Create(hmesh, level, kernel);
    if (g_vertexBuffer) {
        delete g_vertexBuffer;
        g_vertexBuffer = NULL;
    }

    // Hbr mesh can be deleted
    delete hmesh;

    // update element array buffer
    const std::vector<int> &indices = g_osdmesh->GetFarMesh()->GetFaceVertices(level);

    // generate oOsdPTexture
    if (g_osdPTexDisplacement) delete g_osdPTexDisplacement;
    if (g_osdPTexOcclusion) delete g_osdPTexOcclusion;
    g_osdPTexDisplacement = NULL;
    g_osdPTexOcclusion = NULL;

    OpenSubdiv::OsdPTexture::SetGutterWidth(g_gutterWidth);
    OpenSubdiv::OsdPTexture::SetPageMargin(g_gutterWidth*8);
    OpenSubdiv::OsdPTexture::SetGutterDebug(g_gutterDebug);

    if (g_osdPTexImage) delete g_osdPTexImage;
    g_osdPTexImage = OpenSubdiv::OsdPTexture::Create(ptexColor, 0 /*targetmemory*/);
    ptexColor->release();

    if (g_ptexDisplacementFile) {
        PtexTexture *ptexDisplacement = PtexTexture::open(g_ptexDisplacementFile, ptexError, true);
        g_osdPTexDisplacement = OpenSubdiv::OsdPTexture::Create(ptexDisplacement, 0);
        ptexDisplacement->release();
    }
    if (g_ptexOcclusionFile) {
        PtexTexture *ptexOcclusion = PtexTexture::open(g_ptexOcclusionFile, ptexError, true);
        g_osdPTexOcclusion = OpenSubdiv::OsdPTexture::Create(ptexOcclusion, 0);
        ptexOcclusion->release();
    }

    // bind index buffer
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_indexBuffer);

    g_numIndices = (int)indices.size();
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*g_numIndices, &(indices[0]), GL_STATIC_DRAW);

    updateGeom();

    linkProgram();
    linkDebugProgram();
}