| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- /*
- 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"
- 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(const String& fileName) : Entity() {
- 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(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::applyScenePrimitive(ObjectEntry *entry, ScenePrimitive *primitive) {
- if(!entry)
- return;
- /*
- Number swidth = (*entry)["width"]->NumberVal;
- Number sheight = (*entry)["height"]->NumberVal;
- int type = (*entry)["type"]->intVal;
-
- shape->setShapeType(type);
- shape->setShapeSize(swidth, sheight);
- Number strokeColorR = (*entry)["strokeColorR"]->NumberVal;
- Number strokeColorG = (*entry)["strokeColorG"]->NumberVal;
- Number strokeColorB = (*entry)["strokeColorB"]->NumberVal;
- Number strokeColorA = (*entry)["strokeColorA"]->NumberVal;
- bool strokeEnabled = (*entry)["strokeEnabled"]->boolVal;
- Number strokeWidth = (*entry)["strokeWidth"]->NumberVal;
-
- shape->strokeEnabled = strokeEnabled;
- shape->strokeWidth = strokeWidth;
- shape->strokeColor = Color(strokeColorR, strokeColorG, strokeColorB, strokeColorA);
-
- */
- }
- 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 == "ScreenImage") {
- ObjectEntry *screenImageEntry = (*entry)["ScreenImage"];
- String imagePath = (*screenImageEntry)["filePath"]->stringVal;
- ScreenImage *image = new ScreenImage(imagePath);
-
- ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
- applyScreenShape(screenShapeEntry, image);
- entity = image;
- }
-
- if(entityType->stringVal == "ScreenParticleEmitter") {
- ObjectEntry *emitterEntry = (*entry)["ScreenParticleEmitter"];
-
- ScreenParticleEmitter *placingEmitter = new ScreenParticleEmitter((*emitterEntry)["texturePath"]->stringVal, Particle::BILLBOARD_PARTICLE, ParticleEmitter::CONTINUOUS_EMITTER, (*emitterEntry)["lifespan"]->NumberVal, (*emitterEntry)["particleCount"]->NumberVal, Vector3((*emitterEntry)["dirX"]->NumberVal, (*emitterEntry)["dirY"]->NumberVal, 0.0), Vector3((*emitterEntry)["gravX"]->NumberVal, (*emitterEntry)["gravY"]->NumberVal, 0.0), Vector3((*emitterEntry)["deviationX"]->NumberVal, (*emitterEntry)["deviationY"]->NumberVal, 0.0), Vector3((*emitterEntry)["radiusX"]->NumberVal, (*emitterEntry)["radiusY"]->NumberVal, 0.0));
-
- placingEmitter->brightnessDeviation = (*emitterEntry)["brightnessDeviation"]->NumberVal;
- placingEmitter->particleSize = (*emitterEntry)["particleSize"]->NumberVal;
- placingEmitter->perlinModSize = (*emitterEntry)["perlinModSize"]->NumberVal;
- placingEmitter->perlinEnabled = (*emitterEntry)["perlinEnabled"]->boolVal;
- placingEmitter->particleSpeedMod = (*emitterEntry)["particleSpeedMod"]->NumberVal;
- placingEmitter->rotationSpeed = (*emitterEntry)["rotationSpeed"]->NumberVal;
- placingEmitter->rotationFollowsPath = (*emitterEntry)["rotationFollowsPath"]->boolVal;
- placingEmitter->useScaleCurves = (*emitterEntry)["useScaleCurves"]->boolVal;
- placingEmitter->useColorCurves = (*emitterEntry)["useColorCurves"]->boolVal;
-
- bool boolVal;
- if(emitterEntry->readBool("ignoreParentMatrix", &boolVal)) {
- placingEmitter->setIgnoreParentMatrix(boolVal);
- }
-
- placingEmitter->setParticleBlendingMode((*emitterEntry)["particleBlendMode"]->intVal);
-
- placingEmitter->setWidth(placingEmitter->emitterRadius.x);
- placingEmitter->setHeight(placingEmitter->emitterRadius.y);
-
- parseObjectIntoCurve((*emitterEntry)["scaleCurve"], &placingEmitter->scaleCurve);
- parseObjectIntoCurve((*emitterEntry)["colorCurveR"], &placingEmitter->colorCurveR);
- parseObjectIntoCurve((*emitterEntry)["colorCurveG"], &placingEmitter->colorCurveG);
- parseObjectIntoCurve((*emitterEntry)["colorCurveB"], &placingEmitter->colorCurveB);
- parseObjectIntoCurve((*emitterEntry)["colorCurveA"], &placingEmitter->colorCurveA);
-
- entity = placingEmitter;
-
- }
- if(entityType->stringVal == "ScreenSprite") {
- ObjectEntry *screenSpriteEntry = (*entry)["ScreenSprite"];
- String filePath = (*screenSpriteEntry)["filePath"]->stringVal;
-
- ScreenSprite *sprite = new ScreenSprite(filePath);
-
- String animName = (*screenSpriteEntry)["anim"]->stringVal;
- sprite->playAnimation(animName, -1, false);
-
- ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
- applyScreenShape(screenShapeEntry, sprite);
- entity = sprite;
- }
- if(entityType->stringVal == "SceneEntityInstance") {
- ObjectEntry *screenInstanceEntry = (*entry)["SceneEntityInstance"];
- String filePath = (*screenInstanceEntry)["filePath"]->stringVal;
- SceneEntityInstance *instance = new SceneEntityInstance(filePath);
- entity = instance;
- }
-
- if(entityType->stringVal == "ScreenShape") {
- ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
- ScreenShape *shape = new ScreenShape(0, 1, 1);
- applyScreenShape(screenShapeEntry, shape);
- entity = shape;
- }
-
- if(entityType->stringVal == "ScreenSound") {
- ObjectEntry *screenSoundEntry = (*entry)["ScreenSound"];
-
- String filePath = (*screenSoundEntry)["filePath"]->stringVal;
- Number refDistance = (*screenSoundEntry)["refDistance"]->NumberVal;
- Number maxDistance = (*screenSoundEntry)["maxDistance"]->NumberVal;
- Number volume = (*screenSoundEntry)["volume"]->NumberVal;
- Number pitch = (*screenSoundEntry)["pitch"]->NumberVal;
-
- ScreenSound *sound = new ScreenSound(filePath, refDistance, maxDistance);
- sound->getSound()->setVolume(volume);
- sound->getSound()->setPitch(pitch);
-
- sound->setWidth(50);
- sound->setHeight(50);
-
- entity = sound;
- }
-
- if(entityType->stringVal == "ScreenLabel") {
- ObjectEntry *screenLabelEntry = (*entry)["ScreenLabel"];
-
- String text = (*screenLabelEntry)["text"]->stringVal;
- String font = (*screenLabelEntry)["font"]->stringVal;
- int size = (*screenLabelEntry)["size"]->intVal;
- int aaMode = (*screenLabelEntry)["aaMode"]->intVal;
-
- ScreenLabel *label = new ScreenLabel(text, size, font, aaMode);
- label->positionAtBaseline = false;
-
- ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
- applyScreenShape(screenShapeEntry, label);
- entity = label;
- }
-
- }
- if(!entity) {
- if(targetEntity) {
- entity = targetEntity;
- } else {
- entity = new ScreenEntity();
- }
- }
-
- entity->ownsChildren = true;
-
- if((*entry)["positionMode"]) {
- entity->setPositionMode((*entry)["positionMode"]->intVal);
- } else {
- entity->setPositionMode(ScreenEntity::POSITION_CENTER);
- }
- Number _width, _height;
-
- if(entry->readNumber("width", &_width)) {
- entity->setWidth(_width);
- }
-
- if(entry->readNumber("height", &_height)) {
- entity->setHeight(_height);
- }
- entity->color.r = (*entry)["colorR"]->NumberVal;
- entity->color.g = (*entry)["colorG"]->NumberVal;
- entity->color.b = (*entry)["colorB"]->NumberVal;
- entity->color.a = (*entry)["colorA"]->NumberVal;
- if(!targetEntity) {
- entity->blendingMode = (*entry)["blendMode"]->intVal;
- entity->scale.x = (*entry)["scaleX"]->NumberVal;
- entity->scale.y = (*entry)["scaleY"]->NumberVal;
- entity->position.x = (*entry)["posX"]->NumberVal;
- entity->position.y = (*entry)["posY"]->NumberVal;
- entity->setRotation((*entry)["rotation"]->NumberVal);
- } else {
-
- }
-
- 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)) {
- Logger::log("Error loading entity instance.\n");
- }
- ObjectEntry *root = loadObject.root["root"];
-
- if(root) {
- loadObjectEntryIntoEntity(root, this);
- }
-
- return true;
- }
|