TranslationMaps and polygons

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 07/09/2009 at 03:54, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   10.5 
Platform:      
Language(s) :     C++  ;

---------
I am getting some results when using the TranslationMaps for polygons that I cannot explain.
When you delete an ngon that consists of two or more polygons, the information that is passed in the translation maps is not what I would expect.
here is a code snippet I use in the Message member of a tag plugin.

> <code>
>
>> `

  
\>  if (type==MSG_TRANSLATE_POLYGONS)  
\>       {     // Update the indexes as needed  
\>            BaseContainer *bc=((BaseList2D* )node)->GetDataInstance();  
\>            if (!bc)  
\>                 return false;  
\>                   
\>            LONG lngI,lngJ,lngSize;  
\>                        
\>            TranslationMaps *map;  
\>            map=(TranslationMaps* )data;  
\>    
\>            if (map)  
\>            {                      
\>                 // New to old polygon mapping  
\>                 if (arrNewToOldPoly)  
\>                      GeFree(arrNewToOldPoly);  
\>                 lngSize = sizeof(LONG) * map->m_nPolygonCount;  
\>                 arrNewToOldPoly = (LONG* )GeAlloc(lngSize);  
\>                 if (!arrNewToOldPoly)  
\>                      return false;  
\>                   
\>                 for (lngI=0;lngI<map->m_nPolygonCount;lngI++)  
\>                 {     if (lngI>=map->m_oPolygonCount)  
\>                      {     arrNewToOldPoly[lngI]=-1;  
\>                      }  
\>                      else  
\>                      {     arrNewToOldPoly[lngI]=lngI;}  
\>                        
\>                 }  
\>                                       
\>                 for (lngJ=0;lngJ<map->m_mPolygonCount;lngJ++)  
\>                 {       
\>                      GePrint("New To Old "+LongToString(map->m_pPolygonMap[lngJ].nIndex)+" "+LongToString(map->m_pPolygonMap[lngJ].oIndex)+" "+LongToString(map->m_pPolygonMap[lngJ].lFlags));  
\>    
\>                      if ((map->m_pPolygonMap[lngJ].lFlags & TRANSMAP_FLAG_NEW))  
\>                      {     arrNewToOldPoly[map->m_pPolygonMap[lngJ].nIndex]=-1;  
\>                      };  
\>                        
\>                      if ((map->m_pPolygonMap[lngJ].lFlags & TRANSMAP_FLAG_MOVED))  
\>                      {     if (map->m_pPolygonMap[lngJ].nIndex != -1)  
\>                           {     arrNewToOldPoly[map->m_pPolygonMap[lngJ].nIndex]=map->m_pPolygonMap[lngJ].oIndex;  
\>                           }  
\>                      };  
\>                                            
\>                 }  
\>    
\>                 // Old to new polygon mapping  
\>                 if (arrOldTonewPoly)  
\>                      GeFree(arrOldTonewPoly);  
\>                 lngSize = sizeof(LONG) * map->m_oPolygonCount;  
\>                 arrOldTonewPoly = (LONG* )GeAlloc(lngSize);  
\>                 if (!arrOldTonewPoly)  
\>                      return false;  
\>    
\>                 for (lngI=0;lngI<map->m_oPolygonCount;lngI++)  
\>                 {     arrOldTonewPoly[lngI]=lngI;  
\>                 }  
\>    
\>                 for (lngJ=0;lngJ<map->m_mPolygonCount;lngJ++)  
\>                 {     GePrint("Old To New "+LongToString(map->m_pPolygonMap[lngJ].nIndex)+" "+LongToString(map->m_pPolygonMap[lngJ].oIndex)+" "+LongToString(map->m_pPolygonMap[lngJ].lFlags));  
\>    
\>                      if ((map->m_pPolygonMap[lngJ].lFlags & TRANSMAP_FLAG_DELETED))  
\>                      {     arrOldTonewPoly[map->m_pPolygonMap[lngJ].oIndex]=-1;  
\>                      };  
\>                        
\>                      if ((map->m_pPolygonMap[lngJ].lFlags & TRANSMAP_FLAG_MOVED))  
\>                      {     arrOldTonewPoly[map->m_pPolygonMap[lngJ].oIndex]=map->m_pPolygonMap[lngJ].nIndex;  
\>                      };  
\>                 }  
\>                   
\>            }  
\>       }  
\>  

`
>
> </code>

Now if use some simple polygon objects (I started with a cube with 2 segments), and do some simple tests this is what I get:

Delete a single polygon:
Highest polygon index is 23, the index of the polygon that gets deleted is 7

The polygon mapping gives this
nIndex -1 oIndex 7 lFlags 8 (TRANSMAP_FLAG_DELETED)
nIndex 7 oIndex 23 lFlags 4 (TRANSMAP_FLAG_MOVED)

That makes perfect sense but if I try to delete a ngon that consists of 2 polygons things are not that clear

Delete a ngon:
Highest polygon index is 26, the indexes of the polygons that make up the ngon are 25 and 7

The polygon mapping gives this
nIndex 7 oIndex 26 lFlags 4 (TRANSMAP_FLAG_MOVED)
nIndex -1 oIndex 28 lFlags 8 (TRANSMAP_FLAG_DELETED)

So the mapping tells me that polygon 25 (old index) has not been changed, although it does not exist any more
and both polygon 26 and 7 (old index) are now both polygon 7 (new index) although the original 7 has been deleted.
Is this a bug or am I missing something?

Cheers,

Nebu