Forráskód Böngészése

Added terrain tangent generation.

Lasse Öörni 13 éve
szülő
commit
c18efb013f
2 módosított fájl, 10 hozzáadás és 3 törlés
  1. 9 2
      Engine/Graphics/Terrain.cpp
  2. 1 1
      Engine/Graphics/TerrainPatch.cpp

+ 9 - 2
Engine/Graphics/Terrain.cpp

@@ -288,7 +288,7 @@ float Terrain::GetHeight(const Vector3& worldPosition) const
         }
         
         float h = h1 * (1.0f - xFrac - zFrac) + h2 * xFrac + h3 * zFrac;
-        /// \todo This assumes that the terrain node is upright
+        /// \todo This assumes that the terrain scene node is upright
         return node_->GetWorldScale().y_ * h + node_->GetWorldPosition().y_;
     }
     else
@@ -301,7 +301,7 @@ void Terrain::UpdatePatchGeometry(TerrainPatch* patch)
     unsigned vertexDataRow = patchSize_ + 1;
     VertexBuffer* vertexBuffer = patch->vertexBuffer_;
     if (vertexBuffer->GetVertexCount() != vertexDataRow * vertexDataRow)
-        vertexBuffer->SetSize(vertexDataRow * vertexDataRow, MASK_POSITION | MASK_NORMAL | MASK_TEXCOORD1);
+        vertexBuffer->SetSize(vertexDataRow * vertexDataRow, MASK_POSITION | MASK_NORMAL | MASK_TEXCOORD1 | MASK_TANGENT);
     float* vertexData = (float*)vertexBuffer->Lock(0, vertexBuffer->GetVertexCount());
     
     if (vertexData)
@@ -334,6 +334,13 @@ void Terrain::UpdatePatchGeometry(TerrainPatch* patch)
                 Vector2 texCoord((float)xPos / (float)size_.x_, (float)zPos / (float)size_.y_);
                 *vertexData++ = texCoord.x_;
                 *vertexData++ = texCoord.y_;
+                
+                // Tangent
+                Vector3 xyz = (Vector3::RIGHT - normal * normal.DotProduct(Vector3::RIGHT)).Normalized();
+                *vertexData++ = xyz.x_;
+                *vertexData++ = xyz.y_;
+                *vertexData++ = xyz.z_;
+                *vertexData++ = 1.0f;
             }
         }
         

+ 1 - 1
Engine/Graphics/TerrainPatch.cpp

@@ -52,7 +52,7 @@ TerrainPatch::TerrainPatch(Context* context) :
 {
     drawableFlags_ = DRAWABLE_GEOMETRY;
     
-    geometry_->SetVertexBuffer(0, vertexBuffer_, MASK_POSITION | MASK_NORMAL | MASK_TEXCOORD1);
+    geometry_->SetVertexBuffer(0, vertexBuffer_, MASK_POSITION | MASK_NORMAL | MASK_TEXCOORD1 | MASK_TANGENT);
     
     batches_.Resize(1);
     batches_[0].geometry_ = geometry_;