Просмотр исходного кода

Pica/TextureUnit: Implement mirrored repeating texture wrapping.

Tony Wasserka 11 лет назад
Родитель
Сommit
6ca752ccbc
2 измененных файлов с 12 добавлено и 3 удалено
  1. 3 2
      src/video_core/pica.h
  2. 9 1
      src/video_core/rasterizer.cpp

+ 3 - 2
src/video_core/pica.h

@@ -118,8 +118,9 @@ struct Regs {
 
 
     struct TextureConfig {
     struct TextureConfig {
         enum WrapMode : u32 {
         enum WrapMode : u32 {
-            ClampToEdge = 0,
-            Repeat      = 2,
+            ClampToEdge    = 0,
+            Repeat         = 2,
+            MirroredRepeat = 3,
         };
         };
 
 
         INSERT_PADDING_WORDS(0x1);
         INSERT_PADDING_WORDS(0x1);

+ 9 - 1
src/video_core/rasterizer.cpp

@@ -251,7 +251,15 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
                             return val;
                             return val;
 
 
                         case Regs::TextureConfig::Repeat:
                         case Regs::TextureConfig::Repeat:
-                            return (int)(((unsigned)val) % size);
+                            return (int)((unsigned)val % size);
+
+                        case Regs::TextureConfig::MirroredRepeat:
+                        {
+                            int val = (int)((unsigned)val % (2 * size));
+                            if (val >= size)
+                                val = 2 * size - 1 - val;
+                            return val;
+                        }
 
 
                         default:
                         default:
                             LOG_ERROR(HW_GPU, "Unknown texture coordinate wrapping mode %x\n", (int)mode);
                             LOG_ERROR(HW_GPU, "Unknown texture coordinate wrapping mode %x\n", (int)mode);