WINTERMUTE: Introduce TransformStruct and FloatPoint; add operators to Point32

This commit is contained in:
Tobia Tesan 2013-06-27 15:09:19 +02:00
parent 6716fa39a6
commit 03c4b7a240
5 changed files with 292 additions and 1 deletions

View File

@ -0,0 +1,127 @@
/* 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "engines/wintermute/graphics/transform_struct.h"
#include "engines/wintermute/graphics/transparent_surface.h"
namespace Wintermute {
void TransformStruct::init(Point32 zoom, uint32 angle, Point32 hotspot, bool alphaDisable, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY, Point32 offset) {
_zoom = zoom;
_angle = angle;
_hotspot = hotspot;
_blendMode = blendMode;
_rgbaMod = rgbaMod;
_alphaDisable = alphaDisable;
_flip = 0;
_flip += TransparentSurface::FLIP_H * mirrorX;
_flip += TransparentSurface::FLIP_V * mirrorY;
_offset = offset;
}
TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX, int32 hotspotY, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY, int32 offsetX, int32 offsetY) {
init(Point32(zoomX, zoomY),
angle,
Point32(hotspotX, hotspotY),
false,
blendMode,
rgbaMod,
mirrorX, mirrorY,
Point32(offsetX, offsetY));
}
TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY) {
init(Point32(zoomX, zoomY),
DEFAULT_ANGLE,
Point32(DEFAULT_HOTSPOT_X, DEFAULT_HOTSPOT_Y),
false,
blendMode,
rgbaMod,
mirrorX,
mirrorY,
Point32(DEFAULT_OFFSET_X, DEFAULT_OFFSET_Y));
}
TransformStruct::TransformStruct(int32 zoom, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY) {
init(Point32(zoom, zoom),
DEFAULT_ANGLE,
Point32(DEFAULT_HOTSPOT_X, DEFAULT_HOTSPOT_Y),
false,
blendMode,
rgbaMod,
mirrorX, mirrorY,
Point32(DEFAULT_OFFSET_X, DEFAULT_OFFSET_Y));
}
TransformStruct::TransformStruct(int32 zoom, bool mirrorX, bool mirrorY) {
init(Point32(zoom, zoom),
DEFAULT_ANGLE,
Point32(DEFAULT_HOTSPOT_X, DEFAULT_HOTSPOT_Y),
true,
BLEND_NORMAL,
DEFAULT_RGBAMOD,
mirrorX, mirrorY,
Point32(DEFAULT_OFFSET_X, DEFAULT_OFFSET_Y));
}
TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX, int32 hotspotY) {
init(Point32(zoomX, zoomY),
angle,
Point32(hotspotX, hotspotY),
true,
BLEND_NORMAL,
DEFAULT_RGBAMOD,
false, false,
Point32(DEFAULT_OFFSET_X, DEFAULT_OFFSET_Y));
}
TransformStruct::TransformStruct(int32 zoom) {
init(Point32(zoom, zoom),
DEFAULT_ANGLE,
Point32(DEFAULT_HOTSPOT_X, DEFAULT_HOTSPOT_Y),
true,
BLEND_NORMAL,
DEFAULT_RGBAMOD,
false, false,
Point32(DEFAULT_OFFSET_X, DEFAULT_OFFSET_Y));
}
TransformStruct::TransformStruct() {
init(Point32(DEFAULT_ZOOM_X, DEFAULT_ZOOM_Y),
DEFAULT_ANGLE,
Point32(DEFAULT_HOTSPOT_X, DEFAULT_HOTSPOT_Y),
true,
BLEND_NORMAL,
DEFAULT_RGBAMOD,
false, false,
Point32(DEFAULT_OFFSET_X, DEFAULT_OFFSET_Y));
}
bool TransformStruct::mirrorX() const {
return (bool)(_flip & TransparentSurface::FLIP_H);
}
bool TransformStruct::mirrorY() const {
return (bool)(_flip & TransparentSurface::FLIP_V);
}
}

View File

@ -0,0 +1,87 @@
/* 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef GRAPHICS_TRANSFORM_STRUCT_H
#define GRAPHICS_TRANSFORM_STRUCT_H
#include "engines/wintermute/math/rect32.h"
#include "engines/wintermute/dctypes.h"
#define DEFAULT_ZOOM_X 100
#define DEFAULT_ZOOM_Y 100
#define DEFAULT_RGBAMOD 0xFFFFFFFF
#define DEFAULT_HOTSPOT_X 0
#define DEFAULT_HOTSPOT_Y 0
#define DEFAULT_OFFSET_X 0
#define DEFAULT_OFFSET_Y 0
#define DEFAULT_ANGLE 0
namespace Wintermute {
/**
* Contains all the required information that define a transform.
* Same source sprite + same TransformStruct = Same resulting sprite.
* Has a number of overloaded constructors to accomodate various argument lists.
*/
struct TransformStruct {
private:
void init(Point32 zoom, uint32 angle, Point32 hotspot, bool alphaDisable, TSpriteBlendMode blendMode, uint32 alpha, bool mirrorX, bool mirrorY, Point32 offset);
public:
TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX, int32 hotspotY, TSpriteBlendMode blendMode, uint32 alpha, bool mirrorX = false, bool mirrorY = false, int32 offsetX = 0, int32 offsetY = 0);
TransformStruct(int32 zoomX, int32 zoomY, TSpriteBlendMode blendMode, uint32 alpha, bool mirrorX = false, bool mirrorY = false);
TransformStruct(int32 zoom, TSpriteBlendMode blendMode, uint32 alpha, bool mirrorX, bool mirrorY);
TransformStruct(int32 zoom, bool mirrorX, bool mirrorY);
TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX = 0, int32 hotspotY = 0);
TransformStruct(int32 zoom);
TransformStruct();
Point32 _zoom; ///< Zoom; 100 = no zoom
Point32 _hotspot; ///< Position of the hotspot
uint32 _angle; ///< Rotation angle, in degrees
byte _flip; ///< Bitflag: see TransparentSurface::FLIP_XXX
bool _alphaDisable;
TSpriteBlendMode _blendMode;
uint32 _rgbaMod; ///< RGBa
Point32 _offset;
bool mirrorX() const;
bool mirrorY() const;
bool operator==(const TransformStruct &compare) const {
return (compare._angle == _angle &&
compare._flip == _flip &&
compare._zoom == _zoom &&
compare._offset == _offset &&
compare._alphaDisable == _alphaDisable &&
compare._rgbaMod == _rgbaMod &&
compare._blendMode == _blendMode
);
}
bool operator!=(const TransformStruct &compare) const {
return !(compare == *this);
}
};
}
#endif

View File

@ -0,0 +1,52 @@
/* 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef WINTERMUTE_FLOATRECT_H
#define WINTERMUTE_FLOATRECT_H
namespace Wintermute {
struct FloatPoint {
float x;
float y;
FloatPoint() : x(0), y(0) {}
FloatPoint(float x1, float y1) : x(x1), y(y1) {}
bool operator==(const FloatPoint &p) const { return x == p.x && y == p.y; }
bool operator!=(const FloatPoint &p) const { return x != p.x || y != p.y; }
FloatPoint operator+(const FloatPoint &delta) const { return FloatPoint (x + delta.x, y + delta.y); }
FloatPoint operator-(const FloatPoint &delta) const { return FloatPoint (x - delta.x, y - delta.y); }
FloatPoint& operator+=(const FloatPoint &delta) {
x += delta.x;
y += delta.y;
return *this;
}
FloatPoint& operator-=(const FloatPoint &delta) {
x -= delta.x;
y -= delta.y;
return *this;
}
};
} // end of namespace Wintermute
#endif

View File

@ -24,14 +24,38 @@
#define WINTERMUTE_RECT32_H
#include "common/system.h"
#include "engines/wintermute/math/floatrect.h"
namespace Wintermute {
struct Point32 {
int32 x;
int32 y;
};
Point32() : x(0), y(0) {}
Point32(int32 x1, int32 y1) : x(x1), y(y1) {}
bool operator==(const Point32 &p) const { return x == p.x && y == p.y; }
bool operator!=(const Point32 &p) const { return x != p.x || y != p.y; }
Point32 operator+(const Point32 &delta) const { return Point32(x + delta.x, y + delta.y); }
Point32 operator-(const Point32 &delta) const { return Point32(x - delta.x, y - delta.y); }
Point32 &operator+=(const Point32 &delta) {
x += delta.x;
y += delta.y;
return *this;
}
Point32 &operator-=(const Point32 &delta) {
x -= delta.x;
y -= delta.y;
return *this;
}
operator FloatPoint() {
return FloatPoint(x,y);
}
};
struct Rect32 {
int32 top, left; ///< The point at the top left of the rectangle (part of the rect).
int32 bottom, right; ///< The point at the bottom right of the rectangle (not part of the rect).

View File

@ -89,6 +89,7 @@ MODULE_OBJS := \
base/save_thumb_helper.o \
base/timer.o \
detection.o \
graphics/transform_struct.o \
graphics/transparent_surface.o \
math/math_util.o \
math/matrix4.o \