Arachnoid GLESv1.1 plugin. Compile and run (a bit glitchy and no frameskip) on the...
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / texture / TextureLoader.h
diff --git a/source/mupen64plus-video-arachnoid/src/texture/TextureLoader.h b/source/mupen64plus-video-arachnoid/src/texture/TextureLoader.h
new file mode 100755 (executable)
index 0000000..78ad1c2
--- /dev/null
@@ -0,0 +1,154 @@
+/******************************************************************************
+ * Arachnoid Graphics Plugin for Mupen64Plus
+ * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
+ *
+ * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef TEXTURE_LOADER_H_
+#define TEXTURE_LOADER_H_
+
+#include "GBIDefs.h"
+
+//Forward declarations
+class Memory;
+class RDP;
+
+//*****************************************************************************
+//* TextureImage
+//! Used to store information about texture image
+//*****************************************************************************
+struct TextureImage
+{
+    unsigned int format;
+    unsigned int size;
+    unsigned int width;
+    unsigned int bpl;
+    unsigned int address;
+
+    //! Constructor
+    TextureImage()
+    {
+        format = size = width = bpl = 0;
+        address = 0;
+    }
+};
+
+//*****************************************************************************
+//* RDP Tile
+//! Struct used to store information used then loading textures.
+//*****************************************************************************
+struct RDPTile
+{
+    unsigned int format, size, line, tmem, palette;
+
+    union
+    {
+        struct
+        {
+            unsigned int mirrort : 1;
+            unsigned int clampt  : 1;
+            unsigned int pad0    : 30;
+            unsigned int mirrors : 1;
+            unsigned int clamps  : 1;
+            unsigned int pad1    : 30;
+        };
+        struct
+        {
+            unsigned int cmt, cms;
+        };
+    };
+
+    //FrameBuffer *frameBuffer;
+    unsigned int maskt, masks;   
+    unsigned int shiftt, shifts;
+    float fuls, fult, flrs, flrt; 
+    unsigned int uls, ult, lrs, lrt;   
+
+    unsigned int getWidth() { return lrs - uls + 1; }
+    unsigned int getHeight() { return lrt - ult + 1; }
+
+    //! Constructor
+    RDPTile()
+    {
+        format = size = line = tmem = palette = 0;
+        maskt = masks = 0;   
+        shiftt = shifts = 0;
+        fuls = fult = flrs = flrt = 0; 
+        uls = ult = lrs = lrt = 0;  
+    }
+};
+
+//*****************************************************************************
+//* Texture Loader
+//! Class for loading texturs from RDRAM to Texture Memory
+//*****************************************************************************
+class TextureLoader
+{
+public:
+
+    //Constructor / Destructor
+    TextureLoader();
+    ~TextureLoader();
+
+    bool initialize(RDP* rdp, Memory* memory);
+
+    //Set Texture Image
+    void setTextureImage(unsigned int format, unsigned int size, unsigned int width, unsigned int segmentAddress);
+
+    //Set Tile
+    void setTile(int format, int size, int line, int tmem, int tile, int palette, 
+                          int clampS, int clampT, int mirrorS, int mirrorT, int maskS, 
+                          int maskT, int shiftS, int shiftT);
+
+    //Set Tile Size
+    void setTileSize(int tile, unsigned int s0, unsigned int t0, unsigned int s1, unsigned int t1);
+
+    //Load Tile
+    void loadTile(int tile, int s0, int t0, int s1, int t1);
+
+    //Load Block
+    void loadBlock(int tile, int s0, int t0, int s1, int t1);
+
+    //Load Texture Look up table
+    void loadTLUT(int tile, int s0, int t0, int s1, int t1);
+
+public:
+
+    //! Returns information about current texture image
+    TextureImage* getTextureImage()          { return &m_textureImage; }
+
+    //! Returns previusly loaded tile
+    RDPTile*      getCurrentTile()           { return m_currentTile;   }
+
+    //! Returns a tile
+    //! @param tile which of the eight tiles to return. 
+    RDPTile*      getTile(unsigned int tile) { return &m_tiles[tile];  }
+
+private:
+
+    Memory* m_memory;                //!< Pointer to Memory Manager
+    RDP*    m_rdp;                   //!< Pointer to Reality Signal Processor    
+
+    //Tiles
+    RDPTile      m_tiles[8];         //!< Eight tiles
+    RDPTile*     m_currentTile;      //!< Previusly loaded tile
+    TextureImage m_textureImage;     //!< Texture Image
+
+};
+
+#endif