RefractiveIndex/example/RefractiveIndex.cpp

430 lines
12 KiB
C++
Raw Permalink Normal View History

2012-02-21 01:34:24 +01:00
////also the new shit////
2012-01-24 15:13:07 +01:00
#include "RefractiveIndex.h"
#include "ShadowScapesAnalysis.h"
#include "RelaxRateAnalysis.h"
#include "IResponseAnalysis.h"
#include "ShapeFromShadingAnalysis.h"
#include "StrobeAnalysis.h"
2012-01-24 16:52:22 +01:00
#include "CamNoiseAnalysis.h"
#include "ColorSingleAnalysis.h"
#include "ColorMultiAnalysis.h"
2012-01-24 16:52:22 +01:00
#include "DiffNoiseAnalysis.h"
2012-01-24 15:13:07 +01:00
2012-02-11 18:54:46 +01:00
#include "ofxXmlSettings.h"
2012-02-21 01:34:24 +01:00
2012-05-25 13:52:22 +02:00
#include "ofxArcBall.h"
#include <stdio.h>
#include <stdlib.h>
2012-02-28 20:13:08 +01:00
#define CAMERA_ID 0
2012-01-24 15:13:07 +01:00
#define CAMERA_ACQU_WIDTH 640
#define CAMERA_ACQU_HEIGHT 480
#define LOCATION "MIDDLESBOROUGH"
2012-02-11 18:54:46 +01:00
#define ISTATE_UNDEF 0xEEEE
#define ISTATE_START 0xAAAA
#define ISTATE_STOP 0xBBBB
#define ISTATE_TRANSITION 0xCCCC
#define ISTATE_END 0xDDDD
2012-02-11 18:54:46 +01:00
2012-05-25 13:52:22 +02:00
static const int subdiv_pixels = 4;
static const int VID_W = 640, VID_H = 480;
static const int VERTICES_X = VID_W / subdiv_pixels, VERTICES_Y = VID_W / subdiv_pixels;
static const int TRI_W = 1000;
int draw_style = FACE;
#define ALGO_1 1
#define ALGO_2 2
#define ALGO_3 3
#define ALGO_4 4
int algo = ALGO_2;
float scale = 1.f;
2012-02-11 18:54:46 +01:00
int _state = ISTATE_UNDEF;
int RefractiveIndex::_mode;
2012-01-24 16:52:22 +01:00
ofPixels RefractiveIndex::_pixels;
ofVideoGrabber RefractiveIndex::_vidGrabber;
int RefractiveIndex::_vid_w, RefractiveIndex::_vid_h, RefractiveIndex::_vid_id;
bool RefractiveIndex::_vid_stream_open;
bool RefractiveIndex::_vid_toggle_on;
string RefractiveIndex::_location;
ofxXmlSettings RefractiveIndex::XML;
2012-02-11 18:54:46 +01:00
2012-05-25 13:52:22 +02:00
ofShader RefractiveIndex::_shader;
ofVboMesh RefractiveIndex::_mesh_vbo;
ofxArcBall RefractiveIndex::cam;
string msg;
void RefractiveIndex::setup_shader_vbo()
{
int vertices_per_frame = XML.getValue("config:algorithms:vertices_per_frame", TRI_W);
int pixel_per_vertex = XML.getValue("config:algorithms:pixel_per_vertex", subdiv_pixels);
int vertices_X = _vid_w / pixel_per_vertex, vertices_Y = _vid_h / pixel_per_vertex;
// VBO
for(int i = 0; i < vertices_X; i++){
for(int j = 0; j < vertices_Y; j++) {
_verts.push_back(ofVec3f((i / (float)vertices_X) * vertices_per_frame, (j / (float) vertices_Y) * vertices_per_frame, 0.0f));
_tex.push_back(ofVec2f(i / (float)vertices_X * _vid_w, j / (float) vertices_Y * _vid_h));
if( ( i + 1 < vertices_X ) && ( j + 1 < vertices_Y ) ) {
//triangle #1
_ind.push_back( (i+0) * vertices_Y + (j+0) );
_ind.push_back( (i+1) * vertices_Y + (j+0) );
_ind.push_back( (i+1) * vertices_Y + (j+1) );
//triangle #2
_ind.push_back( (i+1) * vertices_Y + (j+1) );
_ind.push_back( (i+0) * vertices_Y + (j+1) );
_ind.push_back( (i+0) * vertices_Y + (j+0) );
}
}
}
//ofEnableNormalizedTexCoords();
_mesh_vbo.addVertices(_verts);
_mesh_vbo.addTexCoords(_tex);
_mesh_vbo.addIndices(_ind);
_mesh_vbo.setMode(OF_PRIMITIVE_TRIANGLES);
// geometry shader
_shader.setGeometryInputType(GL_TRIANGLES);
_shader.setGeometryOutputType(GL_TRIANGLES);
_shader.setGeometryOutputCount(3);
_shader.load("dviid/rfi.vert.glsl", "dviid/rfi.frag.glsl", "dviid/rfi.geom.glsl");
printf("Maximum number of output vertices support is: %i\n", _shader.getGeometryMaxOutputCount());
}
2012-01-24 15:13:07 +01:00
void RefractiveIndex::setup()
{
2012-05-25 13:52:22 +02:00
ofSetLogLevel(OF_LOG_VERBOSE);
ofHideCursor();
2012-02-11 18:54:46 +01:00
bool save_config = false;
cout << "Loading configuration..." << endl;
if(XML.loadFile("config.refindx") == false) {
2012-02-11 18:54:46 +01:00
ofLog(OF_LOG_ERROR) << "error loading config - using default.";
save_config = true;
} else {
XML.loadFile("config.refindx");
2012-02-11 18:54:46 +01:00
}
// <mode>
string m = XML.getValue("config:mode", "analysing");
_mode = (m == "analysing" ? MODE_ANALYSING : (m == "drawing" ? MODE_DRAWING : MODE_ANALYSING));
2012-02-11 18:54:46 +01:00
// <camera>
_vid_id = XML.getValue("config:camera:id", CAMERA_ID);
cout << "_vid_id: " << _vid_id << endl;
_vid_w = XML.getValue("config:camera:width", CAMERA_ACQU_WIDTH);
_vid_h = XML.getValue("config:camera:height", CAMERA_ACQU_HEIGHT);
2012-02-11 18:54:46 +01:00
// <display>
int fps = XML.getValue("config:display:fps", 30);
// <location>
_location = XML.getValue("config:locale:name", LOCATION);
cout << "Configuring..." << endl;
// display
cout << "> display" << endl;
ofSetFrameRate(fps);
2012-02-11 18:54:46 +01:00
if(fps > 30) {
ofSetVerticalSync(FALSE);
} else {
ofSetVerticalSync(TRUE);
}
cout << "* fps = " << fps << endl;
2012-01-24 15:13:07 +01:00
// camera
2012-02-11 18:54:46 +01:00
cout << "> camera" << endl;
cout << "* cam id = " << _vid_id << endl;
cout << "* cam width = " << _vid_w << endl;
cout << "* cam height = " << _vid_h << endl;
if(_mode == MODE_ANALYSING) {
_vid_stream_open = false;
setup_camera();
}
2012-02-11 18:54:46 +01:00
cout << "RRRRRREADY!" << endl;
2012-01-24 15:13:07 +01:00
_analysisAdapator = NULL;
2012-05-25 13:52:22 +02:00
_pixels.allocate(_vid_w, _vid_h, OF_IMAGE_COLOR_ALPHA);
setup_shader_vbo();
2012-02-11 18:54:46 +01:00
//TODO: whichever one of these is first - it always runs twice ?
2012-02-11 18:54:46 +01:00
_analysisVector.push_back(new ShadowScapesAnalysis(V)); //1
_analysisVector.push_back(new ShadowScapesAnalysis(H)); //2
_analysisVector.push_back(new ShadowScapesAnalysis(D)); //3
_analysisVector.push_back(new RelaxRateAnalysis()); //4
_analysisVector.push_back(new IResponseAnalysis()); //5
_analysisVector.push_back(new ShapeFromShadingAnalysis()); //6
_analysisVector.push_back(new StrobeAnalysis()); //7
_analysisVector.push_back(new CamNoiseAnalysis()); //8
_analysisVector.push_back(new ColorSingleAnalysis()); //9
_analysisVector.push_back(new ColorMultiAnalysis()); //10
_analysisVector.push_back(new DiffNoiseAnalysis()); //11
2012-05-25 13:52:22 +02:00
_currentAnalysis = NULL;
_state = ISTATE_UNDEF;
2012-05-25 13:52:22 +02:00
// disbale <ESC> ?
//ofSetEscapeQuitsApp(false);
2012-02-11 18:54:46 +01:00
}
2012-01-24 15:13:07 +01:00
void RefractiveIndex::analysis_cb(string & analysis)
2012-02-11 18:54:46 +01:00
{
assert(analysis == _currentAnalysis->_name);
2012-02-11 18:54:46 +01:00
_state = ISTATE_STOP;
2012-02-11 18:54:46 +01:00
}
2012-01-24 15:13:07 +01:00
2012-02-11 18:54:46 +01:00
void RefractiveIndex::start_analysis()
{
ofAddListener(_currentAnalysis->_synthesize_cb, this, &RefractiveIndex::analysis_cb);
_analysisAdapator = new AnalysisAdaptor(_currentAnalysis);
2012-02-11 18:54:46 +01:00
_currentAnalysis->setup(_vid_w, _vid_h);
_analysisAdapator->start();
2012-02-11 18:54:46 +01:00
}
2012-01-24 16:52:22 +01:00
2012-02-11 18:54:46 +01:00
void RefractiveIndex::stop_analysis()
{
if(_analysisAdapator == NULL) return;
2012-02-11 18:54:46 +01:00
_analysisAdapator->stop(); //blocking
ofRemoveListener(_currentAnalysis->_synthesize_cb, this, &RefractiveIndex::analysis_cb);
2012-01-24 15:13:07 +01:00
_currentAnalysis = NULL;
delete _analysisAdapator;
_analysisAdapator = NULL;
2012-02-11 18:54:46 +01:00
}
2012-01-24 16:52:22 +01:00
void RefractiveIndex::state_analysis()
2012-02-11 18:54:46 +01:00
{
switch (_state) {
case ISTATE_START:
2012-02-11 18:54:46 +01:00
start_analysis();
_state = ISTATE_UNDEF;
break;
case ISTATE_TRANSITION:
if(_currentAnalysisIndx >= _analysisVector.size()) {
_currentAnalysisIndx = 0;
2012-02-21 21:18:25 +01:00
_currentAnalysis = _analysisVector.at(_currentAnalysisIndx++);
_state = ISTATE_START;
2012-02-11 18:54:46 +01:00
} else {
_currentAnalysis = _analysisVector.at(_currentAnalysisIndx++);
_state = ISTATE_START;
2012-02-11 18:54:46 +01:00
}
break;
case ISTATE_STOP:
stop_analysis(); // blocking
if(_mode == MODE_DRAWING)
_state = ISTATE_UNDEF;
else
_state = ISTATE_TRANSITION;
break;
2012-02-11 18:54:46 +01:00
case ISTATE_END:
if(_mode == MODE_ANALYSING)
stop_camera();
::exit(1);
2012-02-11 18:54:46 +01:00
break;
case ISTATE_UNDEF:
break;
default:
break;
}
2012-01-24 15:13:07 +01:00
}
void RefractiveIndex::update()
2012-02-21 21:18:25 +01:00
{
state_analysis();
2012-01-24 15:13:07 +01:00
}
void RefractiveIndex::draw()
2012-05-25 13:52:22 +02:00
{
2012-02-21 21:18:25 +01:00
// black
2012-01-24 16:52:22 +01:00
ofBackground(0, 0, 0);
2012-01-24 15:13:07 +01:00
if(_currentAnalysis)
_currentAnalysis->draw();
}
void RefractiveIndex::setup_camera()
{
stop_camera();
2012-02-21 19:31:58 +01:00
// THIS IS LOADED IN FROM THE XML FILE SETTINGS
2012-02-21 19:31:58 +01:00
_vidGrabber.setDeviceID(_vid_id);
_vidGrabber.listDevices();
2012-02-21 19:31:58 +01:00
if(!_vidGrabber.initGrabber(_vid_w, _vid_h)) {
2012-01-24 15:13:07 +01:00
ofLog(OF_LOG_ERROR) << "RefractiveIndex::setup_camera - could not initialise grabber";
return;
2012-01-24 16:52:22 +01:00
}
2012-02-21 19:31:58 +01:00
_vidGrabber.setVerbose(true);
_vidGrabber.setUseTexture(false);
2012-01-24 15:13:07 +01:00
_vid_stream_open = true;
2012-02-21 19:31:58 +01:00
cout << "CAMERA SETUP " << endl;
return;
2012-01-24 15:13:07 +01:00
}
void RefractiveIndex::stop_camera()
{
if(_vid_stream_open) {
_vidGrabber.close();
_vid_stream_open = false;
}
}
2012-01-24 15:13:07 +01:00
void RefractiveIndex::keyPressed (int key)
{
2012-05-25 13:52:22 +02:00
2012-01-24 15:13:07 +01:00
if( key =='f')
2012-01-24 16:52:22 +01:00
ofToggleFullscreen();
2012-02-21 21:18:25 +01:00
if(key == 'x')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysis = NULL;
_state = ISTATE_UNDEF;
}
else if(key == '1')
{
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 0;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '2')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 1;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '3')
{
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 2;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '4')
{
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 3;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
else if(key == '5')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 4;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '6')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 5;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '7')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 6;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '8')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 7;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '9')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 8;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
2012-02-21 21:18:25 +01:00
else if(key == '0')
{
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 9;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
else if(key == 'q')
{
2012-02-21 21:18:25 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
_currentAnalysisIndx = 10;
if(!_currentAnalysis)
_state = ISTATE_TRANSITION;
}
}
void RefractiveIndex::exit()
{
2012-02-27 19:39:35 +01:00
if(_currentAnalysis)
_analysisAdapator->stop();
stop_camera();
2012-02-11 18:54:46 +01:00
}