📄 nodeadjust.cpp
字号:
//--------------------------------------------------
// Desc: 可视化节点调整工具
// Author: artsylee/2007.3.21
//--------------------------------------------------
#include "GNode.h"
#include "NodeAdjust.h"
#include "Common.h"
#include "MS3DModel.h"
#include "GameCommon.h"
#define ADJUST_INFO_X 650
#define ADJUST_INFO_Y 0
CNodeAdjust::CNodeAdjust()
{
m_pNode = NULL;
m_bRough = true;
m_dwIndex = 0;
m_bInput = false;
}
CNodeAdjust::~CNodeAdjust()
{
}
//--------------------------------------------------
//
//--------------------------------------------------
void CNodeAdjust::SetNode(GNode *pNode)
{
if(pNode==NULL)
{
m_pNode = pNode;
}
else
{
m_pNode = pNode;
m_pNode->GetPosition(&m_ResPos);
m_pNode->GetScale(&m_ResScale);
m_pNode->GetRotate(&m_ResRotate);
UpdateValue(m_ResPos.x, POS_X);
UpdateValue(m_ResPos.y, POS_Y);
UpdateValue(m_ResPos.z, POS_Z);
UpdateValue(m_ResScale.x, SCALE);
UpdateValue(m_ResScale.x, SCALE_X);
UpdateValue(m_ResScale.y, SCALE_Y);
UpdateValue(m_ResScale.z, SCALE_Z);
UpdateValue(m_ResRotate.x, ROTATE_X);
UpdateValue(m_ResRotate.y, ROTATE_Y);
UpdateValue(m_ResRotate.z, ROTATE_Z);
}
}
GNode* CNodeAdjust::GetNode(void)
{
return m_pNode;
}
bool CNodeAdjust::IsActive(void)
{
return m_pNode != NULL;
}
void CNodeAdjust::SaveNode(void)
{
if(m_pNode==NULL) return;
CIniFile scene;
scene.Open("Config\\Scene.ini");
char szName[32];
m_pNode->GetName(szName);
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
scene.WriteFloat(szName, "PosX", pos.x);
scene.WriteFloat(szName, "PosY", pos.y);
scene.WriteFloat(szName, "PosZ", pos.z);
m_pNode->GetScale(&pos);
scene.WriteFloat(szName, "ScaleX", pos.x);
scene.WriteFloat(szName, "ScaleY", pos.y);
scene.WriteFloat(szName, "ScaleZ", pos.z);
m_pNode->GetRotate(&pos);
scene.WriteFloat(szName, "RotateX", pos.x);
scene.WriteFloat(szName, "RotateY", pos.y);
scene.WriteFloat(szName, "RotateZ", pos.z);
scene.Save(NULL);
}
//--------------------------------------------------
// 切换是否输入状态
//--------------------------------------------------
void CNodeAdjust::SetInput(bool bInput)
{
m_bInput = bInput;
if(m_bInput)
{
GUIEnable(EDIT_WINDOW, false);
GUIShow(INPUT_WINDOW, true);
CNumberInputBox *pInput = (CNumberInputBox*)GetGUI(INPUT_EDIT);
if(pInput)
{
pInput->SetActive(true);
pInput->SetEmptyValue();
}
}
else
{
GUIEnable(EDIT_WINDOW, true);
GUIShow(INPUT_WINDOW, false);
}
}
void CNodeAdjust::SetIndex(int index, int curIndex /* = -1 */)
{
int oldIndex;
if(curIndex==-1) oldIndex = m_dwIndex;
else oldIndex = curIndex;
if(index>=0 && index<NI_TOTAL && index!=oldIndex)
{
GStatic *pStatic = (GStatic*)GetGUI(EDIT_POSX+oldIndex);
if(pStatic) pStatic->SetColor(0xffffffff);
int offset = index-oldIndex;
CWindow *pWin = g_pGUIManager->GetElement(EDIT_SELECT);
if(pWin)
{
GPoint pt = pWin->GetPosition();
pWin->MoveTo(pt.x, pt.y+offset*20);
}
m_dwIndex = index;
pStatic = (GStatic*)GetGUI(EDIT_POSX+index);
if(pStatic)
{
if(m_bRough) pStatic->SetColor(0xff00ff00);
else pStatic->SetColor(0xffff00ff);
}
}
}
void CNodeAdjust::OpenEditor(void)
{
m_dwIndex = 0;
CWindow *pWin = g_pGUIManager->GetElement(EDIT_WINDOW);
if(pWin)
{
GPoint pt = pWin->GetPosition();
CWindow *pSelect = GetGUI(EDIT_SELECT);
if(pSelect)
{
pSelect->MoveTo(pt.x+20, pt.y+27);
}
GStatic *pStatic = (GStatic*)GetGUI(EDIT_POSX);
if(pStatic)
{
if(m_bRough) pStatic->SetColor(0xff00ff00);
else pStatic->SetColor(0xffff00ff);
}
CoolListBox *pList = (CoolListBox*)GetGUI(EDIT_LIST);
if(pList)
{
pList->SetStyle(0);
pList->SelectItem(0, true);
}
pWin->Show(true);
}
}
void CNodeAdjust::CloseEditor(void)
{
m_pNode = NULL;
GUIShow(EDIT_WINDOW, false);
CoolListBox *pList = (CoolListBox*)GetGUI(EDIT_LIST);
if(pList)
{
pList->SelectItem(0);
}
SetIndex(0);
}
void CNodeAdjust::Update(void)
{
if(m_pNode == NULL)
return;
if(m_bInput) return;
if(g_stInputInfo.KeyValue==DIK_UP)
{
int old = m_dwIndex;
m_dwIndex--;
if(m_dwIndex<0)
{
m_dwIndex = (NI_TOTAL-1);
}
SetIndex(m_dwIndex, old);
}
if(g_stInputInfo.KeyValue==DIK_DOWN)
{
int old = m_dwIndex;
m_dwIndex++;
if(m_dwIndex>=NI_TOTAL)
{
m_dwIndex = 0;
}
SetIndex(m_dwIndex, old);
}
if(g_stInputInfo.KeyValue==DIK_RETURN || g_stInputInfo.KeyValue==DIK_NUMPADENTER)
{
SetInput(true);
}
if(g_stInputInfo.KeyValue==DIK_DIVIDE)
{
Reset();
}
if(g_stInputInfo.KeyValue==DIK_MULTIPLY)
{
m_bRough =! m_bRough;
GStatic *pStatic = (GStatic*)GetGUI(EDIT_POSX+m_dwIndex);
if(pStatic)
{
if(m_bRough) pStatic->SetColor(0xff00ff00);
else pStatic->SetColor(0xffff00ff);
}
}
if(m_bRough)
{
if(IsKeyDown(DIK_ADD))
{
ChangeValue(true);
}
if(IsKeyDown(DIK_SUBTRACT))
{
ChangeValue(false);
}
}
else
{
if(g_stInputInfo.KeyValue==DIK_ADD)
{
ChangeValue(true);
}
if(g_stInputInfo.KeyValue==DIK_SUBTRACT)
{
ChangeValue(false);
}
}
}
void CNodeAdjust::Render(void)
{
if(m_pNode == NULL)
return;
if(m_pNode->GetNodeType()==NT_MS3D_MODEL)
{
((CMS3DModel*)m_pNode)->RenderBoundary();
}
m_pNode->DrawCoordinates();
}
//--------------------------------------------------
// 获取当前物体的位置
//--------------------------------------------------
void CNodeAdjust::GetNodePosition(D3DXVECTOR3 *pos)
{
if(m_pNode == NULL)
return;
*pos = m_pNode->GetDerivedPos();
}
//--------------------------------------------------
// 设置当前物体的位置
//--------------------------------------------------
void CNodeAdjust::SetNodePosition(const D3DXVECTOR3 &position)
{
if(m_pNode == NULL)
return;
m_pNode->SetPosition(position);
UpdateValue(position.x, POS_X);
UpdateValue(position.y, POS_Y);
UpdateValue(position.z, POS_Z);
}
//--------------------------------------------------
// 设置当前项的值
//--------------------------------------------------
void CNodeAdjust::SetValue(float Value)
{
if(m_pNode == NULL)
return;
switch(m_dwIndex)
{
case POS_X:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.x = Value;
m_pNode->SetPosition(pos);
UpdateValue(pos.x);
}
break;
case POS_Y:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.y = Value;
m_pNode->SetPosition(pos);
UpdateValue(pos.y);
}
break;
case POS_Z:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.z = Value;
m_pNode->SetPosition(pos);
UpdateValue(pos.z);
}
break;
case SCALE:
{
if(Value<0.0f)
break;
D3DXVECTOR3 scale(Value, Value, Value);
m_pNode->SetScale(scale);
UpdateValue(scale.x);
UpdateValue(scale.x, SCALE_X);
UpdateValue(scale.x, SCALE_Y);
UpdateValue(scale.x, SCALE_Z);
}
break;
case SCALE_X:
{
if(Value<0.0f)
break;
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
scale.x = Value;
m_pNode->SetScale(scale);
UpdateValue(scale.x);
UpdateValue(scale.x, SCALE);
}
break;
case SCALE_Y:
{
if(Value<0.0f)
break;
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
scale.y = Value;
m_pNode->SetScale(scale);
UpdateValue(scale.y);
}
break;
case SCALE_Z:
{
if(Value<0.0f)
break;
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
scale.z = Value;
m_pNode->SetScale(scale);
UpdateValue(scale.z);
}
break;
case ROTATE_X:
{
m_pNode->SetRotateX(Value);
UpdateValue(Value);
}
break;
case ROTATE_Y:
{
m_pNode->SetRotateY(Value);
UpdateValue(Value);
}
break;
case ROTATE_Z:
{
m_pNode->SetRotateZ(Value);
UpdateValue(Value);
}
break;
default:
break;
}
}
void CNodeAdjust::ChangeValue(bool bAdd /* = true */)
{
float Value;
if(m_dwIndex>=POS_X && m_dwIndex<=SCALE_Z)
{
Value = 0.1f;
}
else
{
Value = 0.025f;
}
if(!bAdd) Value = -Value;
switch(m_dwIndex)
{
case POS_X:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.x += Value;
m_pNode->SetPosition(pos);
UpdateValue(pos.x);
}
break;
case POS_Y:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.y += Value;
m_pNode->SetPosition(pos);
UpdateValue(pos.y);
}
break;
case POS_Z:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.z += Value;
m_pNode->SetPosition(pos);
UpdateValue(pos.z);
}
break;
case SCALE:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
if(scale.x+Value<0.0f)
break;
scale.x += Value;
scale.y = scale.x;
scale.z = scale.x;
m_pNode->SetScale(scale);
UpdateValue(scale.x);
UpdateValue(scale.x, SCALE_X);
UpdateValue(scale.x, SCALE_Y);
UpdateValue(scale.x, SCALE_Z);
}
break;
case SCALE_X:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
if(scale.x+Value<0.0f)
break;
scale.x += Value;
m_pNode->SetScale(scale);
UpdateValue(scale.x);
UpdateValue(scale.x, SCALE);
}
break;
case SCALE_Y:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
if(scale.y+Value<0.0f)
break;
scale.y += Value;
m_pNode->SetScale(scale);
UpdateValue(scale.y);
}
break;
case SCALE_Z:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
if(scale.z+Value<0.0f)
break;
scale.z += Value;
m_pNode->SetScale(scale);
UpdateValue(scale.z);
}
break;
case ROTATE_X:
{
float RotateValue = m_pNode->GetRotateX();
RotateValue += Value;
m_pNode->SetRotateX(RotateValue);
UpdateValue(RotateValue);
}
break;
case ROTATE_Y:
{
float RotateValue = m_pNode->GetRotateY();
RotateValue += Value;
m_pNode->SetRotateY(RotateValue);
UpdateValue(RotateValue);
}
break;
case ROTATE_Z:
{
float RotateValue = m_pNode->GetRotateZ();
RotateValue += Value;
m_pNode->SetRotateZ(RotateValue);
UpdateValue(RotateValue);
}
break;
default:
break;
}
}
void CNodeAdjust::Reset(void)
{
switch(m_dwIndex)
{
case POS_X:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.x = m_ResPos.x;
m_pNode->SetPosition(pos);
UpdateValue(pos.x);
}
break;
case POS_Y:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.y = m_ResPos.y;
m_pNode->SetPosition(pos);
UpdateValue(pos.y);
}
break;
case POS_Z:
{
D3DXVECTOR3 pos;
m_pNode->GetPosition(&pos);
pos.z = m_ResPos.z;
m_pNode->SetPosition(pos);
UpdateValue(pos.z);
}
break;
case SCALE:
{
m_pNode->SetScale(m_ResScale);
UpdateValue(m_ResScale.x);
UpdateValue(m_ResScale.x, SCALE_X);
UpdateValue(m_ResScale.x, SCALE_Y);
UpdateValue(m_ResScale.x, SCALE_Z);
}
break;
case SCALE_X:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
scale.x = m_ResScale.x;
m_pNode->SetScale(scale);
UpdateValue(scale.x);
UpdateValue(scale.x, SCALE);
}
break;
case SCALE_Y:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
scale.y = m_ResScale.y;
m_pNode->SetScale(scale);
UpdateValue(scale.y);
}
break;
case SCALE_Z:
{
D3DXVECTOR3 scale;
m_pNode->GetScale(&scale);
scale.z = m_ResScale.z;
m_pNode->SetScale(scale);
UpdateValue(scale.z);
}
break;
case ROTATE_X:
{
m_pNode->SetRotateX(m_ResRotate.x);
UpdateValue(m_ResRotate.x);
}
break;
case ROTATE_Y:
{
m_pNode->SetRotateY(m_ResRotate.y);
UpdateValue(m_ResRotate.y);
}
break;
case ROTATE_Z:
{
m_pNode->SetRotateZ(m_ResRotate.z);
UpdateValue(m_ResRotate.z);
}
break;
default:
break;
}
}
void CNodeAdjust::UpdateValue(float value, int index /* = -1 */)
{
int ItemIndex;
if(index==-1) ItemIndex = m_dwIndex;
else ItemIndex = index;
GStatic *pLable = (GStatic*)GetGUI(EDIT_POSX+ItemIndex);
if(pLable)
{
char szString[256];
switch(ItemIndex)
{
case POS_X: sprintf(szString, "位置(X): %.3f", value); break;
case POS_Y: sprintf(szString, "位置(Y): %.3f", value); break;
case POS_Z: sprintf(szString, "位置(Z): %.3f", value); break;
case SCALE: sprintf(szString, "缩放(ALL): %.3f", value); break;
case SCALE_X: sprintf(szString, "缩放(X): %.3f", value); break;
case SCALE_Y: sprintf(szString, "缩放(Y): %.3f", value); break;
case SCALE_Z: sprintf(szString, "缩放(Z): %.3f", value); break;
case ROTATE_X: sprintf(szString, "旋转(X): %.3f", value); break;
case ROTATE_Y: sprintf(szString, "旋转(Y): %.3f", value); break;
case ROTATE_Z: sprintf(szString, "旋转(Z): %.3f", value); break;
default: szString[0] = 0; break;
}
pLable->SetCaption(szString);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -