camera.h

00001 /***************************************************************************
00002  *   Copyright (C) 2005-2008 by the FIFE team                              *
00003  *   http://www.fifengine.de                                               *
00004  *   This file is part of FIFE.                                            *
00005  *                                                                         *
00006  *   FIFE is free software; you can redistribute it and/or                 *
00007  *   modify it under the terms of the GNU Lesser General Public            *
00008  *   License as published by the Free Software Foundation; either          *
00009  *   version 2.1 of the License, or (at your option) any later version.    *
00010  *                                                                         *
00011  *   This library is distributed in the hope that it will be useful,       *
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00014  *   Lesser General Public License for more details.                       *
00015  *                                                                         *
00016  *   You should have received a copy of the GNU Lesser General Public      *
00017  *   License along with this library; if not, write to the                 *
00018  *   Free Software Foundation, Inc.,                                       *
00019  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
00020  ***************************************************************************/
00021 
00022 #ifndef FIFE_VIEW_CAMERA_H
00023 #define FIFE_VIEW_CAMERA_H
00024 
00025 // Standard C++ library includes
00026 #include <string>
00027 #include <map>
00028 
00029 // 3rd party library includes
00030 
00031 // FIFE includes
00032 // These includes are split up in two parts, separated by one empty line
00033 // First block: files included from the FIFE root src directory
00034 // Second block: files included from the same folder
00035 #include "model/structures/location.h"
00036 #include "util/structures/rect.h"
00037 #include "util/math/matrix.h"
00038 
00039 #include "rendererbase.h"
00040 
00041 namespace FIFE {
00042 
00043     typedef Point3D ScreenPoint;
00044     class Layer;
00045     class Instance;
00046     class ImagePool;
00047     class AnimationPool;
00048     class RenderBackend;
00049     class LayerCache;
00050     class MapObserver;
00051     typedef std::map<Layer*, RenderList > t_layer_to_instances;
00052 
00058     class Camera: public IRendererListener, public IRendererContainer {
00059     public:
00060         enum Transform {
00061             NormalTransform = 0,
00062             WarpedTransform = 1
00063         };
00064 
00077         Camera(const std::string& id,
00078             Layer* layer,
00079             const Rect& viewport,
00080             RenderBackend* renderbackend,
00081             ImagePool* ipool,
00082             AnimationPool* apool);
00083 
00086         virtual ~Camera();
00087 
00090         const std::string& getId() const { return m_id; }
00091 
00094         void setId(const std::string& id) { m_id = id; }
00095 
00100         void setTilt(double tilt);
00101 
00105         double getTilt() const;
00106 
00112         void setRotation(double rotation);
00113 
00117         double getRotation() const;
00118 
00122         void setZoom(double zoom);
00123 
00127         double getZoom() const;
00128 
00134         void setCellImageDimensions(unsigned int width, unsigned int height);
00135 
00140         Point getCellImageDimensions();
00141 
00145         Point getCellImageDimensions(Layer* layer);
00146 
00150         void setLocation(const Location& location);
00151 
00155         Location getLocation() const;
00156 
00157         Point3D getOrigin() const;
00158 
00164         Location& getLocationRef();
00165 
00170         void attach(Instance *instance);
00171 
00174         void detach();
00175 
00178         Instance* getAttached() const { return m_attachedto; }
00179 
00184         void setViewPort(const Rect& viewport);
00185 
00189         const Rect& getViewPort() const;
00190 
00196         ExactModelCoordinate toMapCoordinates(ScreenPoint screen_coords, bool z_calculated=true);
00197 
00201         ScreenPoint toScreenCoordinates(ExactModelCoordinate map_coords);
00202 
00206         DoublePoint3D toVirtualScreenCoordinates(ExactModelCoordinate map_coords);
00207 
00208         ScreenPoint virtualScreenToScreen(const DoublePoint3D& p);
00209         DoublePoint3D screenToVirtualScreen(const ScreenPoint& p);
00210 
00213         void setEnabled(bool enabled);
00214 
00217         bool isEnabled();
00218 
00224         void getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list<Instance*>& instances);
00225 
00232         void getMatchingInstances(Rect screen_rect, Layer& layer, std::list<Instance*>& instances);
00233 
00240         void getMatchingInstances(Location& loc, std::list<Instance*>& instances, bool use_exactcoordinates=false);
00241 
00249         void update();
00250 
00256         void refresh();
00257 
00260         void resetUpdates();
00261 
00264         void addRenderer(RendererBase* renderer);
00265 
00268         RendererBase* getRenderer(const std::string& name);
00269 
00272         void resetRenderers();
00273 
00276         void calculateZValue(ScreenPoint& screen_coords);
00277 
00278         void onRendererPipelinePositionChanged(RendererBase* renderer);
00279         void onRendererEnabledChanged(RendererBase* renderer);
00280 
00284         bool testRenderedViewPort();
00285 
00286         void setLightingColor(float red, float green, float blue, float alpha);
00287         void resetLightingColor();
00288         std::vector<float> getLightingColor();
00289 
00292         void render();
00293 
00294     private:
00295         friend class MapObserver;
00296         void addLayer(Layer* layer);
00297         void removeLayer(Layer* layer);
00298         void updateMap(Map* map);
00299         std::string m_id;
00300 
00301 
00308         void updateMatrices();
00309 
00316         void updateReferenceScale();
00317 
00320         DoublePoint getLogicalCellDimensions(Layer* layer);
00321 
00322         DoubleMatrix m_matrix;
00323         DoubleMatrix m_inverse_matrix;
00324 
00325         DoubleMatrix m_vs_matrix;
00326         DoubleMatrix m_vs_inverse_matrix;
00327         DoubleMatrix m_vscreen_2_screen;
00328         DoubleMatrix m_screen_2_vscreen;
00329 
00330         double m_tilt;
00331         double m_rotation;
00332         double m_zoom;
00333         Location m_location;
00334         ScreenPoint m_prev_origo;
00335         ScreenPoint m_cur_origo;
00336         Rect m_viewport;
00337         bool m_view_updated;
00338         unsigned int m_screen_cell_width;
00339         unsigned int m_screen_cell_height;
00340         double m_reference_scale;
00341         bool m_enabled;
00342         Instance* m_attachedto;
00343         bool m_backendSDL;
00344         // caches calculated image dimensions for already queried & calculated layers
00345         std::map<Layer*, Point> m_image_dimensions;
00346         bool m_iswarped;
00347 
00348         // list of renderers managed by the view
00349         std::map<std::string, RendererBase*> m_renderers;
00350         std::list<RendererBase*> m_pipeline;
00351         bool m_updated; // false, if view has never been updated before
00352 
00353         RenderBackend* m_renderbackend;
00354         ImagePool* m_ipool;
00355         AnimationPool* m_apool;
00356 
00357         // caches layer -> instances structure between renders e.g. to fast query of mouse picking order
00358         t_layer_to_instances m_layer_to_instances;
00359 
00360         std::map<Layer*,LayerCache*> m_cache;
00361         MapObserver* m_map_observer;
00362         Map* m_map;
00363 
00364         // is lighting enable
00365         bool m_lighting;
00366         // caches the light color for the camera
00367         std::vector<float> m_light_colors;
00368     };
00369 }
00370 #endif
Generated on Wed Nov 23 13:04:44 2011 for FIFE by  doxygen 1.6.3