Very unstable and broken XML loader added.

This commit is contained in:
MusicalProgrammer
2018-10-28 21:00:34 -04:00
parent 6ec4ab466d
commit d0b0ffd7f1
10 changed files with 620 additions and 20 deletions

View File

@@ -1,8 +1,188 @@
#include <string>
#include "DataModelInstance.h"
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
using namespace rapidxml;
PhysicalInstance* DataModelInstance::makePart()
{
PhysicalInstance* part = new PhysicalInstance();
return part;
}
rapidxml::xml_node<>* DataModelInstance::getNode(xml_node<> * node,const char* name)
{
xml_node<> * tempNode = node->first_node(name);
if (!tempNode)
{
_errMsg = "Expected <";
_errMsg += name;
_errMsg+="> tag.";
_successfulLoad=true;
return 0;
}
return tempNode;
}
float DataModelInstance::getFloatValue(xml_node<> * node,const char* name)
{
xml_node<> * tempNode = node->first_node(name);
if (!tempNode)
{
_errMsg = "Expected <";
_errMsg += name;
_errMsg+="> tag.";
_successfulLoad=true;
return 0;
}
float newFloat;
stringstream converter;
converter << tempNode->value();
converter >> newFloat;
return newFloat;
}
bool DataModelInstance::scanXMLObject(xml_node<> * scanNode)
{
xml_node<> * watchFirstNode = scanNode->first_node();
for (xml_node<> *node = scanNode->first_node();node; node = node->next_sibling())
{
if (strncmp(node->name(),"Item",4)==0)
{
xml_attribute<> *classAttr = node->first_attribute("class");
std::string className = classAttr->value();
if (className=="Part") {
xml_node<> *propNode = node->first_node();
xml_node<> *cFrameNode=0;
xml_node<> *sizeNode=0;
xml_node<> *colorNode=0;
for (xml_node<> *partPropNode = propNode->first_node();partPropNode; partPropNode = partPropNode->next_sibling())
{
for (xml_attribute<> *attr = partPropNode->first_attribute();attr; attr = attr->next_attribute())
{
std::string xmlName = attr->name();
std::string xmlValue = attr->value();
if (xmlValue=="CFrame" | xmlValue=="CoordinateFrame")
{
cFrameNode = partPropNode;
}
if (xmlValue=="Color")
{
colorNode=partPropNode;
}
if (xmlValue=="size")
{
sizeNode = partPropNode;
}
if (xmlValue=="Part")
{
for (xml_node<> *featureNode = partPropNode->first_node();featureNode; featureNode = featureNode->next_sibling())
{
for (xml_attribute<> *attr = featureNode->first_attribute();attr; attr = attr->next_attribute())
{
std::string xmlName = attr->name();
std::string xmlValue = attr->value();
if (xmlValue=="size")
{
sizeNode=featureNode;
}
}
}
}
}
}
if (!cFrameNode) {
_errMsg="CFrame is missing in Part";
return false;
}
if (!sizeNode) {
_errMsg="Size is missing in Part";
return false;
}
float R=1;
float G=1;
float B=1;
if (colorNode)
{
R = getFloatValue(colorNode,"R");
G = getFloatValue(colorNode,"G");
B = getFloatValue(colorNode,"B");
}
float X = getFloatValue(cFrameNode,"X");
float Y = getFloatValue(cFrameNode,"Y");
float Z = getFloatValue(cFrameNode,"Z");
float R00 = getFloatValue(cFrameNode,"R00");
float R01 = getFloatValue(cFrameNode,"R01");
float R02 = getFloatValue(cFrameNode,"R02");
float R10 = getFloatValue(cFrameNode,"R10");
float R11 = getFloatValue(cFrameNode,"R11");
float R12 = getFloatValue(cFrameNode,"R12");
float R20 = getFloatValue(cFrameNode,"R20");
float R21 = getFloatValue(cFrameNode,"R21");
float R22 = getFloatValue(cFrameNode,"R22");
float sizeX = getFloatValue(sizeNode,"X");
float sizeY = getFloatValue(sizeNode,"Y");
float sizeZ = getFloatValue(sizeNode,"Z");
if (_successfulLoad) {
PhysicalInstance* test = makePart();
test->setParent(getWorkspace());
test->color = Color3(R,G,B);
test->setSize(Vector3(sizeX,sizeY,sizeZ));
test->setCFrame(Matrix3(R00,R01,R02,R10,R11,R12,R20,R21,R22)*Vector3(X,Y,Z));
}
else
{
return false;
}
}
}
/*
for (xml_attribute<> *attr = node->first_attribute();attr; attr = attr->next_attribute())
{
std::string xmlName = attr->name();
std::string xmlValue = attr->value();
}
*/
scanXMLObject(node);
}
return true;
}
bool DataModelInstance::load()
{
ifstream levelFile("skooter.rbxm");
if (levelFile) {
levelFile.seekg(0,levelFile.end);
int length = levelFile.tellg();
levelFile.seekg(0,levelFile.beg);
char * buffer = new char[length+1];
buffer[length]=0;
levelFile.read(buffer,length);
xml_document<> doc;
doc.parse<0>(buffer);
xml_node<> *mainNode = doc.first_node();
std::string xmlName = mainNode->name();
//node = node->first_node();
//xmlName = node->name();
scanXMLObject(mainNode);
delete[] buffer;
}
return true;
}
DataModelInstance::DataModelInstance(void)
{

View File

@@ -1,6 +1,8 @@
#pragma once
#include "rapidxml/rapidxml.hpp"
#include "instance.h"
#include "WorkspaceInstance.h"
#include "PhysicalInstance.h"
class DataModelInstance :
public Instance
@@ -8,20 +10,29 @@ class DataModelInstance :
public:
DataModelInstance(void);
~DataModelInstance(void);
void setMessage(std::string);
void clearMessage();
void drawMessage(RenderDevice*);
WorkspaceInstance* getWorkspace();
WorkspaceInstance* workspace;
Instance* guiRoot;
std::string message;
bool showMessage;
G3D::GFontRef font;
Instance* getGuiRoot();
float mousex;
float mousey;
Vector2 getMousePos();
void setMousePos(int x,int y);
void setMousePos(Vector2 pos);
bool mouseButton1Down;
void setMessage(std::string);
void clearMessage();
bool load();
bool printIfLoadError(const char* errorMsg);
void drawMessage(RenderDevice*);
WorkspaceInstance* getWorkspace();
WorkspaceInstance* workspace;
Instance* guiRoot;
std::string message;
bool showMessage;
G3D::GFontRef font;
Instance* getGuiRoot();
float mousex;
float mousey;
Vector2 getMousePos();
void setMousePos(int x,int y);
void setMousePos(Vector2 pos);
bool mouseButton1Down;
PhysicalInstance* makePart();
private:
bool scanXMLObject(rapidxml::xml_node<>* node);
rapidxml::xml_node<>* getNode(rapidxml::xml_node<> * node,const char* name );
float getFloatValue(rapidxml::xml_node<> * node,const char* name);
bool _successfulLoad;
std::string _errMsg;
};

View File

@@ -56,9 +56,9 @@ void PhysicalInstance::setSize(Vector3 newSize)
if(sizex > 512)
sizex = 512;
int sizey = (int)newSize.y;
float sizey = newSize.y;
if(sizey <= 0)
sizey = 1;
sizey = 0.4;
if(sizey > 512)
sizey = 512;

View File

@@ -708,7 +708,10 @@ void Demo::onInit() {
initGUI();
dataModel->load();
// Say bye bye to this soon...
/*
PhysicalInstance* test = makePart();
test->setParent(dataModel->getWorkspace());
test->color = Color3(0.2F,0.3F,1);
@@ -784,7 +787,7 @@ void Demo::onInit() {
test->color = Color3::gray();
test->setSize(Vector3(4,1,2));
test->setPosition(Vector3(2,7,0));
*/

406
rapidxml/manual.html Normal file

File diff suppressed because one or more lines are too long