// // This function is called when the window needs redrawing. // static void Display(void) { // Select correct buffer for this context. glDrawBuffer(GL_BACK); glClear(GL_COLOR_BUFFER_BIT); // Clear the buffers for new frame. arglDispImage(gARTImage, &gARTCparam, 1.0, gArglSettings); // zoom = 1.0. arVideoCapNext(); gARTImage = NULL; // Image data is no longer valid after calling arVideoCapNext(). if (gTarget != NULL) { glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); beginOrtho2D(gARTCparam.xsize, gARTCparam.ysize); glLineWidth(2.0f); glColor3d(0.0, 1.0, 0.0); lineSeg(gTarget->vertex[0][0], gTarget->vertex[0][1], gTarget->vertex[1][0], gTarget->vertex[1][1], gArglSettings, gARTCparam, 1.0); lineSeg(gTarget->vertex[3][0], gTarget->vertex[3][1], gTarget->vertex[0][0], gTarget->vertex[0][1], gArglSettings, gARTCparam, 1.0); glColor3d(1.0, 0.0, 0.0); lineSeg(gTarget->vertex[1][0], gTarget->vertex[1][1], gTarget->vertex[2][0], gTarget->vertex[2][1], gArglSettings, gARTCparam, 1.0); lineSeg(gTarget->vertex[2][0], gTarget->vertex[2][1], gTarget->vertex[3][0], gTarget->vertex[3][1], gArglSettings, gARTCparam, 1.0); endOrtho2D(); } glutSwapBuffers(); }
bool CHUDTagNames::ProjectOnSphere(Vec3 &rvWorldPos,const AABB &rBBox) { /* SAuxGeomRenderFlags oldRF = gEnv->pRenderer->GetIRenderAuxGeom()->GetRenderFlags(); SAuxGeomRenderFlags newRF; newRF.SetAlphaBlendMode(e_AlphaBlended); newRF.SetDepthWriteFlag(e_DepthWriteOff); gEnv->pRenderer->GetIRenderAuxGeom()->SetRenderFlags(newRF); gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere((rBBox.min+rBBox.max)*0.5f,((rBBox.max-rBBox.min)*0.5f).len(),ColorB(255,0,255,64),true); gEnv->pRenderer->GetIRenderAuxGeom()->SetRenderFlags(oldRF);*/ Vec3 vCamPos = gEnv->pSystem->GetViewCamera().GetPosition(); Sphere sphere((rBBox.min+rBBox.max)*0.5f,((rBBox.max-rBBox.min)*0.5f).len()); // Project from helper position to campos Lineseg lineSeg(rvWorldPos,vCamPos); Vec3 v0,v1; if(Intersect::Lineseg_Sphere(lineSeg,sphere,v0,v1) > 1) { // A result is found, let's use it Vec3 vScreenSpace; gEnv->pRenderer->ProjectToScreen(v1.x,v1.y,v1.z,&vScreenSpace.x,&vScreenSpace.y,&vScreenSpace.z); if(vScreenSpace.z >= 0.0f) { rvWorldPos = v1; } else { return true; } } if((vCamPos-sphere.center).len() <= sphere.radius) { // We are inside the sphere, we can't project on it, so let's draw on top return true; } return false; }
void PolygonLine :: computeIntersectionPoints(Line *l, std :: vector< FloatArray > &oIntersectionPoints) { printf("Warning: entering PolygonLine :: computeIntersectionPoints(Line *l, std::vector< FloatArray > &oIntersectionPoints).\n"); #ifdef __BOOST_MODULE int numSeg = this->giveNrVertices() - 1; // Segment bPoint2 lineP1( l->giveVertex ( 1 )->at(1), l->giveVertex ( 1 )->at(2) ); bPoint2 lineP2( l->giveVertex ( 2 )->at(1), l->giveVertex ( 2 )->at(2) ); bSeg2 lineSeg(lineP1, lineP2); double distTol = 1.0e-9; bool foundOverlap = false; // Loop over the crack segments and test each segment for // overlap with the element for ( int segId = 1; segId <= numSeg; segId++ ) { // Crack segment bPoint2 crackP1( this->giveVertex ( segId )->at(1), this->giveVertex ( segId )->at(2) ); bPoint2 crackP2( this->giveVertex ( segId + 1 )->at(1), this->giveVertex ( segId + 1 )->at(2) ); bSeg2 crackSeg(crackP1, crackP2); bPoint2 intersectionPoint(0.0, 0.0); double d = bDist(crackSeg, lineSeg, & intersectionPoint); if ( d < distTol ) { if ( !foundOverlap ) { foundOverlap = true; oIntersectionPoints.emplace_back({intersectionPoint.x(), intersectionPoint.y()}); } } } #endif }
//----------------------------------------------------------------------------- //! //----------------------------------------------------------------------------- qreal tTideGraph::GetHeightAtTime( qreal time ) { time = qBound( (qreal)0.0, time, (qreal)1.0 ); qreal height = 0; // search for the tide height at this time from the source data for( int i = 0; i < m_TideHeights.size() - 1; ++i ) { if( (m_TideHeights.at(i).x() <= time) && (m_TideHeights.at(i + 1).x() >= time) ) { // found the position in the data table // linearly interpolate QLineF lineSeg( m_TideHeights.at(i), m_TideHeights.at(i + 1) ); qreal t = (time - lineSeg.x1()) / lineSeg.dx(); height = lineSeg.pointAt( t ).y(); break; } } return height; }
GameObject* PickObject(const Vec2f& mouseScreen) { // Get object carried by player - don't pick Ve1Object* carried = 0; Player* player = GetLocalPlayer(); if (player) { carried = player->GetCarrying(); } Vec3f mouseWorldNear; Vec3f mouseWorldFar; Unproject(mouseScreen, 0, &mouseWorldNear); Unproject(mouseScreen, 1, &mouseWorldFar); LineSeg lineSeg(mouseWorldNear, mouseWorldFar); GameObject* selectedObj = 0; GameObjects* objs = TheGame::Instance()->GetGameObjects(); float bestDist = 9e20f; for (GameObjects::iterator it = objs->begin(); it != objs->end(); ++it) { GameObject* pgo = it->second; Assert(pgo); Ve1Object* v = dynamic_cast<Ve1Object*>(pgo); Assert(v); if (!v->IsPickable()) { #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " is not pickable.\n"; #endif continue; } if (v == carried) { // Can't select it then! std::cout << "Skipping carried object " << *v << "\n"; continue; } const AABB& aabb = pgo->GetAABB(); if (Clip(lineSeg, aabb, 0)) { #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " IS PICKED!\n"; #endif // Line seg intersects this box // Choose object whose centre (position) is closest to line seg..? // float dist = LineSeg(mouseWorldNear, mouseWorldFar).SqDist(pgo->GetPos()); float dist = (mouseWorldNear - pgo->GetPos()).SqLen(); // pick closest // Treat skybox as least attractive option, followed by terrain if (dynamic_cast<Skybox*>(v)) { #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " skybox so treated as far away\n"; #endif dist = 9e19f; } else if (dynamic_cast<Terrain*>(v)) { #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " terrain so treated as far away\n"; #endif dist = 9e18f; } #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " sqDist: " << dist << "\n"; #endif if (dist < bestDist) { #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " AND IS CLOSEST!\n"; #endif bestDist = dist; selectedObj = pgo; } } else { #ifdef PICK_DEBUG std::cout << " Obj " << pgo->GetId() << " is not picked.\n"; #endif } } return selectedObj; }