-
-
Save rubenwardy/e058b66d5a7db080d62a to your computer and use it in GitHub Desktop.
Node Box texture per face
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "NodeBox.hpp" | |
void NodeBox::resizeNodeBoxFace(EditorState* editor, CDRType type, vector3df position, bool both){ | |
switch(type) { | |
case CDR_X_P: | |
if (both) { | |
f32 new_opp = one.X - (position.X - two.X); | |
if (editor->settings->getBool("limiting")==true){ | |
if (new_opp > 0.5 || new_opp < -0.5) | |
return; | |
} | |
one.X = new_opp; | |
} | |
two.X = position.X; | |
break; | |
case CDR_X_N: | |
if (both) { | |
f32 new_opp = two.X - (position.X - one.X); | |
if (editor->settings->getBool("limiting")==true){ | |
if (new_opp > 0.5 || new_opp < -0.5) | |
return; | |
} | |
two.X = new_opp; | |
} | |
one.X = position.X; | |
break; | |
case CDR_Y_P: | |
if (both) { | |
f32 new_opp = one.Y - (position.Y - two.Y); | |
if (editor->settings->getBool("limiting")==true){ | |
if (new_opp > 0.5 || new_opp < -0.5) | |
return; | |
} | |
one.Y = new_opp; | |
} | |
two.Y = position.Y; | |
break; | |
case CDR_Y_N: | |
if (both) { | |
f32 new_opp = two.Y - (position.Y - one.Y); | |
if (editor->settings->getBool("limiting")==true){ | |
if (new_opp > 0.5 || new_opp < -0.5) | |
return; | |
} | |
two.Y = new_opp; | |
} | |
one.Y = position.Y; | |
break; | |
case CDR_Z_P: | |
if (both) { | |
f32 new_opp = one.Z - (position.Z - two.Z); | |
if (editor->settings->getBool("limiting")==true){ | |
if (new_opp > 0.5 || new_opp < -0.5) | |
return; | |
} | |
one.Z = new_opp; | |
} | |
two.Z = position.Z; | |
break; | |
case CDR_Z_N: | |
if (both) { | |
f32 new_opp = two.Z - (position.Z - one.Z); | |
if (editor->settings->getBool("limiting")==true){ | |
if (new_opp > 0.5 || new_opp < -0.5) | |
return; | |
} | |
two.Z = new_opp; | |
} | |
one.Z = position.Z; | |
break; | |
} | |
} | |
void NodeBox::moveNodeBox(EditorState* editor, CDRType type, vector3df position){ | |
vector3df new_one = one; | |
vector3df new_two = two; | |
vector3df move_dist = vector3df(0,0,0); | |
switch(type) { | |
case CDR_XZ: | |
move_dist = vector3df( | |
position.X - GetCenter().X, | |
0, | |
position.Z - GetCenter().Z | |
); | |
break; | |
case CDR_XY: | |
move_dist = vector3df( | |
position.X - GetCenter().X, | |
position.Y - GetCenter().Y, | |
0 | |
); | |
break; | |
case CDR_ZY: | |
move_dist = vector3df( | |
0, | |
position.Y - GetCenter().Y, | |
position.Z - GetCenter().Z | |
); | |
break; | |
} | |
if (move_dist.X != 0){ | |
if ( | |
(new_one.X + move_dist.X <= 0.5 && | |
new_one.X + move_dist.X >= -0.5 && | |
new_two.X + move_dist.X <= 0.5 && | |
new_two.X + move_dist.X >= -0.5) || | |
!editor->settings->getBool("limiting")) { | |
new_one.X += move_dist.X; | |
new_two.X += move_dist.X; | |
} | |
} | |
if (move_dist.Y != 0){ | |
if ( | |
(new_one.Y + move_dist.Y <= 0.5 && | |
new_one.Y + move_dist.Y >= -0.5 && | |
new_two.Y + move_dist.Y <= 0.5 && | |
new_two.Y + move_dist.Y >= -0.5) || | |
!editor->settings->getBool("limiting")) { | |
new_one.Y += move_dist.Y; | |
new_two.Y += move_dist.Y; | |
} | |
} | |
if (move_dist.Z != 0) { | |
if ( | |
(new_one.Z + move_dist.Z <= 0.5 && | |
new_one.Z + move_dist.Z >= -0.5 && | |
new_two.Z + move_dist.Z <= 0.5 && | |
new_two.Z + move_dist.Z >= -0.5) || | |
!editor->settings->getBool("limiting")) { | |
new_one.Z += move_dist.Z; | |
new_two.Z += move_dist.Z; | |
} | |
} | |
one = new_one; | |
two = new_two; | |
} | |
void NodeBox::buildNode(vector3di nd_position, IrrlichtDevice* device) { | |
video::IVideoDriver* driver = device->getVideoDriver(); | |
ISceneManager* smgr = device->getSceneManager(); | |
if (model) { | |
model->remove(); | |
model = NULL; | |
} | |
vector3df position = vector3df( | |
nd_position.X + one.X + ((two.X - one.X) / 2) - 0.5, | |
nd_position.Y + one.Y + ((two.Y - one.Y) / 2) - 0.5, | |
nd_position.Z + one.Z + ((two.Z - one.Z) / 2) - 0.5 | |
); | |
vector3df size = vector3df( | |
two.X - one.X, | |
two.Y - one.Y, | |
two.Z - one.Z | |
); | |
static video::ITexture *texture1 = driver->getTexture("media/texture_box.png"); | |
static video::ITexture *texture2 = driver->getTexture("media/texture_terrain.png"); | |
f32 cubeSize = 1.f; | |
video::SColor cubeColour(255, 255, 255, 255); | |
std::cerr << "Starting..." << std::endl; | |
SMeshBuffer *buffer = new SMeshBuffer(); | |
SMeshBuffer *buffer2 = new SMeshBuffer(); | |
u16 u[6] = {0,2,1, 0,3,2}; | |
std::cerr << "Setting indices" << std::endl; | |
buffer->Indices.set_used(6); | |
buffer2->Indices.set_used(6); | |
for (s32 i=0; i<6; ++i) | |
{ | |
buffer->Indices.push_back( u[i] ); | |
buffer2->Indices.push_back( u[i] ); | |
} | |
// Front face | |
std::cerr << "Setting vertices of buffer 1" << std::endl; | |
buffer->Vertices.set_used(4); | |
buffer->Vertices[0] = video::S3DVertex(0,0,0, -1,-1,-1, cubeColour, 0, 1); | |
buffer->Vertices[1] = video::S3DVertex(1,0,0, 1,-1,-1, cubeColour, 1, 1); | |
buffer->Vertices[2] = video::S3DVertex(1,1,0, 1, 1,-1, cubeColour, 1, 0); | |
buffer->Vertices[3] = video::S3DVertex(0,1,0, -1, 1,-1, cubeColour, 0, 0); | |
// Back face | |
std::cerr << "Setting vertices of buffer 2" << std::endl; | |
buffer2->Vertices.set_used(4); | |
buffer2->Vertices[0] = video::S3DVertex(0,1,1, -1, 1, 1, cubeColour, 1, 0); | |
buffer2->Vertices[1] = video::S3DVertex(1,1,1, 1, 1, 1, cubeColour, 0, 0); | |
buffer2->Vertices[2] = video::S3DVertex(1,0,1, 1, -1, 1, cubeColour, 0, 1); | |
buffer2->Vertices[3] = video::S3DVertex(0,0,1, -1,-1, 1, cubeColour, 1, 1); | |
/* bounding box reset for both buffers here */ | |
std::cerr << "bounding box" << std::endl; | |
buffer->BoundingBox.reset(0,0,0); | |
buffer2->BoundingBox.reset(0,0,0); | |
std::cerr << "mesh" << std::endl; | |
SMesh * cubeMesh = new SMesh(); | |
cubeMesh->addMeshBuffer(buffer); | |
cubeMesh->addMeshBuffer(buffer2); | |
buffer->drop(); | |
buffer2->drop(); | |
std::cerr << "node" << std::endl; | |
model = smgr->addMeshSceneNode(cubeMesh); | |
cubeMesh->drop(); | |
model->setPosition(position); | |
std::cerr << "texture" << std::endl; | |
//Set material per scene node, material count should be the same as buffer count | |
model->setMaterialTexture(0, texture1); | |
model->setMaterialTexture(1, texture2); | |
std::cerr << "mc: " << model->getMaterialCount() << std::endl; | |
model->setMaterialType(EMT_SOLID); | |
model->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); | |
model->setMaterialFlag(EMF_LIGHTING, false); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment