Просмотр полной версии : Попиксельный raycasting и sjasm
Что-то замучался я с трассером.
Код вида:
L00 SЕТ 7,(НL) ;строка 0
SUВ Е
JR C,L11A
L01 SЕТ 6,(НL)
SUВ Е
JR C,L12A
L02 ...
L10A ADD A,D
INC Н ;переход на строку 1
JР L10
L11A ADD A,D
INC Н
JР L11
L12A ...
L10 SЕТ 7,(НL) ;строка 1
SUВ Е
JR C,L21A
L11 SЕТ 6,(НL)
SUВ Е
JR C,L22A
L12 ...
никак не могу сообразить как забить?
(ну не декрюнчер ведь а-ля 90-е писать, да и не динамичный он будет, блин!).
Как решается?
(мучаю вот это http://zxpress.ru/article.php?id=11746 )
Destr, а стираешь потом как?
- - - Добавлено - - -
[QUOTE=Destr;875495]Что-то замучался я с трассером.
Код вида:
L00 SЕТ 7,(НL) ;строка 0
SUВ Е
JR C,L11A
L01 SЕТ 6,(НL)
SUВ Е
JR C,L12A
L02 SЕТ 5,(НL) ;строка 0
SUВ Е
JR C,L13A
L03 SЕТ 4,(НL)
SUВ Е
JR C,L14A
L04 SЕТ 3,(НL) ;строка 0
SUВ Е
JR C,L15A
L05 SЕТ 2,(НL)
SUВ Е
JR C,L16A
L06 SЕТ 1,(НL) ;строка 0
SUВ Е
JR C,L17A
L07 SЕТ 0,(НL)
SUВ Е
JR C,L18A
jr l00
L10A ADD A,D
INC Н ;переход на строку 1
JР L10
L11A ADD A,D
INC Н
JР L11
L12A ...
L10 SЕТ 7,(НL) ;строка 1
SUВ Е
JR C,L21A
L11 SЕТ 6,(НL)
SUВ Е
JR C,L22A
L12 ...
правда чтото я не вижу тут контроль длины отрезка.
правда чтото я не вижу тут контроль длины отрезка
Контроль только в длине итераций (сколько раз повторим отрезок приведёный).
Вообще это шелуха (контроль длины), тут дело в том как преподать 192 раза повторения чтоб не ругался сиджасм и вообще как это модульные метки или что?
- - - Добавлено - - -
jerri, я ведь ссыль дал, там это пишется (ну как-бы на теории):
http://zxpress.ru/article.php?id=11746
Больше пол-статьи, там где линия...
возьми лучше помедленнее класику
оставь этот геморой авторам.
Контроль длины я бы сделал перед jr L00 и печатал знакоместами, а хвосты можно и по тормозному.
В сиджасме с именами меток вроде не помутишь через макросы, так как общая картина ясна изначально, можно высчитывать абсолютные переходы исходя из $, но на луа сделать будет и быстрее и проще.
- - - Добавлено - - -
Забыл, ведь = есть, но переходы все равно абсолютные считать придется.
- - - Добавлено - - -
Дочитал статью:) вопрос контроля снимается
возьми лучше помедленнее класику
Не могу, это рейкастинг будет, тут надо как можно быстрей...
Destr,
давай тогда с тобой подумаем вместе
вот простой и удобный алгоритм рисования линии
beginning
di
ld hl,#1020 ; yx dest
ld de,#3060 ; yx sour
call line00
ei
ret
;в HL - yx конца
;в DE - yx начала
line00
ld a,h ;вычисляем DY
sub d
ld bc,#141c ;создаем базовые изменения координат
jr nc,line1 ;основная пара de
inc b
;поэтому меняем DE><HL если рисуем сверху вниз
;ВСЕГДА рисуем сверху вниз
neg
line1 ld h,a ;H=DY
ld a,l ;вычисляем DX
sub e ;
jr nc,line2
inc c ;если рисуем справа налево то меняем направление
neg
line2 cp h ;DX=DY?
ld l,a
jr c,line3
;если меньше то считаем основной координатой DY
ld l,h
ld h,a
ld a,b
ld b,c
ld c,a
line3 ld a,b ;обозначаем как менять координаты
ld (line5),a
ld a,c
ld (line6),a
ld b,h
ld a,h
inc l
inc b
line4 call plot ;здесь печать точки - в de координаты yx
line5 nop
sub l
jr nc,line7
line6 nop
add a,h
line7 djnz line4
ret
plot
push hl,de,af
ld l,d
ld h,koors/256
ld a,(hl)
inc h
ld d,(hl)
inc h
ld l,e
or (hl)
ld e,a
inc h
ld a,(de)
xor (hl)
ld (de),a
pop af,de,hl
ret
на основе этого алгоритма надо подумать как рисовать в пределах знакоместа линию
у нас есть 4 варианта развития линии
х+ у+
х- у+
х+ у-
х- у-
на основе этого алгоритма надо подумать как рисовать в пределах знакоместа линию
Ну и сколько тактов на точку получается?
Учти, что нужно будет рисовать 64 линии (угол обзора 90 градусов потому-что, исходя из того что у нас на спеке окружность удобней иметь в 256 градусов, то 64 луча и обеспечивают четверть, т.е. 90 градусов если по-нормальному считать).
Длина каждого луча - 32. Т.е. это как-бы "дальность" взгляда.
Получаем 64*32*кол-во тактов на точку.
Таким образом самое шустрое - это именно алгоритм из спектрумэксперта (ну тот что по ссылке), быстрей я например вообразить не могу, вот замедлить - эт пожалуйста, только это категорически не нужно, хотя придётся, ведь не рисовать линии будем а делать BIT n,(HL), проверка на предмет упирания луча в стенку. Если луч упёрся - выход (что-то вроде JP NZ), а если нет - рисуем (сканируем) дальше. Длину считать/контролить - тоже накладно, так что тупо дублируем прогу 32 раза, такие дела...
Ну и сколько тактов на точку получается?
Учти, что нужно будет рисовать 64 линии (угол обзора 90 градусов потому-что, исходя из того что у нас на спеке окружность удобней иметь в 256 градусов, то 64 луча и обеспечивают четверть, т.е. 90 градусов если по-нормальному считать).
Длина каждого луча - 32. Т.е. это как-бы "дальность" взгляда.
Получаем 64*32*кол-во тактов на точку.
Таким образом самое шустрое - это именно алгоритм из спектрумэксперта (ну тот что по ссылке), быстрей я например вообразить не могу, вот замедлить - эт пожалуйста, только это категорически не нужно, хотя придётся, ведь не рисовать линии будем а делать BIT n,(HL), проверка на предмет упирания луча в стенку если. Если луч упёрся - выход (что-то вроде JP NZ), а если нет - рисуем (сканируем) дальше. Длину считать - тоже накладно, так что тупо дублируем прогу 32 раза, такие дела...
так стоять
тебе что именно нужно то?
рисование линии или чтото другое?
зачем 64 линии?
Смышленый мозг алона провел годы чтобы оптимизировать рейкастинг на zx, все разжевать и дать народу, но нет душа просит велосипеда. Чую потом будет как с нормализацией вектора, нормализовать за 500 тактов на потом умножить на 4 за 1000 :)
тебе что именно нужно то?
рисование линии или чтото другое?
зачем 64 линии?
Рейкастинг - это то-же самое рисование линии.
Но вместо установки точки - скан её на предмет того что зажжена.
Зачем 64 - я уже расписал ведь, как ещё понятней не знаю.
Прочти классику (статья Ширу) (http://zxpress.ru/article.php?id=8482)
Или в двух словах - вот тут. (http://3dgraphics.ucoz.ru/index/ray_casting/0-14)
но нет душа просит велосипеда
Никаких велосипедов, у Алонкодера была другая задача - скан мира состоящего из блоков.
У меня мир состоит из точек (в формате спек экрана, только не три а четыре сегмента).
Это позволит делать стенки как угодно а не только 90 градусов (как в классическом вольфе).
- - - Добавлено - - -
Так собственно вернёмся к вопросу: как такой код генерить можно?
Пробовал MODULE, пробовал локальные метки (всё закручено в REPT) - чёта не получается...
Destr, а зачем тебе линия в произвольном направлении?
рисуй вертикальную. просто вертикальную
Destr, а зачем тебе линия в произвольном направлении?
рисуй вертикальную. просто вертикальную
Как это просто вертикальную?
По карте-то ходить надо, направление взгляда менять...
Destr,
ты планируешь за угол заглядывать?
т.е будет ли наклонятся картинка?
Быстро я думаю лучше сделать так
;
inc l
bit 0,(hl)
ret z
jp exit
;
inc h
bit 0,(hl)
ret z
jp exit
;
inc l
inc h
bit 0,(hl)
ret z
jp exit
;
Его можно переписывать в зависимости от четверти, с глубиной все хуже, тут максимум 32. Таблица ретов будет соответственно 64*32*2, 4кб плюс таблица удаленностей 2к. Формат экрана будет со сдвигом по битам тоесть нулевой бит строки 0-63, 1 бит 32-95 и т.д. Так скорее всего уже где то делали но я не копал. Если глубину делать 48 то таблица и экран будут в 2 раза больше, 6+3 и 32 кб соответственно.
- - - Добавлено - - -
можно наверное еще и по 1/8 разделить будет немного меньше таблицы ретов занимать.
- - - Добавлено - - -
Хотя подумал, убого с такими дальностями будет, тут и так из того что дискретность относительно детализации карты гигантская, да еще и обзор небольшой, будет как дум мультиплеер.
Destr, все я понял. это не для визуализации а для рендера.
Destr, все я понял. это не для визуализации а для рендера.
Что-то долго :)
Так подскажешь что?
krt17, предложил хороший вариант, но как его скомпилить я тоже не знаю.
Начал было вбивать вручную, но мне быстро поплохело...
Меня тема заинтересовала, сделаю не торопясь, может и нормально получится.
Что-то долго :)
Так подскажешь что?
krt17, предложил хороший вариант, но как его скомпилить я тоже не знаю.
Начал было вбивать вручную, но мне быстро поплохело...
да нее понял я быстро
буквально за два сообщения
то что между ними двое суток - это да
глубина сканирования то какая?
глубина сканирования то какая?
Ну 32-х пикселей пожалуй хватит.
Это значит что надо формировать скан 5 знакомест (ну с учётом того что начало может находится и в середине байта например).
Сканер сделал, завтра рендер примитивный накидаю можно будет заценить.
Дописал рендер, рейкастинг в максимуме получился ~70к, рендер 25к. Буду думать, есть что из предвычеслений по табличкам раскинуть, думаю во фрейм можно уложится. Пока еще есть мелкие глюки и нет нормального движения, но мне нравится :)
Дописал рендер
Так покажи что-ли....
Так покажи что-ли....
Рано :) надо сделать что бы можно было побегать посмотреть, еще не решил делать ли коррекцию перспективы. Первоначальная цель в принципе выяснить можно ли уложится в фрейм, пока вроде можно, осталось немного облагородить. Хорошо то что мои опасения относительно дискретности не подтвердились, с таким форматом поработать можно.
- - - Добавлено - - -
Нашел небольшой глючек, посему наверное можно выложить 57478
Что есть:
Рейкастинг по 64 лучам на fov 90.
Рендер 64*22
Примитивная управлялка (вправо/влево/вперед)
Карта
Чего катастрофически не хватает:
Оптимизации обвязки
Коррекции перспективы и нормальной таблицы высот
Минимально удобного управления
Что по моему можно изменить
Сделать 32 луча (реально 64 не к чему)
Подумать пусть не о текстурах но хоть разноцветные сделать
В общем первоначальная моя цель проверить пиксельную карту, а не блочную по моему выполнена. Спасибо Destr'у за идею. На досуге попробую подопиливать.
В общем первоначальная моя цель проверить пиксельную карту, а не блочную по моему выполнена. Спасибо Destr'у за идею. На досуге попробую подопиливать.
Расскажи как длину считаешь?
Или сорцем кинься (на всех или в личку).
Идей ещё куча, может соберём что-нибудь приличное.
Вам надо понимать несколько очень важных вещей.
- окружность в 256 типа градусов вам большой точности в расчётах не даст. У Алония 1024 градуса на окружность.
- сканировать каждый "градус" не обязательно, но нужно делать другие проверки, а вместо пропущенных элементов карты производить интерполяции.
- пытаться уложиться во фрейм или хотя бы 2 фрейма - это утопия.
Стараться нужно делать не просто фреймовость, но ещё и достигнуть "красивой" точночти, а не лесенку как сейчас или в прошлом варианте у Дестра. На сях я тоже пробовал, в том числе по методу который сам же и описал, на выходе получил страшенную лесенку.
Дестр, чтобы не пилить килобайты монотонных процедур, запили один раз генератор таких процедур. Возьми в пример подобный генератор у Алонгия из исходника его Вольфа под экран АТМ. Там процедурка не большая, но на выходе даёт много кб кода, который производит масштабирование. Т.е. одна процедура = 1 масштаб и таких процедур там 64. Всё автоматизировано. Такая процедура легко адаптируется (например, уже подбита под Спринтера).
Файл Geatm3 в исходниках Алоновской демки the board 2.
Можно взять за основу сканер Алония, а рендер запилить свой.
Дестр, чтобы не пилить килобайты монотонных процедур, запили один раз генератор таких процедур.
Ну я и пытался придумать такой генератор, но не на уровне zx-асма, а на уровне компиляции.
Ну по типу
L=1
REPT 8
REPT 8
DB L
L=L+1
ENDR
L=L/2
ENDR
(Конечно это не рабочий кусок, а просто как-бы наглядный пример генерирования некой абстрактной таблички. Так-же можно генерить любой код, но есть ньюансы, о которые я и споткнулся).
Destr,
не проверял, но попробуй (подобные конструкции я засунул в порт Алоновского Вольфа)
L=1
REPT 8
REPT 8
db {L+1}
ENDM
{L=L/2}
ENDM
Не проверял. С другой стороны, есть скриптинг на Lua прям в основном коде (или можно вынести в include).
Ну вот "программист" подключился посему тема скатывается в пустую болтовню как это нынче у нас водится. Удачи.
в пустую болтовню
про какую пустую болтовню речь? пример кода даже привёл для Дестра, чтобы он понимал, как можно разруливать подобные "преобразования". Луа или вот такими фигурными скобками.
А вот пример рабочего кода из вольфа48 с такими скобками:
tcorrlogd:
REPT 256
db {wascorrlogd+$-tcorrlogd} & 0xff
EDUP
; LUA ALLPASS
; for i=1,256,1 do
; l_wascorrlogd = sj.get_label("wascorrlogd")
; l_tcorrlogd = sj.get_label("tcorrlogd")
; addr = l_wascorrlogd+sj.current_address-l_tcorrlogd
; byte = sj.get_byte(addr)
; --byte = word % 256
; sj.insert_define("_t", byte)
; _pc("db _t")
; end
; ENDLUA
tcos: INCBIN "cos.bin"
tlogcos: INCBIN "pluslcos.bin"
tda:
REPT 256
db {wasda+$-tda} & 0xff
ENDM
; LUA ALLPASS
; for i=1,256,1 do
; l_wasda = sj.get_label("wasda")
; l_tda = sj.get_label("tda")
; addr = l_wasda+sj.current_address-l_tda
; byte = sj.get_byte(addr)
; sj.insert_define("_e", byte)
; _pc("db _e")
; end
; ENDLUA
tctg: INCBIN "plusctg.bin"
tsin: INCBIN "sin.bin"
tscaljps: INCBIN "scaljps.bin"
DISPLAY "tID:=",$
tID:
MACRO wall arg0, arg1
db -arg0, arg1
ENDM
; REPT 64+16
; wall 0,0
; ENDM
ds 160,0
tID2:
MACRO pgwall arg0 ;4 текстуры в 1 ряд
wall arg0, 0x0 ;всего 4096 байт на 1 текстуру...
wall arg0, 0x10 ;а тут переходы на новую (след.) текстуру.
wall arg0, 0x20 ;для переходя на след.строку в текстуре
wall arg0, 0x30 ;сделать +256 от текущей позиции в текстуре.
ENDM
pgwall 0
pgwall 0
pgwall 0
pgwall 0
pgwall 0
можно сказать. что некоторые аласмовые финты ужасм легко переваривает либо с некоторыми допилами.
NEO SPECTRUMAN
30.06.2016, 23:11
на всякий случай напомню что нужно учитывать еще и такое явление
57500
можно просто не делать щелок
но стенки, наверное, все равно будет немного колбасить
я только вчера об этом вспомнил:v2_blink:
можно просто не делать щелок
Насколько я понимаю, то если "не делать щелок" (я например изначально помнил что надо двойными делать "непрямые" линии), то чтоб избежать проскакивания луча, придётся подключать такой математический аппарат, который сведёт на "нет" все потуги ускорения...
Как то я со своим кодом конечно не в теме треда, но отдельную тему по моему не к чему делать.
Вопреки утверждениям знатоков фреймовый рейкастинг вполне возможен. Сделал версию 53с, уменьшил карту и остановился на 32 лучах. Есть еще пару идей для проверки, не полные стены, вертикальные текстуры и воксельные объекты. Наверное буду доделывать до играбельной версии, если не надоест.57513
denpopov
03.07.2016, 06:49
гляньте Malady 1K, есть там движок.
krt17, тут, на форуме, ААА утверждает что он инопланетянен, но по-ходу свистит как нанятый, ибо с твоими примерами я убеждаюсь что на твоей планете какие-то иные спектрумы, с раскладкой клавы вообще непонятной.
Как в твоих демках рулить?
Или спецом делаешь чтоб никто не догадался?
Как то я со своим кодом конечно не в теме треда
В теме, в теме. Только разьясни нам сущеглупым как ты там клаву опрашиваешь....
Ты вообще молодец, на лету схватил идею, есть развитие её, тут где-то Sayman околачивался, ты с ним сконтачся, думается родите что-нибудь хорошее...
И вообще подцепляйся ICQ#492186601
гляньте Malady 1K, есть там движок.
Сорцы есть? Кидайся ссылками, please...
denpopov
03.07.2016, 08:48
Сорцы есть? Кидайся ссылками, please...
http://opensourcezx.untergrund.net/b_demo-malady_src.html
http://opensourcezx.untergrund.net/b...alady_src.html
Вот уроды!
(С) Лысый брат
(по доброму :) )
+Черт, как бы эту радость ещё запустить...
denpopov
03.07.2016, 09:00
Черт, как бы эту радость ещё запустить...
http://zxaaa.untergrund.net/view_demo.php?id=3754
Управление простое, читаю #00fe d0 вправо, d1 влево, d2 карта, d3 вперед, d4 выход из карты :) Для теста хватает, в следующем билде сделаю нормальное.
Чужие движки мало интересны, в понимании как сделать проблемы нет никакой, основные враги память и скорость, а тут каждый подходил со своей стороны. Меня интересует только 48к и желательно оставить кило 15-20 для всего остального, иначе какой в этом смысл. Чанковых вольфов хватает, но они не дают приемлемой скорости да и расход памяти на чанковый рендер запредельный.
Задачи на следующий билд
Нормальная таблица высот и коррекция перспективы
Управление:)
В перспективе
Столбцы сделать текстурой 8х1 и с частичной прозрачностью. Это также позволит в последующем накладывать обьекты.
В результате наверное в фрейм не успею, в условиях необходимости экономии памяти, но я думаю 25 фпс будет все равно играбельно, посмотрим.
Меня интересует только 48к
Это гвоздями прибито, или подумаем?
Смотри, есть такая маза, сканируешь по прежнему, только не пиксели, а страничку, (т.е. 256х64), каждый байт = это типа пиксель, при этом избавляемся от координат (вместо всяких DownHL тупо INC H получается).
Вместо BIT n,(HL) делаем OR (HL) (аккумулятор заранее обнулён), при этом RET Z выбрасывает на следующуюю итерацию, а вот если нет то начинается интересное. Можно разглядеть что в аккуме появилось и далее по выбору:
Если там установлен скажем 7-й бит, то это никаким каком непроницаемая стенка (столбец) и выход из процедуры, складываем в буфер и переходим к следующему лучу.
Если там НЕ установлен 7-й бит, но в акке не нуль то значит кидаем в буфер столбиков эти координаты и возвращаемся к сканированию дальше.
Что имеем в итоге?
Прога которая строит-масштабит стенки идёт в обратную сторону по буферу и захватив тот байт который с 0 в 7-м бите отрисовывает не просто столбец, а сделав AND имеет номер текстурки который и отображает.
Таким макаром можно делать заборы, окна, двери, в общем как-бы альфа-канал у нас получается.
Надеюсь внятно объяснил, если не - разжую, только блин в асю стучись, или маякни там модераторам чтоб сделали тему закрытой для всех, кроме нас с тобой (ну подтянем ещё кого надо будет) и накалякаем наконец-то нормальный фреймовый 3д (даже сценарий есть).
- - - Добавлено - - -
http://zxaaa.untergrund.net/view_demo.php?id=3754
Не хочет Unreal это хавать, хоть тресни :(
- - - Добавлено - - -
в следующем билде сделаю нормальное.
Заодно попробуй считать длину "в лоб" (по количеству пиксельных итераций), чтоб не было этого "закругления" стенок к краям экрана, и не надо будет корректить всякими умножениями на cos.
Вообще то так уже сделано, от bit я отказался сразу, когда карта была 256х256 было and (hl), сейчас 64х256 стало естественно or (hl). Повторю, как сделать в теории проблемы нет, есть оптимизация по пямяти и скорости, отсюда и выбор табличка, декрюнч или вычисление.
- - - Добавлено - - -
Заодно попробуй считать длину "в лоб" (по количеству пиксельных итераций), чтоб не было этого "закругления" стенок к краям экрана, и не надо будет корректить всякими умножениями на cos.
Это не так делается, все будет не торопись.
denpopov
03.07.2016, 12:10
Не хочет Unreal это хавать, хоть тресни
Unreal - *****, переходи на Spectaculator 8
Поправил управление, модификацию рендера и сканера сделаю попозже, там полностью надо переделать под последующие задумки. Теперь можно побегать повертеться, wasd op m 57516
Теперь можно побегать повертеться
Хорошо бы карту прикрутить, ориентироватся затруднительно.
Да и вообще с таким разрешением надо толкового дизайнера привлекать, тогда пожалуй будет гуд.
Хорошо бы карту прикрутить
Ну как бы она с первого билда есть, в последнем кнопка m.
Bedazzle
03.07.2016, 17:25
Хорошо бы карту прикрутить, ориентироватся затруднительно.
Кнопка "м" же?
denpopov
03.07.2016, 17:31
Хорошо бы карту прикрутить, ориентироватся затруднительно.
Золотое правило Wolfenstein : придерживайся правой стены.
=)
Кнопка "м" же?
О, и правда!
Золотое правило Wolfenstein : придерживайся правой стены.
=)
Не всегда работает, я в каком-то уровне чуть не целый день кругами ходил как дурак по этой правой стенке...
denpopov
03.07.2016, 17:39
Не всегда работает, я в каком-то уровне чуть не целый день кругами ходил как дурак по этой правой стенке...
а ты лабиринт генерируешь или как?
а ты лабиринт генерируешь или как?
Я руками рисовал (кстати похожий получился, видимо паралельно мыслим с krt17), но раз он уже взялся делать я бросил (ещё и потому что не сумел с масштабированием разобратся).
Задача по теме, нужно из вертикального экрана нарисовать обычный (атрибутами). Веритикальный значит хранится столбцами, так как в столбцах рисовать придется не раз, с наложением. У меня пока так:
ld d,(hl)
sub c
ld l,a
ld e,(hl)
sub c
ld l,a
push de
Чую некую неоптимальность казалось бы простой задачи. Рисовать по вертикали тоже не вариант, луч не дремлет. Может у кого какие идеи?
NEO SPECTRUMAN
03.07.2016, 23:29
Заодно попробуй считать длину "в лоб" (по количеству пиксельных итераций), чтоб не было этого "закругления" стенок к краям экрана, и не надо будет корректить всякими умножениями на cos.
тогда придется считать и коррекция закругления камеры (хотя возможно будет другое искажениеи)
и коррекцию заквадратения пространства
длина пикселя по вертикали и по диагонали разная ;)
Пи = 3.14 а не 4
но скорость в 22t на пиксель ;) того стоит
большая часть фрейма свободна на всякие корекции и отрисовки :v2_dizzy_vodka2:
- - - Добавлено - - -
Задача по теме,
видел как alone хранит карту, экранный буфер, всякие таблицы итд в своем 48 вульфе?
(таблицы бывают не только горизонтальными хх00-ххFF но и вертикальными 00хх-FFxx) ;)
храни свой буфер экрана так же
dup 32
24 байта столбца 232 байта других данных
edup
или
dup 24
32 байта строки 224 байта свободно
edup
появляется возможность двигаться по буферу как вертикально так и горизонтально incdec-ами
можно делать блур-ы и всякие постобработки
можно двигаться и отрисовывать змейкой
inc l inc l inc l
dec h
dec l dec l dec l
dec h
inc l inc l...
Все проект закрыт мне надоело, всем спасибо.
Все проект закрыт мне надоело, всем спасибо.
Оригинально. Прекольна. Так держать.
denpopov
04.07.2016, 06:26
Все проект закрыт мне надоело, всем спасибо.
Уже не первый раз: не доделал и выбросил неизвестно что.
Оригинально. Прекольна. Так держать.
Уже не первый раз: не доделал и выбросил неизвестно что.
Я всегда так делаю, как только дело подходит к рисованию, теряю интерес. Возможно когда нибудь сделаю по правильному, сначала все нарисовать и расписать, а потом кодить, но шансы подобного близки к 0. А пока еще одна папка в директории projects. Хотя тут кода на 3 вечера, кому надо он все сам сделает.
denpopov
04.07.2016, 10:14
Я всегда так делаю, как только дело подходит к рисованию, теряю интерес.
я слышал такую поговорку: "Дуракам полработы не показывают". Жаль, что ты не доделал(
Может,ТС доведет движок до конца?
Может,ТС доведет движок до конца?
Доводить может и стоит. Сильно низкое разрешение, всё в квадратах и лесенках. Это типа предел для 48Кб? Что-то мне подсказывает, что нет. А krt17 вместо бросания сделал бы оптимизацию уже тогда чтоли, чтобы разрешение было повыше и лестниц поменьше. Бросил не успев начать. Тут до рисования ещё как до Китая ползком.
NEO SPECTRUMAN
04.07.2016, 19:23
Оригинально. Прекольна. Так держать.Обычное дело в погоне за фрЭймовостЪю...
- - - Добавлено - - -
Все проект закрыт мне надоело, всем спасибо.
забей на спек (там импортозамещение всякое:v2_laugh:)
и переходи на Специалист\Орион\Вектор
они будто созданы для всяких вульфов:v2_dizzy_rastoman:
особенно вектор с его возможностью отрисовывать 128 столбцов стеком
Мда, в коей веки согласен с гоблином.
Мда, в коей веки согласен с гоблином.
Так кинь сорцы, если не нужны уже, хоть поглядеть что и как делал, надо ведь и нам учится у кого-то...
NEO SPECTRUMAN
05.07.2016, 22:39
Кстате стрельбу(и свою и врагов) можно сделать пусканием одиночного луча, того же, что и для сканирования :v2_dizzy_turn:
NEO SPECTRUMAN
09.07.2016, 19:31
Задача по теме, нужно из вертикального экрана нарисовать обычный (атрибутами). Веритикальный значит хранится столбцами, так как в столбцах рисовать придется не раз, с наложением. У меня пока так:
ld d,(hl)
sub c
ld l,a
ld e,(hl)
sub c
ld l,a
push de
Чую некую неоптимальность казалось бы простой задачи. Рисовать по вертикали тоже не вариант, луч не дремлет. Может у кого какие идеи?
По ходу самым оптимальным будет
запилить развернутую процедуру переброски всех столбцов
ld a,(nnnn) ;13
ld (nnnn),a ;13
...
;26\1b 6b
;итого 19968t на переброску
;4608 байт на процедуру переброски
или
pop de ;10
add hl,bc ;11
ld (hl),d ;7
add hl,bc ;11
ld (hl),e ;7
...
;46\2b 5b
;итого >17664t на переброску
;>1920 байт на процедуру переброски
или
pop hl ;10
ld a,l ;4
ld (nnnn),a ;13
ld a,h ;4
ld (nnnn),a ;13
...
;44\2b 9b
;итого >16896t на переброску
;>3456 байт на процедуру переброски
хотя уже и не актуально...
хотя уже и не актуально...
Любая инфа по практике актуальна, спасибо!
NEO SPECTRUMAN
09.07.2016, 20:27
Любая инфа по практике актуальна
на практике как оказалось промах луча не редкость
луч пробивает и 2 стенки(с тольщиной 1 пиксель) под разными углами
иногда даже 3
так что никакие щели не допускаются
http://zx-pk.ru/attachment.php?attachmentid=57500&d=1467317226
на практике как оказалось промах луча не редкость
луч пробивает и 2 стенки(с тольщиной 1 пиксель) под разными углами
иногда даже 3
Чертёж не верен твой, ведь обсчёт идет по клеткам (ну типа как у тебя, синии - есть, пустые = нету препятствия).
А у тебя нарисовано пограничный счёт.
В общем линия (луч) кидается исходя из соображений (математическая абстракция) что координаты внутри клетки ТЕ-ЖЕ САМЫЕ ЧТО И В ИСХОДНОЙ.
В общем поразмысли, если не догоняешь сам я тебе нарисую чертёжик (или гуру опередят и подскажут где ты ошибся).
В общем принимай работу алгоритма брезенхема так, что твоя зелёная точка на каждой итерации очутится в ТОЙ-ЖЕ клеточной (внутренней) координате что была в исходной.
И так до достижения успеха (исчерпана длина луча, либо приехали в оконечную координату линии)
хотя уже и не актуально...
Вы тут че укуренные? Мой вариант 41/2, мне взамен предлагаете 3 более тормозных еще и с разворотом, еще и под луч подставлять.
Хотя уже и правда не актуально, все значительно эволюционировало.
NEO SPECTRUMAN
10.07.2016, 23:19
Вы тут че укуренные?
До.
твой снапшот еще не дебагал...
41/2
закинь сюда посмотреть
Чертёж не верен твой, ведь обсчёт идет по клеткам
чертеж не мой
проблема актуальна для многих вариантов реализации
да и такая реализация как на рисунки проще некуда
одна 16 битная таблица синуса и все
никаких линий и 20 процедур для каждой стороны света
медленно и сердито небольшие расходы на память
и полученное растояние(количество шагов) готово к использованию
нужно только коррекцию искажению камеры и все.
а если двигаться по каждой клеточке (как стена) то расстояние уже будет получено левое
А кто-нибудь в курсе как на этой LUA сделать SELECT-CASE ?
А кто-нибудь в курсе как на этой LUA сделать SELECT-CASE ?
вот тут штук 10 вариантов
http://lua-users.org/wiki/SwitchStatement
вот тут штук 10 вариантов
http://lua-users.org/wiki/SwitchStatement
А как это к sjasm прикрутить?
А как это к sjasm прикрутить?
как-нибудь так:
LUA
function switch(n, ...)
for _,v in ipairs {...} do
if v[1] == n or v[1] == nil then
return v[2]()
end
end
end
function case(n,f)
return {n,f}
end
function default(f)
return {nil,f}
end
switch( action,
case( 1, function() <то что надо в случае 1> end),
case( 2, function() <то что надо в случае 2> end),
default( function() <делаем что-то по умолчанию> end)
)
ENDLUA
как-нибудь так:
Все выходные собирал-разбирал, но так и не заработало.
Сумел заставить только компиль принимать этот код не ругаясь ошибками, а как с ним обращатся - так и не получается.
Надо чтобы код вида:
SELECT
CASE 1
LD B,15
CASE 2
LD C,20
ENDSELECT
компилился в что-то вроде
CP 1
JR NZ,L1
LD B,15
JR KONEC
L1 CP 2
JR NZ,L2
LD C,20
JR KONEC
L2....
KONEC:
вот так не прокатит?
ORG 30000
LUA
commands = { [1]='LD B,15', [2]='LD C,20', [3]='LD D,35'}
for i=1,3 do
sj.insert_label("L" .. i, sj.current_address+8)
sj.parse_code("CP " .. i)
sj.parse_code("JR NZ,L"..i)
sj.parse_code(commands[i])
sj.parse_code('JR KONEC')
end
ENDLUA
KONEC:
в списке комманд описываешь с чем сравнивать и что в серединку пихать.
вот так не прокатит?
Не, видать этот LUA пока что не для меня...
Destr, ты говори конкретно, примером кода, что ты хочешь запилить на Луа. т.е. не просто абстракция, а код, который ты хочешь получить на выходе при помощи луа или чего-то там.
заходи в аську, потрындим...
а тем временем на Next`е:
https://www.youtube.com/watch?v=VJQCVfEmnI0&feature=youtu.be&fbclid=IwAR2SpqCfNiq8YCInF6FPQp_MCRkupt0eHboGnTSvG JcVOKI2mNiQSibuxrE
NEO SPECTRUMAN
21.01.2020, 02:01
а тем временем на Next`е:
https://www.youtube.com/watch?v=VJQC...KI2mNiQSibuxrE
вырвиглазная менюшка резинового(в плохом смысле этого слова) некста вырвиглазна...
и теплый и ламповый АТМ может почти так же...
а так конечно
там хардварное умножение\деление облегчающее жизнь
в списке расширенных команды z80мулятора
- - - Добавлено - - -
а ну и да
НЕКСТ - НЕ СПЕКТРУМ!!! :v2_tong2:
это фпгадевконфа :v2_dizzy_bomb:
и теплый и ламповый АТМ может почти так же...
я даже не сомневаюсь в этом, но дело не в "может/не может", а в том, могут или не могут наши кодеры. Вот был Алоний (и где-то он и сейчас есть), но не смог в сабж. А больше, видимо, не кому. Я точно "не силён в математике (папа решает, а Вася сдаёт)". А там (в группе Некста), я только кинул клич про Вольфа, БАЦ и через неделю уже первая демка появилась.
ну и да, Некст вполне себе Спектрум, как и ламповый АТМ.
Вот был Алоний (и где-то он и сейчас есть), но не смог в сабж.
? Вот (https://youtu.be/QBAoH3rY-sY?t=87) же (там только спрайтов нет, в отличие от его wolfов под спековский экран), аж 2013 года.
? Вот (https://youtu.be/QBAoH3rY-sY?t=87) же (там только спрайтов нет, в отличие от его wolfов под спековский экран), аж 2013 года.
этим всё и закончилось. просто демка в демке. дальше этого проект не двинулся. а на нексте скоро уже игру выпустят. Алоний не желает ничего слышать про Вольфа.
а на нексте скоро уже игру выпустят
Когда выпустят, тогда да, а пока и там и там демки (хотя на нексте более развитые).
NEO SPECTRUMAN
21.01.2020, 16:16
Вот же (там только спрайтов нет, в отличие от его wolfов под спековский экран), аж 2013 года.
этим всё и закончилось. просто демка в демке. дальше этого проект не двинулся.
оно теперь идет в комплекте к nedoOS
- - - Добавлено - - -
http://nedoos.ru/
- - - Добавлено - - -
вот же РШКГКЦ;Оцк!дь!!!
svn export failed for "Release.r350".
оно щас чот не качается
еще одни до обновлялись?
- - - Добавлено - - -
последняя версия, на вид,
от ноября 2019
ну и пока это все таки демка...
https://jpegshare.net/images/9b/2d/9b2db2f854270386855dd1d83ea426e1.png
- - - Добавлено - - -
Алоний не желает ничего слышать про Вольфа.
ну дык ужошь одного запилил...
оно теперь идет в комплекте к nedoOS
это всё та же старая демка. ничего нового там нет. дверей нет, спрайтов нет, ИИ нет, пушки нет, ничего нет. исходники без комментариев. Алоний не желает ничего рассказать про них (исходники). никто не может прочитать его исходники, а алоний - я 2 или 3 раза просил его запилить описание его алгоритма и ничего. вместо этого он решил запилить никому не нужную ось. всё что смог из него выжать, это то, что окружность там считается как 512 градусов, что для устранения рыбьего глаза он вместо корней использовал логарифмы (по его словам - квадратный корень в представлении логарифма это деление на 2) и что-то ещё там говорил. за все года никто не смог хоть что-то понять в его исходниках. а про старого Вольфа он говорил. что не доволен им и что он вообще прям корявый.
NEO SPECTRUMAN
21.01.2020, 18:46
(по его словам - квадратный корень в представлении логарифма это деление на 2)
ну дык вспоминай как пользоваться логарифмической линейкой же
ну или матчасть
умножение
A*B = 10 ^ ((log A)+(log B))
деление
A/B = 10 ^ ((log A)-(log B))
корень n-й степени
nV¯A = 10 ^ ((log A) / n)
n-я степень
A^n = 10 ^ ((log A) * n)
и вообще лагорифмы это же крута (не то что этот ваш некст...)
ну и через логарифм
это пока самое быстрое что можно на спектруме
(конечно после полных таблиц на 16К+)
ну и есное дело в реалиях спектрума
логарифм и степень нужны не 10тичные
а наиболее подходящие по точности в каждом конкретном месте
что для устранения рыбьего глаза он вместо корней использовал логарифмы
какой еще рыбьий глаз?
не помню такого...
для коррекции результата (цилиндрическое закругления матрицы камеры изза которого теряется чувство наличия перспективы)
вроде же юзают умножение на синус угла?
я делал оно развернутыми процедурами на сдвигах
для каждого угла своя процедура
или не у попиксельных рейкастеров еще и свои артефакты?
- - - Добавлено - - -
а про старого Вольфа он говорил. что не доволен им и что он вообще прям корявый.
ну да
ну зато он есть
и даже плеябельный
citadel выглядит гораздо интересней
но оно только демо...
вместо этого он решил запилить никому не нужную ось.
вместо того чтобы пилить тот очень шыстрый 3d движок из последнего IG...
...
citadel выглядит гораздо интересней
Алоний как-то говорил, что в Цитадели нет рейкастинга, что там голимая "анимация", как и в думе от ДР или в ZXOOM.
какой еще рыбьий глаз?
не помню такого...
рыбий глаз
https://zxpress.ru/illustrations/793/ig5_ray07.png
а наиболее подходящие по точности в каждом конкретном месте
вот тем более. а Алоний и об этом не говорил.
вместо того чтобы пилить тот очень шыстрый 3d движок из последнего IG...
да чё-то не ощутил я там крутости этого 3д движка. очередная демка для пати и не более.
NEO SPECTRUMAN
21.01.2020, 21:59
вот тем более. а Алоний и об этом не говорил.
дык это описано еще в доисторической литературе
и по идеи известно всем кто хотел научится умножать\делить...
по тем же причинам и таблицы синуса в диапазоне -127+127
а не -1 +1 как ИРЛ
да чё-то не ощутил я там крутости этого 3д движка. очередная демка для пати и не более.
ты его ФПС хоть видел?
на 3,5 МГц-ах
Алоний как-то говорил, что в Цитадели нет рейкастинга, что там голимая "анимация", как и в думе от ДР или в ZXOOM.
это так алоний пиарит своих вульфов :)
скорей всего просто кто то не понел о чем идет речь
пушо среди демок есть и тупые анимации
а я говорю про эту цитадель
https://vtrd.in/demo_ver/CITDEMO-.ZIP
с цветом (можно отключить)
и фулл скрином (можно поставить в опциях)
спрайтами с маской (а не как у некоторых :) )
с наклоном камеры вверх\вниз
с кучей жменей оружия
с анимированными текстурами
с стенами под разными углами
+бочки взрываются
трупы остаются
враги ПОВОРАЧИВАЮТСЯ МАТЬ ЕГО СПИНОЙ! ане всегда лицом
еще надо в настройках тушить быстрый поворот
ну вощем любой среднестатистический вульф сосет
https://jpegshare.net/images/64/c9/64c91d4612a9a6948b6d4f61077212b2.png
в чб лучшо
https://jpegshare.net/images/59/84/59840549a035caf4a1e7733118372aa7.png
без интерлейса смотрим вниз
https://jpegshare.net/images/4f/25/4f25859d6367db116bf54580e2745edb.png
собственно смотрим вверх
https://jpegshare.net/images/58/54/5854f7f202a3543e531b5499eeb233ac.png
- - - Добавлено - - -
https://zxpress.ru/illustrations/793/ig5_ray07.png
сто пудова это "закругление" камеры
о котором я говорю
вот отключил коррекцию у себя
https://dropmefiles.com/fVx9a
и видем подобную гадость
https://jpegshare.net/images/9b/7a/9b7a5144b2a0c361d87af6b59ea6ca77.png
+покрути камеру и посмотри как оно ужасно смотриться без коррекции
это не похоже на рыбьий глаз ну не как...
а если это обзывать рыбим глазом
то искажения должны были бы меняться по краям экрана при повороте
а не как тут...
впринципе можно проинвертировать значения угла корекции
и получить выпуклость в другую сторону
и обозвать это рыбьим глазом...
а так это совершенно другое явление
изза того что в результате
изображение как бы спроецированно на цилиндр а не на плоскость...
а коррекцией этот цилиндр разворачивают...
как побочный эффект разворачивания
появляются артефакты на тумане
видимость по краям экрана отличается от видимости по центру...
у меня это видно
- - - Добавлено - - -
Кстате у попиксельного движка
в котором луч движется при помощи последовательности inc l inc h
есть еще "квадратные" искажения пространства
тк луч по диагонали делает столько же шагов
сколько луч летит по прямой
но действительное растояние до точки по диагонали 1,4142
когда по прямой 1
и это тоже корректируется
конечно в "большой" версии моего рейкастера
значение всех расстояний уже скорректированны и лежат прямо в коде
а не считаются (тк 3 коррекции не очень хорошо сказываются на качестве результата)
...ну и сама процедура рейкастинга по моему занимает 3х16К страницы подряд (атм наше все :) )
и видем подобную гадость
я там в целом вообще кроме гадостей и пиксельной каши ничего не смог разглядеть. и я таки не понял, при чём тут псевдоправославный АТМ и твой пример?
Цитадель тоже плохой пример - проект не закончен и в сравнении с движком от Алония, в Цитадели тоже пиксельная муть.
в котором луч движется при помощи последовательности inc l inc h
это не движение луча, а скорее перемещение по таблицам по которым движется луч. что характерно, в цитадели и в твоём примере жутко большая "лесенка" при построении стен, а в Воль48 такого нет (и на Спринтере нет и на Нексте нет). поэтому я и говорю - у Алония не документированный алгоритм.
NEO SPECTRUMAN
22.01.2020, 09:45
при чём тут псевдоправославный АТМ и твой пример?
как бы задумано под 320х200 АТМ-а или под 16с ЭВЫ
а это чисто проверка на 128-к
и в твоём примере жутко большая "лесенка"
ну дык умя разрешение по горизонтали 32 пикселя :)
под АТМ наверно будет интерполяция
тк поднять "разрешение" по количеству углов уже не получится
тк уже нет одновременно адресуемой памяти под рейкастер+карту
ну или нужно жертвовать дальностью обзора
которая и так не ахти...
...хотя можно слегка и повысить (потратив еще дохрена памяти)
тк же у движка другая проблема
низкое "разрешение" пространства
и поделать с этим, в условиях спектрума, ничего нельзя...
хотя буквально только что придумал как слегка повысить детализацию (вспомнил как в вульфах делаются двери)
ну и в связи с низким разрешением
все очень плохо с дискретностью перемещения камеры
если двигаться под небольшим углом к рядам\столбцам "таблицы"
то заметно ощутимы ступеньки перемещения
умя есть идеи как это явление слегка сгладить
но это нужно будет долго плясать с бубном
а результат может не оправдать надежд
(так например добавление "наклонных" столбцев при отрисовке картинку практически не улучшило.... а памяти и времени сожрало целую кучу...)
...
хотя сам движок без перспективный (тк нет никакой возможности потом нормально нарисовать спрайты поверх)
и у меня нет особого желания пилить его дальше
да и времени нет на это...
- - - Добавлено - - -
в цитадели
жутко большая "лесенка" при построении стен
отключи фуллскрин :)
They will NOT release Wolf3D for Next, it's just technology demo/preview/test.
They plan to create their own new game with that technology (to avoid any copyright issues, and also who needs Wolf, you can play it any time on PC, even in web browser, having something completely new is even better).
While writing ray-casting on Next is not "easy" (and it has only DE=D*E multiplication (8x8=16 bits and fixed registers), no HW division), it's nowhere near as difficult as original ZX, and I believe also the ATM demo was lot more difficult to write (plus 4bpp colors headache to work with two pixels at the same time) ...
Next is a bit like ~22-23MHz PC 286 in DOS times (also with similar "640k will be enough for everyone" memory size, and mode 256x192x8bpp similar to famous PC "13h" 320x200x8bpp), but with Z80N instead of 80286 - probably important difference if you are doing only Z80 or only x86 assembly, but on global scale (compared to other architectures like PIC/ARM/M68k/PowerPC/...) these two are actually very similar (logically, as both are based on i8080 heritage). So writing Wolf3D for it is like "medium" difficult, that Next demo doesn't impress me *that* much (except the speed at which it was produced, just couple of days, while *I* need often weeks/months to finish anything).
But... this is my *theoretical* shit-talk... do I have my own engine for Next? At least same, if not better? No. I have zero bytes of my engine. So kudos to Mike for actually *doing* it, and doing it very quickly. And I'm definitely looking forward for the new game, which will very likely impress me [lot more than Wolf demo].
NEO SPECTRUMAN
22.01.2020, 10:09
Цитадель тоже плохой пример - проект не закончен
а в Воль48 такого нет
а вольф 48 тоже незакончен
хоть в нем и есть целый один спрайт и еще памяти под целых полтора...
но в цитаделе есть
враги
двери
оружие (можно самоубиться апстену со своей базуки стреляя впритык)
да и движок по сути готовый
нет только уровней...
- - - Добавлено - - -
no HW division
ага это я с чем то спутал
там только умножение за 8 тактов...
но умножение
легко превращается в деление
при желании
- - - Добавлено - - -
writing ray-casting on Next is not "easy"
у некста заявлено отображение до 100 спрайтов в строке из 128
спрайты 16х16
у могут умножаться на 2, 4, 8 по высоте\ширине
и есть построчные прерывание
тоесть можно наладить быструю отрисовку экрана чисто спрайтами
да еще и немного с экономить памяти на хардварном 2х масштабировании...
как бы задумано под 320х200 АТМ-а или под 16с ЭВЫ
по демке и не скажешь, что она под атм)) чанки на чанках и...
тк поднять "разрешение" по количеству углов уже не получится
тк же у движка другая проблема
низкое "разрешение" пространства
и поделать с этим, в условиях спектрума, ничего нельзя...
хотя буквально только что придумал как слегка повысить детализацию (вспомнил как в вульфах делаются двери)
ну и в связи с низким разрешением
все очень плохо с дискретностью перемещения камеры
вообще это всё надуманные проблемы. в Wolf48 Алоний использовал EoR-Fill для текстур и спрайтов. проблем с детализацией, относительно той же цитадели и твоего примера нет. Всё очень хорошо выглядит для Спектрума, очень плавно. и это в рамках 48кб. я только напомню, что сейчас никто для АТМ или Спектрума (не Некста) никакие рейкастинги не делает и это печально. А сравнивать движки можно долго (но бессмысленно).
Что касается самого Wolf48 то, как я уже говорил ранее, Алоний взял за окружность не 256 и не 360 градусов, а 512. Лучей кидет всего 32, но это по его словам - вместо 256 лучей (на каждый столбец/пиксель) он кидает каждый восьмой луч (т.е. 32 луча всего), а остальное интерполяция. В самом движе есть отладка трассировки лучей и там видно, что кол-во лучей меняется. не знаю как он это делает. вот и пачка оптимизаций. плюс в версии для АТМ/Эво у него на 14.8кб развёрнуты (сгенерированы) процедуры вывода текстур на 64 масштаба (т.е. 64 процедуры вывода, каждая под свой масштаб). большего я узнать не смог.
NEO SPECTRUMAN
22.01.2020, 10:47
он кидает каждый восьмой луч (т.е. 32 луча всего), а остальное интерполяция.
по моему он кидает дополнительные лучи
когда соседние не попадают в одну стену
а для одной стены достаточно 2-х лучей вообще
остальные расстояния и координаты текстуры можно интерполировать
при том если бы считать с большой точностью
можно было бы интерполировать так
что просто не отличишь от пуляния 100500 лучей
- - - Добавлено - - -
Алоний использовал EoR-Fill
ну да
а потом только n переходов на текстуре
и чб
а я хочу 16с
и зеркальное отражение на полу
и туман
..
а я хочу 16с
и зеркальное отражение на полу
и туман
зеркальное отражение на полу ещё туда сюда, но туман, да ещё и при 16ти цветах (с палитрой 64 цвета)... такое себе. мало того, мощей машины не хватит. сделал бы пока без тумана под 16с и, да, исходники уже выкладывай для изучения).
NEO SPECTRUMAN
22.01.2020, 13:58
зеркальное отражение на полу ещё туда сюда, но туман, да ещё и при 16ти цветах (с палитрой 64 цвета)... такое себе. мало того, мощей машины не хватит. сделал бы пока без тумана под 16с
туман так же как зеркальный пол
идет из коробки
тк чисто прекалк
и если не сделать туман
сразу всплывет крайне короткая дальность обзора...
так же в таком попиксельном рейкастере
мы не можем нормально определить в какой столбец текстуры попадает лучь
мы можем определить только факт попадания в гигантский столбопискель...
хотя не совсем
зная угол пуляния луча
можно слегка узнать примерную координату на текстуре
но качественно это все равно не будет
и нормальные текстуры скорей всего не выйдут...
...и будет это нормальный рейкастер внутри попиксельного рейкастера...
...или даже можно сделать отдельные пиксели карты цилиндрическими
или может даже диагональными
нужно подумать в этом направлении
исходники уже выкладывай для изучения)
ну исходнике
нечитаемый *****код на луа
в котором я сам еле разобрался
когда потом решил немного дописать :)
...и еще там ошибко накапливается
и отрисовка там чисто лиш бы работало написана...
вощем сорцы пока засекречены :)
ну исходнике
нечитаемый *****код
что же вы так *****код любите пилить не читаемый? ещё и луа зачем то приплёл сюда... всё смешалось - люди, кони... ясна, не видать нам Вольфа.
NEO SPECTRUMAN
22.01.2020, 21:47
и луа зачем то приплёл сюда.
а как по твоему сгенерировать 40 кило рейкастера?
ручками?
синклер бейсимком считать 20 минут?
если написать "установщик" на асме
он будет еще менее читаемім
а так
все же єлементарно
нужно просто запилить генератор последовательностей inc l inc h
для каждого угла
математека 5 класс :)
Bedazzle
22.01.2020, 22:49
Я в рейтрейсах/кастах не понимаю, но просто как идея - а нельзя делать две карты (одну - честную, другую - сильно уменьшенную), чтобы примерную проверку делать по мелкой, а детальную при необходимости - по нормальной? Может, получится что-то сэкономить на скорости?
NEO SPECTRUMAN
22.01.2020, 23:31
Я в рейтрейсах/кастах не понимаю, но просто как идея - а нельзя делать две карты (одну - честную, другую - сильно уменьшенную), чтобы примерную проверку делать по мелкой, а детальную при необходимости - по нормальной? Может, получится что-то сэкономить на скорости?
можно
можно сделать по принципу тайлов
но скорей всего получится сэкономить только на качестве
по крайней мере на попиксельном рейкастере
на моем движке это не будет хорошо работать
тк при попадании нужно будет кинуть луч под тем же углом что он и влетел в "квадрат"
а это не реально быстро сделать
на движке на основе таблицы синуса и простого add hl,de
это будет работать по лучше
тк угол полета луча это вектор
(тупо смещение по двум координатам относительно предыдущей точки)
вот на НЕ попиксельном рейкастере
,который работает на матане
а не на примитивных алогоритмах на подобии ротозумера,
возможно это будет УЖЕ эффективно
возможно на больших сложных картах (там где сотни разных стен в кадре друг за другом)
будет прирост скорости
кстате алоний
в какой то недодемке
с проекцией пола трасы
по моему и делает оно тайлами
чтоб не хранить гигантскую карту
- - - Добавлено - - -
чтобы примерную проверку делать по мелкой, а детальную при необходимости - по нормальной?
но вполне может возникнуть такая ситуация
луч летит по карте тайлов
попадает в квадрат в котором якобы что то есть
1 мы ВНЕЗАПНО лезем в таблицу
2 переключаем страницы в котором лежит подробная карта тайла
3 считаем новые координаты для запуска луча в этом "квадрате"
4 пускаем луч по подробной карте тайла
5 НО ВНЕЗАПНО ЛУЧ ПРОЛЕТАЕТ НА СКВОЗЬ НИЧЕГО НЕ ЗАЦЕПИВ!!!
6 и мы ВНЕЗАПНО переключаем страницу обратно на карту тайлов
7 пересчитываем новые координаты запуска луча (тк они отличается от кооординаты влетания в квадрат)
8 запускаем по новой лучь на карте тайлов
сколько мы потеряем времени?
ну тоесть как всегда
палка с 2-мя концами...
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot