forked from Lephenixnoir/Azur
corrected azrp_circle shader to work with multiple instances
This commit is contained in:
parent
406cc3739e
commit
9cf20a11d9
|
@ -26,33 +26,29 @@ static int max(int x, int y)
|
|||
|
||||
//---
|
||||
|
||||
#define TABLE_WIDTH 512
|
||||
|
||||
uint16_t DataPixelsX[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width
|
||||
uint16_t DataPixelsY[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width
|
||||
uint16_t NbPixels[14]; // Nunmber of pixels in each fragment
|
||||
#define TABLE_WIDTH 256
|
||||
|
||||
struct command {
|
||||
uint8_t shader_id;
|
||||
uint16_t color;
|
||||
uint8_t curr_frag;
|
||||
uint16_t *pixnb;
|
||||
uint16_t *dataX;
|
||||
uint16_t *dataY;
|
||||
uint16_t NbPixels[14]; // Nunmber of pixels in each fragment
|
||||
uint16_t DataPixelsX[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width
|
||||
uint16_t DataPixelsY[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width
|
||||
};
|
||||
|
||||
void AddPixel( int16_t xp, int16_t yp )
|
||||
void AddPixel( int16_t xp, int16_t yp, struct command *cmd )
|
||||
{
|
||||
if (xp >= 0 && xp < azrp_width && yp >= 0 && yp < azrp_height)
|
||||
{
|
||||
uint8_t cfrag = yp / azrp_frag_height;
|
||||
uint16_t nbpixinfrag = NbPixels[ cfrag ];
|
||||
uint16_t nbpixinfrag = cmd->NbPixels[ cfrag ];
|
||||
|
||||
uint16_t index = cfrag * TABLE_WIDTH + nbpixinfrag;
|
||||
|
||||
DataPixelsX[ index ] = xp;
|
||||
DataPixelsY[ index ] = yp & 15;
|
||||
NbPixels[ cfrag ]++;
|
||||
cmd->DataPixelsX[ index ] = xp;
|
||||
cmd->DataPixelsY[ index ] = yp & 15;
|
||||
cmd->NbPixels[ cfrag ]++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,9 +69,7 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color)
|
|||
return;
|
||||
}
|
||||
|
||||
// reset the point counters in each cell of the table
|
||||
for( int i = 0; i < 14; i++ )
|
||||
NbPixels[i]=0;
|
||||
|
||||
|
||||
|
||||
int ytop = max( ymin, 0 );
|
||||
|
@ -91,6 +85,9 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color)
|
|||
cmd.color = color;
|
||||
cmd.curr_frag = frag_first;
|
||||
|
||||
// reset the point counters in each cell of the table
|
||||
for( int i = 0; i < 14; i++ )
|
||||
cmd.NbPixels[i]=0;
|
||||
|
||||
int x = 0;
|
||||
int y = rad;
|
||||
|
@ -98,14 +95,14 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color)
|
|||
|
||||
while (x <= y)
|
||||
{
|
||||
AddPixel( xc+x, yc+y );
|
||||
AddPixel( xc+y, yc+x );
|
||||
AddPixel( xc-x, yc+y );
|
||||
AddPixel( xc-y, yc+x );
|
||||
AddPixel( xc+x, yc-y );
|
||||
AddPixel( xc+y, yc-x );
|
||||
AddPixel( xc-x, yc-y );
|
||||
AddPixel( xc-y, yc-x );
|
||||
AddPixel( xc+x, yc+y, &cmd );
|
||||
AddPixel( xc+y, yc+x, &cmd );
|
||||
AddPixel( xc-x, yc+y, &cmd );
|
||||
AddPixel( xc-y, yc+x, &cmd );
|
||||
AddPixel( xc+x, yc-y, &cmd );
|
||||
AddPixel( xc+y, yc-x, &cmd );
|
||||
AddPixel( xc-x, yc-y, &cmd );
|
||||
AddPixel( xc-y, yc-x, &cmd );
|
||||
|
||||
if (m > 0)
|
||||
{
|
||||
|
@ -116,10 +113,6 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color)
|
|||
m += 8*x + 4;
|
||||
}
|
||||
|
||||
cmd.pixnb = &NbPixels[0];
|
||||
cmd.dataX = &DataPixelsX[0];
|
||||
cmd.dataY = &DataPixelsY[0];
|
||||
|
||||
azrp_queue_command(&cmd, sizeof cmd, frag_first, frag_count);
|
||||
prof_leave(azrp_perf_cmdgen);
|
||||
}
|
||||
|
@ -129,9 +122,9 @@ void azrp_shader_circle( void *uniforms, void *comnd, void *fragment )
|
|||
struct command *cmd = (struct command *) comnd;
|
||||
uint16_t *frag = (uint16_t *) fragment;
|
||||
|
||||
uint16_t *taille = (uint16_t *) cmd->pixnb;
|
||||
uint16_t *DX = (uint16_t *) cmd->dataX;
|
||||
uint16_t *DY = (uint16_t *) cmd->dataY;
|
||||
uint16_t *taille = (uint16_t *) cmd->NbPixels;
|
||||
uint16_t *DX = (uint16_t *) cmd->DataPixelsX;
|
||||
uint16_t *DY = (uint16_t *) cmd->DataPixelsY;
|
||||
|
||||
uint16_t nbpix = taille[ cmd->curr_frag ];
|
||||
int BaseAdress = cmd->curr_frag * TABLE_WIDTH;
|
||||
|
|
Loading…
Reference in New Issue