void FlcDoOneFrame() { int ChunkCount; ChunkCount=flc.FrameChunks; flc.pChunk=flc.pMembuf; if ( SDL_LockSurface(flc.mainscreen) < 0 ) return; // if (!ChunkCount) printf("Empty frame! %d\n", flc.FrameCount); // this is normal and used for delays while(ChunkCount--) { ReadU32(&flc.ChunkSize, flc.pChunk+0); ReadU16(&flc.ChunkType, flc.pChunk+4); #ifdef DEBUG printf("flc.ChunkSize: %d\n", flc.ChunkSize); printf("flc.ChunkType: %d aka %x\n", flc.ChunkType, flc.ChunkType); if (flc.DelayOverride) printf("DelayOverride: %d\n", flc.DelayOverride); #endif switch(flc.ChunkType) { case 4: COLORS256(); break; case 7: SS2(); break; case 11: DECODE_COLOR(); break; case 12: DECODE_LC(); break; case 13: BLACK(); break; case 15: DECODE_BRUN(); break; case 16: DECODE_COPY(); break; case 18: #ifdef DEBUG printf("Chunk 18 not yet done.\n"); #endif break; default: Log(LOG_WARNING) << "Ieek an non implemented chunk type:" << flc.ChunkType; } flc.pChunk+=flc.ChunkSize; } SDL_UnlockSurface(flc.mainscreen); } /* FlcDoOneFrame */
void SuperShape3D::generate(void) { const float lon_step = 2 * osg::PI / _resolution; const float lat_step = osg::PI / _resolution; const float epsilon = std::numeric_limits<float>::epsilon(); osg::Vec3Array* vAry = new osg::Vec3Array; vAry->reserve( _resolution * _resolution * 6 ); setVertexArray( vAry ); osg::Vec4Array* cAry = new osg::Vec4Array; setColorArray( cAry ); setColorBinding( osg::Geometry::BIND_OVERALL ); cAry->push_back( osg::Vec4(1,1,1,1) ); for( int lat_count = 0; lat_count <_resolution; ++lat_count ) { float phi1 = static_cast<float>(lat_count * lat_step - osg::PI_2); float phi2 = phi1 + lat_step; for( int lon_count = 0; lon_count < _resolution; ++lon_count ) { float theta1 = static_cast<float>(lon_count * lon_step - osg::PI); float theta2 = theta1 + lon_step; bool tooSmall = false; float r1_1 = SS1(theta1); if(fabs(r1_1) < epsilon) tooSmall = true; float r2_1 = SS2(phi1); if(fabs(r2_1) < epsilon) tooSmall = true; float r1_2 = SS1(theta2); if(fabs(r1_2) < epsilon) tooSmall = true; float r2_2 = SS2(phi2); if(fabs(r2_2) < epsilon) tooSmall = true; if( !tooSmall ) { r1_1 = 1.0f / r1_1; r1_2 = 1.0f / r1_2; r2_1 = 1.0f / r2_1; r2_2 = 1.0f / r2_2; osg::Vec3 pa = osg::Vec3(r1_1*cosf(theta1)*r2_1*cosf(phi1), r1_1*sinf(theta1)*r2_1*cosf(phi1), r2_1*sinf(phi1)); osg::Vec3 pb = osg::Vec3(r1_2*cosf(theta2)*r2_1*cosf(phi1), r1_2*sinf(theta2)*r2_1*cosf(phi1), r2_1*sinf(phi1)); osg::Vec3 pc = osg::Vec3(r1_2*cosf(theta2)*r2_2*cosf(phi2), r1_2*sinf(theta2)*r2_2*cosf(phi2), r2_2*sinf(phi2)); osg::Vec3 pd = osg::Vec3(r1_1*cosf(theta1)*r2_2*cosf(phi2), r1_1*sinf(theta1)*r2_2*cosf(phi2), r2_2*sinf(phi2)); if((pa - pb).length() > epsilon && (pa - pc).length() > epsilon) { vAry->push_back( pa ); vAry->push_back( pb ); vAry->push_back( pc ); } if((pc - pd).length() > epsilon && (pc - pa).length() > epsilon) { vAry->push_back( pc ); vAry->push_back( pd ); vAry->push_back( pa ); } } } } addPrimitiveSet( new osg::DrawArrays( GL_TRIANGLES, 0, vAry->size() ) ); FacetingVisitor::facet( *this ); }
BOOL CARIB8CharDecode::C0( const BYTE* pbSrc, DWORD* pdwReadSize ) { if( pbSrc == NULL || pdwReadSize == NULL ){ return FALSE; } DWORD dwReadSize = 0; DWORD dwReadBuff = 0; BOOL bRet = TRUE; switch(pbSrc[0]){ case 0x20: //SP 空白 //空白は文字サイズの影響あり if( IsSmallCharMode() == FALSE ){ m_strDecode += " "; }else{ m_strDecode += ' '; } dwReadSize = 1; break; case 0x0D: //APR 改行 m_strDecode += "\r\n"; dwReadSize = 1; break; case 0x0E: //LS1 GLにG1セット m_GL = &m_G1; dwReadSize = 1; break; case 0x0F: //LS0 GLにG0セット m_GL = &m_G0; dwReadSize = 1; break; case 0x19: //SS2 シングルシフト if( SS2( pbSrc+1, &dwReadBuff ) == FALSE ){ return FALSE; } dwReadSize = 1+dwReadBuff; break; case 0x1D: //SS3 シングルシフト if( SS3( pbSrc+1, &dwReadBuff ) == FALSE ){ return FALSE; } dwReadSize = 1+dwReadBuff; break; case 0x1B: //ESC エスケープシーケンス if( ESC( pbSrc+1, &dwReadBuff ) == FALSE ){ return FALSE; } dwReadSize = 1+dwReadBuff; break; default: //未サポートの制御コード if( pbSrc[0] == 0x16 ){ //PAPF dwReadSize = 2; }else if( pbSrc[0] == 0x1C ){ //APS CheckModify(); m_wPosY=m_wCharH*(pbSrc[1]-0x40); m_wPosX=m_wCharW*(pbSrc[2]-0x40); if( m_emStrSize == STR_SMALL || m_emStrSize == STR_MEDIUM ){ m_wPosX=m_wPosX/2; } dwReadSize = 3; }else if( pbSrc[0] == 0x0C ){ //CS dwReadSize = 1; CAPTION_DATA Item; Item.bClear = TRUE; Item.dwWaitTime = m_dwWaitTime*100; if( m_pCaptionList != NULL ){ m_pCaptionList->push_back(Item); } bRet = 2; m_dwWaitTime = 0; }else{ //APB、APF、APD、APU dwReadSize = 1; } break; } *pdwReadSize = dwReadSize; return bRet; }