|
|
|
@ -8,57 +8,67 @@ |
|
|
|
#include "aixlog.hpp" |
|
|
|
#include "aixlog.hpp" |
|
|
|
|
|
|
|
|
|
|
|
#include "entity.h" |
|
|
|
#include "entity.h" |
|
|
|
|
|
|
|
#include "hexgrid.h" |
|
|
|
#include "mesh.h" |
|
|
|
#include "mesh.h" |
|
|
|
#include "util.h" |
|
|
|
#include "util.h" |
|
|
|
#include "scene_loader.h" |
|
|
|
#include "scene_loader.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct slSceneDoc |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
rapidjson::Document* doc; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// forward declarations
|
|
|
|
// forward declarations
|
|
|
|
bool parseFile(rapidjson::Document& doc, const char* data_dir, const char* file_name); |
|
|
|
bool parseFile(rapidjson::Document* doc, const char* data_dir, const char* file_name); |
|
|
|
glm::vec3 parseVec3(const rapidjson::Value& node); |
|
|
|
glm::vec3 parseVec3(const rapidjson::Value& node); |
|
|
|
glm::vec4 parseVec4(const rapidjson::Value& node); |
|
|
|
glm::vec4 parseVec4(const rapidjson::Value& node); |
|
|
|
bool validateScene(rapidjson::Document& schema_doc, rapidjson::Document& scene_doc, |
|
|
|
bool validateScene(rapidjson::Document* schema_doc, rapidjson::Document* scene_doc, |
|
|
|
const char* scene_file); |
|
|
|
const char* scene_file); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// interface
|
|
|
|
// interface
|
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
slSceneDoc* |
|
|
|
slLoadFile( |
|
|
|
slLoadFile(const char* data_dir, const char* scene_file, const char* schema_file) |
|
|
|
const char* data_dir, |
|
|
|
|
|
|
|
const char* scene_file, |
|
|
|
|
|
|
|
const char* schema_file, |
|
|
|
|
|
|
|
Entity* entity_array, |
|
|
|
|
|
|
|
uint& entity_count, |
|
|
|
|
|
|
|
uint max_entities, |
|
|
|
|
|
|
|
camera& cam) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
if (entity_array == nullptr) { |
|
|
|
|
|
|
|
LOG(ERROR) << "entity array not initialized\n"; |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LOG(INFO) << "Loading scene file: " << scene_file << "\n"; |
|
|
|
LOG(INFO) << "Loading scene file: " << scene_file << "\n"; |
|
|
|
rapidjson::Document doc, schema_doc; |
|
|
|
rapidjson::Document schema_doc; |
|
|
|
bool retDoc = parseFile(doc, data_dir, scene_file); |
|
|
|
slSceneDoc* sd = UTIL_ALLOC(1, slSceneDoc); |
|
|
|
bool retSchema = parseFile(schema_doc, data_dir, schema_file); |
|
|
|
sd->doc = new rapidjson::Document(); |
|
|
|
|
|
|
|
|
|
|
|
if (!retDoc || !retSchema || !validateScene(schema_doc, doc, scene_file)) |
|
|
|
bool retDoc = parseFile(sd->doc, data_dir, scene_file); |
|
|
|
return false; |
|
|
|
bool retSchema = parseFile(&schema_doc, data_dir, schema_file); |
|
|
|
|
|
|
|
|
|
|
|
// camera
|
|
|
|
if (!retDoc || !retSchema || !validateScene(&schema_doc, sd->doc, scene_file)) { |
|
|
|
const rapidjson::Value& json_cam = doc["camera"]; |
|
|
|
slFreeSceneDoc(sd); |
|
|
|
cameraInitPerspective(cam, |
|
|
|
return nullptr; |
|
|
|
parseVec3(json_cam["position"]), |
|
|
|
} |
|
|
|
parseVec3(json_cam["target"]), |
|
|
|
|
|
|
|
parseVec3(json_cam["up"]) |
|
|
|
return sd; |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
|
|
slFreeSceneDoc(slSceneDoc* sd) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (sd->doc != nullptr) { |
|
|
|
|
|
|
|
delete sd->doc; |
|
|
|
|
|
|
|
sd->doc = nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// hex grid
|
|
|
|
utilSafeFree(sd); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// entities
|
|
|
|
bool |
|
|
|
const rapidjson::Value& entities = doc["entities"]; |
|
|
|
slParseEntities( |
|
|
|
|
|
|
|
slSceneDoc* sd, |
|
|
|
|
|
|
|
Entity* entity_array, |
|
|
|
|
|
|
|
uint& entity_count, |
|
|
|
|
|
|
|
uint max_entities, |
|
|
|
|
|
|
|
const char* data_dir) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
const rapidjson::Value& entities = (*sd->doc)["entities"]; |
|
|
|
if (entities.Size() > max_entities) { |
|
|
|
if (entities.Size() > max_entities) { |
|
|
|
LOG(ERROR) << "entity count: " << entities.Size() << ", was more than max_entities: " |
|
|
|
LOG(ERROR) << "entity count: " << entities.Size() << ", was more than max_entities: " |
|
|
|
<< max_entities << "\n"; |
|
|
|
<< max_entities << "\n"; |
|
|
|
@ -83,13 +93,25 @@ slLoadFile( |
|
|
|
entity_count++; |
|
|
|
entity_count++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// lights
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
|
|
slParseCamera(slSceneDoc* sd, camera& cam) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
const rapidjson::Value& json_cam = (*sd->doc)["camera"]; |
|
|
|
|
|
|
|
cameraInitPerspective(cam, |
|
|
|
|
|
|
|
parseVec3(json_cam["position"]), |
|
|
|
|
|
|
|
parseVec3(json_cam["target"]), |
|
|
|
|
|
|
|
parseVec3(json_cam["up"]) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// internal
|
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
parseFile(rapidjson::Document& doc, const char* data_dir, const char* file_name) |
|
|
|
parseFile(rapidjson::Document* doc, const char* data_dir, const char* file_name) |
|
|
|
{ |
|
|
|
{ |
|
|
|
bool ret = true; |
|
|
|
bool ret = true; |
|
|
|
std::string file_path; |
|
|
|
std::string file_path; |
|
|
|
@ -101,7 +123,7 @@ parseFile(rapidjson::Document& doc, const char* data_dir, const char* file_name) |
|
|
|
ret = false; |
|
|
|
ret = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (doc.Parse(contents).HasParseError() || !doc.IsObject()) { |
|
|
|
if (doc->Parse(contents).HasParseError() || !doc->IsObject()) { |
|
|
|
LOG(ERROR) << "Error parrsing scene file: " << file_name << "\n"; |
|
|
|
LOG(ERROR) << "Error parrsing scene file: " << file_name << "\n"; |
|
|
|
ret = false; |
|
|
|
ret = false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -112,12 +134,12 @@ parseFile(rapidjson::Document& doc, const char* data_dir, const char* file_name) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
validateScene(rapidjson::Document& schema_doc, rapidjson::Document& scene_doc, const char* scene_file) |
|
|
|
validateScene(rapidjson::Document* schema_doc, rapidjson::Document* scene_doc, const char* scene_file) |
|
|
|
{ |
|
|
|
{ |
|
|
|
rapidjson::SchemaDocument schema(schema_doc); |
|
|
|
rapidjson::SchemaDocument schema(*schema_doc); |
|
|
|
rapidjson::SchemaValidator validator(schema); |
|
|
|
rapidjson::SchemaValidator validator(schema); |
|
|
|
|
|
|
|
|
|
|
|
if (!scene_doc.Accept(validator)) { |
|
|
|
if (!scene_doc->Accept(validator)) { |
|
|
|
LOG(ERROR) << "Error validating scene file: " << scene_file << "\n"; |
|
|
|
LOG(ERROR) << "Error validating scene file: " << scene_file << "\n"; |
|
|
|
rapidjson::StringBuffer sb; |
|
|
|
rapidjson::StringBuffer sb; |
|
|
|
validator.GetInvalidSchemaPointer().StringifyUriFragment(sb); |
|
|
|
validator.GetInvalidSchemaPointer().StringifyUriFragment(sb); |
|
|
|
|