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

Вниз

GMS файлы   Найти похожие ветки 

 
Dimanizm   (2003-10-21 23:50) [0]

Привет всем!!!В интернете очень много
говорится о GMS файлах на Delphi,а
я изучаю C++Builder.Помогите мне пожалуйста
с материалом по данной теме или помогите
переделать код.:
uses
 Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus,
 Controls, Dialogs, SysUtils, OpenGL, Math;

Type
   PGLVertex = ^TGLVertex;
   TGLVertex = record
      x,y,z : GLFloat;
   end;

   PGLVector = ^TGLVector;
   TGLVector = array[0..2] of GLFloat;

   PGLFace = ^TGLFace;
   TGLFace = array[0..2] of GLInt;

   PGLVertexArray = ^TGLVertexArray;
   TGLVertexArray = array[Word] of TGLVertex;

   PGLFacesArray = ^TGLFacesArray;
   TGLFacesArray = array[word] of TGLFace;

   TGLMesh = class
     Vertices : PGLVertexArray;
     Faces : PGLFacesArray;
     FasetNormals : PGLVertexArray;
     VertexCount : Integer;
     FacesCount : Integer;
     fExtent : GLFloat;
     Extent : GLBoolean;
     public
     procedure LoadFromFile( const FileName : String );
     procedure CalcNormals;
     procedure Draw;
     destructor Destroy; override;
   end;

   TGLMultyMesh = class
     Meshes : TList;
     CurrentFrame : Integer;
     Action : Boolean;
     fExtent : GLFloat;
     Extent : Boolean;
     public
     procedure LoadFromFile( const FileName : String );
     procedure Draw;
     constructor Create;
     destructor Destroy; override;
     published
   end;

implementation

procedure TGLMesh.CalcNormals;
var
 i : Integer;
 wrki, vx1, vy1, vz1, vx2, vy2, vz2 : GLfloat;
 nx, ny, nz : GLfloat;
 wrkVector : TGLVertex;
 wrkVector1, wrkVector2, wrkVector3 : TGLVertex;
 wrkFace : TGLFace;
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;

procedure TGLMesh.LoadFromFile;
var
  f : TextFile;
  S : String;
  i : Integer;
  Vertex : TGLVertex;
  Face : TGLFace;
  MaxVertex : GLFloat;
begin
  AssignFile(f,FileName);
  Reset(f);
  repeat
    ReadLn(f, S);
  until (S = "numverts numfaces") or eof(f);
  // Читаем количество вершин и граней
  Readln(f,VertexCount,FacesCount);
  // Выделяем память для хранения сетки
  GetMem(Vertices,VertexCount*SizeOf(TGLVertex));
  GetMem(Faces,FacesCount*SizeOf(TGLFace));
  GetMem(FasetNormals,FacesCount*SizeOf(TGLVector));

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

  ReadLn(f, S);
  ReadLn(f, S);
  // Считываем грани
  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;

  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;

procedure TGLMesh.Draw;
var
  i : Integer;
  Face : TGLFace;
begin
 for i := 0 to FacesCount - 1 do begin
   glBegin(GL_TRIANGLES);
     Face := Faces[i];
       glNormal3fv(@FasetNormals[i]);
       glVertex3fv(@Vertices[Face[0]]);
       glVertex3fv(@Vertices[Face[1]]);
       glVertex3fv(@Vertices[Face[2]]);
   glEnd;
 end;
end;

destructor TGLMesh.Destroy;
begin
  FreeMem(Vertices,VertexCount*SizeOf(TGLVertex));
  FreeMem(Faces,FacesCount*SizeOf(TGLFace));
  FreeMem(FasetNormals,FacesCount*SizeOf(TGLVector));
end;

procedure TGLMultyMesh.LoadFromFile;
var
  f : TextFile;
  S : String;

  procedure ReadNextMesh;
    var
       i : Integer;
   Vertex : TGLVertex;
   Face : TGLFace;
   MaxVertex : GLFloat;
       NextMesh : TGLMesh;
    begin
       NextMesh := TGLMesh.Create;
       repeat
         ReadLn(f, S);
       until (S = "numverts numfaces") or eof(f);
       // Читаем количество вершин и граней
       Readln(f,NextMesh.VertexCount,NextMesh.FacesCount);
       // Выделяем память для хранения сетки
       GetMem(NextMesh.Vertices,NextMesh.VertexCount*SizeOf(TGLVertex));
       GetMem(NextMesh.Faces,NextMesh.FacesCount*SizeOf(TGLFace));
       GetMem(NextMesh.FasetNormals,NextMesh.FacesCount*SizeOf(TGLVector));

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

       ReadLn(f,S); // Пропускаем строку end vertices
       ReadLn(f,S); // Пропускаем строку Mesh faces:
       // Считываем грани
       for i := 0 to NextMesh.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;
           NextMesh.Faces[i] := Face;
         end;

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

      NextMesh.CalcNormals;

      Meshes.Add(NextMesh);
    end;
begin
  Meshes := TList.Create;
  AssignFile(f,FileName);
  Reset(f);
  While not Eof(f) do begin
    Readln(f,S);
    if S = "New object" then ReadNextMesh;
  end;
  CloseFile(f);
end;

procedure TGLMultyMesh.Draw;
begin
 if Extent then
    begin
      fExtent := TGLMesh(Meshes.Items[CurrentFrame]).fExtent;
      glScalef(fExtent,fExtent,fExtent);
    end;

 TGLMesh(Meshes.Items[CurrentFrame]).Draw;

 if Action then begin
   inc(CurrentFrame);
   if CurrentFrame > (Meshes.Count - 1) then CurrentFrame := 0;
 end;
end;

constructor TGLMultyMesh.Create;
begin
 Action := False;
 CurrentFrame := 0;
end;

destructor TGLMultyMesh.Destroy;
Var i : Integer;
begin
 for i := 0 to Meshes.Count - 1 do
   begin
     TGLMesh(Meshes.Items[i]).Destroy;
   end;
 Meshes.Free;  
end;

end.

ЗАРАНЕЕ БЛАГОДАРЕН!!!


 
cyborg ©   (2003-10-22 01:38) [1]

Обычно проблема стоит наоборот :)


 
misterix   (2003-10-22 14:10) [2]

Материал по данной проблеме лежит на Королевстве Дельфи в разделе Подземелье Магов



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

Форум: "Игры";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.033 c
4-1076174980
nester
2004-02-07 20:29
2004.04.18
Как внедриться в OutlookExpress.


6-1077030273
Maksss
2004-02-17 18:04
2004.04.18
Socket


1-1080457552
BVV
2004-03-28 11:05
2004.04.18
TreeView


1-1080473614
Dzhon
2004-03-28 15:33
2004.04.18
Как создать глобальный обработчик?


14-1080270229
an-na2002
2004-03-26 06:03
2004.04.18
Файл . И ,





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский