Skip to content

Instantly share code, notes, and snippets.

@rubenwardy
Created July 7, 2014 18:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rubenwardy/e058b66d5a7db080d62a to your computer and use it in GitHub Desktop.
Save rubenwardy/e058b66d5a7db080d62a to your computer and use it in GitHub Desktop.
Node Box texture per face
#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