Revision: 29227
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29227
Author:   nicks
Date:     2010-06-05 01:29:49 +0200 (Sat, 05 Jun 2010)

Log Message:
-----------
added obstacle avoidance code; object movement is implemented via setting 
velocity

Modified Paths:
--------------
    branches/soc-2010-nicks/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj
    branches/soc-2010-nicks/source/blender/editors/space_logic/logic_window.c
    branches/soc-2010-nicks/source/blender/makesdna/DNA_actuator_types.h
    branches/soc-2010-nicks/source/blender/makesrna/intern/rna_actuator.c
    
branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/soc-2010-nicks/source/gameengine/Converter/KX_ConvertActuators.cpp
    branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Scene.cpp
    branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Scene.h
    branches/soc-2010-nicks/source/gameengine/Ketsji/KX_SteeringActuator.cpp
    branches/soc-2010-nicks/source/gameengine/Ketsji/KX_SteeringActuator.h

Added Paths:
-----------
    branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
    branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.h

Modified: 
branches/soc-2010-nicks/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj
===================================================================
--- branches/soc-2010-nicks/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj 
2010-06-04 22:23:34 UTC (rev 29226)
+++ branches/soc-2010-nicks/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj 
2010-06-04 23:29:49 UTC (rev 29227)
@@ -556,6 +556,10 @@
                                >
                        </File>
                        <File
+                               
RelativePath="..\..\..\source\gameengine\Ketsji\KX_ObstacleSimulation.cpp"
+                               >
+                       </File>
+                       <File
                                
RelativePath="..\..\..\source\gameengine\Ketsji\KX_PhysicsObjectWrapper.cpp"
                                >
                        </File>
@@ -865,6 +869,10 @@
                                >
                        </File>
                        <File
+                               
RelativePath="..\..\..\source\gameengine\Ketsji\KX_ObstacleSimulation.h"
+                               >
+                       </File>
+                       <File
                                
RelativePath="..\..\..\source\gameengine\Ketsji\KX_OdePhysicsController.h"
                                >
                        </File>

Modified: 
branches/soc-2010-nicks/source/blender/editors/space_logic/logic_window.c
===================================================================
--- branches/soc-2010-nicks/source/blender/editors/space_logic/logic_window.c   
2010-06-04 22:23:34 UTC (rev 29226)
+++ branches/soc-2010-nicks/source/blender/editors/space_logic/logic_window.c   
2010-06-04 23:29:49 UTC (rev 29227)
@@ -4272,7 +4272,7 @@
 
        row = uiLayoutRow(layout, 0);
        uiItemR(row, ptr, "distance", 0, NULL, 0);
-       uiItemR(row, ptr, "movement", 0, NULL, 0);
+       uiItemR(row, ptr, "velocity", 0, NULL, 0);
 }
 
 

Modified: branches/soc-2010-nicks/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- branches/soc-2010-nicks/source/blender/makesdna/DNA_actuator_types.h        
2010-06-04 22:23:34 UTC (rev 29226)
+++ branches/soc-2010-nicks/source/blender/makesdna/DNA_actuator_types.h        
2010-06-04 23:29:49 UTC (rev 29227)
@@ -218,7 +218,7 @@
        char pad[4];
        int type;               /* 0=seek, 1=flee, 2=path following */
        float dist;
-       float movement;
+       float velocity;
        struct Object *target;
        struct Object *navmesh;
 } bSteeringActuator;

Modified: branches/soc-2010-nicks/source/blender/makesrna/intern/rna_actuator.c
===================================================================
--- branches/soc-2010-nicks/source/blender/makesrna/intern/rna_actuator.c       
2010-06-04 22:23:34 UTC (rev 29226)
+++ branches/soc-2010-nicks/source/blender/makesrna/intern/rna_actuator.c       
2010-06-04 23:29:49 UTC (rev 29227)
@@ -1866,10 +1866,10 @@
        RNA_def_property_ui_text(prop, "Behavior", "");
        RNA_def_property_update(prop, NC_LOGIC, NULL);
 
-       prop= RNA_def_property(srna, "movement", PROP_FLOAT, PROP_NONE);
-       RNA_def_property_float_sdna(prop, NULL, "movement");
+       prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "velocity");
        RNA_def_property_range(prop, 0.0, 1000.0);
-       RNA_def_property_ui_text(prop, "Move", "Movement value");
+       RNA_def_property_ui_text(prop, "Velocity", "Velocity magnitude");
        RNA_def_property_update(prop, NC_LOGIC, NULL);
 
        prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);

Modified: 
branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- 
branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    2010-06-04 22:23:34 UTC (rev 29226)
+++ 
branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    2010-06-04 23:29:49 UTC (rev 29227)
@@ -173,6 +173,7 @@
 #include "BL_DeformableGameObject.h"
 
 #include "KX_NavMeshObject.h"
+#include "KX_ObstacleSimulation.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -2638,6 +2639,20 @@
        converter->RegisterWorldInfo(worldinfo);
        kxscene->SetWorldInfo(worldinfo);
 
+       //create object representations for obstacle simulation
+       KX_ObstacleSimulation* obssimulation = kxscene->GetObstacleSimulation();
+       if (obssimulation)
+       {
+               for ( i=0;i<objectlist->GetCount();i++)
+               {
+                       KX_GameObject* gameobj = 
static_cast<KX_GameObject*>(objectlist->GetValue(i));
+                       if (gameobj->IsDynamic())
+                       {
+                               obssimulation->AddObstacleForObj(gameobj);
+                       }
+               }
+       }
+
 #define CONVERT_LOGIC
 #ifdef CONVERT_LOGIC
        // convert logic bricks, sensors, controllers and actuators
@@ -2689,10 +2704,8 @@
                        pathfinder->BuildNavMesh();
                        pathfinder->SetVisible(0, true);
                }
-       }               
+       }
        
-
-       
        // Calculate the scene btree -
        // too slow - commented out.
        //kxscene->SetNodeTree(tf.MakeTree());

Modified: 
branches/soc-2010-nicks/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Converter/KX_ConvertActuators.cpp 
2010-06-04 22:23:34 UTC (rev 29226)
+++ branches/soc-2010-nicks/source/gameengine/Converter/KX_ConvertActuators.cpp 
2010-06-04 23:29:49 UTC (rev 29227)
@@ -1059,7 +1059,7 @@
 
                                KX_SteeringActuator *tmpstact
                                        = new KX_SteeringActuator(gameobj, 
mode, targetob, navmeshob,
-                                                                               
                stAct->movement, stAct->dist);
+                                                                               
                stAct->velocity, stAct->dist, scene->GetObstacleSimulation());
                                baseact = tmpstact;
                                break;
                        }

Added: 
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp  
                        (rev 0)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp  
2010-06-04 23:29:49 UTC (rev 29227)
@@ -0,0 +1,245 @@
+/**
+* Simulation for obstacle avoidance behavior
+*
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version. The Blender
+* Foundation also sells licenses for use in proprietary software under
+* the Blender License.  See http://www.blender.org/BL/ for information
+* about this.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
+
+#include "KX_ObstacleSimulation.h"
+#include "KX_GameObject.h"
+#include "DNA_object_types.h"
+#include "math.h"
+#define M_PI       3.14159265358979323846
+
+int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const 
MT_Vector2& v,
+                                         const MT_Vector3& pos1, const 
MT_Scalar r1,
+                                         float& tmin, float& tmax)
+{
+       static const float EPS = 0.0001f;
+       MT_Vector2 c0(pos0.x(), pos0.y());
+       MT_Vector2 c1(pos1.x(), pos1.y());
+       MT_Vector2 s = c1 - c0;
+       MT_Scalar  r = r0+r1;
+       float c = s.length2() - r*r;
+       float a = v.length2();
+       if (a < EPS) return 0;  // not moving
+
+       // Overlap, calc time to exit.
+       float b = MT_dot(v,s);
+       float d = b*b - a*c;
+       if (d < 0.0f) return 0; // no intersection.
+       tmin = (b - sqrtf(d)) / a;
+       tmax = (b + sqrtf(d)) / a;
+       return 1;
+}
+
+
+KX_ObstacleSimulation::KX_ObstacleSimulation()
+{
+
+}
+
+KX_ObstacleSimulation::~KX_ObstacleSimulation()
+{
+       for (size_t i=0; i<m_obstacles.size(); i++)
+       {
+               KX_Obstacle* obs = m_obstacles[i];
+               delete obs;
+       }
+       m_obstacles.clear();
+}
+void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj)
+{
+       KX_Obstacle* obstacle = new KX_Obstacle();
+       struct Object* blenderobject = gameobj->GetBlenderObject();
+       obstacle->m_rad = blenderobject->inertia; //.todo use radius of 
collision shape bound sphere 
+       obstacle->m_gameObj = gameobj;
+       m_obstacles.push_back(obstacle);
+}
+
+void KX_ObstacleSimulation::UpdateObstacles()
+{
+       for (size_t i=0; i<m_obstacles.size(); i++)
+       {
+               KX_Obstacle* obs = m_obstacles[i];
+               obs->m_pos = obs->m_gameObj->NodeGetWorldPosition();
+               obs->m_vel.x() = obs->m_gameObj->GetLinearVelocity().x();
+               obs->m_vel.y() = obs->m_gameObj->GetLinearVelocity().y();
+       }
+}
+
+KX_Obstacle* KX_ObstacleSimulation::GetObstacle(KX_GameObject* gameobj)
+{
+       for (size_t i=0; i<m_obstacles.size(); i++)
+       {
+               if (m_obstacles[i]->m_gameObj == gameobj)
+                       return m_obstacles[i];
+       }
+
+       return NULL;
+}
+
+void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, 
MT_Vector3& velocity)
+{
+}
+
+KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI():
+       m_avoidSteps(32),
+       m_minToi(0.5f),
+       m_maxToi(1.2f),
+       m_angleWeight(4.0f),
+       m_toiWeight(1.0f),
+       m_collisionWeight(100.0f)
+{
+       
+}
+
+KX_ObstacleSimulationTOI::~KX_ObstacleSimulationTOI()
+{
+       for (size_t i=0; i<m_toiCircles.size(); i++)
+       {
+               TOICircle* toi = m_toiCircles[i];
+               delete toi;
+       }
+       m_toiCircles.clear();
+}
+
+void KX_ObstacleSimulationTOI::AddObstacleForObj(KX_GameObject* gameobj)
+{
+       KX_ObstacleSimulation::AddObstacleForObj(gameobj);
+       m_toiCircles.push_back(new TOICircle());
+}
+
+void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, 
MT_Vector3& velocity)
+{
+       int nobs = m_obstacles.size();
+       int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), 
activeObst) - m_obstacles.begin();
+       if (obstidx == nobs)
+               return; 
+       TOICircle* tc = m_toiCircles[obstidx];
+
+       MT_Vector2 vel(velocity.x(), velocity.y());
+       float vmax = (float) velocity.length();
+       float odir = (float) atan2(velocity.y(), velocity.x());
+
+       MT_Vector2 ddir = vel;
+       ddir.normalize();
+
+       float bestScore = FLT_MAX;
+       float bestDir = odir;
+       float bestToi = 0;
+
+       tc->n = m_avoidSteps;
+       tc->minToi = m_minToi;
+       tc->maxToi = m_maxToi;
+
+       const int iforw = m_avoidSteps/2;
+       const float aoff = (float)iforw / (float)m_avoidSteps;
+
+       for (int iter = 0; iter < m_avoidSteps; ++iter)
+       {
+               // Calculate sample velocity
+               const float ndir = ((float)iter/(float)m_avoidSteps) - aoff;
+               const float dir = odir+ndir*M_PI*2;
+               MT_Vector2 svel;
+               svel.x() = cosf(dir) * vmax;
+               svel.y() = sinf(dir) * vmax;
+
+               // Find min time of impact and exit amongst all obstacles.
+               float tmin = m_maxToi;
+               float tmine = 0;
+               for (int i = 0; i < nobs; ++i)
+               {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to