Stereo examples

New Message Reply Date view Thread view Subject view Author view

Daniela Rainer (zrgr0390++at++visin1.rus.uni-stuttgart.de)
Mon, 24 Jun 1996 10:16:53 +0000


Hi Terence,

some days ago you asked me for stereo exampels. I did not forget your question
but at the moment I don't know how to get some stereo modes in Performer so I
wanted to know more about it before I send you this mail. Unfortunately I'm
still confused about some stereo modes.

What I can send you:

Examples for stereo in GL based performer with GL window for the STR_RECT
modes,
that works on all machines and for the quadbuffer mode that works only on
RealityEngine.

A Example for stereo in GL based performer with GLX window for the
STR_TOP/STR_BOT mode. I think that this mode is available on all machines,
too.
On my machine this example works only with Performer 2.0, not with Performer
2.01. The problem seems to be the pfuGLXWinopen call.

Unfortunately I don't know how to get the quadbuffer stereo work in a GLX
window. If you have any ideas, would you please help me, (or someone else on
this mailing list)?

Regards
Daniela

/********************************************************/
/* */
/* Example for STR_RECT stereo in Performer 2.0(1) */
/* */
/* parameters for left and right eye view are the */
/* same as in Crystal Eyes Handbook by Lenny Lipton */
/* */
/* cc -g -o STR_RECT_stereo STR_RECT_stereo.c */
/* -DIRISGL -lpf_igl -lpfdu_igl -lpfui -lpfutil_igl */
/* -lmpc -limage -lfm -lgl -lXirisw -lXm -lXt -lfpe */
/* -lXmu -lX11 -lm -lmalloc -lC */
/* */
/********************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define PF_CPLUSPLUS_API 0
#include <Performer/pf.h>
#include <Performer/pr.h>
#include <Performer/pfutil.h>
#include <Performer/pfdu.h>
#include <Performer/pfui.h>

#include <gl.h>
#include <gl/device.h>

void OpenGLStereoWindow(pfPipeWindow *pw);
void DrawFunc(pfChannel *chan, void *data);
void PreDraw(pfChannel *chan, void *data);
void PostDraw(pfChannel *chan, void *data);
pfGeoSet *loadAirplane(void);

pfLightModel *lm;
pfLight *lt;

int
main(int argc, char *argv[])
{

    pfScene *scene;
    pfDCS *rotateDCS;
    pfGeode *airplaneGeode;
    pfGeoSet *airplaneGeoset;
    pfChannel *leftChan, *rightChan;
    float xmin, xmax, zmin, zmax, ynear, yfar, dist,
                    clip_near, clip_far, left, right, bottom, top,
                    dx, dz, n_over_d, yzps, leftEye, rightEye;
    pfVec3 xyzOffset, hprOffset;
    pfCoord view;
    pfMatrix mat;
    pfPipe *pipe;
    pfPipeWindow *pw;
    pfVec3 eye;

    system("/usr/gfx/setmon -n STR_RECT");
    pfInit();

    pfMultiprocess(PFMP_APPCULLDRAW);

    pfConfig();

    pfuInitUtil();

    /********** initSceneGraph ***/

    scene = pfNewScene();
    rotateDCS = pfNewDCS();

    airplaneGeoset = loadAirplane();
    airplaneGeode = pfNewGeode();
    pfAddGSet(airplaneGeode, airplaneGeoset);
    pfAddChild(scene, rotateDCS);
    pfAddChild(rotateDCS, airplaneGeode);

    /********** initPipe and pipeWindow */

    pipe = pfGetPipe(0);

    pw = pfNewPWin(pipe);

    pfPWinConfigFunc(pw, OpenGLStereoWindow);
    pfConfigPWin(pw);
    pfFrame();

    /********** initChannels ***/

    leftChan = pfNewChan(pfGetPipe(0));
    rightChan = pfNewChan(pfGetPipe(0));

    pfChanTravFunc(leftChan, PFTRAV_DRAW, DrawFunc);
    pfChanTravFunc(rightChan, PFTRAV_DRAW, DrawFunc);

    pfChanScene(leftChan,scene);
    pfChanScene(rightChan,scene);

    xmin = -6.0f;
    xmax = 6.0f;
    zmin = -4.8;
    zmax = 4.8;
    ynear = -6.0f;
    yfar = 6.0f;
    yzps = 0.0f;
    dist = -14.5;
    rightEye = 0.31;
    leftEye = -0.31;
    dx = xmax - xmin;
    dz = zmax - zmin;

    clip_near = fabs(dist + yzps - ynear);
    clip_far = fabs(dist + yzps - yfar);
    pfChanNearFar(leftChan, clip_near, clip_far);
    pfChanNearFar(rightChan, clip_near, clip_far);

    n_over_d = clip_near/fabs(dist); /* Strahlensatz! */

    top = n_over_d* dz/2.0;
    bottom = -top;

    /* Set left channel */
    right = n_over_d*(dx/2.0 - leftEye);
    left = n_over_d*(-dx/2.0 - leftEye);
    pfMakePerspChan(leftChan, left, right, bottom, top);

    pfChanViewport(leftChan, 0.0f, 1.0f, 532.0f/1023.0f, 1.0f);

    /* Set right channel */
    right = n_over_d*(dx/2.0 - rightEye);
    left = n_over_d*(-dx/2.0 - rightEye);
    pfMakePerspChan(rightChan, left, right, bottom, top);

    pfChanViewport(rightChan, 0.0f, 1.0f, 0.0f, 491.0f/1023.0f);

    /********** initView ***/

    pfSetVec3(view.xyz, 0.0f, dist, 0.0f);
    pfSetVec3(view.hpr, 0.0f, 0.0f, 0.0f);
    pfChanView(leftChan, view.xyz, view.hpr);
    pfChanView(rightChan, view.xyz, view.hpr);

    /* Compute heading offset for horizontal tiling of channels. */
    pfSetVec3(hprOffset, 0.0f, 0.0f, 0.0f);

    pfSetVec3(xyzOffset, leftEye, 0.0f, 0.0f);
    pfChanViewOffsets(leftChan,xyzOffset,hprOffset);

    pfSetVec3(xyzOffset, rightEye, 0.0f, 0.0f);
    pfChanViewOffsets(rightChan,xyzOffset,hprOffset);

    pfGetChanEye(leftChan, eye);
    printf("left channel eye: %f\t%f\t%f\n", eye[0], eye[1], eye[2]);

    pfGetChanEye(rightChan, eye);
    printf("right channel eye: %f\t%f\t%f\n", eye[0], eye[1], eye[2]);

    /***********/
    pfMakeRotMat(mat, 0.9, 0.0f, 0.0f,1.0f);

    /***********/

    qdevice(ESCKEY);
    qdevice(WINQUIT);

    /********** Performer main loop ***/
    while (1)
    {
        short value, dev_id;

        pfMatrix DCSMat;

        pfSync();

        pfGetDCSMat(rotateDCS, DCSMat);
        pfPostMultMat(DCSMat, mat);
        pfDCSMat(rotateDCS, DCSMat);

        pfFrame();

        if (qtest())
        {

            dev_id = qread(&value);
            if (dev_id == ESCKEY || dev_id == WINQUIT)
            {
                system("/usr/gfx/setmon -n 72");

                pfExit();
                exit(0);

            }
        }

    }
}

/******************************************************************************/
void
OpenGLStereoWindow(pfPipeWindow *pw)
{
    pfPipe *p;
    Display *xdisplay;
    Window glWindow;

    pfPWinName(pw, "Oldstyle Stereo with Performer 2.01");
    pfPWinFullScreen(pw);
    pfOpenPWin(pw);

    pfCullFace(PFCF_OFF);
    pfShadeModel(PFSM_GOURAUD);
    pfEnable(PFEN_LIGHTING);

    lm = pfNewLModel(NULL);
    pfLModelTwoSide(lm, PF_ON);
    pfApplyLModel(lm);

    lt = pfNewLight(NULL);
    pfLightPos(lt, 0.0f, 0.0f, 1.0f, 0.0f);
    pfLightColor(lt, PFLT_DIFFUSE, 0.8f, 0.8f, 0.8f);
    pfLightColor(lt, PFLT_AMBIENT, 0.8f, 0.8f, 0.8f);

}

/******************************************************************************/
void
DrawFunc(pfChannel *chan, void *data)
{
    PreDraw(chan,data);
    pfDraw();
    PostDraw(chan,data);
}

/******************************************************************************/
void
PreDraw(pfChannel *chan, void *data)
{
    pfClearChan(chan);
    pfLightOn(lt);

}

/******************************************************************************/
void
PostDraw(pfChannel *chan, void *data)
{

}

/********************************************************************/
pfGeoSet
*loadAirplane(void)
{
  pfGeoSet *geoset;
  static pfVec3 koordinaten[]={
    {0.0, 4.5, 0.5}, /* 0 */
    {3.0, 4.5, 0.5}, /* 1 */
    {3.0, 3.5, 0.5}, /* 2 */
    {0.0, 0.0, 0.5}, /* 3 */
    {0.0, -3.25, 0.5},/* 4 */
    {0.0, -5.5, -0.5},/* 5 */
    {-3.0, 3.5, 0.5}, /* 6 */
    {-3.0, 4.5, 0.5}, /* 7 */
    {0.0, 4.5, -0.5}}; /* 8 */

  /* GEOMETRIE IST SCHIEF */
  static ushort index[] = {6,7,
                           7,1,
                           1,2,
                           2,4,
                           4,6,

                           0,4,
                           4,5,
                           5,8,
                           8,0,

                           6,3,
                           3,2};
  static ushort cindex[] = {0};

  static pfVec4 colors[] ={{1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f}};

  geoset=pfNewGSet(NULL);
  pfGSetAttr(geoset,PFGS_COORD3,PFGS_PER_VERTEX,
             koordinaten,index);
  pfGSetAttr(geoset, PFGS_COLOR4, PFGS_OVERALL,colors,cindex);
  pfGSetPrimType(geoset,PFGS_LINES);
  pfGSetNumPrims(geoset,11);

  return(geoset);

}

/****************************************************************/
/* */
/* Example for "Quadbuffer" stereo (RealityEngine stereo ) */
/* in Performer 2.01 */
/* */
/* parameters for left and right eye view are the same as in */
/* Crystal Eyes Book */
/* */
/* cc -g -o quadbuffer_stereo quadbuffer_stereo.c */
/* -DIRISGL -lpf_igl -lpfdu_igl -lpfui -lpfutil_igl */
/* -lmpc -limage -lfm -lgl -lXirisw -lXm -lXt -lfpe -lXmu */
/* -lX11 -lm -lmalloc -lC */
/* */
/****************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define PF_CPLUSPLUS_API 0
#include <Performer/pf.h>
#include <Performer/pr.h>
#include <Performer/pfutil.h>
#include <Performer/pfdu.h>
#include <Performer/pfui.h>

#include <gl.h>
#include <gl/device.h>

void OpenGLStereoWindow(pfPipeWindow *pw);
void DrawFunc(pfChannel *chan, void *data);
void PreDraw(pfChannel *chan, void *data);
void PostDraw(pfChannel *chan, void *data);
pfGeoSet *loadAirplane(void);

pfLightModel *lm;
pfLight *lt;

int
main(int argc, char *argv[])
{

    pfScene *scene;
    pfDCS *rotateDCS;
    pfGeode *airplaneGeode;
    pfGeoSet *airplaneGeoset;
    pfChannel *leftChan, *rightChan;
    float xmin, xmax, zmin, zmax, ynear, yfar, dist,
                    clip_near, clip_far, left, right, bottom, top,
                    dx, dz, n_over_d, yzps, leftEye, rightEye;
    pfVec3 xyzOffset, hprOffset;
    pfCoord view;
    pfMatrix mat;
    pfPipe *pipe;
    pfPipeWindow *pw;
    pfVec3 eye;

    /********** test for RE stereo ***/

    if ( ! (getgdesc(GD_STEREO_IN_WINDOW)) )
    {
        printf("Reality Engine Stereo is not supported on this machine\n");
        exit(0);
    }

    /********** switch to RE stereo mode ***/

    system("/usr/gfx/setmon -n 1025x768_96s");

    /********** init performer ***/

    pfInit();

    pfMultiprocess(PFMP_APPCULLDRAW);

    pfConfig();

    /********** initSceneGraph ***/

    scene = pfNewScene();
    rotateDCS = pfNewDCS();

    airplaneGeoset = loadAirplane();
    airplaneGeode = pfNewGeode();
    pfAddGSet(airplaneGeode, airplaneGeoset);
    pfAddChild(scene, rotateDCS);
    pfAddChild(rotateDCS, airplaneGeode);

    /********** initPipe and pipeWindow */
    pipe = pfGetPipe(0);

    pw = pfNewPWin(pipe);
    pfPWinName(pw, "Quadbuffer Stereo mit Performer 2.0(1)");
    pfPWinOriginSize(pw, 200, 200, 500, 500);

    pfPWinConfigFunc(pw, OpenGLStereoWindow);
    pfConfigPWin(pw);

    pfFrame();

    /********** initChannels ***/

    leftChan = pfNewChan(pfGetPipe(0));
    rightChan = pfNewChan(pfGetPipe(0));

    pfChanTravFunc(leftChan, PFTRAV_DRAW, DrawFunc);
    pfChanTravFunc(rightChan, PFTRAV_DRAW, DrawFunc);

    pfChanScene(leftChan,scene);
    pfChanScene(rightChan,scene);

    xmin = -6.0f;
    xmax = 6.0f;
    zmin = -4.8;
    zmax = 4.8;
    ynear = -6.0f;
    yfar = 6.0f;
    yzps = 0.0f;
    dist = -14.5;
    rightEye = 0.31;
    leftEye = -0.31;
    dx = xmax - xmin;
    dz = zmax - zmin;

    clip_near = fabs(dist + yzps - ynear);
    clip_far = fabs(dist + yzps - yfar);

    pfChanNearFar(leftChan, clip_near, clip_far);
    pfChanNearFar(rightChan, clip_near, clip_far);

    /* left, right, top, bottom in channel-Koordinaten */
    n_over_d = clip_near/fabs(dist); /* Strahlensatz! */

    top = n_over_d* dz/2.0;
    bottom = -top;

    /* Set left channel */
    right = n_over_d*(dx/2.0 - leftEye);
    left = n_over_d*(-dx/2.0 - leftEye);
    pfMakePerspChan(leftChan, left, right, bottom, top);

    /* Set right channel */
    right = n_over_d*(dx/2.0 - rightEye);
    left = n_over_d*(-dx/2.0 - rightEye);
    pfMakePerspChan(rightChan, left, right, bottom, top);

    /********** initView ***/

    pfSetVec3(view.xyz, 0.0f, dist, 0.0f);
    pfSetVec3(view.hpr, 0.0f, 0.0f, 0.0f);
    pfChanView(leftChan, view.xyz, view.hpr);
    pfChanView(rightChan, view.xyz, view.hpr);

    /* Compute heading offset for horizontal tiling of channels. */
    pfSetVec3(hprOffset, 0.0f, 0.0f, 0.0f);

    pfSetVec3(xyzOffset, leftEye, 0.0f, 0.0f);
    pfChanViewOffsets(leftChan,xyzOffset,hprOffset);

    pfSetVec3(xyzOffset, rightEye, 0.0f, 0.0f);
    pfChanViewOffsets(rightChan,xyzOffset,hprOffset);

    pfGetChanEye(leftChan, eye);
    printf("left channel eye: %f\t%f\t%f\n", eye[0], eye[1], eye[2]);

    pfGetChanEye(rightChan, eye);
    printf("right channel eye: %f\t%f\t%f\n", eye[0], eye[1], eye[2]);

    /***********/
    pfMakeRotMat(mat, 0.9, 0.0f, 0.0f,1.0f);

    /***********/

    qdevice(ESCKEY);
    qdevice(WINQUIT);

    /********** Performer main loop ***/
    while (1)
    {
        short value, dev_id;

        pfMatrix DCSMat;

        pfSync();

        pfGetDCSMat(rotateDCS, DCSMat);
        pfPostMultMat(DCSMat, mat);
        pfDCSMat(rotateDCS, DCSMat);

        pfFrame();

        if (qtest())
        {

            dev_id = qread(&value);
            if (dev_id == ESCKEY || dev_id == WINQUIT)
            {
                system("/usr/gfx/setmon -n 72");

                pfExit();
                exit(0);

            }
        }

    }
}

/******************************************************************************/
void
OpenGLStereoWindow(pfPipeWindow *pw)
{
    pfPipe *p;
    Display *xdisplay;
    Window glWindow;

    pfOpenPWin(pw);

    stereobuffer();
    gconfig();

    pfCullFace(PFCF_OFF);
    pfShadeModel(PFSM_GOURAUD);
    pfEnable(PFEN_LIGHTING);

    lm = pfNewLModel(NULL);
    pfLModelTwoSide(lm, PF_ON);
    pfApplyLModel(lm);

    lt = pfNewLight(NULL);
    pfLightPos(lt, 0.0f, 0.0f, 1.0f, 0.0f);
    pfLightColor(lt, PFLT_DIFFUSE, 0.8f, 0.8f, 0.8f);
    pfLightColor(lt, PFLT_AMBIENT, 0.8f, 0.8f, 0.8f);

}

/******************************************************************************/
void
DrawFunc(pfChannel *chan, void *data)
{
    PreDraw(chan,data);
    pfDraw();
    PostDraw(chan,data);
}

/******************************************************************************/
void
PreDraw(pfChannel *chan, void *data)
{

    static long stereoFlag = 0;

    if (stereoFlag)
    {
        leftbuffer(0);
            rightbuffer(1);
    }

    else
    {
            leftbuffer(1);
            rightbuffer(0);
    }

    stereoFlag = !stereoFlag;
    pfClearChan(chan);
    pfLightOn(lt);

}

/******************************************************************************/
void
PostDraw(pfChannel *chan, void *data)
{

}

/********************************************************************/
pfGeoSet
*loadAirplane(void)
{
  pfGeoSet *geoset;
  static pfVec3 koordinaten[]={
    {0.0, 4.5, 0.5}, /* 0 */
    {3.0, 4.5, 0.5}, /* 1 */
    {3.0, 3.5, 0.5}, /* 2 */
    {0.0, 0.0, 0.5}, /* 3 */
    {0.0, -3.25, 0.5},/* 4 */
    {0.0, -5.5, -0.5},/* 5 */
    {-3.0, 3.5, 0.5}, /* 6 */
    {-3.0, 4.5, 0.5}, /* 7 */
    {0.0, 4.5, -0.5}}; /* 8 */

  /* GEOMETRIE IST SCHIEF */
  static ushort index[] = {6,7,
                           7,1,
                           1,2,
                           2,4,
                           4,6,

                           0,4,
                           4,5,
                           5,8,
                           8,0,

                           6,3,
                           3,2};
  static ushort cindex[] = {0};

  static pfVec4 colors[] ={{1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f}};

  geoset=pfNewGSet(NULL);
  pfGSetAttr(geoset,PFGS_COORD3,PFGS_PER_VERTEX,
             koordinaten,index);
  pfGSetAttr(geoset, PFGS_COLOR4, PFGS_OVERALL,colors,cindex);
  pfGSetPrimType(geoset,PFGS_LINES);
  pfGSetNumPrims(geoset,11);

  return(geoset);

}

/************************************************************************/
/* */
/* Example for "STR_BOT" stereo in GL based Performer 2.0 */
/* in GLX window */
/* */
/* */
/* cc -g -o STR_BOT_stereo STR_BOT_stereo.c */
/* -DIRISGL -lpf_igl -lpfdu_igl -lpfui -lpfutil_igl */
/* -lmpc -limage -lfm -lgl -lXirisw -lXm -lXt -lfpe -lXmu -lX11 */
/* -lm -lmalloc -lC */
/* -lXext */
/* */
        /************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>

#include <gl.h>
#include <gl/glws.h>

#include <X11/extensions/SGIStereo.h>

#define PF_CPLUSPLUS_API 0
#include <Performer/pf.h>
#include <Performer/pr.h>
#include <Performer/pfutil.h>
#include <Performer/pfdu.h>
#include <Performer/pfui.h>

/******************************************************************************/
void OpenStereoGLXWindow(pfPipeWindow *pw);
void initStereoChannel(void);
void DrawFunc(pfChannel *chan, void *data);
void PreDraw(pfChannel *chan, void *data);
void PostDraw(pfChannel *chan, void *data);
pfGeoSet *loadAxis(void);
pfGeoSet *loadAirplane(void);
void mySwapFunc(pfPipe *pipe, pfPipeWindow *pw);
/******************************************************************************/

pfLightModel *lm;
pfLight *lt;
Display *xdisplay;
Window glWindow;
pfuGLXWindow *glxWindow;
int screen;
float optDist, leftEye, rightEye;

pfChannel *leftChan, *rightChan;
pfScene *scene;

int
main(int argc, char *argv[])
{

    pfSCS *stereoScaleSCS;
    pfDCS *rotateDCS;
    pfLightSource *sun;
    pfGeode *axisGeode, *airplaneGeode;
    pfGeoSet *axisGeoset, *airplaneGeoset;
    pfVec3 xyzOffset, hprOffset;
    pfCoord view;
    pfMatrix mat;
    pfPipe *pipe;
    pfPipeWindow *pw;

    /****************** initSharedMem, initConfig **********************/
    pfInit();

    system("/usr/gfx/setmon -n STR_BOT");
    pfMultiprocess(PFMP_APPCULLDRAW);
    pfConfig();
    pfuInitUtil();

    /************************** initSceneGraph *************************/

    scene = pfNewScene();
    pfMakeScaleMat(mat, 1.0f, 1.0f, 0.5f);
    stereoScaleSCS = pfNewSCS(mat);
    rotateDCS = pfNewDCS();

    airplaneGeoset = loadAirplane();
    axisGeoset = loadAxis();

    airplaneGeode = pfNewGeode();
    axisGeode = pfNewGeode();

    pfAddGSet(airplaneGeode, airplaneGeoset);
    pfAddGSet(axisGeode, axisGeoset);

    pfAddChild(scene, stereoScaleSCS);

    pfAddChild(stereoScaleSCS, rotateDCS);
    /*pfAddChild(stereoScaleSCS, axisGeode);*/
    pfAddChild(rotateDCS, airplaneGeode);
    pfAddChild(rotateDCS, axisGeode);

    /****************************** initPipe ********************************/

    pipe = pfGetPipe(0);

    pw = pfNewPWin(pipe);
    pfPWinType(pw, PFPWIN_TYPE_X);
    pfPWinOriginSize(pw, 100, 100, 600, 480);
    pfPipeSwapFunc(pipe, mySwapFunc);

    pfPWinConfigFunc(pw, OpenStereoGLXWindow);
    pfConfigPWin(pw);
    pfFrame();

    /****************************** initChannels ****************************/

    initStereoChannel();

    /****************************** initView
**********************************/

    pfSetVec3(view.xyz, 0.0f, optDist, 0.0f); /* View in Weltkoordinaten */
    pfSetVec3(view.hpr, 0.0f, 0.0f, 0.0f);
    pfChanView(leftChan, view.xyz, view.hpr);
    pfChanView(rightChan, view.xyz, view.hpr);

    /* Compute heading offset for horizontal tiling of channels. */
    pfSetVec3(hprOffset, 0.0f, 0.0f, 0.0f);

    pfSetVec3(xyzOffset, leftEye,0.0f, 0.0f);
    pfChanViewOffsets(leftChan,xyzOffset,hprOffset);

    pfSetVec3(xyzOffset, rightEye, 0.0f, 0.0f);
    pfChanViewOffsets(rightChan,xyzOffset,hprOffset);

    printf("\tView = %f\n", view.xyz[1]);
    printf("\tleftEye = %f\n", leftEye);
    /**************************************************************************/
    pfMakeRotMat(mat, 0.9, 0.0f, 0.0f,1.0f);

    /************************* Performer main loop
****************************/
    while (1)
    {

        pfMatrix DCSMat;
        pfSync();

        pfGetDCSMat(rotateDCS, DCSMat);
        pfPostMultMat(DCSMat, mat);
        pfDCSMat(rotateDCS, DCSMat);

        pfFrame();

    }
}

/******************************************************************************/
/*
                                                                      */
/* OpenPipeline Callback ok !!!!
                                       */
/*
                                                                      */
/******************************************************************************/
void
OpenStereoGLXWindow(pfPipeWindow *pw)
{
    pfPipe *p;

    p = pfGetPWinPipe(pw);

    if (!(glxWindow = pfuGLXWinopen(p, pw, "Performer 2.0 Stereo in a Xwindow
opened with pfuGLXWinopen ")))
        pfNotify(PFNFY_FATAL, PFNFY_RESOURCE, "OpenXPipeline: Could not create
GLX Window.");

    glWindow = glxWindow->glWin;
    xdisplay = pfGetCurWSConnection();
    screen = pfGetPWinScreen(pw);

    pfCullFace(PFCF_OFF);
    pfShadeModel(PFSM_GOURAUD);
    pfEnable(PFEN_LIGHTING);

    lm = pfNewLModel(NULL);
    pfLModelTwoSide(lm, PF_ON);
    pfApplyLModel(lm);

    lt = pfNewLight(NULL);
    pfLightPos(lt, 0.0f, 0.0f, 1.0f, 0.0f);
    pfLightColor(lt, PFLT_DIFFUSE, 0.8f, 0.8f, 0.8f);
    pfLightColor(lt, PFLT_AMBIENT, 0.8f, 0.8f, 0.8f);

    pfuPrintPWinFBConfig(pw, NULL);

}

/******************************************************************************/
/*
                                                                      */
/* DRAW PROCESS ROUTINES
                                           */
/*
                                                                      */
/******************************************************************************/
void
DrawFunc(pfChannel *chan, void *data)
{
    PreDraw(chan,data);
    pfDraw();
    PostDraw(chan,data);
}

/******************************************************************************/
void
PreDraw(pfChannel *chan, void *data)
{
    static long stereoFlag = 0;
    Status status;

    pfLightOn(lt);

    if (stereoFlag)
    {
        status = XSGISetStereoBuffer(xdisplay, glWindow, STEREO_BUFFER_LEFT);
        XSync(xdisplay, False);

    }

    else
    {

            status = XSGISetStereoBuffer(xdisplay, glWindow,
 STEREO_BUFFER_RIGHT);
        XSync(xdisplay, False);

    }
    stereoFlag = !stereoFlag;

    pfClearChan(chan);

}

/******************************************************************************/
void
PostDraw(pfChannel *leftChan, void *data)
{

}

/******************************************************************************/
void
mySwapFunc(pfPipe *pipe, pfPipeWindow *pw)
{

        pfSwapPWinBuffers(pw);

}

/******************************************************************************/
pfGeoSet
*loadAxis(void)
{
  pfGeoSet *geoset;
  static pfVec3 koordinaten[]={{-2.0f,0.0f,-1.0f}
                              ,{2.0f,0.0f,-1.0f} /* x-Achse*/
                              ,{0.0f,-2.0f,-1.0f}
                              ,{0.0f,2.0f,-1.0f}/* y-Achse*/
                              ,{0.0f,0.0f,-1.0f}
                              ,{0.0f,0.0f,1.0f}}; /* z-Achse*/
 static pfVec4 colors[] ={{1.0f, 0.0f, 0.0f, 1.0f},
                          {1.0f, 0.0f, 0.0f, 1.0f},/* x-Achse rot*/
                          {0.0f, 1.0f, 0.0f, 1.0f},
                          {0.0f, 1.0f, 0.0f, 1.0f},/* y-Achse gruen */
                          {0.0f, 0.0f, 1.0f, 1.0f},
                          {0.0f, 0.0f, 1.0f, 1.0f}};/* z-Achse blau */

  geoset=pfNewGSet(NULL);
  pfGSetAttr(geoset,PFGS_COORD3,PFGS_PER_VERTEX,
             koordinaten,NULL);
  pfGSetAttr(geoset, PFGS_COLOR4, PFGS_PER_VERTEX,colors,NULL);
  pfGSetPrimType(geoset,PFGS_LINES);
  pfGSetNumPrims(geoset,3);

  return(geoset);
}

/********************************************************************/
pfGeoSet
*loadAirplane(void)
{
  pfGeoSet *geoset;
  static pfVec3 koordinaten[]={
    {0.0, 4.5, 0.5}, /* 0 */
    {3.0, 4.5, 0.5}, /* 1 */
    {3.0, 3.5, 0.5}, /* 2 */
    {0.0, 0.0, 0.5}, /* 3 */
    {0.0, -3.25, 0.5},/* 4 */
    {0.0, -5.5, -0.5},/* 5 */
    {-3.0, 3.5, 0.5}, /* 6 */
    {-3.0, 4.5, 0.5}, /* 7 */
    {0.0, 4.5, -0.5}}; /* 8 */

  /* GEOMETRIE IST SCHIEF */
  static ushort index[] = {6,7,
                           7,1,
                           1,2,
                           2,4,
                           4,6,

                           0,4,
                           4,5,
                           5,8,
                           8,0,

                           6,3,
                           3,2};
  static ushort cindex[] = {0};

  static pfVec4 colors[] ={{1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f},
                           {1.0f, 0.0f, 1.0f, 1.0f}};

  geoset=pfNewGSet(NULL);
  pfGSetAttr(geoset,PFGS_COORD3,PFGS_PER_VERTEX,
             koordinaten,index);
  pfGSetAttr(geoset, PFGS_COLOR4, PFGS_OVERALL,colors,cindex);
  pfGSetPrimType(geoset,PFGS_LINES);
  pfGSetNumPrims(geoset,11);

  return(geoset);

}

void initStereoChannel(void)
{
        float dx, dz, Pmax, Pmin, tc_start, tc1, tc2, tc,
                        top, bottom, left, right, clip_near, clip_far,
n_over_d;
        float yzps = 0.0f;
        pfEarthSky *esky_red, *esky_blue;
        float xmax, xmin, ymax, ymin, zmax, zmin, ynear, yfar;
        pfPipe *p;

        printf("initStereoChannel\n");

        xmax = 6.0f;
        xmin = -6.0f;
        zmax = 4.8f, zmin = -4.8f;
        ynear= -6.0f;
        yfar = 6.0f;

        leftChan = pfNewChan(pfGetPipe(0));
        rightChan = pfNewChan(pfGetPipe(0));

        p = pfGetPipe(0);
        pfChanTravFunc(leftChan,PFTRAV_DRAW, DrawFunc);
        pfChanTravFunc(rightChan,PFTRAV_DRAW, DrawFunc);

        pfChanScene(leftChan, scene);
        pfChanScene(rightChan, scene);

        /*pfAttachChan(leftChan,rightChan);*/

        dx = xmax - xmin;
        dz = zmax - zmin;

        /* tan(45.0 / 2) = 0.41421356 */
        optDist = - dx/(2 * 0.41421356); printf("\toptdist = %f\n", optDist);

        /* tan(1.73 /2) = 0.015098245 */
        Pmax = 0.015098245 / 0.41421356 * dx;
        Pmin = -Pmax;

        tc1 = -Pmin * (optDist / (yfar -yzps) -1);
        tc2 = Pmax * (optDist / (yzps - ynear) + 1);

        if (tc1 < tc2)
            tc = tc1;
        else
            tc = tc2;

        tc_start = tc;

        printf("\t stereo separation = %f\n", tc);

        rightEye = tc/2.0f;
        leftEye = -tc/2.0f;

        clip_near = fabs(optDist + yzps - ynear);
        clip_far = fabs(optDist + yzps - yfar);

        n_over_d = clip_near/fabs(optDist);

        top = n_over_d* dz/2.0;
        bottom = -top;

        pfChanNearFar(leftChan, clip_near, clip_far);
        pfChanNearFar(rightChan, clip_near, clip_far);
        /* Set left channel */

        right = n_over_d*(dx/2.0 - leftEye);
        left = n_over_d*(-dx/2.0 - leftEye);
        pfMakePerspChan(leftChan, left, right, bottom, top);
        printf("leftChan: %f %f %f %f\n", left, right, bottom, top);

        /* Set right channel */

        right = n_over_d*(dx/2.0 - rightEye);
        left = n_over_d*(-dx/2.0 - rightEye);
        pfMakePerspChan(rightChan, left, right, bottom, top);
        printf("rightChan: %f %f %f %f\n", left, right, bottom, top);

        printf("\t stereo separation = %f\n", tc);

        esky_red = pfNewESky();
        esky_blue = pfNewESky();

        pfESkyColor(esky_red, PFES_CLEAR, 1.0f, 0.0f, 0.0f, 1.0f);
        pfESkyColor(esky_blue, PFES_CLEAR, 0.0f, 0.0f, 1.0f, 1.0f);

        pfChanESky(leftChan, esky_red);
        pfChanESky(rightChan, esky_blue);
}

-- 
----------------------------------------------------------------------------
Daniela Rainer

rainer++at++rus.uni-stuttgart.de Tel.: ++49-(0)711-685-5970 ======================================================================= List Archives, FAQ, FTP: http://www.sgi.com/Technology/Performer.html Submissions: info-performer++at++sgi.com Admin. requests: info-performer-request++at++sgi.com


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:53:03 PDT

This message has been cleansed for anti-spam protection. Replace '++at++' in any mail addresses with the '@' symbol.