1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

[D3D] Модуль для отрисовки визуалов.

Тема в разделе "Программирование", создана пользователем HUF, 07.03.2017.

  1. HUF
    Новорег

    Регистрация:
    29.07.2016
    Сообщения:
    39
    Симпатии:
    55
    Розыгрышей:
    0
    Всем привет.
    Модуль прикручиваем к вашему проекту с уже созданным IDirect3DDeviceX, в проекте он указан как Device;
    Текст
    Код (Text):
    1. unit sys_drawing;
    2.  
    3. interface
    4.  
    5. uses Windows, SysUtils, Classes, Direct3D9, D3DX9;
    6.  
    7. type
    8.   TDraw = class(TObject)
    9.     public
    10.       procedure FillRGB(x, y, w, h: Single; Color: D3DColor);
    11.       procedure LineVector(Pos1, Pos2: vec2_t; Color: D3DColor);
    12.       procedure Line(x1, y1, x2, y2: Single; Color: D3DColor);
    13.       procedure Text(x, y: Single; Text: string; color: D3DCOLOR);
    14.       procedure Box(x1, y1, w, h, thickness: single; color: D3DCOLOR);
    15.       procedure Circle(cx, cy, r: Single; color: D3DCOLOR);
    16.   end;
    17.  
    18. var
    19.   Draw: TDraw;
    20.  
    21. implementation
    22.  
    23. procedure TDraw.Circle(cx, cy, r: Single; color: D3DCOLOR);
    24. const
    25.   num_segments = 32;
    26. var
    27.   theta, c, s, t, x, y: Single;
    28.   i: Integer; vec: array [0..num_segments] of vec2_t;
    29. begin
    30.   theta := 2 * 3.14 / num_segments;
    31.   c := cos(theta);
    32.   s := sin(theta);
    33.  
    34.   x := r;
    35.   y := 0;
    36.  
    37.   vec[0].X := x + cx;
    38.   vec[0].Y := y + cy;
    39.   t := x;
    40.   x := c * x - s * y;
    41.   y := s * t + c * y;
    42.  
    43.   for i := 1 to num_segments - 1 do
    44.   begin
    45.     vec[i].X := x + cx;
    46.     vec[i].Y := y + cy;
    47.  
    48.     Draw.LineVector(vec[i - 1], vec[i], Color);
    49.  
    50.         t := x;
    51.         x := c * x - s * y;
    52.         y := s * t + c * y;
    53.   end;
    54.  
    55.   vec[num_segments].X := x + cx;
    56.   vec[num_segments].Y := y + cy;
    57.   Draw.LineVector(vec[num_segments - 1], vec[num_segments], Color);
    58. end;
    59.  
    60. procedure TDraw.Box(x1, y1, w, h, thickness: single; color: D3DCOLOR);
    61. var
    62.   Rec: TRect;
    63. begin
    64.   Draw.FillRGB(x1, y1, w, thickness, Color);
    65.   Draw.FillRGB(x1, y1, thickness, h, Color);
    66.  
    67.   Draw.FillRGB(x1 + w - 1, y1, thickness, h, Color);
    68.   Draw.FillRGB(x1, y1 + h, w, thickness, Color);
    69. end;
    70.  
    71. procedure TDraw.Text(x, y: Single; Text: string; color: D3DCOLOR);
    72. var
    73.   TextRect: TRect;
    74. begin
    75.   TextRect := Rect(Round(x),Round(y),35,35);
    76.   g_Font.DrawTextW(nil, PChar(Text), -1, @TextRect, DT_LEFT or DT_NOCLIP, color);
    77. end;
    78.  
    79. procedure TDraw.FillRGB(x, y, w, h: Single; Color: D3DColor);
    80. var
    81.   Rec: TRect;
    82. begin
    83.   Rec := Rect(Round(x), Round(y), Round(x + w), Round(y + h));
    84.   Device.Clear(1, @Rec, D3DClear_Target, color, 0, 0);
    85. end;
    86.  
    87. procedure TDraw.LineVector(Pos1, Pos2: vec2_t; Color: D3DColor);
    88. type
    89.   vertex = record
    90.     pos1, pos2, pos3, pos4: single;
    91.     color: d3dcolor;
    92.     end;
    93. var
    94.   qV: array [1..2] of vertex;
    95. begin
    96.   qV[1].pos1 := Pos1.x;
    97.   qV[1].pos2 := Pos1.y;
    98.   qV[1].pos3 := 0;
    99.   qV[1].pos4 := 3;
    100.   qv[1].color := color;
    101.  
    102.   qV[2].pos1 := Pos2.x;
    103.   qV[2].pos2 := Pos2.y;
    104.   qV[2].pos3 := 0;
    105.   qV[2].pos4 := 6;
    106.   qv[2].color := color;
    107.  
    108.   Device.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
    109.   Device.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    110.   Device.SetFVF(D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1);
    111.   Device.SetTexture(0, nil);
    112.   Device.DrawPrimitiveUP(D3DPT_LINELIST, 1, qV, sizeof(vertex));
    113. end;
    114.  
    115. procedure TDraw.Line(x1, y1, x2, y2: Single; Color: D3DColor);
    116. type
    117.   vertex = record
    118.     pos1, pos2, pos3, pos4: single;
    119.     color: d3dcolor;
    120.     end;
    121. var
    122.   qV: array [1..2] of vertex;
    123. begin
    124.   qV[1].pos1 := x1;
    125.   qV[1].pos2 := y1;
    126.   qV[1].pos3 := 0;
    127.   qV[1].pos4 := 3;
    128.   qv[1].color := color;
    129.  
    130.   qV[2].pos1 := x2;
    131.   qV[2].pos2 := y2;
    132.   qV[2].pos3 := 0;
    133.   qV[2].pos4 := 6;
    134.   qv[2].color := color;
    135.  
    136.   Device.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
    137.   Device.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    138.   Device.SetFVF(D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1);
    139.   Device.SetTexture(0, nil);
    140.   Device.DrawPrimitiveUP(D3DPT_LINELIST, 1, qV, sizeof(vertex));
    141. end;
    142.  
    143. end.


    В качестве примера пробуем вывести что-нибудь на экран:

    Текст
    Код (Text):
    1. procedure Render_Debug;
    2. begin
    3.   Draw.Text(Info.Width - 110, 20 + (FontSpacing * 1), '===============', D3DCOLOR_RGBA($7F, $7F, $7F, $FF));
    4.   Draw.Text(Info.Width - 110, 20 + (FontSpacing * 2), 'Debug:', D3DCOLOR_RGBA($FF, $FF, $FF, $FF));
    5.   Draw.Text(Info.Width - 110, 20 + (FontSpacing * 3), '===============', D3DCOLOR_RGBA($7F, $7F, $7F, $FF));
    6.  
    7.   Draw.FillRGB(Info.Width - 110, 20 + (FontSpacing * 5), 50, 10, D3DCOLOR_RGBA($7F, $00, $00, $FF));
    8.   Draw.Box(Info.Width - 60, 20 + (FontSpacing * 5), 50, 10, 1, D3DCOLOR_RGBA($00, $00, $FF, $FF));
    9.  
    10.   Draw.Line(Info.Width - 110, 20 + (FontSpacing * 7), Info.Width - 10, 20 + (FontSpacing * 7), D3DCOLOR_RGBA($00, $00, $FF, $FF));
    11.   Draw.Circle(Info.Width - 60, 20 + (FontSpacing * 7) + 50, 40, D3DCOLOR_RGBA($00, $00, $FF, $FF));
    12.   Draw.Text(Info.Width - 110, 20 + (FontSpacing * 8) + 80, '===============', D3DCOLOR_RGBA($7F, $7F, $7F, $FF));
    13. end;


    Скриншот прилагается: (правый верхний угол)
    [​IMG]


    [​IMG]

     
  2. Новорег

    Регистрация:
    20.01.2017
    Сообщения:
    13
    Симпатии:
    1
    Розыгрышей:
    0
    Картинку обнови!
     
Похожие темы
  1. Phantometry
    Ответов:
    619
    Просмотров:
    87.712
Загрузка...