Files
Client/GameTools/CHARACTERACTIONCONTROL/CCameraScript.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

956 lines
28 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "CCameraScript.h"
#include "SceneManager.h"
#include "SceneStateMgr.h"
extern D3DXVECTOR3 g_vecCube[8];
extern WORD g_vecCubeIndex[36];
CCameraScript::CCameraScript() {
m_pDevice = CSceneManager::GetDevice();
m_pDevice->GetTransform(D3DTS_VIEW, &m_matBeforeView);
InitCameraScript();
m_iFixCount = 0;
m_bBackWord = false;
m_bInitPos = false;
}
CCameraScript::~CCameraScript() {
m_lstEvent.clear();
m_lstPosSpline.clear();
m_lstLookSpline.clear();
m_pDevice->SetTransform(D3DTS_VIEW, &m_matBeforeView);
}
void CCameraScript::ReWindFix() {
if(m_iFixCount > 0)
m_iFixCount--;
else
m_iFixCount = (m_iEventNum - 1);
}
void CCameraScript::Rewind() {
if(m_iBeforeEvent > 0)
m_iBeforeEvent--;
else
m_iBeforeEvent = (m_iEventNum - 1);
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
void CCameraScript::FoWindFix() {
if(m_iFixCount < (m_iEventNum - 1))
m_iFixCount++;
else
m_iFixCount = 0;
}
void CCameraScript::Fowind() {
if(m_iBeforeEvent < (m_iEventNum-1))
m_iBeforeEvent++;
else
m_iBeforeEvent = 0;
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
void CCameraScript::Jump(int iEvent) {
if((iEvent >= 0) && (iEvent < m_iEventNum)) {
m_iBeforeEvent = iEvent;
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
}
void CCameraScript::InitFrame() {
// m_bStart = false;
m_dwBeforeTick = 0;
m_fRunFrame = 0.0f;
m_iBeforeEvent = 0;
}
void CCameraScript::PlayScript(int iRoll,int iLoop,bool bFixPos) {
int i;
if(m_bStart == false)
return;
if(m_lstEvent.empty())
return;
m_dwCurrentTick = timeGetTime();
float fSkipFrame = 0.0f;
if(m_dwBeforeTick == 0) { // ù ½ÃÀÛ ÇÁ·¹ÀÓ
fSkipFrame = 0;
m_matBeforePos = *(CSceneManager::m_ViewCamera->GetMatPosition());
m_matBeforeView2 = CSceneManager::m_ViewCamera->m_matView;
}
else {
fSkipFrame = ((int)m_dwCurrentTick - (int)m_dwBeforeTick) / (float)CAMERAFRAMESTEP;
}
//m_fRunFrame += fSkipFrame;
m_fRunFrame += 0.6f;
if(iRoll == 0) { // Play
if(m_fRunFrame < m_lstEvent[m_iBeforeEvent].m_fFrame )
{
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
i = m_iBeforeEvent + 1;
for( i; i < m_iEventNum; i++ ) {
if(m_fRunFrame >= m_lstEvent[i].m_fFrame) {
m_iBeforeEvent = i;
}
}
if((m_iEventNum - 1) == m_iBeforeEvent) { // Looping ó¸®
if(iLoop == 1) {
m_iBeforeEvent = 0;
m_dwBeforeTick = 0;
m_fRunFrame = 0.0f;
}
else { // Looping X
m_iBeforeEvent = m_iEventNum - 1;
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
m_bStart = false;
InitFrame();
if(bFixPos)
{
CSceneManager::m_ViewCamera->SetMatView(m_matBeforeView2);
CSceneManager::m_ViewCamera->SetMatPosition(m_matBeforePos);
CSceneManager::m_ViewCamera->MoveFrustum();
CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_matBeforePos._41,m_matBeforePos._42,m_matBeforePos._43));
}
}
}
float fInterpol;
if(m_iBeforeEvent == (m_iEventNum - 1))
fInterpol = 1.0f;
else {
fInterpol = (float)(m_fRunFrame - m_lstEvent[m_iBeforeEvent].m_fFrame) / (m_lstEvent[m_iBeforeEvent + 1].m_fFrame - m_lstEvent[m_iBeforeEvent].m_fFrame);
}
m_CurrentEvent.m_fFrame = m_fRunFrame;
// Interpolation¿¡ µû¸¥ º¸°£
D3DXVECTOR3 vecInterpol;
D3DXVECTOR3 vecInterPos;
D3DXVECTOR3 vecInterLook;
D3DXVECTOR3 vecInterUp;
switch(m_lstEvent[m_iBeforeEvent].m_iInterpolation) {
case C_LINE:
if(fInterpol < 0.000001f) {
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
}
else {
int PosStart = m_lstEvent[m_iBeforeEvent].m_iPosStart;
int iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iPosEnd - m_lstEvent[m_iBeforeEvent].m_iPosStart;
iInterpolNum *= fInterpol;
vecInterPos = m_lstPosSpline[ PosStart + iInterpolNum];
PosStart = m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iLookEnd - m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum *= fInterpol;
vecInterLook = m_lstLookSpline[ PosStart + iInterpolNum];
/* vecInterpol = m_lstEvent[m_iBeforeEvent + 1].m_vecCameraPos - m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos + (vecInterpol * fInterpol);
vecInterpol = m_lstEvent[m_iBeforeEvent + 1].m_vecCameraLook - m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook + (vecInterpol * fInterpol);
*/
vecInterpol = m_lstEvent[m_iBeforeEvent + 1].m_vecCameraUp - m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp + (vecInterpol * fInterpol);
}
break;
case C_BEZIER1: // Á¦¾îÁ¡ 3
if(fInterpol < 0.000001f) {
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
}
else {
int PosStart = m_lstEvent[m_iBeforeEvent].m_iPosStart;
int iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iPosEnd - m_lstEvent[m_iBeforeEvent].m_iPosStart;
iInterpolNum *= fInterpol;
vecInterPos = m_lstPosSpline[ PosStart + iInterpolNum];
PosStart = m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iLookEnd - m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum *= fInterpol;
vecInterLook = m_lstLookSpline[ PosStart + iInterpolNum];
float fInterpol2 = fInterpol * fInterpol;
/* vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos * ((1.0f - fInterpol) * (1.0f - fInterpol))
+ (m_lstEvent[m_iBeforeEvent].m_vecControlPoint[0] * 2 * (1.0f - fInterpol) * fInterpol ) + (m_lstEvent[m_iBeforeEvent + 1].m_vecCameraPos * fInterpol2);
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook * ((1.0f - fInterpol) * (1.0f - fInterpol))
+ (m_lstEvent[m_iBeforeEvent].m_vecControlPoint[0] * 2 * (1.0f - fInterpol) * fInterpol ) + (m_lstEvent[m_iBeforeEvent + 1].m_vecCameraLook * fInterpol2);*/
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp * ((1.0f - fInterpol) * (1.0f - fInterpol))
+ (m_lstEvent[m_iBeforeEvent].m_vecControlPoint[0] * 2 * (1.0f - fInterpol) * fInterpol ) + (m_lstEvent[m_iBeforeEvent + 1].m_vecCameraUp * fInterpol2);
}
break;
/*case C_BEZIER2: // Á¦¾îÁ¡ 4
if(fInterpol < 0.000001f) {
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
}
else {
}
break;*/
default:
break;
};
m_CurrentEvent.m_vecCameraPos = vecInterPos;
m_CurrentEvent.m_vecCameraLook = vecInterLook;
m_CurrentEvent.m_vecCameraUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
}
D3DXMatrixLookAtLH(&m_matCurrentFrame,
&(m_CurrentEvent.m_vecCameraPos),&(m_CurrentEvent.m_vecCameraLook),&(m_CurrentEvent.m_vecCameraUp));
m_dwBeforeTick = m_dwCurrentTick = timeGetTime();
}
bool CCameraScript::SaveScript(char *strFileName) {
if((strFileName != NULL) && strlen(strFileName) > 1) {
FILE *fp = fopen(strFileName,"wb");
if(fp != NULL) {
float fVersion = CAMERASCRIPTVERSION;
fwrite((float *)&fVersion,sizeof(float),1,fp);
fwrite((int *)&m_iEventNum,sizeof(int),1,fp);
fwrite((CCameraEvent *)&(m_lstEvent[0]),sizeof(CCameraEvent),m_iEventNum,fp);
fclose(fp);
}
else {
return false;
}
}
return true;
}
bool CCameraScript::LoadScript(char *strFileName) {
if((strFileName != NULL) && strlen(strFileName) > 1) {
float fVersion = 0.0f;
char strPath[256] = {0};
strcpy(strPath,EFFECTSCRIPTPATH);
strcat(strPath,strFileName);
FILE *fp = fopen(strPath,"rb");
if(fp != NULL) {
fread((float *)&fVersion,sizeof(float),1,fp);
if((fVersion >= 0.9f) && (fVersion <= 1.1f)) {
int i;
fread((int *)&m_iEventNum,sizeof(int),1,fp);
for( i = 0; i < m_iEventNum; i++ ) {
CCameraEvent EmptyNode;
m_lstEvent.push_back(EmptyNode);
}
fread((CCameraEvent *)&(m_lstEvent[0]),sizeof(CCameraEvent),m_iEventNum,fp);
}
fclose(fp);
m_iInsertLook = 1;
CreateSpline();
}
else {
return false;
}
}
return true;
}
void CCameraScript::InitCameraScript(bool bInitPos,D3DXVECTOR3 vecInitPos,D3DXVECTOR3 vecInitLook) {
m_lstEvent.clear();
m_iEventNum = 0;
m_iBeforeEvent = 0;
m_fRunFrame = 0.0f;
m_dwBeforeTick = 0;
m_bStart = false;
m_lstPosSpline.clear();
m_bCreateSpline = false;
m_lstLookSpline.clear();
m_bCreateLookSpline = false;
m_iInsertLook = 0;
m_iFixCount = 0;
m_bInitPos = bInitPos;
m_vecCameraInitPos = vecInitPos;
m_vecCameraInitLook = vecInitLook;
}
int CCameraScript::GetFixCount(int &iIndex,float &fFrame) {
if(m_lstEvent.size() > m_iFixCount)
{
iIndex = m_lstEvent[m_iFixCount].m_iIndex;
fFrame = m_lstEvent[m_iFixCount].m_fFrame;
}
else
{
iIndex = 0;
fFrame = 0;
}
return m_iFixCount;
}
void CCameraScript::FixLook(int iEvent,D3DXVECTOR3 vecLook) {
m_lstEvent[iEvent].m_vecCameraLook = vecLook;
}
void CCameraScript::InsertLookPos(D3DXVECTOR3 vecLook) {
if(m_iInsertLook >= m_lstEvent.size()) {
MessageBox(NULL,"Look Pos Ãʰú ","error",MB_OK);
return;
}
m_lstEvent[m_iInsertLook].m_vecCameraLook = vecLook;
m_iInsertLook++;
char tmp[256]= {0};
int iNum = m_iInsertLook - m_lstEvent.size();
sprintf(tmp,"%d °³ÀÇ Target Point ¸¦ ´õ ÂïÀ»¼ö ÀÖ½À´Ï´Ù.",iNum);
MessageBox(NULL,tmp,"msg",MB_OK);
}
int CCameraScript::InsertEvent( D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp,float fFrame,int iInterpol ) {
CCameraEvent Node;
Node.m_iIndex = m_iEventNum;
Node.m_iInterpolation = iInterpol;
Node.m_vecCameraPos = vecPos;
Node.m_vecCameraLook = vecLook;
Node.m_vecCameraUp = vecUp;
Node.m_fFrame = fFrame;
m_lstEvent.push_back(Node);
return m_iEventNum++;
}
void CCameraScript::FixEvent(int iEvent,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp)
{
if((iEvent< 0) || (iEvent >= m_iEventNum) )
return;
m_lstEvent[iEvent].m_vecCameraPos = vecPos;
m_lstEvent[iEvent].m_vecCameraLook = vecLook;
m_lstEvent[iEvent].m_vecCameraUp = vecUp;
}
void CCameraScript::FixEvent( int iEvent,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp,float fFrame,int iInterpol ) {
if((iEvent< 0) || (iEvent >= m_iEventNum) )
return;
m_lstEvent[iEvent].m_vecCameraPos = vecPos;
m_lstEvent[iEvent].m_vecCameraLook = vecLook;
m_lstEvent[iEvent].m_vecCameraUp = vecUp;
m_lstEvent[iEvent].m_fFrame = fFrame;
m_lstEvent[iEvent].m_iInterpolation = iInterpol;
}
void CCameraScript::DeleteEvent(float fFrame,int iInterpol) {
if(m_iEventNum <= 0)
return;
int i;
for( i = 0 ; i < m_iEventNum; i++ )
{
if(((m_lstEvent[i].m_fFrame - fFrame) + (float)(m_lstEvent[i].m_iInterpolation - iInterpol)) <= 0.001f) {
m_lstEvent.erase(&(m_lstEvent[i]));
m_iEventNum--;
return;
}
}
}
void CCameraScript::DeleteEvent(int iIndex) {
if((iIndex <= 0) || (iIndex >= m_iEventNum))
return;
int i;
for( i = 0 ; i < m_iEventNum; i++ )
{
if(i == iIndex) {
m_lstEvent.erase(&(m_lstEvent[i]));
m_iEventNum--;
InitFrame();
m_iFixCount = 0;
if(m_iInsertLook >= m_iEventNum)
m_iInsertLook = (m_iEventNum - 1);
m_bCreateLookSpline = false;
m_bCreateSpline = false;
m_bStart = false;
return;
}
}
}
void CCameraScript::BackWordEvent() // Event¸¦ µÇµ¹¸°´Ù.
{
int iCurrent;
int iBackCurrent;
m_bBackWord = !m_bBackWord;
D3DXVECTOR3 vecTmpSwap;
for(int i = 0; i < floor((float)m_iEventNum / 2.0f); i++ )
{
iCurrent = i;
iBackCurrent = (m_iEventNum - 1) - i;
if(iCurrent != iBackCurrent)
{
vecTmpSwap = m_lstEvent[iCurrent].m_vecCameraLook;
m_lstEvent[iCurrent].m_vecCameraLook = m_lstEvent[iBackCurrent].m_vecCameraLook;
m_lstEvent[iBackCurrent].m_vecCameraLook = vecTmpSwap;
vecTmpSwap = m_lstEvent[iCurrent].m_vecCameraPos;
m_lstEvent[iCurrent].m_vecCameraPos = m_lstEvent[iBackCurrent].m_vecCameraPos;
m_lstEvent[iBackCurrent].m_vecCameraPos = vecTmpSwap;
vecTmpSwap = m_lstEvent[iCurrent].m_vecCameraUp;
m_lstEvent[iCurrent].m_vecCameraUp = m_lstEvent[iBackCurrent].m_vecCameraUp;
m_lstEvent[iBackCurrent].m_vecCameraUp = vecTmpSwap;
}
}
if(m_bInitPos)
{
D3DXVECTOR3 vecUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
FixEvent(m_iEventNum -1,m_vecCameraInitPos,m_vecCameraInitLook,vecUp);
FixEvent(m_iEventNum -2,m_vecCameraInitPos,m_vecCameraInitLook,vecUp);
}
}
void CCameraScript::SetPlay(bool bFlag,bool bBack,bool bStartPos) {
m_bStart = bFlag;
if(bBack && bFlag)
{
if(!m_bBackWord)
{
BackWordEvent();
m_iInsertLook = 1;
CreateSpline();
}
}
else if(bFlag)
{
if(m_bBackWord)
{
BackWordEvent();
m_iInsertLook = 1;
CreateSpline();
}
}
if(bStartPos && bFlag && !bBack) // Start pos ºÎÅÍ º¸°£ ½ÃÀÛ(0 ÇÁ·¹ÀÓ À̺¥Æ® ¼öÁ¤)
{
matrix *matPos= CSceneManager::GetCamera()->GetMatPosition();
vector3 vecCameraToward = CSceneManager::GetCamera()->GetViewTowardVector();
//vector3 vecCameraUp = CSceneManager::GetCamera()->GetViewUpVector();
D3DXVECTOR3 vecCameraSPos = D3DXVECTOR3(matPos->_41,matPos->_42,matPos->_43);
D3DXVECTOR3 vecCameraSLook = D3DXVECTOR3(vecCameraSPos.x + vecCameraToward.x * 50.0f,vecCameraSPos.y + vecCameraToward.y* 50.0f,vecCameraSPos.z + vecCameraToward.z* 50.0f);
//D3DXVECTOR3 vecCameraSUp = D3DXVECTOR3(vecCameraUp.x,vecCameraUp.y,vecCameraUp.z);
D3DXVECTOR3 vecCameraSUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
FixEvent(0,vecCameraSPos,vecCameraSLook,vecCameraSUp);
m_iInsertLook = 1;
CreateSpline();
}
InitFrame();
if(bFlag == false) {
CSceneManager::m_ViewCamera->SetMatView(m_matBeforeView2);
CSceneManager::m_ViewCamera->SetMatPosition(m_matBeforePos);
CSceneManager::m_ViewCamera->MoveFrustum();
CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_matBeforePos._41,m_matBeforePos._42,m_matBeforePos._43));
}
}
void CCameraScript::RenderPos_Up() {
int i;
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
for( i = 0; i < m_iEventNum; i++ ) {
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
identity._41 = m_lstEvent[i].m_vecCameraPos.x + m_lstEvent[i].m_vecCameraUp.x * 50.0f;
identity._42 = m_lstEvent[i].m_vecCameraPos.y + m_lstEvent[i].m_vecCameraUp.y * 50.0f;
identity._43 = m_lstEvent[i].m_vecCameraPos.z + m_lstEvent[i].m_vecCameraUp.z * 50.0f;
identity._11 = 1.0f;
identity._22 = 1.0f;
identity._33 = 1.0f;
if(i == m_iFixCount) {
identity._11 = 9.0f;
identity._22 = 9.0f;
identity._33 = 9.0f;
}
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
if((i != 0) && ( i != (m_iEventNum -1)))
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffff4444);
else
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
if(i == m_iFixCount) {
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
}
m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
identity._41 = m_lstEvent[i].m_vecCameraPos.x;
identity._42 = m_lstEvent[i].m_vecCameraPos.y;
identity._43 = m_lstEvent[i].m_vecCameraPos.z;
identity._11 = 1.0f;
identity._22 = 1.0f;
identity._33 = 1.0f;
if(i == m_iFixCount) {
identity._11 = 9.0f;
identity._22 = 9.0f;
identity._33 = 9.0f;
}
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
if((i != 0) && ( i != (m_iEventNum -1)))
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffff0000);
else
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
if(i == m_iFixCount) {
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
}
m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
}
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderLook() {
int i;
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
for( i = 0; i < m_iEventNum; i++ ) {
D3DXMatrixIdentity(&identity);
identity._41 = m_lstEvent[i].m_vecCameraLook.x;
identity._42 = m_lstEvent[i].m_vecCameraLook.y;
identity._43 = m_lstEvent[i].m_vecCameraLook.z;
identity._11 = 10.0f;
identity._22 = 10.0f;
identity._33 = 10.0f;
if(i == m_iFixCount) {
identity._11 = 15.0f;
identity._22 = 15.0f;
identity._33 = 15.0f;
}
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
if((i != 0) && ( i != (m_iEventNum -1)))
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffff00);
else
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
if(i == m_iFixCount) {
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
}
m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
}
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderLookSpline() {
if((m_lstLookSpline.size() <= 0) || (m_bCreateLookSpline == false))
return;
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
int iSplineNum = m_lstLookSpline.size();
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffff00);
m_pDevice->DrawPrimitiveUP(D3DPT_LINESTRIP,(iSplineNum - 1),&(m_lstLookSpline[0]),sizeof(D3DXVECTOR3));
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderPosSpline() {
if((m_lstPosSpline.size() <= 0) || (m_bCreateSpline == false))
return;
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
int iSplineNum = m_lstPosSpline.size();
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ffff);
m_pDevice->DrawPrimitiveUP(D3DPT_LINESTRIP,(iSplineNum - 1),&(m_lstPosSpline[0]),sizeof(D3DXVECTOR3));
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderLine() {
int i;
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
for( i = 0; i < m_iEventNum; i++ ) {
D3DXVECTOR3 vecUp = D3DXVECTOR3(m_lstEvent[i].m_vecCameraPos.x + m_lstEvent[i].m_vecCameraUp.x * 50.0f,
m_lstEvent[i].m_vecCameraPos.y + m_lstEvent[i].m_vecCameraUp.y * 50.0f,
m_lstEvent[i].m_vecCameraPos.z + m_lstEvent[i].m_vecCameraUp.z * 50.0f);
D3DXVECTOR3 vecPos = D3DXVECTOR3(m_lstEvent[i].m_vecCameraPos.x,
m_lstEvent[i].m_vecCameraPos.y,
m_lstEvent[i].m_vecCameraPos.z);
D3DXVECTOR3 vecLook = D3DXVECTOR3(m_lstEvent[i].m_vecCameraLook.x,
m_lstEvent[i].m_vecCameraLook.y,
m_lstEvent[i].m_vecCameraLook.z);
D3DXVECTOR3 vecLinePos[2];
vecLinePos[0] = vecUp;
vecLinePos[1] = vecPos;
/* vecLinePos[2] = vecPos;
vecLinePos[3] = vecLook;
*/
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff000000);
m_pDevice->DrawPrimitiveUP(D3DPT_LINELIST,1,vecLinePos,sizeof(D3DXVECTOR3));
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
}
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::CreateSpline() {
m_lstPosSpline.clear();
m_lstLookSpline.clear();
float fU,fU2,fU3;
float i,j;
for( i = 0; i < (m_iEventNum); i++ ) {
m_lstEvent[i].m_iPosStart = m_lstPosSpline.size();
for(j = 0;j < CAMERASPLINEUNIT;j++) {
fU = (float)j / (float)CAMERASPLINEUNIT;
fU2 = fU * fU;
fU3 = fU2 * fU;
D3DXVECTOR3 vecNode;
vecNode.x = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraPos.x +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraPos.x +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraPos.x +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraPos.x) / 6.0f;
vecNode.y = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraPos.y +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraPos.y +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraPos.y +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraPos.y) / 6.0f;
vecNode.z = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraPos.z +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraPos.z +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraPos.z +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraPos.z) / 6.0f;
m_lstPosSpline.push_back(vecNode);
}
m_lstEvent[i].m_iPosEnd = m_lstPosSpline.size();
}
m_bCreateSpline = true;
if(m_iInsertLook <= 0)
{
m_bCreateLookSpline = false;
return;
}
else {
for( i = 0; i < (m_iEventNum); i++ ) {
m_lstEvent[i].m_iLookStart = m_lstLookSpline.size();
for(j = 0;j < CAMERASPLINEUNIT;j++) {
fU = (float)j / (float)CAMERASPLINEUNIT;
fU2 = fU * fU;
fU3 = fU2 * fU;
D3DXVECTOR3 vecNode;
vecNode.x = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraLook.x +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraLook.x +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraLook.x +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraLook.x) / 6.0f;
vecNode.y = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraLook.y +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraLook.y +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraLook.y +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraLook.y) / 6.0f;
vecNode.z = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraLook.z +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraLook.z +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraLook.z +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraLook.z) / 6.0f;
m_lstLookSpline.push_back(vecNode);
}
m_lstEvent[i].m_iLookEnd = m_lstLookSpline.size();
}
}
m_bCreateLookSpline = true;
}