void CCameraView::UpdateSettings(SViewParams &viewParams) { //cache some values for interpolation //float fLastDistance = m_curSettings.dist; ECamTypes eOldType = m_curSettings.camType; //get camera settings CCameraManager *pCamMan = g_pGame->GetCameraManager(); CameraID iCurCam = pCamMan->GetActiveCameraId(); pCamMan->GetCameraSettings(iCurCam, m_curSettings); if(eOldType != m_curSettings.camType) { m_bModeTransition = true; m_fTransitionTimeout = 1.0f; } //pre-calculations viewParams.fov = InterpolateTo(m_lastViewParams.fov, DEG2RAD(m_curSettings.FOV), 0.5f); //get frame time m_fFrameTime = max(gEnv->pTimer->GetFrameTime(), 0.0001f); // add cam offsets m_curSettings.dist = g_pGameCVars->cl_cam_orbit_distance; // Vec3 camOffset(Vec3Constants<float>::fVec3_Zero); Vec3 camOffset = viewParams.rotation.GetColumn1().Cross(Vec3Constants<float>::fVec3_OneZ); camOffset.NormalizeFast(); camOffset *= g_pGameCVars->cl_cam_orbit_offsetX; camOffset.z = g_pGameCVars->cl_cam_orbit_offsetZ; //update/interpolation position m_vTargetPosition = m_pTarget->GetWorldPos() + m_vTargetOffset + camOffset; //InterpolateTo(m_vTargetPosition, m_pTarget->GetWorldPos() + m_vTargetOffset, 0.1f); }
void debug_dump_camera_cb (puObject* obj) { CCameraManager *camera = globals->pln->GetCameraManager (); if (camera != NULL) { FILE *f = fopen ("Debug/camera.txt", "w"); if (f) { camera->Print (f); fclose (f); } } DrawNoticeToUser ("Camera manager dumped to \"camera.txt\"", 5); }
void CCameraInputHelper::UpdatePitchYawDriver(float stickMag, float frameTimeNormalised) { SCVars* pGameCVars = g_pGameCVars; //normal update CCameraManager *pCamMan = g_pGame->GetCameraManager(); SCamModeSettings settings; pCamMan->GetCameraSettings(pCamMan->GetActiveCameraId(), settings); if (m_pHero->m_stats.flyMode == 0) { m_pHeroInput->m_deltaMovement=Vec3(0,1,0)*stickMag; } //camera flights overwrite everything CCameraFlight *pFlight = CCameraFlight::GetInstance(); bool bFlightActive = pFlight->IsCameraFlightActive() || (pFlight->GetPaused() && pFlight->GetState() != eCFS_NONE); if(bFlightActive && !(pFlight->GetState() == eCFS_FADE_OUT && pFlight->GetFadeProgress() > 0.8f)) return; //force settings overwrite inputs if(m_fForceSettings > 0.0f) { m_fYaw = m_fForceYaw; m_fPitch = m_fForcePitch; m_fForceSettings -= gEnv->pTimer->GetFrameTime(); return; } // nav stick: static float g_fYawRotSpeed = 0.0f; static float g_fPitchRotSpeed = 0.0f; float fNewYawSpeed = m_pHeroInput->m_cameraStickLR * gf_PI * g_pGameCVars->cl_cam_rotation_speed; float fNewPitchSpeed = m_pHeroInput->m_cameraStickUD * gf_PI * g_pGameCVars->cl_cam_rotation_speed; //interpolate rotation acceleration if(g_pGameCVars->cl_cam_rotation_enable_acceleration) { if(fNewYawSpeed == 0.0f) g_fYawRotSpeed = 0.0f; else { g_fYawRotSpeed = InterpolateTo(g_fYawRotSpeed, fNewYawSpeed, g_pGameCVars->cl_cam_rotation_acceleration_time_yaw); if(g_fYawRotSpeed < 0.0f) g_fYawRotSpeed = min(g_fYawRotSpeed, -0.01f); else g_fYawRotSpeed = max(g_fYawRotSpeed, 0.01f); } if(fNewPitchSpeed == 0.0f) g_fPitchRotSpeed = 0.0f; else { g_fPitchRotSpeed = InterpolateTo(g_fPitchRotSpeed, fNewPitchSpeed, g_pGameCVars->cl_cam_rotation_acceleration_time_pitch); if(g_fPitchRotSpeed < 0.0f) g_fPitchRotSpeed = min(g_fPitchRotSpeed, -0.002f); else g_fPitchRotSpeed = max(g_fPitchRotSpeed, 0.002f); } } else { g_fYawRotSpeed = fNewYawSpeed; g_fPitchRotSpeed = fNewPitchSpeed; } //set delta yaw/pitch float deltaYawBase = g_fYawRotSpeed * frameTimeNormalised; deltaYawBase *= settings.m_fYawApplyRate; //apply yaw rate modifier float deltaPitchBase = g_fPitchRotSpeed * frameTimeNormalised; deltaPitchBase *= settings.m_fPitchApplyRate; //apply pitch rate modifier bool bHasYaw = abs(m_pHeroInput->m_cameraStickLR)>0.001f; bool bHasPitch = abs(m_pHeroInput->m_cameraStickUD)>0.001f; bool bAutoTracking = false; if(bHasYaw || bHasPitch) m_fLastUserInput = gEnv->pTimer->GetFrameStartTime().GetSeconds(); //interpolate camera to target *************** if(UpdateTargetInterpolation()) return; //if(settings.camType != ECT_CamFollow) { //handle auto rotation (simulated input) if(!bHasYaw && fabsf(m_fTrackingYawDelta) > 0.001f) { deltaYawBase = m_fTrackingYawDelta; m_fTrackingYawDelta = 0.0f; bAutoTracking = true; } if(!bHasPitch && fabsf(m_fTrackingPitchDelta) > 0.001f) { deltaPitchBase = m_fTrackingPitchDelta; m_fTrackingPitchDelta = 0.0f; bAutoTracking = true; } } if(g_pGameCVars->cl_cam_orbit != 0) { CCameraView *pCamView = g_pGame->GetCameraManager()->GetCamView(); ECamTypes eLastType = pCamView->GetLastMode()->camType; if(eLastType != ECT_CamRear && eLastType != ECT_CamFirstPerson) { SetYawDelta(RetrieveYawDelta() - deltaYawBase); SetPitchDelta(RetrievePitchDelta() - deltaPitchBase); } } else if(!CCameraManager::ChangedCamera()) { const float frameTime = max(gEnv->pTimer->GetFrameTime(),FLT_EPSILON); //add dampening to the rotation input static float yawDeltaDamped = 0.0f; float dampeningStrength = max(1.0f, pGameCVars->cl_cam_yaw_input_inertia / frameTime); yawDeltaDamped = yawDeltaDamped * (dampeningStrength-1.0f) + deltaYawBase; yawDeltaDamped /= dampeningStrength; if(bAutoTracking || bAutoTracking != m_bAutoTracking || fabsf(yawDeltaDamped) < fabsf(deltaYawBase)) yawDeltaDamped = deltaYawBase; //wait for pull if(!m_bYawModified) m_fInputYawDelta = yawDeltaDamped; else m_fInputYawDelta += yawDeltaDamped; m_fYaw += yawDeltaDamped; if(fabsf(yawDeltaDamped) > 0.002f) m_bYawModified = true; //else // m_bYawModified = false; //add dampening to the rotation input static float pitchDamped = 0.0f; dampeningStrength = max(1.0f, pGameCVars->cl_cam_pitch_input_inertia / frameTime); pitchDamped = pitchDamped * (dampeningStrength-1.0f) + deltaPitchBase; pitchDamped /= dampeningStrength; if(bAutoTracking != m_bAutoTracking || fabsf(pitchDamped) < fabsf(deltaPitchBase)) pitchDamped = deltaPitchBase; //compute new pitch if(!m_bPitchModified) m_fInputPitchDelta = pitchDamped; else m_fInputPitchDelta += pitchDamped; if(fabsf(pitchDamped) > 0.002f) m_bPitchModified = true; //else // m_bPitchModified = false; m_fPitch += pitchDamped; //clamp yaw to -pi .. pi ClampPiRange(m_fYaw); //clamp pitch m_fPitch = clamp(m_fPitch, pGameCVars->cl_cam_PitchMin, pGameCVars->cl_cam_PitchMax); } m_bAutoTracking = bAutoTracking; }
//***************************************************************************** // 描画関数 //***************************************************************************** void CSceneX::DrawNormalRender(void) { D3DXMATERIAL *pD3DXMat; D3DMATERIAL9 matDef; // 元のマテリアル情報を保存しておく D3DXMATRIX mtxScl,mtxRot,mtxTranslate, mtxWVP; // ワールドマトリックスの初期化 D3DXMatrixIdentity(&m_mtxWorld); // スケールを反映 D3DXMatrixScaling(&mtxScl, m_vScl.x, m_vScl.y, m_vScl.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxScl); // 回転を反映 *****順番注意***** D3DXMatrixRotationYawPitchRoll(&mtxRot, m_Rot.y, m_Rot.x, m_Rot.z); // Y軸を基点に回転しているのでY,X,Zの順に入れる D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxRot); // 位置を反映 D3DXMatrixTranslation(&mtxTranslate, m_Pos.x, m_Pos.y, m_Pos.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxTranslate); // ワールドマトリックスの設定 (*m_pD3DDevice)->SetTransform(D3DTS_WORLD, &m_mtxWorld); // シェーダーの適用 LPDIRECT3DVERTEXSHADER9* _vs = CShader::GetVS(VS_TYPE_MODEL); LPD3DXCONSTANTTABLE* _vsc = CShader::GetVSC(VS_TYPE_MODEL); PS_TYPE type = PS_TYPE_MODEL; LPDIRECT3DPIXELSHADER9* _ps = CShader::GetPS(type); LPD3DXCONSTANTTABLE* _psc = CShader::GetPSC(type); (*m_pD3DDevice)->SetVertexShader(*_vs); (*m_pD3DDevice)->SetPixelShader(*_ps); HRESULT hr = 0; UINT texSampler = (*_psc)->GetSamplerIndex("texSampler"); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); UINT depthSampler = (*_psc)->GetSamplerIndex("depthSampler"); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); LPDIRECT3DTEXTURE9* pDepthTex = CRenderer::GetRenderTexture(CRenderer::TYPE_RENDER_TOON_OBJECT_DEPTH); hr = (*m_pD3DDevice)->SetTexture(depthSampler, *pDepthTex); D3DXMATRIX view, proj; CCameraManager* pCameraManager = m_pManager->GetCameraManager(); view = pCameraManager->GetMtxView(); proj = pCameraManager->GetMtxProj(); mtxWVP = m_mtxWorld * view * proj; hr = (*_vsc)->SetMatrix((*m_pD3DDevice), "gWVP", &mtxWVP); // ライトから見たの view = pCameraManager->GetMtxLightView(); proj = pCameraManager->GetMtxLightProj(); mtxWVP = m_mtxWorld * view * proj; hr = (*_vsc)->SetMatrix((*m_pD3DDevice), "gLightWVP", &mtxWVP); // 頂点宣言したやつをセット(SetFVFの代わり) (*m_pD3DDevice)->SetVertexDeclaration(m_ModelInfo->m_pDecl); // マテリアルのバッファ取得 pD3DXMat = (D3DXMATERIAL*)m_ModelInfo->pD3DXBuffMatModel->GetBufferPointer(); // 現在のマテリアルの情報を取得 (*m_pD3DDevice)->GetMaterial(&matDef); // マテリアルの描画 for (int nCntMat = 0; nCntMat < (int)m_ModelInfo->nNumMatModel; nCntMat++) { LPDIRECT3DTEXTURE9 pTex = m_ModelInfo->pD3DTexBuff[nCntMat]; hr = (*m_pD3DDevice)->SetTexture(texSampler, pTex); m_ModelInfo->pD3DXMeshModel->DrawSubset(nCntMat); // モデルのパーツを描画 } //*********注意:以下を必ず書くこと****************** // 書かないとすべての色がおかしくなる (*m_pD3DDevice)->SetMaterial(&matDef); // マテリアル情報を元に戻す (*m_pD3DDevice)->SetTexture(texSampler, NULL); (*m_pD3DDevice)->SetTexture(depthSampler, NULL); (*m_pD3DDevice)->SetVertexShader(NULL); (*m_pD3DDevice)->SetPixelShader(NULL); }
int CCamera::Create (short nId, short srcSeg, short srcSide, short tgtSeg, short tgtSide, CObject *objP, int bShadowMap, int bTeleport) { CAngleVector a; #if 0 short* corners; CFixVector *pv; #endif Init (); m_info.nId = nId; m_info.bShadowMap = bShadowMap; m_info.buffer.SetWidth (Pow2ize (screen.Width () / (2 - gameOpts->render.cameras.bHires))); m_info.buffer.SetHeight (Pow2ize (screen.Height () / (2 - gameOpts->render.cameras.bHires))); m_info.buffer.SetBPP (4); //m_info.buffer.SetRowSize (max (CCanvas::Current ()->Width (), m_info.buffer.Width ())); #if RENDER2TEXTURE if (!CreateBuffer ()) #endif { #if CAMERA_READPIXELS if (!(m_info.buffer.Create (m_info.buffer.Width () * m_info.buffer.Height () * 4))) return 0; if (gameOpts->render.cameras.bFitToWall || m_info.bTeleport) m_info.screenBuf = m_info.buffer.Buffer (); else { m_info.screenBuf = new ubyte [CCanvas::Current ()->Width () * CCanvas::Current ()->Height () * 4]; if (!m_info.screenBuf) { gameOpts->render.cameras.bFitToWall = 1; m_info.screenBuf = m_info.buffer.Buffer (); } } memset (m_info.buffer.Buffer (), 0, m_info.buffer.Width () * m_info.buffer.Height () * 4); #else return 0; #endif } if (objP) { m_info.objP = objP; m_info.orient = objP->info.position.mOrient; m_info.curAngle = m_info.curDelta = 0; m_info.t0 = 0; cameraManager.SetObjectCamera (objP->Index (), nId); } else { m_info.objP = &m_info.obj; if (bTeleport) { CFixVector n = *SEGMENTS [srcSeg].m_sides [srcSide].m_normals; /* n[X] = -n[X]; n[Y] = -n[Y]; */ n.Neg (); a = n.ToAnglesVec (); } else a = SEGMENTS [srcSeg].m_sides [srcSide].m_normals [0].ToAnglesVec (); m_info.obj.info.position.mOrient = CFixMatrix::Create(a); #if 1 if (bTeleport) m_info.obj.info.position.vPos = SEGMENTS [srcSeg].Center (); else m_info.obj.info.position.vPos = SEGMENTS [srcSeg].SideCenter (srcSide); #else corners = SEGMENTS [srcSeg].Corners (srcSide); for (i = 0; i < 4; i++) { pv = gameData.segs.vertices + corners [i]; m_info.obj.info.position.p.vPos.x += pv->x; m_info.obj.info.position.p.vPos.y += pv->y; m_info.obj.info.position.p.vPos.z += pv->z; } m_info.obj.info.position.p.vPos.x /= 4; m_info.obj.info.position.p.vPos.y /= 4; m_info.obj.info.position.p.vPos.z /= 4; #endif m_info.obj.info.nSegment = srcSeg; m_info.bMirror = (tgtSeg == srcSeg) && (tgtSide == srcSide); } //m_info.obj.nSide = srcSide; m_info.nSegment = tgtSeg; m_info.nSide = tgtSide; m_info.bTeleport = (char) bTeleport; return 1; }
//***************************************************************************** // 描画関数 //***************************************************************************** void CRope::DrawNormalRender(void) { D3DXMATRIX mtxScl, mtxRot, mtxTranslate, mtxWVP; // ワールドマトリックスの初期化 D3DXMatrixIdentity(&m_mtxWorld); // スケールを反映 D3DXMatrixScaling(&mtxScl, m_vScl.x, m_vScl.y, m_vScl.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxScl); // 回転を反映 *****順番注意***** D3DXMatrixRotationYawPitchRoll(&mtxRot, m_Rot.y, m_Rot.x, m_Rot.z); // Y軸を基点に回転しているのでY,X,Zの順に入れる D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxRot); // 位置を反映 D3DXMatrixTranslation(&mtxTranslate, m_Pos.x, m_Pos.y, m_Pos.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxTranslate); // シェーダーの適用 LPDIRECT3DVERTEXSHADER9* _vs = CShader::GetVS(VS_TYPE_TEX); LPD3DXCONSTANTTABLE* _vsc = CShader::GetVSC(VS_TYPE_TEX); PS_TYPE type = PS_TYPE_TEX; LPDIRECT3DPIXELSHADER9* _ps = CShader::GetPS(type); LPD3DXCONSTANTTABLE* _psc = CShader::GetPSC(type); (*m_pD3DDevice)->SetVertexShader(*_vs); (*m_pD3DDevice)->SetPixelShader(*_ps); UINT texSampler = (*_psc)->GetSamplerIndex("texSampler"); HRESULT hr = 0; hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); D3DXMATRIX view, proj; CCameraManager* pCameraManager = m_pManager->GetCameraManager(); view = pCameraManager->GetMtxView(); proj = pCameraManager->GetMtxProj(); mtxWVP = m_mtxWorld * view * proj; hr = (*_vsc)->SetMatrix((*m_pD3DDevice), "gWVP", &mtxWVP); // テクスチャの設定(2つ目の引数をNULLにするとテクスチャを描画しない (*m_pD3DDevice)->SetTexture(0, m_pD3DTexBuff); // 両面カリングしちゃえ (*m_pD3DDevice)->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // ポリゴンの描画 hr = (*m_pD3DDevice)->SetVertexDeclaration(m_pDecl); // 頂点フォーマットの設定 (*m_pD3DDevice)->SetStreamSource(0, m_pD3DVtxBuff, 0, sizeof(VF)); // (0,渡すものが入ってるやつ,0,データの型指定) (*m_pD3DDevice)->SetIndices(m_pD3DIndexBuff); // インデックスの設定 (*m_pD3DDevice)->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP // プリミティブの種類 , 0 , 0 , m_nNumVtxNum // 総頂点数 , 0 , m_nNumPolygon); (*m_pD3DDevice)->SetTexture(texSampler, NULL); (*m_pD3DDevice)->SetVertexShader(NULL); (*m_pD3DDevice)->SetPixelShader(NULL); (*m_pD3DDevice)->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); }