| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- /*
- Copyright (C) 2011 by Ivan Safrin
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- */
- #include "PolySceneEntityInstance.h"
- #include "PolyLogger.h"
- #include "PolyCoreServices.h"
- #include "PolyResourceManager.h"
- #include "PolyMaterial.h"
- #include "PolySceneLight.h"
- #include "PolySceneMesh.h"
- #include "PolySceneLabel.h"
- #include "PolySceneSound.h"
- #include "PolyCamera.h"
- using namespace Polycode;
- SceneEntityInstanceResourceEntry::SceneEntityInstanceResourceEntry(SceneEntityInstance *instance) : Resource(Resource::RESOURCE_SCREEN_ENTITY_INSTANCE) {
- this->instance = instance;
- }
- SceneEntityInstanceResourceEntry::~SceneEntityInstanceResourceEntry() {
- }
- SceneEntityInstance *SceneEntityInstanceResourceEntry::getInstance() {
- return instance;
- }
- void SceneEntityInstanceResourceEntry::reloadResource() {
- instance->reloadEntityInstance();
- Resource::reloadResource();
- }
- SceneEntityInstance *SceneEntityInstance::BlankSceneEntityInstance() {
- return new SceneEntityInstance();
- }
- SceneEntityInstance::SceneEntityInstance(Scene *parentScene, const String& fileName) : Entity() {
- this->parentScene = parentScene;
- resourceEntry = new SceneEntityInstanceResourceEntry(this);
- loadFromFile(fileName);
- resourceEntry->setResourceName(fileName);
- resourceEntry->setResourcePath(fileName);
- cloneUsingReload = false;
- ownsChildren = true;
- }
- SceneEntityInstance::SceneEntityInstance() : Entity() {
- cloneUsingReload = true;
- ownsChildren = true;
- resourceEntry = new SceneEntityInstanceResourceEntry(this);
- }
- SceneEntityInstance::~SceneEntityInstance() {
- CoreServices::getInstance()->getResourceManager()->removeResource(resourceEntry);
- delete resourceEntry;
- }
- void SceneEntityInstance::reloadEntityInstance() {
- loadFromFile(fileName);
- }
- SceneEntityInstanceResourceEntry *SceneEntityInstance::getResourceEntry() {
- return resourceEntry;
- }
- Entity *SceneEntityInstance::Clone(bool deepClone, bool ignoreEditorOnly) const {
- SceneEntityInstance *newEntity;
- if(cloneUsingReload) {
- newEntity = new SceneEntityInstance(parentScene, fileName);
- } else {
- newEntity = new SceneEntityInstance();
- }
- applyClone(newEntity, deepClone, ignoreEditorOnly);
- return newEntity;
- }
- void SceneEntityInstance::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
- if(cloneUsingReload) {
- Entity::applyClone(clone, false, ignoreEditorOnly);
- } else {
- Entity::applyClone(clone, deepClone, ignoreEditorOnly);
- SceneEntityInstance *_clone = (SceneEntityInstance*) clone;
- _clone->fileName = fileName;
- }
- }
- void SceneEntityInstance::applySceneMesh(ObjectEntry *entry, SceneMesh *sceneMesh) {
- if(!entry) {
- return;
- }
-
- ObjectEntry *materialName =(*entry)["material"];
- if(materialName) {
- sceneMesh->setMaterialByName(materialName->stringVal);
- if(sceneMesh->getMaterial()) {
- ObjectEntry *optionsEntry =(*entry)["shader_options"];
- if(optionsEntry) {
- for(int i=0; i < optionsEntry->length; i++) {
- ObjectEntry *shaderEntry =(*optionsEntry)[i];
- if(shaderEntry) {
-
- // parse in texture bindings
- ObjectEntry *texturesEntry =(*shaderEntry)["textures"];
- if(texturesEntry) {
- for(int j=0; j < texturesEntry->length; j++) {
- ObjectEntry *textureEntry =(*texturesEntry)[j];
- if(textureEntry) {
- ObjectEntry *nameEntry = (*textureEntry)["name"];
- if(nameEntry) {
-
- if(textureEntry->name == "cubemap") {
- Cubemap *cubemap = (Cubemap*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_CUBEMAP, textureEntry->stringVal);
- if(cubemap) {
- sceneMesh->getLocalShaderOptions()->addCubemap(nameEntry->stringVal, cubemap);
- }
- } else {
- sceneMesh->getLocalShaderOptions()->addTexture(nameEntry->stringVal, CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(textureEntry->stringVal));
- }
- }
- }
- }
- }
-
- ObjectEntry *paramsEntry =(*shaderEntry)["params"];
- if(paramsEntry) {
- for(int j=0; j < paramsEntry->length; j++) {
- ObjectEntry *paramEntry =(*paramsEntry)[j];
- if(paramEntry) {
- ObjectEntry *nameEntry = (*paramEntry)["name"];
- ObjectEntry *valueEntry = (*paramEntry)["value"];
- if(nameEntry && valueEntry) {
- Shader *materialShader = sceneMesh->getMaterial()->getShader(i);
- if(materialShader) {
- int type = materialShader->getExpectedParamType(nameEntry->stringVal);
- LocalShaderParam *param = sceneMesh->getLocalShaderOptions()->addParam(type, nameEntry->stringVal);
- if(param) {
- param->setParamValueFromString(type, valueEntry->stringVal);
- }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
- }
-
- }
- void SceneEntityInstance::parseObjectIntoCurve(ObjectEntry *entry, BezierCurve *curve) {
- curve->clearControlPoints();
- ObjectEntry *controlPoints =(*entry)["controlPoints"];
- if(controlPoints) {
- for(int i=0; i < controlPoints->length; i++) {
- ObjectEntry *controlPoint = ((*controlPoints))[i];
- if(controlPoint) {
- Vector2 vpt1;
- Vector2 vpt2;
- Vector2 vpt3;
-
- ObjectEntry *pt1 = ((*controlPoint))["pt1"];
- if(pt1) {
- vpt1.x = ((*pt1))["x"]->NumberVal;
- vpt1.y = ((*pt1))["y"]->NumberVal;
- }
- ObjectEntry *pt2 = ((*controlPoint))["pt2"];
- if(pt2) {
- vpt2.x = ((*pt2))["x"]->NumberVal;
- vpt2.y = ((*pt2))["y"]->NumberVal;
- }
- ObjectEntry *pt3 = ((*controlPoint))["pt3"];
- if(pt3) {
- vpt3.x = ((*pt3))["x"]->NumberVal;
- vpt3.y = ((*pt3))["y"]->NumberVal;
- }
- curve->addControlPoint(vpt1.x, vpt1.y, 0.0, vpt2.x, vpt2.y, 0.0, vpt3.x, vpt3.y, 0.0);
- }
- }
- }
-
- }
- Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entity *targetEntity) {
- Entity *entity = NULL;
- ObjectEntry *entityType = (*entry)["type"];
- if(entityType) {
-
-
- /*
-
- if(entityType->stringVal == "SceneEntityInstance") {
- ObjectEntry *screenInstanceEntry = (*entry)["SceneEntityInstance"];
- String filePath = (*screenInstanceEntry)["filePath"]->stringVal;
- SceneEntityInstance *instance = new SceneEntityInstance(filePath);
- entity = instance;
- }
-
- */
- if(entityType->stringVal == "SceneSprite") {
- ObjectEntry *spriteEntry = (*entry)["SceneSprite"];
- String filePath = (*spriteEntry)["filePath"]->stringVal;
-
- SceneSprite *sprite = new SceneSprite(filePath);
-
- String animName = (*spriteEntry)["anim"]->stringVal;
- sprite->playAnimation(animName, -1, false);
- entity = sprite;
- applySceneMesh((*entry)["SceneMesh"], sprite);
- } else if(entityType->stringVal == "SceneLabel") {
- ObjectEntry *labelEntry = (*entry)["SceneLabel"];
-
- String text = (*labelEntry)["text"]->stringVal;
- String font = (*labelEntry)["font"]->stringVal;
- int size = (*labelEntry)["size"]->intVal;
- Number actualHeight = (*labelEntry)["actualHeight"]->intVal;
- int aaMode = (*labelEntry)["aaMode"]->intVal;
-
- SceneLabel *label = new SceneLabel("", size, font, aaMode, actualHeight);
- label->setAnchorPoint(0.0, 0.0, 0.0);
- label->snapToPixels = false;
- label->positionAtBaseline = false;
- applySceneMesh((*entry)["SceneMesh"], label);
- label->setText(text);
- entity = label;
- } else if(entityType->stringVal == "SceneLight") {
-
- ObjectEntry *lightEntry = (*entry)["SceneLight"];
- if(lightEntry) {
- int lightType = (*lightEntry)["type"]->intVal;
- SceneLight *newLight = new SceneLight(lightType, parentScene, 0);
-
- newLight->setIntensity((*lightEntry)["intensity"]->NumberVal);
-
- newLight->lightColor.setColor((*lightEntry)["cR"]->NumberVal, (*lightEntry)["cG"]->NumberVal, (*lightEntry)["cB"]->NumberVal, (*lightEntry)["cA"]->NumberVal);
- newLight->specularLightColor.setColor((*lightEntry)["scR"]->NumberVal, (*lightEntry)["scG"]->NumberVal, (*lightEntry)["scB"]->NumberVal, (*lightEntry)["scA"]->NumberVal);
- newLight->setAttenuation((*lightEntry)["cAtt"]->NumberVal, (*lightEntry)["lAtt"]->NumberVal, (*lightEntry)["qAtt"]->NumberVal);
-
- if(newLight->getType() == SceneLight::SPOT_LIGHT) {
- newLight->setSpotlightProperties((*lightEntry)["spotCutoff"]->NumberVal, (*lightEntry)["spotExponent"]->NumberVal);
-
- if((*lightEntry)["shadows"]->boolVal) {
- newLight->enableShadows(true, (*lightEntry)["shadowmapRes"]->intVal);
- newLight->setShadowMapFOV((*lightEntry)["shadowmapFOV"]->NumberVal);
- }
- }
-
- parentScene->addLight(newLight);
- entity = newLight;
- }
-
- } else if(entityType->stringVal == "ScenePrimitive") {
- ObjectEntry *scenePrimitiveEntry = (*entry)["ScenePrimitive"];
- int pType = (*scenePrimitiveEntry)["type"]->intVal;
- Number p1 = (*scenePrimitiveEntry)["p1"]->NumberVal;
- Number p2 = (*scenePrimitiveEntry)["p2"]->NumberVal;
- Number p3 = (*scenePrimitiveEntry)["p3"]->NumberVal;
- Number p4 = (*scenePrimitiveEntry)["p4"]->NumberVal;
- Number p5 = (*scenePrimitiveEntry)["p5"]->NumberVal;
-
- ScenePrimitive *primitive = new ScenePrimitive(pType, p1, p2, p3, p4, p5);
- entity = primitive;
- applySceneMesh((*entry)["SceneMesh"], primitive);
- } else if(entityType->stringVal == "SceneMesh") {
- ObjectEntry *meshEntry = (*entry)["SceneMesh"];
- if(meshEntry) {
- ObjectEntry *fileName = (*meshEntry)["file"];
- if(fileName) {
- SceneMesh *newMesh = new SceneMesh(fileName->stringVal);
- applySceneMesh(meshEntry, newMesh);
- entity = newMesh;
- }
- }
- } else if(entityType->stringVal == "SceneSound") {
- ObjectEntry *soundEntry = (*entry)["SceneSound"];
-
- String filePath = (*soundEntry)["filePath"]->stringVal;
- Number refDistance = (*soundEntry)["refDistance"]->NumberVal;
- Number maxDistance = (*soundEntry)["maxDistance"]->NumberVal;
- Number volume = (*soundEntry)["volume"]->NumberVal;
- Number pitch = (*soundEntry)["pitch"]->NumberVal;
-
- SceneSound *sound = new SceneSound(filePath, refDistance, maxDistance);
- sound->getSound()->setVolume(volume);
- sound->getSound()->setPitch(pitch);
-
- entity = sound;
- } else if(entityType->stringVal == "Camera") {
- ObjectEntry *cameraEntry = (*entry)["Camera"];
-
- Camera *camera = new Camera(parentScene);
-
- camera->setExposureLevel((*cameraEntry)["exposure"]->NumberVal);
- camera->setClippingPlanes((*cameraEntry)["nearClip"]->NumberVal, (*cameraEntry)["farClip"]->NumberVal);
- camera->setOrthoMode((*cameraEntry)["ortho"]->boolVal);
-
- if(camera->getOrthoMode()) {
- camera->setOrthoSizeMode((*cameraEntry)["sizeMode"]->intVal);
- camera->setOrthoSize((*cameraEntry)["orthoWidth"]->NumberVal, (*cameraEntry)["orthoHeight"]->NumberVal);
- } else {
- camera->setFOV((*cameraEntry)["fov"]->NumberVal);
- }
-
- entity = camera;
- }
-
- }
- if(!entity) {
- if(targetEntity) {
- entity = targetEntity;
- } else {
- entity = new Entity();
- }
- }
-
- entity->ownsChildren = true;
- entry->readNumber("bbX", &entity->bBox.x);
- entry->readNumber("bbY", &entity->bBox.y);
- entry->readNumber("bbZ", &entity->bBox.z);
- entity->color.r = (*entry)["cR"]->NumberVal;
- entity->color.g = (*entry)["cG"]->NumberVal;
- entity->color.b = (*entry)["cB"]->NumberVal;
- entity->color.a = (*entry)["cA"]->NumberVal;
- if(!targetEntity) {
- entity->blendingMode = (*entry)["blendMode"]->intVal;
- entity->setScale((*entry)["sX"]->NumberVal, (*entry)["sY"]->NumberVal, (*entry)["sZ"]->NumberVal);
- entity->setPosition((*entry)["pX"]->NumberVal, (*entry)["pY"]->NumberVal, (*entry)["pZ"]->NumberVal);
- entity->setRotationEuler(Vector3((*entry)["rX"]->NumberVal, (*entry)["rY"]->NumberVal, (*entry)["rZ"]->NumberVal));
- }
-
- if((*entry)["id"]->stringVal != "") {
- entity->id = (*entry)["id"]->stringVal;
- }
-
- String tagString = (*entry)["tags"]->stringVal;
-
- if(tagString != "") {
- std::vector<String> tags = tagString.split(",");
- for(int i=0; i < tags.size(); i++) {
- entity->addTag(tags[i]);
- }
- }
-
- ObjectEntry *props = (*entry)["props"];
- if(props) {
- for(int i=0; i < props->length; i++) {
- ObjectEntry *prop = ((*props))[i];
- if(prop) {
- entity->setEntityProp((*prop)["name"]->stringVal, (*prop)["value"]->stringVal);
- }
- }
- }
-
- ObjectEntry *children = (*entry)["children"];
-
- if(children) {
- for(int i=0; i < children->length; i++) {
- ObjectEntry *childEntry = ((*children))[i];
- ScreenEntity *childEntity = loadObjectEntryIntoEntity(childEntry);
- entity->addChild(childEntity);
- }
- }
- return entity;
- }
- String SceneEntityInstance::getFileName() const {
- return fileName;
- }
- void SceneEntityInstance::clearInstance() {
- for(int i=0; i < children.size(); i++) {
- removeChild(children[i]);
- children[i]->setOwnsChildrenRecursive(true);
- delete children[i];
- }
- }
- bool SceneEntityInstance::loadFromFile(const String& fileName) {
- clearInstance();
-
- resourceEntry->resourceFileTime = OSBasics::getFileTime(fileName);
- this->ownsChildren = true;
- this->fileName = fileName;
- Object loadObject;
- if(!loadObject.loadFromBinary(fileName)) {
- if(!loadObject.loadFromXML(fileName)) {
- Logger::log("Error loading entity instance.\n");
- }
- }
- ObjectEntry *root = loadObject.root["root"];
-
- if(root) {
- loadObjectEntryIntoEntity(root, this);
- }
-
- return true;
- }
|