Skip to content

Commit

Permalink
NEVERHOOD: Implement clipping against multiple clipRects, used only i…
Browse files Browse the repository at this point in the history
…n several scenes for the Klayman sprite.

Currently only implemented in KmScene2201 for testing.
  • Loading branch information
johndoe123 authored and wjp committed May 8, 2013
1 parent 8a9ca49 commit 15cfb9f
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 20 deletions.
2 changes: 1 addition & 1 deletion engines/neverhood/gamemodule.cpp
Expand Up @@ -310,7 +310,7 @@ void GameModule::startup() {

#if 1
_vm->gameState().sceneNum = 0;
createModule(2100, -1);
createModule(2200, -1);
#endif
#if 0
_vm->gameState().sceneNum = 0;
Expand Down
7 changes: 5 additions & 2 deletions engines/neverhood/graphics.cpp
Expand Up @@ -27,7 +27,8 @@
namespace Neverhood {

BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height)
: _vm(vm), _priority(priority), _visible(true), _transparent(true) {
: _vm(vm), _priority(priority), _visible(true), _transparent(true),
_clipRects(NULL), _clipRectsCount(0) {

_drawRect.x = 0;
_drawRect.y = 0;
Expand All @@ -52,7 +53,9 @@ BaseSurface::~BaseSurface() {

void BaseSurface::draw() {
if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
if (_sysRect.x == 0 && _sysRect.y == 0) {
if (_clipRects && _clipRectsCount) {
_vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent);
} else if (_sysRect.x == 0 && _sysRect.y == 0) {
_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
} else {
_vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent);
Expand Down
4 changes: 4 additions & 0 deletions engines/neverhood/graphics.h
Expand Up @@ -101,6 +101,8 @@ class BaseSurface {
NDrawRect& getSysRect() { return _sysRect; }
NRect& getClipRect() { return _clipRect; }
void setClipRect(NRect clipRect) { _clipRect = clipRect; }
void setClipRects(NRect *clipRects, uint clipRectsCount) { _clipRects = clipRects; _clipRectsCount = clipRectsCount; }
void clearClipRects() { _clipRects = NULL; _clipRectsCount = 0; }
bool getVisible() const { return _visible; }
void setVisible(bool value) { _visible = value; }
void setTransparent(bool value) { _transparent = value; }
Expand All @@ -113,6 +115,8 @@ class BaseSurface {
NDrawRect _drawRect;
NDrawRect _sysRect;
NRect _clipRect;
NRect *_clipRects;
uint _clipRectsCount;
bool _transparent;
};

Expand Down
5 changes: 3 additions & 2 deletions engines/neverhood/klayman.cpp
Expand Up @@ -4636,9 +4636,10 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
}

KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
// TODO: NRect *rect1, int16 unk in Klayman ctor
: Klayman(vm, parentScene, x, y, 1000, 1000) {

_surface->setClipRects(clipRects, clipRectsCount);

_dataResource.load(0x04104242);
_flagF6 = false;
}
Expand Down Expand Up @@ -4831,7 +4832,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
: Klayman(vm, parentScene, x, y, 1000, 1000) {

_walkResumeFrameIncr = 1;
_walkResumeFrameIncr = 1;
_vm->_soundMan->addSound(0x80101800, 0xD3B02847);
}

Expand Down
26 changes: 13 additions & 13 deletions engines/neverhood/module2200.cpp
Expand Up @@ -526,49 +526,49 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
}
}

_rect1.y1 = 0;
_rect1.x2 = 640;
_rect2.x2 = 640;
_rect2.y2 = 480;
_clipRects[0].y1 = 0;
_clipRects[0].x2 = 640;
_clipRects[1].x2 = 640;
_clipRects[1].y2 = 480;

if (!getGlobalVar(0x404290D5)) {
insertStaticSprite(0x00026027, 900);
}

tempSprite = insertStaticSprite(0x030326A0, 1100);
_rect1.x1 = tempSprite->getDrawRect().x;
_clipRects[0].x1 = tempSprite->getDrawRect().x;

insertStaticSprite(0x811DA061, 1100);

tempSprite = insertStaticSprite(0x11180022, 1100);
_rect2.x1 = tempSprite->getDrawRect().x;
_clipRects[1].x1 = tempSprite->getDrawRect().x;

tempSprite = insertStaticSprite(0x0D411130, 1100);
_rect1.y2 = tempSprite->getDrawRect().y2();
_rect2.y1 = tempSprite->getDrawRect().y2();
_clipRects[0].y2 = tempSprite->getDrawRect().y2();
_clipRects[1].y1 = tempSprite->getDrawRect().y2();

_doorLightSprite = insertStaticSprite(0xA4062212, 900);

if (which < 0) {
insertKlayman<KmScene2201>(300, 427, &_rect1, 2);
insertKlayman<KmScene2201>(300, 427, _clipRects, 2);
setMessageList(0x004B8118);
_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
} else if (which == 1) {
insertKlayman<KmScene2201>(412, 393, &_rect1, 2);
insertKlayman<KmScene2201>(412, 393, _clipRects, 2);
setMessageList(0x004B8130);
_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
} else if (which == 2) {
if (getGlobalVar(0xC0418A02)) {
insertKlayman<KmScene2201>(379, 427, &_rect1, 2);
insertKlayman<KmScene2201>(379, 427, _clipRects, 2);
_klayman->setDoDeltaX(1);
} else {
insertKlayman<KmScene2201>(261, 427, &_rect1, 2);
insertKlayman<KmScene2201>(261, 427, _clipRects, 2);
}
setMessageList(0x004B8178);
_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
} else {
NPoint pt = _dataResource.getPoint(0x0304D8DC);
insertKlayman<KmScene2201>(pt.x, pt.y, &_rect1, 2);
insertKlayman<KmScene2201>(pt.x, pt.y, _clipRects, 2);
setMessageList(0x004B8120);
_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, true);
}
Expand Down
3 changes: 1 addition & 2 deletions engines/neverhood/module2200.h
Expand Up @@ -96,8 +96,7 @@ class Scene2201 : public Scene {
Scene2201(NeverhoodEngine *vm, Module *parentModule, int which);
~Scene2201();
protected:
NRect _rect1;
NRect _rect2;
NRect _clipRects[2];
Sprite *_doorLightSprite;
Sprite *_asDoor;
Sprite *_ssDoorButton;
Expand Down
6 changes: 6 additions & 0 deletions engines/neverhood/screen.cpp
Expand Up @@ -299,4 +299,10 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra

}

void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent) {
NDrawRect clipDrawRect(0, 0, drawRect.width, drawRect.height);
for (uint i = 0; i < clipRectsCount; i++)
drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent);
}

} // End of namespace Neverhood
1 change: 1 addition & 0 deletions engines/neverhood/screen.h
Expand Up @@ -50,6 +50,7 @@ class Screen {
const Graphics::Surface *shadowSurface = NULL);
void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent);
void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent);
protected:
NeverhoodEngine *_vm;
Graphics::Surface *_backScreen;
Expand Down

0 comments on commit 15cfb9f

Please sign in to comment.