GSRendererSoft.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include "GSRenderer.h"
  23. template <class Vertex>
  24. class GSRendererSoft : public GSRenderer<Vertex>
  25. {
  26. protected:
  27. void Reset();
  28. int DrawingKick(bool fSkip);
  29. void FlushPrim();
  30. void Flip();
  31. void EndFrame();
  32. enum {PRIM_NONE, PRIM_SPRITE, PRIM_TRIANGLE, PRIM_LINE, PRIM_POINT} m_primtype;
  33. DWORD m_faddr_x0, m_faddr;
  34. DWORD m_zaddr_x0, m_zaddr;
  35. int* m_faddr_ro;
  36. int* m_zaddr_ro;
  37. int m_fx, m_fy;
  38. void RowInit(int x, int y);
  39. void RowStep();
  40. void DrawPoint(Vertex* v);
  41. void DrawLine(Vertex* v);
  42. void DrawTriangle(Vertex* v);
  43. void DrawSprite(Vertex* v);
  44. bool DrawFilledRect(int left, int top, int right, int bottom, const Vertex& v);
  45. template <int iZTST, int iATST>
  46. void DrawVertex(const Vertex& v);
  47. typedef void (GSRendererSoft<Vertex>::*DrawVertexPtr)(const Vertex& v);
  48. DrawVertexPtr m_dv[4][8], m_pDrawVertex;
  49. template <int iLOD, bool bLCM, bool bTCC, int iTFX>
  50. void DrawVertexTFX(typename Vertex::Vector& Cf, const Vertex& v);
  51. typedef void (GSRendererSoft<Vertex>::*DrawVertexTFXPtr)(typename Vertex::Vector& Cf, const Vertex& v);
  52. DrawVertexTFXPtr m_dvtfx[4][2][2][4], m_pDrawVertexTFX;
  53. CComPtr<IDirect3DTexture9> m_pRT[2];
  54. DWORD* m_pTexture;
  55. void SetupTexture();
  56. struct uv_wrap_t {union {struct {short min[8], max[8];}; struct {short and[8], or[8];};}; unsigned short mask[8];}* m_uv;
  57. CRect m_scissor;
  58. BYTE m_clip[65536];
  59. BYTE m_mask[65536];
  60. BYTE* m_clamp;
  61. public:
  62. GSRendererSoft(HWND hWnd, HRESULT& hr);
  63. ~GSRendererSoft();
  64. HRESULT ResetDevice(bool fForceWindowed = false);
  65. void LOGVERTEX(Vertex& v, LPCTSTR type)
  66. {
  67. int tw = 1, th = 1;
  68. if(m_de.PRIM.TME) {tw = 1<<m_ctxt->TEX0.TW; th = 1<<m_ctxt->TEX0.TH;}
  69. LOG2(_T("- %s (%.2f, %.2f, %.2f, %.2f) (%08x) (%.3f, %.3f) (%.2f, %.2f)n"), 
  70. type,
  71. (float)v.p.x, (float)v.p.y, (float)v.p.z / UINT_MAX, (float)v.t.q, 
  72. (DWORD)v.c,
  73. (float)v.t.x/tw, (float)v.t.y/th, (float)v.t.x, (float)v.t.y);
  74. }
  75. };
  76. class GSRendererSoftFP : public GSRendererSoft<GSSoftVertexFP>
  77. {
  78. protected:
  79. void VertexKick(bool fSkip);
  80. public:
  81. GSRendererSoftFP(HWND hWnd, HRESULT& hr);
  82. };
  83. /*
  84. class GSRendererSoftFX : public GSRendererSoft<GSSoftVertexFX>
  85. {
  86. protected:
  87. void VertexKick(bool fSkip);
  88. //void DrawVertex(int x, int y, GSSoftVertexFX& v);
  89. public:
  90. GSRendererSoftFX(HWND hWnd, HRESULT& hr);
  91. };
  92. */