const EFFECT_RESULT CFlareSprite::RenderEx( const CMatrix& matWorld, RenderObjStyle* pRORS ) { const CFlareSpriteProp* pProp = (CFlareSpriteProp*)m_pEffectUnitProp; EFFECT_RESULT Result( NULL, true, false ); if( !IsInRenderTime() ) return Result; float fPercent = GetUnitPercent(); CCamera* pCamera = CMainWindowTarget::GetInst()->GetCamera(); //CGraphic::GetInst()->GetCamera( &pCamera ); float DeltaTime = m_DeltaTime / 1000.0f; CVector3f OrgOffset( 0, 0, 0 ); ITexture* pCurText = NULL; uint32 Color = 0xff000000; if( pProp->m_vecOffset.size() ) OrgOffset = GetMapValue( pProp->m_vecOffset, fPercent ); if( pProp->m_Texture.size() ) pCurText = GetMapState( pProp->m_Texture, fPercent*pProp->m_nTextureCircle - (int)( fPercent*pProp->m_nTextureCircle ) ); if( pProp->m_Color.size() ) Color = GetMapValue( pProp->m_Color, fPercent )&0x00ffffff; VerNCT* pVB; RenderState* pRS; CMatrix* pMatrix = CGraphic::GetInst()->GetRenderStack( RS_DEFAULT, pCurText, NULL, PT_TRIANGLESTRIP, 4, 2, VerNCT::Format, sizeof(VerNCT), (void**)&pVB, NULL, (void**)&pRS ); CVector3f InvNormal( 0, 0, 1 ); if( pProp->m_eFaceType == SPRF_CAMERA || ( pProp->m_vecNormal.x == 0 && pProp->m_vecNormal.y == 0 && pProp->m_vecNormal.z == 0 ) ) pCamera->GetBillboardAll( m_matWorld ); else { if( pProp->m_AngularVelocity > 0.00001f ) { m_CurAngle += pProp->m_AngularVelocity*DeltaTime; if( m_CurAngle > 6.283f ) m_CurAngle = 0.0; if( m_CurAngle < 0.0f ) m_CurAngle = 6.283f; CMatrix Rotate; pProp->m_pEffectClassDesc->SetRotate( Rotate, pProp->m_vecRotate/pProp->m_AngularVelocity, m_CurAngle ); if( pProp->m_eFaceType == SPRF_CAMERANONEX ) { pCamera->GetBillboardNoneX( m_matWorld ); m_matWorld = Rotate*m_matWorld; } else m_matWorld = pProp->m_matNormal*Rotate; } else { if( pProp->m_eFaceType == SPRF_CAMERANONEX ) pCamera->GetBillboardNoneX( m_matWorld ); else m_matWorld = pProp->m_matNormal; } if( pProp->m_eFaceType == SPRF_NORMAL ) InvNormal = -pProp->m_vecNormal; } CVector3f Offset,CameraDir; CameraDir = pCamera->getDIRECTION();//pCamera->GetCameraDir( CameraDir ); OrgOffset.FastMultiply( m_matWorld ); m_matWorld._41 = Offset.x; m_matWorld._42 = Offset.y; m_matWorld._43 = Offset.z; *pMatrix = m_matWorld; float Scale = pProp->m_fMinSize; uint32 Alpha = pProp->m_byMinAlpha; float Dot = InvNormal.Dot( CameraDir ); if( Dot > pProp->m_MaxCosAngle ) { Scale += abs( pProp->m_fMaxSize - pProp->m_fMinSize )*( Dot - pProp->m_MaxCosAngle )/( 1 - pProp->m_MaxCosAngle ); Alpha += (uint32)( abs( (int)pProp->m_byMaxAlpha - (int)pProp->m_byMinAlpha )*( Dot - pProp->m_MaxCosAngle )/( 1 - pProp->m_MaxCosAngle ) ); Alpha = ( (uint32)(BYTE)Alpha ) << 24; } Color |= Alpha; CVector3f vecS( m_matWorld._11 + m_matWorld._12 + m_matWorld._13, m_matWorld._21 + m_matWorld._22 + m_matWorld._23, m_matWorld._31 + m_matWorld._32 + m_matWorld._33 ); Scale = vecS.Mag()*Scale; pRS->m_Cull = CULLT_NONE; //D3DCULL_NONE; pRS->m_AlpOP_S0 = TOP_MODULATE; //D3DTOP_MODULATE; pRS->m_LightEnable = pProp->m_bLightEnable; pRS->m_ZTestEnable = pProp->m_eZTest != Z_NONE; pRS->m_ZWrite = pProp->m_eZTest != Z_TESTONLY; if( pProp->m_eBlendModel == SPRB_NONE ) pRS->m_AlphaBlendEnable = FALSE; else { pRS->m_AlphaBlendEnable = TRUE; if( pProp->m_eBlendModel == SPRB_ADD ) pRS->m_DestBlend = BLEND_ONE; //D3DBLEND_ONE; else if( pProp->m_eBlendModel == SPRB_LIGHT ) { VerNCT* pVB; RenderState* pMulRS; CMatrix* pMat = CGraphic::GetInst()->GetRenderStack( RS_DEFAULT, pCurText, NULL, PT_TRIANGLESTRIP, 4, 2, VerNCT::Format, sizeof(VerNCT), (void**)&pVB, NULL, (void**)&pMulRS ); *pMat = m_matWorld; pVB[0].Set( -Scale, -Scale, 0.0f, 0, 0, 1, Color, 0.0f, 1.0f ); pVB[1].Set( -Scale, Scale, 0.0f, 0, 0, 1, Color, 0.0f, 0.0f ); pVB[2].Set( Scale, -Scale, 0.0f, 0, 0, 1, Color, 1.0f, 1.0f ); pVB[3].Set( Scale, Scale, 0.0f, 0, 0, 1, Color, 1.0f, 0.0f ); pMulRS->m_DestBlend = 2; //D3DBLEND_ONE; pMulRS->m_SrcBlend = 9; //D3DBLEND_DESTCOLOR; pRS->m_DestBlend = BLEND_ONE; //D3DBLEND_ONE; } } pVB[0].Set( -Scale, -Scale, 0.0f, 0, 0, 1, Color, 0.0f, 1.0f ); pVB[1].Set( -Scale, Scale, 0.0f, 0, 0, 1, Color, 0.0f, 0.0f ); pVB[2].Set( Scale, -Scale, 0.0f, 0, 0, 1, Color, 1.0f, 1.0f ); pVB[3].Set( Scale, Scale, 0.0f, 0, 0, 1, Color, 1.0f, 0.0f ); return Result; }
// 设置、获取tag间处理结果传递 const string Page::GetResult(const string &key) { return GetMapValue(m_result, key); }