Это не настоящий ответ.Это всего лишь некоторые идеи и переписывание функции, как я понимаю, в более понятной форме.
Я очень подозреваю, что ваша проблема была в строке:
if( ((WORD*)zdata)[i] + AsmDrawData.ShiftZ0 >= ((WORD*)zbuffer)[i] )
В этом кодеВы переводите указатель zdata
из байта в указатель word .Это кажется странным для меня.Сборка, похоже, сделала то же самое.Поскольку вы, вероятно, знаете больше о том, как заполняется поле zdata , вы, вероятно, можете сделать более точное определение по этому поводу.
Этот алгоритм zbuffer представляется довольно стандартным, поэтому даже без попыток обратного инжинирингаВ этой сборке вы сможете довольно легко перестроить его на C.
Я переписал это,.Мне нравится сохранять это локализованным, поэтому я просто объявляю локальные указатели сверху, которые имеют правильные типы (и также использую имена stdint C99, потому что они более переносимы, чем WORD).
#include <stdint.h>
inline void AsmDrawWithZ16(BYTE *zdata,BYTE *data,WORD *zbuffer,void *video,int no_dot) {
uint8_t * zd = zdata; // Should this be 8 or 16 bit
uint8_t * dat = data;
uint16_t * zb = zbuffer;
uint16_t shz = AsmDrawData.ShiftZ0;
uint16_t * vid = (uint16_t *)video;
for( int i = 0; i < no_dot; i++ ) {
uint16_t X = shz + zd[i];
if( X >= zb[i] ) // Is this the correct direction of the compare
{
zb[i] = zdata[i] + X; // update the depth
vid[i] = AsmDrawData.Palette[ dat[i] ]; // update the color
}
}
}