visual.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "util/log/logger.h"
00031 #include "util/base/exception.h"
00032
00033 #include "model/structures/instance.h"
00034 #include "model/metamodel/object.h"
00035 #include "model/metamodel/action.h"
00036
00037 #include "visual.h"
00038
00039
00040 namespace FIFE {
00041
00042 static Logger _log(LM_VIEW);
00043
00044 Visual2DGfx::Visual2DGfx(): m_transparency(0), m_visible(true) {
00045 }
00046
00047 Visual2DGfx::~Visual2DGfx() {
00048 }
00049
00050 ObjectVisual::ObjectVisual() {
00051 }
00052
00053 ObjectVisual* ObjectVisual::create(Object* object) {
00054 if (object->getVisual<ObjectVisual>()) {
00055 throw Duplicate("Object already contains visualization");
00056 }
00057 ObjectVisual* v = new ObjectVisual();
00058 object->adoptVisual(v);
00059 return v;
00060 }
00061
00062 ObjectVisual::~ObjectVisual() {
00063 }
00064
00065 void ObjectVisual::addStaticImage(unsigned int angle, int image_index) {
00066 m_angle2img[angle % 360] = image_index;
00067 }
00068
00069 int ObjectVisual::getStaticImageIndexByAngle(int angle) {
00070 int closestMatch = 0;
00071 return getIndexByAngle(angle, m_angle2img, closestMatch);
00072 }
00073
00074 int ObjectVisual::getClosestMatchingAngle(int angle) {
00075 int closestMatch = 0;
00076 getIndexByAngle(angle, m_angle2img, closestMatch);
00077 return closestMatch;
00078 }
00079
00080 void ObjectVisual::getStaticImageAngles(std::vector<int>& angles) {
00081 angles.clear();
00082 type_angle2id::const_iterator i(m_angle2img.begin());
00083 while (i != m_angle2img.end()) {
00084 angles.push_back(i->first);
00085 ++i;
00086 }
00087 }
00088
00089 const int STATIC_IMAGE_NOT_INITIALIZED = -2;
00090 const int STATIC_IMAGE_NOT_FOUND = -1;
00091
00092 InstanceVisualCacheItem::InstanceVisualCacheItem():
00093 screenpoint(),
00094 dimensions(),
00095 image(NULL),
00096 m_cached_static_img_id(STATIC_IMAGE_NOT_INITIALIZED),
00097 m_cached_static_img_angle(0) {
00098 }
00099
00100 int InstanceVisualCacheItem::getStaticImageIndexByAngle(unsigned int angle, Instance* instance) {
00101 if (static_cast<int>(angle) != m_cached_static_img_angle) {
00102 m_cached_static_img_id = STATIC_IMAGE_NOT_INITIALIZED;
00103 }
00104 if (m_cached_static_img_id != STATIC_IMAGE_NOT_INITIALIZED) {
00105 return m_cached_static_img_id;
00106 }
00107 m_cached_static_img_id = instance->getObject()->getVisual<ObjectVisual>()->getStaticImageIndexByAngle(angle);
00108 m_cached_static_img_angle = angle;
00109 return m_cached_static_img_id;
00110 }
00111
00112 InstanceVisual::InstanceVisual():
00113 m_stackposition(0) {
00114 }
00115
00116 InstanceVisual* InstanceVisual::create(Instance* instance) {
00117 if (instance->getVisual<InstanceVisual>()) {
00118 throw Duplicate("Instance already contains visualization");
00119 }
00120 InstanceVisual* v = new InstanceVisual();
00121 instance->setVisual(v);
00122 return v;
00123 }
00124
00125 InstanceVisual::~InstanceVisual() {
00126 }
00127
00128 ActionVisual::ActionVisual(): m_animations() {
00129 }
00130
00131 ActionVisual* ActionVisual::create(Action* action) {
00132 if (action->getVisual<ActionVisual>()) {
00133 throw Duplicate("Action already contains visualization");
00134 }
00135 ActionVisual* v = new ActionVisual();
00136 action->adoptVisual(v);
00137 return v;
00138 }
00139
00140 ActionVisual::~ActionVisual() {
00141 }
00142
00143 void ActionVisual::addAnimation(unsigned int angle, int animation_index) {
00144 m_animations[angle % 360] = animation_index;
00145 }
00146
00147 int ActionVisual::getAnimationIndexByAngle(int angle) {
00148 int closestMatch = 0;
00149 return getIndexByAngle(angle, m_animations, closestMatch);
00150 }
00151
00152 void ActionVisual::getActionImageAngles(std::vector<int>& angles) {
00153 angles.clear();
00154 type_angle2id::const_iterator i(m_animations.begin());
00155 while (i != m_animations.end()) {
00156 angles.push_back(i->first);
00157 ++i;
00158 }
00159 }
00160 }