Japanese
SGL User's ManualPROGRAMMER'S TUTORIAL
BackForward

8-11. Priority

On the Sega Saturn, it is possible to set a drawing priority order for all surface types to be drawn. By using priority, it is possible, for example, to draw multiple scroll planes separately for background and text display, and insert a 3D polygon plane between them. However, the back screen is always drawn at the very back.

Figure 8-28 Priority image

To set the priority for scrolling in SGL, use the library functions "slPriorityNbg0 to 3" and "slPriorityRbg0" that correspond to the scroll surface type.

[void slPriorityNbg0~3 ( Uint16 priority_num );]
[void slPriorityRbg0 ( Uint16 priority_num );]
Set the priority for each scroll surface.
Assign a value from 0 to 7 called the priority number to the parameter.
The higher the priority number, the closer the scroll surface will be drawn.
Also, if 0 is specified, the scroll surface is treated as transparent and is not actually drawn.
Please refer to the figure below for priorities when assigning the same priority number to multiple surface types.

Figure 8-29 Priority when priority numbers are equal
● Priority when priority numbers are equal ●

SPRITE> RBG0> NBG0> NBG1> NBG2> NBG3

High (front) ←−−−−−−−−−−−→low (back)

Note) POLYGON is included in SPRITE.

In addition, in the default state of SGL, priorities are assigned to each drawing surface as follows.

Table 8-25 Priority of each drawing surface in default state
priority number
7 6 5 4 3 2 1 0
drawing surface NBG0 SPRITE SPRITE RGB0 NBG1 NBG2 NBG3 Not set
Note) Polygon faces are included in SPRITE.

The following sample program (Listing 8-9) actually uses the SGL library functions "slPriorityNbg0~3,Rbg0" to implement scroll priority processing.

Listing 8-9 sample_8_11: Scroll display priority

/*------------------------------------------------ ----------------------*/
/* Scroll Priority Change */
/*------------------------------------------------ ----------------------*/
#include "sgl.h"
#include "ss_scroll.h"

#define NBG1_CEL_ADR ( VDP2_VRAM_B1 + 0x02000 )
#define NBG1_MAP_ADR ( VDP2_VRAM_B1 + 0x12000 )
#define NBG1_COL_ADR ( VDP2_COLRAM + 0x00200 )
#define RBG0_CEL_ADR VDP2_VRAM_A0
#define RBG0_MAP_ADR VDP2_VRAM_B0 
#define RBG0_PAR_ADR ( VDP2_VRAM_A1 + 0x1fe00 )
#define BACK_COL_ADR ( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
	Uint16 PryNBG = 4 , PryRBG = 1, PryWRK;
	FIXED yama_posx = SIPOSX , yama_posy = SIPOSY;
	ANGLE ascii_angz = DEGtoANG(0.0);

	slInitSystem(TV_320x224,NULL,1);
	slTVOff();
	slPrint("Sample program 8.11" , slLocate(9,2));

	slColRAMMode(CRM16_1024);
	slBack1ColSet((void *)BACK_COL_ADR , 0);

	slCharNbg1(COL_TYPE_256 , CHAR_SIZE_1x1);
	slPageNbg1((void *)NBG1_CEL_ADR , 0 , PNB_1WORD|CN_12BIT);
	slPlaneNbg1(PL_SIZE_1x1);
	slMapNbg1((void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR);
	Cel2VRAM(yama_cel , (void *)NBG1_CEL_ADR , 31808);
	Map2VRAM(yama_map, (void *)NBG1_MAP_ADR, 32, 16, 1, 256);
	Pal2CRAM(yama_pal , (void *)NBG1_COL_ADR , 256);

	slRparaInitSet((void *)RBG0_PAR_ADR);
	slCharRbg0(COL_TYPE_256 , CHAR_SIZE_1x1);
	slPageRbg0((void *)RBG0_CEL_ADR , 0 , PNB_1WORD|CN_10BIT);
	slPlaneRA(PL_SIZE_1x1);
	sl1MapRA((void *)RBG0_MAP_ADR);
	slOverRA(2);
	Map2VRAM(ascii_map ,(void *)RBG0_MAP_ADR , 32 , 4 , 0 , 0);

	slScrPosNbg1(yama_posx, yama_posy);
	slDispCenterR(toFIXED(160.0) , toFIXED(112.0));
	slLookR(toFIXED(128.0) , toFIXED(24.0));

	slPriorityNbg1(PryNBG);
	slPriorityRbg0(PryRBG);

	slScrAutoDisp(NBG0ON | NBG1ON | RBG0ON);
	slTVOn();

	while( 1 ){
		if(yama_posx >= (SX + SIPOSX)) {
			PryWRK = PryNBG;
			PryNBG = PryRBG;
			PryRBG = PryWRK;
			slPriorityNbg1(PryNBG);
			slPriorityRbg0(PryRBG);
			yama_posx = SIPOSX;
		}

		slScrPosNbg1(yama_posx, yama_posy);
		yama_posx += POSX_UP;

		slZrotR( ascii_angz );
		ascii_angz += DEGtoANG(1.0);

		slSynch();
	} 
}

Flow 8-13 sample_8_11: Scroll display priority


BackForward
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997