void Update( float p_fDelta ) { if( Input().Down( FK2DEngine::EKB_Left ) || Input().Down( FK2DEngine::GP_Left ) ) { m_Player.TurnLeft(); } if( Input().Down( FK2DEngine::EKB_Right ) || Input().Down( FK2DEngine::GP_Right ) ) { m_Player.TurnRight(); } if( Input().Down( FK2DEngine::EKB_Up ) || Input().Down( FK2DEngine::GP_Button0 ) ) { m_Player.Accelerate(); } m_Player.Move(); m_Player.CollectStars( m_Stars ); if( std::rand() % 25 == 0 && m_Stars.size() < 25 ) { m_Stars.push_back( CStar(m_StarAnim) ); } m_nFps = FK2DEngine::GetFPS(); }
void CStarField::ParseStarsCatalog( const std::vector<unsigned char>& in_rData, std::vector<unsigned char>& out_rVBData ) { CLog::Print("ParseStarsCatalog()\n"); std::list< CStar > StarsArray; const char* pBegin = (const char*)&in_rData[0]; const char* pEnd = pBegin+in_rData.size(); for( ; pBegin!=pEnd; ) { const char* pEndLine = pBegin; while( pEndLine!=pEnd && *pEndLine!='\r' && *pEndLine!='\n') pEndLine++; // line is: [pBegin..pEndLine) if(pBegin!=pEndLine) { // decode line std::string S(pBegin,pEndLine-pBegin); const char* pS = S.c_str(); if(*pS != '#') { float DolgotaHour = 0.0f; float DolgotaMin = 0.0f; float DolgotaSec = 0.0f; float ShirotaDeg = 0.0f; float ShirotaMin = 0.0f; float ShirotaSec = 0.0f; float Magnitude = 0.0f; bool Ok = false; do { // comma after traditional name const char* pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after nomenclature name pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after equinox pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after Dolgota Deg pComma = strchr(pS,','); if(!pComma) break; DolgotaHour = atof( std::string(pS,pComma-pS).c_str() ); pS = pComma+1; // comma after Dolgota Min pComma = strchr(pS,','); if(!pComma) break; DolgotaMin = atof( std::string(pS,pComma-pS).c_str() ); pS = pComma+1; // comma after Dolgota Sec pComma = strchr(pS,','); if(!pComma) break; DolgotaSec = atof( std::string(pS,pComma-pS).c_str() ); pS = pComma+1; // comma after Shirota Deg pComma = strchr(pS,','); if(!pComma) break; ShirotaDeg = atof( std::string(pS,pComma-pS).c_str() ); pS = pComma+1; // comma after Shirota Min pComma = strchr(pS,','); if(!pComma) break; ShirotaMin = atof( std::string(pS,pComma-pS).c_str() ); pS = pComma+1; // comma after Shirota Sec pComma = strchr(pS,','); if(!pComma) break; ShirotaSec = atof( std::string(pS,pComma-pS).c_str() ); pS = pComma+1; // comma after Motion 1 pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after Motion 2 pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after velocity pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after parallax pComma = strchr(pS,','); if(!pComma) break; pS = pComma+1; // comma after Magnitude pComma = strchr(pS,','); if(!pComma) break; Magnitude = atof( std::string(pS,pComma-pS).c_str() ); Ok = true; } while(false); if(Ok) { //CLog::Print(" dolgota = %1.2f %1.2f %1.2f\n",DolgotaHour,DolgotaMin,DolgotaSec); //CLog::Print(" shirota = %1.2f %1.2f %1.2f\n",ShirotaDeg,ShirotaMin,ShirotaSec); //CLog::Print(" magnitude = %1.2f\n",Magnitude); float Dolgota = DolgotaHour + DolgotaMin/60.0f + DolgotaSec/3600.0f; Dolgota *= (CONST_2PI/24.0f); float Shirota = ShirotaDeg + ShirotaMin/60.0f + ShirotaSec/3600.0f; Shirota *= (CONST_PI_2/90.0f); Magnitude = (Magnitude<-2.0f) ? -2.0f : ((Magnitude>6.0f)?6.0f:Magnitude); assert(Magnitude>=-2.0f && Magnitude<=6.0f); float k=-0.9f/8.0f; float b=1.0f-(0.9f/4.0f); Magnitude = k*Magnitude+b; Magnitude = (Magnitude<0.1f) ? 0.1f : ((Magnitude>1.0f)?1.0f:Magnitude); assert(Magnitude>=0.1f && Magnitude<=1.0f); StarsArray.push_back( CStar(Shirota,Dolgota,Magnitude) ); } } } while( pEndLine!=pEnd && (*pEndLine=='\r' || *pEndLine=='\n') ) pEndLine++; pBegin = pEndLine; } // generate VB data CLog::Print(" %ld stars\n",StarsArray.size()); out_rVBData.resize( StarsArray.size() * 6 * ( 3*sizeof(float) + 2*sizeof(float) ) ); unsigned char* pDstBegin = (unsigned char*)&out_rVBData[0]; unsigned char* pDstEnd = pDstBegin+out_rVBData.size(); for( std::list<CStar>::const_iterator It = StarsArray.begin(); It!=StarsArray.end(); ++It ) { // CVector Dir( cos(It->m_Shirota)*sin(It->m_Dolgota), sin(It->m_Shirota), cos(It->m_Shirota)*cos(It->m_Dolgota) ); Dir.Normalize(); // CVector QQ; if( CONST_PI_4 < fabs(It->m_Shirota) ) QQ = CVector(1,0,0); else QQ = CVector(0,1,0); // CVector Right( Dir*QQ ); Right.Normalize(); CVector Up( Right*Dir ); Up.Normalize(); // Dir *= 10.0f; Right *= 0.1f*It->m_Size; Up *= 0.1f*It->m_Size; // assert( pDstBegin + 6 * ( 3*sizeof(float) + 2*sizeof(float) ) <= pDstEnd ); CVector VUp = Dir+Up; CVector VRight = Dir+Right; CVector VDown = Dir-Up; CVector VLeft = Dir-Right; // v1 *( (CVector*)pDstBegin ) = VUp; pDstBegin += 3*sizeof(float); *( (float*)pDstBegin ) = 1.0f; pDstBegin += sizeof(float); *( (float*)pDstBegin ) = 0.0f; pDstBegin += sizeof(float); // v2 *( (CVector*)pDstBegin ) = VRight; pDstBegin += 3*sizeof(float); *( (float*)pDstBegin ) = 1.0f; pDstBegin += sizeof(float); *( (float*)pDstBegin ) = 1.0f; pDstBegin += sizeof(float); // v3 *( (CVector*)pDstBegin ) = VDown; pDstBegin += 3*sizeof(float); *( (float*)pDstBegin ) = 0.0f; pDstBegin += sizeof(float); *( (float*)pDstBegin ) = 1.0f; pDstBegin += sizeof(float); // v4 *( (CVector*)pDstBegin ) = VDown; pDstBegin += 3*sizeof(float); *( (float*)pDstBegin ) = 0.0f; pDstBegin += sizeof(float); *( (float*)pDstBegin ) = 1.0f; pDstBegin += sizeof(float); // v5 *( (CVector*)pDstBegin ) = VLeft; pDstBegin += 3*sizeof(float); *( (float*)pDstBegin ) = 0.0f; pDstBegin += sizeof(float); *( (float*)pDstBegin ) = 0.0f; pDstBegin += sizeof(float); // v6 *( (CVector*)pDstBegin ) = VUp; pDstBegin += 3*sizeof(float); *( (float*)pDstBegin ) = 1.0f; pDstBegin += sizeof(float); *( (float*)pDstBegin ) = 0.0f; pDstBegin += sizeof(float); } m_PrimitiveType = PRIM_TRIANGLE_LIST; m_PrimitiveCount = 2*StarsArray.size(); }