summaryrefslogtreecommitdiff
path: root/osframework/source/SexyAppFramework/D3DInterface.h
diff options
context:
space:
mode:
Diffstat (limited to 'osframework/source/SexyAppFramework/D3DInterface.h')
-rw-r--r--osframework/source/SexyAppFramework/D3DInterface.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/osframework/source/SexyAppFramework/D3DInterface.h b/osframework/source/SexyAppFramework/D3DInterface.h
new file mode 100644
index 0000000..4d701ba
--- /dev/null
+++ b/osframework/source/SexyAppFramework/D3DInterface.h
@@ -0,0 +1,154 @@
+#ifndef __D3DINTERFACE_H__
+#define __D3DINTERFACE_H__
+
+#include "Common.h"
+#include "MemoryImage.h"
+#include "SexyMatrix.h"
+#include <d3d.h>
+
+
+namespace Sexy
+{
+
+class DDInterface;
+class SexyMatrix3;
+class TriVertex;
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// The following flags apply to to the mD3DFlags member of MemoryImage
+enum D3DImageFlags
+{
+ D3DImageFlag_MinimizeNumSubdivisions = 0x0001, // subdivide image into fewest possible textures (may use more memory)
+ D3DImageFlag_Use64By64Subdivisions = 0x0002, // good to use with image strips so the entire texture isn't pulled in when drawing just a piece
+ D3DImageFlag_UseA4R4G4B4 = 0x0004, // images with not too many color gradients work well in this format
+ D3DImageFlag_UseA8R8G8B8 = 0x0008 // non-alpha images will be stored as R5G6B5 by default so use this option if you want a 32-bit non-alpha image
+};
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+struct TextureDataPiece
+{
+ LPDIRECTDRAWSURFACE7 mTexture;
+ int mWidth,mHeight;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+enum PixelFormat
+{
+ PixelFormat_Unknown = 0x0000,
+ PixelFormat_A8R8G8B8 = 0x0001,
+ PixelFormat_A4R4G4B4 = 0x0002,
+ PixelFormat_R5G6B5 = 0x0004,
+ PixelFormat_Palette8 = 0x0008
+};
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+struct TextureData
+{
+public:
+ typedef std::vector<TextureDataPiece> TextureVector;
+
+ TextureVector mTextures;
+ LPDIRECTDRAWPALETTE mPalette;
+
+ int mWidth,mHeight;
+ int mTexVecWidth, mTexVecHeight;
+ int mTexPieceWidth, mTexPieceHeight;
+ int mBitsChangedCount;
+ int mTexMemSize;
+ float mMaxTotalU, mMaxTotalV;
+ PixelFormat mPixelFormat;
+ DWORD mImageFlags;
+
+ TextureData();
+ ~TextureData();
+
+ void ReleaseTextures();
+
+ void CreateTextureDimensions(MemoryImage *theImage);
+ void CreateTextures(MemoryImage *theImage, LPDIRECT3DDEVICE7 theDevice, LPDIRECTDRAW7 theDraw);
+ void CheckCreateTextures(MemoryImage *theImage, LPDIRECT3DDEVICE7 theDevice, LPDIRECTDRAW7 theDraw);
+ LPDIRECTDRAWSURFACE7 GetTexture(int x, int y, int &width, int &height, float &u1, float &v1, float &u2, float &v2);
+ LPDIRECTDRAWSURFACE7 GetTextureF(float x, float y, float &width, float &height, float &u1, float &v1, float &u2, float &v2);
+
+ void Blt(LPDIRECT3DDEVICE7 theDevice, float theX, float theY, const Rect& theSrcRect, const Color& theColor);
+ void BltTransformed(LPDIRECT3DDEVICE7 theDevice, const SexyMatrix3 &theTrans, const Rect& theSrcRect, const Color& theColor, const Rect *theClipRect = NULL, float theX = 0, float theY = 0, bool center = false);
+ void BltTriangles(LPDIRECT3DDEVICE7 theDevice, const TriVertex theVertices[][3], int theNumTriangles, DWORD theColor, float tx = 0, float ty = 0);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+class D3DInterface
+{
+public:
+ HWND mHWnd;
+ int mWidth;
+ int mHeight;
+
+ LPDIRECTDRAW7 mDD;
+ LPDIRECTDRAWSURFACE7 mDDSDrawSurface;
+ LPDIRECTDRAWSURFACE7 mZBuffer;
+ LPDIRECT3D7 mD3D;
+ LPDIRECT3DDEVICE7 mD3DDevice;
+ D3DVIEWPORT7 mD3DViewport;
+
+ bool mSceneBegun;
+ bool mIsWindowed;
+
+ typedef std::set<MemoryImage*> ImageSet;
+ ImageSet mImageSet;
+
+ typedef std::list<SexyMatrix3> TransformStack;
+ TransformStack mTransformStack;
+
+ static std::string mErrorString;
+
+protected:
+ void UpdateViewport();
+ bool InitD3D();
+ void SetupDrawMode(int theDrawMode, const Color &theColor, Image *theImage);
+ static HRESULT CALLBACK PixelFormatsCallback(LPDDPIXELFORMAT theFormat, LPVOID lpContext);
+
+public:
+ D3DInterface();
+ virtual ~D3DInterface();
+
+ void Cleanup();
+ void PushTransform(const SexyMatrix3 &theTransform, bool concatenate = true);
+ void PopTransform();
+
+ bool PreDraw();
+ void Flush();
+ void RemoveMemoryImage(MemoryImage *theImage);
+
+ bool CreateImageTexture(MemoryImage *theImage);
+ bool RecoverBits(MemoryImage* theImage);
+ void SetCurTexture(MemoryImage *theImage);
+ void Blt(Image* theImage, float theX, float theY, const Rect& theSrcRect, const Color& theColor, int theDrawMode, bool linearFilter = false);
+ void BltClipF(Image* theImage, float theX, float theY, const Rect& theSrcRect, const Rect *theClipRect, const Color& theColor, int theDrawMode);
+ void BltMirror(Image* theImage, float theX, float theY, const Rect& theSrcRect, const Color& theColor, int theDrawMode, bool linearFilter = false);
+ void StretchBlt(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, const Rect* theClipRect, const Color &theColor, int theDrawMode, bool fastStretch, bool mirror = false);
+ void BltRotated(Image* theImage, float theX, float theY, const Rect* theClipRect, const Color& theColor, int theDrawMode, double theRot, float theRotCenterX, float theRotCenterY, const Rect& theSrcRect);
+ void BltTransformed(Image* theImage, const Rect* theClipRect, const Color& theColor, int theDrawMode, const Rect &theSrcRect, const SexyMatrix3 &theTransform, bool linearFilter, float theX = 0, float theY = 0, bool center = false);
+ void DrawLine(double theStartX, double theStartY, double theEndX, double theEndY, const Color& theColor, int theDrawMode);
+ void FillRect(const Rect& theRect, const Color& theColor, int theDrawMode);
+ void DrawTriangle(const TriVertex &p1, const TriVertex &p2, const TriVertex &p3, const Color &theColor, int theDrawMode);
+ void DrawTriangleTex(const TriVertex &p1, const TriVertex &p2, const TriVertex &p3, const Color &theColor, int theDrawMode, Image *theTexture, bool blend = true);
+ void DrawTrianglesTex(const TriVertex theVertices[][3], int theNumTriangles, const Color &theColor, int theDrawMode, Image *theTexture, float tx = 0, float ty = 0, bool blend = true);
+ void DrawTrianglesTexStrip(const TriVertex theVertices[], int theNumTriangles, const Color &theColor, int theDrawMode, Image *theTexture, float tx = 0, float ty = 0, bool blend = true);
+ void FillPoly(const Point theVertices[], int theNumVertices, const Rect *theClipRect, const Color &theColor, int theDrawMode, int tx, int ty);
+
+ bool InitFromDDInterface(DDInterface *theInterface);
+
+ static void MakeDDPixelFormat(PixelFormat theFormatType, DDPIXELFORMAT* theFormat);
+ static PixelFormat GetDDPixelFormat(LPDDPIXELFORMAT theFormat);
+ static bool CheckDXError(HRESULT theError, const char *theMsg="");
+
+};
+
+}
+
+#endif //__D3DINTERFACE_H__ \ No newline at end of file