void SimObjectRenderer::setCameraMode(SimRobotCore2::Renderer::CameraMode mode) { cameraMode = mode; if(cameraMode == targetCam) { cameraTarget = Vector3<>(); updateCameraTransformation(); } }
void SimObjectRenderer::rotateCamera(float x, float y) { if(cameraMode == SimRobotCore2::Renderer::targetCam) { Vector3<> v = cameraPos - cameraTarget; Matrix3x3<> rotateY(Vector3<>(0.f, y, 0.f)); Matrix3x3<> rotateZ(Vector3<>(0.f, 0.f, x)); Vector3<> v2(sqrtf(v.x * v.x + v.y * v.y), 0.f, v.z); v2 = rotateY * v2; if(v2.x < 0.001f) { v2.x = 0.001f; v2.normalize(v.abs()); } Vector3<> v3(v.x, v.y, 0.f); v3.normalize(v2.x); v3.z = v2.z; v = rotateZ * v3; cameraPos = cameraTarget + v; } else // if(cameraMode == SimRobotCore2::Renderer::freeCam) { Vector3<> v = cameraTarget - cameraPos; Matrix3x3<> rotateY(Vector3<>(0.f, y, 0.f)); Matrix3x3<> rotateZ(Vector3<>(0.f, 0.f, -x)); Vector3<> v2(sqrtf(v.x * v.x + v.y * v.y), 0.f, v.z); v2 = rotateY * v2; if(v2.x < 0.001f) { v2.x = 0.001f; v2.normalize(v.abs()); } Vector3<> v3(v.x, v.y, 0.f); v3.normalize(v2.x); v3.z = v2.z; v = rotateZ * v3; cameraTarget = cameraPos + v; } updateCameraTransformation(); }
void SimObjectRenderer::moveCamera(float x, float y) { if(cameraMode == SimRobotCore2::Renderer::targetCam) { if(x != 0.f) rotateCamera(x, 0); if(y != 0.f) { Vector3<> v = cameraPos - cameraTarget; float len = v.abs() + y; if(len < 0.0001f) len = 0.0001f; v.normalize(len); cameraPos = cameraTarget + v; } } else // if(cameraMode == SimRobotCore2::Renderer::FREECAM) { if(x != 0.f) { Vector3<> v = cameraTarget - cameraPos; Vector3<> v2 = v ^ Vector3<>(0.f, 0.f, 1.f); v2.normalize(x); cameraTarget += v2; cameraPos += v2; } if(y != 0.f) { Vector3<> v = cameraTarget - cameraPos; v.normalize(y); cameraTarget -= v; cameraPos -= v; } } updateCameraTransformation(); }
void SimObjectRenderer::setCamera(const float* pos, const float* target) { cameraPos = Vector3<>(pos[0], pos[1], pos[2]); cameraTarget = Vector3<>(target[0], target[1], target[2]); updateCameraTransformation(); }
void SimObjectRenderer::resetCamera() { cameraPos = defaultCameraPos; cameraTarget = Vector3<>(); updateCameraTransformation(); }
void display() { static float fps = 0; frame++; int time=glutGet(GLUT_ELAPSED_TIME); if (time - timebase > 1000) { fps = frame*1000.0f/(time-timebase); timebase = time; frame = 0; } runCuda(customSimulation); char title[100]; sprintf( title, "565 NBody sim [%0.2f fps]", fps ); glutSetWindowTitle(title); glBindBuffer( GL_PIXEL_UNPACK_BUFFER, pbo); glBindTexture(GL_TEXTURE_2D, displayImage); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, field_width, field_height, GL_RGBA, GL_FLOAT, NULL); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #if VISUALIZE == 1 // VAO, shader program, and texture already bound //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //glDrawElements(GL_TRIANGLES, 6*field_width*field_height, GL_UNSIGNED_INT, 0); if (cameraToggle) updateCameraTransformation (); glUseProgram(program[HEIGHT_FIELD]); glEnableVertexAttribArray(positionLocation); glEnableVertexAttribArray(texcoordsLocation); glBindBuffer(GL_ARRAY_BUFFER, planeVBO); glVertexAttribPointer((GLuint)positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, planeTBO); glVertexAttribPointer((GLuint)texcoordsLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, planeIBO); glDrawElements(GL_TRIANGLES, 6*field_width*field_height, GL_UNSIGNED_INT, 0); glDisableVertexAttribArray(positionLocation); glDisableVertexAttribArray(texcoordsLocation); glUseProgram(program[PASS_THROUGH]); glEnableVertexAttribArray(positionLocation); glBindBuffer(GL_ARRAY_BUFFER, planetVBO); glVertexAttribPointer((GLuint)positionLocation, 4, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, planetIBO); glPointSize(4.0f); glDrawElements(GL_POINTS, N_FOR_VIS+1, GL_UNSIGNED_INT, 0); glPointSize(1.0f); glDisableVertexAttribArray(positionLocation); #endif glutPostRedisplay(); glutSwapBuffers(); }