Add node rotating

master
rubenwardy 2014-11-05 17:31:17 +00:00
parent c16ab4632c
commit c77c446849
10 changed files with 144 additions and 34 deletions

BIN
media/rotate_x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

BIN
media/rotate_y.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

BIN
media/rotate_z.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

View File

@ -83,6 +83,7 @@ void MenuState::init()
), false, true, 0, GUI_SIDEBAR
);
sidebar->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
sidebar->setNotClipped(true);
}
bool MenuState::OnEvent(const SEvent& event){

View File

@ -20,7 +20,10 @@ enum NODEBOX_EDITOR_GUI_IDS {
ENB_GUI_PROP_Z2,
ENB_GUI_PROP_NAME,
ENB_GUI_PROP_UPDATE,
ENB_GUI_PROP_REVERT
ENB_GUI_PROP_REVERT,
ENB_GUI_ROT_X,
ENB_GUI_ROT_Y,
ENB_GUI_ROT_Z
};
NBEditor::NBEditor(EditorState* st) :
@ -54,7 +57,8 @@ void NBEditor::load()
rect<s32>(20, 30, 140, 100),
false, true, sidebar, ENB_GUI_MAIN_MSG);
IGUIListBox* lb = guienv->addListBox(rect<s32>(20, 30, 230, 128),
IGUIListBox *lb = guienv->addListBox(rect<s32>(20, 35, 230, 133),
sidebar, ENB_GUI_MAIN_LISTBOX, true);
if (lb) {
@ -67,6 +71,24 @@ void NBEditor::load()
b2->setNotClipped(true);
}
// Rotate X
static ITexture *rot_x = state->device->getVideoDriver()->getTexture("media/rotate_x.png");
IGUIButton *btn = guienv->addButton(rect<s32>(120, 0, 120+32, 32), sidebar, ENB_GUI_ROT_X, L"", L"Rotate node through X axis");
btn->setImage(rot_x);
btn->setUseAlphaChannel(true);
// Rotate Y
static ITexture *rot_y = state->device->getVideoDriver()->getTexture("media/rotate_y.png");
btn = guienv->addButton(rect<s32>(120 + (32+5)*1, 0, 120+32 + (32+5)*1, 32), sidebar, ENB_GUI_ROT_Y, L"", L"Rotate node through Y axis");
btn->setImage(rot_y);
btn->setUseAlphaChannel(true);
// Rotate Z|
static ITexture *rot_z = state->device->getVideoDriver()->getTexture("media/rotate_z.png");
btn = guienv->addButton(rect<s32>(120 + (32+5)*2, 0, 120+32 + (32+5)*2, 32), sidebar, ENB_GUI_ROT_Z, L"", L"Rotate node through Z axis");
btn->setImage(rot_z);
btn->setUseAlphaChannel(true);
// Create nodebox properties
t = guienv->addStaticText(L"Properties",
rect<s32>(0, 170, 120, 190),
@ -411,6 +433,24 @@ bool NBEditor::OnEvent(const irr::SEvent &event) {
case ENB_GUI_PROP_UPDATE:
updateProperties();
break;
case ENB_GUI_ROT_X: {
Node* node = state->project->GetCurrentNode();
if (node)
node->rotate(EAX_X);
break;
}
case ENB_GUI_ROT_Y: {
Node* node = state->project->GetCurrentNode();
if (node)
node->rotate(EAX_Y);
break;
}
case ENB_GUI_ROT_Z: {
Node* node = state->project->GetCurrentNode();
if (node)
node->rotate(EAX_Z);
break;
}
}
} else if (event.GUIEvent.EventType == EGET_LISTBOX_CHANGED) {
Node* node = state->project->GetCurrentNode();

View File

@ -99,7 +99,8 @@ void Node::setTexture(CubeSide face, Media::Image *image)
}
// Build node models
void Node::remesh() {
void Node::remesh()
{
for (std::vector<NodeBox*>::iterator it = boxes.begin();
it != boxes.end();
++it) {
@ -107,7 +108,8 @@ void Node::remesh() {
}
}
void Node::remesh(NodeBox *box) {
void Node::remesh(NodeBox *box)
{
box->buildNode(state, position, device, images);
}
@ -124,4 +126,13 @@ void Node::hide()
}
}
void Node::rotate(EAxis axis) {
for (std::vector<NodeBox*>::iterator it = boxes.begin();
it != boxes.end();
++it) {
(*it)->rotate(axis);
}
remesh();
}

View File

@ -29,6 +29,7 @@ public:
void remesh(); // creates the node mesh
void remesh(NodeBox *box);
void setAllTextures(Media::Image *def);
void rotate(EAxis axis);
void hide();
void setTexture(CubeSide face, Media::Image *image);

View File

@ -383,3 +383,52 @@ void NodeBox::buildNode(EditorState* editor, vector3di nd_position, IrrlichtDevi
model->setMaterialFlag(EMF_LIGHTING, false);
}
void NodeBox::rotate(EAxis axis)
{
switch (axis) {
case EAX_X: {
f32 tmp = one.X;
one.X = one.Y;
one.Y = -tmp;
tmp = two.X;
two.X = two.Y;
two.Y = -tmp;
break;
}
case EAX_Y: {
f32 tmp = one.X;
one.X = one.Z;
one.Z = -tmp;
tmp = two.X;
two.X = two.Z;
two.Z = -tmp;
break;
}
case EAX_Z: {
f32 tmp = one.Z;
one.Z = one.Y;
one.Y = -tmp;
tmp = two.Z;
two.Z = two.Y;
two.Y = -tmp;
break;
}};
// Check relative sizes
if (one.X > two.X) {
f32 tmp = one.X;
one.X = two.X;
two.X = tmp;
}
if (one.Y > two.Y) {
f32 tmp = one.Y;
one.Y = two.Y;
two.Y = tmp;
}
if (one.Z > two.Z) {
f32 tmp = one.Z;
one.Z = two.Z;
two.Z = tmp;
}
}

View File

@ -46,6 +46,7 @@ public:
void resizeNodeBoxFace(EditorState* editor, CDRType type, vector3df position, bool both);
void moveNodeBox(EditorState* editor, CDRType type, vector3df position);
void buildNode(EditorState* editor, vector3di nd_position, IrrlichtDevice* device, Media::Image* images[6]);
void rotate(EAxis axis);
};
#endif

View File

@ -27,6 +27,13 @@ enum CubeSide
ECS_FRONT
};
enum EAxis
{
EAX_X,
EAX_Y,
EAX_Z
};
enum Viewport
{
VIEW_TL = 0,