#include "stdafx.h" #include "../eterLib/StateManager.h" #include "../eterLib/Camera.h" #include "FlyingData.h" #include "FlyTrace.h" CDynamicPool CFlyTrace::ms_kPool; void CFlyTrace::DestroySystem() { ms_kPool.Destroy(); } CFlyTrace* CFlyTrace::New() { return ms_kPool.Alloc(); } void CFlyTrace::Delete(CFlyTrace* pkInst) { pkInst->Destroy(); ms_kPool.Free(pkInst); } CFlyTrace::CFlyTrace() { __Initialize(); /* // Code for texture CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer("d:/ray.jpg"); m_ImageInstance.SetImagePointer(pImage); CGraphicTexture * pTexture = m_ImageInstance.GetTexturePointer(); m_lpTexture = pTexture->GetD3DTexture(); */ } CFlyTrace::~CFlyTrace() { Destroy(); } void CFlyTrace::__Initialize() { m_bRectShape=false; m_dwColor=0; m_fSize=0.0f; m_fTailLength=0.0f; } void CFlyTrace::Destroy() { m_TimePositionDeque.clear(); __Initialize(); } void CFlyTrace::UpdateNewPosition(const D3DXVECTOR3 & v3Position) { m_TimePositionDeque.push_front(TTimePosition(CTimer::Instance().GetCurrentSecond(),v3Position)); //Tracenf("%f %f",m_TimePositionDeque.back().first, CTimer::Instance().GetCurrentSecond()); while(!m_TimePositionDeque.empty() && m_TimePositionDeque.back().first+m_fTailLength > TFlyVertexSetVector; void CFlyTrace::Render() { if (m_TimePositionDeque.size()<=1) return; TFlyVertexSetVector VSVector; //STATEMANAGER.SaveRenderState(D3DRS_ZFUNC,D3DCMP_LESS); STATEMANAGER.SaveRenderState(D3DRS_ZFUNC,D3DCMP_LESS); //STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE,FALSE); D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); STATEMANAGER.SaveTransform(D3DTS_WORLD, &matWorld); STATEMANAGER.SaveVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_NONE); STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); STATEMANAGER.SaveRenderState(D3DRS_ALPHAREF, 0x00000000); STATEMANAGER.SaveRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD ); //STATEMANAGER.SaveRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD ); STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); //STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, /*(m_bUseTexture)?D3DTOP_SELECTARG2:*/D3DTOP_SELECTARG2); STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); //STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, /*(m_bUseTexture)?D3DTOP_SELECTARG2:*/D3DTOP_SELECTARG1); STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE); STATEMANAGER.SetTexture(0, NULL); STATEMANAGER.SetTexture(1, NULL); D3DXMATRIX m; CScreen s;s.UpdateViewMatrix(); CCamera * pCurrentCamera = CCameraManager::Instance().GetCurrentCamera(); if (!pCurrentCamera) return; const D3DXMATRIX & M = pCurrentCamera->GetViewMatrix(); D3DXMatrixIdentity(&m); D3DXVECTOR3 F(pCurrentCamera->GetView()); m._31 = F.x; m._32 = F.y; m._33 = F.z; Frustum & frustum = s.GetFrustum(); //frustum.BuildViewFrustum(ms_matView * ms_matProj); TTimePositionDeque::iterator it1, it2; it2 = it1 = m_TimePositionDeque.begin(); ++it2; for(;it2!=m_TimePositionDeque.end();++it2,++it1) { const D3DXVECTOR3& rkOld=it1->second; const D3DXVECTOR3& rkNew=it2->second; D3DXVECTOR3 B = rkNew - rkOld; float radius = max(fabs(B.x),max(fabs(B.y),fabs(B.z)))/2; Vector3d c(it1->second.x+B.x*0.5f, it1->second.y+B.y*0.5f, it1->second.z+B.z*0.5f ); if (frustum.ViewVolumeTest(c, radius)==VS_OUTSIDE) continue; float rate1 = (1-(CTimer::Instance().GetCurrentSecond()-it1->first)/m_fTailLength); float rate2 = (1-(CTimer::Instance().GetCurrentSecond()-it2->first)/m_fTailLength); float size1 = m_fSize; float size2 = m_fSize; if (!m_bRectShape) { size1 *= rate1; size2 *= rate2; } TFlyVertex v[6] = { TFlyVertex(D3DXVECTOR3(0.0f,size1,0.0f), m_dwColor,D3DXVECTOR2(0.0f,0.0f)), TFlyVertex(D3DXVECTOR3(-size1,0.0f,0.0f),m_dwColor,D3DXVECTOR2(0.0f,0.5f)), TFlyVertex(D3DXVECTOR3(size1,0.0f,0.0f), m_dwColor,D3DXVECTOR2(0.5f,0.0f)), TFlyVertex(D3DXVECTOR3(-size2,0.0f,0.0f),m_dwColor,D3DXVECTOR2(0.5f,1.0f)), TFlyVertex(D3DXVECTOR3(size2,0.0f,0.0f), m_dwColor,D3DXVECTOR2(1.0f,0.5f)), TFlyVertex(D3DXVECTOR3(0.0f,-size2,0.0f),m_dwColor,D3DXVECTOR2(1.0f,1.0f)), /*TVertex(D3DXVECTOR3(0.0f,size1,0.0f), ((DWORD)(0x40*rate1)<<24) + 0x0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(-size1,0.0f,0.0f),((DWORD)(0x40*rate1)<<24) + 0x0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(size1,0.0f,0.0f), ((DWORD)(0x40*rate1)<<24) + 0x0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(-size2,0.0f,0.0f),((DWORD)(0x40*rate2)<<24) + 0x0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(size2,0.0f,0.0f), ((DWORD)(0x40*rate2)<<24) + 0x0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(0.0f,-size2,0.0f),((DWORD)(0x40*rate2)<<24) + 0x0000ff,D3DXVECTOR2(0.0f,0.0f)),*/ /*TVertex(D3DXVECTOR3(0.0f,size1,0.0f),0x20ff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(-size1,0.0f,0.0f),0x20ff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(size1,0.0f,0.0f),0x20ff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(-size2,0.0f,0.0f),0x20ff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(size2,0.0f,0.0f),0x20ff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(0.0f,-size2,0.0f),0x20ff0000,D3DXVECTOR2(0.0f,0.0f)),*/ /*TVertex(D3DXVECTOR3(0.0f,size1,0.0f),0xffff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(-size1,0.0f,0.0f),0xffff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(size1,0.0f,0.0f),0xffff0000,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(-size2,0.0f,0.0f),0xff0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(size2,0.0f,0.0f),0xff0000ff,D3DXVECTOR2(0.0f,0.0f)), TVertex(D3DXVECTOR3(0.0f,-size2,0.0f),0xff0000ff,D3DXVECTOR2(0.0f,0.0f)),*/ }; D3DXVECTOR3 E(M._41,M._42,M._43); E = pCurrentCamera->GetEye(); E-=it1->second; D3DXVECTOR3 P; D3DXVec3Cross(&P, &B,&E); D3DXVECTOR3 U; D3DXVec3Cross(&U,&F,&P); D3DXVec3Normalize(&U,&U); D3DXVECTOR3 R; D3DXVec3Cross(&R,&F,&U); //D3DXMatrixIdentity(&m); m._21 = U.x; m._22 = U.y; m._23 = U.z; m._11 = R.x; m._12 = R.y; m._13 = R.z; int i; for(i=0;i<6;i++) D3DXVec3TransformNormal(&v[i].p,&v[i].p,&m); for(i=0;i<3;i++) v[i].p += it1->second; for(;i<6;i++) v[i].p += it2->second; //for(i=0;i<6;i++) // Tracenf("#%d:%f %f %f", i, v[i].p.x,v[i].p.y,v[i].p.z); VSVector.push_back(std::make_pair(-D3DXVec3Dot(&E,&pCurrentCamera->GetView()),TFlyVertexSet(v))); //OLD: STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 4, v, sizeof(TVertex)); //OLD: STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v+1, sizeof(TVertex)); } std::sort(VSVector.begin(),VSVector.end()); for(TFlyVertexSetVector::iterator it = VSVector.begin();it!=VSVector.end();++it) { STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 4, it->second.v, sizeof(TVertex)); } STATEMANAGER.RestoreRenderState(D3DRS_DESTBLEND); STATEMANAGER.RestoreRenderState(D3DRS_SRCBLEND); STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE); STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE); STATEMANAGER.RestoreVertexShader(); STATEMANAGER.RestoreTransform(D3DTS_WORLD); //STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE); STATEMANAGER.RestoreRenderState(D3DRS_ZFUNC); STATEMANAGER.RestoreRenderState(D3DRS_BLENDOP); STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE); STATEMANAGER.RestoreRenderState(D3DRS_ALPHAFUNC); STATEMANAGER.RestoreRenderState(D3DRS_ALPHAREF); }