Ваш ключ: необходима авторизация | MyProxy - бесплатный обменник валидных прокси между пользователями форума.

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

Тема в разделе Гайды, исходы от местных кодеров, создана пользователем Ve4niySooN, 4 янв 2016.

Войдите для ответа
  1. Ve4niySooN Разработчик

    Ve4niySooN
    Команда форума
    Статус:
    Вне сети
    Сообщения:
    58
    Симпатии:
    62
    Регистрация:
    01.06.15
    Всем привет.
    Модуль прикручиваем к вашему проекту с уже созданным IDirect3DDeviceX, в проекте он указан как Device;

    unit sys_drawing;
    
    interface
    
    uses Windows, SysUtils, Classes, Direct3D9, D3DX9;
    
    type
      TDraw = class(TObject)
        public
          procedure FillRGB(x, y, w, h: Single; Color: D3DColor);
          procedure LineVector(Pos1, Pos2: vec2_t; Color: D3DColor);
          procedure Line(x1, y1, x2, y2: Single; Color: D3DColor);
          procedure Text(x, y: Single; Text: string; color: D3DCOLOR);
          procedure Box(x1, y1, w, h, thickness: single; color: D3DCOLOR);
          procedure Circle(cx, cy, r: Single; color: D3DCOLOR);
      end;
    
    var
      Draw: TDraw;
    
    implementation
    
    procedure TDraw.Circle(cx, cy, r: Single; color: D3DCOLOR);
    const
      num_segments = 32;
    var
      theta, c, s, t, x, y: Single;
      i: Integer; vec: array [0..num_segments] of vec2_t;
    begin
      theta := 2 * 3.14 / num_segments;
      c := cos(theta);
      s := sin(theta);
    
      x := r;
      y := 0;
    
      vec[0].X := x + cx;
      vec[0].Y := y + cy;
      t := x;
      x := c * x - s * y;
      y := s * t + c * y;
    
      for i := 1 to num_segments - 1 do
      begin
        vec[i].X := x + cx;
        vec[i].Y := y + cy;
    
        Draw.LineVector(vec[i - 1], vec[i], Color);
    
            t := x;
            x := c * x - s * y;
            y := s * t + c * y;
      end;
    
      vec[num_segments].X := x + cx;
      vec[num_segments].Y := y + cy;
      Draw.LineVector(vec[num_segments - 1], vec[num_segments], Color);
    end;
    
    procedure TDraw.Box(x1, y1, w, h, thickness: single; color: D3DCOLOR);
    var
      Rec: TRect;
    begin
      Draw.FillRGB(x1, y1, w, thickness, Color);
      Draw.FillRGB(x1, y1, thickness, h, Color);
    
      Draw.FillRGB(x1 + w - 1, y1, thickness, h, Color);
      Draw.FillRGB(x1, y1 + h, w, thickness, Color);
    end;
    
    procedure TDraw.Text(x, y: Single; Text: string; color: D3DCOLOR);
    var
      TextRect: TRect;
    begin
      TextRect := Rect(Round(x),Round(y),35,35);
      g_Font.DrawTextW(nil, PChar(Text), -1, @TextRect, DT_LEFT or DT_NOCLIP, color);
    end;
    
    procedure TDraw.FillRGB(x, y, w, h: Single; Color: D3DColor);
    var
      Rec: TRect;
    begin
      Rec := Rect(Round(x), Round(y), Round(x + w), Round(y + h));
      Device.Clear(1, @Rec, D3DClear_Target, color, 0, 0);
    end;
    
    procedure TDraw.LineVector(Pos1, Pos2: vec2_t; Color: D3DColor);
    type
      vertex = record
        pos1, pos2, pos3, pos4: single;
        color: d3dcolor;
        end;
    var
      qV: array [1..2] of vertex;
    begin
      qV[1].pos1 := Pos1.x;
      qV[1].pos2 := Pos1.y;
      qV[1].pos3 := 0;
      qV[1].pos4 := 3;
      qv[1].color := color;
    
      qV[2].pos1 := Pos2.x;
      qV[2].pos2 := Pos2.y;
      qV[2].pos3 := 0;
      qV[2].pos4 := 6;
      qv[2].color := color;
    
      Device.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
      Device.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
      Device.SetFVF(D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1);
      Device.SetTexture(0, nil);
      Device.DrawPrimitiveUP(D3DPT_LINELIST, 1, qV, sizeof(vertex));
    end;
    
    procedure TDraw.Line(x1, y1, x2, y2: Single; Color: D3DColor);
    type
      vertex = record
        pos1, pos2, pos3, pos4: single;
        color: d3dcolor;
        end;
    var
      qV: array [1..2] of vertex;
    begin
      qV[1].pos1 := x1;
      qV[1].pos2 := y1;
      qV[1].pos3 := 0;
      qV[1].pos4 := 3;
      qv[1].color := color;
    
      qV[2].pos1 := x2;
      qV[2].pos2 := y2;
      qV[2].pos3 := 0;
      qV[2].pos4 := 6;
      qv[2].color := color;
    
      Device.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
      Device.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
      Device.SetFVF(D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1);
      Device.SetTexture(0, nil);
      Device.DrawPrimitiveUP(D3DPT_LINELIST, 1, qV, sizeof(vertex));
    end;
    
    end.
    В качестве примера пробуем вывести что-нибудь на экран:
    procedure Render_Debug;
    begin
      Draw.Text(Info.Width - 110, 20 + (FontSpacing * 1), '===============', D3DCOLOR_RGBA($7F, $7F, $7F, $FF));
      Draw.Text(Info.Width - 110, 20 + (FontSpacing * 2), 'Debug:', D3DCOLOR_RGBA($FF, $FF, $FF, $FF));
      Draw.Text(Info.Width - 110, 20 + (FontSpacing * 3), '===============', D3DCOLOR_RGBA($7F, $7F, $7F, $FF));
    
      Draw.FillRGB(Info.Width - 110, 20 + (FontSpacing * 5), 50, 10, D3DCOLOR_RGBA($7F, $00, $00, $FF));
      Draw.Box(Info.Width - 60, 20 + (FontSpacing * 5), 50, 10, 1, D3DCOLOR_RGBA($00, $00, $FF, $FF));
    
      Draw.Line(Info.Width - 110, 20 + (FontSpacing * 7), Info.Width - 10, 20 + (FontSpacing * 7), D3DCOLOR_RGBA($00, $00, $FF, $FF));
      Draw.Circle(Info.Width - 60, 20 + (FontSpacing * 7) + 50, 40, D3DCOLOR_RGBA($00, $00, $FF, $FF));
      Draw.Text(Info.Width - 110, 20 + (FontSpacing * 8) + 80, '===============', D3DCOLOR_RGBA($7F, $7F, $7F, $FF));
    end;
    Скриншот прилагается: (правый верхний угол)
    [​IMG]
     
    4 янв 2016 #1
  2. Ve4niySooN Разработчик

    Ve4niySooN
    Команда форума
    Статус:
    Вне сети
    Сообщения:
    58
    Симпатии:
    62
    Регистрация:
    01.06.15
    Упрощённый вывод линий. Заменить функции из первого поста этими, при надобности:

    var
      g_Line: ID3DXLine;
    D3DXCreateLine(Device, g_Line);
    procedure TDraw.LineVector(Pos1, Pos2: vec2_t; w: single; Color: D3DColor);
    var
      qV: array [1..2] of D3DXVECTOR2;
    begin
      qV[1].x := Pos1.x;
      qV[1].y := Pos1.y;
      qV[2].x := Pos2.x;
      qV[2].y := Pos2.y;
    
      g_Line.SetWidth(w);
      g_Line._Begin;
        g_Line.Draw(@qV, 2, color);
      g_Line._End;
    end;
    
    procedure TDraw.Line(x1, y1, x2, y2, w: Single; Color: D3DColor);
    var
      qV: array [1..2] of D3DXVECTOR2;
    begin
      qV[1].x := x1;
      qV[1].y := y1;
      qV[2].x := x2;
      qV[2].y := y2;
    
      g_Line.SetWidth(w);
      g_Line._Begin;
        g_Line.Draw(@qV, 2, color);
      g_Line._End;
    end;
     
    11 янв 2016 #2
Загрузка...
Похожие темы
  1. Ve4niySooN
    Ответов:
    3
    Просмотров:
    1.188
Top