void __Camera::UpdatePos(__scalar amount) { __Vector4 look = ComputeTransformMatrix().GetRow(2); __Vector3 look3 = __Vector3(look.X(), look.Y(), look.Z()); __Vector3 pos = __Vector3(position.X(), position.Y(), position.Z()); pos = pos + look3*amount; position = __Vector4(pos.X(), pos.Y(), pos.Z(), 1); }
void __Camera::Strafe(__scalar amount) { __Vector3 side = __Vector4DropW(ComputeTransformMatrix().GetRow(0)); __Vector3 pos = __Vector3(position.X(), position.Y(), position.Z()); pos = pos + side*amount; position = __Vector5(pos.X(), pos.Y(), pos.Z(), 0, 1); }
void CLightMgr::Release() { ///////////////////////////////////////////// // Release... std::list<CN3Light*>::iterator it; for(it=m_Lights.begin(); it!=m_Lights.end(); it++) { CN3Light* pLgt = (*it); delete pLgt; } m_Lights.clear(); for(int i=0;i<LGT_MAX;i++) { if(m_pActiveLight[i]) delete m_pActiveLight[i]; m_pActiveLight[i] = NULL; } // Release.. ///////////////////////////////////////////// /////////////////////////////////////////////////////////////// // 기본 라이트 세팅 D3DCOLORVALUE crLgt; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.8f; CN3Light* pLightGlobal = new CN3Light(); // 전체를 비출 라이트.. pLightGlobal->m_Data.InitDirection(LGT_DEFAULT0, __Vector3(0,-1,0), crLgt); m_pActiveLight[LGT_DEFAULT0] = pLightGlobal; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.5f; CN3Light* pLightGlobal2 = new CN3Light(); // 반대 편에서 전체를 비출 라이트.. pLightGlobal2->m_Data.InitDirection(LGT_DEFAULT1, __Vector3(0,1,0), crLgt); m_pActiveLight[LGT_DEFAULT1] = pLightGlobal2; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.3f; CN3Light* pLight = new CN3Light(); // 카메라와 붙어 다닌다... pLight->m_Data.InitPoint(LGT_DEFAULT2, __Vector3(0,0,0), crLgt, 32.0f); m_pActiveLight[LGT_DEFAULT2] = pLight; // 기본 라이트 세팅 /////////////////////////////////////////////////////////////// }
void CN3Camera::Release() { m_Data.Release(); m_Data.vEye = m_vPos = __Vector3(15,5,-15); m_Data.vAt = m_vAt = __Vector3(0,0,0); m_Data.vUp = m_vScale = __Vector3(0,1,0); m_Data.fFOV = D3DXToRadian(55.0f); // 기본값 55 도 m_Data.fNP = 0.7f; m_Data.fFP = 512.0f; m_bFogUse = FALSE; m_FogColor = D3DCOLOR_ARGB(255,255,255,255); // m_fFogDensity = 1.0f / m_Data.fFP; // m_fFogStart = m_Data.fFP * 0.75f; // m_fFogEnd = m_Data.fFP; m_fRadianX = 0.0f; CN3Transform::Release(); }
////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CN3Camera::CN3Camera() { m_dwType |= OBJ_CAMERA; m_Data.Release(); m_Data.vEye = m_vPos = __Vector3(15,5,-15); m_Data.vAt = m_vAt = __Vector3(0,0,0); m_Data.vUp = m_vScale = __Vector3(0,1,0); m_Data.fFOV = D3DXToRadian(55.0f); // 기본값 55 도 m_Data.fNP = 0.7f; m_Data.fFP = 512.0f; m_bFogUse = TRUE; m_FogColor = D3DCOLOR_ARGB(255,255,255,255); // m_fFogDensity = 1.0 / m_Data.fFP; // m_fFogStart = m_Data.fFP * 0.75f; // m_fFogEnd = m_Data.fFP; m_fRadianX = 0.0f; m_bOrtho = false; }
CN3CPlugBase* CPlayerMySelf::PlugSet(e_PlugPosition ePos, const std::string& szFN, __TABLE_ITEM_BASIC* pItemBasic, __TABLE_ITEM_EXT* pItemExt) { int iJoint = 0; if(PLUG_POS_RIGHTHAND == ePos) { m_pItemPlugBasics[ePos] = pItemBasic; m_pItemPlugExts[ePos] = pItemExt; iJoint = m_pLooksRef->iJointRH; } else if(PLUG_POS_LEFTHAND == ePos) { m_pItemPlugBasics[ePos] = pItemBasic; m_pItemPlugExts[ePos] = pItemExt; if(pItemBasic) { if(pItemBasic->byClass == ITEM_CLASS_SHIELD) iJoint = m_pLooksRef->iJointLH2; // 방패인 경우 else iJoint = m_pLooksRef->iJointLH; // 왼손 끝.. } } else if (PLUG_POS_KNIGHTS_GRADE == ePos) { m_pItemPlugBasics[ePos] = pItemBasic; m_pItemPlugExts[ePos] = pItemExt; iJoint = m_pLooksRef->iJointRH - 2; // 오른쪽 팔목 } else if (PLUG_POS_BACK == ePos) { //m_pItemBasicPlugRefs[PLUG_POS_BACK] = pItem; } else { __ASSERT(0, "Invalid Plug Item position"); } CN3CPlugBase* pPlug = m_ChrInv.PlugSet(ePos, szFN); if(NULL == pPlug) return NULL; if(PLUG_POS_LEFTHAND == ePos || PLUG_POS_RIGHTHAND == ePos) // 키에 비례해서 크게 키운다. 기본키는 1.8 미터이다. { float fScale = m_Chr.Height() / 1.8f; fScale *= pPlug->Scale().y / m_Chr.Scale().y; pPlug->ScaleSet(__Vector3(fScale, fScale, fScale)); pPlug->m_nJointIndex = iJoint; // 관절 번호 세팅.. } // else if(PLUG_POS_BACK == ePos) // { // CN3CPlug_Cloak *pPlugCloak = (CN3CPlug_Cloak*)pPlug; // pPlugCloak->GetCloak()->SetPlayerBase(this); // } this->SetSoundPlug(pItemBasic); return CPlayerBase::PlugSet(ePos, szFN, pItemBasic, pItemExt); }
void CN3Scene::DefaultLightAdd() { // Light 초기화.. CN3Light* pLight = new CN3Light(); pLight->m_szName = "DefaultLight"; pLight->FileNameSet("Data\\DefaultLight.N3Light"); int nLight = this->LightAdd(pLight) - 1; D3DCOLORVALUE ltColor = { 0.7f, 0.7f, 0.7f, 1.0f}; pLight->m_Data.InitDirection(0, __Vector3(-1.0f,-1.0f,0.5f), ltColor); pLight->PosSet(1000.0f, 1000.0f, -1000.0f); pLight->m_Data.bOn = TRUE; pLight->m_Data.nNumber = nLight; }
void CPlayerMySelf::InventoryChrRender(const RECT& Rect) { /* DWORD dwUsefog = TRUE; CN3Base::s_lpD3DDev->GetRenderState( D3DRS_FOGENABLE , &dwUsefog ); DWORD dwUseLighting=TRUE; CN3Base::s_lpD3DDev->GetRenderState( D3DRS_LIGHTING, &dwUseLighting ); int bLight[8]; for ( int i = 0; i < 8; i++ ) CN3Base::s_lpD3DDev->GetLightEnable(i, &bLight[i]); if (dwUseLighting) CN3Base::s_lpD3DDev->SetRenderState( D3DRS_LIGHTING, TRUE ); if (dwUsefog) CN3Base::s_lpD3DDev->SetRenderState( D3DRS_FOGENABLE, FALSE ); // set render states for ( i = 1; i < 8; i++ ) CN3Base::s_lpD3DDev->LightEnable(i, FALSE); CN3Base::s_lpD3DDev->LightEnable(0, TRUE); D3DLIGHT8 lgt0; memset(&lgt0, 0, sizeof(D3DLIGHT8)); lgt0.Type = D3DLIGHT_POINT; lgt0.Attenuation0 = 0.5f; lgt0.Range = 100.0f; lgt0.Position = __Vector3(0.0f, 2.0f, -10.0f); lgt0.Diffuse.r = 220/255.0f; lgt0.Diffuse.g = 255/255.0f; lgt0.Diffuse.b = 220/255.0f; CN3Base::s_lpD3DDev->SetLight(0, &lgt0); //캐릭터 찍기.. // __Matrix44 mtxproj, mtxview, mtxworld, mtxprojback, mtxviewback, mtxworldback; CN3Base::s_lpD3DDev->GetTransform( D3DTS_PROJECTION, &mtxprojback ); CN3Base::s_lpD3DDev->GetTransform( D3DTS_VIEW, &mtxviewback ); CN3Base::s_lpD3DDev->GetTransform( D3DTS_WORLD, &mtxworldback ); D3DXMatrixOrthoLH(&mtxproj, 12.0f, 9.0f, 0, 100); CN3Base::s_lpD3DDev->SetTransform( D3DTS_PROJECTION, &mtxproj ); D3DXMatrixLookAtLH( &mtxview, &D3DXVECTOR3( 0.0f, 2.0f,-10.0f ), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); CN3Base::s_lpD3DDev->SetTransform( D3DTS_VIEW, &mtxview ); mtxworld.Identity(); CN3Base::s_lpD3DDev->SetTransform( D3DTS_WORLD, &mtxworld ); /////////////////////////////////////////////////////////////// // 2d 좌표 구함.. // 2d -> 3d.. __Vector3 vPos; vPos.x = (float)((Rect.right - Rect.left)/2.0f + Rect.left); vPos.y = (float)(Rect.bottom) - (Rect.bottom - Rect.top)/16.0f; vPos.z = 0.11f; float fWidth, fHeight; fWidth = s_CameraData.vp.Width; fHeight = s_CameraData.vp.Height; fWidth *= 0.5f; fHeight *= 0.5f; vPos.x = (vPos.x - fWidth)/fWidth; vPos.y = (fHeight - vPos.y)/fHeight; __Matrix44 mtxProjInv, mtxViewInv; D3DXMatrixInverse(&mtxProjInv, NULL, &mtxproj); D3DXMatrixInverse(&mtxViewInv, NULL, &mtxview); vPos *= mtxProjInv; vPos *= mtxViewInv; m_ChrInv.PosSet(vPos.x, vPos.y, 1.0f); __Quaternion qt; qt.RotationAxis(0.0f, 1.0f, 0.0f, D3DXToRadian(198.0f)); m_ChrInv.RotSet(qt); CGameProcedure::s_pEng->ClearZBuffer(NULL); CN3Base::s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); m_ChrInv.m_nLOD = 0; m_ChrInv.Render(); CN3Base::s_lpD3DDev->SetTransform( D3DTS_PROJECTION, &mtxprojback ); CN3Base::s_lpD3DDev->SetTransform( D3DTS_VIEW, &mtxviewback ); CN3Base::s_lpD3DDev->SetTransform( D3DTS_WORLD, &mtxworldback ); CN3Base::s_lpD3DDev->SetRenderState(D3DRS_AMBIENT, 0x00000000); CN3Base::s_lpD3DDev->SetRenderState( D3DRS_LIGHTING, dwUseLighting ); CN3Base::s_lpD3DDev->SetRenderState( D3DRS_FOGENABLE , dwUsefog ); for ( i = 0; i < 8; i++ ) CN3Base::s_lpD3DDev->LightEnable(i, bLight[i]); */ // 아래로 dino수정 // backup render state DWORD dwLighting; D3DLIGHT9 BackupLight0; s_lpD3DDev->GetRenderState( D3DRS_LIGHTING, &dwLighting ); BOOL bLight[8]; for ( int i = 0; i < 8; ++i ) s_lpD3DDev->GetLightEnable(i, &(bLight[i])); s_lpD3DDev->GetLight(0, &BackupLight0); // set render state if (TRUE != dwLighting) s_lpD3DDev->SetRenderState( D3DRS_LIGHTING, TRUE ); for ( int i = 1; i < 8; ++i ) s_lpD3DDev->LightEnable(i, FALSE); s_lpD3DDev->LightEnable(0, TRUE); // 0번 light 설정 D3DLIGHT9 Light0; memset(&Light0, 0, sizeof(D3DLIGHT9)); Light0.Type = D3DLIGHT_POINT; Light0.Attenuation0 = 0.5f; Light0.Range = 100.0f; Light0.Position = __Vector3(0.0f, 2.0f, 10.0f); Light0.Diffuse.r = 220/255.0f; Light0.Diffuse.g = 255/255.0f; Light0.Diffuse.b = 220/255.0f; s_lpD3DDev->SetLight(0, &Light0); // 캐릭터 위치와 방향 세팅 m_ChrInv.PosSet(__Vector3(0,0,0)); __Quaternion qt; qt.RotationAxis(0.0f, 1.0f, 0.0f, D3DXToRadian(18.0f)); // 약간 비스듬하게 서있게.. m_ChrInv.RotSet(qt); // render RenderChrInRect(&m_ChrInv, Rect); // restore if (TRUE != dwLighting) s_lpD3DDev->SetRenderState( D3DRS_LIGHTING, dwLighting ); for (int i = 0; i < 8; ++i ) s_lpD3DDev->LightEnable(i, bLight[i]); s_lpD3DDev->SetLight(0, &BackupLight0); }
void CGameEng::Tick(const D3DCOLOR* crDiffuses, // Diffuse 라이트 색깔.. 3 개 쓴다. const D3DCOLOR* crAmbients, // Ambient 라이트 색깔.. 3 개 쓴다. const D3DCOLOR crFog, // 안개 색깔.. const __Vector3& vPosPlayer, // 플레이어 위치 const __Quaternion& qtPlayer, // 회전 쿼터니언 float fHeightPlayer, // 키를 인수로 넣으면 카메라와 라이트 처리.. float fSunRadianZ) // 해의 Z 각도.. { if(NULL == m_pActiveCam) return; float fRadius = fHeightPlayer * 2.0f; float fYaw = 0; __Quaternion qtRot = qtPlayer; __Vector3 vAxis(0,1,0); qtRot.AxisAngle(vAxis, fYaw); if(vAxis.y < 0) // 회전축이 음수이면. { vAxis.y *= -1.0f; fYaw *= -1.0f; } switch(m_eViewPoint) { case VP_BACKWARD: { ::D3DXQuaternionRotationYawPitchRoll(&qtRot, fYaw, m_fRotPitchBackward, 0); __Matrix44 mtxRot = qtRot; m_vEyeToReach.Set(0, 0, -(fRadius / s_CameraData.fFOV) * m_fZoomBackwardOrFoward); m_vAtToReach = vPosPlayer; m_vAtToReach.y += fHeightPlayer * 0.8f; m_vEyeToReach = m_vAtToReach + (m_vEyeToReach * mtxRot); } break; case VP_FIRST_PERSON: { ::D3DXQuaternionRotationYawPitchRoll(&qtRot, fYaw, m_fRotPitchFirstPerson, 0); __Matrix44 mtxRot = qtRot; m_vEyeToReach = vPosPlayer; m_vEyeToReach.y += fHeightPlayer - 0.1f; m_vAtToReach.Set(0,0,1); m_vAtToReach = m_vEyeToReach + (m_vAtToReach * mtxRot); } break; case VP_FOWARD: { ::D3DXQuaternionRotationYawPitchRoll(&qtRot, fYaw, -m_fRotPitchFoward, 0); __Matrix44 mtxRot = qtRot; m_vEyeToReach.Set(0, 0, fRadius * m_fZoomBackwardOrFoward); m_vAtToReach = vPosPlayer; m_vAtToReach.y += fHeightPlayer * 0.8f; m_vEyeToReach = m_vAtToReach + (m_vEyeToReach * mtxRot); } break; case VP_THIRD_PERSON: { ::D3DXQuaternionRotationYawPitchRoll(&qtRot, m_fRotYawVPGod, m_fRotPitchThirdFirson, 0); __Matrix44 mtxRot = qtRot; m_vAtToReach = vPosPlayer; m_vAtToReach.y += fHeightPlayer * 0.8f; m_vEyeToReach.Set(0,0,-m_fOffsetVPGod); m_vEyeToReach = m_vAtToReach + (m_vEyeToReach * mtxRot); } break; } //////////////////////////////////////////////////////////////////////////////////// // 카메라 충돌 체크... if(VP_FIRST_PERSON == m_eViewPoint) // 일인칭때는 충돌체크 안한다. { m_pActiveCam->LookAt(m_vEyeToReach, m_vAtToReach, __Vector3(0,1,0)); // 처다본다.. } else { __Vector3 vEyeResult = m_vEyeToReach; float fNP = m_pActiveCam->m_Data.fNP; CGameBase::ACT_WORLD->CheckCollisionCameraWithTerrain(vEyeResult, m_vAtToReach, fNP); // 지형과 충돌체크 CGameBase::ACT_WORLD->CheckCollisionCameraWithShape(vEyeResult, m_vAtToReach, fNP); // 오브젝트와 충돌체크.. m_pActiveCam->LookAt(vEyeResult, m_vAtToReach, __Vector3(0,1,0)); // 처다본다.. } // 카메라 충돌 체크... //////////////////////////////////////////////////////////////////////////////////// // 파 플레인 값을 조정.. // ApplyCameraAndLight 에서 실제로 안개등의 값을 조절한다. if(m_fFPDeltaCur != m_fFPDeltaToReach) { float fFPChange = (m_fFPDeltaToReach - m_fFPDeltaCur) * s_fSecPerFrm / 5.0f; // 5초동안 변하게 한다. m_fFPDeltaCur += fFPChange; if(fFPChange < 0 && m_fFPDeltaCur < m_fFPDeltaToReach) m_fFPDeltaCur = m_fFPDeltaToReach; if(fFPChange > 0 && m_fFPDeltaCur > m_fFPDeltaToReach) m_fFPDeltaCur = m_fFPDeltaToReach; } float fFPToRestore = m_pActiveCam->m_Data.fFP; m_pActiveCam->m_Data.fFP = s_Options.iViewDist * m_fFPDeltaCur; m_pActiveCam->m_FogColor = crFog; // 안개색을 맞춘다.. m_pActiveCam->Tick(); // 적용및 사면체등등의 값들을 계산.. __Matrix44 mtxRotSun; mtxRotSun.RotationZ(fSunRadianZ); // 해의 각도에 맞춘다.. /* it_Light itLgt = m_Lights.begin(); int iSize = m_Lights.size(); for(int i = 0; i < iSize; i++, itLgt++) { CN3Light* pLight = *itLgt; __ASSERT(pLight, "Light pointer is NULL!!!"); if(0 == pLight->m_Data.nNumber) // 기본 디렉셔널 라이트 { // View Matrix 각도와 방향을 맞춘다.. // __Vector3 vDir(0.0f,-1.5f,1.0f); // vDir.Normalize(); // __Matrix44 mtxVI = s_CameraData.mtxViewInverse; // mtxVI.PosSet(0,0,0); // pLight->m_Data.Direction = vDir * mtxVI; // 해와 방향을 맞춘다.. __Matrix44 mtxRot; mtxRot.RotationZ(fSunRadianZ); __Vector3 vDir(-1,0,1); vDir *= mtxRot; vDir.Normalize(); pLight->m_Data.Direction = vDir; // 라이트 컬러 적용.. pLight->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[0]); pLight->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[0]); } else if(1 == pLight->m_Data.nNumber) { __Vector3 vDir(2,-3, 2); // 위에서 아래로 ... vDir.Normalize(); pLight->m_Data.Direction = vDir; // 라이트 컬러 적용.. pLight->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[1]); pLight->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[1]); } else if(2 == pLight->m_Data.nNumber) { __Vector3 vPos = s_CameraData.vEye; vPos.y += 16.0f; pLight->PosSet(vPos); // 카메라 위에 가게 한다.. // 라이트 컬러 적용.. pLight->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[2]); pLight->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[2]); } // 번개 처리.. if(m_fLightningTimeRemain > 0) { float fLightningDelta = 0; if(m_fLightningTimeRemain > LIGHTNING_DURATION * 0.8f) fLightningDelta = (m_fLightningTimeRemain - LIGHTNING_DURATION * 0.8f) / (LIGHTNING_DURATION * 0.2f); else fLightningDelta = m_fLightningTimeRemain / (LIGHTNING_DURATION * 0.8f); pLight->m_Data.Diffuse.r += (1.0f - pLight->m_Data.Diffuse.r) * fLightningDelta * 0.4f; pLight->m_Data.Diffuse.g += (1.0f - pLight->m_Data.Diffuse.g) * fLightningDelta * 0.5f; pLight->m_Data.Diffuse.b += (1.0f - pLight->m_Data.Diffuse.b) * fLightningDelta; m_fLightningTimeRemain -= CN3Base::s_fSecPerFrm; if(m_fLightningTimeRemain < 0) m_fLightningTimeRemain = 0; } pLight->Tick(); } */ if(m_pRefLightSun) { // 해와 방향을 맞춘다.. __Matrix44 mtxRot; mtxRot.RotationZ(fSunRadianZ); __Vector3 vDir(-1,0,1); vDir *= mtxRot; vDir.Normalize(); m_pRefLightSun->m_Data.Direction = vDir; // 라이트 컬러 적용.. m_pRefLightSun->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[0]); m_pRefLightSun->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[0]); // 번개 처리.. if(m_fLightningTimeRemain > 0) { float fLightningDelta = 0; if(m_fLightningTimeRemain > LIGHTNING_DURATION * 0.8f) fLightningDelta = (m_fLightningTimeRemain - LIGHTNING_DURATION * 0.8f) / (LIGHTNING_DURATION * 0.2f); else fLightningDelta = m_fLightningTimeRemain / (LIGHTNING_DURATION * 0.8f); m_pRefLightSun->m_Data.Diffuse.r += (1.0f - m_pRefLightSun->m_Data.Diffuse.r) * fLightningDelta * 0.4f; m_pRefLightSun->m_Data.Diffuse.g += (1.0f - m_pRefLightSun->m_Data.Diffuse.g) * fLightningDelta * 0.5f; m_pRefLightSun->m_Data.Diffuse.b += (1.0f - m_pRefLightSun->m_Data.Diffuse.b) * fLightningDelta; m_fLightningTimeRemain -= CN3Base::s_fSecPerFrm; if(m_fLightningTimeRemain < 0) m_fLightningTimeRemain = 0; } } if(m_pRefLightSupport) { __Vector3 vDir(2,-3, 2); // 위에서 아래로 ... vDir.Normalize(); m_pRefLightSupport->m_Data.Direction = vDir; // 라이트 컬러 적용.. m_pRefLightSupport->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[1]); m_pRefLightSupport->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[1]); // 번개 처리.. if(m_fLightningTimeRemain > 0) { float fLightningDelta = 0; if(m_fLightningTimeRemain > LIGHTNING_DURATION * 0.8f) fLightningDelta = (m_fLightningTimeRemain - LIGHTNING_DURATION * 0.8f) / (LIGHTNING_DURATION * 0.2f); else fLightningDelta = m_fLightningTimeRemain / (LIGHTNING_DURATION * 0.8f); m_pRefLightSupport->m_Data.Diffuse.r += (1.0f - m_pRefLightSupport->m_Data.Diffuse.r) * fLightningDelta * 0.4f; m_pRefLightSupport->m_Data.Diffuse.g += (1.0f - m_pRefLightSupport->m_Data.Diffuse.g) * fLightningDelta * 0.5f; m_pRefLightSupport->m_Data.Diffuse.b += (1.0f - m_pRefLightSupport->m_Data.Diffuse.b) * fLightningDelta; m_fLightningTimeRemain -= CN3Base::s_fSecPerFrm; if(m_fLightningTimeRemain < 0) m_fLightningTimeRemain = 0; } } if(m_pRefLightCam) { __Vector3 vPos = s_CameraData.vEye; vPos.y += 16.0f; m_pRefLightCam->PosSet(vPos); // 카메라 위에 가게 한다.. // 라이트 컬러 적용.. m_pRefLightCam->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[2]); m_pRefLightCam->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[2]); // 번개 처리.. if(m_fLightningTimeRemain > 0) { float fLightningDelta = 0; if(m_fLightningTimeRemain > LIGHTNING_DURATION * 0.8f) fLightningDelta = (m_fLightningTimeRemain - LIGHTNING_DURATION * 0.8f) / (LIGHTNING_DURATION * 0.2f); else fLightningDelta = m_fLightningTimeRemain / (LIGHTNING_DURATION * 0.8f); m_pRefLightCam->m_Data.Diffuse.r += (1.0f - m_pRefLightCam->m_Data.Diffuse.r) * fLightningDelta * 0.4f; m_pRefLightCam->m_Data.Diffuse.g += (1.0f - m_pRefLightCam->m_Data.Diffuse.g) * fLightningDelta * 0.5f; m_pRefLightCam->m_Data.Diffuse.b += (1.0f - m_pRefLightCam->m_Data.Diffuse.b) * fLightningDelta; m_fLightningTimeRemain -= CN3Base::s_fSecPerFrm; if(m_fLightningTimeRemain < 0) m_fLightningTimeRemain = 0; } } }