Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/RacingBots_FS18/src/modules/gametypes/SpaceRaceController.cc @ 11912

Last change on this file since 11912 was 11912, checked in by andera, 6 years ago

botpointer works

  • Property svn:eol-style set to native
File size: 24.9 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *  Created on: Oct 8, 2012findCheck
23 *      Author: purgham
24 */
25
26#include <gametypes/SpaceRaceController.h>
27#include "core/CoreIncludes.h"
28#include "core/XMLPort.h"
29#include "gametypes/SpaceRaceManager.h"
30#include "collisionshapes/CollisionShape.h"
31#include "BulletCollision/CollisionShapes/btCollisionShape.h"
32
33
34namespace orxonox
35{
36    RegisterClass(SpaceRaceController);
37
38    const int ADJUSTDISTANCE = 500;
39    const int MINDISTANCE = 5;
40    /*
41     * Idea: Find static Point (checkpoints the spaceship has to reach)
42     */
43    SpaceRaceController::SpaceRaceController(Context* context) :
44        ArtificialController(context)
45    {
46        RegisterObject(SpaceRaceController);
47        std::vector<RaceCheckPoint*> checkpoints;
48
49        virtualCheckPointIndex = -2;
50        if (ObjectList<SpaceRaceManager>().size() != 1)
51            orxout(internal_warning) << "Expected 1 instance of SpaceRaceManager but found " << ObjectList<SpaceRaceManager>().size() << endl;
52        for (SpaceRaceManager* manager : ObjectList<SpaceRaceManager>())
53        {
54            checkpoints = manager->getAllCheckpoints();
55            nextRaceCheckpoint_ = manager->findCheckpoint(0);
56        }
57
58        OrxAssert(!checkpoints.empty(), "No Checkpoints in Level");
59        checkpoints_ = checkpoints;
60        staticRacePoints_ = findStaticCheckpoints(nextRaceCheckpoint_, checkpoints);
61        // initialisation of currentRaceCheckpoint_
62        currentRaceCheckpoint_ = nullptr;
63
64        int i;
65        for (i = -2; findCheckpoint(i) != nullptr; i--)     // WIESO?
66        {
67            continue;
68        }
69
70    }
71
72    //------------------------------
73    // functions for initialisation
74
75    void SpaceRaceController::XMLPort(Element& xmlelement, XMLPort::Mode mode)
76    {
77        SUPER(SpaceRaceController, XMLPort, xmlelement, mode);
78        XMLPortParam(ArtificialController, "accuracy", setAccuracy, getAccuracy, xmlelement, mode).defaultValues(100.0f);
79        XMLPortObject(ArtificialController, WorldEntity, "waypoints", addWaypoint, getWaypoint, xmlelement, mode);
80    }
81
82    /*
83     * called from constructor 'SpaceRaceController'
84     * returns a vector of static Point (checkpoints the spaceship has to reach)
85     */
86    std::vector<RaceCheckPoint*> SpaceRaceController::findStaticCheckpoints(RaceCheckPoint* currentCheckpoint, const std::vector<RaceCheckPoint*>& allCheckpoints)
87    {
88        std::map<RaceCheckPoint*, int> zaehler; // counts how many times the checkpoint was reached (for simulation)
89        for (RaceCheckPoint* checkpoint : allCheckpoints)
90        {
91            zaehler.insert(std::pair<RaceCheckPoint*, int>(checkpoint,0));
92        }
93        int maxWays = rekSimulationCheckpointsReached(currentCheckpoint, zaehler);
94
95        std::vector<RaceCheckPoint*> returnVec;
96        for (const auto& mapEntry : zaehler)
97        {
98            if (mapEntry.second == maxWays)
99            {
100                returnVec.push_back(mapEntry.first);
101            }
102        }
103        return returnVec;
104    }
105
106    /*
107     * called from 'findStaticCheckpoints'
108     * return how many ways go from the given Checkpoint to the last Checkpoint (of the Game)
109     */
110    int SpaceRaceController::rekSimulationCheckpointsReached(RaceCheckPoint* currentCheckpoint, std::map<RaceCheckPoint*, int>& zaehler)
111    {
112
113        if (currentCheckpoint->isLast())
114        {// last point reached
115
116            zaehler[currentCheckpoint] += 1;
117            return 1; // 1 Way form the last point to this one
118        }
119        else
120        {
121            int numberOfWays = 0; // counts number of ways from this Point to the last point
122            for (int checkpointIndex : currentCheckpoint->getNextCheckpoints())
123            {
124                if (currentCheckpoint == findCheckpoint(checkpointIndex))
125                {
126                    orxout() << currentCheckpoint->getCheckpointIndex()<<endl;
127                    continue;
128                }
129                if (findCheckpoint(checkpointIndex) == nullptr){
130                    orxout(internal_warning) << "Problematic Point: " << checkpointIndex << endl;
131                }
132                else
133                    numberOfWays += rekSimulationCheckpointsReached(findCheckpoint(checkpointIndex), zaehler);
134
135            }
136            zaehler[currentCheckpoint] += numberOfWays;
137            return numberOfWays; // returns the number of ways from this point to the last one
138        }
139    }
140
141    //-------------------------------------
142    // functions for dynamic Way-search
143
144    float SpaceRaceController::distanceSpaceshipToCheckPoint(RaceCheckPoint* CheckPoint)
145    {
146        if (this->getControllableEntity() != nullptr)
147        {
148            return (CheckPoint->getPosition()- this->getControllableEntity()->getPosition()).length();
149        }
150        return -1;
151    }
152
153    /*
154     * called by: 'tick' or  'adjustNextPoint'
155     * returns the next Checkpoint which the shortest way contains
156     */
157    RaceCheckPoint* SpaceRaceController::nextPointFind(RaceCheckPoint* raceCheckpoint)
158    {
159        float minDistance = 0;
160        RaceCheckPoint* minNextRaceCheckPoint = nullptr;
161
162        // find the next checkpoint with the minimal distance
163        for (int checkpointIndex : raceCheckpoint->getNextCheckpoints())
164        {
165            RaceCheckPoint* nextRaceCheckPoint = findCheckpoint(checkpointIndex);
166            float distance = recCalculateDistance(nextRaceCheckPoint, this->getControllableEntity()->getPosition());
167
168            if (distance < minDistance || minNextRaceCheckPoint == nullptr)
169            {
170                minDistance = distance;
171                minNextRaceCheckPoint = nextRaceCheckPoint;
172            }
173
174        }
175        if(minNextRaceCheckPoint==nullptr){orxout()<<"minNextRaceCheckPoint=nullpointer line 175 SpaceRaceController index: "<<endl;}
176        return minNextRaceCheckPoint;
177    }
178
179    /*
180     * called from 'nextPointFind'
181     * returns the distance between "currentPosition" and the next static checkpoint that can be reached from "currentCheckPoint"
182     */
183    float SpaceRaceController::recCalculateDistance(RaceCheckPoint* currentCheckPoint, const Vector3& currentPosition)
184    {
185        // find: looks if the currentCheckPoint is a staticCheckPoint (staticCheckPoint is the same as: static Point)
186        if (std::find(staticRacePoints_.begin(), staticRacePoints_.end(), currentCheckPoint) != staticRacePoints_.end())
187        {
188            return (currentCheckPoint->getPosition() - currentPosition).length();
189        }
190        else
191        {
192            float minimum = std::numeric_limits<float>::max();
193            for (int checkpointIndex : currentCheckPoint->getNextCheckpoints())
194            {
195                int dist_currentCheckPoint_currentPosition = static_cast<int> ((currentPosition- currentCheckPoint->getPosition()).length());
196
197                minimum = std::min(minimum, dist_currentCheckPoint_currentPosition + recCalculateDistance(findCheckpoint(checkpointIndex), currentCheckPoint->getPosition()));
198                // minimum of distanz from 'currentPosition' to the next static Checkpoint
199            }
200            return minimum;
201        }
202    }
203
204    /*called by 'tick'
205     *adjust chosen way of the Spaceship every "AdjustDistance" because spaceship could be displaced through an other one
206     */
207    RaceCheckPoint* SpaceRaceController::adjustNextPoint()
208    {
209        if (currentRaceCheckpoint_ == nullptr) // no Adjust possible
210
211        {
212            return nextRaceCheckpoint_;
213        }
214        if ((currentRaceCheckpoint_->getNextCheckpoints()).size() == 1) // no Adjust possible
215
216        {
217            return nextRaceCheckpoint_;
218        }
219
220        //Adjust possible
221
222        return nextPointFind(currentRaceCheckpoint_);
223    }
224
225    RaceCheckPoint* SpaceRaceController::findCheckpoint(int index) const
226    {
227        for (RaceCheckPoint* checkpoint : this->checkpoints_){
228            if (checkpoint->getCheckpointIndex() == index)
229                return checkpoint;
230
231        }
232
233        orxout()<<"returned nullptr @line 231 SpaceRaceController"<<endl;
234        return nullptr;
235    }
236
237    /*RaceCheckPoint* SpaceRaceController::addVirtualCheckPoint( RaceCheckPoint* previousCheckpoint, int indexFollowingCheckPoint , const Vector3& virtualCheckPointPosition )
238    {
239        orxout()<<"add VCP at"<<virtualCheckPointPosition.x<<", "<<virtualCheckPointPosition.y<<", "<<virtualCheckPointPosition.z<<endl;
240        RaceCheckPoint* newTempRaceCheckPoint;
241        ObjectList<SpaceRaceManager> list;
242        for (ObjectList<SpaceRaceManager>::iterator it = list.begin(); it!= list.end(); ++it)
243        {
244            newTempRaceCheckPoint = new RaceCheckPoint((*it));
245        }
246        newTempRaceCheckPoint->setVisible(false);
247        newTempRaceCheckPoint->setPosition(virtualCheckPointPosition);
248        newTempRaceCheckPoint->setCheckpointIndex(virtualCheckPointIndex);
249        newTempRaceCheckPoint->setLast(false);
250        newTempRaceCheckPoint->setNextVirtualCheckpointsAsVector3(Vector3(indexFollowingCheckPoint,-1,-1));
251
252        Vector3 temp = previousCheckpoint->getVirtualNextCheckpointsAsVector3();
253        //orxout()<<"temp bei 0: ="<< temp.x<< temp.y<< temp.z<<endl;
254        checkpoints_.insert(checkpoints_.end(), newTempRaceCheckPoint);
255        int positionInNextCheckPoint;
256        for (int i = 0; i <3; i++)
257        {
258            if(previousCheckpoint->getVirtualNextCheckpointsAsVector3()[i] == indexFollowingCheckPoint)
259            positionInNextCheckPoint=i;
260        }
261        switch(positionInNextCheckPoint)
262        {
263            case 0: temp.x=virtualCheckPointIndex; break;
264            case 1: temp.y=virtualCheckPointIndex; break;
265            case 2: temp.z=virtualCheckPointIndex; break;
266        }
267        previousCheckpoint->setNextVirtualCheckpointsAsVector3(temp); //Existiert internes Problem bei negativen index fueer next Checkpoint
268        virtualCheckPointIndex--;
269        //orxout()<<"temp bei 1: ="<< temp.x<< temp.y<< temp.z<<endl;
270        //orxout()<<"temp nach ausgabe: "<<previousCheckpoint->getVirtualNextCheckpointsAsVector3().x<<previousCheckpoint->getVirtualNextCheckpointsAsVector3().y<<previousCheckpoint->getVirtualNextCheckpointsAsVector3().z<<endl;
271        //OrxAssert(virtualCheckPointIndex < -1, "TO much virtual cp");
272        orxout()<<"id: "<< previousCheckpoint->getCheckpointIndex() <<", following:"<<indexFollowingCheckPoint<<" :       "<<temp.x<<", "<<temp.y<<", "<<temp.z<<";       ";
273         temp=previousCheckpoint->getNextCheckpointsAsVector3();
274         orxout()<<"id: "<< previousCheckpoint->getCheckpointIndex() <<":       "<<temp.x<<", "<<temp.y<<", "<<temp.z<<";       ";
275         orxout()<<endl;
276        return newTempRaceCheckPoint;
277    }*/
278
279    SpaceRaceController::~SpaceRaceController()
280    {
281        if (this->isInitialized())
282        {
283            for (int i =-1; i>virtualCheckPointIndex; i--)
284                delete findCheckpoint(i);
285        }
286    }
287
288    void SpaceRaceController::tick(float dt)
289    {
290        if (this->getControllableEntity() == nullptr || this->getControllableEntity()->getPlayer() == nullptr )
291        {
292            //orxout()<< this->getControllableEntity() << " in tick"<<endl;
293            return;
294        }
295        //FOR virtual Checkpoints
296        if(nextRaceCheckpoint_->getCheckpointIndex() < 0)
297        {
298            if( distanceSpaceshipToCheckPoint(nextRaceCheckpoint_) < 200)
299            {
300                currentRaceCheckpoint_=nextRaceCheckpoint_;
301                nextRaceCheckpoint_ = nextPointFind(nextRaceCheckpoint_);
302                lastPositionSpaceship=this->getControllableEntity()->getPosition();
303                //orxout()<< "CP "<< currentRaceCheckpoint_->getCheckpointIndex()<<" chanched to: "<< nextRaceCheckpoint_->getCheckpointIndex()<<endl;
304            }
305        }
306
307        if (nextRaceCheckpoint_->playerWasHere(this->getControllableEntity()->getPlayer()))
308        {//Checkpoint erreicht
309
310            currentRaceCheckpoint_ = nextRaceCheckpoint_;
311            OrxAssert(nextRaceCheckpoint_, "next race checkpoint undefined");
312            nextRaceCheckpoint_ = nextPointFind(nextRaceCheckpoint_);
313            lastPositionSpaceship = this->getControllableEntity()->getPosition();
314            //orxout()<< "CP "<< currentRaceCheckpoint_->getCheckpointIndex()<<" chanched to: "<< nextRaceCheckpoint_->getCheckpointIndex()<<endl;
315        }
316
317        else if ((lastPositionSpaceship-this->getControllableEntity()->getPosition()).length()/dt > ADJUSTDISTANCE)
318        {
319            nextRaceCheckpoint_ = adjustNextPoint();
320            lastPositionSpaceship = this->getControllableEntity()->getPosition();
321        }
322
323        // Abmessung fuer MINDISTANCE gut;
324
325        else if((lastPositionSpaceship - this->getControllableEntity()->getPosition()).length()/dt < MINDISTANCE )
326        {
327            this->moveToPosition(Vector3(rnd()*100, rnd()*100, rnd()*100));
328            this->spin();
329            orxout(user_status) << "Mindistance reached" << std::endl;
330            return;
331        }
332        //orxout(user_status) << "dt= " << dt << ";  distance= " << (lastPositionSpaceship-this->getControllableEntity()->getPosition()).length() <<std::endl;
333        lastPositionSpaceship = this->getControllableEntity()->getPosition();
334       
335        this->boostControl();
336        if (nextRaceCheckpoint_ == nullptr) orxout() << "nextRaceCheckpoint_ equals to nullpointer look @line 334 SpaceRaceController.cc" << endl;
337        this->moveToPosition(nextRaceCheckpoint_->getPosition());
338        this->boostControl();
339    }
340
341    // True if a coordinate of 'pointToPoint' is smaller then the corresponding coordinate of 'groesse'
342    bool SpaceRaceController::vergleicheQuader(const Vector3& pointToPoint, const Vector3& groesse)
343    {
344        if(std::abs(pointToPoint.x) < groesse.x)
345            return true;
346        if(std::abs(pointToPoint.y) < groesse.y)
347            return true;
348        if(std::abs(pointToPoint.z) < groesse.z)
349            return true;
350        return false;
351
352    }
353
354    bool SpaceRaceController::directLinePossible(RaceCheckPoint* racepoint1, RaceCheckPoint* racepoint2, const std::vector<StaticEntity*>& allObjects)
355    {
356
357        Vector3 cP1ToCP2 = (racepoint2->getPosition() - racepoint1->getPosition()) / (racepoint2->getPosition() - racepoint1->getPosition()).length(); //unit Vector
358        Vector3 centerCP1 = racepoint1->getPosition();
359        btVector3 positionObject;
360        btScalar radiusObject;
361
362        for (StaticEntity* object : allObjects)
363        {
364            for (int everyShape=0; object->getAttachedCollisionShape(everyShape) != nullptr; everyShape++)
365            {
366                btCollisionShape* currentShape = object->getAttachedCollisionShape(everyShape)->getCollisionShape();
367                if(currentShape == nullptr)
368                continue;
369
370                currentShape->getBoundingSphere(positionObject,radiusObject);
371                Vector3 positionObjectNonBT(positionObject.x(), positionObject.y(), positionObject.z());
372                if((powf((cP1ToCP2.dotProduct(centerCP1-positionObjectNonBT)),2)-(centerCP1-positionObjectNonBT).dotProduct(centerCP1-positionObjectNonBT)+powf(radiusObject, 2))>0)
373                {
374                    return false;
375                }
376
377            }
378        }
379        return true;
380
381    }
382
383    /*void SpaceRaceController::computeVirtualCheckpoint(RaceCheckPoint* racepoint1, RaceCheckPoint* racepoint2, const std::vector<StaticEntity*>& allObjects)
384    {
385        Vector3 cP1ToCP2=(racepoint2->getPosition()-racepoint1->getPosition()) / (racepoint2->getPosition()-racepoint1->getPosition()).length(); //unit Vector
386        Vector3 centerCP1=racepoint1->getPosition();
387        btVector3 positionObject;
388        btScalar radiusObject;
389
390        for (std::vector<StaticEntity*>::iterator it = allObjects.begin(); it != allObjects.end(); ++it)
391        {
392            for (int everyShape=0; (*it)->getAttachedCollisionShape(everyShape) != nullptr; everyShape++)
393            {
394                btCollisionShape* currentShape = (*it)->getAttachedCollisionShape(everyShape)->getCollisionShape();
395                if(currentShape == nullptr)
396                continue;
397
398                currentShape->getBoundingSphere(positionObject,radiusObject);
399                Vector3 positionObjectNonBT(positionObject.x(), positionObject.y(), positionObject.z());
400                Vector3 norm_r_CP = cP1ToCP2.crossProduct(centerCP1-positionObjectNonBT);
401
402                if(norm_r_CP.length() == 0){
403                    Vector3 zufall;
404                    do{
405                        zufall=Vector3(rnd(),rnd(),rnd());//random
406                    }while((zufall.crossProduct(cP1ToCP2)).length() == 0);
407                    norm_r_CP=zufall.crossProduct(cP1ToCP2);
408                }
409                Vector3 VecToVCP = norm_r_CP.crossProduct(cP1ToCP2);
410                float distanzToCP1 = sqrt(powf(radiusObject,4)/(powf((centerCP1-positionObjectNonBT).length(), 2)-powf(radiusObject,2))+powf(radiusObject,2));
411                float distanzToCP2 = sqrt(powf(radiusObject,4)/(powf((racepoint2->getPosition()-positionObjectNonBT).length(), 2)-powf(radiusObject,2))+powf(radiusObject,2));
412                float distanz = std::max(distanzToCP1,distanzToCP2);
413                //float distanz = 0.0f; //TEMPORARY
414                Vector3 newCheckpointPositionPos = positionObjectNonBT+(distanz*VecToVCP)/VecToVCP.length();
415                Vector3 newCheckpointPositionNeg = positionObjectNonBT-(distanz*VecToVCP)/VecToVCP.length();
416                if((newCheckpointPositionPos - centerCP1).length() + (newCheckpointPositionPos - (centerCP1+cP1ToCP2)).length() < (newCheckpointPositionNeg - centerCP1).length() + (newCheckpointPositionNeg - (centerCP1+cP1ToCP2)).length() )
417                {
418                    RaceCheckPoint* newVirtualCheckpoint = addVirtualCheckPoint(racepoint1,racepoint2->getCheckpointIndex(), newCheckpointPositionPos);
419                }
420                else
421                {
422                    RaceCheckPoint* newVirtualCheckpoint = addVirtualCheckPoint(racepoint1,racepoint2->getCheckpointIndex(), newCheckpointPositionNeg);
423                }
424                return;
425            }
426        }
427
428    }*/
429
430    /*void SpaceRaceController::placeVirtualCheckpoints(RaceCheckPoint* racepoint1, RaceCheckPoint* racepoint2)
431    {
432        Vector3 point1 = racepoint1->getPosition();
433        Vector3 point2 = racepoint2->getPosition();
434        std::vector<StaticEntity*> problematicObjects;
435
436        ObjectList<StaticEntity> list;
437        for (ObjectList<StaticEntity>::iterator it = list.begin(); it!= list.end(); ++it)
438        {
439
440            if (dynamic_cast<RaceCheckPoint*>(*it) != nullptr)
441            {
442                continue;
443            } // does not work jet
444
445            problematicObjects.insert(problematicObjects.end(), *it);
446            //it->getScale3D();// vector fuer halbe wuerfellaenge
447        }
448
449        if(!directLinePossible(racepoint1, racepoint2, problematicObjects))
450        {
451            //orxout()<<"From "<<racepoint1->getCheckpointIndex()<<" to "<<racepoint2->getCheckpointIndex()<<"produces: "<< virtualCheckPointIndex<<endl;
452            computeVirtualCheckpoint(racepoint1, racepoint2, problematicObjects);
453        }
454
455        //
456        //        do{
457        //            zufall=Vector3(rnd(),rnd(),rnd());//random
458        //        }while((zufall.crossProduct(objectmiddle-racepoint1->getPosition())).length()==0);
459        //
460        //        Vector3 normalvec=zufall.crossProduct(objectmiddle-racepoint1->getPosition());
461        //        // a'/b'=a/b => a' =b'*a/b
462        //        float laengeNormalvec=(objectmiddle-racepoint1->getPosition()).length()/sqrt((objectmiddle-racepoint1->getPosition()).squaredLength()-radius*radius)*radius;
463        //        addVirtualCheckPoint(racepoint1,racepoint2->getCheckpointIndex(), objectmiddle+normalvec/normalvec.length()*laengeNormalvec);
464
465        //        Vector3 richtungen [6];
466        //        richtungen[0]= Vector3(1,0,0);
467        //        richtungen[1]= Vector3(-1,0,0);
468        //        richtungen[2]= Vector3(0,1,0);
469        //        richtungen[3]= Vector3(0,-1,0);
470        //        richtungen[4]= Vector3(0,0,1);
471        //        richtungen[5]= Vector3(0,0,-1);
472        //
473        //        for (int i = 0; i< 6; i++)
474        //        {
475        //            const int STEPS=100;
476        //            const float PHI=1.1;
477        //            bool collision=false;
478        //
479        //            for (int j =0; j<STEPS; j++)
480        //            {
481        //                Vector3 tempPosition=(point1 - (point2-point1+richtungen[i]*PHI)*(float)j/STEPS);
482        //                for (std::vector<StaticEntity*>::iterator it = problematicObjects.begin(); it!=problematicObjects.end(); ++it)
483        //                {
484        //                    btVector3 positionObject;
485        //                    btScalar radiusObject;
486        //                    if((*it)==nullptr)
487        //                    {   orxout()<<"Problempoint 1.1"<<endl; continue;}
488        //                    //TODO: Probably it points on a wrong object
489        //                    for (int everyShape=0; (*it)->getAttachedCollisionShape(everyShape)!=nullptr; everyShape++)
490        //                    {
491        //                        if((*it)->getAttachedCollisionShape(everyShape)->getCollisionShape()==nullptr)
492        //                        {    continue;}
493        //
494        //                        orxout()<<"Problempoint 2.1"<<endl;
495        //                        (*it)->getAttachedCollisionShape(everyShape)->getCollisionShape()->getBoundingSphere(positionObject,radiusObject);
496        //                        Vector3 positionObjectNonBT(positionObject.x(), positionObject.y(), positionObject.z());
497        //                        if (((tempPosition - positionObjectNonBT).length()<radiusObject) && (vergleicheQuader((tempPosition-positionObjectNonBT),(*it)->getScale3D())))
498        //                        {
499        //                            collision=true; break;
500        //                        }
501        //                    }
502        //                    if(collision) break;
503        //                }
504        //                if(collision)break;
505        //            }
506        //            if(collision) continue;
507        //            // no collision => possible Way
508        //            for (float j =0; j<STEPS; j++)
509        //            {
510        //                Vector3 possiblePosition=(point1 - (point2-point1+richtungen[i]*PHI)*j/STEPS);
511        //                collision=false;
512        //                for(int ij=0; ij<STEPS; j++)
513        //                {
514        //                    Vector3 tempPosition=(possiblePosition - (point2-possiblePosition)*(float)ij/STEPS);
515        //                    for (std::vector<StaticEntity*>::iterator it = problematicObjects.begin(); it!=problematicObjects.end(); ++it)
516        //                    {
517        //                        btVector3 positionObject;
518        //                        btScalar radiusObject;
519        //                        if((*it)==nullptr)
520        //                        {   orxout()<<"Problempoint 1"<<endl; continue;}
521        //                        for (int everyShape=0; (*it)->getAttachedCollisionShape(everyShape)!=nullptr; everyShape++)
522        //                        {
523        //                            if((*it)->getAttachedCollisionShape(everyShape)->getCollisionShape()==nullptr)
524        //                            {   orxout()<<"Problempoint 2.2"<<endl; continue;}
525        //                            (*it)->getAttachedCollisionShape(everyShape)->getCollisionShape()->getBoundingSphere(positionObject,radiusObject);
526        //                            Vector3 positionObjectNonBT(positionObject.x(), positionObject.y(), positionObject.z());
527        //                            if (((tempPosition-positionObjectNonBT).length()<radiusObject) && (vergleicheQuader((tempPosition-positionObjectNonBT),(*it)->getScale3D())))
528        //                            {
529        //                                collision=true; break;
530        //                            }
531        //                        }
532        //                        if(collision) break;
533        //                    }
534        //                    if(collision)break;
535        //                    //addVirtualCheckPoint(racepoint1, racepoint2->getCheckpointIndex(), possiblePosition);
536        //                    return;
537        //                }
538        //
539        //            }
540        //        }
541
542    }*/
543}
Note: See TracBrowser for help on using the repository browser.