Chris Tanner (cct++at++faith)
Fri, 9 Sep 1994 11:25:52 -0700
One quick note. Texgen in fact overrides texture coordinates sent down the
pipe, so you dont have to take off texture coordinates before sending the data
down (or giving the data to Performer) simply having the following (extracted
from a new version of callbacks.c in the utility library) will do the
trick...Note that you should do a man on texgen so that you understand how to
define the texgen parameters such that your mapping from objectspace to
screen-space texture coords will happen the way you want it...
(For those of you not yet versed in the notion of node callbacks in the draw
process, a call to
pfNodeTravFuncs(Geode,PFTRAV_DRAW, pfuPreDrawContourMap,
pfuPostDrawContourMap);
on the relevant Geode will cause all the geometry under Geode to be Contour
Mapped)
static char CallBacks[PF_MAXSTRING] = "pfCallbacksDPool";
int pfuPreDrawContourMap(pfTraverser *trav, void *data)
{
pfDataPool *dp;
float *paramsX, *paramsY;
dp = pfAttachDPool(CallBacks);
if (dp == NULL)
pfuTexgenParams(NULL, NULL);
paramsX = (float *)pfDPoolFind(dp, 1);
paramsY = (float *)pfDPoolFind(dp, 2);
(trav, trav);
(data, data);
mmode(MVIEWING);
pfPushIdentMatrix();
texgen(TX_S, TG_CONTOUR, paramsX);
texgen(TX_T, TG_CONTOUR, paramsY);
texgen(TX_S, TG_ON, NULL);
texgen(TX_T, TG_ON, NULL);
pfPopMatrix();
return NULL;
}
int
pfuPostDrawContourMap(pfTraverser *trav, void *data)
{
(trav, trav);
(data, data);
texgen(TX_S, TG_OFF, NULL);
texgen(TX_T, TG_OFF, NULL);
return NULL;
}
/* Also, to set the parameters for texgen use the following utility code */
void
pfuGetTexgenParams(float *newParamsX,float *newParamsY)
{
pfDataPool *dp;
float *paramsX, *paramsY;
int i;
dp = pfAttachDPool(CallBacks);
if (dp == NULL)
pfuTexgenParams(NULL, NULL);
paramsX = (float *)pfDPoolFind(dp, 1);
paramsY = (float *)pfDPoolFind(dp, 2);
for (i=0;i<4;i++)
newParamsX[i] = paramsX[i];
for (i=0;i<4;i++)
newParamsY[i] = paramsY[i];
}
void
pfuTexgenParams(const float *newParamsX, const float *newParamsY)
{
pfDataPool *dp;
float *paramsX, *paramsY;
dp = pfAttachDPool(CallBacks);
if (dp == NULL)
{
dp = pfNewDPool(sizeof(float) * 8, CallBacks);
paramsX = (float *)pfDPoolAlloc(dp, sizeof(float) * 4, 1);
paramsY = (float *)pfDPoolAlloc(dp, sizeof(float) * 4, 2);
}
else
{
paramsX = (float *)pfDPoolFind(dp, 1);
paramsY = (float *)pfDPoolFind(dp, 2);
}
if (!newParamsX)
{
paramsX[0] = 0.0;
paramsX[1] = 1.0;
paramsX[2] = 0.0;
paramsX[3] = 1.0;
}
else
{
paramsX[0] = newParamsX[0];
paramsX[1] = newParamsX[1];
paramsX[2] = newParamsX[2];
paramsX[3] = newParamsX[3];
}
if (!newParamsY)
{
paramsY[0] = 0.0;
paramsY[1] = 1.0;
paramsY[2] = 0.0;
paramsY[3] = 1.0;
}
else
{
paramsY[0] = newParamsX[0];
paramsY[1] = newParamsX[1];
paramsY[2] = newParamsX[2];
paramsY[3] = newParamsX[3];
}
}
--_____________________________________________________________ Chris Tanner (cct++at++faith.asd.sgi.com) Silicon Graphics - Advanced Graphics Division _____________________________________________________________
This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:50:32 PDT