aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/item.cpp
diff options
context:
space:
mode:
authorThomas Fach-Pedersen2017-03-28 17:50:04 +0200
committerThomas Fach-Pedersen2017-03-28 17:50:11 +0200
commit5f552c9446ddf3f02ec99ff6902822d66d2cc955 (patch)
treeb28610bf509c67109a042136873fd26b93d9fcf2 /engines/bladerunner/item.cpp
parent532828c143e0872525dadfe8b0ebe804f7071633 (diff)
downloadscummvm-rg350-5f552c9446ddf3f02ec99ff6902822d66d2cc955.tar.gz
scummvm-rg350-5f552c9446ddf3f02ec99ff6902822d66d2cc955.tar.bz2
scummvm-rg350-5f552c9446ddf3f02ec99ff6902822d66d2cc955.zip
BLADERUNNER: Implement ZBuffer class
Diffstat (limited to 'engines/bladerunner/item.cpp')
-rw-r--r--engines/bladerunner/item.cpp67
1 files changed, 41 insertions, 26 deletions
diff --git a/engines/bladerunner/item.cpp b/engines/bladerunner/item.cpp
index b8d4cd2c1f..3ad2868c51 100644
--- a/engines/bladerunner/item.cpp
+++ b/engines/bladerunner/item.cpp
@@ -25,6 +25,7 @@
#include "bladerunner/bladerunner.h"
#include "bladerunner/slice_renderer.h"
+#include "bladerunner/zbuffer.h"
namespace BladeRunner {
@@ -75,40 +76,54 @@ bool Item::isTargetable() {
return _isTargetable;
}
-void Item::tick(bool special) {
- if (_isVisible) {
- Vector3 postition(_position.x, -_position.z, _position.y);
- int animationId = _animationId + (special ? 1 : 0);
- _vm->_sliceRenderer->drawInWorld(animationId, 0, postition, M_PI - _angle, 1.0f, _vm->_surface2, _vm->_zBuffer2);
- _vm->_sliceRenderer->getScreenRectangle(&_screenRectangle, animationId, 0, postition, M_PI - _angle, 1.0f);
+bool Item::tick(Common::Rect *screenRect, bool special) {
+ if (!_isVisible) {
+ *screenRect = Common::Rect();
+ return false;
+ }
- if (_isSpinning) {
- _facing += _facingChange;
+ bool isVisible = false;
- if (_facing >= 1024) {
- _facing -= 1024;
- } else if (_facing < 0) {
- _facing += 1024;
- }
- _angle = _facing * (M_PI / 512.0f);
+ Vector3 position(_position.x, -_position.z, _position.y);
+ int animationId = _animationId + (special ? 1 : 0);
+ _vm->_sliceRenderer->drawInWorld(animationId, 0, position, M_PI - _angle, 1.0f, _vm->_surface2, _vm->_zbuffer->getData());
+ _vm->_sliceRenderer->getScreenRectangle(&_screenRectangle, animationId, 0, position, M_PI - _angle, 1.0f);
+
+ if (!_screenRectangle.isEmpty()) {
+ *screenRect = _screenRectangle;
+ isVisible = true;
+ } else {
+ *screenRect = Common::Rect();
+ }
+
+ if (_isSpinning) {
+ _facing += _facingChange;
+ if (_facing >= 1024) {
+ _facing -= 1024;
+ } else if (_facing < 0) {
+ _facing += 1024;
+ }
+ _angle = _facing * (M_PI / 512.0f);
+
+ if (_facingChange > 0) {
+ _facingChange = _facingChange - 20;
+ if (_facingChange < 0) {
+ _facingChange = 0;
+ _isSpinning = false;
+ }
+ } else if (_facingChange < 0) {
+ _facingChange = _facingChange + 20;
if (_facingChange > 0) {
- _facingChange = _facingChange - 20;
- if (_facingChange < 0) {
- _facingChange = 0;
- _isSpinning = false;
- }
- } else if (_facingChange < 0) {
- _facingChange = _facingChange + 20;
- if (_facingChange > 0) {
- _facingChange = 0;
- _isSpinning = false;
- }
- } else {
+ _facingChange = 0;
_isSpinning = false;
}
+ } else {
+ _isSpinning = false;
}
}
+
+ return isVisible;
}
void Item::setXYZ(Vector3 position) {