Re: Re: Re: [info-performer] pfVolume and lookup table

Date view Thread view Subject view Author view

From: Simone Herrmann (sim_her++at++web.de)
Date: 06/10/2003 03:17:24


Here the code. The class Volume is derived from pfVolume. It works in a Volumizer apllication. I even wrote the printLookupTable function for debugging and it prints the right table. There are no error messages on the console.

#include "Volume.h"

Volume::Volume()
{
}

Volume::~Volume()
{
}

void
Volume::loadLutFile(const char* lutName)
{
    vzParameterLookupTable* table = loadLookupTable(lutName);
    if(table == NULL)table = initLookupTable();
    getShape()->getAppearance()->setParameter("lookup_table", table);

        vzTMLUTShader *shader = new vzTMLUTShader();
        getShape()->getAppearance()->setShader(shader);
}

vzParameterLookupTable*
Volume::initLookupTable()
{
        vzParameterLookupTable* table;

           float* data = new float[2*256];
        for (int i = 0; i < 256; i++) {
                    const float value = (float) i / (256 - 1);
            data[i * 2 + 0] = value; // luminance
            data[i * 2 + 1] = value; // alpha
    }
        table = new vzParameterLookupTable(256, data, VZ_FLOAT, VZ_LUMINANCE_ALPHA);
        table->addDeletionCallback(cleanupLookupTable, data);
          
    return table;
}

vzParameterLookupTable*
Volume::loadLookupTable(const char* filename)
{
        float* data;
        int width, tuple, size;
        vzTextureType dataType;
        vzExternalTextureFormat formatType;
    vzParameterLookupTable* table;

           ifstream stream(filename);

           if (!stream) {
               cerr
        << "UserInterface::loadLutFromFile: Could not read data from lut file "
                << filename
        << endl;
               return NULL;
           }

        // Buffer to read stream tokens
        char buf[1024];

        stream >> buf;
        width = atoi(buf);

        stream >> buf;
        tuple = atoi(buf);

        size = width*tuple;

        stream >> buf;
        if(strcmp(buf,"float")==0)dataType = VZ_FLOAT;
        else if(strcmp(buf,"ubyte")==0)dataType = VZ_UNSIGNED_BYTE;
        else
        {
                cerr << "LUT error: data type in lut file not implemented" << endl;
                return NULL;
        }

        data = new float[size];
        for(int i=0; i<size; i++)
        {
                stream >> buf;
                data[i] = atof(buf);
        }

        if(tuple == 1) formatType = VZ_LUMINANCE;
        else if(tuple == 2) formatType = VZ_LUMINANCE_ALPHA;
        else if(tuple == 4) formatType = VZ_RGBA;
        else
        {
                cerr << "LUT error: wrong size of tuples in lut file" << endl;
                delete(data);
                return NULL;
        }

        table = new vzParameterLookupTable(width, data, dataType, formatType);
 
        table->addDeletionCallback(cleanupLookupTable, data);
        return table;
}

void
Volume::printLookupTable(const char* filename)
{
        vzParameterLookupTable* testTable = (vzParameterLookupTable*) getShape()->getAppearance()->getParameter("lookup_table");

        static int h=0;
        int i,width;

        if(h==0){
                h=1;
                ofstream ostream(filename);
                float* test = (float*)testTable->getDataPtr();
                width = testTable->getWidth();
                ostream << width << endl;
                for(i=0; i<width; i++)
                {
                        for(int j=0; j<4; j++)ostream << test[(4*i)+j];
                        ostream << endl;
                }
        }
}

void
Volume::cleanupLookupTable(vzObject * /* object */, void *data)
{
    delete [] data;
}

Praveen Bhaniramka <praveenb++at++mrcoffee.engr.sgi.com> schrieb am 10.06.03 11:26:40:
>
> Hi Simone,
>
> Did you define the parameter "lookup_table" appropriately for the shape's
> appearance? You will still need to do the LUT initialization and other
> stuff that you had mentioned in your code snippet! Do you get any errors
> printed on the console?
>
> - Praveen
>
> On Tue, 10 Jun 2003, Simone Herrmann wrote:
>
> > Hi Praveen,
> >
> > I tried this and now my volume volume is not visible any more.
> > What happened?
> >
> > Praveen Bhaniramka <praveenb++at++mrcoffee.engr.sgi.com> schrieb am 09.06.03 18:44:52:
> > >
> > > Hi Simone,
> > >
> > > The various parameters attached to the shape's appearance are used by the
> > > shader, which uses them to do the actual shading (in your case applying a
> > > lookup table). So, adding new parameters will only have any effect if the
> > > corresponding shader _uses_ these parameters.
> > >
> > > In short, update the shader for the shape's appearance to use the
> > > TMLUTShader, which would then apply the lookup table.
> > >
> > > vzTMLUTShader *newShader = new vzTMLUTShader();
> > > vol->getShape()->getAppearance()->setShader(newShader);
> > >
> > > Cheers,
> > > Praveen
> > >
> > > On Mon, 9 Jun 2003, Simone Herrmann wrote:
> > >
> > > > Hi,
> > > >
> > > > How can I apply a lookup table to a volume in the pfVolume node?
> > > >
> > > > I tried:
> > > >
> > > > vzParameterLookupTable* myTable = myLoadLookupTable();
> > > >
> > > > pfVolume* vol = new pfVolume;
> > > > vol->readFile("myVolume.vz");
> > > > vol->getShape()->getAppearance()->setParameter("lookup_table", myTable);
> > > >
> > > > but the image still remains uncoloured.
> > > >
> > > > Thanks,
> > > > Simone
> > > > ______________________________________________________________________________
> > > > UNICEF bittet um Spenden fur die Kinder im Irak! Hier online an
> > > > UNICEF spenden: https://spenden.web.de/unicef/special/?mc=021101
> > > >
> > > > -----------------------------------------------------------------------
> > > > List Archives, Info, FAQ: http://www.sgi.com/software/performer/
> > > > Open Development Project: http://oss.sgi.com/projects/performer/
> > > > Submissions: info-performer++at++sgi.com
> > > > Admin. requests: info-performer-request++at++sgi.com
> > > > -----------------------------------------------------------------------
> > > >
> > > >
> > >
> > > --
> > > -----------------------------------------------------------------
> > > Praveen Bhaniramka Member of Technical Staff (MTS)
> > > praveenb++at++sgi.com Advanced Graphics Division
> > > (650)933-1785 Silicon Graphics, Inc.
> > > -----------------------------------------------------------------
> >
> >
> > ____________________________________________________________________________
> > Jetzt bei WEB.DE FreeMail anmelden = 1qm Regenwald schuetzen! Helfen
> > Sie mit! Nutzen Sie den Serien-Testsieger. http://user.web.de/Regenwald
> >
> >
>
> --
> -----------------------------------------------------------------
> Praveen Bhaniramka Member of Technical Staff (MTS)
> praveenb++at++sgi.com Advanced Graphics Division
> (650)933-1785 Silicon Graphics, Inc.
> -----------------------------------------------------------------
>
> -----------------------------------------------------------------------
> List Archives, Info, FAQ: http://www.sgi.com/software/performer/
> Open Development Project: http://oss.sgi.com/projects/performer/
> Submissions: info-performer++at++sgi.com
> Admin. requests: info-performer-request++at++sgi.com
> -----------------------------------------------------------------------
>

______________________________________________________________________________
UNICEF bittet um Spenden fur die Kinder im Irak! Hier online an
UNICEF spenden: https://spenden.web.de/unicef/special/?mc=021101


Date view Thread view Subject view Author view

This archive was generated by hypermail 2b29 : Tue Jun 10 2003 - 03:18:39 PDT