Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ Графический движок

Автор: AlaRic 30.03.2003 0:42

Сможем написать или нет?

Автор: GLuk 30.03.2003 0:45

Как в Думе, Дюке - да, а дальше - сомневаюсь. Хотя написать, то можно все.

Автор: Ivs 30.03.2003 0:45

Цитата
Сможем написать или нет?

А что он двигать будет ??????????

Автор: AlaRic 30.03.2003 0:49

Как в Думе думаешь сможем? Может в этой теме кто-нибудь напишет несколько мессаг про написание графических движков, а там глядишь и может что-нибудь сами напишем!

Автор: GLuk 30.03.2003 1:12

Но сразу определимся, что это будет чисто движок обработки и перемещения объектов (без обработки клавы и прочего). А насчет движка Дума - это бы в Алгоритмы сунуть, сам просчет...

Автор: AlaRic 30.03.2003 12:16

Цитата
Но сразу определимся, что это будет чисто движок обработки и перемещения объектов (без обработки клавы и прочего).

Хотя бы так! С чего начнем?

Автор: GLuk 30.03.2003 12:31

Распределим работу, e.g. кто-то биб-ки работы с видео, кто-то с объектами и т.д.

Автор: AlaRic 30.03.2003 12:34

У тебя инфа есть по этому делу?
PS. Аська работает?

Автор: GLuk 30.03.2003 12:55

Цитата
У тебя инфа есть по этому делу?
PS. Аська работает?


Аськой не пользуюсь (Mirabilis must die) из принципа. Только мыло - типа по старинке  :)
Инфа есть в разбросанном состоянии, есть даже пример движка (страшного, но 3Д движка - клон дума).

Автор: AlaRic 30.03.2003 13:01

Если не трудно скинь мне инфу - посмотрю!

Автор: GLuk 30.03.2003 20:21

Получи, движок по E-Mail...
Гляди мыло - высказывай соображения  :o

Автор: AlaRic 1.04.2003 14:56

Кто-нибудь хочет попробовать написать простенький движок?

Автор: GLuk 1.04.2003 20:39

Цитата
Кто-нибудь хочет попробовать написать простенький движок?

И ты хочешь взвалить все это на одного человека? :o

Автор: AlaRic 1.04.2003 21:35

Цитата
И ты хочешь взвалить все это на одного человека? :o

Нет. Поэтому и спрашиваю. Один чел даже простенький будет писать долго!

Автор: GLuk 1.04.2003 22:56

Цитата
Нет. Поэтому и спрашиваю. Один чел даже простенький будет писать долго!


Просто вишь ли - вопросом "Кто-нибудь" ты конкретизировал стиль обращения, поэтому я и спросил. Ты бы предложил это дело с предварительной раскидкой тем...

Автор: AlaRic 2.04.2003 0:56

Предложи-ка ты, а я если что подкорректирую.

Автор: GLuk 3.04.2003 22:06

Ну, предварительно так:

1) Работа с видеокартой. (надеюсь вывод пикселя будет не через int 10h)

2) Работа с 3Д-объектом, т.е. поворот, вращение, mip-mapping и все такое

3) Дизайн предварительных сцен

4) Что-нибудь еще... smile.gif

Вот - типа того

Автор: AlaRic 4.04.2003 18:48

Хоть так для начала, хотя не думаю, что будет много сцен!
Насчет вывода пикселя поподробнее   ;)

Автор: GLuk 4.04.2003 23:17

Конечно - вывода пикселя в граф. движке присутствовать не должно быть, т.е. вывод должен быть экранный. Я имел ввиду, то что если кто-то и возьмется за видео-топик - он должен осознавать, что ему нужно будет почитать про порты VGA адаптера (думаю разрешение ограничим - 320х200х256, как наиболее оптимальное во всех смыслах) и вообще работать с памятью напрямую, ну и все такое, а не юзая след. код:
asm
mov ax,0C12h
mov bh,0
xor cx,cx
mov cx,dx
int 10h
end;
Дилетантство не приветствуется... хотя по сути дела мы и сами дилетанты  ;)

Автор: AlaRic 5.04.2003 2:35

Цитата
Дилетантство не приветствуется... хотя по сути дела мы и сами дилетанты

Самого тянуло сказать об этом.
Да и еще... почему именно 320*200*256? Может хотя бы 320*240*256  или 400*300*256!!

Автор: Kr@b 6.04.2003 8:31

Ребята, а как насчет денежного вознагрождения - вы ничего не сказали. Или это дело на интерес - сидеть дома две недели и ничего не делать, кроме как этот проект!!!

Автор: AlaRic 6.04.2003 16:20

Движок, который мы напишем(если напишем), никому не будет нужен кроме нас самих - это проба своих сил.
Движок будет делаться не 2 недели!   ;)

Автор: Shadow 6.04.2003 17:20

:D приеду с отпуска кину граф движок на асме
именно в EXE формате может пригодится
полностью трехмерный

Автор: GLuk 6.04.2003 22:01

Цитата
Ребята, а как насчет денежного вознагрождения - вы ничего не сказали. Или это дело на интерес - сидеть дома две недели и ничего не делать, кроме как этот проект!!!


To Kr@b: Ты бы сначала прочел все мессаги по сабжу, а потом спрашивал - по моему из них явно видно, что все это чистый энтузиазм.
To AlaRic:
А по поводу разрешения - это стандартное разрешение Дума+с ним намного легче работать, чем с нестандартными (e.g. 320x240, 400х300 и т.п.), т.к. куча инфы по этому поводу. И кстати кому-то надо будет заняться кодировнием спрайтов (наверное GIF, на крайняк PCX). Кстати где-то видел Дум в 1024х768  :).
Чой-то мало кто откликается (типа не осталось энтузиастов в совр. мире), а за деньги я его и сам напишу  ;)

Автор: AlaRic 6.04.2003 23:57

Тебе виднее - значит 320*200*256
А энтузиастов действительно маловато!

Автор: GLuk 7.04.2003 9:22

Хрен с ним - я начну с чего-нибудь, потом чего-нибудь выложу, а там посмотрим... :smile.gif

Автор: AlaRic 7.04.2003 15:08

http://www.gamedev.ru/coding/20517.shtml    

Автор: GLuk 7.04.2003 15:30

Это ж клон Wolf/Doom, но не Quake. У нас же будут спрайты (если будут), а не полигоны/треугольники. Да и инфа для разработки винапов, но во всяком случае было интересно почитать. Но этот автор слишком уж вкратце об этом рассказывает...

Автор: AlaRic 7.04.2003 21:42

Там говорится об основах - это самое главное.
Посмотри сколько его движок умеет всяких фенек!

Автор: GLuk 7.04.2003 21:52

Об основах полигонального, но не спрайтового движка, у нас текстуры не будут натягиваться на скелет - это будут спрайты, возможно, с MIP-MAPPING'ом... А стены будут просчитываться пожалуй, как в Wolf.

Автор: AlaRic 10.04.2003 17:38

Да погоди ты с MIP-MAPPING'ом   smile.gif

Автор: GLuk 10.04.2003 19:36

Все начинаю писать, вроде с генерацией 9-значных чисел закончил, а в каком формате будем спрайты держать, e.g. GIF, PCX, BMP, PNG. Я склоняюсь к GIF, не думаю, что UniSys придерется к RussianDoom'у со своим долбаным патентом smile.gif

Автор: AlaRic 10.04.2003 20:29

Да GIF будет полегче чем BMP.
Скажи для начала, что надумал писать!

Автор: GLuk 10.04.2003 21:38

Цитата
Да GIF будет полегче чем BMP.
Скажи для начала, что надумал писать!


GIF полегче - В Кб/Мб?  ???

Писать я все еще думаю - движок, но не клон Дума, а пожалуй Вульфа. Т.к. в думе больше просчета (стены не под прямыми углами и все такое из этого вытекающее). А пока что думаю сделать что-то типа WADа в Думе, т.е. файл со скринами/спрайтами...а для жима буду юзать LZW...
Присоединился бы что-ли?  ;)

Автор: AlaRic 11.04.2003 17:24

Поясни, что такое LZW?
Присоединюсь как освобожусь!Дел много!
Мы вдвоем будем писать?? Интересно нам плохо не будет?

Автор: GLuk 11.04.2003 17:59

LZW - алгоритм сжатия данных, придуманный тремя корешами: Lempel'om, Ziv'om & Welch'em. Используется для сжатия данных в ZIP, GIF и многих других. А в ГИФе между прочим юзается модифицированная версия этого алгоритма, запатентованная фирмой UniSys и она воняет по этому поводу на все проги читающие этот формат. Типа каждый должен купить лицензию на чтение и все такое... Но до нас я думаю она вряд до***тся. И кстати неофициальная расшифровка PNG - PNGs not GIF...
А по поводу того, что в два лица будем писать, дык энтузиастов/программистов, то ни хрена нету... sad.gif

Автор: ozzy 11.04.2003 20:11

Смысл? Если для души, то пойму/приму, а если  с претензиями, то кхе-кхе :P

Автор: trminator 11.04.2003 22:00

ИМХО спрайты лучше хранить в BMP или вообще в RAW (т. е. просто матрицу пикселей),  так не придется дополнительно их распаковывать. Тем более что все равно они будут сжаты во что-то типа Думовского WAD'а

Автор: AlaRic 11.04.2003 22:09

Еще будут мнения? Они не помешают!

Автор: Вовчик 17.04.2003 0:43

У меня есть прога на паскале с движком и прочим, однако для частного случая типа DOOM, но скорее типа Wolf, т.к. нет вертикального движения. Работает на удивление быстро. Я офигел, что паскаль на такое способен. Половина проги написана на Ассемблере, но я его так и не взялся учить!
Могу переслать!

И еще вопрос:
Вы не знаете, как сделать в графическом режиме vga256 или vesa16 две страницы для перерисовки экрана. setactivepage, setvisualpage?

Автор: AlaRic 18.04.2003 11:34

Цитата
И еще вопрос:
Вы не знаете, как сделать в графическом режиме vga256 или vesa16 две страницы для перерисовки экрана. setactivepage, setvisualpage?

Сам себе ответил!
for Gluk: ты будешь использовать асму?

Автор: Dark 19.04.2003 4:51

Привет, если вы хотите, я мог бы работать с вами над движком - в общем то у меня есть гр. библиотека для работы с VESA - написана на асме под паскалем.  :D

P.S. В моей библиотеке есть шрифт, обновление экрана, работа с режимами 800*600,640*480... кому интересно - мыльте [email] darkmaze@yandex.ru [/email]

Автор: GLuk 19.04.2003 7:55

To Dark:Читай все мессаги сабжа - разрешение 320х200х256. И по поводу сторонних модулей, дык я категорически против - типа делать самим все!

To Alaric:Конечно буду, уже весь модуль написан на нем... smile.gif

To Ozzy:Может потрудишься над темой поворота стен и все такое? ???

Автор: Dark 19.04.2003 9:01

8)
Ну
1. Эта библиотека написана полностью МНОЙ! !!!(писалась где-то 2 мес.)
2. Хорошо, MCGA, так MCGA, но я буду работать с вами или нет?

Я согласен работать на полном энтузиазме - так как это полностью совпадает с направлением полета моей творческой мысли  :P

Автор: GLuk 19.04.2003 9:12

А не мог бы выложить пару строчек из нее (в плане сама реализация меня интересует) или кинуть на мыло. Участие: попробовал бы просчет поворотов стен при движении, объекты на поворот не надо вить, т.к. спрайтовая орг-ия.

:D Энтузиазм только приветствуется :D

Автор: AlaRic 19.04.2003 9:15

Цитата

Я согласен работать на полном энтузиазме - так как это полностью совпадает с направлением полета моей творческой мысли  :P

Вот и отлично, так как бабок лучше не ждать ;D
Обговори свою задачу с Gluk'ом!

Автор: Dark 20.04.2003 4:05

Ну в обшем то я готов попробовать... :-)
Кое какая документация у меня есть - буду изучать  ;D

To Gluk: а для чего тебе генерация 9-ти значных цифр?
И не проще ли использовать PCX? или можно JPG ;-)

Автор: Dark 20.04.2003 9:00

8) 8) 8)
Ну вобщем я понял ту задачу, которую мне предлагают, так:
Имеется двумерная карта об"ектов.
Имеется игрок - и нам известен его вектор направления, и x,z координаты( по правой с.к.) и надо написать программу, которая бы отображала бы то, что игрок видит...

Если что не так подправьте, добавьте...  ;D

Автор: GLuk 26.04.2003 8:27

Цитата
To Gluk: а для чего тебе генерация 9-ти значных цифр?
И не проще ли использовать PCX? или можно JPG ;-)


Генерация 9-значных чисел это был такой сабж который мы с reill долго мусолили...

А по поводу PCX модуль был и так...

JPG: пиши декодер сам :D т.к. на данный момент проследить всю цепочку дискретного косинус-преобразования мне не под силу а пользоваться сторонними библиотеками не буду...

Автор: GLuk 26.04.2003 8:34

Модуль для работы с VESA:

Я тут выложу кусочек из-за которого все говняется (to Dark):
+ парочку переделанных процедур

Function TestVESAExt:boolean;Assembler;
asm
lea di,InfoBuf
push ds
pop es
mov ax,4F00h
int 10h
dec ah
jns @NoVESA
mov al,1
jmp @vesok
@NoVESA:
mov al,0
@VesOk:
end;


Function TestVESAMode(Mode:Word):Boolean;Assembler;
asm
lea di,InfoBuf
mov ax,4F01h
mov cx,Mode
int 10h
dec ah
jns @NotEx
mov al,1
jmp @Exist
@NotEx:
mov al,0
@Exist:
end;

Function ReadCurrentMode:Word;Assembler;
asm
mov ax,4f03h
int 10h
mov ax,bx
end;

Procedure VESAClScr(col:byte);
begin
asm
jmp @beg
@vmc:
pusha { Результат работы подпрогр-мы - переполнение стека }
mov dx,[curwin]
xor bx,bx
call vmc
popa
retn

@beg:
push $A000
pop es
xor di,di
mov ax,[maxy]
mov dx,[maxx]
mul dx
mov bx,ax
inc dx
mov al,[col]
mov [curwin],0
call @vmc {Отсюда нач-ся г-но}
@l1: mov cx,0ffffh
rep stosb
dec dx
jz @ok
inc [curwin]
call @vmc
loop @l1
@ok: mov cx,bx
REP stosb
end;
end;

Автор: GLuk 27.04.2003 21:25

Ааа... прости глупого  :-[ - все работает, вишь ли не сразу врубился в извращенный цикл преобразования адреса процедуры из описаловки параметров VESA. Это ж надо из стринга через орд, умножением на 256!!!  :o На всякий случай он у тебя обрабатывается сразу... Буфер сразу сделал локальным -> как следствие вызов процедуры vmc зацикливал всю телегу. А по поводу пердачи параметров: погляди как это реализовано в процедурах выше. Легче всего протрейсить в ТД и ПОСМОТРЕТЬ КАК он это делает. Во-всяком случае у меня инфы по этому поводу никогда не было, поэтому пришлось подсмотреть... smile.gif

Автор: AlaRic 3.05.2003 17:14

Работа кипит или стоит?

Автор: GLuk 3.05.2003 17:48

Идет потихонечьку...  :(
Отвлекаюсь часто.
А ты как - освободился?

Автор: AlaRic 3.05.2003 20:28

Где-то через недельку  8)

Автор: Alesha_GA 19.05.2003 7:57

Ну и как, пишется что нибудь?  ???

Автор: AlaRic 19.05.2003 13:24

Если что-нибудь есть - кидайте сюда.....гы (с)

Автор: ___ALex___ 19.05.2003 16:24

народ а зачем вы хотите писать на Турбо Паскале ?
щас все же пишут игры использую DirectX, DirectDraw на Delphi

Автор: GLuk 19.05.2003 19:52

типа, надо же хоть как отличаться... smile.gif

Автор: Deny 19.05.2003 20:43

Цитата
народ а зачем вы хотите писать на Турбо Паскале ?
щас все же пишут игры использую DirectX, DirectDraw на Delphi

Предлагаю открыть второй фронт, так сказать, альтернативный вариант для здоровой конкуренции. Имею опыт (программирования и организации процесса) разработки движков на DX и OGL, естественно на С++. Ваши мнения? (особенно ___ALex___)

Автор: AlaRic 19.05.2003 21:14

Рановато пока для второго фронта!

Автор: Deny 19.05.2003 23:27

Цитата
Рановато пока для второго фронта!

Потом будет поздно!  ;D

Автор: Clane 19.05.2003 23:29

Хм.... А чем это вы здесь занимаетесь ?

Автор: Dark 21.05.2003 3:46

Я тут нашел кое какие формулы... может это они???, т.е. ф-лы поворота точек относительно камеры...

  [x']  [1 0 0 -cx] [x]
  [y']  [0 1 0 -cy] [y]                  Позиция камеры
  [z']  [0 0 1 -cz] [z]
  [1 ]  [0 0 0  1 ] [1]


  [x'] [m11 m12 m13 m14] [x]
  [y'] [m21 m22 m23 m24] [y]
  [z'] [m31 m32 m33 m34] [z]
  [1'] [m41 m42 m43 m44] [1]

где

  m11 = cos(yaw)sin(roll) + sin(yaw)sin(pitch)sin(roll)
  m12 = sin(pitch)sin(roll)
  m13 = -sin(yaw)cos(roll) + cos(yaw)sin(pitch)sin(roll)
  m14 = -(cx*m11 + cy*m12 + cz*m13)
  m21 = -cos(yaw)sin(roll) + sin(yaw)sin(pitch)cos(roll)
  m22 = cos(pitch)cos(roll)
  m23 = sin(yaw)sin(roll) + cos(yaw)sin(pitch)cos(roll)
  m24 = -(cx*m21 + cy*m22 + cz*m23)
  m31 = sin(yaw)cos(pitch)
  m32 = -sin(pitch)
  m33 = cos(yaw)cos(pitch)
  m34 = -(cx*m31 + cy*m32 + cz*m33)
  m41 = 0
  m42 = 0
  m43 = 0
  m44 = 1

(здесь рассматривается свободная камера, поворачиваемая на все три угла - yaw - вокруг y, pinch - вокруг x, roll - вокруг z)

Автор: AlaRic 21.05.2003 9:53

Кидайте сюда любые свои идеи!

Автор: Deny 21.05.2003 14:35

Цитата
Кидайте сюда любые свои идеи!
Формулами закидать могу. Надо?

Автор: AlaRic 13.06.2003 20:45

ВсЁ кидаем!

Автор: LP_FUNKy 30.06.2003 3:43

Да второй фронт было бы неплохо но на Delphi . А то поразводилось вас 'сионистов' smile.gif

Автор: GLuk 30.06.2003 4:05

Тада не второй, а первый...  ;)

Автор: AlaRic 30.06.2003 14:47

http://kappasoft.narod.ru/info/3d/3d.htm

Автор: AlaRic 8.07.2003 12:36

Пакет предназначен для вывода графических изображений из файлов формата PCX.

{*********************************************************************
****}
{                                                                         }
{      PCXLIB.PAS - Display graphic pictures from PCX format files.       }
{                   Support CGA/EGA/VGA videoadapters.                    }
{                                                                         }
{                             Version 1.00                                }
{                                                                         }
{      Copyright © 1992 by Zhachkin K.V. / UnfoService-Unison /         }
{                                                                         }
{*************************************************************************}


{ Note :    This module not check current videoadapter and disk errors.  }


{$S-,F+}    { !!!   Don't change this directives   !!! }

{$I-}

Unit PCXLib;

{ ************************* } InterFace { ************************ }

Uses  Dos,
     TPString;

Const DiskBufSize = 20000; { Range 1..65530 }

Type  ValidMode = ( CGA320x200x4,  CGA640x200x2, EGA320x200x16, EGA640x200x16,
                   EGA640x350x2, EGA640x350x16, VGA640x480x2, VGA640x480x16,
                   VGA320x200x256,  DUMMYMODE);  { DUMMYMODE - End of type }

     ModeRec = Record
      XRes,
      YRes         : Word;
      BitsPerPixel,
      NPlanes,
      VideoMode    : Byte;
     end;

Const MyModes:Array[ValidMode] OF ModeRec =

      ((XRes:320;YRes:200;BitsPerPixel:2; NPlanes:1; VideoMode:$04),
       (XRes:640;YRes:200;BitsPerPixel:1; NPlanes:1; VideoMode:$06),
       (XRes:320;YRes:200;BitsPerPixel:1; NPlanes:4; VideoMode:$0D),
       (XRes:640;YRes:200;BitsPerPixel:1; NPlanes:4; VideoMode:$0E),
       (XRes:640;YRes:350;BitsPerPixel:1; NPlanes:1; VideoMode:$0F),
       (XRes:640;YRes:350;BitsPerPixel:1; NPlanes:4; VideoMode:$10),
       (XRes:640;YRes:480;BitsPerPixel:1; NPlanes:1; VideoMode:$11),
       (XRes:640;YRes:480;BitsPerPixel:1; NPlanes:4; VideoMode:$12),
       (XRes:320;YRes:200;BitsPerPixel:8; NPlanes:1; VideoMode:$13),
       (XRes:000;YRes:000;BitsPerPixel:0; NPlanes:0; VideoMode:$00));

Var   VideoPage : Byte;

Procedure DrawPCX( FName:String; VAR Page:Byte );

{ *********************** } Implementation { ************************}

Type  PCXHeader = Record
      PCXid            : Byte;
      VersionNo        : Byte;
      Encoding         : Byte;
      BitsPerPixel     : Byte;
      XL,YL,XH,YH      : Word;
      Xres,YRes        : Word;
      Palette          : Array[1..48] OF Byte;
      Reserved         : Byte;
      NPlanes          : Byte;
      BytesPerLine     : Word;
      PaletteInfo      : Word;
      Reserved2        : Array[1..58] OF Byte;
     end;
                               
     MyArray = Array[1..65000] OF Byte;


Procedure CGA_CO_Palette(Hdr:PCXHeader); { Set CGA palette for 320x200 mode }

Var  Fore,BackGround : Byte;

begin
 Fore:=Hdr.Palette[4] SHR 5;
 BackGround:=Hdr.Palette[1] SHR 4;
 IF Fore > 4 THEN Dec(Fore,4);
 IF Not (Fore IN [0,2]) THEN BackGround:=BackGround OR $10;
 IF Fore > 1 THEN Fore:=1
             ELSE Fore:=0;
 asm
  mov   bh,0
  mov   bl,byte ptr BackGround
  mov   ah,0Bh
  int   10h
  mov   bh,1
  mov   bl,byte ptr Fore
  mov   ah,0Bh
  int   10h
 end;
end;

Procedure CGA_BW_Palette(Hdr:PCXHeader); { Set CGA palette for 640x200 mode }

Var BackGround : Byte;

begin
 BackGround:=Hdr.Palette[1] SHR 4;
 asm
  mov   bh,1
  mov   bl,byte ptr BackGround
  mov   ah,0Bh
  int   10h
 end;
end;


Procedure EGA_16_Palette(Hdr:PCXHeader); { Set palette for EGA color modes }

Var    I      : Byte;
      Pal    : Array[0..16] OF Byte;
      PalPtr : Pointer;

begin
 PalPtr:=@Pal;
 With Hdr DO
  begin
   FOR i:=0 TO 15 DO
    begin
     Pal[i]:=((Palette[i*3+1] AND $48 )+
              (Palette[i*3+2] AND $48 ) SHR 1+
              (Palette[i*3+3] AND $48 ) SHR 2) SHR 1;
    end;
  end;
 Pal[16]:=0;
 asm
  les   dx,PalPtr
  mov   ax,1002h
  int   10h
 end;
end;

Procedure VGA_256_Palette(Hdr:PCXHeader; Var F:File);

{ Set palette for 256-colors VGA mode }

Var    I      : Word;
      Pal    : Array[0..768] OF Byte;
      PalPtr : Pointer;

begin
 PalPtr:=@Pal[1];
 Seek(F,FileSize(F)-769);
 BlockRead(F,Pal,769);
 IF Pal[0] = $0C THEN FOR i:=1 TO 768 DO Pal[i]:=Pal[i] SHR 2;
 Seek(F,SizeOF(PCXHeader));
 asm
  les   dx,PalPtr
  mov   ax,1012h
  mov   cx,100h
  mov   bx,0
  int   10h
 end;
end;

Procedure VGA_16_Palette(Hdr:PCXHeader); { Set palette for 16-colors VGA mode }

Var    Pal     : Array[1..48] OF Byte;
      CurrPtr : Pointer;
      i       : Byte;

begin
 FOR i:=1 TO 48 DO Pal[i]:=Hdr.Palette[i] SHR 2;
 CurrPtr:=@Pal[1];
 FOR i:=0 TO 15 DO
  begin
   asm
    les    di,CurrPtr
    mov    ax,1007h
    mov    bl,byte ptr i
    int    10h
    mov    bl,bh
    xor    bh,bh
    mov    ax,1010h
    mov    dh,byte ptr es:[di]
    mov    ch,byte ptr es:[di+1]
    mov    cl,byte ptr es:[di+2]
    int    10h
   end;
  Inc(LongInt(CurrPtr),3);
  end;

end;

{ *************************** DrawPCX **************************** }

Procedure DrawPCX( FName:String; VAR Page:Byte );

Type  OffsSeg = Record
      Offs,Seg:Word
     end;

Var   DiskBuf,
     ScrBuf             : ^MyArray;
     DiskBufRec       : OffsSeg Absolute DiskBuf;
     ScrBufRec             : OffsSeg Absolute ScrBuf;
     FHandle,
     i,XLen,YLen,
     ScrOfs,
     BytesPerRow,      { Screen row length (in bytes) }
     ByteNum,          { Byte number to output in line }
     VideoBase,
     NLines             : Word;
     InitOutputProc     : Pointer;
     TestMode           : ModeRec;  { Video parameters from file header}
     Hdr                : PCXHeader;
     F                  : File;
     Mode               : ValidMode;

Label OurMode;

Procedure NextBlock(FHandle:Word); Assembler;
asm
 push  bx                  { Dsik error not check !!! }
 push  cx

 xor   dx,dx
 mov   cx,DiskBufSize
 mov   bx,word ptr FHandle
 mov   ah,3Fh
 int   21h
                   { jc error_label   for dirk error handling }
 pop   cx
 pop   bx
end;

{$F-}
Procedure Init_Output_1_Planes; Assembler;
asm
  mov   bp,word ptr [bp+4]        { Initial settings before output string }
                                  { to video buffer for 1-bit plane mode  }
  inc   word ptr NLines           {          ( BW EGA,VGA 256 )           }

  mov   ax,word ptr NLines
  cmp   word ptr YLen,ax
  je    @Finish

  mov   ax,word ptr BytesPerRow
  add   word ptr ScrOfs,ax

  xor   ax,ax
  jmp   @Exit

@Finish:

  xor   ax,ax
  inc   ax

@Exit:

end;

Procedure Init_Output_4_Planes; Assembler;
asm
  mov   bp,word ptr [bp+4]     { Initial settings before output string }
                               { to video buffer for 4-bit plane mode  }
  cmp   bl,10h                 {          ( Color EGA,VGA  )           }
  jne   @Not_10

  mov   bl,1
  inc   word ptr NLines
  mov   ax,word ptr BytesPerRow
  add   word ptr ScrOfs,ax

  mov   ax,word ptr NLines
  cmp   word ptr YLen,ax
  je    @Finish

@Not_10:

  mov   dx,3C4h
  mov   al,2
  out   dx,al     { Select Bit Plane }
  inc   dx
  mov   al,bl
  out   dx,al

  shl   bl,1

  xor   ax,ax
  jmp   @Exit

@Finish:

  xor   ax,ax
  inc   ax

@Exit:

end;

Procedure Init_Output_CGA; Assembler;
asm
  mov   bp,word ptr [bp+4]         { Initial settings before output string }
                                   {      to video buffer for CGA mode     }
  inc   word ptr NLines

  cmp   byte ptr VideoBase+1,0B8h
  je    @Even_Line

  mov   byte ptr VideoBase+1,0B8h
  mov   ax,word ptr NLines
  cmp   word ptr YLen,ax
  je    @Finish

  mov   ax,word ptr BytesPerRow
  add   word ptr ScrOfs,ax
  jmp   @Not_Finish

@Even_Line:

  mov   byte ptr VideoBase+1,0BAh

@Not_Finish:

  xor   ax,ax
  jmp   @Exit

@Finish:

  xor   ax,ax
  inc   ax

@Exit:

end;

{$F+}

begin
 IF Pos('.',FName) = 0 THEN FName:= ParamStr(1) +'.PCX';
 Assign(F,FName);
 Reset(F,1);
 IF IOResult <> 0 THEN
   begin
     Writeln('File ',FName,' not found.');
     Halt(1);
   end;

 BlockRead(F,Hdr,128);
                          { IF IOResult <> 0 THEN .... }
 With Hdr DO
  begin
   IF PCXid <> $0A THEN
    begin
     Writeln('File ',FName,' not PCX file.');
     Halt(1);
    end;

   TestMode.XRes:=XRes;
   TestMode.YRes:=YRes;
   TestMode.BitsPerPixel:=BitsPerPixel;
   TestMode.NPlanes:=NPlanes;
  end;

         { Check for validity video parameters }

 FOR Mode:=ValidMode(0) TO DUMMYMODE DO
   IF CompStruct(TestMode, MyModes[Mode], 6) = Equal THEN GoTo OurMode;

 Writeln('File ',FName,' is not my image.');
 Writeln(' XRes=',TestMode.XRes,
         ' YRes=',TestMode.YRes,
         ' BitsPerPixel=',TestMode.BitsPerPixel,
         ' NPlanes=',TestMode.NPlanes);
 Halt(1);

OurMode:

 i:=MyModes[Mode].VideoMode;
 asm
  mov      ax,word ptr i          { Set required mode }
  int      10h
 end;

 FHandle:=FileRec(F).Handle;

 With Hdr DO
  begin
   XLen:=BytesPerLine;
   YLen:=Succ(YH-YL);
   ByteNum:=Succ(XH-XL) DIV 8 * MyModes[Mode].BitsPerPixel;
   BytesPerRow:=XRes DIV 8 * MyModes[Mode].BitsPerPixel;
   GetMem(ScrBuf,XLen+63+16);
   GetMem(DiskBuf,DiskBufSize+16);
  end;

  { Normalize pointers - for higher speed }

 DiskBufRec.Seg:=DiskBufRec.Seg+DiskBufRec.Offs SHR 4+1;
 DiskBufRec.Offs:=0;
 ScrBufRec.Seg:=ScrBufRec.Seg+ScrBufRec.Offs SHR 4+1;
 ScrBufRec.Offs:=0;


ScrOfs:=0;
IF Mode IN [EGA320x200x16, EGA640x200x16, EGA640x350x2, EGA640x350x16]
        THEN ScrOfs:=VideoPage*MemW[0:$44C]
        ELSE VideoPage:=0;                   { Only 1 VideoPage Allowed }


  { Set Palette }

 CASE Mode OF

CGA320x200x4  : CGA_CO_Palette(Hdr);
CGA640x200x2  : CGA_BW_Palette(Hdr);
VGA320x200x256: VGA_256_Palette(Hdr,F);
VGA640x480x16 : VGA_16_Palette(Hdr);
          ELSE IF Hdr.NPlanes = 4 THEN EGA_16_Palette(Hdr);

 end; { CASE }

IF Hdr.NPlanes = 4 THEN
                    begin
                     NLines:=0;
                     VideoBase:=$A000;
                     InitOutputProc:=Addr(Init_Output_4_Planes)
                    end
                   ELSE
                    begin
                     ScrOfs:=Word(ScrOfs-BytesPerRow);
                     NLines:=Word(-1);
                     VideoBase:=$A000;
                     InitOutputProc:=Addr(Init_Output_1_Planes);
                    end;

IF Mode IN [CGA320x200x4, CGA640x200x2] THEN
  begin
   NLines:=Word(-1);
   VideoBase:=$BA00;
   InitOutputProc:=Addr(Init_Output_CGA);
  end;

 asm
  push  ds                            { CX - repeating counter       }
  mov   si,word ptr DiskBuf+2         { DS:SI - DiskBuf              }
  mov   ds,si                         { ES:DI - ScrBuf               }
  xor   si,si                         { BL - Bit Map Mask (1,2,4,8,) }
  mov   di,word ptr ScrBuf+2
  mov   es,di
  xor   di,di
  push  word ptr FHandle
  push  bp
  call  NextBlock
  xor   si,si


@Not_1_Plane:

  mov   bl,1                   { Mask  for 4-Planes }
  mov   cx,0

@Repeat:

  lodsb

  or    cx,cx
  je    @Not_Fill

  rep   stosb
  jmp   @Za_IF

@Not_Fill:

  cmp   al,0C0h
  jnb   @Not_Ordinal

  stosb
  jmp   @Za_IF

@Not_Ordinal:

  and   al,3Fh
  xor   ah,ah
  mov   cx,ax

@Za_IF:

  mov   ax,si
  inc   ax
  cmp   ax,DiskBufSize
  jna   @Not_NextBlock

  push  word ptr FHandle
  push  bp
  call  NextBlock
  xor   si,si

@Not_NextBlock:

  mov   ax,di
  inc   ax
  cmp   ax,word ptr XLen
  jna   @Not_Show

{ ***************************** SHOW LINE *************************** }

  push  bp
  call  word ptr InitOutputProc
  or    ax,ax
  jne   @End_Picture

  push  cx

  sub   di,word ptr XLen
  mov   cx,di

  push  ds
  push  si
  push  di

  push  es
  pop   ds

  push       cx      
  push  es

  mov   ax,word ptr VideoBase
  mov   es,ax
  mov   di,word ptr ScrOfs
  xor   si,si
  mov   cx,word ptr ByteNum
  rep   movsb

  pop   es
  pop       cx

  xor   di,di
  mov   si,di
  add   si,word ptr XLen
  rep   movsb

  pop   di
  pop   si
  pop   ds

  pop   cx

{ ******************************************************************* }

@Not_Show:
  jmp   @Repeat

@End_Picture:
  pop   ds
 
 end;
end;

end.           { ********* End of PCXLib ********* }

Автор: Noname 8.07.2003 14:07

ого! вот это модуль!!!  :o

Автор: AlaRic 9.07.2003 17:40

Только толку от него мало - уматали все!

Автор: GLuk 10.07.2003 0:14

Если б это был JPEG... с его этими хреновыми косинус-дискретными преобразованиями и возможностью установки Q-фактора... ;)

Автор: AlaRic 10.07.2003 10:24

Вот здесь JPEG  http://www.proglib.ru/browse.asp?id=31

Автор: Dark 2.08.2003 4:46

Вернулся опять к 3d... как многозадачная система прямо... вы скажите, вам чего конкретно - кода, формул или готового движка?

Тока на тему последнего - не люблю играть в темную, поэтому нужно поговорить где-нибудь вживую...

P.S.  Спецом крутым себя не считаю, поэтому помогу чем могу, много не обесчаю...

Автор: cutter 13.08.2003 14:50

Привет всем!
Заранее прошу прощения, но я не могу здесь понять одного - ПОЧЕМУ ЭНТУЗИАЗМ НЕ МОЖЕТ БЫТЬ НАПРАВЛЕН В СТОРОНУ КОММЕРЦИИ? ???
Зачем пытаться разработать думоподобный движок, основанный на спрайтах, если времена спрайтов однозначно прошли. А 3D движок Quake 2 - уже на свободе, по-крайней мере для некоммерческого использования... Да и для коммерческого использования он стоит сейчас не ~100 000$, а ~10 000$.
Именно с исходниками Quake 2 я сейчас и дуплюсь... Только вчера скачал...

Автор: cutter 13.08.2003 14:59

В случае, если это кого-то заинтересует, готов серьезно на этом зациклиться - не хочу быть нищим.
Главное, чтобы потенциальная команда понимала, что при отсутствии начального капитала (а это и есть энтузиазм) зарплату никто и никому платить не будет. Сначала необходимо сделать что-либо стоящее, затем попытаться трансформировать его в коммерческий продукт, разрекламировать, попытаться продать, открыть свою контору (пусть маленькую, но крепкую), засветиться в IT кругах, увеличить обьемы, а затем уже нанимать других программистов на обычную стабильную зарплату.

Автор: GLuk 13.08.2003 20:19

Пара вопросов тогда:

Ты что нищий?
Думаешь ты первый?

Я лично занимаюсь программированием только из интереса, у меня есть стабильная работа и все такое. Но и энтузиазм тож имеется, а помощь вполне могу предоставить только, к сожалению, только на Паскале или асме. А исходники-то кваковские вроде как на Си?
Да и сделать что-либо стоящее на обломках кваки вряд-ли можно...
И меня к слову не прет это долбаное ООП с его велосипедом. Обидно, что самому делать уже ничего не надо, потому и захотелось написать дум-движок.

Автор: cutter 14.08.2003 11:10

Понятно.

Автор: ___ALex___ 14.08.2003 22:14

почему чтобы работать программёром нужно обязательно делать игры? ерунда какая
щас этих игродельщиков как собак нерезанных

Автор: AlaRic 15.08.2003 0:50

Лично меня квака не прет, хотя бы поэтому мне это уже неинтересно!

Автор: Gremlin 29.10.2003 23:59

Цитата
Именно с исходниками Quake 2 я сейчас и дуплюсь... Только вчера скачал...

Где? ???

Автор: GLuk 30.10.2003 10:15

Цитата
Где? ???


В инете...

Автор: AlaRic 28.02.2004 15:54

Народ что будем делать с ЭТИМ МЯСОМ?

Автор: Dark 18.03.2004 10:10

ПОхоже =)) что ничего путного из этого не вышло, т.к. последний пост аж в октябре =) т.е. полгода назад, т.е. мона закрывать, или оставить висеть - до появления умных идей

ИМХО надо набрать группу и не в СТАТИЧНОМ порядке работать а в активном - т.е. встречи в мирк, разбиение на задачи, ежедневное доложения результатов работы, У МЕНЯ ОПЫТ ЕСТЬ =) я щас веду свой проект на дельфи+Direct X :D

Автор: AlaRic 18.03.2004 16:18

Dark ты когда заведешь аську? Поговорим о будущем smile.gif

Автор: Dark 19.03.2004 6:38

293688866, уже года полтора как =), просто возможно не вывешивал
Я по ночам только по МСК с 2х до 8