blob: 9a76998dd79563fc59909854002429bab1a785ca [file]
#include "camera_app.h"
#include "common_hello.h"
#include "hmd_opencv_sandbox.h"
#include <iostream>
#ifndef GL_POINT_SPRITE_OES
#define GL_POINT_SPRITE_OES 0x8861
#endif
#define NUM_SAVED_SETTINGS (8)
CameraApp::settings_t g_savesettings[NUM_SAVED_SETTINGS];
CameraApp::CameraApp( CMainApplication * parentApp ) :
m_ipxUpdatePlace( 0 )
, m_frameno( 0 )
, m_opencv_p( this )
, m_maxframeno( 100000 )
, m_ipxUpdatePlaceLast( 0 )
, m_shdCharlesFloor( CONTENT_FOLDER"/charlesfloor" )
, m_shdDumb( CONTENT_FOLDER"/dumb" )
, m_shdPointCloud( CONTENT_FOLDER"/pointcloud" )
, m_shdPointCloud2( CONTENT_FOLDER"/pointcloud2" )
, m_shdWorld( CONTENT_FOLDER"/world" )
, m_shdWorld2( CONTENT_FOLDER"/world2" )
, m_shdWorld3( CONTENT_FOLDER"/world3" )
, m_vCurrentColor( 1.0, 1.0, 1.0, 1.0 )
, m_bSettingsChanged( false )
, m_iDebugTextureW( 512 )
, m_iDebugTextureH( 512 )
, m_geoDepthMap( "DepthMap" )
, m_geoCharlesFloor( "CharlesFloor" )
, m_geoPointCloud( "PointCloud" )
, m_uiPointCloudCount( 65536 * 2 )
, m_geoJeremyFloor()
, m_pDebugTextureData( 0 )
, m_lastLoadedSettingsID( 0 )
{
m_iTexture = 0;
m_parent = parentApp;
//Alireza (notice different alg than F3)
CameraApp::settings_t & savesettings_f1 = g_savesettings[0];
savesettings_f1.iShowAnts = 5;
savesettings_f1.iGeoMode = 0;
savesettings_f1.fAntSize = 2.5;
savesettings_f1.iAntEvery = -6;
savesettings_f1.bMeshAsLines = 0;
savesettings_f1.iFloorType = 0;
savesettings_f1.bGreenMode = 0;
savesettings_f1.fGeoAlpha = 1;
savesettings_f1.iStereoAlg = 2;
savesettings_f1.fAntMaxDist = 100;
savesettings_f1.fImportanceOfDist = 25;
savesettings_f1.iWhichAntShader = 1;
CameraApp::settings_t & savesettings_f2 = g_savesettings[1];
savesettings_f2.iShowAnts = 6;
savesettings_f2.iGeoMode = 0;
savesettings_f2.fAntSize = 1.5;
savesettings_f2.iAntEvery = 2;
savesettings_f2.bMeshAsLines = 0;
savesettings_f2.iFloorType = 0;
savesettings_f2.bGreenMode = 0;
savesettings_f2.fGeoAlpha = 0.65f;
savesettings_f2.iStereoAlg = 2;
savesettings_f2.fAntMaxDist = 100;
savesettings_f2.fImportanceOfDist = 10;
savesettings_f2.iWhichAntShader = 0;
CameraApp::settings_t & savesettings_f3 = g_savesettings[2];
savesettings_f3.iShowAnts = 1;
savesettings_f3.iGeoMode = 0;
savesettings_f3.fAntSize = 4.9f;
savesettings_f3.iAntEvery = 3;
savesettings_f3.bMeshAsLines = 0;
savesettings_f3.iFloorType = 0;
savesettings_f3.bGreenMode = 0;
savesettings_f3.fGeoAlpha = 0.1f;
savesettings_f3.iStereoAlg = 0;
//Eric Hope + Alireza (notice different alg)
CameraApp::settings_t & savesettings_f4 = g_savesettings[3];
savesettings_f4.iShowAnts = 7;
savesettings_f4.iGeoMode = 0;
savesettings_f4.fAntSize = 2.7f;
savesettings_f4.iAntEvery = 4;
savesettings_f4.bMeshAsLines = 1;
savesettings_f4.iFloorType = 3;
savesettings_f4.bGreenMode = 0;
savesettings_f4.fGeoAlpha = 1;
savesettings_f4.iStereoAlg = 2;
savesettings_f4.fAntMaxDist = 100;
savesettings_f4.fImportanceOfDist = 0;
savesettings_f4.iWhichAntShader = 0;
savesettings_f4.fSampleCoverage = 0;
//Shiny Through
CameraApp::settings_t & savesettings_f5 = g_savesettings[4];
savesettings_f5.iShowAnts = 0;
savesettings_f5.iGeoMode = 6;
savesettings_f5.fAntSize = 0.9f;
savesettings_f5.bMeshAsLines = 0;
savesettings_f5.iFloorType = 0;
savesettings_f5.bGreenMode = 0;
savesettings_f5.fGeoAlpha = 0.65f;
savesettings_f5.iStereoAlg = 2;
//Passthrough
CameraApp::settings_t & savesettings_f6 = g_savesettings[5];
savesettings_f6.iShowAnts = 0;
savesettings_f6.iGeoMode = 7;
savesettings_f6.fAntSize = 1;
savesettings_f6.iAntEvery = 4;
savesettings_f6.bMeshAsLines = 0;
savesettings_f6.iFloorType = 3;
savesettings_f6.bGreenMode = 0;
savesettings_f6.fGeoAlpha = 0.55f;
savesettings_f6.iStereoAlg = 2;
//Generic fire XXX THIS IS ACTUALLY UNUSED.
CameraApp::settings_t & savesettings_f7 = g_savesettings[6];
savesettings_f7.iShowAnts = 6;
savesettings_f7.iGeoMode = 0;
savesettings_f7.fAntSize = 1.5;
savesettings_f7.iAntEvery = 3;
savesettings_f7.bMeshAsLines = 0;
savesettings_f7.iFloorType = 0;
savesettings_f7.bGreenMode = 0;
savesettings_f7.fGeoAlpha = 0.65f;
savesettings_f7.iStereoAlg = 2;
savesettings_f7.fAntMaxDist = 100;
savesettings_f7.fImportanceOfDist = 15;
savesettings_f7.iWhichAntShader = 0;
//Passthrough 2.0
CameraApp::settings_t & savesettings_f8 = g_savesettings[7];
savesettings_f8.iShowAnts = 6;
savesettings_f8.iGeoMode = 0;
savesettings_f8.fAntSize = 2.5;
savesettings_f8.iAntEvery = -6;
savesettings_f8.bMeshAsLines = 0;
savesettings_f8.iFloorType = 3;
savesettings_f8.bGreenMode = 0;
savesettings_f8.fGeoAlpha = 1;
savesettings_f8.iStereoAlg = 2;
savesettings_f8.fAntMaxDist = 1.5;
savesettings_f8.fImportanceOfDist = 25;
savesettings_f8.iWhichAntShader = 0;
savesettings_f8.fSampleCoverage = 0.5;
LoadSettings( 3 );
}
CameraApp::~CameraApp()
{
if ( m_pDebugTextureData )
{
delete m_pDebugTextureData;
}
}
static void PushV4( std::vector< float > & d, float v1, float v2, float v3, float v4, float f1, float f2, float f3, float f4 )
{
d.push_back( v1 );
d.push_back( v2 );
d.push_back( v3 );
d.push_back( v4 );
d.push_back( f1 );
d.push_back( f2 );
d.push_back( f3 );
d.push_back( f4 );
}
bool CameraApp::BInit()
{
// Render floor lines
for( int floorno = 0; floorno < 2; floorno++ )
{
m_geoJeremyFloor[floorno].SetArrayProps( 0, 0, 8 );
m_geoJeremyFloor[floorno].SetArrayPropsAdvanced( 0, 0, 4, 0 );
m_geoJeremyFloor[floorno].SetArrayPropsAdvanced( 0, 1, 4, 4 );
std::vector< float > & jeremydata = m_geoJeremyFloor[floorno].GetVertexArrayPtr();
const int kNumLines = floorno?201:21;
float fRadius = (float)( floorno?80:4 );
const float floorLineColor[] = { 0.3f, 0.3f, 0.3f };
for ( int nLine = 0; nLine < kNumLines; ++nLine )
{
float val = (float)nLine / (float)(kNumLines - 1) * fRadius - 0.5f * fRadius;
PushV4( jeremydata, -fRadius / 2.0f, 0, val, 1, floorLineColor[0], floorLineColor[1], floorLineColor[2], 1 );
PushV4( jeremydata, fRadius / 2.0f, 0, val, 1, floorLineColor[0], floorLineColor[1], floorLineColor[2], 1 );
PushV4( jeremydata, val, 0, -fRadius / 2.0f, 1, floorLineColor[0], floorLineColor[1], floorLineColor[2], 1 );
PushV4( jeremydata, val, 0, fRadius / 2.0f, 1, floorLineColor[0], floorLineColor[1], floorLineColor[2], 1 );
}
m_geoJeremyFloor[floorno].SetRenderType( 0, GL_LINES );
m_geoJeremyFloor[floorno].Check();
}
m_geoCharlesFloor.SetArrayProps( 0, 0, 3 );
m_geoCharlesFloor.SetArrayProps( 1, 0, 2 );
m_geoCharlesFloor.TackVertex( 0, 0, -600, 0, -600 ); m_geoCharlesFloor.TackVertex( 1, 0, 0, 0 ); m_geoCharlesFloor.TackIndex( 0, 0 );
m_geoCharlesFloor.TackVertex( 0, 0, 600, 0, -600 ); m_geoCharlesFloor.TackVertex( 1, 0, 1, 0 ); m_geoCharlesFloor.TackIndex( 0, 1 );
m_geoCharlesFloor.TackVertex( 0, 0, -600, 0, 600 ); m_geoCharlesFloor.TackVertex( 1, 0, 0, 1 ); m_geoCharlesFloor.TackIndex( 0, 2 );
m_geoCharlesFloor.TackVertex( 0, 0, -600, 0, 600 ); m_geoCharlesFloor.TackVertex( 1, 0, 0, 1 ); m_geoCharlesFloor.TackIndex( 0, 3 );
m_geoCharlesFloor.TackVertex( 0, 0, 600, 0, -600 ); m_geoCharlesFloor.TackVertex( 1, 0, 1, 0 ); m_geoCharlesFloor.TackIndex( 0, 4 );
m_geoCharlesFloor.TackVertex( 0, 0, 600, 0, 600 ); m_geoCharlesFloor.TackVertex( 1, 0, 1, 1 ); m_geoCharlesFloor.TackIndex( 0, 5 );
m_geoCharlesFloor.SetRenderType( 0, GL_TRIANGLES );
m_geoCharlesFloor.Check();
//Point cloud
{
m_geoPointCloud.SetArrayProps( 0, 1, 8 );
m_geoPointCloud.SetArrayPropsAdvanced( 0, 0, 4, 0 ); //Position
m_geoPointCloud.SetArrayPropsAdvanced( 0, 1, 4, 4 ); //Color
m_geoPointCloud.SetRenderType( 0, GL_POINTS );
std::vector<float> & pointclouddata = m_geoPointCloud.GetVertexArrayPtr();
pointclouddata.resize( m_uiPointCloudCount * 8 );
for ( int i = 0; i < (int)m_uiPointCloudCount; i++ )
{
pointclouddata[i * 8 + 0] = i * 0.01f;
pointclouddata[i * 8 + 1] = i * 0.01f;
pointclouddata[i * 8 + 2] = i * 0.01f;
pointclouddata[i * 8 + 3] = 1;
pointclouddata[i * 8 + 4] = 1.0;
pointclouddata[i * 8 + 5] = 0.5;
pointclouddata[i * 8 + 6] = 0.0;
pointclouddata[i * 8 + 7] = 1.0;
}
m_geoPointCloud.Check();
}
glGenTextures( 1, &m_iTexture );
////////////////////////////////////////////////////////////////////////////
//For depth geometry
{
m_geoDepthMap.SetArrayProps( 0, 1, 4 );
m_geoDepthMap.SetArrayProps( 1, 0, 2 );
std::vector<float> & depth_vc = m_geoDepthMap.GetVertexArrayPtr( 0 );
std::vector<float> & depth_tc = m_geoDepthMap.GetVertexArrayPtr( 1 );
int uiDepthVertCount = DEPTHMAPX * DEPTHMAPY;
depth_tc.resize( uiDepthVertCount * 2 );
depth_vc.resize( uiDepthVertCount * 4 );
for ( int y = 0; y < DEPTHMAPY; y++ )
for ( int x = 0; x < DEPTHMAPX; x++ )
{
depth_tc[(x + y * DEPTHMAPX) * 2 + 0] = 1.0f * x / (DEPTHMAPX - 1);
depth_tc[(x + y * DEPTHMAPX) * 2 + 1] = 1.0f * y / (DEPTHMAPY - 1);
float cx = 10.0f * x / (DEPTHMAPX - 1) - 5;
float cy = 10.0f * y / (DEPTHMAPY - 1) - 5;
float sincR = sqrt( cx * cx + cy * cy );
float sinc = sin( sincR ) / sincR;
depth_vc[(x + y * DEPTHMAPX) * 4 + 0] = 2.0f * x / (DEPTHMAPY - 1) - 1.0f;
depth_vc[(x + y * DEPTHMAPX) * 4 + 1] = 1 ? nanf( "" ) : sinc;
depth_vc[(x + y * DEPTHMAPX) * 4 + 2] = 2.0f * y / (DEPTHMAPY - 1) - 1.0f;
depth_vc[(x + y * DEPTHMAPX) * 4 + 3] = 1.0;
}
//From https://github.com/cnlohr/spreadgine/blob/master/src/spreadgine_util.c:216
int dmxm1 = DEPTHMAPX - 1;
int dmym1 = DEPTHMAPY - 1;
//For GL_TRIANGLE_STRIP
m_geoDepthMap.SetRenderType( 0, GL_TRIANGLE_STRIP );
m_geoDepthMap.SetRenderType( 1, GL_LINE_STRIP );
std::vector< unsigned int > & depth_ia = m_geoDepthMap.GetIndexArrayPtr( 0 );
depth_ia.resize( DEPTHMAPX * dmym1 * 2 );
//int uiDepthIndexCount = (unsigned int)depth_ia.size();
for ( int y = 0; y < dmym1; y++ )
{
for ( int x = 0; x < DEPTHMAPX; x++ )
{
int sq = (x + y * dmxm1) * 2;
depth_ia[sq + 0] = x + y * (DEPTHMAPX);
depth_ia[sq + 1] = (x)+(y + 1) * (DEPTHMAPX);
}
}
m_geoDepthMap.TaintIndices( 0 );
std::vector< unsigned int > & depth_ia_lines = m_geoDepthMap.GetIndexArrayPtr( 1 );
depth_ia_lines.resize( DEPTHMAPX * dmym1 * 2 );
//int uiDepthIndexCountLines = (unsigned int)depth_ia_lines.size();
for ( int y = 0; y < dmym1; y++ )
{
for ( int x = 0; x < DEPTHMAPX; x += 2 )
{
int sq = (x + y * dmxm1) * 2;
depth_ia_lines[sq + 0] = x + y * (DEPTHMAPX);
depth_ia_lines[sq + 1] = (x + 1) + (y) * (DEPTHMAPX);
depth_ia_lines[sq + 2] = (x + 1) + (y + 1) * (DEPTHMAPX);
depth_ia_lines[sq + 3] = (x + 2) + (y + 1) * (DEPTHMAPX);
}
}
m_geoDepthMap.TaintIndices( 1 );
}
////////////////////////////////////////////////////////////////////////////
m_pDebugTextureData = new uint32_t[m_iDebugTextureW*m_iDebugTextureH];
glGenTextures( 1, &m_nDebugTexture );
glBindTexture( GL_TEXTURE_2D, m_nDebugTexture );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, m_iDebugTextureW, m_iDebugTextureH, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_pDebugTextureData );
glBindTexture( GL_TEXTURE_2D, 0 );
m_opencv_p.OpenCVAppStart();
return true;
}
void CameraApp::EmitDot( float x, float y, float z, float w, float r, float g, float b, float a )
{
m_ipxUpdatePlace++;
if ( m_ipxUpdatePlace == m_uiPointCloudCount )m_ipxUpdatePlace = 0;
int i = m_ipxUpdatePlace;
std::vector<float> & pointclouddata = m_geoPointCloud.GetVertexArrayPtr();
pointclouddata[i * 8 + 0] = x;
pointclouddata[i * 8 + 1] = y;
pointclouddata[i * 8 + 2] = z;
pointclouddata[i * 8 + 3] = w;
pointclouddata[i * 8 + 4] = r;
pointclouddata[i * 8 + 5] = g;
pointclouddata[i * 8 + 6] = b;
pointclouddata[i * 8 + 7] = a;
}
void CameraApp::Shutdown()
{
}
void CameraApp::AdvanceSettings( int direction )
{
CameraApp::LoadSettings( direction + m_lastLoadedSettingsID );
}
void CameraApp::LoadSettings( int demono )
{
// callers like circular wrapping
demono = ( demono % NUM_SAVED_SETTINGS + NUM_SAVED_SETTINGS ) % NUM_SAVED_SETTINGS;
dprintf( 0, "Loading settings %d\n", demono );
settings = g_savesettings[demono];
m_lastLoadedSettingsID = demono;
}
void CameraApp::KeyDown( int32_t c )
{
if ( c == 's' )
{
m_opencv_p.m_bScreenshotNext = true;
return;
}
bool bSettingsChanged = true;
switch ( c )
{
case SDLK_a: settings.iShowAnts++; break;
case SDLK_z: settings.iWhichAntShader = (settings.iWhichAntShader + 1) % 2; break;
case SDLK_r: settings.iGeoMode++; break;
case SDLK_2: settings.fAntSize += .1f; break;
case SDLK_w: if ( settings.fAntSize > 0.1 ) settings.fAntSize -= .1f; break;
case SDLK_3: settings.iAntEvery ++; break;
case SDLK_e: if ( settings.iAntEvery > -10 ) settings.iAntEvery --; break;
case SDLK_6: if ( settings.fGeoAlpha < 1.0f ) settings.fGeoAlpha += 0.05f; break;
case SDLK_y: if ( settings.fGeoAlpha > 0 ) settings.fGeoAlpha -= 0.05f; break;
case SDLK_t: settings.bMeshAsLines = !settings.bMeshAsLines; break;
case SDLK_f: settings.iFloorType = (settings.iFloorType+1)%4; break;
case SDLK_g: settings.bGreenMode = !settings.bGreenMode; break;
case SDLK_d: settings.iStereoAlg++; break;
case SDLK_7: if ( settings.fAntMaxDist < 30 ) settings.fAntMaxDist += .5; break;
case SDLK_u: if ( settings.fAntMaxDist >= 0.5 ) settings.fAntMaxDist -= .5; break;
case SDLK_8: if ( settings.fImportanceOfDist < 30 ) settings.fImportanceOfDist += .5f; break;
case SDLK_i: if ( settings.fImportanceOfDist >= 0.5f ) settings.fImportanceOfDist -= .5f; break;
case SDLK_9: if ( settings.fSampleCoverage < 1.0 ) settings.fSampleCoverage += 0.1f; break;
case SDLK_o: if ( settings.fSampleCoverage > 0 ) settings.fSampleCoverage -= 0.1f; break;
case SDLK_F1: LoadSettings( 0 ); break;
case SDLK_F2: LoadSettings( 1 ); break;
case SDLK_F3: LoadSettings( 2 ); break;
case SDLK_F4: LoadSettings( 3 ); break;
case SDLK_F5: LoadSettings( 4 ); break;
case SDLK_F6: LoadSettings( 5 ); break;
case SDLK_F7: LoadSettings( 6 ); break;
case SDLK_F8: LoadSettings( 7 ); break;
default: printf( "Unknown button pressed: %d\n", c ); bSettingsChanged = false; break;
}
if ( bSettingsChanged )
{
m_bSettingsChanged = true;
}
}
void CameraApp::UseShader( ShaderFile & shd, vr::Hmd_Eye nEye )
{
shd.Use();
glUniformMatrix4fv( UNIFORM_MODELVIEWPERSPECTIVE, 1, GL_FALSE, gCurrentViewProjection.get() );
glUniform4f( UNIFORM_EXP_COLOR, m_vCurrentColor.x, m_vCurrentColor.y, m_vCurrentColor.z, m_vCurrentColor.w );
Matrix4 ModelView = ((nEye == vr::Eye_Left) ? m_parent->m_mat4eyePosLeft : m_parent->m_mat4eyePosRight) * m_parent->m_mat4HMDPose;
glUniformMatrix4fv( UNIFORM_MODELVIEW, 1, GL_FALSE, ModelView.get() );
ModelView.invert();
glUniformMatrix4fv( UNIFORM_MODELVIEWINVERSE, 1, GL_FALSE, ModelView.get() );
Matrix4 Projection = (nEye == vr::Eye_Left) ? m_parent->m_mat4ProjectionLeft : m_parent->m_mat4ProjectionRight;
glUniformMatrix4fv( UNIFORM_PERSPECTIVE, 1, GL_FALSE, Projection.get() );
Projection.invert();
glUniformMatrix4fv( UNIFORM_PERSPECTIVEINVERSE, 1, GL_FALSE, Projection.get() );
}
void CameraApp::Prerender()
{
//Update any dots and update the render thread.
m_opencv_p.Prerender();
//Update our points with any that were written into the points array.
//Tricky: Only update dots which have changd.
{
int to_update = m_ipxUpdatePlace - m_ipxUpdatePlaceLast;
int vbo = m_geoPointCloud.GetVBO();
std::vector<float> & pointclouddata = m_geoPointCloud.GetVertexArrayPtr();
if ( to_update < 0 )
{
//Tricky: to_update has flipped.
glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferSubData( GL_ARRAY_BUFFER, (GLintptr)(sizeof( float ) * 8 * m_ipxUpdatePlaceLast), sizeof( float ) * (m_uiPointCloudCount - m_ipxUpdatePlaceLast) * 8, &pointclouddata[m_ipxUpdatePlaceLast * 8] );
glBufferSubData( GL_ARRAY_BUFFER, 0, sizeof( float ) * (m_ipxUpdatePlace), &pointclouddata[0] );
}
else if ( to_update > 0 )
{
glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferSubData( GL_ARRAY_BUFFER, (GLintptr)(sizeof( float ) * 8 * m_ipxUpdatePlaceLast), sizeof( float ) * 8 * to_update, &pointclouddata[m_ipxUpdatePlaceLast * 8] );
}
m_ipxUpdatePlaceLast = m_ipxUpdatePlace;
}
std::stringstream err;
if ( m_shdDumb.CheckShader( err ) < 0 ||
m_shdPointCloud.CheckShader( err ) < 0 ||
m_shdPointCloud2.CheckShader( err ) < 0 ||
m_shdCharlesFloor.CheckShader( err ) < 0 ||
m_shdWorld.CheckShader( err ) < 0 ||
m_shdWorld3.CheckShader( err ) < 0 ||
m_shdWorld2.CheckShader( err ) < 0
)
{
dprintf( 0, "Shader Comp Error: %s\n", err.str().c_str() );
}
}
void CameraApp::RenderScene( vr::Hmd_Eye nEye )
{
m_frameno++;
if ( settings.iFloorType == 0 )
{
//Render Floor
m_vCurrentColor = Vector4( settings.bGreenMode ? 0.0f : 1.0f, 1.0f, settings.bGreenMode ? 0.0f : 1.0f, 1.0f );
UseShader( m_shdCharlesFloor, nEye );
m_geoCharlesFloor.Render();
}
if( settings.iFloorType == 1 || settings.iFloorType == 2 )
{
//Jeremy floor
glDepthMask( false );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
m_vCurrentColor = Vector4( settings.bGreenMode ? 0.0f : 1.0f, 1.0f, settings.bGreenMode ? 0.0f : 1.0f, 1.0f );
UseShader( m_shdDumb, nEye );
glLineWidth( 1 );
m_geoJeremyFloor[settings.iFloorType-1].Render();
glDepthMask( true );
}
glBindTexture( GL_TEXTURE_2D, m_iTexture );
{
if ( settings.iGeoMode > 7 ) settings.iGeoMode = 0;
if ( settings.iGeoMode != 0 )
{
//Render depth geometry.
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
m_vCurrentColor = Vector4( settings.bGreenMode ? 0.0f : 1.0f, 1.0f, settings.bGreenMode ? 0.0f : 1.0f, settings.fGeoAlpha );
UseShader( m_shdWorld, nEye );
glLineWidth( 1.0 );
switch ( settings.iGeoMode )
{
case 1:
//Jeremy Mode
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 2.0f, -.2f, 0.06f /* 3rd parameter determines if we clip the floor */ );
m_geoDepthMap.Render( settings.bMeshAsLines ? 1 : 0 );
break;
case 2:
//Show everything.
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 20.0f, -.01f, -100.0f );
m_geoDepthMap.Render( settings.bMeshAsLines ? 1 : 0 );
break;
case 3:
case 4:
//Crazy mix
if ( settings.iGeoMode == 4 )
{
m_vCurrentColor = Vector4( 0.0, 1.0, 0.0, settings.fGeoAlpha );
UseShader( m_shdWorld, nEye );
}
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 20.0f, -.01f, -100.0f );
m_geoDepthMap.Render( 1 );
m_vCurrentColor = Vector4( 1.0, 1.0, 1.0, settings.fGeoAlpha );
UseShader( m_shdWorld, nEye );
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 1.8f, -.3f, -100.0 );
m_geoDepthMap.Render( settings.bMeshAsLines ? 1 : 0 );
break;
case 5:
//Show minimal things
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 100.0f, -99.f, -100.0f );
//glDrawElements( settings.bMeshAsLines ? GL_LINE_STRIP : GL_TRIANGLE_STRIP, m_uiDepthIndexCount, GL_UNSIGNED_INT, 0 );
glPointSize( 2 );
m_geoDepthMap.Render( 1 );
break;
case 6:
//Show everything.
UseShader( m_shdWorld2, nEye );
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 20.0f, -.01f, -100.0f );
m_geoDepthMap.Render( settings.bMeshAsLines ? 1 : 0 );
break;
case 7:
//composite.
UseShader( m_shdWorld3, nEye );
glUniform3f( m_shdWorld.GetUniformLocation( "tolforconf" ), 20.0f, -.01f, -100.0f );
m_geoDepthMap.Render( settings.bMeshAsLines ? 1 : 0 );
break;
}
m_vCurrentColor = Vector4( 1., 1., 1., 1. );
glDisable( GL_BLEND );
}
}
if ( settings.iShowAnts == 8 ) settings.iShowAnts = 0;
if ( settings.iShowAnts )
{
ShaderFile & sf = (settings.iWhichAntShader) ? m_shdPointCloud2 : m_shdPointCloud;
glEnable( GL_POINT_SPRITE_OES );
UseShader( sf, nEye );
if ( settings.fSampleCoverage > 0.05 )
{
glEnable( GL_SAMPLE_COVERAGE );
glSampleCoverageCHEW( settings.fSampleCoverage, GL_TRUE );
}
glEnable( GL_BLEND );
if ( ( settings.iShowAnts % 4 ) == 1 )
{
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glUniform4f( sf.GetUniformLocation( "particleprops" ), 0.01f, 1.0f, 0.001f, 0.0 );
}
else if ( ( settings.iShowAnts % 4 ) == 2 )
{
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
glDepthMask( false );
glUniform4f( sf.GetUniformLocation( "particleprops" ), 0.005f, 0.3f, 0.001f, 0.0 );
}
else if ( ( settings.iShowAnts % 4 ) == 3 )
{
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glUniform4f( sf.GetUniformLocation( "particleprops" ), 0.02f, 1.0f, 0.0f, 1.0 );
}
glEnable( GL_PROGRAM_POINT_SIZE );
// glBlendFunc( GL_SRC_ALPHA, GL_ONE );
// glEnable( GL_BLEND );
// glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glUniform1f( sf.GetUniformLocation("max_frameno"), (float)m_maxframeno );
glUniform1f( sf.GetUniformLocation("frameno"), (float)(m_frameno % m_maxframeno) );
glUniform4f( sf.GetUniformLocation( "antprops" ), settings.fAntSize, (float)settings.iShowAnts, settings.fAntMaxDist, 0.0 );
m_geoPointCloud.Render();
glDepthMask( true );
glDisable( GL_SAMPLE_COVERAGE );
}
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
if ( m_bSettingsChanged )
{
settings.Print();
m_bSettingsChanged = false;
}
}
void CameraApp::CompanionRender()
{
m_parent->m_shdCompanionWindowProgram.Use();
glViewport( m_parent->m_nCompanionWindowWidth / 2, 0, m_parent->m_nCompanionWindowWidth / 2, m_parent->m_nCompanionWindowHeight );
// render left eye (first half of index array )
glBindTexture( GL_TEXTURE_2D, m_nDebugTexture );
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, m_iDebugTextureW, m_iDebugTextureH, GL_RGBA, GL_UNSIGNED_BYTE, m_pDebugTextureData );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
m_parent->m_geoCompanion.Render();
}
void CameraApp::settings_t::Print()
{
dprintf( 0, "CameraApp::settings_t savesettings;\n"
"savesettings.iShowAnts = %d\n"
"savesettings.iGeoMode = %d\n"
"savesettings.fAntSize = %.3f\n"
"savesettings.iAntEvery = %d\n"
"savesettings.bMeshAsLines = %d\n"
"savesettings.iFloorType = %d\n"
"savesettings.bGreenMode = %d\n"
"savesettings.fGeoAlpha = %.3f\n"
"savesettings.iStereoAlg = %d\n"
"savesettings.fAntMaxDist = %.3f\n"
"savesettings.fImportanceOfDist = %.3f\n"
"savesettings.iWhichAntShader = %d\n"
"savesettings.fSampleCoverage = %.3f\n\n"
,
iShowAnts,
iGeoMode,
fAntSize,
iAntEvery,
bMeshAsLines,
iFloorType,
bGreenMode,
fGeoAlpha,
iStereoAlg,
fAntMaxDist,
fImportanceOfDist,
iWhichAntShader,
fSampleCoverage );
}