[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.151,1.152 actor.h,1.82,1.83 events.cpp,1.54,1.55 game.cpp,1.72,1.73 gfx.cpp,1.51,1.52 gfx.h,1.28,1.29 interface.cpp,1.111,1.112 isomap.cpp,1.53,1.54 puzzle.cpp,1.8,1.9 saga.cpp,1.118,1.119 saga.h,1.101,1.102 scene.cpp,1.116,1.117 scene.h,1.58,1.59 sfuncs.cpp,1.134,1.135 sprite.cpp,1.55,1.56 sprite.h,1.19,1.20 transitions.cpp,1.13,1.14
Andrew Kurushin
h00ligan at users.sourceforge.net
Fri Jul 8 09:58:13 CEST 2005
Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22813
Modified Files:
actor.cpp actor.h events.cpp game.cpp gfx.cpp gfx.h
interface.cpp isomap.cpp puzzle.cpp saga.cpp saga.h scene.cpp
scene.h sfuncs.cpp sprite.cpp sprite.h transitions.cpp
Log Message:
implemented per scene actors clipping
so last sequence should look much better (not perfect)
Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -d -r1.151 -r1.152
--- actor.cpp 5 Jul 2005 16:58:29 -0000 1.151
+++ actor.cpp 8 Jul 2005 16:55:52 -0000 1.152
@@ -1225,8 +1225,9 @@
}
-void Actor::calcScreenPosition(CommonObjectData *commonObjectData) {
+bool Actor::calcScreenPosition(CommonObjectData *commonObjectData) {
int beginSlope, endSlope, middle;
+ bool result;
if (_vm->_scene->getFlags() & kSceneFlagISO) {
_vm->_isoMap->tileCoordsToScreenPoint(commonObjectData->location, commonObjectData->screenPosition);
commonObjectData->screenScale = 256;
@@ -1252,6 +1253,12 @@
commonObjectData->location.toScreenPointXYZ(commonObjectData->screenPosition);
}
+ result = commonObjectData->screenPosition.x > -64 &&
+ commonObjectData->screenPosition.x < _vm->getDisplayWidth() + 64 &&
+ commonObjectData->screenPosition.y > -64 &&
+ commonObjectData->screenPosition.y < _vm->getSceneHeight() + 64;
+
+ return result;
}
uint16 Actor::hitTest(const Point &testPoint, bool skipProtagonist) {
@@ -1262,17 +1269,8 @@
// fine to interact with. For example, the door entrance at the glass
// makers's house in ITE's ferret village.
- SCENE_BGINFO bg_info;
- Common::Rect sceneRect;
-
- _vm->_scene->getBGInfo(&bg_info);
-
- sceneRect.left = bg_info.bg_x;
- sceneRect.top = bg_info.bg_y;
- sceneRect.right = bg_info.bg_x + bg_info.bg_w;
- sceneRect.bottom = bg_info.bg_y + bg_info.bg_h;
- if (!sceneRect.contains(testPoint))
+ if (!_vm->_scene->getSceneClip().contains(testPoint))
return ID_NOTHING;
CommonObjectOrderList::iterator drawOrderIterator;
@@ -1328,7 +1326,9 @@
continue;
_drawOrderList.pushBack(obj, compareFunction);
- calcScreenPosition(obj);
+ if (!calcScreenPosition(obj)) {
+ warning("calcScreenPosition return false actorIdx=%i", i);
+ }
}
}
@@ -1393,7 +1393,7 @@
if (_vm->_scene->getFlags() & kSceneFlagISO) {
_vm->_isoMap->drawSprite(back_buf, *spriteList, frameNumber, drawObject->location, drawObject->screenPosition, drawObject->screenScale);
} else {
- _vm->_sprite->drawOccluded(back_buf, *spriteList, frameNumber, drawObject->screenPosition, drawObject->screenScale, drawObject->screenDepth);
+ _vm->_sprite->drawOccluded(back_buf, _vm->_scene->getSceneClip(),*spriteList, frameNumber, drawObject->screenPosition, drawObject->screenScale, drawObject->screenDepth);
}
}
Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -d -r1.82 -r1.83
--- actor.h 5 Jul 2005 20:22:37 -0000 1.82
+++ actor.h 8 Jul 2005 16:55:54 -0000 1.83
@@ -568,7 +568,7 @@
void stepZoneAction(ActorData *actor, const HitZone *hitZone, bool exit, bool stopped);
void createDrawOrderList();
- void calcScreenPosition(CommonObjectData *commonObjectData);
+ bool calcScreenPosition(CommonObjectData *commonObjectData);
bool getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber, SpriteList *&spriteList);
bool followProtagonist(ActorData *actor);
Index: events.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/events.cpp,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- events.cpp 5 Jul 2005 16:58:31 -0000 1.54
+++ events.cpp 8 Jul 2005 16:55:54 -0000 1.55
@@ -125,7 +125,7 @@
int event_done = 0;
BUFFER_INFO buf_info;
- SCENE_BGINFO bg_info;
+ BGInfo bgInfo;
event_pc = ((double)event->duration - event->time) / event->duration;
@@ -162,10 +162,10 @@
switch (event->op) {
case EVENT_DISSOLVE:
_vm->_render->getBufferInfo(&buf_info);
- _vm->_scene->getBGInfo(&bg_info);
+ _vm->_scene->getBGInfo(bgInfo);
_vm->transitionDissolve(buf_info.bg_buf, buf_info.bg_buf_w,
- buf_info.bg_buf_h, buf_info.bg_buf_w, bg_info.bg_buf, bg_info.bg_w,
- bg_info.bg_h, bg_info.bg_p, 0, 0, 0, event_pc);
+ buf_info.bg_buf_h, buf_info.bg_buf_w, bgInfo.buffer, bgInfo.bounds.width(),
+ bgInfo.bounds.height(), 0, 0, 0, event_pc);
break;
case EVENT_DISSOLVE_BGMASK:
// we dissolve it centered.
@@ -177,7 +177,7 @@
_vm->_render->getBufferInfo(&buf_info);
_vm->_scene->getBGMaskInfo(w, h, mask_buf, len);
_vm->transitionDissolve(buf_info.bg_buf, buf_info.bg_buf_w,
- buf_info.bg_buf_h, buf_info.bg_buf_w, mask_buf, w, h, 0, 1,
+ buf_info.bg_buf_h, buf_info.bg_buf_w, mask_buf, w, h, 1,
(320 - w) / 2, (200 - h) / 2, event_pc);
break;
default:
@@ -254,7 +254,7 @@
ScriptThread *sthread;
Rect rect;
- static SCENE_BGINFO bginfo;
+ static BGInfo bgInfo;
if (event->time > 0) {
return EVENT_CONTINUE;
@@ -301,29 +301,29 @@
back_buf = _vm->_gfx->getBackBuffer();
_vm->_render->getBufferInfo(&rbuf_info);
- _vm->_scene->getBGInfo(&bginfo);
+ _vm->_scene->getBGInfo(bgInfo);
- bg_pt.x = bginfo.bg_x;
- bg_pt.y = bginfo.bg_y;
+ bg_pt.x = bgInfo.bounds.left;
+ bg_pt.y = bgInfo.bounds.top;
bufToBuffer(rbuf_info.bg_buf, rbuf_info.bg_buf_w, rbuf_info.bg_buf_h,
- bginfo.bg_buf, bginfo.bg_w, bginfo.bg_h, NULL, &bg_pt);
+ bgInfo.buffer, bgInfo.bounds.width(), bgInfo.bounds.height(), NULL, &bg_pt);
// If it is inset scene then draw black border
- if (bginfo.bg_w < _vm->getDisplayWidth() || bginfo.bg_h < _vm->getSceneHeight()) {
+ if (bgInfo.bounds.width() < _vm->getDisplayWidth() || bgInfo.bounds.height() < _vm->getSceneHeight()) {
SURFACE s;
s.pixels = rbuf_info.bg_buf;
s.w = s.pitch = rbuf_info.bg_buf_w;
s.h = rbuf_info.bg_buf_h;
s.bytesPerPixel = 1;
- Common::Rect rect1(2, bginfo.bg_h + 4);
- Common::Rect rect2(bginfo.bg_w + 4, 2);
- Common::Rect rect3(2, bginfo.bg_h + 4);
- Common::Rect rect4(bginfo.bg_w + 4, 2);
- rect1.moveTo(bginfo.bg_x - 2, bginfo.bg_y - 2);
- rect2.moveTo(bginfo.bg_x - 2, bginfo.bg_y - 2);
- rect3.moveTo(bginfo.bg_x + bginfo.bg_w, bginfo.bg_y - 2);
- rect4.moveTo(bginfo.bg_x - 2, bginfo.bg_y + bginfo.bg_h);
+ Common::Rect rect1(2, bgInfo.bounds.height() + 4);
+ Common::Rect rect2(bgInfo.bounds.width() + 4, 2);
+ Common::Rect rect3(2, bgInfo.bounds.height() + 4);
+ Common::Rect rect4(bgInfo.bounds.width() + 4, 2);
+ rect1.moveTo(bgInfo.bounds.left - 2, bgInfo.bounds.top - 2);
+ rect2.moveTo(bgInfo.bounds.left - 2, bgInfo.bounds.top - 2);
+ rect3.moveTo(bgInfo.bounds.right, bgInfo.bounds.top - 2);
+ rect4.moveTo(bgInfo.bounds.left - 2, bgInfo.bounds.bottom);
drawRect(&s, rect1, kITEColorBlack);
drawRect(&s, rect2, kITEColorBlack);
Index: game.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/game.cpp,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- game.cpp 5 Jul 2005 16:58:33 -0000 1.72
+++ game.cpp 8 Jul 2005 16:55:54 -0000 1.73
@@ -1060,6 +1060,8 @@
_gameNumber = gameNumber;
_gameDescription = &gameDescriptions[gameNumber];
_gameDisplayInfo = *_gameDescription->gameDisplayInfo;
+ _displayClip.right = _gameDisplayInfo.logicalWidth;
+ _displayClip.bottom = _gameDisplayInfo.logicalHeight;
gameFileCount = _gameDescription->filesCount;
Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/gfx.cpp,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- gfx.cpp 5 Jul 2005 16:58:33 -0000 1.51
+++ gfx.cpp 8 Jul 2005 16:55:54 -0000 1.52
@@ -396,55 +396,6 @@
return SUCCESS;
}
-int getClipInfo(CLIPINFO *clipinfo) {
- Common::Rect s;
- int d_x, d_y;
-
- Common::Rect clip;
-
- if (clipinfo == NULL) {
- return FAILURE;
- }
-
- if (clipinfo->dst_pt != NULL) {
- d_x = clipinfo->dst_pt->x;
- d_y = clipinfo->dst_pt->y;
- } else {
- d_x = 0;
- d_y = 0;
- }
-
- // Get the clip rect.
-
- clip.left = clipinfo->dst_rect->left;
- clip.right = clipinfo->dst_rect->right;
- clip.top = clipinfo->dst_rect->top;
- clip.bottom = clipinfo->dst_rect->bottom;
-
- // Adjust the rect to draw to its screen coordinates
-
- s.left = d_x + clipinfo->src_rect->left;
- s.right = d_x + clipinfo->src_rect->right;
- s.top = d_y + clipinfo->src_rect->top;
- s.bottom = d_y + clipinfo->src_rect->bottom;
-
- s.clip(clip);
-
- if (s.width() <= 0 || s.height() <= 0) {
- clipinfo->nodraw = 1;
- return SUCCESS;
- }
-
- clipinfo->nodraw = 0;
- clipinfo->src_draw_x = s.left - clipinfo->src_rect->left - d_x;
- clipinfo->src_draw_y = s.top - clipinfo->src_rect->top - d_y;
- clipinfo->dst_draw_x = s.left;
- clipinfo->dst_draw_y = s.top;
- clipinfo->draw_w = s.width();
- clipinfo->draw_h = s.height();
-
- return SUCCESS;
-}
SURFACE *Gfx::getBackBuffer() {
return &_back_buf;
Index: gfx.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/gfx.h,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- gfx.h 5 Jul 2005 15:15:34 -0000 1.28
+++ gfx.h 8 Jul 2005 16:55:54 -0000 1.29
@@ -33,20 +33,43 @@
using Common::Point;
using Common::Rect;
-struct CLIPINFO {
+struct ClipData {
// input members
- const Rect *src_rect;
- const Rect *dst_rect;
- const Point *dst_pt;
+ Rect sourceRect;
+ Rect destRect;
+ Point destPoint;
// output members
- int nodraw;
- int src_draw_x;
- int src_draw_y;
- int dst_draw_x;
- int dst_draw_y;
- int draw_w;
- int draw_h;
+ Point sourceDraw;
+ Point destDraw;
+ int width;
+ int height;
+
+ bool calcClip() {
+ Common::Rect s;
+
+ // Adjust the rect to draw to its screen coordinates
+ s = sourceRect;
+ s.left += destPoint.x;
+ s.right += destPoint.x;
+ s.top += destPoint.y;
+ s.bottom += destPoint.y;
+
+ s.clip(destRect);
+
+ if ((s.width() <= 0) || (s.height() <= 0)) {
+ return false;
+ }
+
+ sourceDraw.x = s.left - sourceRect.left - destPoint.x;
+ sourceDraw.y = s.top - sourceRect.top - destPoint.y;
+ destDraw.x = s.left;
+ destDraw.y = s.top;
+ width = s.width();
+ height = s.height();
+
+ return true;
+ }
};
struct PALENTRY {
@@ -78,7 +101,6 @@
int bufToSurface(SURFACE *ds, const byte *src, int src_w, int src_h, Rect *src_rect, Point *dst_pt);
int bufToBuffer(byte * dst_buf, int dst_w, int dst_h, const byte *src,
int src_w, int src_h, Rect *src_rect, Point *dst_pt);
-int getClipInfo(CLIPINFO *clipinfo);
int drawRect(SURFACE *ds, Rect &dst_rect, int color);
int drawFrame(SURFACE *ds, const Point *p1, const Point *p2, int color);
int drawPolyLine(SURFACE *ds, const Point *pts, int pt_ct, int draw_color);
Index: interface.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.cpp,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -d -r1.111 -r1.112
--- interface.cpp 6 Jul 2005 17:07:58 -0000 1.111
+++ interface.cpp 8 Jul 2005 16:55:54 -0000 1.112
@@ -528,7 +528,7 @@
point.x = _mainPanel.x + panelButton->xOffset;
point.y = _mainPanel.y + panelButton->yOffset;
- _vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256);
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _mainPanel.sprites, spriteNumber, point, 256);
drawVerbPanelText(backBuffer, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
}
@@ -577,7 +577,7 @@
_lockedMode == kPanelMain || _lockedMode == kPanelConverse) {
leftPortraitPoint.x = _mainPanel.x + _vm->getDisplayInfo().leftPortraitXOffset;
leftPortraitPoint.y = _mainPanel.y + _vm->getDisplayInfo().leftPortraitYOffset;
- _vm->_sprite->draw(backBuffer, _defPortraits, _leftPortrait, leftPortraitPoint, 256);
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _defPortraits, _leftPortrait, leftPortraitPoint, 256);
}
if (!_inMainMode && _vm->getDisplayInfo().rightPortraitXOffset >= 0) { //FIXME: should we change !_inMainMode to _panelMode == kPanelConverse ?
@@ -592,7 +592,7 @@
if (_rightPortrait >= _scenePortraits.spriteCount)
_rightPortrait = 0;
- _vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256);
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _scenePortraits, _rightPortrait, rightPortraitPoint, 256);
}
drawInventory(backBuffer);
@@ -1345,7 +1345,7 @@
rect.right = rect.left + _vm->getDisplayInfo().saveReminderWidth;
rect.bottom = rect.top + _vm->getDisplayInfo().saveReminderHeight;
- _vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites,
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _vm->_sprite->_mainSprites,
_saveReminderState == 1 ? _vm->getDisplayInfo().saveReminderFirstSpriteNumber : _vm->getDisplayInfo().saveReminderSecondSpriteNumber,
rect, 256);
@@ -1561,7 +1561,7 @@
point.x = rect.left;
point.y = rect.top;
obj = _vm->_actor->getObj(_inventory[ci]);
- _vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites, obj->spriteListResourceId, rect, 256);
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _vm->_sprite->_mainSprites, obj->spriteListResourceId, rect, 256);
ci++;
}
@@ -1729,7 +1729,7 @@
point.x = panel->x + panelButton->xOffset;
point.y = panel->y + panelButton->yOffset;
- _vm->_sprite->draw(ds, _vm->_sprite->_mainSprites, spriteNumber, point, 256);
+ _vm->_sprite->draw(ds, _vm->getDisplayClip(), _vm->_sprite->_mainSprites, spriteNumber, point, 256);
}
void Interface::drawVerbPanelText(SURFACE *ds, PanelButton *panelButton, int textColor, int textShadowColor) {
@@ -2113,7 +2113,7 @@
Rect screen(_vm->getDisplayWidth(), _vm->getSceneHeight());
if (screen.contains(mapPosition)) {
- _vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites,
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), _vm->_sprite->_mainSprites,
_mapPanelCrossHairState? RID_ITE_SPR_XHAIR1 : RID_ITE_SPR_XHAIR2,
mapPosition, 256);
}
Index: isomap.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/isomap.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- isomap.cpp 4 Jul 2005 07:43:55 -0000 1.53
+++ isomap.cpp 8 Jul 2005 16:55:54 -0000 1.54
@@ -379,7 +379,7 @@
int IsoMap::draw(SURFACE *ds) {
- Rect isoRect(_vm->getDisplayWidth(), _vm->getClippedSceneHeight());
+ Rect isoRect(_vm->_scene->getSceneClip());
drawRect(ds, isoRect, 0);
_tileClip = isoRect;
drawTiles(ds, NULL);
@@ -399,7 +399,7 @@
int yAlign;
const byte *spriteBuffer;
Point spritePointer;
- Rect clip(_vm->getDisplayWidth(), _vm->getClippedSceneHeight());
+ Rect clip(_vm->_scene->getSceneClip());
_vm->_sprite->getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
Index: puzzle.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/puzzle.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- puzzle.cpp 8 Jul 2005 16:43:36 -0000 1.8
+++ puzzle.cpp 8 Jul 2005 16:55:55 -0000 1.9
@@ -267,7 +267,7 @@
int num = _piecePriority[j];
if (_puzzlePiece != num) {
- _vm->_sprite->draw(backBuffer, puzzle->spriteList, num, Point(_pieceInfo[num].curX, _pieceInfo[num].curY), 256);
+ _vm->_sprite->draw(backBuffer, _vm->getDisplayClip(), puzzle->spriteList, num, Point(_pieceInfo[num].curX, _pieceInfo[num].curY), 256);
}
}
}
@@ -275,14 +275,9 @@
void Puzzle::drawCurrentPiece() {
ActorData *puzzle = _vm->_actor->getActor(_vm->_actor->actorIndexToId(ITE_ACTOR_PUZZLE));
SURFACE *backBuffer = _vm->_gfx->getBackBuffer();
- SCENE_BGINFO bg_info;
- _vm->_scene->getBGInfo(&bg_info);
-
- Rect clip(bg_info.bg_x, bg_info.bg_y, bg_info.bg_x + bg_info.bg_w, bg_info.bg_y + bg_info.bg_h);
-
- _vm->_sprite->draw(backBuffer, puzzle->spriteList, _puzzlePiece,
- Point(_pieceInfo[_puzzlePiece].curX, _pieceInfo[_puzzlePiece].curY), 256, &clip);
+ _vm->_sprite->draw(backBuffer, _vm->_scene->getSceneClip(), puzzle->spriteList, _puzzlePiece,
+ Point(_pieceInfo[_puzzlePiece].curX, _pieceInfo[_puzzlePiece].curY), 256);
}
void Puzzle::movePiece(Point mousePt) {
Index: saga.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.cpp,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -d -r1.118 -r1.119
--- saga.cpp 5 Jul 2005 16:58:34 -0000 1.118
+++ saga.cpp 8 Jul 2005 16:55:55 -0000 1.119
@@ -165,6 +165,7 @@
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
+ _displayClip.left = _displayClip.top = 0;
_vm = this;
}
@@ -302,6 +303,10 @@
_previousTicks = _system->getMillis();
+ if (ConfMan.hasKey("start_scene")) {
+ _scene->changeScene(ConfMan.getInt("start_scene"), 0, kTransitionNoFade);
+ }
+ else
if (ConfMan.hasKey("save_slot")) {
// First scene sets up palette
_scene->changeScene(getStartSceneNumber(), 0, kTransitionNoFade);
Index: saga.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.h,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -d -r1.101 -r1.102
--- saga.h 25 Jun 2005 15:55:43 -0000 1.101
+++ saga.h 8 Jul 2005 16:55:55 -0000 1.102
@@ -587,7 +587,7 @@
int textProcessList(TEXTLIST *textlist, long ms);
int transitionDissolve(byte *dst_img, int dst_w, int dst_h, int dst_p,
- const byte *src_img, int src_w, int src_h, int src_p, int flags, int x, int y,
+ const byte *src_img, int src_w, int src_h, int flags, int x, int y,
double percent);
int processInput(void);
@@ -627,6 +627,7 @@
int _gameNumber;
GameDescription *_gameDescription;
GameDisplayInfo _gameDisplayInfo;
+ Common::Rect _displayClip;
public:
int initGame(void);
@@ -649,6 +650,7 @@
int getStartSceneNumber() const { return _gameDescription->startSceneNumber; }
+ const Common::Rect &getDisplayClip() const { return _displayClip;}
int getDisplayWidth() const { return _gameDisplayInfo.logicalWidth; }
int getDisplayHeight() const { return _gameDisplayInfo.logicalHeight;}
int getSceneHeight() const { return _gameDisplayInfo.sceneHeight; }
Index: scene.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/scene.cpp,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -d -r1.116 -r1.117
--- scene.cpp 6 Jul 2005 17:51:41 -0000 1.116
+++ scene.cpp 8 Jul 2005 16:55:55 -0000 1.117
@@ -267,32 +267,22 @@
endSlope = _vm->getSceneHeight() - _sceneDescription.endSlope;
}
-int Scene::getBGInfo(SCENE_BGINFO *bginfo) {
- int x, y;
-
- assert(_initialized);
-
- bginfo->bg_buf = _bg.buf;
- bginfo->bg_buflen = _bg.buf_len;
- bginfo->bg_w = _bg.w;
- bginfo->bg_h = _bg.h;
- bginfo->bg_p = _bg.p;
-
- x = 0;
- y = 0;
+void Scene::getBGInfo(BGInfo &bgInfo) {
+ bgInfo.buffer = _bg.buf;
+ bgInfo.bufferLength = _bg.buf_len;
+ bgInfo.bounds.left = 0;
+ bgInfo.bounds.top = 0;
if (_bg.w < _vm->getDisplayWidth()) {
- x = (_vm->getDisplayWidth() - _bg.w) / 2;
+ bgInfo.bounds.left = (_vm->getDisplayWidth() - _bg.w) / 2;
}
if (_bg.h < _vm->getSceneHeight()) {
- y = (_vm->getSceneHeight() - _bg.h) / 2;
+ bgInfo.bounds.top = (_vm->getClippedSceneHeight() - _bg.h) / 2;
}
- bginfo->bg_x = x;
- bginfo->bg_y = y;
-
- return SUCCESS;
+ bgInfo.bounds.setWidth(_bg.w);
+ bgInfo.bounds.setHeight(_bg.h);
}
int Scene::getBGPal(PALENTRY **pal) {
@@ -456,7 +446,16 @@
if (_sceneDescription.flags & kSceneFlagISO) {
_outsetSceneNumber = _sceneNumber;
+
+ _sceneClip.left = 0;
+ _sceneClip.top = 0;
+ _sceneClip.right = _vm->getDisplayWidth();
+ _sceneClip.bottom = _vm->getClippedSceneHeight();
} else {
+ BGInfo backGroundInfo;
+ getBGInfo(backGroundInfo);
+ _sceneClip = backGroundInfo.bounds;
+
if (!(_bg.w < _vm->getDisplayWidth() || _bg.h < _vm->getSceneHeight()))
_outsetSceneNumber = _sceneNumber;
}
Index: scene.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/scene.h,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -d -r1.58 -r1.59
--- scene.h 5 Jul 2005 15:15:35 -0000 1.58
+++ scene.h 8 Jul 2005 16:55:55 -0000 1.59
@@ -43,14 +43,10 @@
kSceneFlagShowCursor = 2
};
-struct SCENE_BGINFO {
- int bg_x;
- int bg_y;
- int bg_w;
- int bg_h;
- int bg_p;
- byte *bg_buf;
- size_t bg_buflen;
+struct BGInfo {
+ Rect bounds;
+ byte *buffer;
+ size_t bufferLength;
};
typedef int (SceneProc) (int, void *);
@@ -232,7 +228,8 @@
int getFlags() const { return _sceneDescription.flags; }
int getScriptModuleNumber() const { return _sceneDescription.scriptModuleNumber; }
bool isInDemo() { return !_inGame; }
-
+ const Rect& getSceneClip() const { return _sceneClip; }
+
void getBGMaskInfo(int &width, int &height, byte *&buffer, size_t &bufferLength);
int isBGMaskPresent() { return _bgMask.loaded; }
int getBGMaskType(const Point &testPoint);
@@ -244,7 +241,7 @@
int getDoorState(int doorNumber);
void initDoorsState();
- int getBGInfo(SCENE_BGINFO *bginfo);
+ void getBGInfo(BGInfo &bgInfo);
int getBGPal(PALENTRY **pal);
void getSlopes(int &beginSlope, int &endSlope);
@@ -296,7 +293,8 @@
SceneProc *_sceneProc;
SCENE_IMAGE _bg;
SCENE_IMAGE _bgMask;
-
+ Common::Rect _sceneClip;
+
int _sceneDoors[SCENE_DOORS_MAX];
Index: sfuncs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sfuncs.cpp,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -d -r1.134 -r1.135
--- sfuncs.cpp 6 Jul 2005 17:55:53 -0000 1.134
+++ sfuncs.cpp 8 Jul 2005 16:55:55 -0000 1.135
@@ -1050,7 +1050,7 @@
frameType = thread->pop();
frameOffset = thread->pop();
- debug(1, "sfPlaceActor(%d, %d, %d, %d, %d, %d)", actorId, actorLocation.x,
+ debug(1, "sfPlaceActor(id = %d, x=%d, y=%d, dir=%d, frameType=%d, frameOffset=%d)", actorId, actorLocation.x,
actorLocation.y, actorDirection, frameType, frameOffset);
if (_vm->getGameType() == GType_IHNM) {
@@ -1241,7 +1241,7 @@
event.data = back_buf;
event.param = 138;
event.param2 = 0;
- event.param3 = _vm->getSceneHeight();
+ event.param3 = _vm->getClippedSceneHeight();
event.param4 = 0;
event.param5 = _vm->getDisplayWidth();
@@ -1258,7 +1258,7 @@
text_entry.color = kITEColorBrightWhite;
text_entry.effect_color = kITEColorBlack;
text_entry.text_x = _vm->getDisplayWidth() / 2;
- text_entry.text_y = (_vm->getSceneHeight() - _vm->_font->getHeight(MEDIUM_FONT_ID)) / 2;
+ text_entry.text_y = (_vm->getClippedSceneHeight() - _vm->_font->getHeight(MEDIUM_FONT_ID)) / 2;
text_entry.font_id = MEDIUM_FONT_ID;
text_entry.flags = FONT_OUTLINE | FONT_CENTERED;
text_entry.string = thread->_strings->getString(stringId);
@@ -1556,19 +1556,17 @@
// Script function #62 (0x3E)
void Script::sfEraseDelta(SCRIPTFUNC_PARAMS) {
BUFFER_INFO bufferInfo;
- SCENE_BGINFO backGroundInfo;
+ BGInfo backGroundInfo;
Point backGroundPoint;
_vm->_render->getBufferInfo(&bufferInfo);
- _vm->_scene->getBGInfo(&backGroundInfo);
- backGroundPoint.x = backGroundInfo.bg_x;
- backGroundPoint.y = backGroundInfo.bg_y;
+ _vm->_scene->getBGInfo(backGroundInfo);
+ backGroundPoint.x = backGroundInfo.bounds.left;
+ backGroundPoint.y = backGroundInfo.bounds.top;
bufToBuffer(bufferInfo.bg_buf, bufferInfo.bg_buf_w, bufferInfo.bg_buf_h,
- backGroundInfo.bg_buf, backGroundInfo.bg_w, backGroundInfo.bg_h,
+ backGroundInfo.buffer, backGroundInfo.bounds.width(), backGroundInfo.bounds.height(),
NULL, &backGroundPoint);
-
-
}
// Script function #63 (0x3F)
Index: sprite.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.cpp,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -d -r1.55 -r1.56
--- sprite.cpp 8 Jul 2005 16:43:36 -0000 1.55
+++ sprite.cpp 8 Jul 2005 16:56:01 -0000 1.56
@@ -170,7 +170,7 @@
}
-void Sprite::drawClip(SURFACE *ds, Rect clip, const Point &spritePointer, int width, int height, const byte *spriteBuffer) {
+void Sprite::drawClip(SURFACE *ds, const Rect &clipRect, const Point &spritePointer, int width, int height, const byte *spriteBuffer) {
int clipWidth;
int clipHeight;
@@ -182,22 +182,22 @@
srcRowPointer = spriteBuffer;
clipWidth = width;
- if (width > (clip.right - spritePointer.x)) {
- clipWidth = (clip.right - spritePointer.x);
+ if (width > (clipRect.right - spritePointer.x)) {
+ clipWidth = (clipRect.right - spritePointer.x);
}
clipHeight = height;
- if (height > (clip.bottom - spritePointer.y)) {
- clipHeight = (clip.bottom - spritePointer.y);
+ if (height > (clipRect.bottom - spritePointer.y)) {
+ clipHeight = (clipRect.bottom - spritePointer.y);
}
jo = 0;
io = 0;
- if (spritePointer.x < clip.left) {
- jo = clip.left - spritePointer.x;
+ if (spritePointer.x < clipRect.left) {
+ jo = clipRect.left - spritePointer.x;
}
- if (spritePointer.y < clip.top) {
- io = clip.top - spritePointer.y;
+ if (spritePointer.y < clipRect.top) {
+ io = clipRect.top - spritePointer.y;
bufRowPointer += ds->pitch * io;
srcRowPointer += width * io;
}
@@ -217,60 +217,29 @@
}
}
-int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale, Rect *clipOverride) {
+void Sprite::draw(SURFACE *ds, const Rect &clipRect, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale) {
const byte *spriteBuffer;
int width;
int height;
int xAlign;
int yAlign;
Point spritePointer;
- Rect clip;
-
- assert(_initialized);
-
- if (clipOverride) {
- clip.left = clipOverride->left;
- clip.right = clipOverride->right;
- clip.top = clipOverride->top;
- clip.bottom = clipOverride->bottom;
- } else {
- clip.left = 0;
- clip.right = _vm->getDisplayWidth();
- clip.top = 0;
- clip.bottom = _vm->getDisplayHeight();
- }
getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
spritePointer.x = screenCoord.x + xAlign;
spritePointer.y = screenCoord.y + yAlign;
- drawClip(ds, clip, spritePointer, width, height, spriteBuffer);
-
- return SUCCESS;
+ drawClip(ds, clipRect, spritePointer, width, height, spriteBuffer);
}
-int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale, Rect *clipOverride) {
+void Sprite::draw(SURFACE *ds, const Rect &clipRect, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale) {
const byte *spriteBuffer;
int width;
int height;
int xAlign, spw;
int yAlign, sph;
Point spritePointer;
- Rect clip;
-
- assert(_initialized);
-
- if (clipOverride) {
- clip.left = clipOverride->left;
- clip.right = clipOverride->right;
- clip.top = clipOverride->top;
- clip.bottom = clipOverride->bottom;
- } else {
- clip.left = 0;
- clip.right = _vm->getDisplayWidth();
- clip.top = 0;
- clip.bottom = _vm->getDisplayHeight();
- }
+
getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
spw = (screenRect.width() - width) / 2;
@@ -283,9 +252,7 @@
}
spritePointer.x = screenRect.left + xAlign + spw;
spritePointer.y = screenRect.top + yAlign + sph;
- drawClip(ds, clip, spritePointer, width, height, spriteBuffer);
-
- return SUCCESS;
+ drawClip(ds, clipRect, spritePointer, width, height, spriteBuffer);
}
bool Sprite::hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint) {
@@ -316,97 +283,80 @@
return *srcRowPointer != 0;
}
-int Sprite::drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth) {
+void Sprite::drawOccluded(SURFACE *ds, const Rect &clipRect, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth) {
const byte *spriteBuffer;
int x, y;
- byte *dst_row_p;
- const byte *src_row_p;
- const byte *src_p;
- byte *dst_p;
- byte *mask_p;
+ byte *destRowPointer;
+ const byte *sourceRowPointer;
+ const byte *sourcePointer;
+ byte *destPointer;
+ byte *maskPointer;
int width;
int height;
int xAlign;
int yAlign;
- Point spritePointer;
- // Clipinfo variables
- Rect spriteSourceRect;
- Rect spriteDestRect;
- CLIPINFO ci;
+ ClipData clipData;
// BG mask variables
int maskWidth;
int maskHeight;
byte *maskBuffer;
size_t maskBufferLength;
- byte *mask_row_p;
- int mask_z;
+ byte *maskRowPointer;
+ int maskZ;
+
assert(_initialized);
if (!_vm->_scene->isBGMaskPresent()) {
- return draw(ds, spriteList, spriteNumber, screenCoord, scale);
+ draw(ds, clipRect, spriteList, spriteNumber, screenCoord, scale);
+ return;
}
_vm->_scene->getBGMaskInfo(maskWidth, maskHeight, maskBuffer, maskBufferLength);
getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
- spritePointer.x = screenCoord.x + xAlign;
- spritePointer.y = screenCoord.y + yAlign;
-
- spriteSourceRect.left = 0;
- spriteSourceRect.top = 0;
- spriteSourceRect.right = width;
- spriteSourceRect.bottom = height;
-
- SCENE_BGINFO bg_info;
-
- _vm->_scene->getBGInfo(&bg_info);
-
- spriteDestRect.left = bg_info.bg_x;
- spriteDestRect.top = bg_info.bg_y;
- spriteDestRect.right = bg_info.bg_x + bg_info.bg_w;
- spriteDestRect.bottom = bg_info.bg_y + bg_info.bg_h;
+ clipData.destPoint.x = screenCoord.x + xAlign;
+ clipData.destPoint.y = screenCoord.y + yAlign;
- ci.dst_rect = &spriteDestRect;
- ci.src_rect = &spriteSourceRect;
- ci.dst_pt = &spritePointer;
+ clipData.sourceRect.left = 0;
+ clipData.sourceRect.top = 0;
+ clipData.sourceRect.right = width;
+ clipData.sourceRect.bottom = height;
- getClipInfo(&ci);
+ clipData.destRect = clipRect;
- if (ci.nodraw) {
- return SUCCESS;
+ if (!clipData.calcClip()) {
+ return;
}
// Finally, draw the occluded sprite
- src_row_p = spriteBuffer + ci.src_draw_x + (ci.src_draw_y * width);
-
- dst_row_p = (byte *)ds->pixels + ci.dst_draw_x + (ci.dst_draw_y * ds->pitch);
- mask_row_p = maskBuffer + ci.dst_draw_x + (ci.dst_draw_y * maskWidth);
+ sourceRowPointer = spriteBuffer + clipData.sourceDraw.x + (clipData.sourceDraw.y * width);
+
+ destRowPointer = (byte *)ds->pixels + clipData.destDraw.x + (clipData.destDraw.y * ds->pitch);
+ maskRowPointer = maskBuffer + clipData.destDraw.x + (clipData.destDraw.y * maskWidth);
- for (y = 0; y < ci.draw_h; y++) {
- src_p = src_row_p;
- dst_p = dst_row_p;
- mask_p = mask_row_p;
- for (x = 0; x < ci.draw_w; x++) {
- if (*src_p != 0) {
- mask_z = *mask_p & SPRITE_ZMASK;
- if (mask_z > depth) {
- *dst_p = *src_p;
+ for (y = 0; y < clipData.height; y++) {
+ sourcePointer = sourceRowPointer;
+ destPointer = destRowPointer;
+ maskPointer = maskRowPointer;
+ for (x = 0; x < clipData.width; x++) {
+ if (*sourcePointer != 0) {
+ maskZ = *maskPointer & SPRITE_ZMASK;
+ if (maskZ > depth) {
+ *destPointer = *sourcePointer;
}
}
- src_p++;
- dst_p++;
- mask_p++;
+ sourcePointer++;
+ destPointer++;
+ maskPointer++;
}
- dst_row_p += ds->pitch;
- mask_row_p += maskWidth;
- src_row_p += width;
+ destRowPointer += ds->pitch;
+ maskRowPointer += maskWidth;
+ sourceRowPointer += width;
}
-
- return SUCCESS;
}
void Sprite::decodeRLEBuffer(const byte *inputBuffer, size_t inLength, size_t outLength) {
Index: sprite.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- sprite.h 8 Jul 2005 16:43:36 -0000 1.19
+++ sprite.h 8 Jul 2005 16:56:03 -0000 1.20
@@ -60,19 +60,31 @@
}
};
+
class Sprite {
public:
SpriteList _mainSprites;
+
+
Sprite(SagaEngine *vm);
~Sprite(void);
+
+ // draw scaled sprite using background scene mask
+ void drawOccluded(SURFACE *ds, const Rect &clipRect, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth);
+
+ // draw scaled sprite using background scene mask
+ void draw(SURFACE *ds, const Rect &clipRect, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale);
+
+ // main function
+ void drawClip(SURFACE *ds, const Rect &clipRect, const Point &spritePointer, int width, int height, const byte *spriteBuffer);
+
+ void draw(SURFACE *ds, const Rect &clipRect, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale);
+
int loadList(int resourceId, SpriteList &spriteList); // load or append spriteList
- int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale, Rect *clipOverride = NULL);
- int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale, Rect *clipOverride = NULL);
- int drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth);
bool hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint);
void getScaledSpriteBuffer(SpriteList &spriteList, int spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer);
- void drawClip(SURFACE *ds, Rect clip, const Point &spritePointer, int width, int height, const byte *spriteBuffer);
+
private:
void decodeRLEBuffer(const byte *inputBuffer, size_t inLength, size_t outLength);
void scaleBuffer(const byte *src, int width, int height, int scale);
Index: transitions.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/transitions.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- transitions.cpp 9 May 2005 12:27:31 -0000 1.13
+++ transitions.cpp 8 Jul 2005 16:56:03 -0000 1.14
@@ -31,7 +31,7 @@
* If flags if set to 1, do zero masking.
*/
int SagaEngine::transitionDissolve(byte *dst_img, int dst_w, int dst_h, int dst_p, const byte *src_img,
- int src_w, int src_h, int src_p, int flags, int x, int y,
+ int src_w, int src_h, int flags, int x, int y,
double percent) {
#define XOR_MASK 0xB400;
int pixelcount = dst_w * dst_h;
More information about the Scummvm-git-logs
mailing list