⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodeadjust.cpp

📁 3D游戏展示程序
💻 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 + -