void Renderer::Normalize(CRenderTarget* pTarget, CRenderTarget* source, int normFactor) { CRenderTargetLock lock(pTarget); glDisable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT); COGLBindLock lockProgram(m_normalizeProgram->GetGLProgram(), COGL_PROGRAM_SLOT); float invNormFactor = 0.f; if (normFactor != 0) { invNormFactor = 1.f / float(normFactor); } GLint location = glGetUniformLocation(m_normalizeProgram->GetGLProgram() ->GetResourceIdentifier(), "normFactor"); glUniform1f(location, invNormFactor); COGLBindLock lock0(source->GetTarget(0), COGL_TEXTURE0_SLOT); COGLBindLock lock1(source->GetTarget(1), COGL_TEXTURE1_SLOT); COGLBindLock lock2(source->GetTarget(2), COGL_TEXTURE2_SLOT); m_fullScreenQuad->draw(); glEnable(GL_DEPTH_TEST); }
void Renderer::GatherRadianceFromLightWithShadowMap(const Avpl& avpl, CRenderTarget* pRenderTarget) { FillShadowMap(avpl); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glViewport(0, 0, m_camera->GetWidth(), m_camera->GetHeight()); COGLBindLock lockProgram(m_gatherRadianceWithSMProgram->GetGLProgram(), COGL_PROGRAM_SLOT); AVPL_STRUCT light_info; m_ubLight->UpdateData(&light_info); CRenderTargetLock lock(pRenderTarget); COGLBindLock lock0(m_shadowMap->GetShadowMapTexture(), COGL_TEXTURE0_SLOT); COGLBindLock lock1(m_gbuffer->GetPositionTextureWS(), COGL_TEXTURE1_SLOT); COGLBindLock lock2(m_gbuffer->GetNormalTexture(), COGL_TEXTURE2_SLOT); COGLBindLock lock3(m_scene->GetMaterialBuffer()->GetOGLMaterialBuffer(), COGL_TEXTURE3_SLOT); m_fullScreenQuad->draw(); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); }
void Renderer::CreateGBuffer() { GLenum buffers [3] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2}; COGLRenderTargetLock lockRenderTarget(m_gbuffer->GetRenderTarget(), 3, buffers); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); COGLBindLock lockProgram(m_createGBufferProgram->GetGLProgram(), COGL_PROGRAM_SLOT); drawScene(m_camera->GetViewMatrix(), m_camera->GetProjectionMatrix()); }
void Renderer::Add(CRenderTarget* target, CRenderTarget* source1, CRenderTarget* source2) { CRenderTargetLock lock(target); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); COGLBindLock lockProgram(m_addProgram->GetGLProgram(), COGL_PROGRAM_SLOT); COGLBindLock lock0(source1->GetTarget(0), COGL_TEXTURE0_SLOT); COGLBindLock lock1(source2->GetTarget(0), COGL_TEXTURE1_SLOT); m_fullScreenQuad->draw(); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); }
void Renderer::CalculateError() { CRenderTargetLock lock(m_errorRenderTarget.get()); if(m_scene->GetReferenceImage()) { glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); COGLBindLock lockProgram(m_errorProgram->GetGLProgram(), COGL_PROGRAM_SLOT); COGLBindLock lock0(m_resultRenderTarget->GetTarget(0), COGL_TEXTURE0_SLOT); COGLBindLock lock1(m_scene->GetReferenceImage()->GetOGLTexture(), COGL_TEXTURE1_SLOT); m_fullScreenQuad->draw(); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); } }
void Renderer::FillShadowMap(const Avpl& avpl) { glEnable(GL_DEPTH_TEST); // prevent surface acne glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.1f, 4.0f); COGLBindLock lockProgram(m_createSMProgram->GetGLProgram(), COGL_PROGRAM_SLOT); GLenum buffer[1] = {GL_NONE}; COGLRenderTargetLock lock(m_shadowMap->GetRenderTarget(), 1, buffer); glViewport(0, 0, m_shadowMap->GetShadowMapSize(), m_shadowMap->GetShadowMapSize()); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); drawScene(avpl.getViewMatrix(), avpl.getProjectionMatrix()); glViewport(0, 0, m_camera->GetWidth(), m_camera->GetHeight()); glDisable(GL_POLYGON_OFFSET_FILL); }
QString GRASS_EXPORT QgsGrass::openMapset( QString gisdbase, QString location, QString mapset ) { QgsDebugMsg( QString( "gisdbase = %1" ).arg( gisdbase.toUtf8().constData() ) ); QgsDebugMsg( QString( "location = %1" ).arg( location.toUtf8().constData() ) ); QgsDebugMsg( QString( "mapset = %1" ).arg( mapset.toUtf8().constData() ) ); QString mapsetPath = gisdbase + "/" + location + "/" + mapset; // Check if the mapset is in use QString gisBase = getenv( "GISBASE" ); if ( gisBase.isEmpty() ) return QObject::tr( "GISBASE is not set." ); QFileInfo fi( mapsetPath + "/WIND" ); if ( !fi.exists() ) { return QObject::tr( "%1 is not a GRASS mapset." ).arg( mapsetPath ); } QString lock = mapsetPath + "/.gislock"; #ifndef _MSC_VER int pid = getpid(); #else int pid = GetCurrentProcessId(); #endif QgsDebugMsg( QString( "pid = %1" ).arg( pid ) ); #ifndef Q_OS_WIN QFile lockFile( lock ); QProcess *process = new QProcess(); QString lockProgram( gisBase + "/etc/lock" ); QgsDebugMsg( QString( "pid = %1" ).arg( pid ) ); process->start( lockProgram, QStringList() << lock << QString::number( pid ) ); if ( !process->waitForStarted() ) { delete process; return QObject::tr( "Cannot start %1/etc/lock" ).arg( gisBase ); } process->waitForFinished( -1 ); int status = process->exitStatus(); QgsDebugMsg( QString( "status = %1" ).arg( status ) ); delete process; if ( status > 0 ) return QObject::tr( "Mapset is already in use." ); #endif // !WIN32 // Create temporary directory QFileInfo info( mapsetPath ); QString user = info.owner(); mTmp = QDir::tempPath() + "/grass6-" + user + "-" + QString::number( pid ); QDir dir( mTmp ); if ( dir.exists() ) { QFileInfo dirInfo( mTmp ); if ( !dirInfo.isWritable() ) { #ifndef Q_OS_WIN lockFile.remove(); #endif return QObject::tr( "Temporary directory %1 exists but is not writable" ).arg( mTmp ); } } else if ( !dir.mkdir( mTmp ) ) { #ifndef Q_OS_WIN lockFile.remove(); #endif return QObject::tr( "Cannot create temporary directory %1" ).arg( mTmp ); } // Create GISRC file QString globalGisrc = QDir::home().path() + "/.grassrc6"; mGisrc = mTmp + "/gisrc"; QgsDebugMsg( QString( "globalGisrc = %1" ).arg( globalGisrc ) ); QgsDebugMsg( QString( "mGisrc = %1" ).arg( mGisrc ) ); QFile out( mGisrc ); if ( !out.open( QIODevice::WriteOnly ) ) { #ifndef Q_OS_WIN lockFile.remove(); #endif return QObject::tr( "Cannot create %1" ).arg( mGisrc ); } QTextStream stream( &out ); QFile in( globalGisrc ); QString line; bool guiSet = false; char buf[1000]; if ( in.open( QIODevice::ReadOnly ) ) { while ( in.readLine( buf, 1000 ) != -1 ) { line = buf; if ( line.contains( "GISDBASE:" ) || line.contains( "LOCATION_NAME:" ) || line.contains( "MAPSET:" ) ) { continue; } if ( line.contains( "GRASS_GUI:" ) ) guiSet = true; stream << line; } in.close(); } line = "GISDBASE: " + gisdbase + "\n"; stream << line; line = "LOCATION_NAME: " + location + "\n"; stream << line; line = "MAPSET: " + mapset + "\n"; stream << line; if ( !guiSet ) { stream << "GRASS_GUI: wxpython\n"; } out.close(); // Set GISRC environment variable /* _Correct_ putenv() implementation is not making copy! */ putEnv( "GISRC", mGisrc ); // Reinitialize GRASS G__setenv( "GISRC", mGisrc.toUtf8().data() ); #if defined(WIN32) G__setenv( "GISDBASE", shortPath( gisdbase ).toLocal8Bit().data() ); #else G__setenv( "GISDBASE", gisdbase.toUtf8().data() ); #endif G__setenv( "LOCATION_NAME", location.toLocal8Bit().data() ); G__setenv( "MAPSET", mapset.toLocal8Bit().data() ); defaultGisdbase = gisdbase; defaultLocation = location; defaultMapset = mapset; active = true; #ifndef Q_OS_WIN // Close old mapset if ( mMapsetLock.length() > 0 ) { QFile file( mMapsetLock ); file.remove(); } #endif mMapsetLock = lock; return NULL; }