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 }