105 lines
2.7 KiB
C++
105 lines
2.7 KiB
C++
#include <App/V8/World/World.hpp>
|
|
#include <App/V8/DataModel/PartInstance.hpp>
|
|
#include <App/GUI/SelectionBox.hpp>
|
|
#include <pugixml.hpp>
|
|
|
|
namespace RNR
|
|
{
|
|
World::World(Ogre::Root* ogre, Ogre::SceneManager* ogreSceneManager)
|
|
{
|
|
Instance::setWorld(this);
|
|
|
|
m_ogreRoot = ogre;
|
|
m_ogreSceneManager = ogreSceneManager;
|
|
m_datamodel = new Instance();
|
|
m_datamodel->setName("DataModel");
|
|
m_workspace = new Workspace();
|
|
m_workspace->setParent(m_datamodel);
|
|
|
|
load("/home/caesium/Downloads/Telegram Desktop/Destroy-History-1.rbxl");
|
|
}
|
|
|
|
World::~World()
|
|
{
|
|
//
|
|
}
|
|
|
|
void World::xmlAddItem(pugi::xml_node node, Instance* parent)
|
|
{
|
|
bool skip = false;
|
|
Instance* instance;
|
|
pugi::xml_attribute class_attr = node.attribute("class");
|
|
|
|
if(class_attr.as_string() == std::string("Part"))
|
|
{
|
|
instance = new PartInstance();
|
|
}
|
|
else if(class_attr.as_string() == std::string("Workspace"))
|
|
{
|
|
instance = m_workspace;
|
|
}
|
|
else if(class_attr.as_string() == std::string("Model"))
|
|
{
|
|
instance = new ModelInstance();
|
|
}
|
|
else
|
|
{
|
|
printf("World::xmlAddItem: adding unknown class\n");
|
|
instance = new Instance();
|
|
}
|
|
|
|
if(!skip)
|
|
{
|
|
pugi::xml_node props = node.child("Properties");
|
|
for(pugi::xml_node prop : props.children())
|
|
instance->deserializeXmlProperty(prop);
|
|
instance->setParent(parent);
|
|
}
|
|
|
|
for(pugi::xml_node item = node.child("Item"); item; item = item.next_sibling("Item"))
|
|
{
|
|
xmlAddItem(item, instance);
|
|
}
|
|
|
|
if(class_attr.as_string() == std::string("Model"))
|
|
{
|
|
((ModelInstance*)instance)->build();
|
|
}
|
|
}
|
|
|
|
void World::load(char* path)
|
|
{
|
|
pugi::xml_document rbxl_doc;
|
|
pugi::xml_parse_result result = rbxl_doc.load_file(path);
|
|
if(result)
|
|
{
|
|
printf("World::load: XML parsed without errors\n");
|
|
|
|
pugi::xml_node root = rbxl_doc.child("roblox");
|
|
for(pugi::xml_node item = root.child("Item"); item; item = item.next_sibling("Item"))
|
|
{
|
|
xmlAddItem(item, m_datamodel);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("World::load: XML parsed with errors, description '%s', offset %i\n", result.description(), result.offset);
|
|
}
|
|
m_workspace->build();
|
|
}
|
|
|
|
void World::preStep()
|
|
{
|
|
//
|
|
}
|
|
|
|
double World::step(float timestep)
|
|
{
|
|
return 0.0;
|
|
}
|
|
|
|
void World::update()
|
|
{
|
|
m_workspace->buildGeom();
|
|
}
|
|
} |