Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];

Вниз

Как создавать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
15-1380974929
uw
2013-10-05 16:08
2014.03.23
Контроллер и Ethernet


2-1369985084
Owl
2013-05-31 11:24
2014.03.23
работа с TStringStream


1-1323258416
Kamilos
2011-12-07 15:46
2014.03.23
Как сделать чтобы Image изменялся вместе с формой?


15-1380629744
aka
2013-10-01 16:15
2014.03.23
аналог TImage


1-1323639179
RAD
2011-12-12 01:32
2014.03.23
Удалить файл, открытый другим процессом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский