@@ -28,8 +28,9 @@ void MyScene::InitCollisionBox()
v.push_back(collisionBox);
collisionBox = new CollisionBox(Vector3(-370, 112.5, 130), 50, 35, 10);
v.push_back(collisionBox);
elevatorUp.push_back(CollisionBox(Vector3(-370, 32.5, 150), Vector3(20, 17.5, 15), Vector3(-20, -17.5, -15)));
elevatorDown.push_back(CollisionBox(Vector3(-370, 105, 150), Vector3(20, 5, 15), Vector3(-20, -5, -15)));
elevatorUp.push_back(CollisionBox(Vector3(-380, 10, 150), 40, 20, 30));
elevatorDown.push_back(CollisionBox(Vector3(-380, 100, 150), 40, 20, 30));
elevatorArea.push_back(CollisionBox(Vector3(-360, 80, 150), 80, 160, 30));

//Escalator Hitbox
collisionBox = new CollisionBox(Vector3(-290, 45, 260), 140, 90, 80); // Travelator
@@ -38,8 +39,4 @@ void MyScene::InitCollisionBox()
v.push_back(collisionBox);
travelatorUp.push_back(CollisionBox(Vector3(-290, 45, 280), 150, 90, 20));
travelatorDown.push_back(CollisionBox(Vector3(-295, 50, 240), 150, 90, 20));

//v.push_back(CollisionBox(Vector3(-350, 20, 150), 5, 15, 10)); //Elevator Door on Level One
collisionBox = new CollisionBox(Vector3(-350, 65, 150), 5, 150, 10); //Elevator Door on Level Two
v.push_back(collisionBox);
}
@@ -1,4 +1,5 @@
#include "MyScene.h"
#include "Application.h"

int MyScene::targeted(const std::vector<CollisionBox*> v)
{
@@ -19,4 +20,126 @@ int MyScene::targeted(const std::vector<CollisionBox*> v)
}
}
return -1;
}

bool MyScene::targeted(const CollisionBox collisionBox)
{

Vector3 view = camera.target - camera.position;
view.Normalize();

CollisionBox target(camera.position, 0, 0, 0);

for (int count1 = 10; count1 <= 20; count1++)
{
target.Centre += view;
if (target.checkCollision(collisionBox))
return true;
}
return false;
}

void MyScene::InteractDoor(double dt)
{
//Door will open when person stand at entrance
if(camera.position.z >= 295 && camera.position.z <= 400 && camera.position.x >= -70 && camera.position.x <= 70)
{
OpenDoorR += 120 * dt;
OpenDoorL -= 120 * dt;

if(OpenDoorR >= 70)
{
OpenDoorR -= 120 * dt;
}
if(OpenDoorL <= -70)
{
OpenDoorL += 120 * dt;
}
}

else if(camera.position.z >= 250 && camera.position.z <= 300 && camera.position.x >= -70 && camera.position.x <= 70)
{
OpenDoorR += 120 * dt;
OpenDoorL -= 120 * dt;
if(OpenDoorR >= 70)
{
OpenDoorR -= 120 * dt;
}

if(OpenDoorL <= -70)
{
OpenDoorL += 120 * dt;
}
}

else
{
OpenDoorR -= 120 * dt;
OpenDoorL += 120 * dt;

if(OpenDoorR <= -1)
{
OpenDoorR += 120 * dt;
}

if(OpenDoorL >= 1)
{
OpenDoorL -= 120 * dt;
}
}
}

void MyScene::InteractElevator(double dt)
{
if(cameraCollisionBox.checkCollision(elevatorUp) && Application::IsKeyPressed(VK_UP))
{
camera.position.y = 120;
camera.target.y = 120;
}
else if(cameraCollisionBox.checkCollision(elevatorDown) && Application::IsKeyPressed(VK_DOWN))
{
camera.position.y = 20;
camera.target.y = 20;
}
}

void MyScene::InteractElevatorButton(double dt)
{
if (targeted(eDoorButton1->collisionBox) || targeted(eDoorButton2->collisionBox))
{
if (Application::Mouse_Click(0) && !eDoorOpen)
{
eDoorOpen = true;
}
}

if (targeted(eDoor1->collisionBox) || targeted(eDoor2->collisionBox))
if(cameraCollisionBox.checkCollision(elevatorUp) || cameraCollisionBox.checkCollision(elevatorDown))
{
if (Application::Mouse_Click(0) && eDoorClosed)
{
eDoorOpen = true;
eDoorClosed = false;
}
}
}

void MyScene::InteractElevatorDoor(double dt)
{
if (eDoorOpen && eDoor1->collisionBox.Centre.y < 40)
{
eDoor1->collisionBox.Centre.y += 15 * dt;
eDoor2->collisionBox.Centre.y += 15 * dt;
}
else if (cameraCollisionBox.checkCollision(elevatorUp) || cameraCollisionBox.checkCollision(elevatorDown)) eDoorOpen = false;

if (!eDoorOpen && eDoor1->collisionBox.Centre.y > 0)
{
eDoor1->collisionBox.Centre.y -= 15 * dt;
eDoor2->collisionBox.Centre.y -= 15 * dt;
}

if (eDoor1->collisionBox.Centre.y < 0) eDoorClosed = true;

if (!cameraCollisionBox.checkCollision(elevatorArea)) eDoorOpen = false;
}
@@ -133,13 +133,6 @@ void MyScene::LoadMesh()
meshList[GEO_DOOR]->material.kSpecular.Set(0.1f, 0.1f, 0.1f);
meshList[GEO_DOOR]->material.kShininess = 10.f;

meshList[eDoor] = MeshBuilder::GenerateOBJ("eDoor", "OBJ//Door.obj");
meshList[eDoor]->textureID = LoadTGA("Image//metal.tga");
meshList[eDoor]->material.kAmbient.Set(0.8f, 0.8f, 0.8f);
meshList[eDoor]->material.kDiffuse.Set(0.6f, 0.6f, 0.6f);
meshList[eDoor]->material.kSpecular.Set(1.f, 1.f, 1.f);
meshList[eDoor]->material.kShininess = 3.f;

meshList[GEO_LIGHTBALL] = MeshBuilder::GenerateSphere("lightball", Color(1,1,1), 36, 36, 1);

meshList[GEO_TEXT] = MeshBuilder::GenerateText("text", 16, 16);
@@ -493,92 +486,112 @@ void MyScene::LoadMesh()
LoadPizzaMesh();
LoadDetergentMesh();
LoadChocolateMesh();
LoadAppleRedMesh();
LoadAppleGreenMesh();

meshList[TEST] = MeshBuilder::GenerateCube("test", Color(1, 0, 1));

//Display Circular cabinet
/*meshList[DisplayCircular] = MeshBuilder::GenerateOBJ("DisplayCircular", "OBJ//DisplayCircular.obj");
meshList[DisplayCircular]->textureID = LoadTGA("Image//DisplayCircular.tga");
meshList[DisplayCircular]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[DisplayCircular]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[DisplayCircular]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[DisplayCircular]->material.kShininess = 5.f;
NewObj->mesh = meshList[DisplayCircular];
NewObj->Position = Vector3(0, 11, 0);
NewObj->Size = Vector3(5, 5, 5);
NewObj->rotation = 0.0f;
NewObj->Rotation = Vector3(0, 1, 0);
NewObj->Name = "Circular Cabinet";
NewObj->Price = 0.00;
obj.push_back(NewObj);*/
//Toilet Door
meshList[ToiletDoor] = MeshBuilder::GenerateOBJ("ToiletDoor", "OBJ//ToiletDoor.obj");
meshList[ToiletDoor]->textureID = LoadTGA("Image//ToiletDoor.tga");
meshList[ToiletDoor]->material.kAmbient.Set(0.8f, 0.8f, 0.8f);
meshList[ToiletDoor]->material.kDiffuse.Set(0.6f, 0.6f, 0.6f);
meshList[ToiletDoor]->material.kSpecular.Set(1.f, 1.f, 1.f);
meshList[ToiletDoor]->material.kShininess = 3.f;

//Door Stand
meshList[eDoorStand] = MeshBuilder::GenerateOBJ("eDoorStand", "OBJ//doorStand.obj");
meshList[eDoorStand]->textureID = LoadTGA("Image//metal.tga");
meshList[eDoorStand]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[eDoorStand]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[eDoorStand]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[eDoorStand]->material.kShininess = 5.f;
NewObj = new Object;
NewObj->mesh = meshList[ToiletDoor];
NewObj->collisionBox = CollisionBox(Vector3(350, 0, -250), Vector3(0.5, 50, 15), Vector3(-0.5, 0, -15));
NewObj->size = Vector3(6, 10, 6);
NewObj->angle = -90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "ToiletDoor";
v.push_back(&NewObj->collisionBox);
obj.push_back(NewObj);

//Elevator Door
Mesh* door = MeshBuilder::GenerateOBJ("eDoor", "OBJ//Door.obj");
door->textureID = LoadTGA("Image//metal.tga");
door->material.kAmbient.Set(0.8f, 0.8f, 0.8f);
door->material.kDiffuse.Set(0.6f, 0.6f, 0.6f);
door->material.kSpecular.Set(1.f, 1.f, 1.f);
door->material.kShininess = 3.f;

NewObj = new Object;
NewObj->mesh = meshList[eDoorStand];
NewObj->collisionBox.Centre = Vector3(-340, 0, 130);
NewObj->size = Vector3(2, 2, 2);
NewObj->mesh = door;
NewObj->collisionBox = CollisionBox(Vector3(-350, 0, 150), Vector3(0.5, 50, 15), Vector3(-0.5, 0, -15));
NewObj->size = Vector3(4, 5, 1);
NewObj->angle = 90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "eDoorStand";
NewObj->name = "eDoor1";
obj.push_back(NewObj);

//Door Button
meshList[eDoorButton] = MeshBuilder::GenerateOBJ("eDoorButton", "OBJ//Button.obj");
meshList[eDoorButton]->textureID = LoadTGA("Image//Button.tga");
meshList[eDoorButton]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[eDoorButton]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[eDoorButton]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[eDoorButton]->material.kShininess = 5.f;
eDoor1 = NewObj;
v.push_back(&NewObj->collisionBox);

NewObj = new Object;
NewObj->mesh = meshList[eDoorButton];
NewObj->collisionBox.Centre = Vector3(-339, 14, 130);
NewObj->size = Vector3(2, 2, 2);
NewObj->mesh = door;
NewObj->collisionBox = CollisionBox(Vector3(-350, 90, 150), Vector3(0.5, 50, 15), Vector3(-0.5, 0, -15));
NewObj->size = Vector3(4, 5, 1);
NewObj->angle = 90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "eDoorButton";
NewObj->name = "eDoor2";
obj.push_back(NewObj);
eDoor2 = NewObj;
v.push_back(&NewObj->collisionBox);

//Door Stand
meshList[eDoorStand2] = MeshBuilder::GenerateOBJ("eDoorStand2", "OBJ//doorStand.obj");
meshList[eDoorStand2]->textureID = LoadTGA("Image//metal.tga");
meshList[eDoorStand2]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[eDoorStand2]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[eDoorStand2]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[eDoorStand2]->material.kShininess = 5.f;
Mesh* stand = MeshBuilder::GenerateOBJ("eDoorStand", "OBJ//doorStand.obj");
stand->textureID = LoadTGA("Image//metal.tga");
stand->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
stand->material.kDiffuse.Set(1.f, 1.f, 1.f);
stand->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
stand->material.kShininess = 5.f;

NewObj = new Object;
NewObj->mesh = stand;
NewObj->collisionBox = CollisionBox(Vector3(-340, 0, 130), Vector3(3, 15, 3), Vector3(-3, 0, -3));
NewObj->size = Vector3(2, 2, 2);
NewObj->angle = 90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "eDoorStand1";
obj.push_back(NewObj);
v.push_back(&NewObj->collisionBox);

NewObj = new Object;
NewObj->mesh = meshList[eDoorStand2];
NewObj->collisionBox.Centre = Vector3(-340, 91, 130);
NewObj->mesh = stand;
NewObj->collisionBox = CollisionBox(Vector3(-340, 90, 130), Vector3(3, 15, 3), Vector3(-3, 0, -3));
NewObj->size = Vector3(2, 2, 2);
NewObj->angle = 90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "eDoorStand2";
obj.push_back(NewObj);
v.push_back(&NewObj->collisionBox);

//Door Button
meshList[eDoorButton2] = MeshBuilder::GenerateOBJ("eDoorButton2", "OBJ//Button.obj");
meshList[eDoorButton2]->textureID = LoadTGA("Image//Button.tga");
meshList[eDoorButton2]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[eDoorButton2]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[eDoorButton2]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[eDoorButton2]->material.kShininess = 5.f;

Mesh* button = MeshBuilder::GenerateOBJ("eDoorButton", "OBJ//Button.obj");
button->textureID = LoadTGA("Image//Button.tga");
button->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
button->material.kDiffuse.Set(1.f, 1.f, 1.f);
button->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
button->material.kShininess = 5.f;

NewObj = new Object;
NewObj->mesh = button;
NewObj->collisionBox = CollisionBox(Vector3(-339, 15, 130), 3, 3, 3);
NewObj->size = Vector3(2, 2, 2);
NewObj->angle = 90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "eDoorButton1";
obj.push_back(NewObj);
eDoorButton1 = NewObj;

NewObj = new Object;
NewObj->mesh = meshList[eDoorButton2];
NewObj->collisionBox.Centre = Vector3(-339, 105, 130);
NewObj->mesh = button;
NewObj->collisionBox = CollisionBox(Vector3(-339, 105, 130), 3, 3, 3);
NewObj->size = Vector3(2, 2, 2);
NewObj->angle = 90.0f;
NewObj->rotation = Vector3(0, 1, 0);
NewObj->name = "eDoorButton2";
obj.push_back(NewObj);
eDoorButton2 = NewObj;

//CheckList
meshList[CheckList] = MeshBuilder::GenerateQuad("CheckList", Color(1, 1, 1), 1, 1);
@@ -770,7 +783,7 @@ void MyScene::LoadDetergentMesh()
NewObj->name = "Detergent";
NewObj->collisionBox = CollisionBox(Vector3(0, 0, 0), Vector3(10, 10, 5), Vector3(-10, 0, -5));
NewObj->size = Vector3(1.5, 1.5, 1.5);
NewObj->price = 1.60;
NewObj->price = 3.60;
NewObj->collisionBox.Centre = Vector3(countx * 20, 2 + county * 8, countz * 7);
NewObj->collisionBox.Centre += shelf;
NewObj->position = count++;
@@ -783,5 +796,98 @@ void MyScene::LoadDetergentMesh()
}
}

void MyScene::LoadAppleRedMesh()
{
Gettable* newObj;
for (int typecount = 0; typecount < 5; typecount++)
{
std::string texturepath = "Image//AppleRed.tga";
texturepath += '1' + typecount;

meshList[AppleRed] = MeshBuilder::GenerateOBJ("AppleRed", "OBJ//AppleRed.obj");
meshList[AppleRed]->textureID = LoadTGA("Image//AppleRed.tga");
meshList[AppleRed]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[AppleRed]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[AppleRed]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[AppleRed]->material.kShininess = 5.f;

Vector3 Fruitstand;
for (int count = 0; count < obj.size(); count++)
{
if (obj[count]->name == "Fruitstand" && obj[count]->position == typecount)
Fruitstand = obj[count]->collisionBox.Centre;
}

for (float countx = -4.14, count = 0; countx < 1; countx++)
{
for (float county = 1.4; county < 2; county++)
{
for (float countz = 0.125; countz < 1; countz++)
{
newObj = new Gettable();
newObj->mesh = meshList[AppleRed];
newObj->name = "AppleRed";
newObj->collisionBox = CollisionBox(Vector3(0, 0, 0), Vector3(1.6, 4, 1.6), Vector3(-1.6, 0, -1.6));
newObj->size = Vector3(1, 1, 1);
newObj->price = 1.00;
newObj->collisionBox.Centre = Vector3(countx * 50, county * 8, countz * 50);
newObj->collisionBox.Centre += Fruitstand;
newObj->position = count++;
obj.push_back(newObj);
RedApple.push_back(newObj);
RedAppleCollisionBox.push_back(&(newObj->collisionBox));
}
}
}
}
}

void MyScene::LoadAppleGreenMesh()
{
Gettable* newObj;
for (int typecount = 0; typecount < 5; typecount++)
{
std::string texturepath = "Image//AppleGreen.tga";
texturepath += '1' + typecount;

meshList[AppleGreen] = MeshBuilder::GenerateOBJ("AppleGreen", "OBJ//AppleGreen.obj");
meshList[AppleGreen]->textureID = LoadTGA("Image//AppleGreen.tga");
meshList[AppleGreen]->material.kAmbient.Set(0.2f, 0.2f, 0.2f);
meshList[AppleGreen]->material.kDiffuse.Set(1.f, 1.f, 1.f);
meshList[AppleGreen]->material.kSpecular.Set(0.8f, 0.8f, 0.8f);
meshList[AppleGreen]->material.kShininess = 5.f;

Vector3 Fruitstand;
for (int count = 0; count < obj.size(); count++)
{
if (obj[count]->name == "Fruitstand" && obj[count]->position == typecount)
Fruitstand = obj[count]->collisionBox.Centre;
}

for (float countx = -4, count = 0; countx < 1; countx++)
{
for (float county = 1.5; county < 2; county++)
{
for (float countz = 0.125; countz < 1; countz++)
{
newObj = new Gettable();
newObj->mesh = meshList[AppleGreen];
newObj->name = "AppleGreen";
newObj->collisionBox = CollisionBox(Vector3(0, 0, 0), Vector3(1.6, 4, 1.6), Vector3(-1.6, 0, -1.6));
newObj->size = Vector3(1, 1, 1);
newObj->price = 1.00;
newObj->collisionBox.Centre = Vector3(countx * 50, county * 8, countz * 50);
newObj->collisionBox.Centre += Fruitstand;
newObj->position = count++;
obj.push_back(newObj);
GreenApple.push_back(newObj);
GreenAppleCollisionBox.push_back(&(newObj->collisionBox));
}
}
}
}
}




@@ -93,24 +93,6 @@ void MyScene::Render()
}modelStack.PopMatrix();

RenderSkyBox();
//Level 1 Elevator Door
modelStack.PushMatrix();
modelStack.Translate(-354, -2, 115);
modelStack.Rotate(90, 0, 1, 0);
modelStack.Scale(5.5, 4, 2);
modelStack.Translate(0, OpeneDoor, 0);
RenderMesh(meshList[eDoor], false);
modelStack.PopMatrix();

//Level 2 Elevator Door
modelStack.PushMatrix();
modelStack.Translate(-354, 88, 115);
modelStack.Rotate(90, 0, 1, 0);
modelStack.Scale(5.5, 4, 2);
modelStack.Translate(0, OpeneDoor2, 0);
RenderMesh(meshList[eDoor], false);
modelStack.PopMatrix();


modelStack.PushMatrix();
modelStack.Translate(-220, 0, 260);
@@ -163,27 +145,24 @@ void MyScene::Render()
RenderCharacter(shelfCharacters);

RenderTextOnScreen(meshList[GEO_TEXT], "FPS:" + to_string(fps), Color(0, 0, 0), 2, 30, 29.5);
RenderTextOnScreen(meshList[GEO_TEXT], "X:" + to_string(camera.position.x), Color(0, 0, 0), 2, 1, 24.5);
RenderTextOnScreen(meshList[GEO_TEXT], "Y:" + to_string(camera.position.y), Color(0, 0, 0), 2, 1, 25.5);
RenderTextOnScreen(meshList[GEO_TEXT], "Z:" + to_string(camera.position.z), Color(0, 0, 0), 2, 1, 26.5);
RenderTextOnScreen(meshList[GEO_TEXT], "X:" + to_string(camera.position.x), Color(1, 0, 1), 2, 1, 24.5);
RenderTextOnScreen(meshList[GEO_TEXT], "Y:" + to_string(camera.position.y), Color(1, 0, 1), 2, 1, 25.5);
RenderTextOnScreen(meshList[GEO_TEXT], "Z:" + to_string(camera.position.z), Color(1, 0, 1), 2, 1, 26.5);

RenderTextOnScreen(meshList[GEO_TEXT], "TargetX:" + to_string(camera.target.x), Color(0, 0, 0), 2, 1, 27.5);
RenderTextOnScreen(meshList[GEO_TEXT], "TargetY:" + to_string(camera.target.y), Color(0, 0, 0), 2, 1, 28.5);
RenderTextOnScreen(meshList[GEO_TEXT], "TargetZ:" + to_string(camera.target.z), Color(0, 0, 0), 2, 1, 29.5);

//Object information when camera position is close to object
for (int i = 0; i < obj.size(); i++)
if (targeted(eDoorButton1->collisionBox) || targeted(eDoorButton2->collisionBox))
{
if ((obj[i]->name == "eDoorButton") && (camera.target.x < obj[i]->collisionBox.Centre.x + 30) && (camera.target.x > obj[i]->collisionBox.Centre.x - 30) && (camera.target.y < obj[i]->collisionBox.Centre.y + 5) && (camera.target.y > obj[i]->collisionBox.Centre.y - 5) && (camera.target.z < obj[i]->collisionBox.Centre.z + 20) && (camera.target.z > obj[i]->collisionBox.Centre.z - 20))
{
RenderTextOnScreen(meshList[GEO_TEXT], "Click to open door", Color(1, 1, 0), 3, 1, 19);
}
else if ((obj[i]->name == "eDoorButton2") && (camera.target.x < obj[i]->collisionBox.Centre.x + 30) && (camera.target.x > obj[i]->collisionBox.Centre.x - 30) && (camera.target.y < obj[i]->collisionBox.Centre.y + 5) && (camera.target.y > obj[i]->collisionBox.Centre.y - 5) && (camera.target.z < obj[i]->collisionBox.Centre.z + 20) && (camera.target.z > obj[i]->collisionBox.Centre.z - 20))
{
RenderTextOnScreen(meshList[GEO_TEXT], "Click to open door", Color(1, 1, 0), 3, 1, 19);
}
RenderTextOnScreen(meshList[GEO_TEXT], "Click to open door", Color(1, 1, 0), 3, 1, 19);
}

if ((targeted(eDoor1->collisionBox) || targeted(eDoor2->collisionBox)))
{
RenderTextOnScreen(meshList[GEO_TEXT], "Click to open door", Color(1, 1, 0), 3, 1, 19);
}

//Elevator Interaction
if (camera.position.x < -360 && camera.position.y < 42 && camera.position.z < 160 && camera.position.z > 140)
{
@@ -528,8 +507,8 @@ void MyScene::RenderObjects()
{
modelStack.PushMatrix();
modelStack.Translate(obj[i]->collisionBox.Centre.x, obj[i]->collisionBox.Centre.y, obj[i]->collisionBox.Centre.z);
modelStack.Scale(obj[i]->size.x, obj[i]->size.y, obj[i]->size.z);
modelStack.Rotate(obj[i]->angle, obj[i]->rotation.x, obj[i]->rotation.y, obj[i]->rotation.z);
modelStack.Scale(obj[i]->size.x, obj[i]->size.y, obj[i]->size.z);
RenderMesh(obj[i]->mesh, false);
modelStack.PopMatrix();
}