unit im1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  dddd, d3d, d3dtypes, d3dcaps, StdCtrls;

type
  TForm1 = class(TForm)
    DDDD1: TDDDD;
    Label1: TLabel;
    procedure DDDD1Init(Sender: TObject; fNeedChange: Boolean);
    procedure FormClick(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    Tex:TDDDDTexture;             //テクスチャ
  end;

var
  Form1: TForm1;

implementation


{$R *.DFM}

procedure TForm1.DDDD1Init(Sender: TObject; fNeedChange: Boolean);
var
  viewParam:D3DVIEWPORT7;
begin
  //ビューポートの特性
  with viewParam do begin
    dwX:=0; dwY:=0;                        //レンダリングが施される左上座標
    dwWidth:=DDDD1.BackBuffer.Width;       //レンダリングが施される範囲
    dwHeight:=DDDD1.BackBuffer.Height;
    dvMinZ:=0;
    dvMaxZ:=1.0;
  end;

  //ビューポートの特性を指定する
  DDDD1.D3DDevice.SetViewport(@viewParam);

  //テクスチャオブジェクトの生成
  Tex:=TDDDDTexture.Create(DDDD1, 128,128,0,'');      //DDDDオブジェクトを指定して生成
  Tex.LoadBMP('texture.bmp');  //BMPファイルを読ませる

end;


procedure TForm1.FormClick(Sender: TObject);
var
  TLVs :Array[0..3] of D3DTLVertex;  //テクスチャ貼ったポリゴンの座標
  clearRect:D3DRect;
  function MakeTLV(_x,_y,_z,_rhw:Single; _col,_sp:DWord; _tu,_tv:Single):D3DTLVertex;
  begin
    with result do begin
      sx:=_x;
      sy:=_y;
      sz:=_z;
      rhw:=_rhw;
      color:=_col;
      specular:=_sp;
      tu:=_tu;
      tv:=_tv;
    end;
  end;
begin
  //画面クリア
  with clearRect do begin
    x1:=0;
    y1:=0;
    x2:=DDDD1.BackBuffer.Width;
    y2:=DDDD1.BackBuffer.Height;
  end;

  //DDDD1.D3DOptionsにMakeZBufferを入れてないので、ZBufferはクリアしない
  asm finit; end;
  DDDD1.D3DDevice.Clear(1,@clearRect,D3DCLEAR_TARGET, $FFFF8000, 1.0, 0); //背景はオレンジ色

  //頂点座標の設定
  //                x   y    z   rhw   diffuse  specular  tu   tv
  TLVs[0]:=MakeTLV(100,100, 0.5, 0.2, $80FFFFFF,    0,    0,   0  );
  TLVs[1]:=MakeTLV(200,100, 0.5, 0.2, $80FFFFFF,    0,    1.0, 0  );
  TLVs[2]:=MakeTLV(100,200, 0.5, 0.2, $80FFFFFF,    0,    0,   1.0);
  TLVs[3]:=MakeTLV(200,200, 0.5, 0.2, $80FFFFFF,    0,    1.0, 1.0);

  DDDD1.D3DDevice.SetTexture(0, Tex.Surface);

  asm finit; end;

  DDDD1.D3DDevice.BeginScene;
  asm finit; end;

  (* レンダリングステートの設定 *)


  //ポリゴンの色とテクセルをどうブレンドするかを設定
  with DDDD1.D3DDevice do begin
    //R,G,Bについて
    SetTextureStageState(0, D3DTSS_COLORARG1, Integer(D3DTA_TEXTURE));    //ARG1 = テクセル
    SetTextureStageState(0, D3DTSS_COLOROP, Integer(D3DTOP_SELECTARG1));  //ARG1をそのまま使う

    //Aについて
    SetTextureStageState(0, D3DTSS_ALPHAARG1, Integer(D3DTA_TEXTURE));  //テクセルの色と
    SetTextureStageState(0, D3DTSS_ALPHAARG2, Integer(D3DTA_DIFFUSE));  //頂点のDIFFUSE要素を
    SetTextureStageState(0, D3DTSS_ALPHAOP, Integer(D3DTOP_MODULATE));  //掛け算して256で割る
  end;

  //　↑で決定されたポリゴン & テクスチャ(= SRC) と、下地の色(= DEST)をどうブレンドする？
  with DDDD1.D3DDevice do begin
    //ブレンディングするよ〜
    SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,Integer(True));

    //下地とSRCを、SRCのα要素で混合
    SetRenderState(D3DRENDERSTATE_DESTBLEND,  Integer(D3DBLEND_INVSRCALPHA));
    SetRenderState(D3DRENDERSTATE_SRCBLEND,   Integer(D3DBLEND_SRCALPHA));
  end;

  asm finit; end;
  DDDD1.D3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_TLVERTEX,@TLVs,4, D3DDP_WAIT);
  asm finit; end;

  DDDD1.D3DDevice.EndScene;
  asm finit; end;


  DDDD1.Flip;
end;

end.
