Mercurial > fife-parpg
diff engine/core/view/visual.h @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | 90005975cdbb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/view/visual.h Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,228 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef FIFE_VIEW_VISUAL_H +#define FIFE_VIEW_VISUAL_H + +// Standard C++ library includes + +// 3rd party library includes + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "model/metamodel/abstractvisual.h" +#include "view/camera.h" + +namespace FIFE { + class Object; + class Instance; + class Action; + class Image; + + /** Base class for all 2 dimensional visual classes + * Visual classes are extensions to visualize the stuff in model (e.g. instances) + * The reason why its separated is to keep model view-agnostic, so that we could + * have e.g. 3d, 2d and character based visualizations to the same data + */ + class Visual2DGfx: public AbstractVisual { + public: + /** Destructor + */ + virtual ~Visual2DGfx(); + + /** Sets transparency value for object to be visualized + * @param stackposition new stack position + */ + void setTransparency(uint8_t transparency) { m_transparency = transparency; } + + /** Gets current transparency value (0-255) + * @return current transparency value + */ + unsigned int getTransparency() { return m_transparency; } + + /** Sets visibility value for object to be visualized + * @param visible is object visible or not + */ + void setVisible(bool visible) { m_visible = visible; } + + /** Is instance visible or not + * @return is instance visible or not + */ + unsigned int isVisible() { return m_visible; } + + protected: + /** Constructor + */ + Visual2DGfx(); + + uint8_t m_transparency; + uint8_t m_visible; + + }; + + /** Object visual contains data that is needed for visualizing objects + */ + class ObjectVisual: public Visual2DGfx { + public: + /** Constructs and assigns it to the passed item + */ + static ObjectVisual* create(Object* object); + + /** Destructor + */ + virtual ~ObjectVisual(); + + /** Adds new static image with given angle (degrees) + * Static images are used in case there are no actions active in the instance + * There can be several static images for different angles, that are used in + * case view / layer is rotated + * In case there are no exact matches for current view angles, closest one is used + * @param angle angle for image. 0 degrees starts from right and turns counter-clockwise + * (normal math notation) + @param image_index index of image to use for given degress + */ + void addStaticImage(unsigned int angle, int image_index); + + /** Returns closest matching static image for given angle + * @return id for static image + */ + int getStaticImageIndexByAngle(int angle); + + /** Returns closest matching image angle for given angle + * @return closest matching angle + */ + int getClosestMatchingAngle(int angle); + + /** Returns list of available static image angles for this object + */ + void getStaticImageAngles(std::vector<int>& angles); + + private: + /** Constructor + */ + ObjectVisual(); + + type_angle2id m_angle2img; + }; + + /** InstanceVisualCacheItem caches values calculated by view + * values are camera specific + * Class should be used by engine itself only + */ + class InstanceVisualCacheItem { + public: + InstanceVisualCacheItem(); + + /** Returns closest matching static image for given angle + * @return id for static image + * @see ObjectVisual::getStaticImageIndexByAngle + */ + int getStaticImageIndexByAngle(unsigned int angle, Instance* instance); + + // point where instance was drawn during the previous render + ScreenPoint screenpoint; + + // dimensions of this visual during the previous render + Rect dimensions; + + // image used during previous render + Image* image; + + // current facing angle + int facing_angle; + private: + int m_cached_static_img_id; + int m_cached_static_img_angle; + }; + + /** Instance visual contains data that is needed to visualize the instance on screen + */ + class InstanceVisual: public Visual2DGfx { + public: + /** Constructs and assigns it to the passed item + */ + static InstanceVisual* create(Instance* instance); + + /** Destructor + */ + virtual ~InstanceVisual(); + + /** Sets stack position of the instance + * Stack position is used to define the order in which instances residing + * in the same location are drawn + * @param stackposition new stack position + */ + void setStackPosition(int stackposition) { m_stackposition = stackposition; } + + /** Gets current stack position of instance + * @return current stack position + */ + int getStackPosition() { return m_stackposition; } + + /** Get camera specific cache item for the visual + * @return cache item + */ + inline InstanceVisualCacheItem& getCacheItem(Camera* cam) { return m_cache[cam]; } + + private: + /** Constructor + */ + InstanceVisual(); + int m_stackposition; + // there is separate cache item for each camera + std::map<Camera*, InstanceVisualCacheItem> m_cache; + }; + + /** Action visual contains data that is needed to visualize different actions on screen + */ + class ActionVisual: public Visual2DGfx { + public: + /** Constructs and assigns it to the passed item + */ + static ActionVisual* create(Action* action); + + /** Destructor + */ + virtual ~ActionVisual(); + + /** Adds new animation with given angle (degrees) + */ + void addAnimation(unsigned int angle, int animation_index); + + /** Gets index to animation closest to given angle + * @return animation index, -1 if no animations available + */ + int getAnimationIndexByAngle(int angle); + + private: + /** Constructor + */ + ActionVisual(); + + // animations associated with this action (handles to pool) + // mapping = direction -> animation + type_angle2id m_animations; + }; + +} +#endif