diff src/CollisionDetector.cpp @ 10:5727d511a13a

add src in Martial Project Xcode.
author tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
date Wed, 03 Feb 2010 03:39:04 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/CollisionDetector.cpp	Wed Feb 03 03:39:04 2010 +0900
@@ -0,0 +1,71 @@
+/*
+ *  CollisionDetector.cpp
+ *  Martial
+ *
+ *  Created by ryoma on 10/01/26.
+ *  Copyright 2010 琉球大学. All rights reserved.
+ *
+ */
+
+#include "CollisionDetector.h"
+
+void CollisionDetector::addCollisionObject(CollisionObject* cobj) {
+	collisionObjectList.push_back(cobj);
+}
+
+void CollisionDetector::detectCollision(CollisionNode* cn1, CollisionNode* cn2) {
+	cn1->setCollision(true);
+	cn2->setCollision(true);
+}
+
+void CollisionDetector::checkCollision(CollisionObject* co1, CollisionObject* co2) {
+	std::list<CollisionNode*> collisionNodeList1, collisionNodeList2;
+	collisionNodeList1 = co1->getCollisionNodeList();
+	collisionNodeList2 = co2->getCollisionNodeList();
+	osg::NodePath npl1 , npl2;
+	osg::Matrix m1, m2;
+	std::list<CollisionNode*>::iterator node1, node2;
+	for(node1 = collisionNodeList1.begin(); node1 != collisionNodeList1.end(); ++node1) {
+		for(node2 = collisionNodeList2.begin(); node2 != collisionNodeList2.end(); ++node2) {
+			npl1 = (*node1)->getNodePath();
+			npl2 = (*node2)->getNodePath();
+			//衝突判定
+			m1 = osg::computeLocalToWorld(npl1);
+			m2 = osg::computeLocalToWorld(npl2);
+			if ((*node1)->getBound(m1).intersects((*node2)->getBound(m2))) {
+				if (Martial::TEST::SHOW_COLLISION) printf("collision!! %s->[%s] & %s->[%s]\n", co1->getName(), (*node1)->getName(),
+					co2->getName(), (*node2)->getName());
+				detectCollision(*node1, *node2);
+			}
+		}
+	}
+}
+
+void CollisionDetector::frame() {
+	std::list<CollisionObject*>::iterator iter1, iter2;
+	iter1 = collisionObjectList.begin();
+	iter2 = iter1;
+	float length;
+	osg::Vec3 v1, v2;
+
+	for(++iter1; iter1 != collisionObjectList.end(); ++iter1) {
+		length = ((*iter1)->getPos()-(*iter2)->getPos()).length();
+		if (length <= 3.0) {
+			if (Martial::TEST::SHOW_COLLISION) printf("%s close to %s (%.3f), check collision..\n", (*iter2)->getName(), (*iter1)->getName(), length);
+			checkCollision(*iter1, *iter2);
+		}
+		iter2 = iter1;
+	}
+}
+/*
+		startFrameTick = osg::Timer::instance()->tick();
+		
+		//SceneGraphの走査 -> 座標計算, 衝突判定
+		//衝突処理はcheckCollision内部で行なう?(未実装)
+		for(mobIter = movableObjectList.begin(); mobIter != movableObjectList.end(); ++mobIter) {
+			(*mobIter)->reload();
+			//このcheckCollisionは、後に削除
+			//CollisionDetectorクラスを定義し、そこでcheckCollsionすることに
+			(*mobIter)->checkCollision();
+		}
+*/
\ No newline at end of file