void RodSoundApp::mouseDown(MouseEvent event) { if (event.isRight()) { // Set targetPos to the ControlPoint we just clicked if (!r) return; Vec2i mouse = event.getPos(); Vec2i windowSize = getWindowSize(); Ray ray = cam.generateRay((real)mouse.x/windowSize.x, 1.0 - (real)mouse.y/windowSize.y, getWindowAspectRatio()); real tmin = INFINITY; bool any = false; for (int i=0; i<r->numCPs(); i++) { // A bit slow, but beats keeping a KD-Tree updated Sphere s(EtoC(r->cur().POS(i)), constants::radius * 1.5); float t; if (s.intersect(ray, &t) && t < tmin) { any = true; tmin = t; } } if (!any) return; targetPos = ray.calcPosition(tmin); cam.lookAt(targetPos); } else { if (!running) return; isMouseDown = true; mouseDrag(event); } }
void gpuPSApp::computeAttractorPosition() { // The attractor is positioned at the intersection of a ray // from the mouse to a plane perpendicular to the camera. float t = 0; Vec3f right, up; mMayaCam.getCamera().getBillboardVectors(&right, &up); CameraPersp cam = mMayaCam.getCamera(); float u = mMousePos.x / (float) getWindowWidth(); float v = mMousePos.y / (float) getWindowHeight(); Ray ray = cam.generateRay(u , 1.0f - v, cam.getAspectRatio() ); if (ray.calcPlaneIntersection(Vec3f(0.0f,0.0f,0.0f), right.cross(up), &t)) { mAttractor.set(ray.calcPosition(t)); } }
void RodSoundApp::mouseDrag(MouseEvent event) { if (!running) return; Vec2i mouse = event.getPos(); Vec2i windowSize = getWindowSize(); Ray r = cam.generateRay((real)mouse.x/windowSize.x, 1.0 - (real)mouse.y/windowSize.y, getWindowAspectRatio()); float t; if(!r.calcPlaneIntersection(targetPos, targetPos-eyePos, &t)) { std::cerr << "Mouse ray did not intersect plane!\n"; } mousePosition = r.calcPosition(t); }
void FiretrailApp::update() { const auto ray = mCamera.generateRay(getMousePos() - getWindowPos(), getWindowSize()); float result = .0f; ray.calcPlaneIntersection(vec3(.0f, .0f, 5.0f), vec3(.0f, -2.0f, 1.0f), &result); mHeadPosition += (ray.calcPosition(result) - mHeadPosition) * .8f; mSpline.pushPoint(mHeadPosition); const auto length = mSpline.getLength(); if (length <= .0f) return; auto mappedPosAttrib = mVboMesh->mapAttrib3f( geom::POSITION ); const auto d = min(mMaxDSlice, length / (float)NUM_SPLINE_NODES); for (size_t i = 0; i < NUM_SPLINE_NODES; ++i) { *mappedPosAttrib++ = mSpline.positionAtLength(d * i); } mappedPosAttrib.unmap(); mFps = getAverageFps(); if (mRecordingMovie) { if( mMovieExporter && getElapsedFrames() > 1 && getElapsedFrames() < MAX_MOVIE_FRAMES ) { mMovieExporter->addFrame( copyWindowSurface() ); } else if( mMovieExporter && getElapsedFrames() >= MAX_MOVIE_FRAMES ) { endMovieRecording(); } } }