//********************************************************
// Syzygy is licensed under the BSD license v2
// see the file SZG_CREDITS for details
//********************************************************
// precompiled header include MUST appear as the first non-comment line
#include "arPrecompiled.h"
#include "arMesh.h"
#include "arInterfaceObject.h"
#include "arDistSceneGraphFramework.h"
#include "arSoundAPI.h"
#include "visual.h"
struct QTAudioFrequencyLevels {
int numChannels;
int numFrequencyBands;
float level[];
};
// stuff that's really specific to this app
ARfloat vertexPosition1[900];
ARfloat colors[1200];
arStructuredData* linesData = NULL;
arStructuredData* linePointsData = NULL;
int linePointsID = -1;
int visibilityID = -1;
arMatrix4 worldTransform, navTransform;
arMatrix4 local1Matrix, local2Matrix, local3Matrix, local4Matrix;
int worldTransformID[2], navTransformID[2];
int local1TransformID, local2TransformID, local3TransformID, local4TransformID;
int billboardTransformID;
arMatrix4 billboardTransform;
int lightTransformID[3];
arMatrix4 lightTransform[3];
arDistSceneGraphFramework* framework;
arInterfaceObject* interfaceObject;
const arVector3 xyz(0,0,0);
int idLoop;
void worldInit(arDistSceneGraphFramework* framework) {
// global transform, as controlled by the input device
//const string navNodeName = framework->getNavNodeName();
// drew's trick to get peer root churning
const string navNodeName = framework->getNavNodeName();
// The lights.
dgLight("light0","root",0,arVector4(0,0,1,0),arVector3(1,1,1));
dgLight("light1","root",1,arVector4(0,0,-1,0),arVector3(1,1,1));
dgLight("light2","root",2,arVector4(0,-1,0,0),arVector3(1,1,1));
dgLight("light3","root",3,arVector4(0,1,0,0),arVector3(1,1,1));
lightTransformID[0] = dgTransform("light trans 0",navNodeName,lightTransform[0]);
lightTransformID[1] = dgTransform("light trans 1",navNodeName,lightTransform[1]);
lightTransformID[2] = dgTransform("light trans 2",navNodeName,lightTransform[2]);
// object transform
worldTransformID[0] = dgTransform("world",navNodeName,worldTransform);
worldTransformID[1] = dsTransform("world",navNodeName,worldTransform);
string myParent;
// attach cube 1
local1TransformID = dgTransform("local1","world",local1Matrix);
dgTexture("texture1", "local1", "happy.ppm");
dgMaterial("material1", "texture1", arVector3(1,0.6,0.6));
arCubeMesh theMesh(local1Matrix);
theMesh.attachMesh("torus1","material1");
}
void worldAlter(QTAudioFrequencyLevels* mFreqResults){
static bool init = false;
static ar_timeval oldTime;
float factor = 1.;
if (!init)
init = true;
else
factor = ar_difftime(ar_time(),oldTime)/30000.0;
oldTime = ar_time();
// iterate though the frequency level array and though the UI elements getting
// and setting the levels appropriately
/* for (i = 0; i < mFreqResults->numChannels; i++) {
for (j = 0; j < mFreqResults->numFrequencyBands; j++) {
// the frequency levels are Float32 values between 0. and 1.
//Float32 value = (mFreqResults->level[(i * mFreqResults->numFrequencyBands) + j]);
}
} */
// Precomputing these rotation matrices would be faster, of course.
lightTransform[0] = ar_rotationMatrix('y',factor*0.005) * lightTransform[0];
lightTransform[1] = ar_rotationMatrix('x',factor*0.009) * lightTransform[1];
lightTransform[2] = ar_rotationMatrix('z',factor*0.011) * lightTransform[2];
dgTransform(lightTransformID[0], lightTransform[0]);
dgTransform(lightTransformID[1], lightTransform[1]);
dgTransform(lightTransformID[2], lightTransform[2]);
local1Matrix = ar_scaleMatrix(1, 10 * mFreqResults->level[4], 1);
dgTransform(local1TransformID,local1Matrix * !local3Matrix);
dgTransform(worldTransformID[0],worldTransform);
static int currentVis = 1;
dgVisibility(visibilityID,currentVis);
static int howMany = 0;
if (++howMany>30){
currentVis = 1-currentVis;
howMany = 0;
}
}
extern "C" {
int visual_init(int, char**);
}
int visual_init(int argc, char* argv[]) {
// We could dispense with the pointer, but it *might* cause that
// intermittent constructor-hang. To be tested more.
framework = new arDistSceneGraphFramework;
// MUST set the buffer swap mode BEFORE init!
framework->setAutoBufferSwap(false);
if (!framework->init(argc,argv)){
return 1;
}
// Where we can put the textures and sounds.
framework->setDataBundlePath("SZG_DATA", "cosmos");
interfaceObject = new arInterfaceObject();
interfaceObject->setInputDevice(framework->getInputNode());
// The following is VERY important... otherwise the navigation is
// WAY too fast.
interfaceObject->setSpeedMultiplier(0.15);
worldInit(framework, peer); */
worldInit(framework);
// Configure stereo view.
framework->setEyeSpacing( 6/(2.54*12) );
framework->setClipPlanes( .3, 1000. );
framework->setUnitConversion( 1. );
// More initializing.
if (!framework->start() || !interfaceObject->start()){
return 1;
}
// Place scene in the center of the front wall.
interfaceObject->setNavMatrix(ar_translationMatrix(0,5,-5));
//idLoop = dsLoop("ambience", "world", "dre.mp3", 1, 1, xyz);
return 1;
}
extern "C" {
int visual_loop(QTAudioFrequencyLevels*);
}
int visual_loop(QTAudioFrequencyLevels* mFreqResults) {
navTransform = interfaceObject->getNavMatrix().inverse();
worldTransform = interfaceObject->getObjectMatrix();
ar_setNavMatrix( navTransform );
// No lock needed, since there's only one thread.
dgTransform(worldTransformID[0], worldTransform);
dsTransform(worldTransformID[1], worldTransform);
framework->loadNavMatrix();
worldAlter(mFreqResults);
// DO NOT TURN THE AMBIENT SOUND ON/OFF, THIS IS A NICE TEST OF
// "IS SPATIALIZED SOUNDS WORKING" AND TURNING ON/OFF MESSES THAT
// UP.
//(void)dsLoop(idLoop, "dre.mp3", 1, 1, xyz);
// Change viewpoint.
framework->setViewer();
framework->setPlayer();
// and now we go ahead and force a buffer swap (which we are controlling
// manually)
framework->swapBuffers();
return 0;
}