📄 viewcontrol.cpp
字号:
#include "viewcontrol.h"
#include "util.h"
#include "modelviewer.h"
#include "modelcanvas.h"
void FloatToText(wxTextCtrl *text, float val)
{
ostringstream out;
string strTmp;
out << val;
strTmp = out.str();
text->SetValue(strTmp.c_str());
out.str("");
out.clear();
}
IMPLEMENT_CLASS(ViewControl, wxWindow)
BEGIN_EVENT_TABLE(ViewControl, wxWindow)
EVT_BUTTON(ID_UPDATE, ViewControl::OnButton)
EVT_BUTTON(ID_SAVE, ViewControl::OnButton)
EVT_BUTTON(ID_LOAD, ViewControl::OnButton)
EVT_BUTTON(ID_RESET, ViewControl::OnButton)
EVT_TEXT_ENTER(ID_FOV, ViewControl::OnText)
EVT_TEXT_ENTER(ID_ROTX, ViewControl::OnText)
EVT_TEXT_ENTER(ID_ROTY, ViewControl::OnText)
EVT_TEXT_ENTER(ID_ROTZ, ViewControl::OnText)
EVT_TEXT_ENTER(ID_LIGHTX, ViewControl::OnText)
EVT_TEXT_ENTER(ID_LIGHTY, ViewControl::OnText)
EVT_TEXT_ENTER(ID_LIGHTZ, ViewControl::OnText)
EVT_TEXT_ENTER(ID_POSX, ViewControl::OnText)
EVT_TEXT_ENTER(ID_POSY, ViewControl::OnText)
EVT_TEXT_ENTER(ID_POSZ, ViewControl::OnText)
EVT_RADIOBUTTON(ID_MOUSE_MODEL, ViewControl::OnButton)
EVT_RADIOBUTTON(ID_MOUSE_LIGHT, ViewControl::OnButton)
END_EVENT_TABLE()
ViewControl::ViewControl(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size)
{
if (Create(parent, id, pos, size, 0, _T("ViewControlFrame")) == false)
wxMessageBox("HOLY CRAP!", "ffs");
//p = new wxPanel(this, -1, wxDefaultPosition, size);
wxButton *btnUpdate = new wxButton(this, ID_UPDATE, _("Update View"), wxPoint(10,5), wxSize(80,20));
wxButton *btnSave = new wxButton(this, ID_SAVE, _("Save"), wxPoint(10,30), wxSize(40,20));
wxButton *btnLoad = new wxButton(this, ID_LOAD, _("Load"), wxPoint(50,30), wxSize(40,20));
wxButton *btnReset = new wxButton(this, ID_RESET, _("Reset"), wxPoint(10,50), wxSize(40,20));
wxStaticText *lblFov = new wxStaticText(this, -1, _("Field of View:"), wxPoint(100,5), wxSize(40,24));
txtFov = new wxTextCtrl(this, ID_FOV, _T("45"), wxPoint(145,5), wxSize(25,20), wxTE_PROCESS_ENTER);
wxStaticText *lblRot = new wxStaticText(this, -1, _("Rotation (XYZ)"), wxPoint(195,5), wxSize(40,30));
txtRot[0] = new wxTextCtrl(this, ID_ROTX, _T("0"), wxPoint(240,5), wxSize(45,20), wxTE_PROCESS_ENTER);
txtRot[1] = new wxTextCtrl(this, ID_ROTY, _T("0"), wxPoint(240,30), wxSize(45,20), wxTE_PROCESS_ENTER);
txtRot[2] = new wxTextCtrl(this, ID_ROTZ, _T("0"), wxPoint(240,55), wxSize(45,20), wxTE_PROCESS_ENTER);
wxStaticText *lblLight = new wxStaticText(this, -1, _("Light Pos (XYZ)"), wxPoint(295,5), wxSize(45,30));
txtLight[0] = new wxTextCtrl(this, ID_LIGHTX, _T("0"), wxPoint(340,5), wxSize(45,20), wxTE_PROCESS_ENTER);
txtLight[1] = new wxTextCtrl(this, ID_LIGHTY, _T("0"), wxPoint(340,30), wxSize(45,20), wxTE_PROCESS_ENTER);
txtLight[2] = new wxTextCtrl(this, ID_LIGHTZ, _T("0"), wxPoint(340,55), wxSize(45,20), wxTE_PROCESS_ENTER);
wxStaticText *lblPos = new wxStaticText(this, -1, _("Model Pos (XYZ)"), wxPoint(390,5), wxSize(50,30));
txtPos[0] = new wxTextCtrl(this, ID_POSX, _T("0"), wxPoint(440,5), wxSize(45,20), wxTE_PROCESS_ENTER);
txtPos[1] = new wxTextCtrl(this, ID_POSY, _T("0"), wxPoint(440,30), wxSize(45,20), wxTE_PROCESS_ENTER);
txtPos[2] = new wxTextCtrl(this, ID_POSZ, _T("0"), wxPoint(440,55), wxSize(45,20), wxTE_PROCESS_ENTER);
wxStaticText *lblMouse = new wxStaticText(this, -1, _("Mouse Control:"), wxPoint(500,5), wxSize(80,15));
wxRadioButton *rbtn1 = new wxRadioButton(this, ID_MOUSE_MODEL, "Model", wxPoint(500,20), wxSize(45,20), wxRB_GROUP, wxDefaultValidator, "radioButton1");
wxRadioButton *rbtn2 = new wxRadioButton(this, ID_MOUSE_LIGHT, "Light", wxPoint(500,40), wxSize(45,20), 0, wxDefaultValidator, "radioButton2");
}
ViewControl::~ViewControl()
{
/*
// Clear buttons
delete btnUpdate;
delete btnSave;
delete btnLoad;
delete btnReset;
// Clear Labels
delete lblFov;
delete lblRot;
delete lblLight;
delete lblPos;
// Clear Text Boxes
delete txtFov;
for(int i=0;i<3;i++)
delete txtRot[i];
for(i=0;i<3;i++)
delete txtLight[i];
for(i=0;i<3;i++)
delete txtPos[i];
delete lblMouse;
delete rbtn1;
delete rbtn2;
*/
}
void ViewControl::OnButton(wxCommandEvent &event)
{
if (event.GetId()==ID_UPDATE) {
Update();
} else if (event.GetId()==ID_SAVE) {
vLight = canvas->lPos;
vRot = canvas->vRot;
vPos = canvas->vPos;
} else if (event.GetId()==ID_LOAD) {
canvas->lPos = vLight;
canvas->vRot = vRot;
canvas->vPos = vPos;
} else if (event.GetId() == ID_MOUSE_MODEL) {
canvas->bMouseLight = false;
} else if (event.GetId() == ID_MOUSE_LIGHT) {
canvas->bMouseLight = true;
} else if (event.GetId() == ID_RESET) {
canvas->vPos = Vec3D(0.0f, (-canvas->model->rad * 0.5f), (canvas->model->rad * 2.0f));
canvas->vRot = Vec3D(0.0f, -90.0f, 0.0f);
if (canvas->vPos.z < 3.0f) canvas->vPos.z = 3.0f;
if (canvas->vPos.z > 500.0f) canvas->vPos.z = 500.0f;
if (canvas->vPos.y > 50) canvas->vPos.y = 50;
if (canvas->vPos.y < -50) canvas->vPos.y = -50;
Refresh();
}
}
void ViewControl::OnText(wxCommandEvent &event)
{
Update();
}
void ViewControl::Init()
{
Refresh();
}
void ViewControl::Refresh()
{
FloatToText(txtFov, canvas->fov); // Field of view
FloatToText(txtRot[0], canvas->vRot.x); // X Rotation
FloatToText(txtRot[1], canvas->vRot.y); // Y Rotation
FloatToText(txtRot[2], canvas->vRot.z); // Y Rotation
FloatToText(txtLight[0], canvas->lPos.x); // X Light Position
FloatToText(txtLight[1], canvas->lPos.y); // Y Light Position
FloatToText(txtLight[2], canvas->lPos.z); // Z Light Position
FloatToText(txtPos[0], canvas->vPos.x); // X Model Position
FloatToText(txtPos[1], canvas->vPos.y); // Y Model Position
FloatToText(txtPos[2], canvas->vPos.z); // Z Model Position
}
void ViewControl::Update()
{
//from_string<float>(canvas->aspect, string(txtAspect->GetValue()), dec);
from_string<float>(canvas->fov, string(txtFov->GetValue()), dec);
from_string<float>(canvas->vRot.x, string(txtRot[0]->GetValue()), dec);
from_string<float>(canvas->vRot.y, string(txtRot[1]->GetValue()), dec);
from_string<float>(canvas->vRot.z, string(txtRot[2]->GetValue()), dec);
from_string<float>(canvas->lPos.x, string(txtLight[0]->GetValue()), dec);
from_string<float>(canvas->lPos.y, string(txtLight[1]->GetValue()), dec);
from_string<float>(canvas->lPos.z, string(txtLight[2]->GetValue()), dec);
from_string<float>(canvas->vPos.x, string(txtPos[0]->GetValue()), dec);
from_string<float>(canvas->vPos.y, string(txtPos[1]->GetValue()), dec);
from_string<float>(canvas->vPos.z, string(txtPos[2]->GetValue()), dec);
canvas->SetupProjection();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -