[Scummvm-cvs-logs] CVS: scummvm/scumm intern.h,2.361,2.362 scumm.cpp,1.334,1.335 sprite_he.cpp,1.38,1.39 sprite_he.h,1.10,1.11

Eugene Sandulenko sev at users.sourceforge.net
Wed Feb 23 20:06:07 CET 2005


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14163

Modified Files:
	intern.h scumm.cpp sprite_he.cpp sprite_he.h 
Log Message:
Initial implementation of spritesProcessWiz. Also plugged it into main loop.


Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.361
retrieving revision 2.362
diff -u -d -r2.361 -r2.362
--- intern.h	23 Feb 2005 23:28:53 -0000	2.361
+++ intern.h	24 Feb 2005 04:04:17 -0000	2.362
@@ -967,12 +967,16 @@
 	void spritesResetTables(bool refreshScreen);
 	void spriteGroupCheck(int spriteGroupId);
 	void spriteMarkIfInGroup(int spriteGroupId, uint32 flags);
+	void spriteInfoSet_addImageToList(int spriteId, int imageNum, int *spriteIdptr);
+	void spritesUpdateImages();
+
+public:
 	void spritesBlitToScreen();
 	void spritesMarkDirty(bool unkFlag);
-	void spritesUpdateImages();
-	void spriteInfoSet_addImageToList(int spriteId, int imageNum, int *spriteIdptr);
 	void spritesSortActiveSprites();
+	void spritesProcessWiz(bool arg);
 
+protected:
 	/* HE version 90 script opcodes */
 	void o90_dup();
 	void o90_min();

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.334
retrieving revision 1.335
diff -u -d -r1.334 -r1.335
--- scumm.cpp	22 Feb 2005 07:31:54 -0000	1.334
+++ scumm.cpp	24 Feb 2005 04:04:17 -0000	1.335
@@ -1840,6 +1840,11 @@
 		// Full Throttle always redraws verbs and draws verbs before actors
 		if (_version >= 7)
 			redrawVerbs();
+
+		if (_heversion >= 90) {
+			((ScummEngine_v90he *)this)->spritesBlitToScreen();
+			((ScummEngine_v90he *)this)->spritesSortActiveSprites();
+		}
 	
 		setActorRedrawFlags();
 		resetActorBgs();
@@ -1854,11 +1859,22 @@
 			preProcessAuxQueue();
 			processActors();
 			postProcessAuxQueue();
+
+			if (_heversion >= 90) {
+				((ScummEngine_v90he *)this)->spritesMarkDirty(0);
+				((ScummEngine_v90he *)this)->spritesProcessWiz(true);
+			}
 		} else {
 			processActors();
 		}
 		
 		_fullRedraw = false;
+
+		if (_heversion >= 90) {
+			((ScummEngine_v90he *)this)->spritesMarkDirty(1);
+			((ScummEngine_v90he *)this)->spritesProcessWiz(false);
+		}
+
 		if (_version >= 4 && _heversion <= 60)
 			cyclePalette();
 		palManipulate();

Index: sprite_he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sprite_he.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- sprite_he.cpp	24 Feb 2005 00:48:24 -0000	1.38
+++ sprite_he.cpp	24 Feb 2005 04:04:17 -0000	1.39
@@ -983,28 +983,28 @@
 		SpriteInfo *spi = _activeSpritesTable[i];
 		if (!(spi->flags & kSF31) && (spi->flags & kSF01)) {
 			spi->flags &= ~kSF01;
-			if (spi->bbox_xmin <= spi->bbox_xmax && spi->bbox_ymin <= spi->bbox_ymax) {
+			if (spi->bbox.left <= spi->bbox.right && spi->bbox.top <= spi->bbox.bottom) {
 				if (spi->flags & kSFBlitDirectly) {
-					gdi.copyVirtScreenBuffers(Common::Rect(spi->bbox_xmin, spi->bbox_ymin, spi->bbox_ymin, spi->bbox_ymax)); // XXX 0, 0x40000000);
+					gdi.copyVirtScreenBuffers(spi->bbox); // XXX 0, 0x40000000);
 				}
 			} else if (firstLoop) {
-				xmin = spi->bbox_xmin;
-				ymin = spi->bbox_ymin;
-				xmax = spi->bbox_xmax;
-				ymax = spi->bbox_ymax;
+				xmin = spi->bbox.left;
+				ymin = spi->bbox.top;
+				xmax = spi->bbox.right;
+				ymax = spi->bbox.bottom;
 				firstLoop = false;
 			} else {
-				if (xmin < spi->bbox_xmin) {
-					xmin = spi->bbox_xmin;
+				if (xmin < spi->bbox.left) {
+					xmin = spi->bbox.left;
 				}
-				if (ymin < spi->bbox_ymin) {
-					ymin = spi->bbox_ymin;
+				if (ymin < spi->bbox.top) {
+					ymin = spi->bbox.top;
 				}
-				if (xmax > spi->bbox_xmax) {
-					xmax = spi->bbox_xmax;
+				if (xmax > spi->bbox.right) {
+					xmax = spi->bbox.right;
 				}
-				if (ymax > spi->bbox_ymax) {
-					ymax = spi->bbox_ymax;
+				if (ymax > spi->bbox.bottom) {
+					ymax = spi->bbox.bottom;
 				}
 				refreshScreen = true;
 			}
@@ -1025,10 +1025,10 @@
 		if (!(spi->flags & (kSFNeedRedraw | kSF30))) {
 			if ((!unkFlag || spi->field_18 >= 0) && (spi->flags & kSF23)) {
 				bool needRedraw = false;
-				int lp = MIN(79, spi->bbox_xmin / 8);
-				int rp = MIN(79, (spi->bbox_xmax + 7) / 8);
+				int lp = MIN(79, spi->bbox.left / 8);
+				int rp = MIN(79, (spi->bbox.right + 7) / 8);
 				for (; lp <= rp; ++lp) {
-					if (vs0->tdirty[lp] < vs0->h && spi->bbox_ymax >= vs0->bdirty[lp] && spi->bbox_ymin <= vs0->tdirty[lp]) {
+					if (vs0->tdirty[lp] < vs0->h && spi->bbox.bottom >= vs0->bdirty[lp] && spi->bbox.top <= vs0->tdirty[lp]) {
 						needRedraw = true;
 						break;
 					}
@@ -1140,4 +1140,142 @@
 	qsort(_activeSpritesTable, _numSpritesToProcess, sizeof(SpriteInfo *), compareSprTable);
 }
 
+void ScummEngine_v90he::spritesProcessWiz(bool arg) {
+	int spr_flags, spr_flags_;
+	int16 spr_wiz_x, spr_wiz_y;
+	int res_id, res_state;
+	Common::Rect *bboxPtr;
+	int rot_angle, zoom;
+	int w, h;
+	int ebx;
+	WizParameters wiz;
+
+	if (!_numSpritesToProcess)
+		return;
+
+	for (int i = 0; i < _numSpritesToProcess; i++) {
+		SpriteInfo *spi = _activeSpritesTable[i];
+
+		if (!(spi->flags & kSFNeedRedraw))
+			continue;
+
+		spr_flags = spi->flags;
+
+		if (arg) {
+			if (spi->field_0)
+				return;
+		} else {
+			if (spi->field_0 < 0)
+				continue;
+		}
+		
+		spi->flags &= ~(kSF01 | kSFNeedRedraw);
+		res_id = spi->res_id;
+		res_state = spi->res_state;
+		loadImgSpot(spi->res_id, spi->res_state, spr_wiz_x, spr_wiz_y);
+
+		if (spi->group_num) {
+			SpriteGroup *spg = &_spriteGroups[spi->group_num];
+
+			if (spg->scaling) {
+				wiz.img.x1 = spi->tx * spg->scale_x - spr_wiz_x + spg->tx;
+				wiz.img.y1 = spi->ty * spg->scale_y - spr_wiz_y + spg->ty;
+			} else {
+				wiz.img.x1 = spi->tx - spr_wiz_x + spg->tx;
+				wiz.img.y1 = spi->ty - spr_wiz_y + spg->ty;
+			}
+		} else {
+			wiz.img.x1 = spi->tx - spr_wiz_x;
+			wiz.img.y1 = spi->ty - spr_wiz_y;
+		}
+		
+		spi->field_48 = wiz.img.state = res_state;
+		spi->field_4C = wiz.img.resNum = res_id;
+		wiz.processFlags = 0x401;
+		spi->field_68 = spi->rot_angle;
+		spi->field_6C = spi->zoom;
+		spi->field_34 = wiz.img.x1;
+		spi->field_38 = wiz.img.y1;
+		bboxPtr = &spi->bbox;
+		if (res_id) {
+			rot_angle = spi->rot_angle;
+			zoom = spi->zoom;
+			spr_flags_ = spi->flags & kSFRotated;
+			getWizImageDim(res_id, res_state, w, h);
+			if (!(spi->flags & (kSFZoomed | kSFRotated)) || 1) { // FIXME. remove '|| 1'
+				bboxPtr->bottom = wiz.img.y1 + h;
+				bboxPtr->left = wiz.img.x1;
+				bboxPtr->top = wiz.img.y1;
+				bboxPtr->right = w + wiz.img.x1;
+
+				ebx = -1234;
+			} else {
+				// TODO
+				// what is this?
+				//
+				// mov eax, something
+				// cdq
+				// sub eax, edx
+				// sar eax, 1
+				// mov ecx, eax
+				// neg ecx
+
+				ebx = -1234;
+			}
+		} else {
+			bboxPtr->left = 1234;
+			bboxPtr->top = 1234;
+			bboxPtr->right = -1234;
+			bboxPtr->bottom = -1234;
+			
+			ebx = -1234;
+		}
+
+		wiz.img.flags = 0x10;
+		if (spr_flags & kSF23)
+			wiz.img.flags = 0x410;
+		if (spr_flags & kSF22)
+			wiz.img.flags |= 0x800;
+		if (spr_flags & kSF21) {
+			wiz.img.flags &= ~(0x11);
+			wiz.img.flags |= 8;
+		}
+		if (spi->field_54) {
+			wiz.img.flags |= 0x200;
+			wiz.processFlags |= 4;
+			wiz.unk_15C = spi->field_54;
+		}
+		if (spr_flags & kSF20)
+			wiz.img.flags |= 2;
+		if (spi->field_7C) {
+			wiz.processFlags |= 0x80000;
+			//wiz.field_178 = spi->field_7C; // FIXME
+		}
+		wiz.processFlags |= 0x20;
+		
+		if (spr_flags & kSFRotated) {
+			wiz.processFlags |= 0x10;
+			wiz.angle = spi->rot_angle;
+		}
+		if (spr_flags & kSFZoomed) {
+			wiz.processFlags |= 0x08;
+			wiz.zoom = spi->zoom;
+		}
+		spi->imgFlags = wiz.img.flags;
+		
+		if (spi->group_num && _spriteGroups[spi->group_num].flags & kSGF01) {
+			// TODO: rectClipIfIntersects() is missing
+		}
+		if (spi->field_14) {
+			wiz.processFlags |= 0x8000;
+			//wiz.field_174 = spi->field_14; // FIXME
+		}
+		if (spi->res_id && spi->group_num && _spriteGroups[spi->group_num].field_20) {
+			wiz.processFlags |= 0x1000;
+			//wiz.field_380 = _spriteGroups[spi->group_num].field_20; // FIXME
+		}
+		displayWizComplexImage(&wiz);
+	}
+}
+
 } // End of namespace Scumm

Index: sprite_he.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sprite_he.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- sprite_he.h	23 Feb 2005 11:15:41 -0000	1.10
+++ sprite_he.h	24 Feb 2005 04:04:17 -0000	1.11
@@ -73,10 +73,7 @@
 	int group_num;
 	int field_14;
 	int field_18;
-	int bbox_xmin;
-	int bbox_ymin;
-	int bbox_xmax;
-	int bbox_ymax;
+	Common::Rect bbox;
 	int dx;
 	int dy;
 	int field_34;
@@ -94,7 +91,7 @@
 	int field_64;
 	int field_68;
 	int field_6C;
-	int field_70;
+	int imgFlags;
 	int field_74;
 	int field_78;
 	int field_7C;





More information about the Scummvm-git-logs mailing list