void StereoMeshEntryExitPoints::process() { // retrieve input geometry const MeshListGeometry* meshListGeometry = dynamic_cast<const MeshListGeometry*>(inport_.getData()); const MeshGeometry* meshGeometry = dynamic_cast<const MeshGeometry*>(inport_.getData()); if (meshListGeometry) { geometry_ = *meshListGeometry; } else if (meshGeometry) { geometry_.clear(); geometry_.addMesh(*meshGeometry); } else { LERROR("Geometry of type MeshListGeometry/MeshGeometry expected."); return; } // A new volume was loaded if(inport_.hasChanged()) cameraHandler_->adaptInteractionToScene(geometry_); // set modelview and projection matrices glMatrixMode(GL_PROJECTION); glPushMatrix(); tgt::loadMatrix(camera_.get().getProjectionMatrix(entryPort_.isReady() ? entryPort_.getSize() : exitPort_.getSize())); glMatrixMode(GL_MODELVIEW); glPushMatrix(); tgt::loadMatrix(camera_.get().getViewMatrix()); // enable culling if(useCulling_.get()) glEnable(GL_CULL_FACE); // activate shader program shaderProgram_->activate(); tgt::Camera cam = camera_.get(); setGlobalShaderParameters(shaderProgram_, &cam); LGL_ERROR; // // render back texture // if (exitPort_.isReady()) { exitPort_.activateTarget(); glClearDepth(0.0f); glDepthFunc(GL_GREATER); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCullFace(GL_FRONT); geometry_.render(); LGL_ERROR; exitPort_.deactivateTarget(); glDepthFunc(GL_LESS); glClearDepth(1.0f); LGL_ERROR; } // // render front texture // // use temporary target if necessary if (entryPort_.isReady()) { if (!jitterEntryPoints_.get()) entryPort_.activateTarget(); else tmpPort_.activateTarget(); LGL_ERROR; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCullFace(GL_BACK); geometry_.render(); LGL_ERROR; if (supportCameraInsideVolume_.get()) { // clip proxy geometry against near-plane float nearPlaneDistToOrigin = tgt::dot(camera_.get().getPosition(), -camera_.get().getLook()) - camera_.get().getNearDist() - 0.0001f; MeshListGeometry closingFaces; double epsilon = static_cast<double>(tgt::length(geometry_.getBoundingBox().diagonal())) * 1e-6; geometry_.clip(tgt::vec4(-camera_.get().getLook(), nearPlaneDistToOrigin), closingFaces, epsilon); // render closing face separately, if not empty if (!closingFaces.empty()) { // project closing faces onto near-plane tgt::mat4 trafoMatrix = camera_.get().getProjectionMatrix(entryPort_.getSize()) * camera_.get().getViewMatrix(); closingFaces.transform(trafoMatrix); // set z-coord of closing face vertices to 0.0 in order to avoid near-plane clipping tgt::mat4 zTrafo = tgt::mat4::createIdentity(); zTrafo[2][2] = 0.f; closingFaces.transform(zTrafo); //render closing faces with identity transformations glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); closingFaces.render(); LGL_ERROR; } } if (!jitterEntryPoints_.get()) entryPort_.deactivateTarget(); else tmpPort_.deactivateTarget(); } // deactivate shader program shaderProgram_->deactivate(); // restore OpenGL state glCullFace(GL_BACK); glDisable(GL_CULL_FACE); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); LGL_ERROR; if (entryPort_.isReady()) { // jittering of entry points if (jitterEntryPoints_.get()) jitterEntryPoints(); entryPort_.deactivateTarget(); } TextureUnit::setZeroUnit(); LGL_ERROR; }