1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef STARK_GFX_RENDER_ENTRY_H
#define STARK_GFX_RENDER_ENTRY_H
#include "common/array.h"
#include "common/rect.h"
#include "common/str.h"
#include "math/ray.h"
#include "math/vector3d.h"
namespace Stark {
class Visual;
class VisualImageXMG;
class VisualText;
namespace Resources {
class ItemVisual;
}
namespace Gfx {
struct LightEntry {
enum Type {
kAmbient = 0,
kPoint = 1,
kDirectional = 2,
kSpot = 4
};
Type type;
Math::Vector3d color;
Math::Vector3d position;
Math::Vector3d direction;
Math::Angle innerConeAngle;
Math::Angle outerConeAngle;
float falloffNear;
float falloffFar;
Math::Vector4d worldPosition;
Math::Vector4d eyePosition;
Math::Vector3d eyeDirection;
};
typedef Common::Array<LightEntry *> LightEntryArray;
class RenderEntry {
public:
RenderEntry(Resources::ItemVisual *owner, const Common::String &name);
virtual ~RenderEntry() {}
void render(const LightEntryArray &lights = LightEntryArray());
void setVisual(Visual *visual);
void setPosition(const Common::Point &position);
void setPosition3D(const Math::Vector3d &position, float direction);
void setSortKey(float sortKey);
void setClickable(bool clickable);
/** Gets the position */
Common::Point getPosition() const { return _position; }
/** Gets the owner-object */
Resources::ItemVisual *getOwner() const { return _owner; }
/** Gets the entry's name */
const Common::String &getName() const { return _name; }
/** Obtain the underlying image visual, if any */
VisualImageXMG *getImage() const;
/** Obtain the underlying text visual, if any */
VisualText *getText() const;
/**
* Mouse picking test for 2D items
*
* @param position game window coordinates to test
* @param relativePosition successful hit item relative coordinates
* @param cursorRect cursor rectangle to be used to test small world items
* @return successful hit
*/
bool containsPoint(const Common::Point &position, Common::Point &relativePosition, const Common::Rect &cursorRect) const;
/** Mouse picking test for 3D items */
bool intersectRay(const Math::Ray &ray) const;
/** Compare two render entries by their sort keys */
static bool compare(const RenderEntry *x, const RenderEntry *y);
/**
* Compute the 2D screen space bounding rect for the item,
* in original game view coordinates.
*/
Common::Rect getBoundingRect() const;
protected:
Common::String _name;
Resources::ItemVisual *_owner;
Visual *_visual;
Common::Point _position;
Math::Vector3d _position3D;
float _direction3D;
float _sortKey;
bool _clickable;
};
typedef Common::Array<RenderEntry *> RenderEntryArray;
} // End of namespace Gfx
} // End of namespace Stark
#endif // STARK_GFX_RENDER_ENTRY_H
|