Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BSP и 3DS, Конвертор BSP в MaxScript 
:(
    Опции темы
dvamaster
Дата 5.8.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: нет
Всего: 10



Доброго времени суток!!!

Пытаюсь конвертить BSP для открытия в 3DS Max'е

Перевожу в MaxScript (проще некуда)

Вот Код:

Код

program bsp2mp;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  BSPUnit in 'BSPUnit.pas';

var
  fnbsp: PChar = 'de_dust.bsp';
  fnmp: String;

  hbspf, hms: THandle;

  pdh: pdheader_t = nil;
  pvertexlump: pvectora= nil;
  nvertex: Integer;
  pfacelump: pdface_ta = nil;
  nface: Integer;
  pedgelump: pdedge_ta = nil;
  nedge: Integer;
  psurfedgelump: PIntegerArray = nil;
  nsurfedge: Integer;

  t: DWord;

procedure WriteData;
var
  i, j, fse, e, v1, v2: Integer;
  s: String;
begin
  s := 'bspo = editable_mesh name:(uniquename "BSP Object")'#13#10'convertTo bspo (Editable_Poly)'#13#10;
  WriteFile(hms, s[1], Length(s), t, nil);
  for i := 0 to nvertex - 1 do
    begin
      s := 'polyOp.createVert bspo [' + FloatToStr(pvertexlump^[i].x) + ', ' + FloatToStr(pvertexlump^[i].y) + ', ' + FloatToStr(pvertexlump^[i].z) + ']'#13#10;
      WriteFile(hms, s[1], Length(s), t, nil);
    end;
  for i := 0 to nface - 1 do
    begin
      s := 'polyOp.createPolygon bspo #(';
      fse := pfacelump^[i].firstedge;
      for j := 0 to pfacelump^[i].numedges - 1 do
        begin
          e := psurfedgelump^[j];
          if e < 0 then
            begin
              v1 := pedgelump^[Abs(e)].v[1];
              v2 := pedgelump^[Abs(e)].v[0]
            end else
            begin
              v1 := pedgelump^[Abs(e)].v[0];
              v2 := pedgelump^[Abs(e)].v[1]
            end;
          if j = pfacelump^[i].numedges - 1 then
            s := s + IntToStr(v1 + 1) + ', ';
          s := s + IntToStr(v2 + 1);
          if j <> pfacelump^[i].numedges - 1 then
            s := s + ', '
        end;
      s := s + ')'#13#10;
      WriteFile(hms, s[1], Length(s), t, nil);
    end;
end;

begin
  DecimalSeparator := '.';
  hbspf := CreateFile(fnbsp, GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hbspf = INVALID_HANDLE_VALUE then
    begin
      WriteLn('Error Open "' + fnbsp + '"');
      ReadLn;
      Exit
    end;
  WriteLn('Open "' + fnbsp + '"'#13#10);
  GetMem(pdh, SizeOf(dheader_t));
  ReadFile(hbspf, pdh^, SizeOf(dheader_t), t, nil);
  WriteLn('ident: ' + String(pdh^.ident));
  WriteLn('version: ' + IntToStr(pdh^.version));
  WriteLn('mapRevision: ' + IntToStr(pdh^.mapRevision));
  WriteLn;
  GetMem(pvertexlump, pdh^.lumps[3].filelen);
  nvertex := pdh^.lumps[3].filelen div 12;
  SetFilePointer(hbspf, pdh^.lumps[3].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, pvertexlump^, pdh^.lumps[3].filelen, t, nil);
  WriteLn('Readed Vertex Lump');
  GetMem(pfacelump, pdh^.lumps[7].filelen);
  nface := pdh^.lumps[7].filelen div 56;
  SetFilePointer(hbspf, pdh^.lumps[7].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, pfacelump^, pdh^.lumps[7].filelen, t, nil);
  WriteLn('Readed Face Lump');
  GetMem(pedgelump, pdh^.lumps[12].filelen);
  nedge := pdh^.lumps[12].filelen div 4;
  SetFilePointer(hbspf, pdh^.lumps[12].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, pedgelump^, pdh^.lumps[12].filelen, t, nil);
  WriteLn('Readed Edge Lump');
  GetMem(psurfedgelump, pdh^.lumps[13].filelen);
  nsurfedge := pdh^.lumps[13].filelen div 4;
  SetFilePointer(hbspf, pdh^.lumps[13].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, psurfedgelump^, pdh^.lumps[13].filelen, t, nil);
  WriteLn('Readed SurfEdge Lump');
  CloseHandle(hbspf);
  fnmp := ChangeFileExt(fnbsp, '.ms');
  if FileExists(fnmp) then
    DeleteFile(fnmp);
  hms := CreateFile(PChar(fnmp), GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
  WriteData;
  WriteLn('Writed ' + fnmp);
  WriteLn;
  WriteLn('For Exit Press Enter');
  CloseHandle(hms);
  FreeMem(psurfedgelump);
  FreeMem(pedgelump);
  FreeMem(pfacelump);
  FreeMem(pvertexlump);
  FreeMem(pdh);
  ReadLn;
end.

Это BSPUnit

Код

unit BSPUnit;

interface

uses
  Windows;

type
  pvector = ^vector;
  vector = record
    x: Single;
    y: Single;
    z: Single;
  end;
  pvectora = ^vectora;
  vectora = array [0..65535] of vector;

  plump_t = ^lump_t;
  lump_t = record
    fileofs: Integer;
    filelen: Integer;
    version: Integer;
    fourCC: array [0..3] of Char;
  end;

  pdheader_t = ^dheader_t;
  dheader_t = record
    ident: array [0..3] of Char;
    version: Integer;
    lumps: array [0..63] of lump_t;
    mapRevision: Integer;
  end;

  pdedge_t = ^dedge_t;
  dedge_t = record
    v: array [0..1] of Word;
  end;
  pdedge_ta = ^dedge_ta;
  dedge_ta = array [0..262143] of dedge_t;

  pdface_t = ^dface_t;
  dface_t = record
    planenum: Word;
    side: Byte;
    onNode: Byte;
    firstedge: Integer;
    numedges: Word;
    texinfo: Word;
    dispinfo: Word;
    surfaceFogVolumeID: Word;
    styles: array [0..3] of Byte;
    lightofs: Integer;
    area: Single;
    LightmapTextureMinsInLuxels: array [0..1] of Integer;
    LightmapTextureSizeInLuxels: array [0..1] of Integer;
    origFace: Integer;
    numPrims: Word;
    firstPrimID: Word;
    smoothingGroups: DWord;
  end;
  pdface_ta = ^dface_ta;
  dface_ta = array [0..65535] of dface_t;

implementation

end.


Но вот что-то не могу сложить фейсы, ребра и вершины.

Могет кто-нидь подскажет, как с ними разобраться?

Дока по BSP прикреплена (там косячек в HTML просто не давайте ей выполнить скрипт, а то переводит на сайт какой-то [что не говорили что я вам вирусягу принес])

Это сообщение отредактировал(а) dvamaster - 5.8.2006, 11:14

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  bspformat.rar 16,02 Kb


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
dvamaster
Дата 16.8.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: нет
Всего: 10



Вот что получилось.

Здесь обрабатываются все фейсы, даже те которые не нужны.

Нет текстур и других полезных вещей, но работаю над этим.

Код

program bsp2ms;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  BSPUnit in '..\..\bsp2mp\BSPUnit.pas';

var
  cmdstr: String;
  cp: Integer = 0;
  ci: Integer;
  cf: Boolean = false;
  fnbsp: String = '';
  fnmp: String;

  hbspf, hms: THandle;

  pdh: pdheader_t = nil;
  pvertexlump: pvectora= nil;
  nvertex: Integer;
  pfacelump: pdface_ta = nil;
  nface: Integer;
  pedgelump: pdedge_ta = nil;
  nedge: Integer;
  psurfedgelump: PIntegerArray = nil;
  nsurfedge: Integer;

  t: DWord;

procedure WriteData;
var
  i, j, fse, e, v1, v2: Integer;
  s: String;
begin
  s := 'bspo = editable_mesh name:(uniquename "BSP Object")'#13#10'convertTo bspo (Editable_Poly)'#13#10;
  WriteFile(hms, s[1], Length(s), t, nil);
  for i := 0 to nvertex - 1 do
    begin
      s := 'polyOp.createVert bspo [' + FloatToStr(pvertexlump^[i].x) + ', ' + FloatToStr(pvertexlump^[i].y) + ', ' + FloatToStr(pvertexlump^[i].z) + ']'#13#10;
      WriteFile(hms, s[1], Length(s), t, nil);
    end;
  for i := 0 to nface - 1 do
    begin
      s := 'polyOp.createPolygon bspo #(';
      fse := pfacelump^[i].firstedge;
      for j := pfacelump^[i].numedges - 1 downto 0 do
        begin
          e := psurfedgelump^[j + fse];
          if e < 0 then
            begin
              v1 := pedgelump^[Abs(e)].v[1];
              v2 := pedgelump^[Abs(e)].v[0];
            end else
            begin
              v1 := pedgelump^[Abs(e)].v[0];
              v2 := pedgelump^[Abs(e)].v[1]
            end;
          s := s + IntToStr(v2 + 1);
          if j <> 0 then
            s := s + ', '
        end;
      s := s + ')'#13#10;
      WriteFile(hms, s[1], Length(s), t, nil);
    end;
end;

begin
  cmdstr := GetCommandLine;
  for ci := 1 to Length(cmdstr) do
    begin
      if cmdstr[ci] = '"' then
        cf := not cf;
      if (cmdstr[ci] = ' ') and (not cf) then
        Break
    end;
  cp := ci + 1;
  for ci := cp to Length(cmdstr) do
    begin
      if cmdstr[ci] = '"' then
        cf := not cf;
      if (cmdstr[ci] = ' ') and (not cf) then
        Break
    end;
  if cp > Length(cmdstr) then
    begin
      WriteLn('Not found argumet');
      WriteLn('For Exit Press Enter');
      ReadLn;
      Exit
    end;
  fnbsp := Copy(cmdstr, cp, ci - cp + 1);
  DecimalSeparator := '.';
  hbspf := CreateFile(PChar(fnbsp), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hbspf = INVALID_HANDLE_VALUE then
    begin
      WriteLn('Error Open "' + fnbsp + '"');
      ReadLn;
      Exit
    end;
  WriteLn('Open "' + fnbsp + '"'#13#10);
  GetMem(pdh, SizeOf(dheader_t));
  ReadFile(hbspf, pdh^, SizeOf(dheader_t), t, nil);
  WriteLn('ident: ' + String(pdh^.ident));
  WriteLn('version: ' + IntToStr(pdh^.version));
  WriteLn('mapRevision: ' + IntToStr(pdh^.mapRevision));
  WriteLn;
  GetMem(pvertexlump, pdh^.lumps[3].filelen);
  nvertex := pdh^.lumps[3].filelen div 12;
  SetFilePointer(hbspf, pdh^.lumps[3].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, pvertexlump^, pdh^.lumps[3].filelen, t, nil);
  WriteLn('Readed Vertex Lump');
  GetMem(pfacelump, pdh^.lumps[7].filelen);
  nface := pdh^.lumps[7].filelen div 56;
  SetFilePointer(hbspf, pdh^.lumps[7].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, pfacelump^, pdh^.lumps[7].filelen, t, nil);
  WriteLn('Readed Face Lump');
  GetMem(pedgelump, pdh^.lumps[12].filelen);
  nedge := pdh^.lumps[12].filelen div 4;
  SetFilePointer(hbspf, pdh^.lumps[12].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, pedgelump^, pdh^.lumps[12].filelen, t, nil);
  WriteLn('Readed Edge Lump');
  GetMem(psurfedgelump, pdh^.lumps[13].filelen);
  nsurfedge := pdh^.lumps[13].filelen div 4;
  SetFilePointer(hbspf, pdh^.lumps[13].fileofs, nil, FILE_BEGIN);
  ReadFile(hbspf, psurfedgelump^, pdh^.lumps[13].filelen, t, nil);
  WriteLn('Readed SurfEdge Lump');
  CloseHandle(hbspf);
  fnmp := ChangeFileExt(fnbsp, '.ms');
  if FileExists(fnmp) then
    DeleteFile(fnmp);
  hms := CreateFile(PChar(fnmp), GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
  WriteData;
  WriteLn('Writed ' + fnmp);
  WriteLn;
  WriteLn('For Exit Press Enter');
  CloseHandle(hms);
  FreeMem(psurfedgelump);
  FreeMem(pedgelump);
  FreeMem(pfacelump);
  FreeMem(pvertexlump);
  FreeMem(pdh);
  ReadLn;
end.


Добавлено @ 12:21 
Забыл BSPUnit тоже изменен.

Код

unit BSPUnit;

interface

uses
  Windows;

type
  pvector = ^vector;
  vector = record
    x: Single;
    y: Single;
    z: Single;
  end;
  pvectora = ^vectora;
  vectora = array [0..65535] of vector;

  plump_t = ^lump_t;
  lump_t = record
    fileofs: Integer;
    filelen: Integer;
    version: Integer;
    fourCC: array [0..3] of Char;
  end;

  pdheader_t = ^dheader_t;
  dheader_t = record
    ident: array [0..3] of Char;
    version: Integer;
    lumps: array [0..63] of lump_t;
    mapRevision: Integer;
  end;

  pdedge_t = ^dedge_t;
  dedge_t = record
    v: array [0..1] of Word;
  end;
  pdedge_ta = ^dedge_ta;
  dedge_ta = array [0..262143] of dedge_t;

  pdface_t = ^dface_t;
  dface_t = record
    planenum: Word;
    side: Byte;
    onNode: Byte;
    firstedge: Integer;
    numedges: Word;
    texinfo: Word;
    dispinfo: Word;
    surfaceFogVolumeID: Word;
    styles: array [0..3] of Byte;
    lightofs: Integer;
    area: Single;
    LightmapTextureMinsInLuxels: array [0..1] of Integer;
    LightmapTextureSizeInLuxels: array [0..1] of Integer;
    origFace: Integer;
    numPrims: Word;
    firstPrimID: Word;
    smoothingGroups: DWord;
  end;
  pdface_ta = ^dface_ta;
  dface_ta = array [0..65535] of dface_t;

implementation

end.



--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.