Browse Source

bei 2d collision detection kann der transparent flag von polygonen jetzt ignoriert werden

Kolja Strohm 5 years ago
parent
commit
3c7986a7db
4 changed files with 18 additions and 18 deletions
  1. 9 9
      Model2D.cpp
  2. 3 3
      Model2D.h
  3. 3 3
      Welt2D.cpp
  4. 3 3
      Welt2D.h

+ 9 - 9
Model2D.cpp

@@ -816,7 +816,7 @@ void Model2DObject::render( Mat3< float > & kamMat, Bild & zRObj, const char *ka
 }
 
 // constant
-bool Model2DObject::istPunktInnen( Vertex p ) const
+bool Model2DObject::istPunktInnen( Vertex p, bool ignoreTransparent ) const
 {
     if( !rData )
         return 0;
@@ -828,7 +828,7 @@ bool Model2DObject::istPunktInnen( Vertex p ) const
     p = mat * p;
     for( auto polygon = rData->polygons->getIterator(); polygon; polygon++, num++ )
     {
-        if( polygon._.transparent )
+        if( polygon._.transparent && !ignoreTransparent )
             continue;
         bool c = 0;
         for( auto point = polygon._.vertex->getIterator(); point; point++ )
@@ -848,14 +848,14 @@ bool Model2DObject::istPunktInnen( Vertex p ) const
     return 0;
 }
 
-bool Model2DObject::istLinieInnen( Vertex a, Vertex b ) const
+bool Model2DObject::istLinieInnen( Vertex a, Vertex b, bool ignoreTransparent ) const
 {
     if( !rData || !rData->polygons )
         return 0;
     int pAnz = rData->polygons->getEintragAnzahl();
     for( int p = 0; p < pAnz; p++ )
     {
-        if( rData->polygons->get( p ).transparent )
+        if( rData->polygons->get( p ).transparent && !ignoreTransparent )
             continue;
         Mat3< float > mat = Mat3< float >::rotation( rotation ) * Mat3< float >::scaling( size );
         int anz = rData->polygons->get( p ).vertex->getEintragAnzahl();
@@ -886,14 +886,14 @@ bool Model2DObject::istLinieInnen( Vertex a, Vertex b ) const
         int i = 1;
         bool inside = 1;
         for( Vertex vp = speed + a; (Punkt)vp != (Punkt)( b - speed ) && inside && i < mLen - 1; vp += speed, i++ )
-            inside &= istPunktInnen( vp );
+            inside &= istPunktInnen( vp, ignoreTransparent );
         if( inside )
             return 1;
     }
     return 0;
 }
 
-bool Model2DObject::istModelInnen( const Object2D * zObj, Vertex * sp, bool end ) const
+bool Model2DObject::istModelInnen( const Object2D * zObj, Vertex * sp, bool end, bool ignoreTransparent ) const
 {
     if( !end )
     {
@@ -903,12 +903,12 @@ bool Model2DObject::istModelInnen( const Object2D * zObj, Vertex * sp, bool end
     Mat3< float > mat = getObjectMatrix();
     for( auto polygon = rData->polygons->getIterator(); polygon; polygon++ )
     {
-        if( polygon._.transparent )
+        if( polygon._.transparent && !ignoreTransparent )
             continue;
         int anz = polygon._.vertex->getEintragAnzahl();
         for( int i = 0; i < anz; i++ )
         {
-            if( zObj->istPunktInnen( mat * polygon._.vertex->get( i ) ) )
+            if( zObj->istPunktInnen( mat * polygon._.vertex->get( i ), ignoreTransparent ) )
             {
                 if( sp )
                     *sp = mat * polygon._.vertex->get( i );
@@ -918,7 +918,7 @@ bool Model2DObject::istModelInnen( const Object2D * zObj, Vertex * sp, bool end
     }
     if( end )
         return 0;
-    return zObj->istModelInnen( this, sp, 1 );
+    return zObj->istModelInnen( this, sp, 1, ignoreTransparent );
 }
 
 Rect2< float > Model2DObject::getBoundingBox() const

+ 3 - 3
Model2D.h

@@ -111,16 +111,16 @@ namespace Framework
         __declspec( dllexport ) void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;
         // Gibt zurück, ob ein Punkt in dem Model enthalten ist
         //  p: Der Punkt
-        __declspec( dllexport ) bool istPunktInnen( Vertex p ) const override;
+        __declspec( dllexport ) bool istPunktInnen( Vertex p, bool ignoreTransparent = 0 ) const override;
         // Überprüft, ob eine Linie im Model enthalten ist
         //  a: Der startpunkt der Linie
         //  b: Der endpunkt der Linie
-        __declspec( dllexport ) bool istLinieInnen( Vertex a, Vertex b ) const override;
+        __declspec( dllexport ) bool istLinieInnen( Vertex a, Vertex b, bool ignoreTransparent = 0 ) const override;
         // Überprüft, ob sich das Objekt mit einem anderen Überschneidet
         //  zObj: Ein Zeiger auf das andere Objekt ohne erhöhten Reference Counter
         //  sp: Ein Zeiger auf einen Punkt, in dem der Schnittpunkt gespeichert wird
         //  end: 0, falls alle Ecken beider Objekte überprüft werdden sollen. 1, falls nur die Punkte dieses Models im anderen gesucht werden sollen
-        __declspec( dllexport ) virtual bool istModelInnen( const Object2D *zObj, Vertex *sp = 0, bool end = 0 ) const;
+        __declspec( dllexport ) virtual bool istModelInnen( const Object2D *zObj, Vertex *sp = 0, bool end = 0, bool ignoreTransparent = 0 ) const;
         __declspec( dllexport ) Rect2< float > getBoundingBox() const override;
         // Bestimmt den Aufschlagspunkt eines Strahls, der von pos ausgehend in Richtung dir abgegeben wird.
         //  pos: Der Stützvektor der Linie

+ 3 - 3
Welt2D.cpp

@@ -164,17 +164,17 @@ bool Object2D::tick( const WeltInfo &info, double zeit )
     return rSpeed != 0 || speed != Vertex( 0, 0 );
 }
 
-bool Object2D::istPunktInnen( Vertex p ) const
+bool Object2D::istPunktInnen( Vertex p, bool ignoreTransparent ) const
 {
     return 0;
 }
 
-bool Object2D::istLinieInnen( Vertex a, Vertex b ) const
+bool Object2D::istLinieInnen( Vertex a, Vertex b, bool ignoreTransparent ) const
 {
     return 0;
 }
 
-bool Object2D::istModelInnen( const Object2D *zObj, Vertex *sp, bool end ) const
+bool Object2D::istModelInnen( const Object2D *zObj, Vertex *sp, bool end, bool ignoreTransparent ) const
 {
     return 0;
 }

+ 3 - 3
Welt2D.h

@@ -89,16 +89,16 @@ namespace Framework
         virtual void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) = 0;
         // Gibt zurück, ob ein Punkt in dem Objekt enthalten ist
         //  p: Der Punkt
-        __declspec( dllexport ) virtual bool istPunktInnen( Vertex p ) const;
+        __declspec( dllexport ) virtual bool istPunktInnen( Vertex p, bool ignoreTransparent = 0 ) const;
         // Überprüft, ob eine Linie im Objekt enthalten ist
         //  a: Der startpunkt der Linie
         //  b: Der endpunkt der Linie
-        __declspec( dllexport ) virtual bool istLinieInnen( Vertex a, Vertex b ) const;
+        __declspec( dllexport ) virtual bool istLinieInnen( Vertex a, Vertex b, bool ignoreTransparent = 0 ) const;
         // Überprüft, ob sich das Objekt mit einem anderen Überschneidet
         //  zObj: Ein Zeiger auf das andere Objekt ohne erhöhten Reference Counter
         //  sp: Ein Zeiger auf einen Punkt, in dem der Schnittpunkt gespeichert wird
         //  end: 0, falls alle Ecken beider Objekte überprüft werdden sollen. 1, falls nur die Punkte dieses Models im anderen gesucht werden sollen
-        __declspec( dllexport ) virtual bool istModelInnen( const Object2D *zObj, Vertex *sp = 0, bool end = 0 ) const;
+        __declspec( dllexport ) virtual bool istModelInnen( const Object2D *zObj, Vertex *sp = 0, bool end = 0, bool ignoreTransparent = 0 ) const;
         // Gibt eine Matrix zurück, welche einen Punkt aus Objektkoordinaten in Bildschirmkoordinaten umrechnet
         __declspec( dllexport ) Mat3< float > getObjectMatrix() const;
         // Gibt eine Matrix zurück, welche einen Punkt aus Bildschirmkoordinaten in Objektkoordinaten umrechnet