[Scummvm-cvs-logs] SF.net SVN: scummvm:[34652] residual/trunk/engine

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Fri Sep 26 19:48:47 CEST 2008


Revision: 34652
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34652&view=rev
Author:   aquadran
Date:     2008-09-26 17:48:46 +0000 (Fri, 26 Sep 2008)

Log Message:
-----------
calculate bounding box for each actor

Modified Paths:
--------------
    residual/trunk/engine/actor.cpp
    residual/trunk/engine/actor.h
    residual/trunk/engine/backend/platform/sdl/driver_gl.cpp
    residual/trunk/engine/backend/platform/sdl/driver_tinygl.cpp
    residual/trunk/engine/model.cpp

Modified: residual/trunk/engine/actor.cpp
===================================================================
--- residual/trunk/engine/actor.cpp	2008-09-26 11:59:46 UTC (rev 34651)
+++ residual/trunk/engine/actor.cpp	2008-09-26 17:48:46 UTC (rev 34652)
@@ -41,6 +41,8 @@
 #include <cmath>
 #include <cstring>
 
+int g_winX1, g_winY1, g_winX2, g_winY2;
+
 Actor::Actor(const char *name) :
 		_name(name), _setName(""), _talkColor(255, 255, 255), _pos(0, 0, 0),
 		// Some actors don't set walk and turn rates, so we default the
@@ -60,6 +62,8 @@
 	_talkSoundName = "";
 	_activeShadowSlot = -1;
 	_shadowArray = new Shadow[5];
+	_winX1 = _winY1 = 1000;
+	_winX2 = _winY2 = -1000;
 
 	for (int i = 0; i < 5; i++) {
 		_shadowArray[i].active = false;
@@ -601,6 +605,9 @@
 }
 
 void Actor::draw() {
+	g_winX1 = g_winY1 = 1000;
+	g_winX2 = g_winY2 = -1000;
+
 	for (std::list<Costume *>::iterator i = _costumeStack.begin(); i != _costumeStack.end(); i++)
 		(*i)->setupTextures();
 
@@ -651,8 +658,11 @@
 				g_driver->setShadow(NULL);
 			}
 		}
-
 	}
+	_winX1 = g_winX1;
+	_winX2 = g_winX2;
+	_winY1 = g_winY1;
+	_winY2 = g_winY2;
 }
 
 // "Undraw objects" (handle objects for actors that may not be on screen)

Modified: residual/trunk/engine/actor.h
===================================================================
--- residual/trunk/engine/actor.h	2008-09-26 11:59:46 UTC (rev 34651)
+++ residual/trunk/engine/actor.h	2008-09-26 17:48:46 UTC (rev 34652)
@@ -41,6 +41,8 @@
 
 typedef std::list<Sector *> SectorListType;
 
+extern int g_winX1, g_winY1, g_winX2, g_winY2;
+
 struct Shadow {
 	std::string name;
 	Vector3d pos;
@@ -228,6 +230,8 @@
 	Vector3d _lookAtVector;
 	float _lookAtRate;
 
+	int _winX1, _winY1, _winX2, _winY2;
+
 	friend class Engine;
 };
 

Modified: residual/trunk/engine/backend/platform/sdl/driver_gl.cpp
===================================================================
--- residual/trunk/engine/backend/platform/sdl/driver_gl.cpp	2008-09-26 11:59:46 UTC (rev 34651)
+++ residual/trunk/engine/backend/platform/sdl/driver_gl.cpp	2008-09-26 17:48:46 UTC (rev 34652)
@@ -183,8 +183,13 @@
 }
 
 void DriverGL::getBoundingBoxPos(const Model::Mesh *model, int *x1, int *y1, int *x2, int *y2) {
-	if (_currentShadowArray)
+	if (_currentShadowArray) {
+		*x1 = -1;
+		*y1 = -1;
+		*x2 = -1;
+		*y2 = -1;
 		return;
+	}
 
 	GLfloat top = 1000;
 	GLfloat right = -1000;

Modified: residual/trunk/engine/backend/platform/sdl/driver_tinygl.cpp
===================================================================
--- residual/trunk/engine/backend/platform/sdl/driver_tinygl.cpp	2008-09-26 11:59:46 UTC (rev 34651)
+++ residual/trunk/engine/backend/platform/sdl/driver_tinygl.cpp	2008-09-26 17:48:46 UTC (rev 34652)
@@ -276,8 +276,13 @@
 }
 
 void DriverTinyGL::getBoundingBoxPos(const Model::Mesh *model, int *x1, int *y1, int *x2, int *y2) {
-	if (_currentShadowArray)
+	if (_currentShadowArray) {
+		*x1 = -1;
+		*y1 = -1;
+		*x2 = -1;
+		*y2 = -1;
 		return;
+	}
 
 	TGLfloat top = 1000;
 	TGLfloat right = -1000;
@@ -383,7 +388,22 @@
 
 	if (_currentShadowArray) {
 		tglSetShadowMaskBuf(NULL);
-	}
+	}/* else {
+		uint16 *dst = (uint16 *)_zb->pbuf;
+		uint16 c = 0xffff;
+		for (int x = g_winX1; x <= g_winX2; x++) {
+			WRITE_LE_UINT16(dst + 640 * g_winY1 + x, c);
+		}
+		for (int x = g_winX1; x <= g_winX2; x++) {
+			WRITE_LE_UINT16(dst + 640 * g_winY2 + x, c);
+		}
+		for (int y = g_winY1; y <= g_winY2; y++) {
+			WRITE_LE_UINT16(dst + 640 * y + g_winX1, c);
+		}
+		for (int y = g_winY1; y <= g_winY2; y++) {
+			WRITE_LE_UINT16(dst + 640 * y + g_winX2, c);
+		}
+	}*/
 }
 
 void DriverTinyGL::drawShadowPlanes() {

Modified: residual/trunk/engine/model.cpp
===================================================================
--- residual/trunk/engine/model.cpp	2008-09-26 11:59:46 UTC (rev 34651)
+++ residual/trunk/engine/model.cpp	2008-09-26 17:48:46 UTC (rev 34652)
@@ -505,6 +505,12 @@
 void Model::Mesh::draw() const {
 	int winX1, winY1, winX2, winY2;
 	g_driver->getBoundingBoxPos(this, &winX1, &winY1, &winX2, &winY2);
+	if (winX1 != -1 && winY1 != -1 && winX2 != -1 && winY2 != -1) {
+		g_winX1 = MIN(g_winX1, winX1);
+		g_winY1 = MIN(g_winY1, winY1);
+		g_winX2 = MAX(g_winX2, winX2);
+		g_winY2 = MAX(g_winY2, winY2);
+	}
 
 	for (int i = 0; i < _numFaces; i++)
 		_faces[i].draw(_vertices, _vertNormals, _textureVerts);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list