Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.03.23;
Скачать: CL | DM;

Вниз

Как создавать Meshes через буфер вершин?   Найти похожие ветки 

 
dr_creigan   (2007-10-13 13:04) [0]

Как создавать Meshes через буфер вершин - можно полный исходник.
подойдут любые среды, кроме Visual C++ MFC - она у меня при переводе не прокатила. - у меня directX 9.0 SDK, если что.


 
Elec3C ©   (2007-10-13 13:17) [1]

unit DXMGPlayer;

interface

uses
windows,Math,Direct3D8;

const
D3DFVF_CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_DIFFUSE;

type    //Базовые и общие типы
       //n 004
 D3DFloat = Single;

 PD3DCustomVertex = ^ TD3DCustomVertex;
 TD3DCustomVertex = packed record
   X, Y, Z : D3DFloat;
   Color : DWORD;
 end;

 D3DInt = Integer;
 WRDType = Word;
 D3DBoolean = ByteBool;
 ICustomDirect3D = IDirect3D8;
 ICustomDirect3DDevice = IDirect3DDevice8;
 ICustomDirect3DVertexBuffer = IDirect3DVertexBuffer8;
      //k 004
type
      //n 005 нужные типы
 PD3D = ^ICustomDirect3D ;
 PD3DDevice= ^ ICustomDirect3DDevice;
 PD3DVertexBuffer = ^ ICustomDirect3DVertexBuffer;

 TD3DVertex=TD3DCustomVertex;
 PD3DVertex=^ TD3DVertex;

 TD3DVector = array[0..2] of D3DFloat;
 PD3DVector = ^TD3DVector;

 TD3DFace = array[0..2] of D3DInt;
 PD3DFace = ^TD3DFace;

 TD3DVertexArray = array[WRDType] of TD3DVertex;
 PD3DVertexArray = ^TD3DVertexArray;

 TD3DFacesArray = array[WRDType] of TD3DFace;
 PD3DFacesArray = ^TD3DFacesArray;
      //k 005
 TD3DMesh = class
   Vertices : PD3DVertexArray; // Массив вершин
   Faces : PD3DFacesArray;   // Массив граней
   FasetNormals : PD3DVertexArray; // Массив фасетных нормалей
   SmoothNormals : PD3DVertexArray; // Массив сглаживающих нормалей
   VertexCount : Integer;  // Число вершин
   FacesCount : Integer;   // Число граней
   FExtent : D3DFloat;      // Масштабный коэффициент
   Extent : D3DBoolean;     // Флаг масштабирования
   D3DVB : ICustomDirect3DVertexBuffer;
  public
   DefaultColor : DWORD;
   D3D : PD3D;
   D3DDevice : PD3DDevice;
   procedure LoadFromFile( const FileName : String );
   procedure CalcNormals;
   procedure Draw(Smooth : Boolean);
   procedure InitVertexBuffer;
   destructor Destroy; override;
 end;

implementation

uses Unit1;

{ TD3DMesh }
var
x:D3DFloat;

procedure TD3DMesh.CalcNormals;
var
 i : Integer;
 wrki, vx1, vy1, vz1, vx2, vy2, vz2 : D3DFloat;
 nx, ny, nz : D3DFloat;
 wrkVector : TD3DVertex;
 wrkVector1, wrkVector2, wrkVector3 : TD3DVertex;
 wrkFace : TD3DFace;
begin
 For i := 0 to FacesCount - 1 do begin
    wrkFace := Faces[i];
    wrkVector1 := Vertices[wrkFace[0]];
    wrkVector2 := Vertices[wrkFace[1]];
    wrkVector3 := Vertices[wrkFace[2]];

    vx1 := wrkVector1.x - wrkVector2.x;
    vy1 := wrkVector1.y - wrkVector2.y;
    vz1 := wrkVector1.z*fExtent - wrkVector2.z*fExtent;

    vx2 := wrkVector2.x - wrkVector3.x;
    vy2 := wrkVector2.y - wrkVector3.y;
    vz2 := wrkVector2.z - wrkVector3.z;
    // вектор перпендикулярен центру треугольника
    nx := vy1 * vz2 - vz1 * vy2;
    ny := vz1 * vx2 - vx1 * vz2;
    nz := vx1 * vy2 - vy1 * vx2;
    // получаем унитарный вектор единичной длины
    wrki := sqrt (nx * nx + ny * ny + nz * nz);
    If wrki = 0 then wrki := 1; // для предотвращения деления на ноль

    wrkVector.x := nx / wrki;
    wrkVector.y := ny / wrki;
    wrkVector.z := nz / wrki;

    FasetNormals[i] := wrkVector;
 end;
end;

destructor TD3DMesh.Destroy;
begin
 if not (D3DVB = nil) then
  begin
   D3DVB._Release;
   D3DVB:=nil;
  end
                  else
  D3DVB:=nil;
 inherited;
end;

procedure TD3DMesh.Draw(Smooth: Boolean);//рисование
begin  //n 006
  D3DDevice.DrawPrimitive(D3DPT_TRIANGLELIST,0,FacesCount);
end; //k 006

procedure TD3DMesh.InitVertexBuffer;
var
  Face : TD3DFace;
  i : Integer;
  aVerticesArray : PD3DVertexArray;
  VerArr : ^ TD3DCustomVertex;
  h:HRESULT;
begin
  D3DVB:=nil;
  {GetMem(aVerticesArray,FacesCount*sizeof(TD3DCustomVertex));
  for i:=0 to FacesCount-1 do
   begin
    Face:=Faces[i];
    aVerticesArray[i].X:=vertices[Face[0]].X;
    aVerticesArray[i].Y:=vertices[Face[0]].y;
    aVerticesArray[i].Z:=vertices[Face[0]].z;
    aVerticesArray[i].Color:=DefaultColor;

    aVerticesArray[i].X:=vertices[Face[1]].X;
    aVerticesArray[i].Y:=vertices[Face[1]].y;
    aVerticesArray[i].Z:=vertices[Face[1]].z;
    aVerticesArray[i].Color:=DefaultColor;

    aVerticesArray[i].X:=vertices[Face[2]].X;
    aVerticesArray[i].Y:=vertices[Face[2]].y;
    aVerticesArray[i].Z:=vertices[Face[2]].z;
    aVerticesArray[i].Color:=DefaultColor;
   end;  }
  h:=D3DDevice.CreateVertexBuffer(FacesCount*sizeof(TD3DCustomVertex),D3DUSAGE_WRI TEONLY,
       D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,D3DVB);
  D3DDevice.SetStreamSource(1,D3DVB,sizeof(TD3DCustomVertex));
  D3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);
  D3DVB.Lock(0,FacesCount*sizeof(TD3DCustomVertex),pbyte(VerArr),0);
  //Move(aVerticesArray,VerArr^,sizeof(aVerticesArray));
  for i:=0 to FacesCount-1 do
   begin
    verArr.X:=-1;
    VerArr.Y:=1;
    VerArr.Z:=0;
    VerArr.Color:=DefaultColor;
    Inc(VerArr);
    {Face:=Faces[i];
    VerArr.X:=vertices[Face[0]].X;
    VerArr.Y:=vertices[Face[0]].y;
    VerArr.Z:=vertices[Face[0]].z;
    VerArr.Color:=DefaultColor;
    Inc(VerArr);

    VerArr.X:=vertices[Face[1]].X;
    VerArr.Y:=vertices[Face[1]].y;
    VerArr.Z:=vertices[Face[1]].z;
    VerArr.Color:=DefaultColor;
    Inc(VerArr);

    VerArr.X:=vertices[Face[1]].X;
    VerArr.Y:=vertices[Face[1]].y;
    VerArr.Z:=vertices[Face[1]].z;
    VerArr.Color:=DefaultColor;
    Inc(VerArr);    }
   end;  
  D3DVB.Unlock;
end;


 
ElectriC   (2007-10-13 13:18) [2]

procedure TD3DMesh.LoadFromFile;
var
  f : TextFile;
  S : String;
  i : Integer;
  Vertex : TD3DVertex;
  Normal : TD3DVertex;
  SNormal : TD3DVertex;
  Face : TD3DFace;
  MaxVertex : D3DFloat;
begin        //n 001
  {FacesCount:=1;
  GetMem(Vertices,3*SizeOf(TD3DVertex));
  GetMem(Faces,1*SizeOf(TD3DVector));
  Vertices[0].X:=0;
  Vertices[0].y:=0;
  Vertices[0].z:=1;
  Vertices[0].Color:=DefaultColor;
  Vertices[1].X:=0;
  Vertices[1].y:=0;
  Vertices[1].z:=-1.5;
  Vertices[1].Color:=DefaultColor;
  Vertices[2].X:=0;
  Vertices[2].y:=0;
  Vertices[2].z:=-1.5;
  Vertices[2].Color:=DefaultColor;
  Face[0]:=0;
  Face[1]:=1;
  Face[2]:=2;
  Faces[0]:=Face;
  FExtent:=0.7;      }
  AssignFile(f,FileName);
  Reset(f);
  repeat
    ReadLn(f, S);
  until (S = "numverts numfaces") or eof(f);
  Readln(f,VertexCount,FacesCount);   // Читаем количество вершин и граней
  GetMem(Vertices,VertexCount*SizeOf(TD3DVertex)); // Выделяем память для хранения сетки
  GetMem(SmoothNormals,VertexCount*SizeOf(TD3DVector));
  GetMem(Faces,FacesCount*SizeOf(TD3DFace));
  GetMem(FasetNormals,FacesCount*SizeOf(TD3DVector));

  ReadLn(f, S); // Пропускаем строку Mesh vertices:
  for i := 0 to VertexCount - 1 do    // Считываем вершины
    begin
      Readln(f,Vertex.x,Vertex.y,Vertex.z);
      Vertices[i] := Vertex;
    end;

  ReadLn(f, S); // Пропустим строку end vertices
  ReadLn(f, S); // Пропустим строку Mesh faces:
  for i := 0 to FacesCount - 1 do     // Считываем грани
    begin
      Readln(f,Face[0],Face[1],Face[2]);
      Face[0] := Face[0] - 1;
      Face[1] := Face[1] - 1;
      Face[2] := Face[2] - 1;
      Faces[i] := Face;
    end;

  ReadLn(f, S); // Пропустим строку end faces
  ReadLn(f, S); // Пропустим строку Faset normals:
  // фасетные нормали
  for i := 0 to FacesCount - 1 do
    begin
      Readln(f,Normal.x,Normal.y,Normal.z);
      FasetNormals[i] := Normal;
    end;

  ReadLn(f, S); // Пропустим строку end faset normals
  ReadLn(f, S); // Пропустим строку Smooth normals:
  // Считываем сглаживающие нормали
  for i := 0 to VertexCount - 1 do
    begin
      Readln(f,SNormal.x,SNormal.y,SNormal.z);
      SmoothNormals[i] := SNormal;
    end;

  CloseFile(f);

  // Рассчитываем масштаб
  MaxVertex := 0;
  for i := 0 to VertexCount - 1 do
    begin
      MaxVertex := Max(MaxVertex,Vertices[i].x);
      MaxVertex := Max(MaxVertex,Vertices[i].y);
      MaxVertex := Max(MaxVertex,Vertices[i].z);
    end;
  fExtent := 1/MaxVertex;  

  //CalcNormals;
end;   //k 001

end.

P.S. Перевод на DX9 не займёт никакой сложности.


 
ElectriC   (2007-10-13 13:21) [3]

Пример модели: http://slil.ru/24973625


 
dr_creigan   (2007-10-15 10:21) [4]

Всё бы ничего, да только повторю У МЕНЯ DirectX9.0 SDK. И строка
D3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);
там по другому. Я пробовал на 8 писать - там всё нормально, а вот на девятом SetVertexShader имеет 2 параметра. первый DWORD, второй - сам Shader, из которого загружать. Так что думайте....


 
Help   (2007-10-15 19:01) [5]


>  Так что думайте....

Я за тебя ещё и думать должен! Думай-ка лучше сам:\ Тебе ж надо!


 
Elec3C ©   (2007-10-15 19:02) [6]

:\


 
dr_creigan   (2007-10-17 11:53) [7]

Нет, ну если не получается, то по-моему лучше посоветоваться со знающими. А то что не получается по переводу из Directx8.0 в DirectX9.0, - это уже не от меня зависит - так уж была оформлена девятая часть директа...


 
Elec3C ©   (2007-10-17 15:23) [8]

Перевести я могу, но не буду)) Подумай лучше - перевести оч легко.


 
dr_creigan   (2007-10-19 12:52) [9]

Удалено модератором


 
Elec3C ©   (2007-10-19 18:13) [10]

Удалено модератором


 
dr_creigan   (2007-10-27 08:55) [11]

Удалено модератором


 
Мистер Т   (2007-10-27 08:57) [12]

В DirectX SDK все написано.
Так что RTFM


 
Elec3C ©   (2007-10-28 02:50) [13]

Удалено модератором


 
dr_creigan   (2007-11-15 14:55) [14]

Удалено модератором


 
@!!ex ©   (2007-11-15 15:42) [15]

Удалено модератором


 
Игорь Шевченко ©   (2007-11-16 11:34) [16]

Напоминаю, что бан неизбежен, как кризис империализма.



Страницы: 1 вся ветка

Текущий архив: 2014.03.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1380832202
Юрий
2013-10-04 00:30
2014.03.23
С днем рождения ! 4 октября 2013 пятница


2-1370095621
Cobalt
2013-06-01 18:07
2014.03.23
TReader error: Invalid property value


15-1381005002
Юрий
2013-10-06 00:30
2014.03.23
С днем рождения ! 6 октября 2013 воскресенье


15-1380924488
xayam
2013-10-05 02:08
2014.03.23
Помогите распознать мелодию


15-1381091402
Юрий
2013-10-07 00:30
2014.03.23
С днем рождения ! 7 октября 2013 понедельник