Sfoglia il codice sorgente

Made the flipped y-axis on terrain import optional.

Pass a final boolean argument to TerrainBlock::import to control
y-axis flipping. It is enabled by default, since this was the previous
default behavior.

This should be added as an option in the terrain import dialog - see
game/tools/worldEditor/gui/guiTerrainImportGui.gui
Daniel Buckmaster 12 anni fa
parent
commit
6ff1db6c0c

+ 2 - 1
Engine/source/terrain/terrData.h

@@ -233,7 +233,8 @@ public:
                   F32 heightScale, 
                   F32 metersPerPixel,
                   const Vector<U8> &layerMap, 
-                  const Vector<String> &materials );
+                  const Vector<String> &materials,
+                  bool flipYAxis = true );
 
 #ifdef TORQUE_TOOLS
    bool exportHeightMap( const UTF8 *filePath, const String &format ) const;

+ 36 - 10
Engine/source/terrain/terrFile.cpp

@@ -683,7 +683,8 @@ void TerrainFile::setHeightMap( const Vector<U16> &heightmap, bool updateCollisi
 void TerrainFile::import(  const GBitmap &heightMap, 
                            F32 heightScale,
                            const Vector<U8> &layerMap, 
-                           const Vector<String> &materials )
+                           const Vector<String> &materials,
+                           bool flipYAxis)
 {
    AssertFatal( heightMap.getWidth() == heightMap.getHeight(), "TerrainFile::import - Height map is not square!" );
    AssertFatal( isPow2( heightMap.getWidth() ), "TerrainFile::import - Height map is not power of two!" );
@@ -702,23 +703,48 @@ void TerrainFile::import(  const GBitmap &heightMap,
    {
       const F32 toFixedPoint = ( 1.0f / (F32)U16_MAX ) * floatToFixed( heightScale );
       const U16 *iBits = (const U16*)heightMap.getBits();
-      for ( U32 i = 0; i < mSize * mSize; i++ )
+      if ( flipYAxis )
+      {
+         for ( U32 i = 0; i < mSize * mSize; i++ )
+         {
+            U16 height = convertBEndianToHost( *iBits );
+            *oBits = (U16)mCeil( (F32)height * toFixedPoint );
+            ++oBits;
+            ++iBits;
+         }
+      }
+      else
       {
-         U16 height = convertBEndianToHost( *iBits );
-         *oBits = (U16)mCeil( (F32)height * toFixedPoint );
-         ++oBits;
-         ++iBits;
+         for(S32 y = mSize - 1; y >= 0; y--) {
+            for(U32 x = 0; x < mSize; x++) {
+               U16 height = convertBEndianToHost( *iBits );
+               mHeightMap[x + y * mSize] = (U16)mCeil( (F32)height * toFixedPoint );
+               ++iBits;
+            }
+         }
       }
    }
    else
    {
       const F32 toFixedPoint = ( 1.0f / (F32)U8_MAX ) * floatToFixed( heightScale );
       const U8 *iBits = heightMap.getBits();
-      for ( U32 i = 0; i < mSize * mSize; i++ )
+      if ( flipYAxis )
       {
-         *oBits = (U16)mCeil( ((F32)*iBits) * toFixedPoint );
-         ++oBits;
-         iBits += heightMap.getBytesPerPixel();
+         for ( U32 i = 0; i < mSize * mSize; i++ )
+         {
+            *oBits = (U16)mCeil( ((F32)*iBits) * toFixedPoint );
+            ++oBits;
+            iBits += heightMap.getBytesPerPixel();
+         }
+      }
+      else
+      {
+         for(S32 y = mSize - 1; y >= 0; y--) {
+            for(U32 x = 0; x < mSize; x++) {
+               mHeightMap[x + y * mSize] = (U16)mCeil( ((F32)*iBits) * toFixedPoint );
+               iBits += heightMap.getBytesPerPixel();
+            }
+         }
       }
    }
 

+ 2 - 1
Engine/source/terrain/terrFile.h

@@ -152,7 +152,8 @@ public:
    void import(   const GBitmap &heightMap, 
                   F32 heightScale,
                   const Vector<U8> &layerMap, 
-                  const Vector<String> &materials );
+                  const Vector<String> &materials,
+                  bool flipYAxis = true );
 
    /// Updates the terrain grid for the specified area.
    void updateGrid( const Point2I &minPt, const Point2I &maxPt );

+ 8 - 6
Engine/source/terrain/terrImport.cpp

@@ -120,8 +120,8 @@ ConsoleStaticMethod( TerrainBlock, createNew, S32, 5, 5,
    return terrain->getId();
 }
 
-ConsoleStaticMethod( TerrainBlock, import, S32, 7, 7, 
-   "( String terrainName, String heightMap, F32 metersPerPixel, F32 heightScale, String materials, String opacityLayers )\n"
+ConsoleStaticMethod( TerrainBlock, import, S32, 7, 8, 
+   "( String terrainName, String heightMap, F32 metersPerPixel, F32 heightScale, String materials, String opacityLayers[, bool flipYAxis=true] )\n"
    "" )
 {
    // Get the parameters.
@@ -131,6 +131,7 @@ ConsoleStaticMethod( TerrainBlock, import, S32, 7, 7,
    F32 heightScale = dAtof(argv[4]);
    const UTF8 *opacityFiles = argv[5];
    const UTF8 *materialsStr = argv[6];
+   bool flipYAxis = argc == 8? dAtob(argv[7]) : true;
 
    // First load the height map and validate it.
    Resource<GBitmap> heightmap = GBitmap::load( hmap );
@@ -251,12 +252,12 @@ ConsoleStaticMethod( TerrainBlock, import, S32, 7, 7,
    // Do we have an existing terrain with that name... then update it!
    TerrainBlock *terrain = dynamic_cast<TerrainBlock*>( Sim::findObject( terrainName ) );
    if ( terrain )
-      terrain->import( (*heightmap), heightScale, metersPerPixel, layerMap, materials );
+      terrain->import( (*heightmap), heightScale, metersPerPixel, layerMap, materials, flipYAxis );
    else
    {
       terrain = new TerrainBlock();
       terrain->assignName( terrainName );
-      terrain->import( (*heightmap), heightScale, metersPerPixel, layerMap, materials );
+      terrain->import( (*heightmap), heightScale, metersPerPixel, layerMap, materials, flipYAxis );
       terrain->registerObject();
 
       // Add to mission group!
@@ -272,7 +273,8 @@ bool TerrainBlock::import( const GBitmap &heightMap,
                            F32 heightScale, 
                            F32 metersPerPixel,
                            const Vector<U8> &layerMap, 
-                           const Vector<String> &materials )
+                           const Vector<String> &materials,
+                           bool flipYAxis)
 {
    AssertFatal( isServerObject(), "TerrainBlock::import - This should only be called on the server terrain!" );
 
@@ -299,7 +301,7 @@ bool TerrainBlock::import( const GBitmap &heightMap,
    }
 
    // The file does a bunch of the work.
-   mFile->import( heightMap, heightScale, layerMap, materials );
+   mFile->import( heightMap, heightScale, layerMap, materials, flipYAxis );
 
    // Set the square size.
    mSquareSize = metersPerPixel;