void FPSCamera::move(){ if (normalKeys['w']){ fTriple t = fTriple(cameraFront); t.vector_scale(cameraSpeed); cameraPosition.incr(t); } if (normalKeys['s']){ fTriple t = fTriple(cameraFront); t.vector_scale(-cameraSpeed); cameraPosition.incr(t); } if (normalKeys['a']){ fTriple t = fTriple(cameraFront); t.vector_cross(cameraTilt); t.vector_scale(-cameraSpeed); t.vector_normalize(); cameraPosition.incr(t); } if (normalKeys['d']){ fTriple t = fTriple(cameraFront); t.vector_cross(cameraTilt); t.vector_scale(cameraSpeed); t.vector_normalize(); cameraPosition.incr(t); } }
FPSCamera::FPSCamera() { std::fill_n(specialKeys, 128, false); std::fill_n(normalKeys, 256, false); cameraSpeed = 2.5; cameraPosition = fTriple(3.0f, 0.0f, 3.0f); cameraFront = fTriple(0.0f, 0.0f, -1.0f); cameraTilt = fTriple(0.0f, 1.0f, 0.0f); }
// ============================================== // // Load a mesh material from a file t_error ResourceManager::LoadMeshMaterial (const char* filename, Mesh* mesh) { // load the mesh material file ifstream fileHandle( filename ); if ( !fileHandle.is_open() ) { Log( str( format( "Error opening material file (%1%)" ) % filename ), LOG_ERROR ); throw BadFileException(filename); } // parse mtl file string buffer; while ( fileHandle.good() ) { getline( fileHandle, buffer ); if ( buffer.empty() ) continue; // setup tokenizer CharSeparator tokenSeparator( " \t" ); CharTokenizer tokens( buffer, tokenSeparator ); CharTokenizer::iterator token = tokens.begin(); CharTokenizer::iterator lastToken = tokens.end(); // Log ( str( format( "buffer: %1%" ) % (buffer) ) ); // Log ( str( format( "token: %1%" ) % (*token) ) ); if ( (*token)[0] == '#' ) { continue; } // comment else if ( (*token) == "Ka" ) { // ambient colour float r = tokenToFloat(++token); float g = tokenToFloat(++token); float b = tokenToFloat(++token); Log( str( format( "Ka: %1%,%2%,%3%" ) % r % g % b ), LOG_DEBUG ); mesh->color_ambient = fTriple( r, g, b ); } else if ( (*token) == "Kd" ) { // diffuse colour float r = tokenToFloat(++token); float g = tokenToFloat(++token); float b = tokenToFloat(++token); Log( str( format( "Kd: %1%,%2%,%3%" ) % r % g % b ), LOG_DEBUG ); mesh->color_diffuse = fTriple( r, g, b ); } else if ( (*token) == "Ks" ) { // specular colour float r = tokenToFloat(++token); float g = tokenToFloat(++token); float b = tokenToFloat(++token); Log( str( format( "Ks: %1%,%2%,%3%" ) % r % g % b ), LOG_DEBUG ); mesh->color_specular = fTriple( r, g, b ); } else if ( (*token) == "map_Kd" ) { // texture // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // TODO: load texture in resource mgr; use a lookup table to find the gl id and point to that string texFilename = *(++token); mesh->loadTexture( texFilename.c_str(), MeshRenderData::MESH_RENDER_TEXTURE ); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } else if ( (*token) == "bump" ) { // bumpmap string texFilename = *(++token); mesh->loadTexture( texFilename.c_str(), MeshRenderData::MESH_RENDER_TEXBUMP ); } else { Log ( str( format( "Unknown line: %1%" ) % buffer ) ); } } fileHandle.close(); return NO_ERROR; }
fTriple FPSCamera::focus(){ float X = cameraPosition.x + cameraFront.x; float Y = cameraPosition.y + cameraFront.y; float Z = cameraPosition.z + cameraFront.z; return fTriple(X, Y, Z); }